15 KiB
Spec-Driven Development Process
Overview
This document defines the SDD process for the alk.dev project. It leverages:
- Operation registry + call protocol for typed, composable tool invocation
- Hub coordination operations (
coord.spawn,coord.status,coord.message, etc.) for parallel worktree/session orchestration - OpenCode CLI as the agent execution environment (via the open-coordinator plugin as stopgap, transitioning to native hub operations)
Core Principles
- Specification First: Invest in architecture before implementation
- Roles as Modes: Same agent adopts different behavioral modes
- Flexible Self: Agents can implement, self-review, and fix objectively
- Task-Driven: Structured task graphs with dependency analysis
- Safe Exit: Always have a way to unblock progress when stuck
- Categorical Estimates: Use risk/scope/impact categories, not time estimates. These are structurally important — upstream failures multiply downstream damage regardless of developer type (human or LLM). See the cost-benefit framework.
Workflow Phases
Phase 0: Exploration (Conditional)
When: Requirements unclear, multiple approaches to evaluate, or hard problems need investigation.
Process:
- Capture vision and guiding principles
- Research Specialist investigates options (
docs/research/or external) - POC Specialist validates promising approaches (
.worktrees/research/) - Document learnings
- Converge on recommended approach
Output: Clear understanding of WHAT to build and WHY, with validated approaches
Phase 1: Architecture
Objective: Produce comprehensive, committed architecture specification.
Process:
- Architect creates modular architecture docs in
docs/architecture/(Draft status) - Architecture Review validates for ambiguities, risks
- Iterate until zero critical issues
- Transition to Stable status
Output: Stable architecture documents ready for decomposition
Phase 2: Decomposition
Objective: Break architecture into atomic, dependency-ordered tasks.
Process:
- Decomposer analyzes architecture
- Creates tasks (markdown files in
tasks/) - Establishes dependencies between tasks
- Validates structure (no cycles, logical ordering)
- Identifies review injection points
Output: Well-structured task graph in tasks/ directory
Phase 3: Implementation
Objective: Execute tasks in dependency order with verification.
Process:
- Coordinator identifies parallelizable work
- Coordinator spawns worktrees + sessions (via
worktree_make swarmor hubcoord.spawnwhen available)- Feature work:
.worktrees/feat/<task-id>/→ Implementation Specialist - Research POCs:
.worktrees/research/<task-id>/→ POC Specialist
- Feature work:
- Coordinator injects task context into each session
- Agents execute tasks with self-verification
- On completion: update task status, commit to worktree branch
- On blocker: Safe Exit protocol, create blocker task
- Merge worktrees back to main when complete
Output: Completed, verified implementation
Phase 4: Review & Finalization
Objective: Validate quality and readiness.
Process:
- Code review at injected checkpoints
- Final integration testing
- Architecture sync check
- Deployment preparation
Output: Production-ready codebase
Roles
Primary Roles
1. Architect
Responsibility: Create and maintain architecture specifications.
Mode: Primary (interactive with user)
Tools:
- Read, Write, Edit, Glob, Grep
- webSearch (research patterns, best practices)
Key Behaviors:
- Focus on WHAT and WHY, never HOW
- Document decisions with ADR format
- Redirect exploration work to Research Specialist
- Iterate based on review feedback
Deliverables:
- Modular architecture docs in
docs/architecture/ - Component-specific documents
2. Decomposer
Responsibility: Transform architecture into atomic task graph.
Mode: Primary (interactive with user for approval)
Tools:
- Read, Glob, Grep
Key Behaviors:
- Decompose to atomic tasks (single objective, clear acceptance criteria)
- Establish logical dependencies
- Validate structure (no cycles, logical ordering)
- Inject review tasks at critical points
Deliverables:
- Task files in
tasks/directory - Dependency graph validated
3. Coordinator
Responsibility: Orchestrate parallel task execution across worktrees and sessions.
Mode: Primary (manages worktrees and agent sessions)
Current (stopgap): Uses the open-coordinator opencode plugin for worktree management + session messaging. State tracked in ~/.config/opencode/open-coordinator/state.json.
Future: Uses hub coordination operations (coord.spawn, coord.status, coord.message, coord.abort) via the call protocol. State persisted in Postgres mappings table. Spoke runners replace the in-process plugin model.
Tools:
worktree_mode,worktree_make(swarm),worktree_cleanup,worktree_overview- Bash (opencode CLI for session interaction)
- Read (monitor task files)
Key Behaviors:
- Identify parallelizable task groups
- Spawn worktrees + sessions via
worktree_make swarm(current) orhub.call("coord.spawn", ...)(future) - Inject task context into sessions
- Monitor progress
- Handle blocked tasks (escalate or reassign)
- Merge completed worktrees
Deliverables:
- Coordinated parallel execution
- Blocked task escalation
- Merged branches
4. Implementation Specialist
Responsibility: Execute atomic tasks with self-verification.
Mode: Primary (works on assigned task in worktree)
Tools:
- Read, Write, Edit, Glob, Grep, Bash
- webSearch (documentation lookup)
Key Behaviors:
- Load task context (architecture, dependencies)
- Propose plan before implementing
- Implement following architecture constraints
- Self-verify against acceptance criteria
- Use Safe Exit when blocked
- Commit to worktree branch
Deliverables:
- Completed task implementation
- Tests passing
- Committed changes in worktree
Reviewer Roles
5. Architecture Reviewer
Responsibility: Validate architecture for ambiguities and risks.
Mode: Subagent (invoked by Architect)
Tools:
- Read, Grep
Key Behaviors:
- Check for undefined terms
- Identify missing trade-off documentation
- Validate quality attribute coverage
- Flag ambiguities that could cause implementation issues
6. Code Reviewer
Responsibility: Review code quality at checkpoints.
Mode: Subagent (invoked by Coordinator or as task)
Tools:
- Read, Grep, Bash (lint, test)
Key Behaviors:
- Check adherence to architecture
- Validate patterns and conventions
- Run linters and tests
- Identify security/performance concerns
7. Research Specialist
Responsibility: Research documentation, libraries, best practices.
Mode: Subagent (invoked by any role)
Tools:
- Read, Write, Glob
- webSearch (primary research tool)
Key Behaviors:
- Find and summarize documentation
- Evaluate library alternatives
- Document findings
8. POC Specialist
Responsibility: Create proof-of-concepts to validate technical approaches before production implementation.
Mode: Primary (works in isolated research worktree)
Worktree Location: .worktrees/research/<task-id>/
Tools:
- Read, Write, Edit, Glob, Grep, Bash
- webSearch (implementation references)
Key Behaviors:
- Create minimal POCs to validate hypotheses
- Work in isolated research worktrees
- Document findings and recommendations
- Timebox strictly - abandon if taking too long
- Be honest about limitations and blockers
When Invoked:
- After Research Specialist completes initial research
- When a technical approach needs validation before commitment
- When integration complexity or performance is uncertain
Deliverables:
- Working POC code
- Findings document with recommendation (proceed/pivot/block)
- Updated research task with results
Task File Format
Tasks are markdown files stored in tasks/. Since they're in the repo, they're automatically available in worktrees.
---
id: auth-setup
name: Setup Authentication
status: pending
depends_on: []
scope: moderate
risk: medium
impact: component
level: implementation
---
## Description
Implement OAuth2 authentication with provider abstraction.
## Acceptance Criteria
- [ ] OAuth2 flow works with Google provider
- [ ] Tokens stored securely
- [ ] Session management implemented
## References
- docs/architecture/auth.md
## Notes
> Agent fills this during implementation. Document any decisions,
> deviations from architecture, or relevant context discovered.
## Summary
> Agent fills this on completion. Brief description of what was
> implemented, files changed, and any follow-up needed.
Categorical Estimates
These fields are structurally important, not optional metadata. They power taskgraph decompose, risk-path, critical, and bottleneck — commands that reveal structural problems in the task graph. A task missing scope, risk, impact, or level is a red flag indicating incomplete decomposition. See the cost-benefit framework for the reasoning.
| Scope | Description | Example |
|---|---|---|
| single | One function, one file | Add validation helper |
| narrow | One component, few files | Implement auth middleware |
| moderate | Feature, multiple components | Build user API endpoints |
| broad | Multi-component feature | Implement OAuth flow |
| system | Cross-cutting changes | Database migration |
| Risk | Failure Likelihood |
|---|---|
| trivial | Nearly impossible to fail |
| low | Standard implementation |
| medium | Some uncertainty |
| high | Significant unknowns |
| critical | High chance of failure |
Task Lifecycle
Status values: pending → in-progress → completed | blocked | failed
On completion, the agent:
- Updates
status: completed - Fills in
## Summarysection - Commits changes to worktree branch
Safe Exit Protocol
When a task becomes untendable:
Criteria
Hard Criteria (automatic):
- Same task fails verification 3+ times
- Task attempts exceed 5+ total
Soft Criteria (agent judgment):
- Ambiguous architecture
- Missing dependencies
- External library incompatibility
- Scope creep detected
Process
- Create blocker task
- Update original task:
status: blocked, add blocker todepends_on - Document in task notes
- Notify coordinator
Review Injection
Use graph analysis to determine where reviews should happen:
| Analysis | Injection Point |
|---|---|
| Parallel groups | Review before groups merge |
| Bottleneck tasks | Review before critical path |
| High-risk tasks | Review before proceeding |
| Critical path | Review before critical tasks |
Coordinator Implementation
Current (Stopgap)
The Coordinator uses the open-coordinator opencode plugin for worktree management and session messaging. This is a fork of open-trees with added session monitoring and messaging capabilities.
1. Identify parallel work
Read task files → groups of independent tasks
2. Spawn worktrees + sessions
worktree_make swarm → creates .worktrees/feat/<branch>
3. Inject task context
opencode run -s <session-id> --agent implementation-specialist "Your task: <task-id>"
4. Monitor progress
worktree_overview dashboard → status of all worktrees
5. Handle completion
- Agent commits to worktree branch
- Coordinator merges back to main
6. Handle blockers
- Agent uses Safe Exit
- Coordinator escalates or reassigns
State tracked at:
~/.config/opencode/open-coordinator/state.json
Each entry maps:
worktreePath→ filesystem locationbranch→ git branch namesessionID→ opencode session IDcreatedAt→ timestamp
Future (Hub Operations)
Once the hub is operational, coordination uses native operations:
1. Identify parallel work
hub.call("coord.spawn", { task, branch, ... })
2. Monitor progress
hub.call("coord.status", { parentSessionId })
3. Message sessions
hub.call("coord.message", { sessionId, message })
4. Handle aborts
hub.call("coord.abort", { sessionId })
State moves from state.json to Postgres mappings table. The open-coordinator plugin becomes unnecessary — the hub provides the same capabilities as server-side operations accessible from any environment.
Document Structure
.opencode/
├── agents/
│ ├── architect.md
│ ├── decomposer.md
│ ├── coordinator.md
│ ├── implementation-specialist.md
│ ├── poc-specialist.md
│ ├── code-reviewer.md
│ ├── architecture-reviewer.md
│ └── research-specialist.md
docs/
├── architecture/
│ ├── hub-architecture.md
│ ├── call-graph.md
│ ├── spoke-runner.md
│ ├── operations.md
│ ├── mcp-server.md
│ ├── coordination.md
│ ├── storage/ # Decomposed: README.md, table-reference.md, per-domain schema files, tasks.md
│ │ └── (ADRs in decisions/)
│ ├── agent-sessions.md
│ ├── pubsub-redis.md
│ └── infrastructure.md
├── sdd_process.md # This document
└── decisions/ # ADRs
tasks/
├── architecture/
│ └── auth-design.md
├── implementation/
│ ├── storage/
│ │ ├── tasks-table.md
│ │ └── migrations.md
│ └── auth/
│ └── oauth-flow.md
└── (taskgraph validates & analyzes dependency graph)
.worktrees/ # Created by coordinator
├── feat/
│ ├── api-auth/
│ └── api-users/
└── research/
└── storage-abstraction/
Agent Role Specs
Agent definitions are in .opencode/agents/:
- architect.md - Creates architecture specifications
- decomposer.md - Transforms architecture to task graph
- coordinator.md - Orchestrates parallel execution
- implementation-specialist.md - Executes tasks with self-verification
- poc-specialist.md - Creates proof-of-concepts for validation
- code-reviewer.md - Reviews code quality at checkpoints
- architecture-reviewer.md - Validates architecture specs
- research-specialist.md - Researches and documents findings
Use with opencode CLI:
# Spawn coordinator in interactive mode
opencode --agent coordinator
# Send task to implementation specialist
opencode run -s <session-id> --agent implementation-specialist "Your task: auth-setup"
Evolution
This document should evolve with the project:
- Refine roles based on actual usage
- Adjust task templates based on what works
- Document coordinator patterns as they emerge
- Capture learnings in after-action reviews