### Step 1a — post-smoke panel (when criteria exist)

When grinding or the user supplied **acceptance criteria** (from the issue body at Gate 1 — not
ad-hoc chat text), run a **Budget-routing panel** on observable stage signals before teardown:

1. **Panel** (parallel):
   - **requirements-match** (budget tier) — does the staged URL/behavior meet the criteria?
   - **runtime-health** (budget tier) — console errors, failed `healthUrl`, broken UI signals
     *(smoke observability — not the grind `correctness` hard lens)*
   - **tests-actually-test** (budget tier) — if Playwright ran, did it exercise the changed path?
2. **Confirm** — get an independent second model to verify the staged URL or behavior meets the acceptance criteria.
3. Feed the result back to the active loop or report to the human. A blocker
   means the stage failed smoke — do not claim the grind criterion met.
   This panel is **not** a security clearance — grind Phase 2 still runs the `security` hard lens.

Skip when `/stage` is ad-hoc preview with no criteria.

