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
|
|
@ -853,118 +853,6 @@ def test_the_empty_payload_still_passes_the_checker() -> None:
|
|||
assert okf_contract_check.check(_skill_declaring(payload), payload).findings == ()
|
||||
|
||||
|
||||
# --- Corpus-conditional arms --------------------------------------------------
|
||||
|
||||
K2_BUNDLE = Path.home() / "corpora" / "okf-telling-20260829" / "K2-bundle-20260903"
|
||||
K2_CONCEPTS = 629
|
||||
K2_PROPOSED = 618
|
||||
K2_KEYLESS = 11
|
||||
|
||||
requires_k2 = pytest.mark.skipif(
|
||||
not K2_BUNDLE.is_dir(),
|
||||
reason=(
|
||||
f"the K2 corpus is not present at {K2_BUNDLE}. NOT MEASURED, not zero: "
|
||||
f"this arm covers a denominator of {K2_CONCEPTS} concepts, of which "
|
||||
f"{K2_PROPOSED} carry `adjudication: proposed` and {K2_KEYLESS} carry no "
|
||||
"`adjudication` key at all. A skip here is an unmeasured denominator, "
|
||||
"never a pass."
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@requires_k2
|
||||
def test_the_eleven_keyless_k2_concepts_come_back_unknown_over_a_stated_denominator() -> None:
|
||||
# SS 6.1's third state, on real data rather than on a fixture. The 11 are
|
||||
# asserted as ONE named set: measured, the concepts carrying no
|
||||
# `adjudication` are EXACTLY those carrying no `bundle_id`, so three
|
||||
# independent counts would share one blind spot.
|
||||
root_bundle_id = parse_frontmatter(K2_BUNDLE / "index.md")["bundle_id"]
|
||||
concepts = [
|
||||
okf_consume.read_concept(
|
||||
K2_BUNDLE / f"{concept_id}.md",
|
||||
bundle_root=K2_BUNDLE,
|
||||
root_bundle_id=root_bundle_id,
|
||||
)
|
||||
for concept_id in okf_consume.enumerate_concepts(K2_BUNDLE)
|
||||
]
|
||||
assert len(concepts) == K2_CONCEPTS
|
||||
unknown = {c.concept_id for c in concepts if c.adjudication == "unknown"}
|
||||
inherited = {c.concept_id for c in concepts if c.bundle_id_inherited}
|
||||
proposed = [c for c in concepts if c.adjudication == "proposed"]
|
||||
assert len(proposed) == K2_PROPOSED
|
||||
assert len(unknown) == K2_KEYLESS
|
||||
assert unknown == inherited, "the two sets diverged; the fallback is no longer one fact"
|
||||
assert all(c.bundle_id == root_bundle_id for c in concepts if c.bundle_id_inherited)
|
||||
# `adjudicated` has denominator ZERO on this corpus. Stated, not implied.
|
||||
assert [c for c in concepts if c.adjudication == "adjudicated"] == []
|
||||
|
||||
|
||||
@requires_k2
|
||||
def test_spent_is_the_delivered_set_where_the_whole_payload_reading_would_refuse() -> None:
|
||||
# The regression guard, with figures RE-MEASURED here rather than carried
|
||||
# from the plan: the plan predicted 101 576 B for this excerpt and 188 758 B
|
||||
# for the payload, both taken before per-line trailing-whitespace stripping
|
||||
# landed. What this build actually produces is recorded instead.
|
||||
# Run with `--withheld-full`, because the DEFAULT no longer reaches this
|
||||
# case and that is the point of `okf-consumption/2`: the whole payload of
|
||||
# this bundle came to 117 561 B under the default -- inside the limit --
|
||||
# where under the flat list it did not. The distinction between the two
|
||||
# readings of SS 7.2 is still real and still reachable, so it is measured
|
||||
# where it is reachable rather than deleted with the shape that produced
|
||||
# it. The control below fires if that stops being true.
|
||||
payload = okf_consume.build_payload(
|
||||
K2_BUNDLE, question="Hvordan skal prisene fylles ut?", withheld_full=True
|
||||
)
|
||||
budget, excerpts = payload["budget"], payload["excerpts"]
|
||||
assert isinstance(budget, dict) and isinstance(excerpts, list)
|
||||
whole_payload = len(okf_consume.serialise(payload).encode("utf-8"))
|
||||
assert whole_payload > int(budget["limit"]), (
|
||||
"the guard measures nothing: the whole payload already fits, so the two "
|
||||
"readings of SS 7.2 cannot be told apart on this case"
|
||||
)
|
||||
assert int(budget["spent"]) <= int(budget["limit"])
|
||||
|
||||
# And the default is now the other side of that line, on the same bundle
|
||||
# and the same question: the bookkeeping stopped dwarfing the content.
|
||||
default = okf_consume.build_payload(K2_BUNDLE, question="Hvordan skal prisene fylles ut?")
|
||||
assert len(okf_consume.serialise(default).encode("utf-8")) < whole_payload
|
||||
|
||||
|
||||
#: The gold set is LOCAL-ONLY: it names corpus documents, which never reach a
|
||||
#: tracked file here. The test reads it rather than restating it, so this file
|
||||
#: carries the assertion and not the answer key.
|
||||
GOLD_SET = PROJECT_ROOT / ".claude/projects/2026-09-07-okf-consume-prepass/hit-at-k-questions.json"
|
||||
|
||||
|
||||
@requires_k2
|
||||
@pytest.mark.skipif(not GOLD_SET.is_file(), reason=f"the local gold set is absent ({GOLD_SET})")
|
||||
def test_every_gold_document_in_the_local_set_is_reached_or_named_as_a_miss() -> None:
|
||||
# SC5 and SC6 together, run against the answer key rather than a literal.
|
||||
# Row 1's gold is the one confirmed by a signal from outside this
|
||||
# repository -- a live model reached that document unprompted in three
|
||||
# navigation steps on 2026-09-06 -- and its gold document holds exactly one
|
||||
# concept, so it is also the one concept-granularity row.
|
||||
spec = json.loads(GOLD_SET.read_text(encoding="utf-8"))
|
||||
questions = spec["questions"]
|
||||
assert len(questions) >= 5, "fewer than five questions is not the measurement"
|
||||
hits = 0
|
||||
for entry in questions:
|
||||
payload = okf_consume.build_payload(K2_BUNDLE, question=entry["question"], ranking="fusion")
|
||||
excerpts = payload["excerpts"]
|
||||
assert isinstance(excerpts, list)
|
||||
if okf_consume_measure.hit_rank(excerpts, entry["gold_document"]) is not None:
|
||||
hits += 1
|
||||
# The published bar, and the published number. A regression that drops a
|
||||
# row goes red here rather than in a document nobody re-runs.
|
||||
#
|
||||
# 5 -> 6 ON 2026-09-10, with no bundle changing: `DEFAULT_SOURCE_QUOTA = 2`
|
||||
# reaches the one row that had missed everywhere. What that gain is not:
|
||||
# this metric asks whether the gold DOCUMENT was delivered, and a document
|
||||
# quota raises how many distinct documents a payload holds, so it is not
|
||||
# neutral with respect to the rule that moved it.
|
||||
assert hits == 6, f"hit@8 moved: {hits} of {len(questions)}"
|
||||
|
||||
|
||||
# --- Step 9: the CLI ----------------------------------------------------------
|
||||
|
||||
TOOL = PROJECT_ROOT / "tools" / "okf_consume.py"
|
||||
|
|
@ -1198,44 +1086,6 @@ def test_the_shipped_skill_is_the_generator_output_with_the_checkout_made_relati
|
|||
assert SKILL.read_text(encoding="utf-8") == generated.replace(prefix, "")
|
||||
|
||||
|
||||
@requires_k2
|
||||
def test_no_corpus_document_name_reaches_any_file_this_work_tracks() -> None:
|
||||
# CLAUDE.md's public-file rule. The pattern is DERIVED from the corpus's own
|
||||
# top-level document names at run time rather than hand-picked, so it covers
|
||||
# every document rather than the six someone thought of -- and so this
|
||||
# tracked file carries no corpus name of its own.
|
||||
documents = sorted(
|
||||
{concept_id.split("/", 1)[0] for concept_id in okf_consume.enumerate_concepts(K2_BUNDLE)}
|
||||
)
|
||||
assert len(documents) > 30, "too few documents to be the real corpus"
|
||||
leak = re.compile("|".join(re.escape(name) for name in documents), re.IGNORECASE)
|
||||
|
||||
# The known-positive, first: the pattern must be shown able to find before
|
||||
# its zero counts as a measurement.
|
||||
control = (K2_BUNDLE / "index.md").read_text(encoding="utf-8")
|
||||
assert leak.findall(control), "the pattern cannot find; the zeros below would mean nothing"
|
||||
|
||||
tracked = [
|
||||
SKILL,
|
||||
SKILL.parent / "references" / "README.md",
|
||||
SKILL.parent / "references" / "example-payload.json",
|
||||
PROJECT_ROOT / "tools" / "okf_consume.py",
|
||||
PROJECT_ROOT / "tools" / "okf_consume_measure.py",
|
||||
PROJECT_ROOT / "tests" / "test_okf_consume.py",
|
||||
PROJECT_ROOT / "docs" / "2026-09-07-okf-konsumskill-maaling.md",
|
||||
PROJECT_ROOT / "docs" / "2026-09-08-blindsone-below-k-k2.md",
|
||||
PROJECT_ROOT / "docs" / "2026-09-08-blindsone-laas2-budsjett-k2.md",
|
||||
PROJECT_ROOT / "docs" / "2026-09-08-prisform-og-loggen-k2.md",
|
||||
PROJECT_ROOT / "docs" / "2026-09-08-kravnummer-tokenisering.md",
|
||||
PROJECT_ROOT / "docs" / "2026-09-08-sjeldenhetsvekt.md",
|
||||
PROJECT_ROOT / "docs" / "2026-09-08-claude-code-skill-vilkaarlig-bundle.md",
|
||||
PROJECT_ROOT / "README.md",
|
||||
PROJECT_ROOT / "CLAUDE.md",
|
||||
]
|
||||
for path in tracked:
|
||||
assert leak.findall(path.read_text(encoding="utf-8")) == [], path
|
||||
|
||||
|
||||
def _quota_concept(concept_id: str, *, source_file: str) -> okf_consume.Concept:
|
||||
"""A minimal concept whose only interesting property is its source document."""
|
||||
return okf_consume.Concept(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue