// Foundations · ~11 min
Reflection / Self-Critique
Reach for it when: When a first draft is cheap and a second pass catches real mistakes.
// 60-second mental model
How to hold it in your head
Generate something. Criticize it against a checklist. Revise once (or twice). Ship the revision — not the first draft.
Reflection is a generate → critique → revise loop with a bounded number of passes and an explicit rubric the critic applies.
// Mini architecture
Draft → critique against rubric → revise (bounded)
┌──────────────┐
│ Task + rubric│
└──────┬───────┘
▼
┌──────────────┐
│ Generator │ → draft v1
└──────┬───────┘
▼
┌──────────────┐
│ Critic │ → issues[] vs rubric
└──────┬───────┘
│ issues empty or maxPasses?
├─ yes → Final draft
└─ no → Generator revises → Critic againThe critic never invents new goals — it only scores the draft against the rubric you gave it.
// Mini-project
Rubric-backed email rewrite (stub)
ADK-style generate + critique stubs
Goal: Rewrite a blunt outreach email until a stub critic reports zero rubric failures or hits maxPasses=2.
- Start with a canned rude draft.
- Rubric: clarity, no blame, one clear ask, under 120 words.
- Critic stub returns structured `{ pass, failures[] }`.
- Generator revises only the failing dimensions.
- Stop at pass or maxPasses; print draft history.
- Refuse a third pass even if the critic still complains.
Wire real models later. The point is bounded reflection with a rubric — not endless self-talk.
// Common failure
What goes wrong
Symptom
Endless revise loops — the critic always finds one more nit.
Fix
Hard maxPasses plus a “good enough” rule: ship when failures are only style nits, or when passes are exhausted.
// Self-reflection
Sit with this
Which of your prompts ship first drafts that a cheap critique pass would have caught?
Session only. Nothing is saved.