Skill: tasks
SkillProductivityUse to break a designed feature into atomic, ≤1-day tasks with a dependency graph, a per-task Definition of Done, and a machine-readable tasks.json that the implement engine consumes. Triggers on "task breakdown for {slug}", "break down tasks for {slug}", "tasks for {slug}", "plan the work for {slug}", "/sdd:tasks {slug}", "розбий на задачі {slug}", "декомпозиція {slug}", "список задач". Reads spec.md + sad.md + Accepted ADRs (+ data-model + openapi if present), writes docs/features/{slug}/tasks/{_epic,tracker,<task>}.md AND docs/features/{slug}/tasks.json. Tracker export to any issue tracker is optional and tool-neutral. Hard-refuses if spec.md or sad.md or an Accepted ADR is missing.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Skill: tasks skill
What this skill tells your AI
The instructions your AI receives, as published by genkovich/sdd in skills/tasks/SKILL.md and read by ahel’s review.
Task-breakdown generator: atomic tasks ≤1 day, each a separately reviewable change (≤~500 LOC preferred), with a visible dependency graph and a Definition of Done per task. One task = one focused session = one PR. "Build the feature" is not a task — break it down.
Task files link to upstream artifacts (spec.md §AC-N, sad.md §6, data-model.md, contracts/openapi.yaml, adr/NNNN-*.md) — they do not duplicate them. Alongside the human-facing markdown, this skill emits tasks.json, the contract the implement engine reads to build its dependency DAG.
Task prose (title / dod, the markdown bodies) follows artifact_language — the tasks.json machine fields (id, layer, deps, acs, files_hint, slug) and tracker states stay English → ../_shared/artifact-language.md.
Owner
Tech Lead.
Inputs
<slug>— feature slug.- Gate (hard refuse):
docs/features/<slug>/spec.md+docs/features/<slug>/sad.md+ ≥1 Accepted ADR inadr/. Missing → STOP and point at the producing skill (specify/design/decide-adr). - Read directly (not via an index): spec §5 AC + §6 NFR, sad §5 module boundaries + §6 runtime + §9 ADR index, each Accepted ADR, and — if present —
data-model.md,contracts/openapi.yamlandscreens.md(the screen manifestuitasks cite). - (Expected)
sad.mdfrontmattertarget_surfaces— gates which layers appear (step 4). Absent or empty → warn («surfaces undeclared — re-rundesign, or proceeding asbackend-service») and treat as[backend-service](→../_shared/surfaces.md); never silently emituitasks for an undeclared surface.
Protocol
- Prereq check (hard). spec.md + sad.md + ≥1 Accepted ADR, else refuse with the missing one named.
- Read upstream directly. Each task will link back to the section it derives from — no paraphrase layer.
- Scaffold output.
docs/features/<slug>/tasks/:_epic.md(summary + links + the DAGflowchart),tracker.md(status table), one<task-slug>.mdper task. Templates →./templates/_epic.md,./templates/tracker.md,./templates/task.md. Validate the_epic.mdflowchartper../_shared/mermaid-check.md(render-parse withmmdcif available, else the structural lint; fix before committing). - Identify work-items by layer. Generic, stack-agnostic layers:
migration(DB) ·domain(entities/invariants) ·infra(repo/persistence) ·app(service/use-case) ·ports(handler/API) ·ui(UI components / screens / view-state — only when a UI surface is declared) ·tests·wiring(composition/DI) ·docs.sad.mdfrontmattertarget_surfacesgates which layers appear (→../_shared/surfaces.md): aweb-frontend/mobile-app/desktop-appsurface addsuitasks; a backend-only feature emits domain/infra/app/ports (noui); aclifeature app/ports; aworkerdomain/infra. Eachuitask names the existing components / tokens / styling it reuses (fromarchitecture-map.md§Frontend and thedocs/design-system.mdinventory) — a new component is listed only when no existing primitive fits — and, whendocs/features/<slug>/screens.mdexists, cites theSCR-NNid(s) + the states it builds (the manifest is the task's screen contract;implementbuilds to those states). List 8–20 items by size (see../_shared/size-matrix.md). - Atomic check. Each task ≤1 working day. More → split. A change >~500 LOC is a smell that the task is too wide. Contract-task rule: a task whose content is changing a shared interface/type that existing implementations must satisfy in a statically-checked language (Go, TS, Java, …) is not emitted standalone — it cannot be committed green on its own (the compile-time check breaks every implementer). Fold it into the first implementing task. If a split is still warranted (several implementers), mark the pair a compile-coupled lane: both tasks list the contract file in
files_hint(reusing the existing overlap-lane mechanics — notasks.jsonschema change), soimplementserializes them and may close them with one shared gate + commit. - Dependency graph. For each task,
deps: [...]. Identify parallel branches (e.g. the migration and a pure-domain task can start together). This graph IS the DAGimplementwill topologically sort into phases. - Per-task DoD. Each task is testable: «unit tests for the new validation pass», «migration applies and reverts cleanly», «handler returns the spec'd outcome for AC-03». No subjective «done when I say so».
- AC refs + files hint. Each task lists the
acsit satisfies (spec §5 IDs) and afiles_hint— the directories/files it will touch.files_hintletsimplementserialize tasks whose file sets overlap, andlayer: migrationis always serialized (ordered migration sequence); a compile-coupled pair (step 5) shares the contract file across bothfiles_hints for the same reason;layer: uiis not auto-serialized — UI tasks parallelize unless theirfiles_hintoverlaps. A migration task'sfiles_hintis the staged pairdocs/features/<slug>/migrations/<NN>_*(whichimplementpromotes into the livemigrations/when it runs the task) — not a livemigrations/path. - Estimate + owner. S/M/L or hours; a named owner (or
<TBD lead>). Adapt to the team's sizing if any. - Emit
tasks.json(step contract below) — the same model the markdown reflects, in machine form, atdocs/features/<slug>/tasks.json. - Optional tracker export. If an issue-tracker MCP is connected (Jira / Linear / GitHub Issues / Redmine — whichever the repo uses), offer to create tickets from
_epic.md+ the task files. Otherwise provide copy-paste-ready bodies. Never hard-bind to one tracker. - Self-check. Every task ≤1 day; DAG acyclic with ≥1 parallel branch where the work allows; DoD per task;
acscover every spec §5 AC;tasks.jsonvalidates against the contract. - Propose commit + handoff.
tasks: <slug> (breakdown + tasks.json). Then emit the stage-handoff block per../_shared/handoff.md— What I did + Review (tasks/,tasks.json) + Run next — resolve the next stage per.route(the Routes table in../_shared/size-matrix.md): forward/sdd:plan-tests <slug>(onquickit always collapses to the inline## Test planinspec.md), then/sdd:implement <slug>;plan-tests' N/A condition = every task's DoD already names its test — only then skip target/sdd:implement <slug>directly (auto-skip onquick, offered↳ oronstandard, never onfull).
tasks.json contract (read by implement)
{
"slug": "<slug>",
"tasks": [
{
"id": "T1",
"title": "imperative, specific",
"layer": "migration|domain|infra|app|ports|ui|tests|wiring|docs",
"deps": ["T0"],
"acs": ["AC-01", "AC-02"],
"dod": "one testable sentence",
"files_hint": ["path/or/dir/the/task/touches"]
}
]
}
- The markdown task files and
tasks.jsonuse the same field names (deps,acs) — this skill emits both from one model, so there's no translation layer to drift. depsmust form a DAG (no cycles) and reference only ids present in the file.layer: migrationtasks are serialized byimplement(ordered migration sequence);layer: uiis not auto-serialized (UI tasks parallelize); tasks with overlappingfiles_hintare serialized into the same lane regardless of layer — a compile-coupled pair (step 5) rides this same mechanism via the shared contract file, andimplementmay commit the pair together (one gate, bothSDD-Tasktrailers).- Which layers are present is gated by
sad.mdfrontmattertarget_surfaces(a UI surface addsui; a backend-only feature has none) →../_shared/surfaces.md.
Definition of Done
tasks/_epic.md+tasks/tracker.md+ onetasks/<task>.mdper task exist, linking (not duplicating) upstream.tasks.jsonexists and validates: acyclicdeps, everyacsentry is a real spec §5 AC, every task has adodand afiles_hint.- Every task ≤1 day with an owner; the DAG shows ≥1 parallel branch where the work allows.
- Every spec §5 AC is covered by ≥1 task's
acs. - The step-12 check (atomicity, acyclic DAG, per-task DoD, AC coverage,
tasks.jsoncontract) is this skill's structural self-check (../_shared/self-check.md); its result is reported in the handoff.
Anti-patterns
- «Build the feature» as one task. Break into ≥8 atomic ones.
- 5-day monster tasks → unreviewable. Split.
- No dependencies → parallel starts that block each other the next day.
- No per-task DoD → «done when I decide».
- No owner → nobody starts, or everyone assumes the other will.
- Hard-binding to one tracker (Jira-only language). Export is optional and tool-neutral.
- Task body duplicates spec AC / sad §6 / data-model verbatim — link, don't paste.
tasks.jsonout of sync with the markdown — they must reflect the same model.- A task that violates a Hard Rule from spec §6 / sad §11 (e.g. «edit another module» when the architecture forbids it).
References & template
./templates/_epic.md·./templates/tracker.md·./templates/task.md../_shared/size-matrix.md— how many tasks for the feature size.../_shared/surfaces.md—target_surfaces(read fromsad.md) gates which layers appear; a UI surface adds theuilayer (not auto-serialized).
Signals
- GitHub stars
- 140
- Forks
- 51
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
tasks-genkovich- Source
- github.com/genkovich/sdd