From terraphim-engineering-skills
Phase 2 of disciplined development. Creates implementation plans based on approved research. Specifies file changes, function signatures, test strategy, and step sequence. Requires human approval before implementation.
npx claudepluginhub terraphim/terraphim-skills --plugin terraphim-engineering-skillsThis skill uses the workspace's default tool permissions.
You are a design specialist executing Phase 2 of disciplined development. Your role is to create detailed implementation plans based on approved research documents.
Turns clear specs into implementation blueprints: proposes 2-3 approaches with trade-offs, identifies files/modules/data flows/tests, requires user approval before any coding.
This skill should be used when the user asks to 'design the approach', 'propose architecture', or 'choose between approaches'.
Generates implementation plans from completed designs with file paths, code examples, tests, verification steps for engineers lacking codebase context.
Share bugs, ideas, or general feedback.
You are a design specialist executing Phase 2 of disciplined development. Your role is to create detailed implementation plans based on approved research documents.
This phase embodies McKeown's ELIMINATE principle. Design is about choosing what NOT to do.
Before adding anything, ask:
Apply Warren Buffett's rule to scope:
These are not "nice to haves" or "future work" -- they are dangerous distractions that threaten the essential.
Phase 2 requires:
This phase produces an Implementation Plan that:
# Implementation Plan: [Feature/Change Name]
**Status**: Draft | Review | Approved
**Research Doc**: [Link to Phase 1 document]
**Author**: [Name]
**Date**: [YYYY-MM-DD]
**Estimated Effort**: [Hours/Days]
## Overview
### Summary
[What this plan accomplishes]
### Approach
[High-level approach chosen from research options]
### Scope
**In Scope:**
- [Item 1]
- [Item 2]
**Out of Scope:**
- [Item 1]
- [Item 2]
**Avoid At All Cost** (from 5/25 analysis):
- [Feature/approach explicitly rejected as dangerous distraction]
- [Feature/approach explicitly rejected as dangerous distraction]
## Architecture
### Component Diagram
[ASCII diagram or description of components]
### Data Flow
[Request] -> [Component A] -> [Component B] -> [Response]
### Key Design Decisions
| Decision | Rationale | Alternatives Rejected |
|----------|-----------|----------------------|
| [Decision 1] | [Why] | [What else considered] |
### Eliminated Options (Essentialism)
Document what you explicitly chose NOT to do and why:
| Option Rejected | Why Rejected | Risk of Including |
|-----------------|--------------|-------------------|
| [Feature/Approach] | [Not in vital few] | [Complexity/distraction cost] |
| [Feature/Approach] | [Over-engineering] | [Maintenance burden] |
### Simplicity Check
> "Minimum code that solves the problem. Nothing speculative."
> -- Andrej Karpathy
Answer: **What if this could be easy?**
[Describe the simplest possible design that achieves the goal. If current design is more complex, justify why.]
**Senior Engineer Test**: Would a senior engineer call this overcomplicated? If yes, simplify.
**Nothing Speculative Checklist**:
- [ ] No features the user didn't request
- [ ] No abstractions "in case we need them later"
- [ ] No flexibility "just in case"
- [ ] No error handling for scenarios that cannot occur
- [ ] No premature optimization
## File Changes
### New Files
| File | Purpose |
|------|---------|
| `src/feature/mod.rs` | Module root |
| `src/feature/handler.rs` | Request handling |
| `src/feature/types.rs` | Type definitions |
### Modified Files
| File | Changes |
|------|---------|
| `src/lib.rs` | Add `mod feature;` |
| `src/routes.rs` | Add feature routes |
### Deleted Files
| File | Reason |
|------|--------|
| `src/old_impl.rs` | Replaced by new feature |
## API Design
### Public Types
```rust
/// Configuration for the feature
#[derive(Debug, Clone)]
pub struct FeatureConfig {
/// Maximum items to process
pub max_items: usize,
/// Timeout for operations
pub timeout: Duration,
}
/// Result of feature operation
#[derive(Debug)]
pub struct FeatureResult {
/// Processed items
pub items: Vec<Item>,
/// Processing statistics
pub stats: Stats,
}
/// Process items according to configuration
///
/// # Arguments
/// * `input` - Items to process
/// * `config` - Processing configuration
///
/// # Returns
/// Processed result or error
///
/// # Errors
/// Returns `FeatureError::InvalidInput` if input is empty
pub fn process(input: &[Item], config: &FeatureConfig) -> Result<FeatureResult, FeatureError>;
#[derive(Debug, thiserror::Error)]
pub enum FeatureError {
#[error("invalid input: {0}")]
InvalidInput(String),
#[error("processing timeout after {0:?}")]
Timeout(Duration),
#[error(transparent)]
Internal(#[from] anyhow::Error),
}
| Test | Location | Purpose |
|---|---|---|
test_process_empty_input | handler.rs | Verify error on empty |
test_process_valid_input | handler.rs | Happy path |
test_process_large_input | handler.rs | Performance bounds |
| Test | Location | Purpose |
|---|---|---|
test_feature_e2e | tests/feature.rs | Full flow |
test_feature_with_db | tests/feature.rs | Database integration |
proptest! {
#[test]
fn process_never_panics(input: Vec<Item>) {
let _ = process(&input, &FeatureConfig::default());
}
}
Files: src/feature/types.rs, src/feature/error.rs
Description: Define core types and error handling
Tests: Unit tests for type construction
Estimated: 2 hours
// Key code to write
pub struct FeatureConfig { ... }
pub enum FeatureError { ... }
Files: src/feature/handler.rs
Description: Implement main processing logic
Tests: Unit tests for all paths
Dependencies: Step 1
Estimated: 4 hours
Files: src/lib.rs, src/routes.rs
Description: Wire up to application
Tests: Integration tests
Dependencies: Step 2
Estimated: 2 hours
Files: README.md, inline docs
Description: User-facing documentation
Tests: Doc tests
Dependencies: Step 3
Estimated: 1 hour
If issues discovered:
Feature flag: FEATURE_ENABLED=false
-- Migration: Add feature table
CREATE TABLE features (
id UUID PRIMARY KEY,
created_at TIMESTAMP NOT NULL
);
[Steps to migrate existing data]
| Crate | Version | Justification |
|---|---|---|
| [crate] | X.Y | [Why needed] |
| Crate | From | To | Reason |
|---|---|---|---|
| [crate] | X.Y | X.Z | [Why] |
| Metric | Target | Measurement |
|---|---|---|
| Latency | < 10ms | Benchmark |
| Memory | < 1MB | Profiling |
#[bench]
fn bench_process_1000_items(b: &mut Bencher) {
let input = generate_items(1000);
b.iter(|| process(&input, &Config::default()));
}
| Item | Status | Owner |
|---|---|---|
| [Item 1] | Pending | [Name] |
## Design Techniques
### Interface-First Design
```rust
// Define the interface before implementation
pub trait FeatureService {
fn process(&self, input: Input) -> Result<Output, Error>;
}
// Implementation comes in Phase 3
// Write test signatures first
#[test]
fn should_handle_empty_input() { todo!() }
#[test]
fn should_process_valid_input() { todo!() }
#[test]
fn should_timeout_on_slow_operation() { todo!() }
Before proceeding to Phase 3 (Implementation):
After completing design, request evaluation using disciplined-quality-evaluation skill before proceeding to Phase 3.
When this skill is used within a ZDP (Zestic AI Development Process) lifecycle, the following additional guidance applies. This section can be ignored for standalone usage.
Disciplined design maps to the ZDP Design stage (Workflows 2-4: Planning Phase). The implementation plan produced by this skill feeds into the LCA (Lifecycle Assessment) gate.
When working within a ZDP lifecycle:
If available, coordinate outputs with:
/architecture -- system and ML architecture documents/acceptance-testing -- UAT strategy aligned with business scenarios/responsible-ai -- risk register populated during design/prompt-agent-spec -- agent specifications for AI components/business-scenario-design -- scenarios inform design decompositionAfter Phase 2 approval:
disciplined-specification skill
disciplined-implementation skill