Skip to the document
Madhuopen lab

Build notes

Spec-Driven Development: Building ContentFlow CMS in 2 Days with AI

Madhu2 March 2026AI Development18 min read4,247 words

The Big Picture

I built an entire content management system—SDK, CMS portal, unified server, deployment infrastructure—in 2 days (32 working hours). Not a prototype. Not a proof-of-concept. A production-ready system deployed to Azure with 4 apps, 5 languages, AI translation, and image optimization.

How? By treating specifications as the primary artifact and letting AI handle 90% of the implementation.

This write-up is the unfiltered story of what worked, what didn't, and what I learned about pairing human architectural thinking with AI coding muscle.


What is Spec-Driven Development?

Traditional development flow:

Idea → Code → Test → Refactor → Deploy

Spec-driven development flow:

Idea → Comprehensive Spec → AI Implementation → Human Validation → Deploy

The key difference? You spend more time defining WHAT to build than HOW to build it.

Core Principles

  1. Specs are the source of truth - Not the code, not the comments, not verbal discussions
  2. AI generates implementation - From detailed requirements, not vague prompts
  3. Human architects, AI implements - You define structure, AI fills it in
  4. Phase-by-phase validation - Test after each logical chunk, not at the end
  5. Requirements clarity is the bottleneck - Not coding speed

What Makes It "Spec-Driven"?

You write:

  • User stories with acceptance criteria
  • API contracts with request/response schemas
  • Data models with field descriptions
  • Technical plans with file structures
  • Edge cases and error scenarios
  • Task breakdowns with dependencies

AI writes:

  • TypeScript/React/Python code
  • Unit and integration tests
  • API endpoint implementations
  • Database schemas
  • Configuration files
  • Documentation

You validate:

  • Architecture remains sound
  • Edge cases are handled
  • Performance is acceptable
  • Security is not compromised

The Spec-Kit Methodology

I developed using github's Spec-Kit approach with four phases:

┌─────────────────────────────────────────────────────────────────┐
│                    SPEC-KIT WORKFLOW                             │
└─────────────────────────────────────────────────────────────────┘

Phase 1: SPECIFY (1-2 hours)
  ↓
  Human writes comprehensive spec
  - User stories with acceptance criteria
  - Functional requirements (in scope / out of scope)
  - Edge cases and error handling
  - Success metrics
  ↓
  Output: specs/###-feature-name/spec.md
  
Phase 2: PLAN (30 min - 1 hour)
  ↓
  AI generates technical implementation plan
  - Tech stack decisions
  - File structure
  - Component hierarchy
  - API contracts
  - Data models
  ↓
  Human reviews and approves architecture
  ↓
  Output: specs/###-feature-name/plan.md
  
Phase 3: TASKS (30 min)
  ↓
  AI breaks plan into 30-50 actionable tasks
  - Sequential vs parallel execution
  - File paths for each task
  - Dependencies mapped
  - Checkpoints defined
  ↓
  Human validates task breakdown
  ↓
  Output: specs/###-feature-name/tasks.md
  
Phase 4: IMPLEMENT (8-12 hours)
  ↓
  AI generates code from tasks
  - Phase-by-phase execution
  - Human validates after each phase
  - Fix issues before proceeding
  - Build and test continuously
  ↓
  Output: Working, production-ready code

Spec Structure

Every feature spec lives in specs/{###-feature-name}/:

specs/
├── 001-contentflow-cms/
│   ├── spec.md              # User stories, requirements, edge cases
│   ├── plan.md              # Tech stack, architecture, file structure
│   ├── tasks.md             # 30-50 actionable tasks with dependencies
│   ├── data-model.md        # Entity definitions and relationships
│   └── contracts/           # API specs, test requirements
├── 002-unified-deployment/
│   ├── spec.md
│   ├── plan.md
│   └── tasks.md
├── 003-ai-translation/
│   └── ...
└── 004-ai-tooltip/
    └── ...

The Good: Massive Productivity Gains

Real Numbers from ContentFlow CMS

Development time:

  • Manual estimate: 2-3 weeks (80-120 hours)
  • With Spec-Kit: 2 days (32 hours)
  • Speedup: 4-10x faster

Code generated:

  • Lines of code: ~15,000 lines
  • AI-generated: ~13,500 lines (90%)
  • Human-written: ~1,500 lines (specs + fixes)

What AI built without issues:

  • TypeScript interfaces (100+ types)
  • React components (50+ components)
  • Zustand store logic
  • Express.js API routes
  • Pulumi infrastructure code
  • Unit test scaffolding
  • File upload logic
  • JSON parsing and validation

Where AI Excelled

✅ Boilerplate code - No more writing reducers, actions, selectors manually

✅ Repetitive patterns - Form components, CRUD endpoints, similar across files

✅ Type definitions - Perfect TypeScript interfaces from data models

✅ API implementations - Request validation, error handling, response formatting

✅ Test scaffolding - Unit test structure (human fills in assertions)

✅ Configuration files - package.json, tsconfig.json, vite.config.ts

✅ Documentation - JSDoc comments, README files, inline explanations

The Productivity Multiplier

I spent:

  • 4 hours writing specs (user stories, requirements, edge cases)
  • 28 hours on AI implementation + validation + fixes
  • Total: 32 hours for a production-ready system

Without AI, I estimate:

  • 20 hours planning and designing
  • 60 hours implementing core features
  • 20 hours writing tests
  • 10 hours documentation
  • Total: 110 hours minimum

Personal productivity gain: 3.4x

But the real gain? I didn't have to context-switch between architectural thinking and implementation details. I could stay in "architect mode" while AI handled the mechanical translation of specs into code.


The Challenges: Model Fatigue & Limitations

Let me be brutally honest: Spec-driven development is not magic. It has real, frustrating limitations.

1. Model Fatigue ("Napping" and "Yawning")

What is it?

  • Model "napping": Slow, lazy responses toward the end of long sessions
  • Model "yawning": Repetitive, generic output as conversation grows
  • Context pollution: Quality degrades with massive conversation history

Real example from my build:

Hour 1-8: AI is sharp, generates clean code, catches edge cases

// Generated flawlessly
interface ContentFlowConfig {
  appId: string;
  language: string;
  storageUrl: string;
  pages: string[];
}

Hour 16-20: AI starts to slip, makes obvious mistakes

// Generated with bugs - missing null checks
function getContent(contentId: string) {
  return store.contentMap[contentId]; // ❌ What if contentMap is undefined?
}

Hour 24-28: AI gets lazy, takes shortcuts

// Generated incomplete code
function uploadImage(file: File) {
  // TODO: Implement image upload
  return Promise.resolve("/path/to/image");
}

Why it happens:

  • Long conversation = huge context window = slower thinking
  • Model starts optimizing for speed over correctness
  • Earlier mistakes compound into later code
  • Context becomes noisy with iterations and fixes

How I handled it:

  1. Fresh chat windows: Started new conversations every 4-6 hours
  2. Clear context: Gave AI only relevant files, not entire history
  3. Explicit instructions: "Read X file, implement Y exactly as specified"
  4. Human intervention: When quality dropped, I coded it myself

2. Resistance to Fixes ("The Stubborn Model")

What is it? AI sometimes refuses to fix obvious bugs, even when pointed out explicitly.

Real example:

Me: "The icon type is not updating when I save changes. Please send the updated iconType in the postMessage."

AI (1st attempt): Adds console.log, doesn't actually fix it

Me: "Still broken. The icon doesn't change. Look at line 147 in InputHelpElement.ts"

AI (2nd attempt): Refactors unrelated code, still doesn't fix it

Me: "Stop. Read the handleSave function. It's not sending iconType in the message. Add it."

AI (3rd attempt): Finally fixes it

Why it happens:

  • AI doesn't always understand the root cause
  • AI sometimes fixates on the wrong part of code
  • AI may not have full context of how components interact
  • AI prefers to add code rather than modify existing logic

How I handled it:

  1. Be extremely specific: "Line 147, variable iconType, add it to postMessage payload"
  2. Show code directly: Paste the exact function that needs changing
  3. Break the loop: If AI fails 3 times, I fix it myself
  4. Validate immediately: Test after every change, catch regressions early

3. Architecture Drift

What is it? AI can violate architectural principles you defined earlier if not reminded constantly.

Real example from ContentFlow:

Constitution rule: "No cross-app imports. Apps communicate only through SDK."

AI generates (Hour 22):

// apps/cms/src/utils/helpers.ts
import { FormField } from '../../../bwo-tax-forms/src/types'; // ❌ VIOLATION

Why it happens:

  • AI doesn't maintain long-term architectural memory
  • Convenience wins over correctness
  • AI doesn't always read constitution.md
  • Spec constraints get lost in long conversations

How I handled it:

  1. Constitution file: Created .github/copilot-instructions.md with core rules
  2. Repeat constraints: Remind AI of key principles in each phase
  3. Code reviews: Scan for violations after each checkpoint
  4. Automated checks: ESLint rules to catch cross-app imports

4. Over-Engineering

What is it? AI sometimes adds unnecessary complexity when simple solutions exist.

Real example:

Spec: "Store content in JSON files, one per page per language"

AI generates:

// ❌ Over-engineered - created a whole versioning system
class ContentVersionManager {
  private versions: Map<string, ContentVersion[]>;
  
  saveVersion(content: Content) {
    // 50 lines of versioning logic we don't need yet
  }
}

What I actually needed:

// ✅ Simple - just save the JSON
function saveContent(content: Content) {
  fs.writeFileSync(`${appId}-${pageId}-${lang}.json`, JSON.stringify(content));
}

Why it happens:

  • AI trained on complex codebases
  • AI assumes you want "production-grade" patterns
  • AI doesn't know your phase 1 vs phase 2 scope

How I handled it:

  1. Explicit simplicity: "Use the simplest approach. No abstractions unless specified."
  2. KISS principle: Added to constitution: "No premature optimization"
  3. Review generated code: Delete unnecessary complexity after each phase

When It Works, When It Fails

✅ Spec-Driven Development Works When:

1. Problem domain is well-understood

  • CMS, CRUD apps, data pipelines, APIs
  • You've built something similar before
  • Industry has established patterns

2. Requirements are stable and comprehensive

  • You know exactly what you want
  • Edge cases documented upfront
  • Acceptance criteria clear

3. Architecture is modular

  • Components are loosely coupled
  • Clear interfaces between modules
  • Independent deployment units

4. Tech stack is predetermined

  • You chose React, TypeScript, Bun, Azure upfront
  • AI doesn't need to make stack decisions
  • Frameworks are well-documented

5. Human architect validates each phase

  • You review after every 10-15 tasks
  • You catch issues before they compound
  • You maintain mental model of system

❌ Spec-Driven Development Fails When:

1. Legacy codebase with tight coupling

  • AI can't understand complex dependencies
  • Changes break unrelated parts
  • Refactoring is risky without human judgment

2. Ambiguous or changing requirements

  • You're still figuring out what to build
  • Requirements emerge during development
  • Customer feedback changes direction

3. Complex domain logic

  • Financial calculations requiring expertise
  • Regulatory compliance with nuances
  • Business rules with exceptions and edge cases

4. Security-critical systems

  • Authentication, authorization, encryption
  • AI may miss security vulnerabilities
  • Human security review is mandatory

5. Performance-critical code

  • AI doesn't optimize for latency/throughput
  • Requires profiling and benchmarking
  • Domain-specific optimizations needed

Real Metrics from ContentFlow CMS

Let me share the actual numbers from building ContentFlow over 2 days:

Time Breakdown (32 hours total)

ActivityHoursPercentage
Writing specs412.5%
AI code generation1650%
Human validation & testing825%
Bug fixes (human)39.4%
Deployment setup13.1%

Code Generation Breakdown

ComponentLines of CodeAI %Human %
SDK (packages/sdk)3,50095%5%
CMS (apps/cms)5,00090%10%
Server (apps/server)2,50085%15%
BWO Tax Forms2,00095%5%
Pulumi Infrastructure1,00080%20%
Tests1,00070%30%
Total15,00090%10%

Issue Resolution

Issue TypeOccurrencesAI FixedHuman Fixed
Type errors45405
Missing null checks1284
API contract violations624
Performance issues303
Security concerns202
Architecture violations514

Productivity Comparison

MetricManualWith Spec-KitImprovement
Dev time110 hours32 hours3.4x faster
Bugs in production~15-20 (estimate)7Better quality
Test coverage~60% (typical)80%Higher
DocumentationSparseComprehensiveMuch better

The Workflow in Practice

Here's how I actually used Spec-Kit to build ContentFlow, hour by hour:

Day 1: Specs → Implementation

Hours 1-4: Writing Specs

specs/001-contentflow-cms/spec.md
  ✓ User Story 1: Edit text on a page (P1)
  ✓ User Story 2: SDK integration (P1)
  ✓ User Story 3: Multi-app support (P2)
  ✓ User Story 4: BWO metadata forms (P2)
  ✓ User Story 5: Image editing (P3)
  ✓ Acceptance criteria for each story
  ✓ Edge cases: malformed JSON, missing files, network errors
  ✓ Success metrics: <2s edit-to-display, <15KB SDK bundle

Hours 5-6: Generate Plan

Prompt: "/speckit.plan"
AI generates:
  ✓ Tech stack: React, TypeScript, Zustand, Vite, Bun
  ✓ File structure: packages/sdk, apps/cms, apps/demo, data/
  ✓ Component hierarchy: ContentComponent, EditorPanel, PreviewPanel
  ✓ API contracts: GET/POST /api/content/:filename
  ✓ Data model: ContentMap, ContentFile, AppConfig

Hours 7-8: Generate Tasks

Prompt: "/speckit.tasks"
AI generates:
  ✓ Phase 1: Setup (11 tasks)
  ✓ Phase 2: SDK Core (26 tasks) ← BLOCKING
  ✓ Phase 3: React Components (15 tasks)
  ✓ Phase 4: CMS UI (18 tasks)
  ✓ Phase 5: Server (12 tasks)
  ✓ Phase 6: Integration (8 tasks)
  Total: 90 tasks across 6 phases

Hours 9-16: AI Implementation (Phase 1-3)

Phase 1: Setup
  ✓ Create monorepo structure
  ✓ Add package.json, turbo.json, tsconfig
  ✓ Create data/ directory with apps.config.json
  Validation: ✓ npm install works

Phase 2: SDK Core (CRITICAL)
  ✓ Create types (ContentMap, ContentFlowConfig)
  ✓ Create Zustand store
  ✓ Create LocalJsonAdapter
  ✓ Create ContentFlowSDK.initialize()
  Validation: ✓ SDK builds, exports correct API
  Issue: Missing null checks in getContent() → AI fixed

Phase 3: React Components
  ✓ Create ContentComponent
  ✓ Create useContent hook
  ✓ Handle loading states
  Validation: ✓ Component renders defaultText, hydrates async
  Issue: Type error in props → AI fixed

Hours 17-20: CMS UI + Server

Phase 4: CMS UI
  ✓ Create PreviewPanel with iframe
  ✓ Create EditorPanel with text input
  ✓ Implement postMessage communication
  Validation: ✓ Click element → open editor
  Issue: Preview not updating → Human fixed (AI tried 3 times)

Phase 5: Server
  ✓ Create Bun server with Express
  ✓ Add GET /api/content/:filename
  ✓ Add POST /api/content/:filename
  ✓ Add image upload endpoint
  Validation: ✓ Server serves JSON, CMS saves content
  Issue: CORS not configured → AI fixed

Day 2: Deployment + Polish

Hours 21-28: Deployment Infrastructure

specs/002-unified-deployment/
  ✓ Write spec for Azure Container Apps
  ✓ AI generates Pulumi infrastructure code
  ✓ Multi-app routing (/cms, /bwo, /demo)
  ✓ Blob storage integration
  Validation: ✓ pulumi preview shows correct resources
  Issue: Managed Identity not configured → Human fixed
  
Deploy: pulumi up
  ✓ Container Apps created
  ✓ Blob storage provisioned
  ✓ CDN endpoint configured
  Status: ✅ DEPLOYED

Hours 29-32: Testing + Bug Fixes

Manual Testing:
  ✓ Edit text in CMS → saves to JSON
  ✓ Refresh demo app → shows updated text
  ✓ Upload image → optimized, uploaded to blob
  ✓ Language switching → loads correct locale
  
Bugs Found:
  1. Icon not updating after save → Human fixed
  2. Preview iframe CORS issue → AI fixed
  3. Image upload timeout → Human increased limit
  4. Translation batch not processing → AI fixed
  
Final Validation:
  ✓ All 4 apps running on Azure
  ✓ CMS editing works end-to-end
  ✓ Multi-language support functional
  Status: ✅ PRODUCTION READY

Learnings & Best Practices

After building ContentFlow with Spec-Kit, here's what I learned:

1. Write Specs Like You're Explaining to a Junior Developer

❌ Bad spec:

"The CMS should allow editing content"

✅ Good spec:

"When a CMS user hovers over an element with data-content-id attribute in the preview iframe, the element highlights. When clicked, the EditorPanel opens on the right side with the current content value pre-filled. Changes are saved to data/{appId}-{pageId}-{lang}.json via POST /api/content/:filename. If save fails, show inline error notification."

Why: AI needs concrete details. Vague specs → vague code.

2. Define Data Models Before Any Code

Always create data-model.md first:

## ContentFile

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| $meta | ContentMetadata | Yes | File metadata |
| [contentId] | string | No | Content value for contentId |

## ContentMetadata

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| appId | string | Yes | Application identifier |
| pageId | string | Yes | Page identifier |
| lang | string | Yes | Locale (e.g., "en-US") |
| version | number | Yes | Content version number |
| updatedAt | string | Yes | ISO timestamp |

Why: AI generates perfect TypeScript interfaces from tables. Saves hours of type definition.

3. Use Phase-by-Phase Validation

Don't let AI run for 8 hours straight.

Instead:

Phase 1: Setup (10 tasks) → STOP → Validate → Fix issues
Phase 2: SDK Core (15 tasks) → STOP → Validate → Fix issues
Phase 3: React Components (12 tasks) → STOP → Validate → Fix issues

Why: Issues compound. A bug in Phase 1 becomes 10 bugs in Phase 3. Catch early.

4. Keep a Constitution File

Create .github/copilot-instructions.md with core rules:

# ContentFlow Constitution

## Architectural Rules
1. Library-First: SDK has zero framework imports in core
2. No Cross-App Imports: Apps communicate only through SDK
3. Storage Abstraction: All I/O through IContentStorage
4. Content-ID as Contract: Never remove/rename contentId

## Coding Principles
5. SOLID: Single responsibility per module
6. KISS: No abstraction without concrete use case
7. Flat JSON: No deep nesting in content files
8. Default Values: Every ContentComponent has defaultText

Why: AI forgets. Constitution reminds it of key constraints.

5. Handle Model Fatigue Proactively

Signs your model is tired:

  • Responses are slower
  • Code quality drops
  • AI misses obvious bugs
  • Same mistakes repeat

What to do:

  1. Start fresh chat: Copy only relevant context
  2. Switch models: Claude → GPT-4 → Claude
  3. Take a break: Let conversation reset
  4. Human intervention: Code it yourself when quality drops

6. Be Extremely Specific for Bug Fixes

❌ Bad bug report:

"The icon doesn't update"

✅ Good bug report:

"File: packages/sdk/src/webcomponent/InputHelpElement.ts, Line 147. The handleSave function sends a postMessage to CMS but doesn't include the iconType field. Add iconType: this.iconType to the message payload so the icon updates in real-time."

Why: Vague → AI guesses wrong. Specific → AI fixes correctly.

7. Test Immediately After Each Change

Set up hot reload:

# Terminal 1: SDK hot rebuild
npm run dev --workspace=packages/sdk

# Terminal 2: App hot reload
npm run dev --workspace=apps/cms

# Validate in browser after every AI change

Why: Catch regressions immediately. Don't accumulate broken code.


Pros & Cons: The Honest Truth

Let me be completely transparent about spec-driven development:

✅ Pros

1. Massive productivity gains (3-10x) for well-scoped problems

  • I built ContentFlow in 2 days vs 2-3 weeks manual
  • AI handles boilerplate, letting me focus on architecture
  • 90% of code generated automatically

2. Comprehensive documentation as a side effect

  • Specs become living documentation
  • Every requirement is written down
  • New team members can read specs to understand system

3. Higher test coverage

  • AI generates test scaffolding
  • Specs include test requirements
  • Edge cases documented upfront

4. Consistent code quality

  • AI follows patterns strictly
  • No "I'll refactor this later" shortcuts
  • TypeScript types are complete

5. Reduced context switching

  • Stay in "architect mode" throughout
  • Don't need to drop into implementation details
  • Maintain big-picture thinking

6. Easier onboarding

  • Specs act as requirements docs
  • New developers understand "why"
  • Less tribal knowledge

❌ Cons

1. Upfront spec time (2-4 hours per feature)

  • Requires detailed thinking before coding
  • Can feel slow if you want to "just code"
  • Learning curve for writing good specs

2. Model fatigue is real

  • Quality drops after long sessions
  • Need to restart conversations
  • Some bugs require human intervention

3. AI doesn't understand context deeply

  • Misses subtle requirements
  • Can violate architecture if not reminded
  • Doesn't always fix bugs on first try

4. Over-engineering tendency

  • AI adds complexity you don't need
  • Need to actively simplify generated code
  • Review overhead increases

5. Not suitable for exploratory work

  • Hard to spec when you don't know what you want
  • Requires stable requirements
  • Changing specs mid-implementation is painful

6. Human validation is mandatory

  • Can't just "let AI run"
  • Need to review after each phase
  • Testing burden same as manual dev

7. Security and performance not guaranteed

  • AI may miss vulnerabilities
  • Doesn't optimize for latency
  • Human review critical for production

Recommendations for Using Spec-Kit

Based on my experience, here's my advice:

Start with Level 3, Not Level 4

Level 3 (Code Manager):

  • Human defines "what" and "why"
  • AI generates "how"
  • Human reviews every change in real-time
  • Better for most projects

Level 4 (Requirement-Driven):

  • Human writes comprehensive specs
  • AI implements entire features
  • Human validates at checkpoints
  • Use selectively for well-scoped work

My recommendation: Master Level 3 first. Use Level 4 only for:

  • Greenfield projects with clear scope
  • Features similar to ones you've built before
  • Tight deadlines with stable requirements
  • Boilerplate-heavy work (CRUD, forms, configs)

When to Use Spec-Kit

✅ Use Spec-Kit for:

  • Greenfield projects (start fresh)
  • Well-understood domains (CMS, CRUD, APIs)
  • Modular architecture (loose coupling)
  • Stable requirements (no moving targets)
  • Deadline pressure (need speed)

❌ Don't use Spec-Kit for:

  • Legacy refactoring (too complex)
  • Exploratory prototyping (requirements unclear)
  • Security-critical code (needs expert review)
  • Performance optimization (needs profiling)
  • Complex domain logic (requires expertise)

Best Practices

  1. Invest in good specs - 4 hours on specs saves 20 hours debugging
  2. Validate after every phase - Don't let AI run unsupervised
  3. Keep conversations short - Fresh chat every 4-6 hours
  4. Be specific for bug fixes - File, line number, exact change
  5. Maintain a constitution - Document core architectural rules
  6. Test continuously - Hot reload, validate immediately
  7. Know when to intervene - Don't fight AI for 2 hours, just code it
  8. Use version control - Commit after each validated phase

Final Thoughts: The Future of Development

Spec-driven development represents a fundamental shift in how we build software.

We're moving from:

  • Coding as the primary skill → Specification as the primary skill
  • Implementation speed as the bottleneck → Requirements clarity as the bottleneck
  • Writing code → Architecting systems
  • Junior devs write code → AI writes code, seniors architect

This doesn't mean developers become obsolete. It means our role evolves:

  • From coders to architects
  • From implementers to validators
  • From bug fixers to system designers
  • From code writers to requirement definers

The winning combination:

  • Human: Strategy, architecture, requirements, validation
  • AI: Implementation, boilerplate, tests, documentation

ContentFlow CMS proves this works. I built a production-ready system in 2 days by focusing on WHAT to build and letting AI figure out HOW.

But I also learned the limits. AI gets tired. AI makes mistakes. AI needs guidance. Human judgment remains essential.

The future isn't "AI replaces developers." It's "developers + AI build 10x faster."

Spec-driven development is one way to get there. Not the only way. But a damn effective one.


Try It Yourself

The methodology is clear. The tools are available. The results speak for themselves.

If you want to try spec-driven development:

  1. Start small - Pick one feature, not an entire app
  2. Write a detailed spec - User stories, acceptance criteria, edge cases
  3. Use AI to generate implementation - Claude, GPT-4, Copilot
  4. Validate continuously - Test after every logical chunk
  5. Know when to intervene - Fix issues manually when AI struggles
  6. Iterate and learn - Improve your spec-writing skills

The learning curve is real. The upfront work is significant. The benefits are undeniable.

You might build your next feature in 2 days instead of 2 weeks.


Methodology: Spec-Kit (Specify → Plan → Tasks → Implement) Development Time: 2 days (32 hours) for ContentFlow CMS AI Contribution: 90% of code generated from specs Productivity Gain: 3-10x faster than manual development Best For: Greenfield projects, well-defined domains, modular architectures Not For: Legacy refactoring, exploratory work, security-critical code

Status: ✅ Production-deployed on Azure Blog: madhudream.dev/spec-driven-development Repository: github.com/madhudream/contentflow-cms


Built with AI assistance using Level 4 spec-driven development. 90% of code AI-generated from comprehensive specifications. Architecture, specifications, and validation by human engineer. This blog post itself written by AI from outline and context provided by human.

Github repo

ContentFlow CMS Repository

Keep it: one sentence

What did this essay argue? Write it from memory. It is read against the essay and you see what you had.

0 words

Ask this essay

Answers come from this essay and the rest of the site, with the passages they used.