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