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>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-23 13:54:57 +02:00
commit 9d1f4b14ed
174 changed files with 1889 additions and 6512 deletions

View file

@ -38,13 +38,13 @@ from llm_ingestion_okf.segmentation import parse_segmentation_plan
FIXTURES = Path(__file__).parent / "fixtures"
IDENTITY = FIXTURES / "sts-identity.xml"
FIRST = "Omfatter utskifting av skadde enkeltkomponenter i rekkverk."
SECOND = "Omfatter maling av rekkverk."
FIRST = "Omfatter utskifting av skadde enkeltkomponenter i gelender."
SECOND = "Omfatter maling av gelender."
EXPECTED = {
"Rekkverk": None,
"Gelender": None,
"Utskifting av enkeltkomponenter": FIRST,
"Utskifting av handlist": None,
"Maling av rekkverk": SECOND,
"Maling av gelender": SECOND,
}
STAMP = "2026-09-08T12:00:00Z"
@ -77,10 +77,10 @@ def test_each_titled_section_carries_its_own_first_spec_paragraph() -> None:
marks = extract.xml_outline(IDENTITY.name, IDENTITY.read_bytes())
assert [(mark.title, mark.description) for mark in marks] == [
("88 Rekkverk", None),
("88 Gelender", None),
("88.612 Utskifting av enkeltkomponenter", FIRST),
("88.6121 Utskifting av handlist", None),
("88.613 Maling av rekkverk", SECOND),
("88.613 Maling av gelender", SECOND),
]
@ -108,7 +108,7 @@ def test_a_spec_point_a_yaml_reader_could_not_read_verbatim_is_not_written(
) -> None:
"""Verbatim or not at all, as for the `sources` title.
MEASURED ON R761: 217 of the 2 024 descriptions the first build wrote carry
MEASURED ON THE REFERENCE STANDARD: 217 of the 2 024 descriptions the first build wrote carry
`": "`, and a YAML reader refuses `description: a: b` -- PyYAML's
`safe_load` rejected exactly those 217 concepts' frontmatter, which the
same document's frontmatter had parsed without before the key existed.
@ -118,12 +118,12 @@ def test_a_spec_point_a_yaml_reader_could_not_read_verbatim_is_not_written(
"""
data = (
IDENTITY.read_bytes()
.replace(b"Omfatter maling av rekkverk.", b"Omfatter maling: rekkverk og gjerder.")
.replace(b"Omfatter maling av gelender.", b"Omfatter maling: gelender og gjerder.")
.replace(b"Omfatter utskifting av skadde", b"Omfatter 1:2 utskifting av skadde")
)
concepts = _by_title(_build(tmp_path, IDENTITY.name, data))
assert "description" not in concepts["Maling av rekkverk"]
assert "description" not in concepts["Maling av gelender"]
assert concepts["Utskifting av enkeltkomponenter"]["description"] == FIRST.replace(
"Omfatter utskifting", "Omfatter 1:2 utskifting"
)
@ -155,7 +155,7 @@ def _plan() -> dict[str, object]:
data = IDENTITY.read_bytes()
text = extract.extract_text(IDENTITY.name, data)
return propose.build_plan(
IDENTITY, text, data, okf_type="reference", proposed_at=STAMP, path_prefix="r900"
IDENTITY, text, data, okf_type="reference", proposed_at=STAMP, path_prefix="p900"
)
@ -209,7 +209,7 @@ def test_a_description_the_gate_refuses_is_dropped_and_the_concept_is_kept(
concepts = _door(tmp_path, gate)
assert "description" not in concepts["Utskifting av enkeltkomponenter"]
assert concepts["Maling av rekkverk"]["description"] == SECOND
assert concepts["Maling av gelender"]["description"] == SECOND
def test_the_description_written_is_the_gates_sanitized_text(tmp_path: Path) -> None: