test(mutants): repair M21, add X3 [mutation-ok], and the round's report
The `if False:` in this diff is a mutation DEFINITION -- a string in `MUTANTS`, applied only to a throwaway copy of the tree inside the harness and restored in a `finally`. No branch in this repository is pinned by it. The harness found this round's own change: its first run after H1 gave `killed 34 of 35` and `ERROR: M21 ... pattern occurs 0 times -- NOT MEASURED`, because H1 rewrote the `clean` property M21 mutates. M21 is repaired against the new text, and X3 -- "a document refused whole is clean again" -- is added beside it, because M21 now removes `unverified`, `invalid` AND `refused` at once and would be killed by any one of the three. Final run: killed 36 of 36, 0 survived, 0 errors, exit 0. The round's report is `docs/2026-09-19-regnskapsgaten-rest-og-normaliseringsdoren.md`, with the gate's whole output, the exposure census behind the normalisation door and the limits of the round. CHANGELOG: this round's entries are folded into the UNTAGGED `[0.10.1]` section, whose date moves to 2026-09-19, rather than into a new version number. `v0.10.1` is not tagged and the packaging gate requires the head to equal the packaged version; which version this ships as is the operator's and is asked in the closing block. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
be5fe2baa5
commit
43331fc4d4
3 changed files with 253 additions and 34 deletions
58
CHANGELOG.md
58
CHANGELOG.md
|
|
@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
## [0.10.1] — 2026-09-19
|
||||
|
||||
### Added
|
||||
|
||||
|
|
@ -28,37 +28,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
report and `log.md` now say how many of M documents the run persisted nothing
|
||||
of. The exit code is unchanged — it belongs to the whole run.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **The content-accounting gate: a document refused whole is never clean.**
|
||||
Its elements are all booked as coded rejections, so u = 0 and d = 0, and
|
||||
`refused_whole` asks its question only for a corpus that persisted NOTHING —
|
||||
one refused source beside an accepted one read as clean with the content
|
||||
gone. `Unit.refused` is that loss with its own column and the document's code
|
||||
in the note.
|
||||
- **The STS JSON role map reads the publisher's own tags.** `count_sts_json`
|
||||
compared the raw tag string where the XML witness has always used `_local`,
|
||||
so `mml:math` reached `tag == "math"` on nothing — 74 formulas in N200
|
||||
Vegbygging:2024 counted as 0. And the publisher's JSON writes a figure's
|
||||
caption as `figcaption` under the `graphic`, not as the `fig/caption`
|
||||
NISO-STS writes — 430 of them over the eight deliveries measured. No other
|
||||
count moves, measured role by role over those eight and the committed twins.
|
||||
- **The mutation harness is a gate.** A surviving mutant now exits 1; the run
|
||||
ended `2 if errors else 0`, so `killed 0 of 1` exited 0. PM's X2 mutant — a
|
||||
report may declare a document rejected while the bundle holds it — is in the
|
||||
set and is killed by a new test driven from both sides.
|
||||
- **The skipped-row guard measures the machine, not the argument.** Row 6 is
|
||||
SKIPPED exactly when the corpora the arguments name are absent, so asking the
|
||||
arguments made the branch unreachable.
|
||||
- **Row 6 says when a corpus measures no element class at all.** On N200 the
|
||||
build proposes 0 plans and exits 2 before the accounting door, so 16 549
|
||||
elements land as unaccounted with no declared fate — a finding about the run
|
||||
that read as a finding about the build.
|
||||
|
||||
## [0.10.1] — 2026-09-18
|
||||
|
||||
### Added
|
||||
|
||||
- **`okf build --accounting PATH`: content accounting per element.** Before
|
||||
extraction, every source document is inventoried in a per-format element
|
||||
vocabulary: headings, paragraphs, tables, cells, images, and so on. After
|
||||
|
|
@ -241,6 +210,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
### Fixed
|
||||
|
||||
- **The content-accounting gate: a document refused whole is never clean.**
|
||||
Its elements are all booked as coded rejections, so u = 0 and d = 0, and
|
||||
`refused_whole` asks its question only for a corpus that persisted NOTHING —
|
||||
one refused source beside an accepted one read as clean with the content
|
||||
gone. `Unit.refused` is that loss with its own column and the document's code
|
||||
in the note.
|
||||
- **The STS JSON role map reads the publisher's own tags.** `count_sts_json`
|
||||
compared the raw tag string where the XML witness has always used `_local`,
|
||||
so `mml:math` reached `tag == "math"` on nothing — 74 formulas in N200
|
||||
Vegbygging:2024 counted as 0. And the publisher's JSON writes a figure's
|
||||
caption as `figcaption` under the `graphic`, not as the `fig/caption`
|
||||
NISO-STS writes — 430 of them over the eight deliveries measured. No other
|
||||
count moves, measured role by role over those eight and the committed twins.
|
||||
- **The mutation harness is a gate.** A surviving mutant now exits 1; the run
|
||||
ended `2 if errors else 0`, so `killed 0 of 1` exited 0. PM's X2 mutant — a
|
||||
report may declare a document rejected while the bundle holds it — is in the
|
||||
set and is killed by a new test driven from both sides.
|
||||
- **The skipped-row guard measures the machine, not the argument.** Row 6 is
|
||||
SKIPPED exactly when the corpora the arguments name are absent, so asking the
|
||||
arguments made the branch unreachable.
|
||||
- **Row 6 says when a corpus measures no element class at all.** On N200 the
|
||||
build proposes 0 plans and exits 2 before the accounting door, so 16 549
|
||||
elements land as unaccounted with no declared fate — a finding about the run
|
||||
that read as a finding about the build.
|
||||
|
||||
- **An inline PDF image gets a stable name (0.10.1).** pdfminer names an
|
||||
inline image (`BI … EI`) from `id()` of a Python object, so a pointer line
|
||||
changed between two runs of one build and two concept files of the reference
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue