111def verify(roadmap_dir: Path = _DEFAULT_ROADMAP, source_dir: Path = _DEFAULT_SOURCE) -> FidelityResult:
112 """Run the §9 CI fidelity checks against the committed seed."""
115 source_dir = Path(source_dir)
116 with tempfile.TemporaryDirectory()
as raw_tmp:
119 rdir = tmp /
"roadmap"
121 for name
in (
"ROADMAP-v3.38.md",
"ROADMAP-EXEC-ORDER-v3.38.md",
122 "ROADMAP-CHANGELOG-v3.38.md",
"ROADMAP-TODO-v3.38.md"):
123 (rdir / name).write_text((Path(roadmap_dir) / name).read_text(encoding=
"utf-8"), encoding=
"utf-8")
124 oracle_db = tmp /
"oracle.sqlite"
125 ingest_oracle(rdir, oracle_db)
127 regen_report = emit_source(oracle_db, tmp /
"reemit_source", Path(roadmap_dir) /
"ROADMAP-v3.38.md")
128 result.promotions = len(regen_report.promotions)
129 result.classified_drops = len(regen_report.dropped_parent_child_deps)
132 records = scan_source_tree(source_dir)
133 non_canonical = format_source_tree(records, check=
False)
135 result.fail(
"source_canonical", non_canonical[:10])
137 result.passed(
"source_canonical", f
"{len(records)} records canonical")
140 seed_db = tmp /
"seed.sqlite"
141 first = regenerate(source_dir, seed_db)
143 result.fail(
"regenerate", first.envelope)
144 _dbg(
"OC_CHAT.MAIN", func,
"regenerate failed", 2)
146 second = regenerate(source_dir, seed_db)
147 if first.source_hash == second.source_hash
and first.logical_state_hash == second.logical_state_hash:
148 result.passed(
"regenerate_idempotent", {
"source_hash": first.source_hash,
149 "logical_state_hash": first.logical_state_hash})
151 result.fail(
"regenerate_idempotent",
"hashes differ across rebuilds")
155 missing = sorted(oracle_ids - regen_ids)
157 result.unclassified_drops = missing
158 result.fail(
"lossless_items", {
"missing": missing[:20],
"count": len(missing)})
160 result.passed(
"lossless_items", f
"{len(oracle_ids)} v3.38 items all present")
164 "§9 (1) renderer-diff vs the current files is operator-staged (run after P1.6 render lands on the seed).",
165 "§9 (3) render-based 4-tuple is operator-staged; this verifier proves store-level losslessness instead.",
166 "§9 (3b) per-phase item-ordering-matches-intent is operator-staged.",
167 f
"§9 (3c) sub-phase promotions: {result.promotions}; classified parent-child dep drops: {result.classified_drops}.",
169 _dbg(
"OC_CHAT.MAIN", func, f
"fidelity ok={result.ok}", 2)