rdev/docs/plans/sdlc-orchestration-breakdown.md
jordan 62460bf098 feat: complete template upgrade - chassis framework, UI library, auth, app-nextjs, OpenAPI, and cookbook
Weeks 1-7 of the template upgrade plan:
- pkg/api: typed HTTPError with sentinels, Wrap/WrapMiddleware, Bind, health probes, OpenAPI schema/param builders
- skeleton/packages: ui (design tokens, components), layout (DashboardShell), auth (AuthProvider, ProtectedRoute), api-client
- skeleton/pkg: httperror, app/handler, app/bind, app/health, auth (JWT/API key middleware)
- components/app-nextjs: Next.js 14 App Router template with dashboard, server actions, auth
- cookbooks/feature-development.md with test and validation scripts
- Handler tests for components, project management, and woodpecker webhook
- 3 rounds of code review fixes applied

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 00:46:51 -07:00

927 lines
27 KiB
Markdown

# SDLC Orchestration System - Implementation Breakdown
**Spec:** `docs/specs/sdlc-orchestration-system.md`
**Goal:** Build an enterprise-grade SDLC system where every action is deterministic, API-observable, and artifact-producing.
## Executive Summary
This breakdown covers 8 weeks of implementation:
- **Weeks 1-2:** Foundation (SDLC CLI tool + git structure)
- **Weeks 3-4:** rdev API Surface (state, features, artifacts, classifier)
- **Weeks 5-6:** Command Integration (update skeleton commands to use SDLC)
- **Week 7:** Execution & Orchestration (Claude task execution via API)
- **Week 8:** Polish & Documentation (full workflow validation, docs)
---
## Week 1: SDLC CLI Foundation
**Goal:** Build the `sdlc` CLI tool with core state management commands.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `cmd/sdlc/main.go` | CREATE | CLI entry point with cobra |
| `cmd/sdlc/cmd/root.go` | CREATE | Root command, config loading |
| `cmd/sdlc/cmd/init.go` | CREATE | `sdlc init` - create .sdlc/ structure |
| `cmd/sdlc/cmd/state.go` | CREATE | `sdlc state` - show current state |
| `cmd/sdlc/cmd/config.go` | CREATE | `sdlc config` - manage config |
| `internal/sdlc/state.go` | CREATE | State struct, Load/Save functions |
| `internal/sdlc/config.go` | CREATE | Config struct, validation |
| `internal/sdlc/paths.go` | CREATE | Path constants and helpers |
### Implementation Details
#### `cmd/sdlc/main.go`
```go
package main
import "github.com/orchard9/rdev/cmd/sdlc/cmd"
func main() {
cmd.Execute()
}
```
#### `internal/sdlc/state.go`
```go
type State struct {
Version int `yaml:"version"`
Project ProjectState `yaml:"project"`
ActiveWork ActiveWork `yaml:"active_work"`
Blocked []BlockedItem `yaml:"blocked"`
LastUpdated time.Time `yaml:"last_updated"`
LastAction string `yaml:"last_action"`
LastActor string `yaml:"last_actor"`
History []HistoryEntry `yaml:"history"`
}
func LoadState(root string) (*State, error)
func (s *State) Save(root string) error
func (s *State) RecordAction(action, feature, actor string)
```
### Commands Implemented
```bash
sdlc init # Create .sdlc/ structure with templates
sdlc state # Show current state
sdlc config set <key> <val> # Update config
sdlc config show # Display config
```
### Tests
- `cmd/sdlc/cmd/init_test.go` - Verify directory structure created
- `internal/sdlc/state_test.go` - State load/save round-trip
### Exit Criteria
- [ ] `sdlc init` creates valid `.sdlc/` structure
- [ ] `sdlc state` reads and displays state.yaml
- [ ] `sdlc config` reads/writes config.yaml
- [ ] Unit tests pass
---
## Week 2: Feature & Artifact Management
**Goal:** Complete SDLC CLI with feature lifecycle and artifact management.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `cmd/sdlc/cmd/feature.go` | CREATE | `sdlc feature` subcommands |
| `cmd/sdlc/cmd/artifact.go` | CREATE | `sdlc artifact` subcommands |
| `cmd/sdlc/cmd/task.go` | CREATE | `sdlc task` subcommands |
| `cmd/sdlc/cmd/branch.go` | CREATE | `sdlc branch` subcommands |
| `internal/sdlc/feature.go` | CREATE | Feature struct, manifest I/O |
| `internal/sdlc/artifact.go` | CREATE | Artifact types, status tracking |
| `internal/sdlc/task.go` | CREATE | Task parsing from tasks.md |
| `internal/sdlc/manifest.go` | CREATE | Manifest YAML operations |
### Implementation Details
#### `internal/sdlc/feature.go`
```go
type Feature struct {
Slug string `yaml:"slug"`
Title string `yaml:"title"`
Created time.Time `yaml:"created"`
Branch string `yaml:"branch"`
RoadmapRef string `yaml:"roadmap_ref"`
Phase FeaturePhase `yaml:"phase"`
PhaseHistory []PhaseTransition `yaml:"phase_history"`
Artifacts map[ArtifactType]*Artifact `yaml:"artifacts"`
Blockers []string `yaml:"blockers"`
Dependencies Dependencies `yaml:"dependencies"`
}
type FeaturePhase string
const (
PhaseDraft FeaturePhase = "draft"
PhaseSpecified FeaturePhase = "specified"
PhasePlanned FeaturePhase = "planned"
PhaseReady FeaturePhase = "ready"
PhaseImplementation FeaturePhase = "implementation"
PhaseReview FeaturePhase = "review"
PhaseAudit FeaturePhase = "audit"
PhaseQA FeaturePhase = "qa"
PhaseMerge FeaturePhase = "merge"
PhaseReleased FeaturePhase = "released"
)
func (f *Feature) CanTransitionTo(phase FeaturePhase) error
func (f *Feature) Transition(phase FeaturePhase) error
```
### Commands Implemented
```bash
sdlc feature create <slug> # Create new feature
sdlc feature list # List all features
sdlc feature show <slug> # Show feature details
sdlc feature status <slug> # Show phase + progress
sdlc feature transition <slug> <phase> # Manual transition
sdlc feature block <slug> <reason> # Add blocker
sdlc feature unblock <slug> # Remove blocker
sdlc artifact create <feature> <type> # Create artifact file
sdlc artifact approve <feature> <type> # Mark approved
sdlc artifact reject <feature> <type> # Mark rejected
sdlc artifact status <feature> # Show all statuses
sdlc task list <feature> # List tasks
sdlc task start <feature> <id> # Mark in-progress
sdlc task complete <feature> <id> # Mark complete
sdlc task add <feature> <title> # Add new task
sdlc branch create <feature> # Create feature branch
sdlc branch status <feature> # Show branch state
```
### Tests
- `internal/sdlc/feature_test.go` - Phase transitions, validation
- `internal/sdlc/artifact_test.go` - Status tracking
- `cmd/sdlc/cmd/feature_test.go` - CLI integration
### Exit Criteria
- [ ] Can create feature and see it in list
- [ ] Can transition feature through phases
- [ ] Artifact status tracked in manifest
- [ ] Task status parsed from tasks.md markdown
- [ ] Branch creation via `git checkout -b`
---
## Week 3: Classifier Engine
**Goal:** Build the deterministic classifier that evaluates state and returns next action.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `cmd/sdlc/cmd/next.go` | CREATE | `sdlc next` command |
| `internal/sdlc/classifier/classifier.go` | CREATE | Main classifier engine |
| `internal/sdlc/classifier/rules.go` | CREATE | Built-in classification rules |
| `internal/sdlc/classifier/types.go` | CREATE | Classification result types |
| `internal/sdlc/classifier/context.go` | CREATE | Context builder for commands |
### Implementation Details
#### `internal/sdlc/classifier/classifier.go`
```go
type Classifier struct {
rules []Rule
}
type Rule struct {
ID string
Priority int
Condition func(*EvalContext) bool
Action ActionType
Message string
NextCommand string
OutputPath string
TransitionTo FeaturePhase
}
type Classification struct {
Timestamp time.Time
Context ClassificationContext
Evaluation Evaluation
Decision Decision
CommandContext map[string]any
}
func (c *Classifier) Classify(state *State, feature *Feature) (*Classification, error)
```
#### Rule Evaluation
```go
// Rules evaluated in priority order, first match wins
var DefaultRules = []Rule{
// BLOCKERS (priority 1000)
{ID: "blocked-dependency", Priority: 1000, ...},
// DRAFT → SPECIFIED (priority 200)
{ID: "needs-spec", Priority: 200, ...},
{ID: "spec-needs-approval", Priority: 201, ...},
{ID: "spec-approved", Priority: 202, ...},
// SPECIFIED → PLANNED (priority 300)
{ID: "needs-design", Priority: 300, ...},
// ...
}
```
### Commands Implemented
```bash
sdlc next # Classify global state
sdlc next --for <feature> # Classify specific feature
sdlc next --execute # Classify and execute
sdlc next --json # Output as JSON for API
```
### Output Format
```
┌─────────────────────────────────────────────────────────────────┐
│ SDLC Classifier Result │
├─────────────────────────────────────────────────────────────────┤
│ Feature: auth │
│ Current Phase: implementation │
│ Tasks: 5/8 complete, 1 in-progress, 2 pending │
├─────────────────────────────────────────────────────────────────┤
│ NEXT ACTION: IMPLEMENT_TASK │
│ │
│ Command: /implement-task auth task-004 │
│ Output: .sdlc/features/auth/tasks.md (updated) │
└─────────────────────────────────────────────────────────────────┘
```
### Tests
- `internal/sdlc/classifier/classifier_test.go` - Rule matching
- `internal/sdlc/classifier/rules_test.go` - Each rule condition
- Integration test: Full feature lifecycle classification
### Exit Criteria
- [ ] Classifier returns correct action for each phase
- [ ] Blocked items identified with resolution path
- [ ] `--json` output matches API format
- [ ] `--execute` triggers appropriate command
---
## Week 4: rdev API Surface (Part 1)
**Goal:** Add SDLC API endpoints to rdev for state, features, and artifacts.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `internal/domain/sdlc.go` | CREATE | SDLC domain types |
| `internal/port/sdlc.go` | CREATE | SDLC repository interface |
| `internal/service/sdlc_service.go` | CREATE | SDLC business logic |
| `internal/handlers/sdlc.go` | CREATE | HTTP handlers |
| `internal/handlers/sdlc_features.go` | CREATE | Feature endpoints |
| `internal/handlers/sdlc_artifacts.go` | CREATE | Artifact endpoints |
| `cmd/rdev-api/main.go` | MODIFY | Wire SDLC handlers |
### API Endpoints
```
GET /projects/{project}/sdlc/state
GET /projects/{project}/sdlc/features
POST /projects/{project}/sdlc/features
GET /projects/{project}/sdlc/features/{slug}
POST /projects/{project}/sdlc/features/{slug}/transition
GET /projects/{project}/sdlc/features/{slug}/artifacts/{type}
POST /projects/{project}/sdlc/features/{slug}/artifacts/{type}
POST /projects/{project}/sdlc/features/{slug}/artifacts/{type}/approve
POST /projects/{project}/sdlc/features/{slug}/artifacts/{type}/reject
```
### Implementation Details
#### `internal/service/sdlc_service.go`
```go
type SDLCService struct {
gitOps port.PodGitOperations
classifier *classifier.Classifier
logger *slog.Logger
}
func (s *SDLCService) GetState(ctx context.Context, project string) (*domain.SDLCState, error) {
// Read .sdlc/state.yaml from project pod
content, err := s.gitOps.ReadFile(ctx, project, ".sdlc/state.yaml")
// Parse and return
}
func (s *SDLCService) CreateFeature(ctx context.Context, project string, req CreateFeatureRequest) (*domain.Feature, error) {
// Create .sdlc/features/{slug}/ directory structure
// Write manifest.yaml
// Update state.yaml
// Commit changes
}
```
### Handler Pattern
```go
func (h *SDLCHandler) GetState(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), TimeoutStandard)
defer cancel()
projectID := chi.URLParam(r, "id")
state, err := h.sdlcService.GetState(ctx, projectID)
if err != nil {
if errors.Is(err, domain.ErrNotFound) {
api.WriteNotFound(w, "SDLC not initialized for project")
return
}
h.logger.Error("get sdlc state", "project", projectID, "error", err)
api.WriteInternalError(w, "failed to get SDLC state")
return
}
api.WriteSuccess(w, state)
}
```
### Tests
- `internal/handlers/sdlc_test.go` - Handler tests
- `internal/service/sdlc_service_test.go` - Service tests
### Exit Criteria
- [ ] `GET /projects/{id}/sdlc/state` returns state
- [ ] `POST /projects/{id}/sdlc/features` creates feature
- [ ] Artifact CRUD works
- [ ] All endpoints require auth
---
## Week 5: rdev API Surface (Part 2) - Classifier & Execution
**Goal:** Add classifier, blocker resolution, and execution endpoints.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `internal/handlers/sdlc_classifier.go` | CREATE | Classifier endpoints |
| `internal/handlers/sdlc_execution.go` | CREATE | Execution endpoints |
| `internal/handlers/sdlc_resolution.go` | CREATE | Blocker resolution |
| `internal/service/sdlc_executor.go` | CREATE | Command execution service |
### API Endpoints
```
GET /projects/{project}/sdlc/next
GET /projects/{project}/sdlc/next?feature={slug}
GET /projects/{project}/sdlc/blocked
POST /projects/{project}/sdlc/resolve
POST /projects/{project}/sdlc/execute
POST /projects/{project}/sdlc/commit
```
### Implementation Details
#### `/sdlc/next` Response
```json
{
"classification": {
"rule_id": "implement-next-task",
"action": "IMPLEMENT_TASK",
"feature": "auth",
"task_id": "task-004"
},
"instruction": {
"summary": "Implement JWT token validation",
"command": "/implement-task auth task-004",
"output_path": ".sdlc/features/auth/tasks.md",
"context": {
"task_spec": "...",
"patterns_required": ["error-handling"],
"related_files": ["internal/auth/jwt.go"]
}
},
"execute_url": "/projects/my-project/sdlc/execute",
"can_auto_execute": true
}
```
#### `/sdlc/execute` Flow
```go
func (s *SDLCService) Execute(ctx context.Context, project string, req ExecuteRequest) (*ExecuteResult, error) {
// 1. Validate action matches current classification
classification, err := s.Classify(ctx, project, req.Feature)
if classification.Decision.Action != req.Action {
return nil, domain.ErrInvalidAction
}
// 2. Execute the command via Claude
result, err := s.executor.ExecuteCommand(ctx, project, classification.Decision.Command)
// 3. Verify output exists
if !s.fileExists(ctx, project, classification.Decision.OutputPath) {
return nil, domain.ErrOutputMissing
}
// 4. Update state
s.state.RecordAction(req.Action, req.Feature, "api")
// 5. Auto-commit if requested
if req.AutoCommit {
s.gitOps.Commit(ctx, project, generateCommitMessage(req))
}
return &ExecuteResult{...}, nil
}
```
### Blocker Resolution Flow
```
GET /sdlc/blocked returns:
{
"blocked": [{
"type": "feature",
"slug": "auth",
"rule_id": "design-decision-needed",
"blocked_reason": "Design decision required",
"resolution": {
"action": "ANSWER_QUESTION",
"question": "Which auth provider?",
"options": ["jwt", "oauth", "session"],
"resolve_url": "/projects/my-project/sdlc/resolve"
}
}]
}
POST /sdlc/resolve with:
{
"feature": "auth",
"resolution_type": "ANSWER_QUESTION",
"question_id": "auth-provider",
"answer": "jwt",
"rationale": "Stateless, works well with microservices"
}
```
### Tests
- `internal/handlers/sdlc_classifier_test.go`
- `internal/handlers/sdlc_execution_test.go`
- Integration test: Full blocker resolution flow
### Exit Criteria
- [ ] `/sdlc/next` returns correct classification
- [ ] `/sdlc/blocked` shows all blocked items
- [ ] `/sdlc/resolve` updates artifacts and unblocks
- [ ] `/sdlc/execute` runs commands and verifies output
---
## Week 6: Skeleton Command Integration
**Goal:** Update skeleton template commands to use SDLC tool and produce deterministic outputs.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `.../skeleton/.claude/commands/spec-feature.md` | CREATE | Create specification |
| `.../skeleton/.claude/commands/design-feature.md` | CREATE | Create design doc |
| `.../skeleton/.claude/commands/breakdown-feature.md` | CREATE | Create task breakdown |
| `.../skeleton/.claude/commands/create-qa-plan.md` | CREATE | Create QA plan |
| `.../skeleton/.claude/commands/implement-task.md` | CREATE | Implement single task |
| `.../skeleton/.claude/commands/review-feature.md` | CREATE | Review feature code |
| `.../skeleton/.claude/commands/audit-feature.md` | CREATE | Audit feature |
| `.../skeleton/.claude/commands/run-qa.md` | CREATE | Run QA verification |
| `.../skeleton/.claude/commands/next.md` | MODIFY | Integrate with classifier |
| `.../skeleton/.claude/commands/deliver.md` | CREATE | Full feature delivery |
### Command Pattern
Each command MUST:
1. Read context from SDLC structure
2. Produce a concrete artifact
3. Write artifact to the correct location
4. Update manifest/state via `sdlc` CLI
5. Return structured output
#### `/spec-feature` Template
```markdown
---
description: Create a feature specification document
argument-hint: <feature-slug>
allowed-tools: Bash, Read, Write, Edit, AskUserQuestion
---
Create specification for feature: $ARGUMENTS
## Instructions
### 1. Validate Feature Exists
```bash
sdlc feature show $ARGUMENTS
```
If not found, create it first with `sdlc feature create $ARGUMENTS`.
### 2. Gather Requirements
Use AskUserQuestion to understand:
- What problem does this solve?
- Who are the users?
- What are the acceptance criteria?
### 3. Write Specification
Write to `.sdlc/features/{slug}/spec.md` using template:
```markdown
---
feature: {slug}
version: 1
status: draft
---
# Feature: {Title}
## Overview
[2-3 sentence summary]
## Problem Statement
[What problem does this solve?]
## User Stories
- As a [user], I want to [action] so that [benefit]
## Acceptance Criteria
- [ ] AC1: ...
## Non-Functional Requirements
[Performance, security, availability]
## Out of Scope
[What this feature does NOT include]
## Dependencies
[Other features, patterns, infrastructure]
## Open Questions
[Must be empty before approval]
```
### 4. Update SDLC State
```bash
sdlc artifact create $ARGUMENTS spec
```
### 5. Output Summary
```markdown
## Created: spec.md
**Feature:** {slug}
**Path:** `.sdlc/features/{slug}/spec.md`
**Status:** draft
### Next Steps
Run `sdlc next --for {slug}` to see required action (approval needed).
```
```
#### `/implement-task` Template
```markdown
---
description: Implement a specific task from the task breakdown
argument-hint: <feature-slug> <task-id>
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, Task
---
Implement task $ARGUMENTS
## Instructions
### 1. Load Task Context
```bash
sdlc task show {feature} {task-id}
```
### 2. Load Feature Context
Read:
- `.sdlc/features/{feature}/spec.md` - Requirements
- `.sdlc/features/{feature}/design.md` - Architecture
- `.sdlc/features/{feature}/tasks.md` - Full task list
### 3. Mark Task In-Progress
```bash
sdlc task start {feature} {task-id}
```
### 4. Implement
Follow the task specification. Ensure:
- Code follows required patterns
- Tests included
- No tech debt introduced
### 5. Update Task Status
```bash
sdlc task complete {feature} {task-id}
```
### 6. Output Summary
```markdown
## Completed: {task-id}
**Feature:** {feature}
**Task:** {task-title}
**Files Modified:**
- {list of files}
**Tests Added:**
- {list of tests}
### Task Progress
{completed}/{total} tasks complete
### Next Steps
Run `sdlc next --for {feature}` to continue.
```
```
### Exit Criteria
- [ ] Each command produces artifact at documented location
- [ ] Each command updates SDLC state
- [ ] Each command has structured output format
- [ ] `/next` integrates with `sdlc next` CLI
- [ ] `/deliver` orchestrates full delivery flow
---
## Week 7: Git Integration & Branch Management
**Goal:** Complete git operations for branch lifecycle and merge flow.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `internal/handlers/sdlc_branches.go` | CREATE | Branch endpoints |
| `internal/handlers/sdlc_merge.go` | CREATE | Merge endpoint |
| `internal/service/sdlc_git.go` | CREATE | Git operations service |
| `cmd/sdlc/cmd/merge.go` | CREATE | `sdlc merge` command |
| `.../skeleton/.claude/commands/merge-feature.md` | CREATE | Merge command |
### API Endpoints
```
POST /projects/{project}/sdlc/branches
GET /projects/{project}/sdlc/branches/{branch}
POST /projects/{project}/sdlc/branches/{branch}/sync
POST /projects/{project}/sdlc/merge
```
### Implementation Details
#### Branch Creation
```go
func (s *SDLCService) CreateBranch(ctx context.Context, project, feature string) (*BranchInfo, error) {
// 1. Verify feature is in 'planned' phase
f, err := s.GetFeature(ctx, project, feature)
if f.Phase != PhasePlanned {
return nil, domain.ErrInvalidPhase
}
// 2. Create branch
branchName := fmt.Sprintf("feature/%s", feature)
err = s.gitOps.CreateBranch(ctx, project, branchName, "main")
// 3. Track branch in .sdlc/branches/{branch}.yaml
s.writeBranchManifest(ctx, project, branchName, feature)
// 4. Update feature manifest
f.Branch = branchName
s.SaveFeature(ctx, project, f)
// 5. Transition to 'ready'
s.TransitionFeature(ctx, project, feature, PhaseReady)
return &BranchInfo{Name: branchName, Feature: feature}, nil
}
```
#### Merge Flow
```go
func (s *SDLCService) Merge(ctx context.Context, project string, req MergeRequest) (*MergeResult, error) {
// 1. Verify feature completed all gates
f, err := s.GetFeature(ctx, project, req.Feature)
if f.Phase != PhaseMerge {
return nil, domain.ErrNotReadyToMerge
}
// Gates checklist
gates := []string{"review_passed", "audit_passed", "qa_passed"}
for _, gate := range gates {
if !f.GatePassed(gate) {
return nil, fmt.Errorf("gate not passed: %s", gate)
}
}
// 2. Merge branch
switch req.Strategy {
case "squash":
err = s.gitOps.SquashMerge(ctx, project, f.Branch, "main")
case "merge":
err = s.gitOps.Merge(ctx, project, f.Branch, "main")
}
// 3. Delete branch if requested
if req.DeleteBranch {
s.gitOps.DeleteBranch(ctx, project, f.Branch)
}
// 4. Transition to 'released'
s.TransitionFeature(ctx, project, req.Feature, PhaseReleased)
// 5. Archive feature
s.ArchiveFeature(ctx, project, req.Feature)
return &MergeResult{...}, nil
}
```
### CLI Commands
```bash
sdlc branch create <feature> # Create feature branch
sdlc branch status <feature> # Show branch state + checklist
sdlc branch sync <feature> # Rebase on main
sdlc merge <feature> # Merge feature to main
sdlc archive <feature> # Move to .sdlc/archives/
```
### Tests
- `internal/handlers/sdlc_branches_test.go`
- `internal/handlers/sdlc_merge_test.go`
- Integration: Full feature lifecycle with branch
### Exit Criteria
- [ ] Branch created for feature in 'planned' phase
- [ ] Branch status shows merge checklist
- [ ] Sync rebases on main
- [ ] Merge validates all gates
- [ ] Archive moves feature to archives/
---
## Week 8: Polish, Documentation & Validation
**Goal:** Complete documentation, validate full workflow, and polish UX.
### Deliverables
| File | Action | Description |
|------|--------|-------------|
| `docs/guides/sdlc/getting-started.md` | CREATE | Quick start guide |
| `docs/guides/sdlc/cli-reference.md` | CREATE | Full CLI docs |
| `docs/guides/sdlc/api-reference.md` | CREATE | API docs |
| `docs/guides/sdlc/command-catalog.md` | CREATE | Claude command docs |
| `.claude/guides/services/sdlc.md` | CREATE | Guide entry point |
| `CLAUDE.md` | MODIFY | Add SDLC guide link |
| `cookbooks/scripts/sdlc-test.sh` | CREATE | E2E validation script |
### Validation Scenarios
#### Scenario 1: Full Feature Delivery
```bash
# Initialize SDLC
sdlc init
# Create feature
sdlc feature create user-auth
# Run through full lifecycle via API
curl -X POST $API/projects/test/sdlc/features/user-auth/execute \
-d '{"action": "CREATE_SPEC"}'
# Keep running until complete
while true; do
NEXT=$(curl $API/projects/test/sdlc/next?feature=user-auth)
if [ "$NEXT.action" == "IDLE" ]; then break; fi
curl -X POST $API/projects/test/sdlc/execute -d "$NEXT"
done
```
#### Scenario 2: Blocker Resolution
```bash
# Get blocked items
BLOCKED=$(curl $API/projects/test/sdlc/blocked)
# Resolve design decision
curl -X POST $API/projects/test/sdlc/resolve \
-d '{"feature": "user-auth", "answer": "jwt"}'
# Verify unblocked
curl $API/projects/test/sdlc/next?feature=user-auth
```
#### Scenario 3: Claude Command Integration
```bash
# In Claude Code session
/spec-feature user-auth
# → Creates .sdlc/features/user-auth/spec.md
/next
# → Shows next action (await approval)
# User approves
sdlc artifact approve user-auth spec
/next
# → Shows CREATE_DESIGN action
/design-feature user-auth
# → Creates design.md
# Continue through full delivery...
```
### Documentation Structure
```
docs/guides/sdlc/
├── getting-started.md # 5-min quickstart
├── concepts.md # State machine, classifier, artifacts
├── cli-reference.md # Full sdlc CLI docs
├── api-reference.md # Full API docs with examples
├── command-catalog.md # All Claude commands
├── patterns.md # Pattern management
└── troubleshooting.md # Common issues
```
### Exit Criteria
- [ ] E2E test script runs full feature delivery
- [ ] All documentation complete
- [ ] CLAUDE.md updated with guide link
- [ ] `sdlc` CLI has `--help` for all commands
- [ ] API returns helpful error messages
- [ ] Blocker resolution flow works end-to-end
---
## Risk Mitigation
### Risk: Complex Git Operations
**Mitigation:** Use existing `PodGitOperations` adapter, add integration tests with real git repos.
### Risk: Classifier Rule Complexity
**Mitigation:** Start with feature lifecycle rules only, add pattern rules in follow-up.
### Risk: State Corruption
**Mitigation:** All state changes go through `sdlc` CLI which validates, add recovery command.
### Risk: Command Output Verification
**Mitigation:** Each command has explicit output path, executor verifies file exists.
---
## Dependencies
| Dependency | Required For | Status |
|------------|--------------|--------|
| `PodGitOperations` | Git operations in pods | ✓ Exists |
| `cobra` CLI framework | `sdlc` CLI | Add to go.mod |
| Project pod executor | Command execution | ✓ Exists |
| YAML parsing | State/manifest | ✓ `gopkg.in/yaml.v3` |
---
## Follow-Up Work (Post-MVP)
1. **Pattern Management** - Full pattern lifecycle (elevate, examples, violations)
2. **Roadmap Management** - Version roadmaps, milestones
3. **Audit System** - Codebase-wide audits
4. **Metrics Dashboard** - Cycle time, velocity tracking
5. **SSE Streaming** - Real-time execution status
6. **Rollback Support** - Phase rollback with cleanup
7. **Custom Rules** - Project-specific classifier rules
8. **CI Integration** - Auto-trigger SDLC actions from Woodpecker