---
name: next-action
description: "Use when the user wants a next-action recommendation based on current state — reads handoff/git/lessons/STATE and proposes top-3 by impact. Trigger: '/next', 'what should I do next', 'next action'. Proposes only, never executes."
user-invocable: true
tools: Read, Bash, Glob  # documentation only — Claude Code does not enforce this field
disallowed-tools: Edit, Write, NotebookEdit  # physical lock for this propose-only skill, until the user's next message
not_for:
  - "Right after session start (session-start already outputs state)"
  - "User already gave a specific task"
see_also:
  - skill: session-start
    relation: "next-action=recommendation from current state, session-start=restore prior session"
  - skill: stepback
    relation: "next-action=what's next, stepback=am I doing the right thing right now"
---
# /next — Next Action Recommender

## Dominant Variable
**Is the proposed action actually high-impact based on current project state?** — it must come from measured files, not guesses.

## Purpose

Reads current project state and proposes the top 3 next actions by impact.
Different from stepback (direction check) — stepback asks "am I doing the right thing right now", this asks "what should I do next".
Different from session-start (handoff load) — session-start restores the prior session, this recommends actions from current state.

**Discard if**: right after session start (session-start already loaded the handoff + output state). User already gave a specific task.

## Key Assumptions

1. **Project has a CLAUDE.md** — if broken: propose from git status alone (reduced scope).
2. **Is a git repository** — if broken: propose from filesystem scan alone.

## Trigger

- `/next`
- "what should I do next"
- "next action"

## Workflow

### Step 1: Collect State (parallel, 30s cap)

Read the following 5 sources. Skip missing files.

1. `memory/session-handoff-LATEST.md` — "What to do now" section
2. `git status --short` — uncommitted changed files
3. `git log --oneline -5` — recent work flow
4. `tasks/lessons.md` — `conf≥0.7` lessons stale 30+ days (need re-application)
5. `docs/STATE.md` or `~/.claude/STATE.md` — PENDING blockers

### Step 2: Derive Candidates

Extract action candidates from collected data. Check each candidate's own underlying source for freshness (the specific lesson's `seen` date, the specific commit referenced) — not just whether the handoff file as a whole is old:

- Handoff "what to do now" → candidate as-is, but verify the specific file/commit it references is still current
- Uncommitted files → "commit + push" or "needs verification"
- PENDING blocker trigger satisfied → "resolve blocker"
- Stale lesson → "re-apply/verify lesson"
- git log pattern → "continue ongoing work" or "pivot direction"

### Step 3: Sort by Impact

Narrow candidates to 3. Sort criteria:

1. **Urgency** — resolve blocker > verify uncommitted > handoff item
2. **Dependency** — prerequisites for other work take priority
3. **Timeliness** — time-sensitive items (data collection after market close, pre-deploy verification, etc.)

### Step 4: Output

```
## Next Actions

1. **[action]** — [1-line rationale. State which source it came from]
2. **[action]** — [rationale]
3. **[action]** — [rationale]

Tell me the number and I'll start that work in the next message.
```

Output then stop immediately — this skill's own execution ends here (Invariant 1). If the user picks a number, the *main session* starts that work on the next turn; this skill does not continue and execute it itself.

---

## Scope Boundary

| Does | Does NOT |
|------|----------|
| [READ] Read handoff/git/lessons/STATE | Execute the proposed action directly |
| [READ] Propose top-3 actions by impact | Modify code or create files |
| [READ] State the evidence source for each proposal | Start work without user confirmation |

## Invariants (never violate)

1. **Proposal only, never execute**: recommend an action but never start it directly. Only proceed once the user picks. Violation → work executed without user intent.
2. **Evidence-based proposals**: derive candidates only from git status/Glob/Read results. Never guess "this is probably needed". Violation → phantom proposals for nonexistent files/issues.
3. **3-item cap**: even with 10 candidates, narrow to 3. Prevents choice overload. Violation → user can't choose and defaults to "just handle it yourself".
4. **10-line cap**: output exceeding 10 lines is over-explaining. Violation → no longer distinguishable from stepback.

## Error Recovery

| Failure Type | Recovery |
|---------|--------|
| `tool_failure` | Skip the source that failed to read, propose from the rest (note: partial_read) |
| `missing_data` | If both handoff and STATE are absent, propose from git status alone (note: minimal_mode) |

## Rationalization Table

| Rationalization | Rebuttal |
|--------|------|
| "5 recommendations would be more useful" | Beyond 3 is choice overload. 3 is the optimal number for action conversion (note: cap_violation) |
| "Just executing right away is faster" | Violates Invariant 1. Proposal and execution are different skills' jobs (note: scope_creep) |
| "Handoff alone is enough, why check git too?" | Handoff is a past snapshot. Current git status is the real state (note: stale_source) |

## Truthful Reporting

1. **no mock deception**: never conclude "nothing to do" without actually reading files.
2. **no silent brokenness**: if a source fails to read, state `⚠️ failed to read [source name]` explicitly.

## Principles

- **Current state is truth** — the filesystem is authoritative, not memory
- **Proposal is light, execution is heavy** — this skill stays on the light side
