mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
feat(infra): add optional --rrc alignment to lake_build_ingest.py
When --rrc is given, the shim runs pist-classify-trace on the trace fixture and rrc-watchdog for RRC alignment, then writes an additional rrc_alignment receipt into ene.receipts alongside the build receipt.
This commit is contained in:
parent
94b04ae321
commit
5e7200c84f
1 changed files with 199 additions and 2 deletions
|
|
@ -17,12 +17,18 @@ Tables used:
|
||||||
ene.ingest_events — provenance for the ingestion itself
|
ene.ingest_events — provenance for the ingestion itself
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
python3 4-Infrastructure/shim/lake_build_ingest.py [target] [--dir LEAN_DIR] [--actor NAME]
|
python3 4-Infrastructure/shim/lake_build_ingest.py [target] [--dir LEAN_DIR] [--actor NAME] [--rrc TRACE_JSON]
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
python3 4-Infrastructure/shim/lake_build_ingest.py
|
python3 4-Infrastructure/shim/lake_build_ingest.py
|
||||||
python3 4-Infrastructure/shim/lake_build_ingest.py Compiler
|
python3 4-Infrastructure/shim/lake_build_ingest.py Compiler
|
||||||
python3 4-Infrastructure/shim/lake_build_ingest.py Semantics.NKHodgeFAMM --actor opencode
|
python3 4-Infrastructure/shim/lake_build_ingest.py Semantics.NKHodgeFAMM --actor opencode
|
||||||
|
python3 4-Infrastructure/shim/lake_build_ingest.py Compiler --rrc Compiler.trace.json
|
||||||
|
|
||||||
|
When --rrc is given, the shim looks for <target>.trace.json (or the explicit path),
|
||||||
|
runs the canonical `pist-classify-trace` executable, then runs `rrc-watchdog` with
|
||||||
|
its predicted shape. The resulting RRC alignment receipt is stored alongside the
|
||||||
|
build receipt. Both steps are pure I/O wrappers around Lean executables.
|
||||||
"""
|
"""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
@ -43,6 +49,8 @@ LEAN_DIR = ROOT / "0-Core-Formalism/lean/Semantics"
|
||||||
NEON_HOST = "100.92.88.64"
|
NEON_HOST = "100.92.88.64"
|
||||||
CONTAINER = "arxiv-pg"
|
CONTAINER = "arxiv-pg"
|
||||||
DB = "ene"
|
DB = "ene"
|
||||||
|
PIST_CLASSIFY = LEAN_DIR / ".lake" / "build" / "bin" / "pist-classify-trace"
|
||||||
|
RRC_WATCHDOG = LEAN_DIR / ".lake" / "build" / "bin" / "rrc-watchdog"
|
||||||
|
|
||||||
|
|
||||||
def _now() -> str:
|
def _now() -> str:
|
||||||
|
|
@ -253,12 +261,176 @@ def _escape_sql(s: str) -> str:
|
||||||
return s.replace("'", "''").replace("\\", "\\\\")
|
return s.replace("'", "''").replace("\\", "\\\\")
|
||||||
|
|
||||||
|
|
||||||
|
def _find_rrc_trace(target: str, explicit_path: Path | None, lean_dir: Path) -> Path | None:
|
||||||
|
"""Resolve the RRC trace fixture path.
|
||||||
|
|
||||||
|
If an explicit path is given, use it. Otherwise look for <target>.trace.json
|
||||||
|
in the Lean directory. Returns None if not found.
|
||||||
|
"""
|
||||||
|
if explicit_path is not None:
|
||||||
|
if explicit_path.is_absolute():
|
||||||
|
return explicit_path if explicit_path.exists() else None
|
||||||
|
candidate = lean_dir / explicit_path
|
||||||
|
if candidate.exists():
|
||||||
|
return candidate
|
||||||
|
candidate = ROOT / explicit_path
|
||||||
|
return candidate if candidate.exists() else None
|
||||||
|
if not target:
|
||||||
|
return None
|
||||||
|
candidate = lean_dir / f"{target}.trace.json"
|
||||||
|
return candidate if candidate.exists() else None
|
||||||
|
|
||||||
|
|
||||||
|
def _run_pist_classify(trace_path: Path, lean_dir: Path) -> dict[str, Any]:
|
||||||
|
"""Run the canonical pist-classify-trace executable on a trace fixture."""
|
||||||
|
if not PIST_CLASSIFY.exists():
|
||||||
|
raise RuntimeError(f"pist-classify-trace not found at {PIST_CLASSIFY}")
|
||||||
|
proc = subprocess.run(
|
||||||
|
[str(PIST_CLASSIFY), str(trace_path)],
|
||||||
|
cwd=lean_dir,
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=60,
|
||||||
|
)
|
||||||
|
if proc.returncode != 0:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"pist-classify-trace failed: {proc.stderr[:500]}"
|
||||||
|
)
|
||||||
|
return json.loads(proc.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
def _run_rrc_watchdog(pist_label: str, exact_label: str | None, rrc_shape: str, lean_dir: Path) -> dict[str, Any]:
|
||||||
|
"""Run the canonical rrc-watchdog executable for RRC alignment.
|
||||||
|
|
||||||
|
The executable returns JSON and exits 0 when score >= 86.
|
||||||
|
We capture exit code as part of the result but do not treat non-zero as failure.
|
||||||
|
"""
|
||||||
|
if not RRC_WATCHDOG.exists():
|
||||||
|
raise RuntimeError(f"rrc-watchdog not found at {RRC_WATCHDOG}")
|
||||||
|
cmd = [str(RRC_WATCHDOG), "--pist-label", pist_label]
|
||||||
|
if exact_label:
|
||||||
|
cmd.extend(["--exact-label", exact_label])
|
||||||
|
cmd.extend(["--rrc-shape", rrc_shape])
|
||||||
|
proc = subprocess.run(
|
||||||
|
cmd,
|
||||||
|
cwd=lean_dir,
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=60,
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
result = json.loads(proc.stdout)
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
raise RuntimeError(
|
||||||
|
f"rrc-watchdog produced non-JSON output: {proc.stdout[:500]}"
|
||||||
|
) from e
|
||||||
|
result["exit_code"] = proc.returncode
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _run_rrc_alignment(target: str, trace_path: Path, lean_dir: Path) -> dict[str, Any] | None:
|
||||||
|
"""Run PIST classification + RRC alignment gate on a trace fixture.
|
||||||
|
|
||||||
|
Returns a dict with the PIST output, RRC alignment output, and computed
|
||||||
|
receipt hash. Returns None if any step cannot be completed.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
pist = _run_pist_classify(trace_path, lean_dir)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"RRC PIST classification skipped: {e}", file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
predicted_shape = pist.get("predicted_rrc_shape", "HoldForUnlawfulOrUnderspecifiedShape")
|
||||||
|
tactic_family = pist.get("tactic_family", "unknown")
|
||||||
|
|
||||||
|
# rrc-watchdog expects a shape argument. Use the predicted shape as both
|
||||||
|
# the PIST label and the declared RRC shape, so the gate tests self-alignment.
|
||||||
|
try:
|
||||||
|
rrc = _run_rrc_watchdog(
|
||||||
|
predicted_shape,
|
||||||
|
None,
|
||||||
|
_shape_to_watchdog_arg(predicted_shape),
|
||||||
|
lean_dir,
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"RRC alignment gate skipped: {e}", file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
canonical = json.dumps(
|
||||||
|
{"pist": pist, "rrc": rrc},
|
||||||
|
sort_keys=True,
|
||||||
|
separators=(",", ":"),
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
"pist": pist,
|
||||||
|
"rrc": rrc,
|
||||||
|
"predicted_shape": predicted_shape,
|
||||||
|
"tactic_family": tactic_family,
|
||||||
|
"canonical_json": canonical,
|
||||||
|
"receipt_hash": hashlib.sha256(canonical.encode()).hexdigest(),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _shape_to_watchdog_arg(shape: str) -> str:
|
||||||
|
"""Map pist-classify-trace shape strings to rrc-watchdog CLI arguments."""
|
||||||
|
mapping = {
|
||||||
|
"SignalShapedRouteCompiler": "signalShapedRouteCompiler",
|
||||||
|
"ProjectableGeometryTopology": "projectableGeometryTopology",
|
||||||
|
"CognitiveLoadField": "cognitiveLoadField",
|
||||||
|
"CadForceProbeReceipt": "cadForceProbeReceipt",
|
||||||
|
"LogogramProjection": "logogramProjection",
|
||||||
|
"HoldForUnlawfulOrUnderspecifiedShape": "holdForUnlawfulOrUnderspecifiedShape",
|
||||||
|
}
|
||||||
|
return mapping.get(shape, "holdForUnlawfulOrUnderspecifiedShape")
|
||||||
|
|
||||||
|
|
||||||
|
def _insert_rrc_receipt(
|
||||||
|
pkg_id: str,
|
||||||
|
session_id: str,
|
||||||
|
alignment: dict[str, Any],
|
||||||
|
target: str,
|
||||||
|
) -> None:
|
||||||
|
"""Insert an RRC alignment receipt bound to the build package."""
|
||||||
|
pist = alignment["pist"]
|
||||||
|
rrc = alignment["rrc"]
|
||||||
|
residual = json.dumps(
|
||||||
|
{
|
||||||
|
"target": target,
|
||||||
|
"predicted_shape": alignment["predicted_shape"],
|
||||||
|
"tactic_family": alignment["tactic_family"],
|
||||||
|
"alignment_status": rrc.get("alignmentStatus", "unknown"),
|
||||||
|
"alignment_score": rrc.get("score"),
|
||||||
|
"alignment_warnings": rrc.get("warnings", []),
|
||||||
|
"pist_spectral_radius": pist.get("spectral_radius_q16"),
|
||||||
|
"rrc_exit_code": rrc.get("exit_code"),
|
||||||
|
},
|
||||||
|
separators=(",", ":"),
|
||||||
|
)
|
||||||
|
sql = f"""
|
||||||
|
INSERT INTO ene.receipts
|
||||||
|
(package_id, receipt_type, receipt_hash, input_hash, output_hash,
|
||||||
|
toolchain, verifier, status, residual)
|
||||||
|
VALUES
|
||||||
|
('{pkg_id}', 'rrc_alignment', '{alignment['receipt_hash']}',
|
||||||
|
'{hashlib.sha256(alignment['canonical_json'].encode()).hexdigest()}',
|
||||||
|
'{alignment['receipt_hash']}',
|
||||||
|
'pist-classify-trace; rrc-watchdog', 'opencode',
|
||||||
|
'{rrc.get('alignmentStatus', 'unknown')}',
|
||||||
|
'{residual}'::jsonb)
|
||||||
|
ON CONFLICT (package_id, receipt_type, receipt_hash) DO NOTHING;
|
||||||
|
"""
|
||||||
|
_ssh_psql(sql)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
parser = argparse.ArgumentParser(description="Ingest lake build output into ENE on neon-64gb")
|
parser = argparse.ArgumentParser(description="Ingest lake build output into ENE on neon-64gb")
|
||||||
parser.add_argument("target", nargs="?", default="", help="lake build target (default: full build)")
|
parser.add_argument("target", nargs="?", default="", help="lake build target (default: full build)")
|
||||||
parser.add_argument("--dir", type=Path, default=LEAN_DIR, help="directory to run lake build in")
|
parser.add_argument("--dir", type=Path, default=LEAN_DIR, help="directory to run lake build in")
|
||||||
parser.add_argument("--actor", default="opencode", help="actor name for session")
|
parser.add_argument("--actor", default="opencode", help="actor name for session")
|
||||||
parser.add_argument("--dry-run", action="store_true", help="print parsed build info without writing")
|
parser.add_argument("--dry-run", action="store_true", help="print parsed build info without writing")
|
||||||
|
parser.add_argument("--rrc", type=Path, nargs="?", const=True, default=None,
|
||||||
|
help="enable RRC alignment. Uses <target>.trace.json in LEAN_DIR if no path is given.")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
actor = args.actor
|
actor = args.actor
|
||||||
|
|
@ -282,13 +454,38 @@ def main() -> int:
|
||||||
file=sys.stderr,
|
file=sys.stderr,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Resolve RRC trace fixture if requested.
|
||||||
|
rrc_alignment: dict[str, Any] | None = None
|
||||||
|
if args.rrc is not None:
|
||||||
|
explicit_path = args.rrc if isinstance(args.rrc, Path) else None
|
||||||
|
trace_path = _find_rrc_trace(target, explicit_path, args.dir)
|
||||||
|
if trace_path:
|
||||||
|
print(f"RRC trace fixture: {trace_path}", file=sys.stderr)
|
||||||
|
rrc_alignment = _run_rrc_alignment(target, trace_path, args.dir)
|
||||||
|
if rrc_alignment:
|
||||||
|
print(
|
||||||
|
f"RRC alignment: {rrc_alignment['rrc'].get('alignmentStatus')} "
|
||||||
|
f"score={rrc_alignment['rrc'].get('score')}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
print(
|
||||||
|
f"RRC trace fixture not found for target '{target}' (use --rrc <path>)",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
|
||||||
if args.dry_run:
|
if args.dry_run:
|
||||||
print(json.dumps({"git": git, "build": build, "elapsed_ms": elapsed_ms}, indent=2))
|
payload = {"git": git, "build": build, "elapsed_ms": elapsed_ms}
|
||||||
|
if rrc_alignment:
|
||||||
|
payload["rrc_alignment"] = rrc_alignment
|
||||||
|
print(json.dumps(payload, indent=2))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
session_id = _insert_session(target, git, build, elapsed_ms, actor)
|
session_id = _insert_session(target, git, build, elapsed_ms, actor)
|
||||||
pkg_id = _insert_package(session_id, target, git, build)
|
pkg_id = _insert_package(session_id, target, git, build)
|
||||||
_insert_receipt(pkg_id, session_id, build)
|
_insert_receipt(pkg_id, session_id, build)
|
||||||
|
if rrc_alignment:
|
||||||
|
_insert_rrc_receipt(pkg_id, session_id, rrc_alignment, target)
|
||||||
_insert_ingest_event(pkg_id, session_id)
|
_insert_ingest_event(pkg_id, session_id)
|
||||||
|
|
||||||
print(f"Ingested: session={session_id} package={pkg_id}", file=sys.stderr)
|
print(f"Ingested: session={session_id} package={pkg_id}", file=sys.stderr)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue