Design brief · decisions wanted

The Grading Playground
Make the data work for us

A space where production data — conversations, renewal decisions, maintenance judgments, funnel runs — flows in continuously and humans grade it 👍/👎. Grades distill into principles (repeatable common sense, not a pile of memorized do/don'ts), and principles drive prompt improvements that are tested against the graded corpus before they ship.

Every decision below is clickable and per-person — your pick is saved under your name. Pick on all eight and I'll implement exactly what you chose.

The pipeline

Five layers, two genuinely new

Most of the plumbing exists: machine grading already runs per conversation in prod (its verdicts are currently thrown away), a judge-based data-pull pipeline exists but has never run, and the conversation thread UI (with the "why did Clara say this" rationale block) is reusable as-is. What does not exist anywhere: a persisted human-verdict store, and any feedback UI.

1
Item feed
Prod data streams in: conversations, decisions, funnel runs. Machine pre-grade ranks them.
NEW
2
Verdict store
A DDB entity that persists every human 👍/👎 + why. Today no verdict survives anywhere.
NEW
3
Playground UI
The grading surface — reuses the Clara conversation thread + adds the verdict rail.
NEW
4
Principle distiller
N graded examples → few durable principles. Reconciles contradictions; bounded, versioned.
5
Prompt loop
Principles guide prompt changes; the graded corpus becomes the regression test they must pass.
In plain terms

Think of it like reviewing game film. The plays (real conversations) already get recorded — we just never kept the coach's notes. This builds the notebook, the film room, and a rule that every new playbook change has to be tested against the film before the team runs it.

Decision 1 · Layout

What the playground looks like

Two honest shapes. Both reuse the existing conversation thread component and the brand arsenal (glass cards, badges, pill tabs, Phosphor icons).

A Grading desk (three panes) Smith recommends
Playground 14 to grade
Queue
Maria G. · SMS
judge disagrees · maintenance
Renewal · unit 211
offer decision
Tour funnel · J. Cruz
sampled
Conversation
My sink is leaking again, third time this month
I'm sorry — I'll get a plumber out. Does tomorrow 9–11 work?
Why: repeat issue → skipped triage, escalated priority
Yes please
Verdict
👍
👎
Right urgencyTonePolicy
Optional note…
  • Built to clear a queue — keyboard next/prev, verdict always visible
  • Grading pace: ~10–15 items/min once warm
  • Feels like a tool you sit down in for 20 minutes
B Feed (card stream)
Playground
Maria G. · SMSjudge disagrees
My sink is leaking again…
I'll get a plumber out — tomorrow 9–11?
👍
👎
Renewal · unit 211offer decision
Offered $1,450 (+3.5%) · 12-mo · comp band $1,410–$1,480
👍
👎
  • Casual — skim on a phone, grade what catches your eye
  • Weak for full-context judgment (thread is truncated per card)
  • Better as a phone companion later than as the v1 core
In plain terms

A is a workbench: sit down, work through the pile, every grade lands with full context on screen. B is a scrolling feed like social media: easy to graze, easy to judge with half the story. Grades are only worth collecting if the grader saw the whole story.

Your pick — layout
Decision 2 · Unit of grading

What exactly gets a thumb

You said "not just conversations — flows, funnels, maintenance, renewals, overall quality." The abstraction that makes that real is a gradeable-item registry (catalog-pattern, like the metric catalog): each item type declares how it renders and what context ships with it. The question is what the thumb attaches to.

A Whole item
  • One verdict per conversation / decision / funnel run
  • Fastest to grade, coarsest signal
  • "This convo was bad" — but where?
B Per message / step
  • Thumb on any individual Clara message or pipeline step
  • Sharpest signal for the distiller
  • Slower; graders may over-focus on wording
C Both Smith recommends
  • Item-level verdict required; message-level optional
  • A 👎 item asks "which message turned it?"
  • Fast by default, sharp when it matters
In plain terms

Grading the whole conversation is like grading an essay with one letter grade. Grading each message is like margin notes on every sentence. C gives the letter grade always, and asks for one margin note only when the grade is bad — which is exactly when the note is worth writing.

Your pick — unit
Decision 3 · Verdict shape

What a grade records

This decides how useful the corpus is for principle extraction. A bare 👎 says "bad" but not why — and "why" is the raw material principles are made of.

A Bare thumbs
👍
👎
  • Zero friction, max volume
  • Distiller has to guess the why
B Thumbs + principle chips Smith recommends
👍
👎
Wrong urgencyTone offMissed contextPolicy+ new
Optional note…
  • 👎 requires ≥1 chip; chips are the growing principle vocabulary
  • "+ new" mints a candidate principle on the spot
  • ~3 seconds of friction, order-of-magnitude better signal
C Scored dimensions
Accuracy ★★★★☆
Tone ★★★☆☆
Policy ★★★★★
  • Rich but slow; raters drift on scales
  • Overkill for v1 — thumbs+chips can grow into this
In plain terms

If you only collect "bad," a machine later has to re-read everything and guess what you meant. If every "bad" comes with one tap saying which kind of bad, the lesson writes itself. The chips start from a short seed list and grow as you add new ones — the chip list literally becomes the principle list over time.

Your pick — verdict shape
Decision 4 · The queue

How items reach a human

Camellia alone produces more than anyone will hand-grade. The machine side (the prod grader + the daily-review LLM pass + the dormant judge pipeline) can pre-grade everything and decide what deserves human eyes.

A Ranked inbox Smith recommends
  • Machine flags first: judge disagrees low confidence then a random sample of greens
  • The random slice keeps the machine honest — it can't hide what it never flags
  • "Inbox zero" is a real, finishable session
B Free browse
  • Filters over everything (property, domain, date, grade)
  • Good for investigation, bad as the default — no sense of done
C Both (inbox default, browse tab)
  • A inbox is the daily surface; a browse tab for "show me all renewal convos at Camellia"
  • Slightly more UI, no new data work
In plain terms

Clara handles hundreds of things a week; a person can carefully judge maybe 30 a day. So a robot reads everything first and puts the suspicious ones on top of your pile — plus a few random normal ones, so we'd catch it if the robot's idea of "normal" drifts.

Your pick — queue
Decision 5 · Principles → prompts

How learning reaches Clara

Your constraint: principle-based, not a giant memorized do/don't list. The distiller compresses graded examples into few durable principles — reconciling contradictions into ranges instead of flip-flopping, bounded in count, versioned. The question is how a principle reaches a live prompt.

A Auto-inject
  • Principles rendered into Clara's system prompt at runtime
  • Fastest loop, scariest failure mode: a bad distill talks to customers same-day, unreviewed
B Distill → human PR
  • Distiller outputs a versioned principles doc; humans turn it into prompt PRs
  • Every PR must pass the graded corpus as a regression suite
  • Safe but the last mile stays manual forever
C Graduation ladder Smith recommends
  • Every principle starts as B (doc → reviewed PR)
  • A principle that survives N corpus re-runs + M weeks stable can be promoted to an auto-injected block — by explicit human flip, per principle
  • Same shape as the arm-gates we use everywhere else: fail-closed, deliberate promotion
In plain terms

A new lesson shouldn't go straight into Clara's mouth. It gets written down, a person reviews it, and it must pass the test built from all your past grades. Once a lesson has proven itself for weeks, you can flip a switch to let it apply automatically — one lesson at a time, never wholesale.

Your pick — learning loop
Decision 6 · v1 scope

Which item types ship first

The registry makes "everything that touches Clara" reachable — but v1 has to pick. Shipping two types (not one) is what proves the abstraction isn't secretly conversation-shaped.

A Conversations only
  • Smallest v1
  • Risk: the registry never gets tested against a non-thread shape, and "everything" quietly becomes "conversations"
B Conversations + renewal decisions Smith recommends
  • Renewal offers are discrete, high-stakes, and render as a card (offer, comps, terms) not a thread — the perfect second shape
  • Maintenance judge outputs + funnels follow as registry entries, no new UI paradigm
C Everything day one
  • Conversations, renewals, WO judge, tour funnels, email flows
  • Months before anyone grades anything — the opposite of "make the data work for us"
In plain terms

Build the shelf so it can hold any kind of box, then ship it with two different-shaped boxes to prove it. Adding box types later is cheap; discovering the shelf only fits one shape is expensive.

Your pick — v1 scope
Decision 7 · Placement

Where it lives

A Evals tab
  • 12th tab under /admin/dev/evals
  • Cheapest; but you drew the distinction yourself — evals = testing grounds, this = making data work
B First-class page Smith recommends
  • Own route (e.g. /clara/playground), sidenav entry next to Conversations
  • Signals "this is a daily habit," not a dev tool — and it's operator-facing, not admin-only
C Tab now, promote later
  • Start under dev tools, move when habit forms
  • Route moves are cheap; habit-forming in a buried tab is not
In plain terms

If grading is supposed to become a daily habit for the team, it needs a front door — not a room behind the workshop. The dev-tools evals page stays what it is: the test bench.

Your pick — placement
Decision 8 · 👎 → regression case

Does a bad grade automatically become a test?

The existing judge pipeline has a dead suggestedTestCase field — the intent existed, the wiring never did. A confirmed 👎 is exactly the raw material of an eval regression case.

A Fully automatic
  • Every 👎 auto-opens a PR adding a case to evals/datasets/
  • Zero-touch, but noisy 👎s pollute the golden set
B Draft + one-click approve Smith recommends
  • System drafts the case (anonymized) and shows it in the playground; one click ships the PR
  • The human curates the golden set without writing YAML
C Manual
  • Today's flow: read, copy, hand-write the case
  • This is the step that currently never happens — keeping it manual keeps it never happening
In plain terms

When you mark something "bad," the system should write up the practice question for you — you just approve it. From then on, every future prompt change gets quizzed on that exact mistake before it ships.

Your pick — regression minting
Under the hood

Data model + build order

The two new entities, sketched. Final shapes land in an ADR once you've picked above.

// The registry — one entry per gradeable shape (catalog-pattern)
GradeableItemType: 'conversation' | 'renewal_decision' | 'wo_judgment' | 'funnel_run' | …
  → each declares: how it renders, what context ships, which machine pre-grade applies

// The verdict — the thing that does not exist today
GradeVerdict {
  itemType, itemRef          // e.g. conversation#conv_abc, renewal#saga_123
  scope                      // 'item' | 'message:' | 'step:'
  verdict: 'up' | 'down'
  principleTags: string[]    // required ≥1 on a down (per D3-B)
  note?, grader, gradedAt
  machineGradeAtTime         // what the robot thought, frozen — so we can measure agreement
}
PhaseShipsWhy this order
0Verdict store + start persisting the machine grades that are currently thrown awayLabeled data starts accruing before any UI exists
1Playground UI (layout per D1) with conversations, ranked inbox, verdict railThe habit starts
2Second item type (per D6) + 👎→draft-regression-case (per D8)Proves the registry; grades start compounding into tests
3Principle distiller + versioned principles doc + corpus-gated prompt-PR flow (per D5)The loop closes — data now improves prompts
Anything else

Notes, changes, curveballs

Anything the options above miss — a variant you want mixed, a constraint I don't know about.

PropFlow Docs