llm-ingestion-okf/docs/2026-09-10-r3-release-v081.md
Kjell Tore Guttormsen 9d1f4b14ed test(fixtures): replace sector-specific example material with generic, fictitious examples — green
Every fixture, test document, tool example and document now uses an invented
kitchen-and-baking handbook series, written in this repository. The package's
behaviour is unchanged; src/ changes are comments and help text only.

- Generated fixtures are regenerated from their generators. Their structural
  counts are identical before and after: elements, images, rows, cells,
  headings, bookmarks and the witness inventory's per-document totals. The
  image-inbox and accounting documents are renamed kapittel-84-*.
- tools/okf_accounting_gate.py: the two options that named one real corpus
  each are replaced by a generic, repeatable --corpus PATH with no default.
  Row 5 compares the PDF pair alone. Gate verdict unchanged: RED rows 2, 3, 6.
- tools/okf_witness.py: the STS JSON reader for one publisher's delivery is
  removed, along with its three twins and five tests. The mutation harness
  loses W09.
- docs/: 13 dated reports that documented runs on a retired reference corpus
  are removed, and 40 are neutralized. Dead links are removed, and no new
  dangling path is introduced.
- The synthetic MCP-gate corpus and the residual probe words are neutral.

Valgt: keep the `okf quality --fasit` bar value (the measured fraction, one corpus) and
rewrite only its provenance, because the verdict stays unchanged and the
number names nothing.

Term check with the local list: 0 of 411 tracked files, 0 file names, 0 of
27 binary fixtures. Suite after git add: 2457 passed, 1 skipped. The base
tree had 2460 passed and 2 skipped; five tests went with the JSON reader and
four were added by the term check. ruff, ruff format and mypy --strict src/
are clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 14:52:02 +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 a downstream consumer can re-measure its 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
reference standard, 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 a downstream consumer repository 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.