Problem — Slice 2 (PR #298) ships the in-repo smoke gate (packages/opencode/script/hub-smoke-gate.sh + the .smoke.json record contract: pass + sha of the smoked binary). The ops surface outside the repo does not yet call it, so the refusal path is inert until wired.
Fix — One-line call in hub-restart.sh's swap mode (refuse without a matching smoke record) + the DB-snapshot smoke harness writes the record on PASS. Both files are the canonical ops copies installed per machine.
Source — PR #298 notes; spec-20260905-045114 (D3).
Problem — Slice 2 (PR #298) ships the in-repo smoke gate (packages/opencode/script/hub-smoke-gate.sh + the .smoke.json record contract: pass + sha of the smoked binary). The ops surface outside the repo does not yet call it, so the refusal path is inert until wired.
Fix — One-line call in hub-restart.sh's swap mode (refuse without a matching smoke record) + the DB-snapshot smoke harness writes the record on PASS. Both files are the canonical ops copies installed per machine.
Source — PR #298 notes; spec-20260905-045114 (D3).