Skill: sdlc
Pure orchestrator. Takes a free-form request and drives it through spec → plan → implementation → done by composing other skills and agents. This skill is a workflow descriptor: every step delegates to a skill or an agent. No business logic lives here.
Iron rule
You are the conductor, not a player.
You never write code. You never run tests. You never commit. You never load a skill into your own context.
Every action — including invoking another skill — is delegated to a sub-agent that runs in a fresh context. You only ever read structured outputs (YAML) returned by sub-agents. You never read the contents of files produced (spec.md, plan.md, source code) — those belong to the agents that wrote them.
If you find yourself about to use the Skill, Write, Edit, Bash tool yourself for anything other than reading a sub-agent output or routing it to the next phase, you have violated the protocol. Stop and re-delegate.
Skill invocation protocol
You never call Skill(...) directly. Every skill invocation is wrapped in an Agent spawn:
Spawn the Agent tool with
subagent_type: general-purpose.Prompt template:
Invoke skill `<skill-id>` with these inputs: <yaml inputs> Run the skill in your fresh context. When done, return ONLY the structured output described by the skill's frontmatter, in YAML, with no surrounding prose. Do not include the file contents you produced.Parse the agent's YAML response. Use the values, not the produced content.
This applies to: aidd-pm:05:spec, aidd-vcs:01:commit, aidd-vcs:02:pull-request. Skills used by planner, implementer, or reviewer are loaded inside those agents' own contexts — that already satisfies the rule.
When to use
- A human invokes
/sdlc <request>to start a new run from a free-form description - A Gardener (async) decides a new run is needed and invokes this skill
- A previous run was paused and needs to be resumed with refined input
When NOT to use
- A spec already exists and is validated → invoke the
planneragent directly - A milestone implementation is needed in isolation → invoke the
implementeragent directly - A standalone review is needed → invoke the
revieweragent directly - A human just wants a draft spec without execution → invoke
aidd-pm:05:specdirectly
Inputs
At least one of request or prd_path is required. If both are provided, prd_path wins and the request becomes additional context.
request: <free-form human description of what to build, optional>
prd_path: <path to an existing PRD file, optional>
working_dir: <optional — defaults to current working directory>
options:
quality_threshold: <0-100, default 90>
retry_cap_per_step: <n, default 3>
open_pr: <true | false, default false>
Commits are always produced — at every phase boundary and at every ticked checkbox during implementation. There is no auto_commit: false mode. The audit trail is mandatory.
Outputs
status: done | blocked | aborted
spec_path: <path to validated spec>
plan_summary: <count of milestones, count of decisions made/blocked>
commits:
spec_validated: <sha>
plan_validated: <sha>
per_milestone: [<sha>, ...]
final: <sha if status=done>
pr_url: <if open_pr and status=done>
duration: <hh:mm>
notes: <relevant observations>
Orchestration
Four phases. Each phase delegates. Defaults below are overridable per invocation via options.
Phase 1 — Spec generation and validation
- Spawn a sub-agent (per Skill invocation protocol) to invoke
aidd-pm:05:specwith inputs{request, prd_path, working_dir}. The agent loads the skill in its fresh context, writes the draft spec atworking_dir/spec.md, and returns{spec_path, status, notes}. You never load the skill yourself; you only read the YAML output. - Spawn
revieweragent (Agent tool,subagent_type: reviewer) with:- artifact: the draft spec at the returned
spec_path - validator:
{{TOOLS}}/plugins/aidd-pm/skills/05-spec/assets/spec-validator.yml(filesystem path, resolved by Claude Code)
- artifact: the draft spec at the returned
- Read the reviewer's output:
completion_score = 100andquality_score >= quality_threshold→ proceed to step 4quality_score < quality_threshold→ re-spawn the spec sub-agent withexisting_specandfindings, retry- Beyond
retry_cap_per_stepretries → escalate to human, return withstatus: blocked
- Commit the validated spec. Spawn a sub-agent (per Skill invocation protocol) to invoke
aidd-vcs:01:commitwith{mode: auto, message: "spec: <feature-name> validated", files: [<spec_path>], push: false}. Record the returnedcommit_shaincommits.spec_validated.
Phase 2 — Planning
- Spawn
planneragent with the validated spec. - The planner uses
aidd-dev:01:planinternally. The skill writes toaidd_docs/tasks/<yyyy_mm>/...md(simple plan) or to*-master.mdplus one*-part-N.mdper child plan (master plan). The planner returnsplan_pathandchild_pathsin its output — use those, never assume a hardcoded path. - Read the planner's output:
plan_pathempty → planner failed to produce a plan, retry once then escalatedecisions_blockednon-empty → ask the human, get answers, re-spawn the planner with the answers as inputplan_status: blocked→ escalate, return withstatus: blocked- Beyond
retry_cap_per_stepretries → escalate to human
- Commit the validated plan. Spawn a sub-agent (per Skill invocation protocol) to invoke
aidd-vcs:01:commitwith{mode: auto, message: "plan: <feature-name> validated", files: [<plan_path>, ...child_paths], push: false}. Record the returnedcommit_shaincommits.plan_validated.
The plan does not require a separate validator pass at this stage. The planner's structural output is used as-is. A plan validator may be added later if the run pattern reveals gaps.
Phase 3 — Implementation
- Hand the validated plan back to the
plannerfor execution. Passplan_pathand anychild_pathsfrom Phase 2 — the planner reads them to drive the loop. The planner now drives the milestone-by-milestone loop in its own context:- Simple plan (
child_pathsempty): oneplan_path, milestones live inside it. - Master plan (
child_pathsnon-empty): the master enumerates child plans; the planner sequences them, processing milestones from each child in order. - For each milestone, the planner spawns
implementer(fresh) and thenreviewer(fresh, with the milestone's acceptance criteria as validator). - The planner re-spawns until quality passes its threshold or it escalates.
- The implementer commits atomically per ticked acceptance criterion checkbox (one criterion = one commit, message:
<milestone-id>/<step>: <description>). Tasks under each phase guide HOW to implement; acceptance criteria are the verified states that trigger commits. This produces the per-milestone commit trail recorded incommits.per_milestone.
- Simple plan (
- The planner returns when
plan_status: doneorplan_status: blocked. - If
blocked→ escalate to human. The human may refine the spec and the run can resume from Phase 1, or abort.
Phase 4 — Finalize
- Write the run summary. Spawn a sub-agent (Agent tool,
subagent_type: general-purpose) and instruct it to writeworking_dir/summary.mdwith the decisions, milestones, final state, and commit shas you tracked. The agent does the writing; you don't. It returns{summary_path}. - Final commit. Spawn a sub-agent (per Skill invocation protocol) to invoke
aidd-vcs:01:commitwith{mode: auto, message: "feat: <feature-name> complete", files: [<summary_path>], push: <open_pr>}(push only if a PR is requested). Record the returnedcommit_shaincommits.final. - If
open_pr: true→ spawn a sub-agent (per Skill invocation protocol) to invokeaidd-vcs:02:pull-request. Record the returned URL inpr_url. - Return the structured output.
Skills and agents this skill uses
- Skills:
aidd-pm:05:spec,aidd-dev:01:plan,aidd-vcs:01:commit,aidd-vcs:02:pull-request - Agents:
planner,reviewer
The implementer agent is spawned by the planner during Phase 3, not by this skill directly.
Quality threshold and retry caps
Both are overridable per invocation via options. Defaults (quality 90, cap 3) are a balanced setup for general-purpose runs. Tighten for production-critical work, loosen for prototypes.
Escalation protocol
When a step exceeds retry_cap_per_step:
- Stop the run.
- Surface the blocker, the latest output, and the suspected cause to the human.
- Wait for human input or human-driven restart. Don't silently continue.