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

7.3 KiB

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.