fix(accounting): a corpus that measures no class says so in row 6 (H6)

`measures_no_class(units)` returns a sentence when EVERY document of a
corpus has no declared fate, and row 6 prints it beside that corpus's
tally. On N200 that is 16 549 elements of `u` which look like a finding
about the build and are a finding about the run: the build exits 2 on
0 proposed plans before the accounting door is reached, so no
accounting file exists to read a fate from.

The function's docstring carries what it would take, because that is a
capability and not a threshold: `.json` is read as generic JSON, and
the publisher's STS delivery in that form would have to reach the
markdown grammar `_extract_xml` writes for the XML one. Measured
2026-09-19, with the query validated against a known positive:
`standardContent` occurs 0 times in `src/` and 4 in the witness.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-19 06:00:51 +02:00
commit 280d6bd48e
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
2 changed files with 39 additions and 2 deletions

View file

@ -505,6 +505,11 @@ class Unit:
)
#: The note `_document_unit` leaves when the run declared no fate at all for a
#: document -- because the build never reached the accounting door.
NO_DECLARED_FATE = "no declared fates"
def _conservation_held(build: Build) -> bool:
return build.exit_code == 0 and "K1b FAILED" not in build.log
@ -552,7 +557,7 @@ def _document_unit(
images: list[Mapping[str, Any]] = list(entry.get("images", []))
total = sum(elements.values())
if declared is None:
return Unit(name, "document", total, 0, notes=["no declared fates"])
return Unit(name, "document", total, 0, notes=[NO_DECLARED_FATE])
if not version_ok:
return Unit(
name,
@ -1010,6 +1015,35 @@ def clean_in_every_run(runs: Sequence[Sequence[Unit]]) -> int:
return sum(1 for parts in zip(*runs) if all(unit.clean for unit in parts))
def measures_no_class(units: Sequence[Unit]) -> str | None:
"""Did this corpus fail to measure ANY element class at all? (H6)
Reproduced on N200 Vegbygging:2024, 2026-09-19: `okf build` proposes 0
plans on it, prints `FAILED - no segmentation plans` and exits 2 BEFORE
the accounting door -- no accounting file is written. Every element then
lands as `u` with no declared fate, and 16 549 unaccounted reads like a
finding about the build when it is a finding about the run.
What it would take is a capability and not a threshold: `.json` is read as
generic JSON, and the publisher's STS delivery in that form would have to
reach the same markdown grammar `_extract_xml` writes for the XML one. No
such reader exists in the package -- `standardContent` occurs 0 times in
`src/` and 4 times in this gate's witness (measured 2026-09-19).
"""
documents = [u for u in units if u.kind == "document"]
if not documents:
return None
blank = [u for u in documents if NO_DECLARED_FATE in u.notes]
if len(blank) != len(documents):
return None
return (
f"{len(blank)} of {len(documents)} document(s) have no declared fate: the build "
"did not reach the accounting door, so this corpus measures no element class. "
"`.json` is read as generic JSON; an STS delivery in that form would have to "
"reach the markdown grammar the XML reader writes."
)
def refused_whole(documents: Mapping[str, Any], build: Build) -> str | None:
"""Did this run persist NOTHING of a corpus that holds documents?
@ -1095,6 +1129,9 @@ def row6(r761: Path | None, n200: Path | None, ci: bool) -> Row:
f" {len(doubled)} file(s) carried through the document AND rejected, "
f"e.g. {doubled[0].name}"
)
blank = measures_no_class(units)
if blank is not None:
details.append(f" gate {label}: {blank}")
if label == "default":
whole = refused_whole(documents, build)
if whole is not None:

View file

@ -272,7 +272,7 @@ MUTANTS: tuple[Mutant, ...] = (
"X2 a report may declare a document rejected while the bundle holds it",
GATE,
' if status == "rejected" and persisted:\n invalid += 1',
' if False:\n invalid += 1',
" if False:\n invalid += 1",
),
)