Skill: scaffold
SkillProductivityUse to materialize the greenfield skeleton that survey's foundation session planned. Reads docs/architecture-map.md (mode: greenfield-bootstrap) plus docs/features/_scaffold/tasks.json and builds the real project structure: folders + entry point, test harness + smoke test, migration tooling, CI, the conventions doc. Triggers on "scaffold the skeleton", "materialize the skeleton", "bootstrap the project skeleton", "/sdd:scaffold", "матеріалізуй скелет", "розгорни скелет проєкту", "збудуй каркас". Runs the S-tasks sequentially inline (no team/workflow orchestration), anchored on the skeleton smoke test — builds + boots + empty test suite runs + migration tool runs — commits, and hands off to /sdd:specify. Hard-refuses without the greenfield foundation: run survey first.
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: scaffold skill
What this skill tells your AI
The instructions your AI receives, as published by genkovich/sdd in skills/scaffold/SKILL.md and read by ahel’s review.
The materialization step between survey's greenfield foundation and the first feature. survey
fixes the foundation (stack / structure / conventions in docs/architecture-map.md, marked
mode: greenfield-bootstrap) and emits the scaffold plan (docs/features/_scaffold/tasks.json,
tasks S1–S5 per ../survey/references/foundation.md);
scaffold turns that plan into a repo that builds, boots, tests and migrates — then the normal
per-feature flow (specify → … → implement) builds into it. This skill exists so the greenfield
handoff is a real gate, not a wave of the hand: _scaffold is not a feature (no .size, no
.route, no ACs), so it never enters implement's engine or its team/workflow decision tree.
The skeleton smoke test is the TDD anchor (canonical here). Scaffold tasks have no feature ACs, so red→green anchors on the structural smoke test: RED = the project does not build / boot / the tooling doesn't run; GREEN = build + boot + the empty test suite + the migration tool all succeed. That keeps the discipline meaningful for structural work — no per-folder TDD theatre.
Owner
Architect / Tech Lead — the same person who fixed the foundation in survey.
Inputs
docs/architecture-map.mdwithmode: greenfield-bootstrap— the decided stack, module structure, conventions, and the machine keys (build_cmd,test_cmd,lint_cmd,migration_tool,frontend).docs/features/_scaffold/tasks.json— the S1–S5 scaffold plan (layer: scaffold,slug: "_scaffold").
Protocol
- Hard gate. Both inputs must exist:
docs/architecture-map.mdwhose frontmatter saysmode: greenfield-bootstrap, ANDdocs/features/_scaffold/tasks.jsonparsing as the scaffold contract (slug: "_scaffold",layer: scaffoldtasks withid/title/deps/dod/files_hint). Either missing → refuse: «runsurveyfirst — its greenfield session fixes the foundation and emits the scaffold plan». A map without the greenfield marker means the repo is already real — refuse too and point at/sdd:specify <slug>. If the skeleton already exists (every S-task's output present and the smoke test green), say so and STOP — nothing to materialize. - Read the foundation. From the map: stack, folder/module structure, conventions catalog, the
machine keys. From
tasks.json: the S-tasks in dependency order. The map is the only source of decisions — scaffold never re-litigates stack/style choices (that wassurvey's session). - Materialize sequentially inline. Execute the S-tasks one by one in dependency order, in this
session — deliberately no agent team, no Workflow, no
implementdecision tree:_scaffoldhas no.size/.route, and five structural tasks need no orchestration. Per task: create the files itsfiles_hintnames, to the map's conventions; verify itsdod; record it done. A task that genuinely doesn't apply (e.g. no datastore → the migration task) is explicitly dropped with a stated reason — never silently skipped. - Drive the smoke test green. Write the smoke test as part of the harness task, then run the full anchor with the map's machine-key commands: build + boot + the empty test suite + the migration tool (apply + revert). Iterate until GREEN — a red skeleton is not done.
- Reconcile the map's machine keys. If the commands that actually worked differ from the map's
frontmatter (
build_cmd/test_cmd/lint_cmd/migration_tool), update the map —implement's command-detection cascade reads these keys; stale keys poison every later feature. - Commit —
scaffold: materialize skeleton. - Structural self-check — per
../_shared/self-check.md: verify 4 items: (1) the smoke test was actually executed and is green (build + boot + empty suite + migration tool — command output in hand, not assumed); (2) every S-task is done or explicitly dropped with a reason; (3) the map's machine keys match the commands that just ran (updated if they diverged); (4) the commit contains the skeleton files. Fix + re-check ≤2 cycles; surface anything unresolved. - Handoff. Emit the stage-handoff block per
../_shared/handoff.md— What I did (tasks materialized, smoke-test result, «self-check: 4/4 pass») + Review before continuing (the committed skeleton diff +docs/architecture-map.md) + Run next:/clear, then/sdd:specify <slug>— the first real feature, with a real repo to build into.
Definition of Done
- Every S-task from
docs/features/_scaffold/tasks.jsonis materialized (or explicitly dropped with a reason), to the conventions the map fixes. - The skeleton smoke test is green: the project builds, boots, the empty test suite runs, the migration tool applies + reverts.
- The map's machine keys reflect the commands that actually work; the skeleton is committed.
Anti-patterns
- Orchestrating five structural tasks. No team mode, no Workflow, no DAG engine —
_scaffoldis repo-level bootstrap, not a feature; sequential inline is the design, not a fallback. - Per-folder TDD theatre. The smoke test is the one anchor; writing a failing test per directory is ceremony without information.
- Re-deciding the foundation. Stack/structure/convention choices live in the map + its ADRs
(
survey's session); scaffold materializes, it never re-litigates. A gap in the map goes back tosurvey, not into an improvised decision here. - Handing off red. «Skeleton written but doesn't boot» is not done — GREEN is the exit condition.
- Treating
_scaffoldas a feature. No.size/.route, no spec, no ACs — it never enters the per-feature pipeline or its size/route machinery.
Signals
- GitHub stars
- 140
- Forks
- 51
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
scaffold-genkovich- Source
- github.com/genkovich/sdd