The release report for v0.8.4 (69dc51f): the lockfile moved four lines,
not three (the guard's own version follows the pin); the dependency floor
measured against guards 1.2.0 / 1.3.0 / 1.4.0 and left standing; the
acceptance rows re-measured from a local export of the tag, including
guard 1.4.0 refusing 0 of 28 frontmatter blocks where 1.3.0 refuses 26.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
11 KiB
R6: release v0.8.4
A patch release with one change that is not a version number: the guard pin.
It carries what rounds 22 and 21 landed and no tag had -- frontmatter this
library writes is YAML a YAML reader reads back the same (K3-22), and a
concept's parent: pointer resolved all the way to the reader, with the
checker at seventeen rules (K3-21) -- and it moves [tool.uv.sources] from
guard v1.3.0 to v1.4.0, because 1.3.0 refuses a flow sequence of plain
scalars and this library writes them. No behaviour change in src/ beyond the
version string, no push.
Tag: v0.8.4, local and annotated, on 69dc51f (chore(release): 0.8.4).
v0.8.3 stays on 0963dfa, v0.8.2 on b6c54e9, v0.8.1 on 3daf983 and
v0.8.0 on 4d1f9d3 -- verified with git tag --points-at, all four still
resolve there.
1 What this round did, and what it did not
Did: the version on the three lines it lives on (pyproject.toml,
src/llm_ingestion_okf/__init__.py, and the package's entry in uv.lock), the
guard tag in [tool.uv.sources], the [Unreleased] block closed as
[0.8.4] — 2026-09-11 with its eight entries moved unedited plus one entry for
the pin, five install lines to @v0.8.4, the guard-pairing prose and the pip
fallback to v0.8.4 / v1.4.0, a v0.8.4 row in the tag history with
v0.8.3 demoted, the test count and its history, one commit, four gates, one
tag.
The block carries three headings, one each (Added 2 entries, Changed 3 + the pin, Fixed 3), so there was no duplicate heading to merge.
Did not: no extractor, no arm, no rule, no flag moved. --shell-parent,
--follow-parent, --pdf-outline and --bold-title stay OFF and
--title-covered stays ON exactly as the rounds shipped them. The dependency
range stays llm-ingestion-guard>=1.2,<2.0 (section 4 says why that is a
decision left open rather than a verified floor). No new dependency, PyYAML
still in the dev group only, [extract] untouched, skills/okf-consume/ and
skills/okf-consume-template/ untouched, docs/ history not rewritten, the
guard repository only read, nothing pushed.
2 Premises, re-measured before building on them
| premise | re-measured |
|---|---|
| HEAD at dispatch | e98ca6d; e717b1c..HEAD is 10 commits, all K3-21, nothing else; tree clean |
git ls-remote origin refs/heads/main |
0308169 |
remote tags v0.8* |
all four, v0.8.3^{} = 0963dfa |
guard v1.4.0 on Forgejo |
refs/tags/v1.4.0^{} = d19de8c |
len(contract_check.RULES) |
17, not 16: K3-21 added parent_unfollowable |
install lines: README 4, llms.txt 1 |
confirmed, README at lines 12, 62, 77 and 570 |
[Unreleased] / [0.8.3] in CHANGELOG.md |
lines 8 and 88, not 42 |
grep -rn 'v0\.7\.0|0\.7\.0' README.md docs llms.txt CLAUDE.md |
34 lines over 11 files; README exactly one (the v0.7.0 history row); grep -rln 'v0\.7\.0' docs/ 7 before and after |
| suite before the release | 1783 collected, 1782 passed, 1 skipped (README said K3-20's 1668 / 1667 / 1) |
| ruff | 0.16.6 |
| coordination inbox / order queue | 0 messages at start; this order the only pending one |
3 The lockfile and the pin
pyproject.toml (version and guard tag) and __init__.py were changed first,
then uv lock ran: "Updated llm-ingestion-guard v1.3.0 (44e2b31a) -> v1.4.0
(d19de8cb)", "Updated llm-ingestion-okf v0.8.3 -> v0.8.4". The diff is four
lines, not the three the order expected: the guard's source, the guard's
requires-dist entry, this package's version, and the guard's own
version = "1.3.0" -> "1.4.0", which follows from moving the pin. No other
package moved, so the file was kept as uv lock wrote it. In the export of the
tag, uv lock --check exits 0.
4 The dependency floor, measured and left standing
The comment above dependencies grounds the floor 1.2 in the flow-mapping
support 1.2.0 added. Run against each guard's own source (git archive of the
tag, imported first on sys.path, the import path asserted):
| guard | tests/test_guard_adapter.py |
whole suite |
|---|---|---|
| 1.2.0 | 20 passed, 1 failed (test_the_guard_parses_the_flow_form_sources_our_goldens_emit) |
not run |
| 1.3.0 | 21 passed | 1782 passed, 1 skipped |
| 1.4.0 (installed) | 21 passed | 1782 passed, 1 skipped |
The failing test entered in 2d9fb0f (2026-09-03) and is in every tag from
v0.6.0 on. So the tree's own suite has contradicted the floor 1.2 since
before this release, and K3-21 and K3-22 require nothing 1.3.0 lacks. The
floor was left as it is -- this release's order fixed the range, and moving it
is a release decision of its own. It is recorded as an open question, not
resolved here.
5 README lines the tag would otherwise make false
- The two guard-pairing sentences carry two numbers each and both moved: "and
v0.8.4points that entry atllm-ingestion-guardv1.4.0", "v0.8.4declaresllm-ingestion-guard>=1.2,<2.0, whichv1.4.0satisfies". The pip fallback installs the guard@v1.4.0. - The
v0.8.4row says what the tag is, with seventeen rules, and names the pin asv1.4.0and the old one as "the previous pin", so thev1.3.0grep stays at zero. Thev0.8.3row lost "the current tag: " and nothing else. - The test count is 1783 collected, 1782 passed, 1 skipped. The sentence
that the figure published before the
v0.8.2release was the passed count stays: it is still true of the past, and collect still reports one more. The history parenthesis keeps every earlier figure and adds that the figure above is thev0.8.4release's, after K3-22 and K3-21. grep -n 'okf\.git@v0\.8\.3' README.md llms.txtreturns nothing (exit 1), beside the known-positiveokf\.git@v0\.8\.4= README 4 +llms.txt1. A barev0.8.3remains twice, both intentional: thev0.8.3history row and the count history.grep -n 'v1\.3\.0' pyproject.toml README.md llms.txtreturns nothing (exit 1), besidev1.4.0=pyproject.toml1,uv.lock2, README 4 (the order expected 3; the fourth is the new history row).
6 The four gates, after git add and after commit
ruff 0.16.6. ruff check src tests tools -- All checks passed.
ruff format --check . -- 130 files already formatted. mypy src -- no issues
in 21 source files. pytest -q -- 1782 passed, 1 skipped, 1783 collected,
on the release commit. tests/test_docs_promises.py and
tests/test_packaging.py were run after every README and version edit (11 of
11 each time).
7 The acceptance gate: installation FROM THE TAG
No uv tool install, no uv tool uninstall, no --force. The operator's
okf on PATH (~/.local/bin/okf, a uv tool install) was located and not
touched; everything ran from the export's own venv (CPython 3.11) under a
private scratch directory, never under the hit@k instrument's shared paths.
git archive v0.8.4 | tar -x -C <scratch>/r6-install/export
cd <export> && uv sync --frozen --extra extract
| row | measured |
|---|---|
| version from the tag's bytes | 0.8.4 (importlib.metadata) |
| guard version from the tag's lockfile (new) | 1.4.0 |
uv lock --check in the export |
rc 0 |
len(contract_check.RULES) |
17, the same as the working tree |
okf check on skills/okf-consume/ and its payload |
conformant: 17 rules over 3 excerpts and 0 withheld entries, 0 findings, rc 0 |
okf project on the five-document folder |
26 concepts of 5 documents, 52 md, 0 of 5 left out; the folder holds 5 files before and after |
| HTML corpus | proposed 828 plan(s); 0 document(s) with no boundary; 0 unreadable, 6 015 md |
| R761 XML | 2 761 concepts at shipped defaults, no arm flag; the folder holds 1 file at top level and 110 in total, 109 coded extractor_unknown |
| R761 document directory | r761-prosesskoden/; denominator 1 document |
| hit@1 / 8 / 50 on the R761 bundle | 6/6 / 6/6 / 6/6 at the default k and at k = 50, N = 6 scored of 8 asked |
| the known-positive | rank 1 at the default k and rank 1 at k = 50, denominator 1 |
| round 17's known-negative on the five-document bundle | the section the question names at rank 1 (6 793 B), the neighbour at rank 2 (10 590 B); both concepts exist and both are delivered of 8 |
| guard 1.4.0 against 1.3.0 on that bundle (new) | 28 frontmatter blocks in 52 md: 1.4.0 refuses 0 of 28, 1.3.0 refuses 26 of 28 (26 of 27 concept files), every refusal "a flow sequence admits flow mappings only" -- source_offset pairs and a [references] list among them |
tests/test_guard_adapter.py in the working tree against 1.4.0 (new) |
21 passed of 21 |
The guard-1.3.0 column is the known-negative control and it is not zero, so
the two columns read two different guards. The same five documents built from
the working tree before the bump differ from the tag's build in exactly one
line, log.md's converter path (a different venv); every concept file is
byte-identical. The pin's one earlier claim without a source -- 26 of 28 --
reproduces on this bundle. The three other corpus figures that came with it
(2 761 of 2 763, 3 206 of 3 208, 412 of 455) were not measured here.
The hit@k instrument lives in the consumer's repository and was only read. It
writes its payloads to fixed paths another session also writes, so it ran as a
scratch copy that differs from the original in exactly those two output paths
(diff: 2 lines). The suite was not run inside the export.
8 Honesty limits
- One machine, one interpreter. The installation is measured on one Intel
Mac with the interpreter
uvresolved in the export. It is not a portability claim, and the channel is a local export, not the Forgejo tag, which does not exist until the push. okf project's 26 is ONE corpus of five documents -- 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.
- hit@1 and the known-positive rank are 6 scored questions and ONE known-positive on ONE bundle, against a fasit someone else set. They are re-measured from the tag's bytes, which is all they add.
- The known-negative is ONE constructed question on ONE small bundle.
- The guard row is ONE bundle with ONE guard version in each column. It
says that 1.4.0 accepts what 1.3.0 refused on this fixture, and nothing
about other corpora, and nothing about Door C's
import_bundleon an okf bundle, which is still unmeasured. - The grep criterion is deliberately NOT "0 hits on
v0.8.3". Two bare occurrences remain and must. The zero onokf.git@v0.8.3ran beside a known-positive, so it is a measurement and not a query that could never match. - "The tag installs" is not "the tag is correct". No functionality is verified here beyond what K3-22 and K3-21 already measured; the rows above prove the exported bytes run and reproduce the counts the repository already published.