From ttal
Guides full planning process—explore codebase with ttal, design structure, write detailed plan, validate—before any coding. Enforces single-repo scope and task splitting.
npx claudepluginhub tta-lab/ttal-cli --plugin ttalThis skill uses the workspace's default tool permissions.
Plan by understanding reality first, then designing, then writing. Bad plans come from designers who don't read the codebase first.
Plans tasks or features: loads project context including monorepo checks, clarifies requirements, spawns Plan agent, persists validated plans to .groundwork-plans/.
Creates structured TDD implementation plans with task breakdowns, dependencies, and test requirements for new features, multi-file changes, or multi-step tasks.
Creates specs and phased file-level implementation plans for features, bugs, refactors by researching codebase with search, graph queries, and context files.
Share bugs, ideas, or general feedback.
Plan by understanding reality first, then designing, then writing. Bad plans come from designers who don't read the codebase first.
Assume the worker is a skilled developer, but knows almost nothing about our toolset or problem domain. Document everything they need: which files to touch, a clear description of what to do (before/after code for non-obvious changes), build/test commands, commit messages. Give them the whole plan as bite-sized tasks. DRY. YAGNI. TDD. Frequent commits.
Announce at start: "I'm using the planning skill to create the implementation plan."
First action: Run ttal project list to identify the target project before writing anything.
Rule: 1 task → 1 plan → 1 project/repo.
Before writing any plan, you MUST confirm the target project:
ttal project list — see all available projectsttal project get <alias>ttal project get <alias> to confirm the pathHard rule: Do NOT proceed past this gate without a confirmed single target repo.
If a task touches multiple projects/repos, the scope is too big for a single plan. Split it:
task <uuid> modify depends:<other-uuid> so phases execute in order (ttal doesn't expose depends — use taskwarrior directly for this)Depends on — reference the other plan/task in the headerExample: "Add auth to API and update frontend to use it" → split into:
ttal task add --project api "Add auth endpoint" → Plan A (api repo)ttal task add --project frontend "Integrate auth endpoint" → Plan B (frontend repo), depends on Task ABEFORE writing ANY plan, understand what exists. Don't design in the abstract — read the code.
flicknote find <keywords>) and completed tasks (ttal task find <keywords> --completed) for related work.Output: A mental model of the current state. If something surprises you, note it — surprises in Phase 1 prevent disasters in implementation.
After Phase 1, talk through what you found before designing. Don't go silent and start writing — discuss first.
Conversational checkpoint:
⛔ STOP here. End your message after presenting your findings and question. Do not begin Phase 2 or write the orientation doc until the human responds and confirms alignment.
Then, for complex tasks, capture the orientation:
cat <<'ORIENT' | flicknote add --project orientation
# Orientation: [Feature Name]
## What
One sentence: what are we building/changing?
## Why
What problem does this solve? What's the motivation?
## Approach
Which approach are we taking and why? (If you evaluated alternatives in Phase 1, note the decision here.)
## Anti-goals
What is this NOT doing? (Prevents scope creep during implementation.)
ORIENT
Annotate the task: task <uuid> annotate "orientation: <flicknote-hex-id>"
When to skip the orientation doc: Simple bug fixes, mechanical refactors, tasks where what/why is obvious from the description. If the task description already answers what/why/approach, skip the doc. The conversational checkpoint still happens.
When to write the orientation doc: Multi-file features, architecture decisions, anything where a worker might ask 'but why are we doing it this way?'
(Note: the orientation doc writing happens AFTER the conversation confirms the approach — not before.)
With reality understood, now design the solution:
Now write. The default format is a task tree — subtasks under the parent task. Each subtask = one step the worker executes and marks done. Use flicknote for orientation docs (what/why context) alongside the tree when needed.
Every subtask in the plan MUST have:
If a subtask fails this checklist, it's not ready.
When writing a flicknote orientation doc alongside the task tree, start with:
# Plan: [Feature Name]
**Project:** [ttal project alias — e.g. `ttal-cli`]
**Goal:** [One sentence describing what this builds]
**Anti-goals:** [What this plan is NOT doing — or "None"]
**Depends on:** [Other plans/tasks, or "None"]
---
Each ## heading becomes a subtask. Body text becomes the subtask's annotation. Workers see these via task <uuid> tree and mark each done on completion.
## Add validation layer
Add input validation to the API handler. Check required fields, validate types, return 400 on failure.
Files: `internal/api/handler.go` (modify), `internal/api/handler_test.go` (create)
Step 1: Write failing test for missing required fields
Step 2: Implement validation, run tests
Step 3: Commit — `feat(api): add input validation to handler`
## Write integration tests
Integration tests for the full validation flow.
Files: `internal/api/integration_test.go` (create)
Step 1: Write integration test hitting the handler endpoint
Step 2: Run `make test`, verify pass
Step 3: Commit — `test(api): add validation integration tests`
Each subtask is self-contained: files, steps, commit message. The worker executes them in order and marks each done with task <subtask-uuid> done.
Subtasks execute in tree order — arrange them accordingly. For hard ordering constraints, use task <uuid> modify depends:<other-uuid>.
Each step is one action (2-5 minutes):
Before declaring the plan done, check it against reality:
For tasks with <=6 steps or single-file mechanical changes, annotate the task directly:
ttal task add --project <alias> "description" --tag planned
task <uuid> annotate 'Plan: 1. Do X 2. Do Y 3. Do Z'
For multi-step plans, create a subtask tree. The tree IS the plan — each subtask is a step, annotations hold details.
cat <<'PLAN' | task <parent-uuid> plan
## Step 1: Title
Details and context for this step.
## Step 2: Title
Details and context for this step.
PLAN
# View the plan
task <parent-uuid> tree
# Iterate
cat updated.md | task <parent-uuid> plan replace
No separate annotation needed — the subtasks are already under the parent task.
For orientation docs (what/why context): flicknote add --project orientation
task <uuid> annotate 'orientation: flicknote <hex-id>'
Decision rule: If the plan fits in annotations → inline. If it's an ordered set of execution steps → task tree. If you need to capture what/why/trade-offs separately → flicknote orientation alongside a task tree.
Save the plan first:
cat plan.md | task <parent-uuid> planflicknote add --project orientation, then task <uuid> annotate '<hex-id>'Then chain into the completion phase — it handles self-review, open questions, summary, and review handoff with proper output-channel partitioning:
skill get sp-complete-design
Follow every step in that skill. Do not duplicate its logic here.