# Intent / Approach / Work

A lightweight planning framework for AI-assisted coding.

## Why Structure?

AI coding assistants work best with explicit phases and human checkpoints. Without structure:
- AI hallucinates solutions before understanding the problem
- Context drifts mid-implementation
- Complexity gets papered over instead of surfaced

This framework forces **Chain of Thought** into the workflow: separate *what* from *how* from *do*.

## The Four Phases

```
Intent → [approve] → Approach → [approve] → Work → [execute] → Review → [done]
```

Human gates at every transition. Don't rubber-stamp—add a critique or constraint to prove you read it.

### Intent (what)

| Field | Purpose |
|-------|---------|
| **Problem** | What's broken or missing? |
| **Context** | What code/docs were read to understand this? |
| **Edge cases** | What could go wrong? (AI is happy-path oriented) |
| **Solution** | High-level approach, not technical |
| **Constraints** | Requirements, limits, must-haves |

### Approach (how)

| Field | Purpose |
|-------|---------|
| **Technical** | How we'll solve it |
| **Interfaces** | Types/signatures before logic |
| **Rejected alternatives** | What we considered and why not |
| **Verification** | How we'll prove success (test command, manual check) |
| **Side effects** | Security, performance, auth implications |
| **Rollback** | How to undo if it fails |
| **Non-goals** | What we will NOT touch |
| **Files** | What we'll change |

### Work (do)

- **Pre-flight check**: "I have all info needed. Missing: [X]"
- Concrete steps as checkboxes
- First step often: write the failing test
- Commit after 1-2 checkboxes (atomic commits)

### Review (verify)

- [ ] Diff matches Intent
- [ ] Verification passed (paste raw output)
- [ ] Scaffolding removed (debug prints, commented code)
- [ ] Linter passes
- [ ] Docs updated if needed

---

## Templates

### Full Template

Use when: Rule of Three triggered, security/auth/data involved, or new feature.

```markdown
## Intent
**Problem**: What's broken or missing
**Context**: Code/docs read (include versions/hashes for long sessions)
**Edge cases**: What could go wrong?
**Solution**: High-level approach (not technical)
**Constraints**: Requirements, limits, must-haves

## Approach
**Technical**: How we'll solve it
**Interfaces**: Types/signatures we'll create or modify
**Rejected alternatives**: What we considered and why not
**Verification**: How we'll prove success (prefer: specific test command)
**Side effects**: Security, performance, auth implications
**Rollback**: How to undo if it fails
**Non-goals**: What we will NOT touch

**Files**:
- path/to/file.ts (change description)

## Work
**Pre-flight**: I have all info needed. Missing: [none]

- [ ] Write failing test for X
- [ ] Implement X
- [ ] Step 3

## Review
- [ ] Diff matches Intent
- [ ] Verification passed (paste output)
- [ ] Scaffolding removed
- [ ] Linter passes
- [ ] Docs updated
```

### Medium Template

Use when: 2-3 files, straightforward change, some edge cases.

```markdown
## Intent
**Problem**: What's broken
**Solution**: How we'll fix it
**Edge cases**: What could go wrong?

## Approach
**Technical**: How we'll solve it
**Verification**: How we'll prove success

**Files**:
- path/to/file.ts (change)

## Work
- [ ] Step 1
- [ ] Step 2

## Review
- [ ] Verification passed
- [ ] Cleanup done
```

### Minimal Template

Use when: Single file, obvious fix, low risk.

```markdown
## Intent
[One-liner: what and why]

## Work
- [ ] Step 1
- [ ] Step 2
```

---

## When to Use Structure

**Rule of Three** (+ security trigger):
- Affects >3 files
- Introduces >1 new dependency
- Changes existing interface/API
- Involves security, auth, or data persistence

If any true → use full structure. Otherwise, use judgment.

---

## Workflow Mechanics

### Human Gates

Don't just click approve. Add a critique, constraint, or question. If you can't find anything wrong, you didn't read it carefully enough.

### Context Anchoring

During Work phase, re-inject Intent + Approach summary. Don't rely on chat history alone—AI will drift by step 5.

### Pivot Protocol

When Work reveals Approach was wrong:

1. **Stop** - don't hack around it
2. **Diagnose** - summarize WHY it failed
3. **Learn** - add failure as negative constraint to Intent
4. **Revert** - return to Approach phase
5. **Revise** - update Approach with new constraint

Trigger pivot if changing >2 lines of Approach to make Work succeed.

### Complexity Promotion

When a Work item grows complex:
- Promote it to its own bead with full Intent/Approach/Work
- Original checkbox becomes reference to new bead
- Max depth: 2 levels of nesting

---

## Examples

### Full: Rate Limiting Feature

```markdown
## Intent
**Problem**: API has no rate limiting, vulnerable to abuse
**Context**: Read src/middleware/auth.ts, src/routes/api.ts
**Edge cases**: Redis unavailable, clock skew, boundary conditions
**Solution**: Add per-user rate limits using sliding window
**Constraints**: <5ms latency, graceful degradation

## Approach
**Technical**: Redis sorted sets for sliding window. Middleware on /api/*.
**Interfaces**:
  interface RateLimitConfig { windowMs: number; maxRequests: number }
**Rejected alternatives**: In-memory (no multi-instance), fixed window (thundering herd)
**Verification**: npm test -- --grep "rate limit"
**Side effects**: Adds Redis dependency, clients need 429 handling
**Rollback**: Remove middleware, delete rateLimit.ts
**Non-goals**: Admin bypass, per-endpoint limits

**Files**:
- src/middleware/rateLimit.ts (new)
- src/routes/api.ts (add middleware)
- tests/rateLimit.test.ts (new)

## Work
**Pre-flight**: Have all info. Missing: none

- [ ] Write failing test for 429 response
- [ ] Implement sliding window counter
- [ ] Create middleware
- [ ] Wire to routes
- [ ] Add graceful degradation test

## Review
- [ ] 5/5 tests pass
- [ ] No debug prints
- [ ] README updated
```

### Medium: Timezone Bug Fix

```markdown
## Intent
**Problem**: Dates show "Invalid Date" for Asia/Tokyo users
**Solution**: Use UTC internally, format at display
**Edge cases**: DST transitions, pre-1970 dates

## Approach
**Technical**: Replace new Date(str) with dayjs.utc(str)
**Verification**: npm test -- --grep "formatDate" + manual TZ check

**Files**:
- src/utils/date.ts
- src/components/DateDisplay.tsx

## Work
- [ ] Add failing test with Tokyo fixture
- [ ] Fix date.ts
- [ ] Update DateDisplay
- [ ] Manual verify with TZ=Asia/Tokyo

## Review
- [ ] Tests pass
- [ ] Manual check done
```

### Minimal: Typo Fix

```markdown
## Intent
Fix "recieve" → "receive" in error message

## Work
- [ ] Update src/errors.ts:42
- [ ] Grep for other instances
```

---

## Meta-Insight

> "Intent compresses the Past, Approach compresses the Future, Work is the Decompression."

The critical success factor is **strictness of Human Gates**. Rigorous Approach review = magic Work phase. Rubber-stamp = hallucination engine.

---

## Prior Art

| Framework | Phase 1 | Phase 2 | Phase 3 | Phase 4 |
|-----------|---------|---------|---------|---------|
| GitHub Spec-Kit | Specify | Plan | Tasks | Implement |
| Amazon Kiro | Requirements | Design | Tasks | - |
| Traditional SDLC | Requirements | Design | Implementation | Testing |
| **This** | **Intent** | **Approach** | **Work** | **Review** |

## References

- [Martin Fowler: SDD Tools Comparison](https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html)
- [GitHub Spec-Kit](https://github.com/github/spec-kit)
- [Amazon Kiro](https://kiro.dev/)
- [AGENTS.md Standard](https://agents.md)
- [Addy Osmani: LLM Coding Workflow](https://addyosmani.com/blog/ai-coding-workflow/)
