kind: WavePipeline metadata: name: impl-speckit description: "Specification-driven implementation: specify → clarify → plan → tasks → implement → PR" release: true requires: skills: speckit: check: specify check install: uv tool install --force specify-cli --from git+https://github.com/github/spec-kit.git init: specify init tools: - git - gh input: source: cli example: "add user authentication with JWT tokens" schema: type: string description: "Natural language feature description to specify and implement" steps: - id: specify persona: implementer model: claude-haiku workspace: type: worktree branch: "{{ pipeline_id }}" base: main exec: type: prompt source_path: .wave/prompts/speckit-flow/specify.md output_artifacts: - name: spec-status path: .wave/output/specify-status.json type: json retry: policy: standard max_attempts: 2 handover: contract: type: json_schema source: .wave/output/specify-status.json schema_path: .wave/contracts/specify-status.schema.json must_pass: true on_failure: retry - id: clarify persona: implementer model: claude-haiku dependencies: [specify] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/clarify.md output_artifacts: - name: clarify-status path: .wave/output/clarify-status.json type: json retry: policy: standard max_attempts: 2 handover: contract: type: json_schema source: .wave/output/clarify-status.json schema_path: .wave/contracts/clarify-status.schema.json must_pass: true on_failure: retry - id: plan persona: implementer dependencies: [clarify] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/plan.md output_artifacts: - name: plan-status path: .wave/output/plan-status.json type: json retry: policy: standard max_attempts: 2 handover: contract: type: json_schema source: .wave/output/plan-status.json schema_path: .wave/contracts/plan-status.schema.json must_pass: true on_failure: retry - id: tasks persona: implementer dependencies: [plan] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/tasks.md output_artifacts: - name: tasks-status path: .wave/output/tasks-status.json type: json retry: policy: standard max_attempts: 2 handover: contract: type: json_schema source: .wave/output/tasks-status.json schema_path: .wave/contracts/tasks-status.schema.json must_pass: true on_failure: retry - id: checklist persona: implementer dependencies: [tasks] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/checklist.md output_artifacts: - name: checklist-status path: .wave/output/checklist-status.json type: json retry: policy: standard max_attempts: 2 handover: contract: type: json_schema source: .wave/output/checklist-status.json schema_path: .wave/contracts/checklist-status.schema.json must_pass: true on_failure: retry - id: analyze persona: implementer model: claude-haiku dependencies: [checklist] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/analyze.md output_artifacts: - name: analysis-report path: .wave/output/analysis-report.json type: json retry: policy: patient max_attempts: 2 handover: contract: type: json_schema source: .wave/output/analysis-report.json schema_path: .wave/contracts/analysis-report.schema.json must_pass: true on_failure: retry - id: implement persona: craftsman dependencies: [analyze] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/implement.md retry: policy: standard max_attempts: 3 handover: contract: type: test_suite command: "{{ project.test_command }}" must_pass: true on_failure: retry compaction: trigger: "token_limit_80%" persona: summarizer - id: create-pr persona: craftsman dependencies: [implement] memory: inject_artifacts: - step: specify artifact: spec-status as: spec_info workspace: type: worktree branch: "{{ pipeline_id }}" exec: type: prompt source_path: .wave/prompts/speckit-flow/create-pr.md output_artifacts: - name: pr-result path: .wave/output/pr-result.json type: json retry: policy: aggressive max_attempts: 2 handover: contract: type: json_schema source: .wave/output/pr-result.json schema_path: .wave/contracts/pr-result.schema.json must_pass: true on_failure: retry outcomes: - type: pr extract_from: .wave/output/pr-result.json json_path: .pr_url label: "Pull Request"