diff --git a/.github/workflows/hw-gate.yml b/.github/workflows/hw-gate.yml index b290fbbf2..a134e2ea5 100644 --- a/.github/workflows/hw-gate.yml +++ b/.github/workflows/hw-gate.yml @@ -402,6 +402,11 @@ jobs: GH_TOKEN: ${{ steps.token.outputs.token || github.token }} run: | set -euo pipefail + # The runner reuses its workspace: without the rm, Fable inherits the + # previous PR's evidence files and home (run 33866758629 on #702 + # carried #700's fable-summary.md and #686's route outputs) and can + # cite them as its own. Every session starts empty. + rm -rf fable-evidence fable-home mkdir -p fable-evidence fable-home exec 9>/home/kaden/actions-runner/_cache/hw-gate-gpu.lock flock --exclusive --timeout 3600 9 diff --git a/scripts/hw-gate/review.py b/scripts/hw-gate/review.py index 351188e87..ba23da1d5 100755 --- a/scripts/hw-gate/review.py +++ b/scripts/hw-gate/review.py @@ -1288,6 +1288,10 @@ def _run_decide(args) -> int: decision = None fable_unavailable = False fable_error_reason: str | None = None + # What the seat actually said/emitted when it did not produce a decision. + # Run 33866758629 (#702) ended "no JSON object in assistant text" after 10 s + # and the artifact carried nothing to diagnose it with. + fable_raw: dict | None = None investigation: list = [] unproven: list = [] if investigate: @@ -1346,6 +1350,8 @@ def _run_decide(args) -> int: fable_unavailable = True fable_error_reason = "omp decide: no JSON object in assistant text" sys.stderr.write(f"fable omp failed: {fable_error_reason}\n") + sys.stderr.write(f"fable assistant text (tail): {(last_text or '')[-2000:]!r}\n") + fable_raw = {"assistant_text_tail": (last_text or "")[-4000:], "stderr_tail": stderr_text[-4000:]} investigation = [] unproven = [] decision = None @@ -1625,6 +1631,8 @@ def _has_hold(r: str) -> bool: "investigation": investigation, "unproven": unproven, "evidence_dir": evidence_dir_val, + "fable_error": fable_error_reason, + "fable_raw": fable_raw, } try: Path(args.out).parent.mkdir(parents=True, exist_ok=True)