skills/executing-plans/SKILL.md
Use when an epic Task exists and subtasks are ready to implement, when resuming work after a previous checkpoint, when iteratively building a feature, or when implementation has revealed unexpected work that needs a new task. User phrases like "continue the plan", "next task", "resume where we left off", "pick up the epic".
npx skillsauth add joshsymonds/gambit executing-plansInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Execute Tasks one at a time with mandatory human checkpoints. Load epic → Execute ONE task → Present checkpoint → STOP. User reviews, then invokes again to continue.
Core principle: Epic requirements are immutable. Tasks adapt to reality. STOP after each task for human oversight — no exceptions.
Announce at start: "I'm using gambit:executing-plans to implement this task."
LOW FREEDOM — Follow exact process: load epic, execute ONE task, checkpoint, STOP.
Do not skip checkpoints or verification. Epic requirements never change. Tasks adapt to discoveries.
| Step | Action | Critical Rule |
|------|--------|---------------|
| 0. Check State | TaskList | Task state tells you where to resume — never ask |
| 1. Load Epic | TaskGet on epic | Requirements are IMMUTABLE |
| 2. Execute ONE Task | Mark in_progress → follow steps → mark completed | TDD cycle, verify each step |
| 3. Create Next Task | TaskCreate based on learnings | Reflect reality, not original assumptions |
| 4. Commit & Checkpoint | Commit to current branch, present summary | STOP — no exceptions |
Iron Law: One task → Checkpoint → STOP → User reviews → Next task. No batching. No "just one more."
gambit:brainstorming creates the epic and first taskDon't use when:
gambit:brainstorminggambit:debuggingRun TaskList and analyze:
Do NOT ask "where did we leave off?" — Task state tells you exactly where to resume.
Before executing ANY task, read the epic with TaskGet.
Extract and keep in mind:
Why: Requirements prevent rationalizing shortcuts when implementation gets hard.
Find and claim:
TaskList → identify ready task (status="pending", blockedBy=[])TaskUpdate → mark in_progressTaskGet → load full task detailsExecute the steps in the task description:
Task descriptions contain bite-sized steps. For each:
Pre-completion verification (FRESH evidence required):
Mark complete with TaskUpdate only after ALL steps verified with fresh evidence.
CRITICAL: Check epic BEFORE switching approaches.
TaskGet — check "Approaches Considered" and "Anti-patterns"Never water down requirements to "make it easier."
If implementation reveals unexpected work:
TaskCreate — full detail, no placeholdersTaskUpdate addBlockedBy (only on other subtasks — never on the epic, which would deadlock since the epic completes last)After completing a task, create the NEXT task based on what you learned. Tasks are created iteratively as reality unfolds, never all upfront — an upfront task tree goes stale the moment the first task teaches you something.
Review what you learned:
Three cases:
A) Clear next step → Create task with TaskCreate, set dependencies, proceed to checkpoint
B) Planned next task now redundant:
C) Need to adjust approach:
Task quality check:
Two parts: commit any work that isn't already on the branch, then present the checkpoint and STOP.
Before presenting the checkpoint, commit the task's changes to whatever branch is currently checked out — main, a feature branch, a worktree branch, whichever is active. The checkpoint is the agreed "one task done" unit; a commit at this boundary makes each task a durable, reviewable history entry so the user's next action (review, clear context, hand off, walk away) finds the work preserved.
git status to see what's uncommittedgit add -A, which can sweep in accidentally-created filesgit status is clean (intra-task commits during the TDD cycle already captured everything, or the task was marked SKIPPED with no code changes), note it under "Commit" in the checkpoint summaryDo NOT push. Committing is local — the user decides when to push.
Skip the commit ONLY if the user has explicitly said "don't commit yet" earlier in the current session. Absent that directive, commit.
Present this summary, then STOP:
## Checkpoint
### What Was Done
- [Summary of implementation]
- [Key decisions made]
### Commit
- [Short SHA and subject line, e.g. `a1b2c3d feat: add OAuth callback handler`]
- [Or: "Nothing new to commit — intra-task commits during TDD already captured all changes"]
### Learnings
- [Discoveries during implementation]
- [Anything that affects future tasks]
### Task Status
[TaskList output — completed, in-progress, pending]
### Epic Progress
- [X/Y success criteria met]
- [What remains]
### Next Task
- [Title and brief description]
- [Why this is the right next step based on learnings]
### To Continue
Run `/gambit:executing-plans` to execute the next task.
Why STOP is mandatory:
When all subtasks completed:
TaskList — verify all subtasks show "completed"TaskGet on epic — review each success criterionThen invoke review directly using the Skill tool:
Skill skill="gambit:review"
Do not tell the user to run it manually — invoke it and follow its process immediately. Review validates architecture, security, completeness, dead code, test quality, and code quality across the entire epic before allowing finishing-branch.
When blocked, check epic BEFORE switching approaches:
1. Hit obstacle: OAuth library doesn't support PKCE
2. Re-read epic → "Approaches Considered" shows:
"Implicit flow - REJECTED BECAUSE: security risk"
3. PKCE is different from implicit flow → safe to explore
4. Ask user before switching: "Library X doesn't support PKCE.
Should I try library Y, or use a different approach?"
Wrong: "PKCE doesn't work, let me just use implicit flow" (REJECTED approach)
After completing "Set up OAuth config", you discover the framework has built-in session middleware:
TaskCreate
subject: "Integrate with existing session middleware"
description: |
## Goal
Use framework's built-in session middleware instead of custom implementation.
## Implementation
1. Study existing middleware: src/middleware/session.ts:15-40
2. Write test: auth token stored in session correctly
3. Integrate OAuth token storage with existing session
4. Verify: session persists across requests
## Success Criteria
- [ ] OAuth tokens stored via existing session middleware
- [ ] No duplicate session logic
- [ ] Tests passing
activeForm: "Integrating session middleware"
This task wouldn't have been correct if planned upfront — it reflects what you actually found.
Common rationalizations (all mean STOP, follow the process):
| Excuse | Reality | |--------|---------| | "Good context loaded" | STOP anyway — user reviews matter | | "Just one more quick task" | STOP anyway — quick tasks compound | | "User trusts me" | STOP anyway — one invocation ≠ blanket permission | | "This is trivial" | STOP anyway — trivial tasks can have unexpected effects | | "I'll save time by continuing" | STOP anyway — wrong direction wastes more time |
Before completing each task:
TaskUpdate status="completed" only after truly doneAfter completing each task:
TaskGet)git status was clean)/gambit:executing-plans againBefore closing epic:
TaskListgambit:review directly via Skill toolCalled by:
/gambit:executing-plansgambit:brainstorming creates the epic and first taskCalls:
gambit:test-driven-development during implementationgambit:verification before claiming task completegambit:review (invoked directly when all tasks complete — reviews then calls finishing-branch)testing
Use when creating a new skill, modifying an existing skill, writing or rewriting a SKILL.md file, auditing a skill's description for discoverability, or when user mentions "create a skill", "write a skill", "new skill", "modify skill", "improve skill", "edit the skill".
development
Use before any completion claim, success statement, or marking a task done. Triggers when about to say "Great!", "Perfect!", "Done", "All set", "Ready to commit", before creating a PR, before moving to the next task, or when code has changed since the last test run.
data-ai
Use when starting an isolated feature branch, when working on multiple features simultaneously, when experimenting without affecting the main workspace, or when a clean workspace is needed before beginning implementation. User phrases like "start a new branch", "set up a worktree", "isolated workspace", "work on feature X separately".
development
Use at the start of every session before any response or action. Also invoke whenever uncertain which gambit skill applies, when about to implement / debug / refactor / test / plan / brainstorm, or when a user request could match any gambit skill even at 1% probability.