skills/tt-create-plan/SKILL.md
Tasktracker-native implementation planning. Turns a frozen brainstorm (or a clear requirement) into a phased plan persisted as tasktracker phase tasks — NOT as a docs/plans/*.md file. Creates requirements with formal acceptance criteria, registers architecture components, generates phases via createPhaseFromTemplate (backend-feature / ui-fix / refactor / schema-migration / bug-investigation / docs-only / data-housekeeping), links every task back to its requirement, and uses getProjectReadiness as the completion gate. Use whenever the user wants to plan, design, or scope an implementation AND the work is (or will be) tracked in tasktracker. Triggers on "tt create plan", "tt plan", "plan this in tasktracker", "create a plan (tasktracker)", "/tt-create-plan", or any plan-creation request inside a session that already has a tasktracker active task or project. Prefer this over the plain /create-plan skill whenever a tasktracker MCP is available — the resulting phase tasks integrate with /tt-implement-plan and /implement-phase, so picking the file-based variant in a tasktracker project just creates orphan markdown.
npx skillsauth add mhylle/claude-skills-collection tt-create-planInstall 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.
Tasktracker-native implementation planning. Walks the four lifecycle stages (brainstorm → requirements → architecture → plan) and lands the plan as phase tasks in tasktracker, with each task linked to the requirement it implements and architecture components registered for the structural pieces. No docs/plans/*.md file is written — the plan is the task tree.
| | /create-plan | /tt-create-plan (this skill) |
|---|---|---|
| Output | docs/plans/YYYY-MM-DD-*.md file + Tasks | Phase tasks in tasktracker (no file) |
| Requirements | Free text under "Context" | First-class Requirement rows with AcceptanceCriterion |
| Architecture | Implicit, narrative | ArchitectureComponent + ArchitectureRelationship rows |
| Phase scaffolding | Hand-written checklists | createPhaseFromTemplate with rituals embedded |
| Phase body | Editable markdown | Locked once children exist (immutable scope contract) |
| Progress gate | TaskList | getProjectReadiness per lifecycle stage |
| Plan/spec separation | "checkboxes in markdown" | Spec on phase task, progress on sub-tasks |
If the user is not using tasktracker, use /create-plan instead.
1. tasktracker_listProjects({search: "<topic-keywords>"})
- Use the user's words. The most common failure mode is creating a
duplicate project because you couldn't find the existing one.
- If the user already had a /tt-brainstorm session, the project from
that session is the one to use.
2. tasktracker_getProjectReadiness({projectId})
- This 4-row table is the ground truth for "what stage are we in".
- If `brainstorm` is in-progress or not started, STOP and tell the
user — they probably want /tt-brainstorm first. Don't paper over
a missing brainstorm; the requirements end up shaky.
3. tasktracker_getPrinciples({projectId, includeGlobal: true})
- Surface conflicts before design, not after.
4. Find the first non-satisfied lifecycle phase task and
tasktracker_setActiveTask(<that-task-id>).
For a typical create-plan flow, this is the requirements-lifecycle
phase. setActiveTask folds principles + acceptance criteria + the
hierarchical requirement link into the digest you'll work from.
If getProjectReadiness shows brainstorm: satisfied, you can proceed. If it shows brainstorm: skipped-deliberately, also fine — skip to Step 2.
tasktracker_listBrainstorms({projectId})
# Pick the frozen brainstorm for this work.
tasktracker_getBrainstorm({brainstormId})
Read the whole tree — master doc, capability/iteration/mvp sub-docs, and every BrainstormDecision. Each chosen decision is a candidate requirement; each deferred decision is a candidate later-iteration requirement; each rejected decision is context (why we didn't go that way) but not a requirement.
If the user prefers, a faster path is tasktracker_promoteBrainstorm from inside the brainstorm session — but for /tt-create-plan you usually want to be more selective than 1:1 promotion. Read and curate.
For each capability the user wants in scope:
tasktracker_createRequirement({
projectId,
title: "<short verb-phrase title>",
description: "<who needs this and why; reference the brainstorm
document/decision by id where applicable>",
priority: "low" | "medium" | "high" | "urgent"
})
# Capture the returned requirementId.
# Add acceptance criteria — at least one per requirement. Use
# Given/When/Then form. Each criterion is independently verifiable.
tasktracker_addAcceptanceCriterion({
requirementId,
statement: "Given <context>, when <action>, then <observable outcome>"
})
Lifecycle gate: the requirements row in readiness flips to satisfied only when at least one requirement has criteria AND is past draft. Status defaults to draft; usually leave it there and let the lifecycle trigger promote it on approval.
Prefer /user-story for non-trivial requirement decomposition. It generates an epic → feature → task hierarchy with Given/When/Then criteria already in formal shape, and writes through these same MCP calls.
Update the requirements-lifecycle phase task to completed when satisfied, then activate the architecture-lifecycle phase task.
Implementation will touch things. Register them.
# One call per component (service, module, table, page, agent, etc.)
tasktracker_createArchitectureComponent({
projectId,
name: "<canonical name>",
kind: "service" | "module" | "table" | "page" | "agent" | ...,
description: "<what this component does>"
})
# One call per directed relationship (depends-on, calls, writes-to, etc.)
tasktracker_createArchitectureRelationship({
projectId,
sourceComponentId,
targetComponentId,
kind: "<edge type>",
description: "<one-line>"
})
# Optional but recommended for non-trivial systems:
tasktracker_createArchitectureDiagram({
projectId,
name: "<title>",
body: "<mermaid or plain text>"
})
Lifecycle gate: the architecture row flips to satisfied when at least one component exists. Don't over-register — pick the structural pieces the plan will actually create or modify.
When done, complete the architecture-lifecycle phase and activate the plan-lifecycle phase task.
Don't skip this just because tasktracker is in the loop. The MCP doesn't substitute for design thinking.
Option A: [Approach Name]
- Description: [How it works]
- Pros: [Benefits]
- Cons: [Drawbacks]
- Fits pattern: [Reference to existing codebase patterns / components]
Option B: [Alternative Approach]
- ...
Recommendation: [Preferred option with rationale]
Wait for user approval before writing phases.
For any non-trivial design choice, invoke the /adr skill. ADRs live in docs/decisions/ (this is one of the few cases where file output is correct — ADRs are repository artifacts, not project lifecycle state). Cross-reference: add the ADR number into the chosen design option's record on the relevant architecture component or in the phase task description below.
Present the proposed phases as plain text first. The user may want to add/remove/reorder.
Proposed Implementation Phases:
Phase 1: [Name] — [one-line objective] — template: backend-feature
Phase 2: [Name] — ... — template: schema-migration
Phase 3: [Name] — ... — template: ui-fix
...
Phase granularity:
Template selection — createPhaseFromTemplate saves the canonical sub-task triplet for common shapes. Pick the closest fit:
| Template | Sub-tasks seeded | Use when |
|---|---|---|
| backend-feature | Design + decision, Implement, Tests, Deploy verify | Adding/modifying a backend capability |
| ui-fix | Reproduce, Fix, Verify | UI bug or UI tweak with a clear repro |
| refactor | Map current shape, Refactor, Regression verify | Code shape change with no behaviour change |
| schema-migration | Migration, Wire-up, Tests, Deploy verify | DB schema change |
| bug-investigation | Reproduce, Root-cause, Fix, Verify + document | Unknown-cause bug |
| docs-only | Edit, Verify-renders-and-commit | Pure documentation phase |
| data-housekeeping | Survey + snapshot, Operate via MCP (no raw SQL), Verify + log learning | Data migration, archive, merge |
If none of the templates fit, use createTask({type: "phase"}) and add sub-tasks manually — but first ask whether the phase really doesn't fit a template, or whether it's actually two phases bundled together.
Get explicit approval before creating tasks.
For each approved phase:
# Either: template-based (preferred when it fits)
tasktracker_createPhaseFromTemplate({
projectId,
templateKey: "backend-feature",
phaseTitle: "Phase N — <short title>",
contextNote: "<optional: paste the design rationale and ADR link>"
})
# Returns the new phase task. Sub-tasks are pre-created.
# Or: ad-hoc (when no template fits)
tasktracker_createTask({
projectId, type: "phase",
title: "Phase N — <short title>",
description: "<objective + verification approach + ADR ref>",
requirementIds: [<reqId1>, <reqId2>] # ← link at the phase level
})
# Then sub-tasks via createTask({type: "task", parentId: <phase-id>})
# or batchCreateTasks for atomicity.
Linking requirements (Phase 73 contract). Pass requirementIds on the phase task. Sub-tasks under that phase inherit the link automatically — you don't need to repeat it on every leaf. If you create a task without a link and no ancestor has one, an advisory friction insight fires; resolve it by adding the link or by wontfix-ing if the task is genuinely link-less (infra plumbing, etc.).
linkRole — defaults to implements. Use verifies for the testing/verification sub-task explicitly when the template doesn't already encode this.
Every phase's description (set at creation, never edited later — see "Locked phase body" below) MUST include:
See references/exit-conditions.md for per-language templates.
Tests before implementation. When seeding sub-tasks, put the test sub-task BEFORE the implementation sub-task. The default templates already do this in spirit (e.g., backend-feature has "Tests" as a distinct sub-task) but order the sequence so tests are written first.
Once a phase task has any unarchived child, its description is immutable — the backend returns HTTP 422 on update. This is the immutable scope contract set at planning time, and it's deliberate.
| Need | Right place | |---|---| | Original scope and verification approach | Phase task description (write it correctly at creation; you cannot edit later) | | Design rationale, decision logs, follow-up notes during implementation | The "Design + decision note" sub-task (templates seed this) | | Title, priority, due date, metadata changes | Phase task — these fields stay editable | | Discovered scope gap | New sub-task under the phase, OR a follow-up phase |
If you ever find yourself wanting to update a phase body during implementation, that's the mistake the lock catches — pivot to a sub-task.
tasktracker_getProjectReadiness({projectId})
All four rows should now read satisfied (or skipped-deliberately for brainstorm if it was deliberately skipped). The plan row is satisfied when concrete phases exist beyond the four lifecycle phases.
Complete the plan-lifecycle phase task. Do not auto-activate Phase 1 of the implementation — that's /tt-implement-plan's job. clearActiveTask.
Closing summary (in chat, not as a file):
/tt-implement-plan (with no path — it works from the task tree).Every phase MUST have:
Example phase description (paste at creation; cannot edit later):
Objective
- Implement password hashing + login endpoint.
Verification approach
- Unit tests: hash generation, hash comparison, invalid inputs.
- Integration test: POST /auth/login accepts valid creds, rejects invalid.
- Manual: hit endpoint with curl, confirm 200/401 contract.
Exit conditions
Build:
- npm run build succeeds
- npm run lint passes
- npm run typecheck passes
Runtime:
- npm run start starts cleanly
- POST /auth/login reachable
Functional:
- npm test -- auth passes
- Manual curl check passes
Requirements: REQ-0007 (user login), REQ-0008 (password storage)
ADR: ADR-0015 (chose bcrypt over argon2 for v1)
Do not seed phases with "TBD" or open questions in their description. The phase body is locked once children exist — TBDs in there become permanent. Resolve ambiguity before phase creation:
docs/plans/*.md. The plan lives in tasktracker phase tasks.getProjectReadiness — it's the truth source for lifecycle state.listProjects first./init-project was used).getProjectReadiness shows all four rows satisfied.clearActiveTask after the plan-lifecycle phase is marked complete.exit-conditions.md — Per-language exit-condition templates (Node, Python, Go, Rust, Java).lifecycle-cheatsheet.md — Quick reference for which tasktracker tool maps to which lifecycle stage./init-project — Scaffold a tasktracker project if none exists./project-ready — Pretty-print readiness (4-row table). Use as a sanity check./tt-brainstorm — Upstream: refine the idea before planning./user-story — Generate the hierarchical requirement tree (recommended for non-trivial scope)./adr — Record significant design decisions in docs/decisions/./tt-implement-plan — Downstream: execute the plan you just seeded.tools
--- name: tt-workflow-build description: Tasktracker-native trigger for a PARALLEL build via the Claude Code Workflow tool. Thin by design — it does two things, then drives to done: (1) ensure a tasktracker project exists (use the existing one, or create one), then (2) start a dynamic `Workflow` that builds it, tracking the work in tasktracker and using the build + verify skills. It does NOT analyze parallelism up front, ask the user to choose a mode, hand back, or fall back to a sequential skil
tools
--- name: grumpy-reviewer description: A single grumpy, nitpicky structural code reviewer that runs as an isolated subagent and treats the code as third-party work submitted by a junior programmer for validation. It cares about exactly one thing — maintainability — judged through separation of concerns, service-oriented design, helper-method extraction, small files, and the rule of 7 (as any grouping nears 7 members, it pushes for sub-groupings). It is deliberately kept OUT of the implementation
development
--- name: tt-workflow-run description: Tasktracker-native autonomous build-loop orchestrator. Drives a first-class `workflow_run` end-to-end — create the run (Gate 1 lifecycle completeness + Gate 2 zero-defects-in), then loop while `getNextReadyTask(projectId)` returns a slice — `setActiveTask` → record a pre-slice `scanArchitectureDrift` baseline → delegate the slice to `/tt-implement-phase` (which does the code work, registers the architecture delta in-slice, and auto-logs defects/learnings/fr
tools
Tasktracker-native project-wide parallel audit using the Claude Code Workflow tool (dynamic workflows). Partitions a repo / backlog / architecture and fans out read-only agents (one per partition) that return schema-checked findings, aggregates them into a deduplicated, ranked risk register, and OPTIONALLY writes fixes back as tasks under a Bug Fix phase — with all tasktracker writes done by the PARENT, never the parallel agents (single global active-task pointer). Journaled and resumable, so a rate-limit or crash mid-audit resumes without re-running completed partitions. Use for large, embarrassingly-parallel, read/analyze-heavy jobs where each unit is self-contained and the output aggregates — audit every file/component for risk, find all architecture drift (scanArchitectureDrift) or duplicate tasks (detectDuplicates/auditDuplicates), per-file tech-debt sweep, test-coverage or security-surface scan across a whole project. Triggers on "/tt-workflow-audit", "audit the whole repo", "parallel audit", "scan every file/component", "find all drift/duplicates", "tech-debt sweep (tasktracker)", or any whole-project analyze-at-scale request inside a session with a tasktracker project. Prefer this over /codebase-audit or /code-quality-audit when the project is tracked in tasktracker AND you want the findings written back as tasks; prefer it over team-* modes when the units don't need to negotiate live (they just report).