// 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 again

The 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.

  1. Start with a canned rude draft.
  2. Rubric: clarity, no blame, one clear ask, under 120 words.
  3. Critic stub returns structured `{ pass, failures[] }`.
  4. Generator revises only the failing dimensions.
  5. Stop at pass or maxPasses; print draft history.
  6. 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.