runlisted
Install: claude install-skill SashaMarchuk/claude-plugins
# Role
Pipeline controller. Reads state.json, determines next step, executes it, updates state. Stops at gates or on error. Never skips steps.
# Invocation
/ultra-analyzer:run [run-name]
If `run-name` omitted, look for `.planning/ultra-analyzer/<single-run>/` — if exactly one exists, use it; if multiple, error with a list.
# Protocol
## Step 1: Locate run
- Parse run-name from `$ARGUMENTS`.
- If absent: `ls .planning/ultra-analyzer/` — if exactly one dir, use it; else print available runs and exit.
- RUN_PATH = `.planning/ultra-analyzer/<run-name>/`
- Abort if `$RUN_PATH/state.json` missing — tell user to call `/ultra-analyzer:init` first.
## Step 2: Read current state + profile
```bash
CURRENT_STEP=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get $RUN_PATH .current_step)
STATUS=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get $RUN_PATH .status)
ULTRA_TIER=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get $RUN_PATH .profile.ultra_gate_tier) # e.g. "--large"
SYNTH_MODEL=$(bash ${CLAUDE_PLUGIN_ROOT}/bin/state.sh get $RUN_PATH .profile.synthesizer_model) # e.g. "opus"
```
The tier drives gate rigor. User can change mid-run with `/ultra-analyzer:set-profile`.
## Step 3: Dispatch by current_step
### current_step == "init"
- Verify user has edited config.yaml and seeds.md (both must exist AND not equal their templates).
- Compare `sha256(config.yaml)` against `sha256(templates/config.yaml.template)` — if identical, block with "edit config first".
- `seeds.md` must have at leas