llm-ingestion-okf/docs/2026-09-10-r3-release-v081.md
Kjell Tore Guttormsen 113b3f801c docs(release): R3, v0.8.1 tagged locally on 3daf983
The release report, in S7 form. Three premises deviated from the order and
each is stated before the work rather than after: the push list has THREE
lines (main, `v0.8.0`, `v0.8.1`) because the remote carries no `v0.8.x` at
all; the XML folder holds 110 files, not one, of which 109 are images coded
`extractor_unknown`; and the downside the changelog had to publish was
recorded in NO tracked file, so it was reproduced here before publication --
rank 1 -> 2 on one constructed known-negative, the other seven delivered
places unmoved.

The acceptance gate is installation from the tag in an isolated export, run
entirely from that export's own venv. The operator's PATH was measured and
not touched: `which okf` reports not found both before and after, so this
round neither installed nor removed anything there.

Honesty limits are their own section: one machine and one interpreter, one
five-document corpus, one publisher's files for both large rows, a grep
criterion that deliberately leaves two `v0.8.0` history lines standing, and
the plain statement that "the tag installs" is not "the tag is correct" --
no row here re-measures hit@1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 23:10:30 +02:00

131 lines
7.3 KiB
Markdown

# R3: release v0.8.1
A patch release and nothing else. It carries round 16's ranking rule
(`--title-covered`) to a reproducible ref so `vegnormal-okf` can re-measure the
R761 product (R2b) against a tag rather than against a branch tip. No new
functionality, no behaviour change in `src/`, no push.
Tag: `v0.8.1`, local and annotated, on `3daf983` (`chore(release): 0.8.1`).
`v0.8.0` stays on `4d1f9d3` and `v0.7.0` on `1260fac` -- verified, both still
resolve there.
## 1 What this round did, and what it did not
Did: the version on both lines it lives on (`pyproject.toml` and
`src/llm_ingestion_okf/__init__.py`), round 16's changelog entry closed as
`[0.8.1]` with one bullet added for the rule's measured downside, five install
lines to `@v0.8.1`, the tag-history list given a current row and the previous
one demoted, two prose lines and one test-count history sentence corrected
where the tag would otherwise make them false, one commit, four gates, one tag.
Did not: no extractor, no arm, no flag moved. `--pdf-outline` and `--bold-title`
stay OFF and `--title-covered` stays ON exactly as round 16 shipped it -- a
release does not re-verify a default. No `uv lock`, no new dependency, `docs/`
history not rewritten, K3-15 not started, nothing pushed.
## 2 Premises, re-measured before building on them
Every premise the order carried reproduced, except one (SS 3).
| premise | re-measured |
|---|---|
| base is `4d1b522`, tree clean | `4d1b522`, `git status --short` empty |
| `v0.8.0` on `4d1f9d3`, `v0.7.0` on `1260fac` | both confirmed |
| `git ls-remote origin refs/heads/main` | `078b7df` -- everything since is unpushed |
| remote carries no `v0.8.0` | confirmed: newest remote tag is `v0.7.0` |
| install lines: README 4, `llms.txt` 1 | confirmed on HEAD before editing |
| suite in the worktree | 1582 passed, 1 skipped; 1583 collected |
| suite in a frozen export | 1573 passed, 1 failed, 9 skipped -- the failure is `test_the_four_existing_goldens_are_untouched`, the export artefact (it runs `git status` against a repo root an export does not have) |
| ruff | 0.16.6 |
| `okf check` rule count | 15, so K3-15 has not landed |
| `okf --version` | still not a flag; version read with `importlib.metadata` |
## 3 The deviations, stated before the work rather than after
**The push list has three lines, not two.** `git ls-remote origin
refs/heads/main` is `078b7df` and the remote carries no `v0.8.0` at all, so the
operator has to push `main`, `v0.8.0` and `v0.8.1`. Measured with `ls-remote`
against the remote, never against the local `origin/main` ref.
**The downside the changelog had to state was in no tracked file.** `grep -rn
'RITB\|NS3935'` over `docs/ skills/ tests/ src/` returns nothing that records
it (the control: the same grep finds `NS3935` elsewhere, so it can find). It
arrived from the order alone, so it was reproduced here before being published:
on the five-document folder, built to scratch, the same question delivers the
answering section at rank 1 with `--no-title-covered` and at rank 2 at the
shipped default, with the other seven delivered places unchanged. The changelog
states that at form level. The order's further claim -- that three other probe
questions on the same folder improved -- was NOT reproduced here and is NOT
published; leaving out a favourable number that was not measured in this round
is the conservative cut, not a contradiction of it.
**The XML folder is not one file.** The order said it holds exactly one file.
It holds **110**: the one NISO-STS xml, and 109 images under `graphics/`
(43 png, 41 jpg, 25 bmp) which door B reaches because it walks recursively. The
run reports them as `extractor_unknown` 109/110 -- coded, never silent -- and
the concept count is unaffected. This is the repository's own recorded shape for
that product, not a new defect.
**The changelog's own row differs slightly from the order's summary.** The order
compressed hit@50 to "5/6 -> 6/6"; round 16's entry, which measured it, records
5/6 at default `k` and **6/6** at `--k 50` before the rule. The entry's number
governs and was not rewritten.
## 4 The four gates, after `git add` and after commit
ruff **0.16.6**. `ruff check src tests tools` -- All checks passed.
`ruff format --check .` -- 118 files already formatted. `mypy src` -- no issues
in 21 source files. `pytest -q` -- **1582 passed, 1 skipped**, 1583 collected,
which is the figure the README publishes, re-measured on the release commit
itself. `uv sync --frozen --extra extract` is the install that makes `mypy src`
pass; plain `--frozen` drops the extra and mypy falls on `pdfplumber`.
## 5 The acceptance gate: installation FROM THE TAG
No `uv tool install`, no `uv tool uninstall`, no `--force`. The operator's PATH
was measured and not touched: `which okf` reports **not found** both before and
after this round -- it was already empty when the round started. Everything ran
from the export's own venv.
```
git archive v0.8.1 | tar -x -C /tmp/r3-release-v081/r3-install/export
cd <export> && uv sync --frozen --extra extract
```
| row | measured |
|---|---|
| version from the tag's bytes | **0.8.1** (`importlib.metadata`) |
| suite in the export | 1573 passed, 1 failed, 9 skipped -- the export artefact |
| `okf project` on the five-document folder | **26 concepts of 5 documents, 52 md, 0 of 5 rejected** |
| HTML corpus | **proposed 828 plan(s); 0 with no boundary; 0 unreadable**, 828 of 828, 6 015 md |
| R761 XML | **2 761 concepts** of 2 761 declared sections at shipped defaults, no arm flag; 109 of 110 files are images and are coded `extractor_unknown` |
| `okf check --skill ... --payload ...` | **conformant, 15 rules, 0 findings** |
Bundles were built to scratch. `~/okf-test/dokumenter` and
`~/repos/vegnormal-okf` were read and never written.
## 6 Honesty limits
- **One machine, one interpreter.** The installation is measured on this Intel
Mac with the interpreter `uv` resolved here. It is not a portability claim.
- **`okf project`'s 26 is ONE corpus of five documents.** It is the same five
every previous round used, so it is a regression control, not a sample.
- **828 of 828 and 2 761 of 2 761 are ONE publisher's files from ONE product.**
Both numbers say the reader did not lose anything against its own denominator;
neither says anything about a document nobody in that pipeline wrote.
- **The grep criterion is deliberately NOT "0 hits on `v0.8.0`".** Two bare
occurrences remain and must: the tag-history row, which exists to tell a
reader what an older tag was, and the test-count history, which records what
the figure was through each release. A criterion that drove them to zero would
be deleting history to satisfy a query. Both greps ran with a known-positive
control (`@v0.8.1` = 5) so the zero is a measurement rather than a query that
could never match.
- **"The tag installs" is not "the tag is correct".** Nothing here re-measures
hit@1. Every retrieval number in the changelog and in the tag-history row is
round 16's, re-measured by PM and not by this round. The four rows above prove
the exported bytes run and produce the counts the repository already
published -- no more than that.
- **The downside is measured on one folder.** Rank 1 -> 2 on one constructed
known-negative question over 26 concepts. It names a mechanism (a short
generic title is covered in full by more questions than a long one is); it
does not size how often that mechanism fires.