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
- Specs are the source of truth - Not the code, not the comments, not verbal discussions
- AI generates implementation - From detailed requirements, not vague prompts
- Human architects, AI implements - You define structure, AI fills it in
- Phase-by-phase validation - Test after each logical chunk, not at the end
- 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:
- Fresh chat windows: Started new conversations every 4-6 hours
- Clear context: Gave AI only relevant files, not entire history
- Explicit instructions: "Read X file, implement Y exactly as specified"
- 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:
- Be extremely specific: "Line 147, variable iconType, add it to postMessage payload"
- Show code directly: Paste the exact function that needs changing
- Break the loop: If AI fails 3 times, I fix it myself
- 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:
- Constitution file: Created
.github/copilot-instructions.mdwith core rules - Repeat constraints: Remind AI of key principles in each phase
- Code reviews: Scan for violations after each checkpoint
- 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:
- Explicit simplicity: "Use the simplest approach. No abstractions unless specified."
- KISS principle: Added to constitution: "No premature optimization"
- 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)
| Activity | Hours | Percentage |
|---|---|---|
| Writing specs | 4 | 12.5% |
| AI code generation | 16 | 50% |
| Human validation & testing | 8 | 25% |
| Bug fixes (human) | 3 | 9.4% |
| Deployment setup | 1 | 3.1% |
Code Generation Breakdown
| Component | Lines of Code | AI % | Human % |
|---|---|---|---|
| SDK (packages/sdk) | 3,500 | 95% | 5% |
| CMS (apps/cms) | 5,000 | 90% | 10% |
| Server (apps/server) | 2,500 | 85% | 15% |
| BWO Tax Forms | 2,000 | 95% | 5% |
| Pulumi Infrastructure | 1,000 | 80% | 20% |
| Tests | 1,000 | 70% | 30% |
| Total | 15,000 | 90% | 10% |
Issue Resolution
| Issue Type | Occurrences | AI Fixed | Human Fixed |
|---|---|---|---|
| Type errors | 45 | 40 | 5 |
| Missing null checks | 12 | 8 | 4 |
| API contract violations | 6 | 2 | 4 |
| Performance issues | 3 | 0 | 3 |
| Security concerns | 2 | 0 | 2 |
| Architecture violations | 5 | 1 | 4 |
Productivity Comparison
| Metric | Manual | With Spec-Kit | Improvement |
|---|---|---|---|
| Dev time | 110 hours | 32 hours | 3.4x faster |
| Bugs in production | ~15-20 (estimate) | 7 | Better quality |
| Test coverage | ~60% (typical) | 80% | Higher |
| Documentation | Sparse | Comprehensive | Much 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-idattribute 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 todata/{appId}-{pageId}-{lang}.jsonvia 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:
- Start fresh chat: Copy only relevant context
- Switch models: Claude → GPT-4 → Claude
- Take a break: Let conversation reset
- 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. ThehandleSavefunction sends a postMessage to CMS but doesn't include theiconTypefield. AddiconType: this.iconTypeto 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
- Invest in good specs - 4 hours on specs saves 20 hours debugging
- Validate after every phase - Don't let AI run unsupervised
- Keep conversations short - Fresh chat every 4-6 hours
- Be specific for bug fixes - File, line number, exact change
- Maintain a constitution - Document core architectural rules
- Test continuously - Hot reload, validate immediately
- Know when to intervene - Don't fight AI for 2 hours, just code it
- 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:
- Start small - Pick one feature, not an entire app
- Write a detailed spec - User stories, acceptance criteria, edge cases
- Use AI to generate implementation - Claude, GPT-4, Copilot
- Validate continuously - Test after every logical chunk
- Know when to intervene - Fix issues manually when AI struggles
- 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.