#!/usr/bin/env python3 """gen_builder_bridge_cli_truth.py — freeze the builder_bridge_cli parity oracle (dichotomy wave #2479, GO verdict). The module is a CLI (argv → stdout), so truth is frozen by RUNNING the live Python oracle as a subprocess per case under pinned seams — the oracle's own degrade paths make the surface deterministic: * RUNE_MEMORY_DIR → fresh empty dir (selector unavailable → no memory lines; the same degrade the oracle takes in any selector failure) * RUNE_CONSTRUCTION_STORE → fresh empty dir (no active contract → no construction lines) * BBC_FROZEN_NOW via scripts/bbc_freeze_seams/sitecustomize.py — the wall clock pinned before import (generated_at in --json output) * BUILDER_BRIDGE_REPO → this checkout (sys.path bootstrap target) * deep-copied argv per case; every CLI branch exercised (no-args, join/strip semantics, --json as argv[1] exactly, --json as task text, all three routes, floor + not-grounded constraints, test- surface verifiability, inspection verbs) Output: src/go/builder-bridge-cli/truth.json — [{"id", "args", "frozen_now", "stdout", "exit"}...] — replayed VERBATIM by the module's truth_test.go and byte-compared in live parity. Byte-determinism: fixed frozen_now, fixed argv literals, fresh-but-empty degrade dirs — re-running regenerates a byte-identical file. """ import json import os import subprocess import sys import tempfile from pathlib import Path ROOT = Path(__file__).resolve().parents[1] FROZEN_NOW = "2026-10-14T09:00:00+00:00" CASES = [ {"id": "no_args", "args": []}, {"id": "local_fix_typo", "args": ["fix", "the", "typo", "in", "scripts/foo.py"]}, {"id": "floor_trigger", "args": ["adopt", "a", "replacement", "architecture", "for", "the", "memory", "subsystem"]}, {"id": "json_local_fix", "args": ["--json", "fix", "the", "typo", "in", "scripts/foo.py"]}, {"id": "json_floor", "args": ["--json", "adopt", "a", "replacement", "architecture"]}, {"id": "json_empty_task", "args": ["--json"]}, {"id": "mechanism_constraint", "args": ["measure", "the", "latency", "of", "the", "parser", "under", "load"]}, {"id": "external_constraint", "args": ["integrate", "the", "payments", "api", "service", "endpoint"]}, {"id": "json_as_task_text", "args": ["summarize", "--json", "fix"]}, {"id": "join_strip_inner_spaces", "args": [" ", "fix bug ", " "]}, {"id": "whitespace_only_task", "args": [" "]}, {"id": "test_surface_verifiable", "args": ["fix", "the", "crash", "in", "parser.py", "covered", "by", "tests/test_parser.py"]}, {"id": "inspection_verb_readonly", "args": ["review", "the", "cache", "module"]}, ] def run_oracle(args: list[str]) -> dict: mem = tempfile.mkdtemp(prefix="bbc-truth-mem-") constr = tempfile.mkdtemp(prefix="bbc-truth-constr-") home = tempfile.mkdtemp(prefix="bbc-truth-home-") env = dict(os.environ) env.update({ "BUILDER_BRIDGE_REPO": str(ROOT), "RUNE_MEMORY_DIR": mem, "RUNE_CONSTRUCTION_STORE": constr, # HOME isolation (pin_home law): the selector's shard sources read # a HARDCODED ~/.config/opencode dir that ignores RUNE_* isolation # (memory_selector P1-03 deviation note) — a fresh HOME makes every # source degrade to [] hermetically. "HOME": home, "PYTHONPATH": str(ROOT / "scripts" / "bbc_freeze_seams"), "REPO_ROOT": str(ROOT), "BBC_FROZEN_NOW": FROZEN_NOW, }) p = subprocess.run( [sys.executable, str(ROOT / "src" / "rune" / "builder_bridge_cli.py"), *args], capture_output=True, text=True, env=env, timeout=120, ) return {"stdout": p.stdout, "exit": p.returncode} if __name__ == "__main__": truth = [] for case in CASES: r = run_oracle(list(case["args"])) truth.append({"id": case["id"], "args": case["args"], "frozen_now": FROZEN_NOW, "stdout": r["stdout"], "exit": r["exit"]}) print(f"{case['id']}: exit={r['exit']} stdout={r['stdout'][:60]!r}") out = ROOT / "src" / "go" / "builder-bridge-cli" / "truth.json" out.write_text(json.dumps(truth, indent=1, ensure_ascii=False) + "\n") print(f"frozen {len(truth)} cases -> {out}")