Auto-version and Release / release (push) Successful in 7s
CI Pipeline / go-surface (push) Successful in 28s
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / lint (push) Failing after 43s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / canary (push) Successful in 53s
CI Pipeline / type-check (push) Successful in 31s
CI Pipeline / unit-tests (push) Failing after 5m10s
CI Pipeline / required-checks (push) Failing after 1s
deploy / deploy (push) Failing after 12m3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
Deterministic core of build_mode.py ported to src/go/build-mode:
- the 11-phase machine in declaration order + PhaseStatus/BuildPhase/
VerificationTier constants
- LogPhase + the named completion functions, clock INJECTED
(date-time-bomb law); side effects pinned: complete_plan assigns
batches, start_correct increments corrections
- ResumePoint (reversed declaration-order scan) + the pinned quirk:
complete_verify(false) records status 'complete' with the failure in
DETAILS — the resume scan never fires on it
- BuildStatus shape; build_id %Y%m%d-%H%M%S from the injected clock
- module-family CLI (curator-core convention); worktree git ops stay
reactive (batch 2)
PARITY: truth_buildmode.json — 5 flow cases with RECORDED CALLS replayed
through the ported functions; the oracle's ledger pinned two subtleties my
first read missed (complete_feasible's nested details key; assess/research
log their parameter dicts, not kwargs maps). Comparisons are canonical-JSON
(Go []string vs decoded []interface{} differ in type, not bytes).
116 lines
4.4 KiB
Python
116 lines
4.4 KiB
Python
#!/usr/bin/env python3
|
|
"""gen_build_mode_truth.py — build-mode batch 1 truth battery
|
|
(contract BUILDER-2026-10-07T17:08:00Z-6e177d-unknown).
|
|
|
|
The LIVE BuildManager runs with the clock FROZEN (module-patched datetime)
|
|
and create_worktree no-op'd (reactive piece, deferred to batch 2). Cases
|
|
capture: the start_build id format, the ledger flow across phases
|
|
(including a failure + correction), resume-point scans at several states,
|
|
and the status shape. The Go replay compares state dicts key-for-key.
|
|
|
|
Usage: python3 scripts/gen_build_mode_truth.py (from repo root)
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
|
|
REPO = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(REPO / "src"))
|
|
|
|
from rune import build_mode as bm # noqa: E402
|
|
|
|
FROZEN = "2026-10-07T16:08:00"
|
|
FROZEN_DT = datetime(2026, 10, 7, 16, 8, 0, tzinfo=timezone.utc)
|
|
|
|
|
|
class FrozenDatetime(datetime):
|
|
@classmethod
|
|
def now(cls, tz=None):
|
|
return FROZEN_DT
|
|
|
|
|
|
def main():
|
|
# Freeze the clock (the manager reads datetime.now at two call sites)
|
|
bm.datetime = FrozenDatetime
|
|
|
|
def flow(name, steps):
|
|
"""Run a phase flow with the worktree op no-op'd; record the CALLS."""
|
|
mgr = bm.BuildManager()
|
|
mgr.create_worktree = lambda: "/nonexistent-worktree" # reactive no-op
|
|
build_id = mgr.start_build("truth battery build")
|
|
calls = []
|
|
for fn, args in steps:
|
|
fn(mgr, **args)
|
|
calls.append({"fn": fn.__name__, "args": args})
|
|
return {
|
|
"name": name,
|
|
"build_id": build_id,
|
|
"calls": calls,
|
|
"state": _jsonify(mgr.state),
|
|
"resume_point": mgr.get_resume_point(),
|
|
"can_resume": mgr.can_resume(),
|
|
"status": mgr.get_status(),
|
|
}
|
|
|
|
def step(fn, **args):
|
|
return (fn, args)
|
|
|
|
cases = [
|
|
flow("fresh_start_assess_in_progress", []),
|
|
flow("assess_complete", [
|
|
step(bm.BuildManager.complete_assess, complexity_report={"complexity": 3}),
|
|
]),
|
|
flow("through_plan", [
|
|
step(bm.BuildManager.complete_assess, complexity_report={"complexity": 3}),
|
|
step(bm.BuildManager.complete_research, findings={"findings": "dichotomy applies"}),
|
|
step(bm.BuildManager.complete_feasible, feasible=True, risk="low"),
|
|
step(bm.BuildManager.complete_consult, patterns=["oracle-battery pattern"]),
|
|
step(bm.BuildManager.complete_consent, approved=True),
|
|
step(bm.BuildManager.complete_plan, batches=[{"batch": 1, "fns": 11}]),
|
|
]),
|
|
flow("verify_with_failures", [
|
|
step(bm.BuildManager.complete_assess, complexity_report={}),
|
|
step(bm.BuildManager.complete_research, findings={}),
|
|
step(bm.BuildManager.complete_feasible, feasible=True, risk="low"),
|
|
step(bm.BuildManager.complete_consult, patterns=[]),
|
|
step(bm.BuildManager.complete_consent, approved=True),
|
|
step(bm.BuildManager.complete_plan, batches=[]),
|
|
step(bm.BuildManager.complete_build_phase, results=[{"ok": True}]),
|
|
step(bm.BuildManager.complete_verify, passed=False, failures=["test_x failed"]),
|
|
]),
|
|
flow("correction_cycle", [
|
|
step(bm.BuildManager.complete_assess, complexity_report={}),
|
|
step(bm.BuildManager.complete_research, findings={}),
|
|
step(bm.BuildManager.complete_feasible, feasible=True, risk="low"),
|
|
step(bm.BuildManager.complete_consult, patterns=[]),
|
|
step(bm.BuildManager.complete_consent, approved=True),
|
|
step(bm.BuildManager.complete_plan, batches=[{"batch": 1}]),
|
|
step(bm.BuildManager.start_correct),
|
|
step(bm.BuildManager.complete_correct, fixed=True),
|
|
]),
|
|
]
|
|
|
|
out = {
|
|
"oracle": "src/rune/build_mode.py (live BuildManager, clock frozen)",
|
|
"generated": "2026-10-07",
|
|
"frozen_now": FROZEN,
|
|
"cases": cases,
|
|
}
|
|
target = REPO / "src/go/build-mode" / "truth_buildmode.json"
|
|
target.write_text(json.dumps(out, indent=1, ensure_ascii=False) + "\n")
|
|
print(f"wrote {target} ({len(cases)} flow cases)")
|
|
|
|
|
|
def _jsonify(state):
|
|
"""asdict + the worktree path the no-op returned."""
|
|
from dataclasses import asdict
|
|
d = asdict(state)
|
|
return d
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|