test(gates): retire the K2 track; re-measure the retrieval gate's premises for BM25
Operator decision 2026-09-21: the test track built on material tied to the operator's employer (K2) is retired -- not re-measured, not frozen. Public tests and gates run on invented material. Retrieval gate: - The four FUSION_PREMISE xfails are gone and pass through their INPUTS: the synthetic MISS, LOOKUP and QUOTA bundles were re-measured for BM25 (the miss fasit no longer shares the rare word `maa`; lookup and quota decoys carry the question's words so each partition and the quota decide their own fixture). SPECS_SHA256 moved with them. Rows 2 and 3 green again. - Row 7's mutants M04, M06, M07, M08, M10 now patch `bm25`, the code the default runs. Three survive with 0 ranks moved (passage body, title weight, bm25.RRF_K), each with its mechanism printed. M07 was not forced: every synthetic body carries its title as a heading. - Row 9 (K2) removed; row 8 requires `wiki-20` alone, the `r761` and `vegnormal` adapters are gone. Chose the broad reading of "K2" because the operator decision defines it as employer-tied material and the order's grep includes `vegnormal`. Also removed: tests/test_default_bundle_pin.py, the K2 arms of test_okf_consume, the four real-arm tests of test_quality, the R761 soft hyphen test, the N101/N200 delivery tests and okf_accounting_gate's default real corpus (and H5's guard, which only existed for those defaults). Two fixtures carrying road-standard identifiers are rewritten with invented ones. Gate after: 1 10/10, 2 7/7, 3 5/5, 4 6/6, 5 0/1, 6 10/10, 7 11/14, 8 NOT RUN -> GATE RED: rows 5, 7, 8. Suite 2423 passed, 1 skipped, 0 xfailed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
977040f575
commit
3d149f955a
12 changed files with 288 additions and 1096 deletions
|
|
@ -37,15 +37,15 @@ from llm_ingestion_okf.structure import derive_document_structure
|
|||
# rather than only asserting that they could.
|
||||
NESTED = """\
|
||||
---
|
||||
title: N100.2 Kryss og avkjoersler
|
||||
title: H100.2 Hytter og uthus
|
||||
generated: true
|
||||
source_file: vegnormal.md
|
||||
source_file: haandbok.md
|
||||
sources:
|
||||
- resource: https://example.test/bruprosjektering.pdf
|
||||
title: N200.7 Bruprosjektering
|
||||
- resource: https://example.test/broeyting.pdf
|
||||
title: H200.7 Broeyting
|
||||
---
|
||||
|
||||
# Kryss og avkjoersler
|
||||
# Hytter og uthus
|
||||
|
||||
Body text.
|
||||
"""
|
||||
|
|
@ -53,12 +53,12 @@ Body text.
|
|||
# The same document with the nested block removed. Nothing else differs.
|
||||
FLAT = """\
|
||||
---
|
||||
title: N100.2 Kryss og avkjoersler
|
||||
title: H100.2 Hytter og uthus
|
||||
generated: true
|
||||
source_file: vegnormal.md
|
||||
source_file: haandbok.md
|
||||
---
|
||||
|
||||
# Kryss og avkjoersler
|
||||
# Hytter og uthus
|
||||
|
||||
Body text.
|
||||
"""
|
||||
|
|
@ -73,46 +73,46 @@ Body text.
|
|||
|
||||
|
||||
def test_control_materialize_reads_top_level_title(tmp_path: Path) -> None:
|
||||
path = tmp_path / "vegnormal.md"
|
||||
path = tmp_path / "haandbok.md"
|
||||
path.write_text(FLAT, encoding="utf-8")
|
||||
assert parse_frontmatter(path)["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert parse_frontmatter(path)["title"] == "H100.2 Hytter og uthus"
|
||||
|
||||
|
||||
def test_control_structure_reads_top_level_title() -> None:
|
||||
declared, offset = _structure_split(FLAT)
|
||||
assert declared["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert declared["title"] == "H100.2 Hytter og uthus"
|
||||
assert offset > 0
|
||||
|
||||
|
||||
def test_control_profiles_reads_top_level_title() -> None:
|
||||
head, _body = _profiles_split(FLAT)
|
||||
assert head["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert head["title"] == "H100.2 Hytter og uthus"
|
||||
|
||||
|
||||
def test_control_derivation_reads_top_level_title() -> None:
|
||||
structure = derive_document_structure(FLAT, source_file="vegnormal.md")
|
||||
assert structure.title == "N100.2 Kryss og avkjoersler"
|
||||
assert structure.number == "N100.2"
|
||||
assert structure.parent_number == "N100"
|
||||
structure = derive_document_structure(FLAT, source_file="haandbok.md")
|
||||
assert structure.title == "H100.2 Hytter og uthus"
|
||||
assert structure.number == "H100.2"
|
||||
assert structure.parent_number == "H100"
|
||||
|
||||
|
||||
# --- the defect, once per parser copy ------------------------------------
|
||||
|
||||
|
||||
def test_nested_title_does_not_substitute_in_materialize(tmp_path: Path) -> None:
|
||||
path = tmp_path / "vegnormal.md"
|
||||
path = tmp_path / "haandbok.md"
|
||||
path.write_text(NESTED, encoding="utf-8")
|
||||
assert parse_frontmatter(path)["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert parse_frontmatter(path)["title"] == "H100.2 Hytter og uthus"
|
||||
|
||||
|
||||
def test_nested_title_does_not_substitute_in_structure() -> None:
|
||||
declared, _offset = _structure_split(NESTED)
|
||||
assert declared["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert declared["title"] == "H100.2 Hytter og uthus"
|
||||
|
||||
|
||||
def test_nested_title_does_not_substitute_in_profiles() -> None:
|
||||
head, _body = _profiles_split(NESTED)
|
||||
assert head["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert head["title"] == "H100.2 Hytter og uthus"
|
||||
|
||||
|
||||
# --- the propagation the order asks to be MEASURED, not assumed ----------
|
||||
|
|
@ -127,10 +127,10 @@ def test_substituted_title_moves_number_and_parent() -> None:
|
|||
question was whether `number` and `parent` move in PRACTICE or only in
|
||||
theory.
|
||||
"""
|
||||
structure = derive_document_structure(NESTED, source_file="vegnormal.md")
|
||||
assert structure.title == "N100.2 Kryss og avkjoersler"
|
||||
assert structure.number == "N100.2"
|
||||
assert structure.parent_number == "N100"
|
||||
structure = derive_document_structure(NESTED, source_file="haandbok.md")
|
||||
assert structure.title == "H100.2 Hytter og uthus"
|
||||
assert structure.number == "H100.2"
|
||||
assert structure.parent_number == "H100"
|
||||
|
||||
|
||||
def test_nested_key_does_not_invent_a_top_level_field() -> None:
|
||||
|
|
@ -141,7 +141,7 @@ def test_nested_key_does_not_invent_a_top_level_field() -> None:
|
|||
document never declared. `derive_document_structure` exposes `declared`
|
||||
directly, so this pins the namespace itself and not one lucky key.
|
||||
"""
|
||||
structure = derive_document_structure(NESTED, source_file="vegnormal.md")
|
||||
structure = derive_document_structure(NESTED, source_file="haandbok.md")
|
||||
assert "resource" not in structure.declared
|
||||
assert set(structure.declared) == {"title", "generated", "source_file", "sources"}
|
||||
|
||||
|
|
@ -159,7 +159,7 @@ def test_flow_form_still_round_trips(tmp_path: Path) -> None:
|
|||
"""
|
||||
flow = (
|
||||
"---\n"
|
||||
"title: N100.2 Kryss og avkjoersler\n"
|
||||
"title: H100.2 Hytter og uthus\n"
|
||||
"generated: { by: process:okf-ingest, at: 2026-08-31T00:00:00Z }\n"
|
||||
"sources: [ a.pdf, b.pdf ]\n"
|
||||
"---\n\nBody.\n"
|
||||
|
|
@ -169,4 +169,4 @@ def test_flow_form_still_round_trips(tmp_path: Path) -> None:
|
|||
parsed = parse_frontmatter(path)
|
||||
assert parsed["generated"] == "{ by: process:okf-ingest, at: 2026-08-31T00:00:00Z }"
|
||||
assert parsed["sources"] == "[ a.pdf, b.pdf ]"
|
||||
assert parsed["title"] == "N100.2 Kryss og avkjoersler"
|
||||
assert parsed["title"] == "H100.2 Hytter og uthus"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue