fix(hw-gate): the status job reads the verdict from decision_final - #706
Conversation
review.py writes the seat's full object under `.decision` and the floor-applied verdict under `.decision_final`. The status step read `.decision`, got a JSON object, matched the `*)` arm, and went red on every run — including #689's successful merge-staging (run 33889229683: Fable merged 8f3a9b6 to beta as 3149be7, label merged-staging applied, status "blocked ()"). `jq -r '.decision_final // .decision.decision // "hold"'`: on the #689 artifact → merge-staging (green); on the #702 no-decision artifact → block (red). No change to the floor or the seats.
hw-gate sol prelimsummary: The workflow status job now reads the floor-applied scalar verdict from run_hardware: true routes:
unavailable_routes: (none) claim_assessment: The author claims that replaying the status query against real decision artifacts classifies #689 as |
hw-gate evidence — 2 lane(s) — verdict passlane hiptrx (gfx1201)hw-gate evidence
fixturesno fixtures kernelnot run lane hipx (gfx1100)hw-gate evidence
fixturesno fixtures kernelnot run |
hw-gate sol verdict{
"claim_verdict": "not-exercised",
"confidence": 0.96,
"coverage": {
"gaps": [
"The cited replay outcomes for archived #689 and #702 decision artifacts are not included in hw-gate.json."
],
"surfaces_evidenced": [
"policy",
"ci"
],
"surfaces_touched": [
"policy",
"ci"
]
},
"decision": "needs-human",
"eyeball": [
".github/workflows/hw-gate.yml:499-513 changes required-status policy and must receive human review; verify that only decision_final=merge-staging can make the status green and that hold remains subject to the human-reviewed exception."
],
"phase": "verdict",
"rationale": "The diff matches the producer schema: scripts/hw-gate/review.py:1418-1435 computes the scalar decision_final, while decision is the full Fable object. The new query at .github/workflows/hw-gate.yml:503 therefore supplies the scalar expected by the case statement and retains a sensible nested-field fallback. The hardware run succeeded on gfx1201 and gfx1100, with no fixture failures, but its empty route set cannot independently prove the claimed #689/#702 artifact replays. No regression is evident; needs-human is mandatory because this changes a policy workflow.",
"regressions": []
}Floor: hard=['policy_paths: .github/workflows/hw-gate.yml'] soft=["coverage_gaps: ['The cited replay outcomes for archived #689 and #702 decision artifacts are not included in hw-gate.json.']", 'model needs-human'] model_decision=needs-human final=needs-human |
There was a problem hiding this comment.
hw-gate sol verdict needs-human: The diff matches the producer schema: scripts/hw-gate/review.py:1418-1435 computes the scalar decision_final, while decision is the full Fable object. The new query at .github/workflows/hw-gate.yml:503 therefore supplies the scalar expected by the case statement and retains a sensible nested-field fallback. The hardware run succeeded on gfx1201 and gfx1100, with no fixture failures, but its empty route set cannot independently prove the claimed #689/#702 artifact replays. No regression is evident; needs-human is mandatory because this changes a policy workflow.
|
announcement: Holding only because this edits the gate workflow, which a human merges by rule; on the evidence the fix is right and I'd put my name on it. I pulled the Status step out of both workflow revisions and ran it under real jq against every decision.json shape review.py can write plus the real artifact #705 left on this runner: base reproduces your investigation: | question | route | result | evidence | |---|---|---|---| | Does the base workflow's Status step actually go red on a successful merge-staging artifact, and does the head's jq fix route every shape review.py can write to the right arm? | bash $HW_GATE_EVIDENCE/pr706-status-replay.sh — pyyaml-extracts the Status step | Did base also break the human-reviewed escape hatch for policy holds (undocumented in the PR body)? | same replay, base workflow, human_reviewed=true, artifacts | Is the | Does the PR merge cleanly onto current master (branch predates #705, which also edited hw-gate.yml)? | git merge-tree --write-tree $HW_GATE_BASE_SHA HEAD; python3 yaml.safe_load of both workflow revisions (implicit in the extractor) | Clean tree fcc943efd, rc=0, no conflict entries; hunks are disjoint (#705 at the decide job ~line 409, #706 at the status step 499-503). Head YAML parses. | pr706-context-checks.txt | unproven:
rationale: Hard floor fired on policy_paths (.github/workflows/hw-gate.yml), so the decision is hold or block; nothing here is an evidence failure, so hold. On the merits the change is correct and I would merge it: hw-gate.yml:503 now reads the scalar review.py writes at review.py:1621 ( hard floor: ['policy_paths: .github/workflows/hw-gate.yml'] soft floor: ["coverage_gaps: ['The cited replay outcomes for archived #689 and #702 decision artifacts are not included in hw-gate.json.']", 'model needs-human'] |
There was a problem hiding this comment.
Holding only because this edits the gate workflow, which a human merges by rule; on the evidence the fix is right and I'd put my name on it. I pulled the Status step out of both workflow revisions and ran it under real jq against every decision.json shape review.py can write plus the real artifact #705 left on this runner: base reproduces your blocked () exactly, and head sends merge-staging green, hold red-until-labelled, and block red — including the case where the floor overrode a seat's merge-staging, which correctly stays block. Worth knowing: the same bug also meant the human-reviewed label never cleared a real policy hold on master, so this fixes two things. One nit if you're touching it again: the old jq printed the pretty-printed object, not "[object]". Full replay is in the evidence artifact under pr706-*. Hard floor fired on policy_paths (.github/workflows/hw-gate.yml), so the decision is hold or block; nothing here is an evidence failure, so hold. On the merits the change is correct and I would merge it: hw-gate.yml:503 now reads the scalar review.py writes at review.py:1621 (decision_final) instead of the seat object at :1619, and the Status step extracted verbatim from both revisions and replayed under real jq-1.8.1 (pr706-status-replay.txt) shows base going red on every seat-bearing artifact — merge-staging and hold alike, which also means the human-reviewed label has never been able to clear a policy hold on master — while head routes all 8 artifact shapes × 2 label states as the case statement intends, including the safety-critical one where the floor forced block over a seat's merge-staging. The .decision.decision fallback is unreachable for any artifact the base-checkout review.py writes (pr706-context-checks.txt) and cannot precede decision_final. Merge-tree onto base is clean. Sol's single coverage gap (the #689/#702 replays) is closed in kind by real-705.json plus the schema-exact synthetic artifacts; the exact blocked () string the author quotes is reproduced. One nit for whoever merges: the new comment says the old jq yielded "[object]"; it yields the pretty-printed object. Index: $HW_GATE_EVIDENCE/pr706-fable-summary.md.
Summary
review.pywrites the seat's full object under.decisionand the floor-applied verdict under.decision_final. The status step read.decision, got a JSON object, fell into the*)arm, and went red on every run — including #689's successful staging merge (run 33889229683: Fable merged8f3a9b6c5tobetaas3149be7de, labelmerged-stagingapplied, statusblocked ()).Fix:
jq -r '.decision_final // .decision.decision // "hold"'.Evidence
On the real artifacts: #689 →
merge-staging(green); #702's no-decision run →block(red). Workflow YAML parses. No change to the floor or the seats.Which surface(s) does this touch?
hw-gate.yml(hard floor: a human merges this)