skills/disciplined-design/SKILL.md
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 skillsauth add terraphim/codex-skills disciplined-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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
Answer: **What if this could be easy?**
[Describe the simplest possible design that achieves the goal. If current design is more complex, justify why.]
## 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.
After Phase 2 approval:
disciplined-specification skill
disciplined-implementation skilldevelopment
Xero Accounting API integration skill. Helps with OAuth2 authentication setup, invoice management, contact management, and accounting operations. Provides guidance on rate limits, token refresh, and API best practices.
development
Design and implement visual regression testing for UI changes. Defines screenshot coverage, rendering stabilization, baseline management, and CI integration (e.g., Playwright screenshots, Percy/Chromatic). Use when UI/styling/layout changes need protection against regressions, or when adding screenshot-based tests to a web/WASM/desktop UI.
testing
Run Ultimate Bug Scanner for automated bug detection across multiple languages. Detects 1000+ bug patterns including null pointers, security vulnerabilities, async/await issues, and resource leaks. Integrates with quality-gate workflow.
testing
Comprehensive test writing, execution, and failure analysis. Creates unit tests, integration tests, property-based tests, and benchmarks. Analyzes test failures and improves test coverage.