- The auto-pause checkpoint and _extract_first_commit_sha read commit dicts by
key 'sha', but persisted commits are keyed 'hash' (CommitRef.hash) — the prior
change stopped the crash but silently dropped every ref. Read 'hash' (sha
fallback) at both sites; the test now uses the production dict shape so the
regression can't hide.
- unblock_with_restore set status directly and skipped the audit log; emit the
status-transition audit there too, like the other direct-set paths.
_check_pm_decision_required now requires the latest journal:decision
within pm_decision_window_seconds (default 300). Older decisions no
longer satisfy the gate. Adds JournalService.latest_decision_at.
Future-tighten (out of scope): per-verb-group consumption tracking
would need persistent state — Choreographer is per-request today.
Smoke run 3 showed agents auto-pausing on i_am_idle (correct behavior
for non-terminal tasks) but capturing no checkpoint — panel's
Checkpoints column stayed empty. Pre-gateway parity: the auto-pause
path now writes a synthetic checkpoint summarizing state at pause-time
so the panel reflects reality.
Manual i_will_pause (G8a, deferred) will eventually let agents pass
their own checkpoint_summary; for now this synthetic write covers the
bare i_am_idle case which is what all current agents do.
Spec ref: docs/superpowers/specs/2026-05-12-post-smoke-3-fixes-design.md
section C7.