원클릭으로
specflow
Spec-driven development with executable contracts
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Spec-driven development with executable contracts
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | specflow |
| description | Spec-driven development with executable contracts |
| version | 1.0.0 |
| author | Hulupeep |
Specs that enforce themselves. Turn requirements into contracts that break the build when violated.
Spec --> Contract --> Test --> Code --> Verify
When this skill is active, Claude Code MUST:
docs/contracts/*.yml. If yes, read the contract and respect all non_negotiable rules.npm test -- contracts) and journey tests. Work is not done if tests fail.non_negotiable rules unless the user explicitly says override_contract: <contract_id>.| Type | File Pattern | Enforced By | When |
|---|---|---|---|
| Architecture | feature_architecture.yml | Pattern scan (Jest/Vitest) | Before build |
| Feature | feature_*.yml | Pattern scan (Jest/Vitest) | Before build |
| Security | security_defaults.yml | Pattern scan | Before build |
| Accessibility | accessibility_defaults.yml | Pattern scan | Before build |
| Journey | journey_*.yml | Playwright E2E | After build |
contract_meta:
id: auth_feature
version: 1
covers_reqs: [AUTH-001, AUTH-002]
rules:
non_negotiable:
- id: AUTH-001
title: "API endpoints require authMiddleware"
scope: ["src/routes/**/*.ts"]
behavior:
forbidden_patterns:
- pattern: /router\.(get|post).*\/api\//
message: "Route missing authMiddleware"
required_patterns:
- pattern: /authMiddleware/
message: "Must use authMiddleware"
auto_fix:
strategy: "add_import"
import_line: "import { authMiddleware } from '@/middleware/auth'"
CONTRACT VIOLATION: AUTH-001 - API route missing authMiddleware
File: src/routes/users.ts
Line: 42
Match: router.get('/api/users', async (req, res) => {
Only humans can override non-negotiable rules. User must say:
override_contract: <contract_id>
When overriding: explain what rule is broken, warn about consequences, ask if contract should be updated permanently.
These patterns are enforced as non-negotiable in all src/**/*.{ts,js,tsx,jsx} files (excluding tests).
Forbidden patterns:
/(password|secret|api_key|apikey|token)\s*[:=]\s*['"][^'"]{8,}['"]/i
/sk_live_[a-zA-Z0-9]{20,}/
/sk_test_[a-zA-Z0-9]{20,}/
/-----BEGIN (RSA |EC )?PRIVATE KEY-----/
/ghp_[a-zA-Z0-9]{36}/
/xoxb-[0-9]{10,}-[a-zA-Z0-9]{20,}/
Fix: Use process.env.VAR_NAME instead.
Forbidden patterns:
/query\s*\(\s*['"`].*\$\{/
/query\s*\(\s*['"`].*\+\s*\w/
/execute\s*\(\s*['"`].*\$\{/
Fix: Use parameterized queries ($1, $2).
Forbidden patterns:
/dangerouslySetInnerHTML\s*=\s*\{\s*\{\s*__html:(?!\s*(sanitize|DOMPurify|purify))/
/\.innerHTML\s*=(?!\s*['"`]<)/
Fix: Sanitize with DOMPurify before rendering.
Forbidden patterns:
/\beval\s*\(/
/new\s+Function\s*\(/
Fix: Use JSON.parse or safe alternatives.
Forbidden patterns:
/readFile(Sync)?\s*\(\s*(?!path\.join|path\.resolve|__dirname)/
/writeFile(Sync)?\s*\(\s*(?!path\.join|path\.resolve|__dirname)/
Fix: Use path.join(__dirname, 'safe-dir', path.basename(input)).
Enforced in src/**/*.{tsx,jsx} files.
Forbidden: /<img\s+(?![^>]*\balt\s*=)[^>]*\/?>/
Forbidden: /<button(?![^>]*aria-label)[^>]*>\s*<(?:svg|img|[A-Z]\w*)[^>]*\/?\s*>\s*<\/button>/
Forbidden: /<input(?![^>]*(?:aria-label|aria-labelledby|id\s*=))[^>]*>/
Forbidden: /tabIndex\s*=\s*\{?\s*[1-9]/
When: New feature needs acceptance criteria, Gherkin, and contracts.
Process:
Output: GitHub issue with Gherkin, data contracts, journey reference, and contract YAML files.
When: After implementation, before closing tickets.
Process:
Key rule: Issues with UI but no journey contract are PARTIAL at best, never PASS.
When: After implementation, before closing tickets or creating PRs.
Process:
Mandatory reporting: WHERE tests ran, WHICH tests, HOW MANY passed/failed, SKIPPED with reasons.
When: Contract tests fail. Invoked by orchestrator, never by users directly.
Scope: Only contract violations with enough YAML context to generate a fix. Never journey tests, build errors, or forbidden patterns without auto_fix hints.
Process:
Fix strategies: add_import, remove_pattern, wrap_with, replace_with
Route tasks to the optimal model tier for cost efficiency (~40-60% savings).
| Tier | Task Types |
|---|---|
| Haiku | Compliance audits, pattern matching validation, test execution and parsing, coverage checks, issue closing |
| Sonnet | Spec generation, contract YAML creation, test code generation, dependency mapping, component building, orchestration |
| Opus | Deep fix reasoning (heal-loop), complex architectural analysis |
Override in .specflow/config.json:
{
"model_routing": {
"default": "sonnet",
"overrides": {
"heal-loop": "opus",
"test-runner": "haiku"
}
}
}
All four gates must pass before work is considered complete.
npm test -- contracts
Pattern scans source code for forbidden/required patterns. Violations block the build.
npx playwright test
E2E tests verify user flows work end-to-end. Critical journeys must pass before release.
SEC-001 through SEC-005 scan for OWASP Top 10 patterns. Non-negotiable.
A11Y-001 through A11Y-004 scan for WCAG AA violations. Non-negotiable.
| Level | Meaning | Release Impact |
|---|---|---|
critical | Core user flow | Blocks release if failing |
important | Key feature | Should fix before release |
future | Planned feature | Can release without |
Never report "ready for release" if any critical journey is failing or not_tested.
Fix patterns are stored in .specflow/fix-patterns.json and scored by historical success rate.
| Tier | Confidence | Behavior |
|---|---|---|
| Platinum | >= 0.95 | Auto-apply immediately |
| Gold | >= 0.85 | Auto-apply, flag in commit message for review |
| Silver | >= 0.75 | Suggest only, do not auto-apply |
| Bronze | < 0.70 | Learning only, track for analysis |
Score rules: New patterns start at 0.50 (Silver). +0.05 per success, -0.10 per failure. Decay -0.01/week after 90 days unused. Below 0.30: archived.
Pattern entry format:
{
"id": "fix-sec-001-hardcoded-secret",
"contract_rule": "SEC-001",
"violation_signature": "Hardcoded secret detected",
"fix_strategy": "replace_with",
"fix_template": {
"find": "const KEY = \"sk_live_...\"",
"replace_pattern": "const KEY = process.env.STRIPE_SECRET_KEY"
},
"confidence": 0.50,
"tier": "silver"
}
/specflow Full autonomous loop: spec, contract, test, implement, verify
/specflow verify Contract validation only against existing contracts
/specflow spec Generate spec with REQ IDs for current issue or feature
/specflow heal Run fix loop on failing contract tests
/specflow status Render full execution dashboard (all 5 visualizations)
/specflow compile Compile CSV journeys to YAML contracts + Playwright stubs
docs/contracts/ exists. If not, create it and install default templates.docs/contracts/*.yml*.csv with journey headers)node scripts/specflow-compile.js <csv-file>Render the full execution dashboard with all 5 mandatory visualizations:
This command works at any point during wave execution. See agents/waves-controller.md for full visualization templates.
Core Loop: Spec --> Contract --> Test --> Code --> Verify
REQ ID Format: AUTH-001 (MUST), AUTH-010 (SHOULD), J-AUTH-LOGIN
Contract Files: docs/contracts/feature_*.yml, journey_*.yml
Test Files: src/__tests__/contracts/*.test.ts, tests/e2e/*.spec.ts
Commands: npm test -- contracts, npx playwright test
Override: override_contract: <contract_id>
When setting up Specflow in a new project, create this structure:
docs/
contracts/
feature_architecture.yml # ARCH rules
feature_*.yml # Feature rules
journey_*.yml # User flow DOD
security_defaults.yml # SEC-001..005
accessibility_defaults.yml # A11Y-001..004
CONTRACT_INDEX.yml # Central registry
src/
__tests__/
contracts/
*.test.ts # Contract pattern tests
tests/
e2e/
journey_*.spec.ts # Playwright journey tests
.specflow/
config.json # Model routing, overrides
fix-patterns.json # Fix pattern store
Inspired by the single-file skill packaging of forge by Ikenna N. Okpala.