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

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 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.