How to decompose a milestone into tasks with dependencies. This process applies to any workplan in vtaskforge.
Write a single sentence describing what "done" looks like for the milestone. If you can't say it in one sentence, the milestone is too big — split it.
Example (Milestone 0):
A Django project skeleton that boots in Docker, responds to a health endpoint, and has Celery connected.
List the concrete outputs the milestone must produce. These become your completion checklist — the strict criteria that must ALL be met before the milestone is declared complete.
Group them by category (infrastructure, API, testing, docs, etc.) for clarity.
Example (Milestone 0):
- Infrastructure: 5 Docker services boot, healthchecks pass, hot reload works
- API: health endpoint responds, admin accessible, JSON error responses
- Testing: pytest passes, smoke tests cover critical paths
- Documentation: CLAUDE.md with dev commands
Break deliverables into tasks. Each task should be:
| Property | Rule |
|---|---|
| Independent | Can be worked on without knowledge of other tasks' implementation details |
| Small | Completable in a single session (1-3 hours for an agent) |
| Testable | Has clear acceptance criteria that can be verified |
| Context-complete | Description + acceptance criteria are enough for a cold handoff |
How to find task boundaries:
- Start with the final deliverable and work backwards — what must exist before this can work?
- Each "must exist before" relationship is a dependency
- If a task touches multiple unrelated systems (e.g., database AND frontend), split it
- If two tasks always change together, merge them
Every task needs acceptance criteria — the specific conditions that prove the task is done. Write them as verifiable statements:
Good:
docker compose configvalidates without errorsGET /v1/healthreturns200with{"db": "ok", "redis": "ok"}pytestpasses with 4 tests, zero failures
Bad:
- "Docker works" (too vague)
- "Health endpoint is implemented" (not verifiable)
- "Tests are written" (doesn't say they pass)
For each task, ask: "What must be DONE before this task can START?"
Rules:
- Only add direct dependencies. If A→B→C, task C depends on B, not A (transitivity is implied)
- No circular dependencies
- Fewer dependencies = more parallelism = faster execution
- If a task has no dependencies, it can start immediately
Draw the DAG:
0.1 → 0.2 → 0.3 → 0.4 → 0.5 ──┬── 0.6
├── 0.7 ──┐
├── 0.8 ──┼── 0.10 ── 0.11
└── 0.9 │
Look for parallelism — tasks at the same level with different dependencies can execute simultaneously. In the example above, 0.6, 0.7, 0.8, and 0.9 can all run in parallel after 0.5.
Before finalizing, check:
- Coverage: Do the tasks, when all completed, satisfy every item in the completion checklist?
- No orphans: Every deliverable in the checklist maps to at least one task
- No hidden work: Are there setup steps, configurations, or decisions not captured in any task?
- Cold handoff test: Could an agent pick up any single task with only its description, acceptance criteria, and linked context — and complete it without asking questions?
- DAG is correct: No circular dependencies, no missing edges, parallelism is real (parallel tasks don't actually share state)
Use this structure for each task:
#### Task X.Y: <Short title>
<1-3 sentence description of what to do>
- **Acceptance criteria:**
- <Verifiable condition 1>
- <Verifiable condition 2>
- **Depends on:** <task IDs, or "nothing">
- **Files:** <key files to create or modify>
- **Context:** <links to design docs, KB areas, or reference material>
The Files and Context fields map directly to vtaskforge's link system (file and doc/area link types).
See milestones/milestone0/MILESTONE.md for the full breakdown of Milestone 0 into 11 tasks with a dependency DAG. This was the first application of this process.
Summary:
- 11 tasks decomposed from the milestone goal
- Linear chain for foundational work (scaffolding → requirements → Dockerfile → compose → Django)
- 4-way parallel once the foundation is ready (mixins, health endpoint, celery, app stubs)
- Convergence for testing (needs health + celery done first)
- Documentation last (needs everything working to document accurately)
| Anti-pattern | Problem | Fix |
|---|---|---|
| Mega-task | "Set up the entire backend" | Split by concern: DB, API, auth, etc. |
| Micro-task | "Create __init__.py" |
Merge with related work |
| Vague criteria | "It should work" | Specify exact commands and expected output |
| False parallelism | Tasks marked parallel but actually share files | Add the missing dependency edge |
| Missing dependency | Task assumes something exists but doesn't declare it | Walk through "what must exist before I start?" |
| Circular dependency | A needs B, B needs A | One of them is wrong — find the true order |
| Gold plating | Task adds extra features beyond the milestone goal | Cut scope to match the milestone goal exactly |