goal-plan-cleanlisted
Install: claude install-skill restarter/lets-workflow
# goal-plan-clean
Compose a `/goal` that drives the plan review-fix loop:
1. Run `/lets:review --plan` (or `/lets:check --plan`)
2. Read findings from `.lets/reviews/<latest>`
3. Edit the plan file to address each BLOCKER and SUGGESTION
4. Re-run review/check
5. Repeat ≤3 iterations until verdict APPROVED
The skill **never invokes `/goal` itself** — Claude Code's `/goal` is a UI command (verified empirically: `Skill(skill: "goal")` returns "goal is a UI command, not a skill. Ask the user to run /goal themselves"). It composes well-structured text and presents for the user to paste.
> **IMPORTANT:** If the spec below invokes any deferred tool (e.g. `AskUserQuestion`), you MUST load and call it as specified. Never skip the call, never substitute a default answer of your own — the tool invocation is part of the contract. This is critical.
## Step 1: Resolve plan file
```bash
LETS_PROJECT_ROOT=$(git rev-parse --show-toplevel)
BRANCH=$(git branch --show-current)
SLUG=${BRANCH#feature/}
PLAN_PATH="$LETS_PROJECT_ROOT/.lets/plans/${SLUG}.md"
test -f "$PLAN_PATH" && echo "found: $PLAN_PATH" || echo "NOT_FOUND"
```
If `NOT_FOUND`:
```bash
ls -1 "$LETS_PROJECT_ROOT/.lets/plans/"*.md 2>/dev/null
```
Then AskUserQuestion to pick from existing plans, or exit if none.
**Validation** (prevent path traversal): SLUG must match `^[a-zA-Z0-9._-]+$`. If not, fail with "Invalid branch name for plan derivation."
## Step 2: Resolve review tool
Parse `args` parameter:
- `args` = `"review"`