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>
127 lines
4.8 KiB
Python
127 lines
4.8 KiB
Python
"""Door C's own outcome is a bundle the reading direction can open.
|
|
|
|
A downstream consumer repository, 2026-09-08 (its finding 1): `import_bundle` wrote the root index with
|
|
no frontmatter and took no `root_frontmatter_values`, so it could not declare
|
|
`bundle_id`. `okf consume` then refused the result with exit 1,
|
|
`bundle_id_missing` -- section 3.1's identity tuple is `(bundle_id,
|
|
concept_id)` and half of it was absent. The consumer's workaround was to use
|
|
Door C as a GATE and write the consumable tree themselves.
|
|
|
|
The fix is the mechanism Door B already has and Door C did not: a profile
|
|
names a key, the CALLER owns its value (decision E1). It is keyword-only with
|
|
a default of `None`, so every existing call site emits the bytes it always did
|
|
-- a consumer with branch bases built through this door is not asked to
|
|
rebuild them, which is the boundary this repository states for its own
|
|
consumers.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from test_import_flow import CONCEPT, StubImportGate, place
|
|
|
|
from llm_ingestion_okf.importer import import_bundle
|
|
from llm_ingestion_okf.materialize import parse_frontmatter
|
|
from llm_ingestion_okf.profiles import DEFAULT, SEGMENTED_V1
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
|
TOOL = PROJECT_ROOT / "tools" / "okf_consume.py"
|
|
KNOWN_POSITIVE = PROJECT_ROOT / "examples" / "ingest-golden-segmented-okf-v0-2" / "expected-bundle"
|
|
|
|
|
|
def _consume(bundle: Path) -> subprocess.CompletedProcess[str]:
|
|
return subprocess.run(
|
|
[sys.executable, str(TOOL), str(bundle), "--question", "users"],
|
|
capture_output=True,
|
|
text=True,
|
|
check=False,
|
|
)
|
|
|
|
|
|
def test_the_known_positive_is_readable_first() -> None:
|
|
"""Before an exit 1 counts as a finding, the chain must be shown able to pass."""
|
|
assert _consume(KNOWN_POSITIVE).returncode == 0
|
|
|
|
|
|
def test_door_c_without_a_bundle_id_is_still_refused(tmp_path: Path) -> None:
|
|
"""The defect, kept as a test: silence is not the fix, a named value is."""
|
|
place(tmp_path / "source", "tables/users.md", CONCEPT)
|
|
bundle = tmp_path / "bundle"
|
|
import_bundle(
|
|
tmp_path / "source",
|
|
bundle,
|
|
"1970-01-01T00:00:00Z",
|
|
origin="external",
|
|
channel="manual",
|
|
gate=StubImportGate(),
|
|
)
|
|
assert (bundle / "index.md").is_file()
|
|
assert "bundle_id" not in parse_frontmatter(bundle / "index.md")
|
|
assert _consume(bundle).returncode == 1
|
|
|
|
|
|
def test_door_c_with_a_bundle_id_produces_a_consumable_bundle(tmp_path: Path) -> None:
|
|
place(tmp_path / "source", "tables/users.md", CONCEPT)
|
|
bundle = tmp_path / "bundle"
|
|
import_bundle(
|
|
tmp_path / "source",
|
|
bundle,
|
|
"1970-01-01T00:00:00Z",
|
|
origin="external",
|
|
channel="manual",
|
|
gate=StubImportGate(),
|
|
profile=SEGMENTED_V1,
|
|
root_frontmatter_values={"bundle_id": "imported-2026-09-09"},
|
|
)
|
|
declared = parse_frontmatter(bundle / "index.md")
|
|
assert declared["bundle_id"] == "imported-2026-09-09"
|
|
done = _consume(bundle)
|
|
assert done.returncode == 0, done.stderr
|
|
payload = json.loads(done.stdout)
|
|
assert payload["bundle"]["bundle_id"] == "imported-2026-09-09"
|
|
|
|
|
|
def test_a_second_run_does_not_duplicate_the_declaration(tmp_path: Path) -> None:
|
|
"""The index is APPENDED to across runs; the frontmatter must not be."""
|
|
place(tmp_path / "source", "tables/users.md", CONCEPT)
|
|
bundle = tmp_path / "bundle"
|
|
for _ in range(2):
|
|
import_bundle(
|
|
tmp_path / "source",
|
|
bundle,
|
|
"1970-01-01T00:00:00Z",
|
|
origin="external",
|
|
channel="manual",
|
|
gate=StubImportGate(),
|
|
profile=SEGMENTED_V1,
|
|
root_frontmatter_values={"bundle_id": "imported-2026-09-09"},
|
|
)
|
|
text = (bundle / "index.md").read_text(encoding="utf-8")
|
|
assert text.count("bundle_id:") == 1
|
|
assert parse_frontmatter(bundle / "index.md")["bundle_id"] == "imported-2026-09-09"
|
|
|
|
|
|
def test_the_default_profile_names_no_root_key_and_says_so(tmp_path: Path) -> None:
|
|
"""Naming a key the profile does not carry is refused BEFORE any write."""
|
|
place(tmp_path / "source", "tables/users.md", CONCEPT)
|
|
bundle = tmp_path / "bundle"
|
|
assert DEFAULT.index.root_frontmatter == ()
|
|
try:
|
|
import_bundle(
|
|
tmp_path / "source",
|
|
bundle,
|
|
"1970-01-01T00:00:00Z",
|
|
origin="external",
|
|
channel="manual",
|
|
gate=StubImportGate(),
|
|
root_frontmatter_values={"bundle_id": "x"},
|
|
)
|
|
except Exception as exc:
|
|
assert getattr(exc, "code", "") == "index_root_frontmatter_unexpected"
|
|
else: # pragma: no cover - a pass here is the defect
|
|
raise AssertionError("an unnamed root key was written")
|
|
assert not bundle.exists(), "a refused call left a partially written bundle"
|