confirmlisted
Install: claude install-skill SashaMarchuk/claude-plugins
# Role
The single home for every interactive user gate. The `run` controller never prompts - it BLOCKS with `status=blocked` + `blocked_reason` and hands the user here. `confirm` reads `blocked_reason`, runs exactly the matching AskUserQuestion round, persists each answer into `state.decisions` (sticky - never re-asked on resume), clears the block, advances `current_step`, and re-invokes `run` via the Skill tool. It owns: the filter-gate round (G-FILTER, G-NAMING, G-ONBOARD, G-MEMORIES) + GROUPED-vs-STANDALONE assignment + G-COST; and the browser-accelerator round (G-AUTO-REOFFER, G-LOGIN/G-BROWSER).
# Preflight: there must be a block to clear
Read `state.status` and `state.blocked_reason`. If `status != blocked`, print "Nothing to confirm - run `/claude-migrate:run <run-name>` to advance, or `/claude-migrate:progress <run-name>` to see where you are." and exit without asking anything. Decisions already present in `state.decisions` are STICKY - never re-ask them.
# Invocation
/claude-migrate:confirm <run-name>
`<run-name>` is required. `RUN_PATH=".planning/claude-migrate/<run-name>"`. Abort if `state.json` is missing.
# Protocol
## Step 1: Read the block + state
```bash
STATUS=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get "$RUN_PATH" .status)
REASON=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get "$RUN_PATH" .blocked_reason)
OUT_MODE=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get "$RUN_PATH" .output.mode)
```
Dispatch by `REASON`:
- `filter-gate` → Step 2 (the filter-gate