Rubber Duck Review
Overview
The classic debugging trope, aimed at hallucination. The main session is the
Presenter — it did the work and holds the real reasoning (including the hedges it
never wrote down). It reconstructs the topic out loud, in its own words, to a
Listener: a spawned subagent pinned to a different-vendor model that has NOT
seen the reasoning and interrogates it adversarially. Two forces do the work:
- The Feynman effect — reconstructing the argument from scratch surfaces the
Presenter's own hand-waving before the Listener even replies.
- An unstaked skeptic — the Listener has no investment in the conclusion, so it
catches what the artifact's own self-review rationalized past.
This is a dialogue, not a static-artifact review: the Presenter reconstructs the
argument live, and the divergence between the reconstruction and the written artifact
is itself a finding.
When to use / when NOT
Use before shipping a findings doc, design, RCA, or investigation you want to be
honest — anything where a "confirmed" might be hiding an unproven leap, or a magnitude
might be hand-waved. Do NOT use for simple lookups or routine turns: it costs one+
extra model run per round and real Presenter effort. A deliberate, occasional move.
Roles
- Presenter — you, the main session. Reconstructs the topic from understanding
(NOT copy-paste), answers the Listener's probes honestly, builds the reconciliation
ledger. Ideal: reconstruct before re-reading the artifact, so the divergence
between what you believe and what you wrote is genuine; at minimum, articulate in
your own words rather than pasting the doc.
- Listener — a spawned subagent. Cross-vendor, large-window, lean. Sees the
Presenter's explanation plus the original user request (the ask, for grounding —
not the artifact or the reasoning), so it attacks the claims as articulated, which
is what exposes explanation-vs-artifact drift. Residual gap: a self-consistent
fabrication the Presenter also grounds falsely can survive — the blind Listener bounds
overclaim and inconsistency, not a mutually-consistent hallucination.
Procedure (you are the Presenter)
- Reconstruct — explain the topic in your own words: objective, key observations,
the mechanism/claim, the eliminations you ran, and the honest status. Compress to
the load-bearing claims (see constraints).
- Spawn the Listener — ONE
spawn_run, model= a large-window model from a
different vendor than your own family. task = the Listener charter (below)
with your explanation and the original user request (the ask, for grounding)
filled in. State the topic neutrally — do NOT signal which claims you think are
weak or what you expect it to find; a led listener just mirrors you.
- Wait for the
[Subagent completion event]. Do not answer for it.
- Answer with evidence, not prose — for each probe, answer by CHECKING a real
signal (data, code, source) rather than re-justifying the original wording
(re-justifying re-anchors you to the error — CoVe). Concede ONLY when the probe shows
a concrete gap or you can't ground the claim; do NOT cave to pushback alone (models
frequently reverse a correct answer under mere challenge, absent new evidence). Mark
each HELD (survived and grounded) or CONCEDE; a probe you can't ground is
itself a finding. In the reconciliation ledger a CONCEDE maps to DOWNGRADED (a
weaker-but-true wording exists) or GAP-FLAGGED (the hole needs new evidence).
- Iterate to convergence — keep running rounds while each surfaces a NEW ungrounded
claim, gap, or contradiction. Each round re-spawns the same-model Listener with a
distilled transcript (open findings + live probes, not the verbatim dialogue — a
raw transcript blows the 5000-char
task cap by round 2-3). STOP when a full round
yields nothing new and every prior finding is resolved (HELD-grounded, DOWNGRADED,
fixed, or logged as an honest OPEN gap). Convergence is the Listener running dry —
not you declaring "done" (a Presenter's self-satisfaction is the very blind spot
this skill defeats). Safety cap 8 rounds; hitting it unconverged IS a finding — report
the unresolved OPEN items. Agreement is never a stop signal; only no new grounded
objection is.
- Reconcile — build the ledger (below) against the ACTUAL artifact and propose
edits.
Constraints the live prototype exposed — READ THESE
- Listener must be LEAN + LARGE-WINDOW. Subagents inherit the full injected KiroCrew
context (skill descriptions, memory, lessons — not full skill bodies, but still
large). A small-window model overflows its context window before it can read your
task (a real prototype failure), so pin the Listener to a large-window model from a
different vendor than your Presenter's family. Trim the inheritance with
spawn_run's three flags: spawn the Listener with include_memory=false and
include_lessons=false, because the Presenter's memory and saved lessons are exactly
the reasoning the Listener must not have seen. Keep include_project=true when the
topic is code in the active project. The Listener is told which groups were withheld,
so it flags a gap rather than inventing context.
- Keep the charter + explanation compact. If the topic is large, compress the
explanation to its essential claims — do NOT paste the whole artifact, and for a
genuinely large topic write it to a file and hand the Listener the path. Compression
is a feature: stating the argument in a few hundred words is the rubber-duck
effect.
- Cross-vendor is the point. A same-family Listener tends to rationalize the way
the Presenter does (same-family models often diverge too, but cross-vendor maximizes
failure-mode diversity). Discover the live menu with
kiro-cli chat --list-models --format json; prefer large context_window_tokens, pick a different vendor than yours.
Listener charter (the task, {TOPIC_EXPLANATION} filled in)
You are the LISTENER in a "rubber duck review" — an adversarial skeptic. A presenter
explained a topic to you. You have NOT seen their doc or data — only the explanation
and the original ask below. Force honesty by LOCATING defects — name the specific claim, number, or step
that is suspect and say why; do NOT fix or rewrite anything (error-finding, not fixing,
is your job). Judge only factual support and logical validity — ignore length,
formatting, fluency, and confident tone. Separate OBSERVED from INFERRED and challenge
every inference; demand the counterfactual for any causal claim; flag n=1 / single-
sample bases; refuse "confirmed" for anything whose stated objective has not actually
moved in an experiment; attack estimated or hand-waved magnitudes; hunt internal
contradictions (a number in one place that undercuts another). Don't be agreeable. If
something is genuinely solid, say so in one line and move on — spend your effort on the
soft joints.
TOPIC EXPLANATION:
"""
{TOPIC_EXPLANATION}
"""
ORIGINAL USER REQUEST (the ask — for grounding only; NOT the artifact or reasoning):
"""
{ORIGINAL_ASK}
"""
Produce your interrogation, structured EXACTLY as:
1. HARDEST QUESTIONS — ranked numbered list. Each targets a specific claim and states
what a satisfying answer must contain.
2. SUSPECTED WEAKNESSES — bullets, each tagged with ONE of: [OVERCLAIM] / [GAP] /
[INCONSISTENCY] / [UNSUPPORTED-MAGNITUDE] / [MISSING-COUNTERFACTUAL] / [SAMPLE-SIZE].
State the claim and why it's soft.
3. VERDICT — one paragraph: is the presenter's honesty label accurate, or does it still
overclaim somewhere? Name the single weakest joint that, if it broke, would collapse
the most of the thesis.
Be concise and surgical. No preamble.
Reconciliation ledger — the Presenter's deliverable
Compare the Listener's findings against the ACTUAL artifact and classify every
challenged claim, one row each, with a proposed edit:
- HELD — survives the probe and is grounded; note why the objection fails. A
coherent-but-ungrounded claim is NOT held — downgrade or gap-flag it (a fluent
explanation must not launder an unsupported claim into HELD).
- DOWNGRADED — overstated; give the corrected, weaker-but-true wording
(e.g. "confirmed" → "leading hypothesis"; a p99.9-vs-p99.9 ratio → a paired ratio).
- GAP-FLAGGED — a real hole; say what's missing and whether it's answerable from
data on hand vs needs a new experiment.
- CONTRADICTED — internally inconsistent; name both sides.
Edit mode
Propose-only by default. Present the ledger + proposed edits; apply to the artifact
only on explicit user confirmation — findings docs are high-stakes, keep the human in
the loop. "Apply" mode edits via artifact_update / file write after sign-off.
1---2name: rubber-duck3description: Adversarial "rubber duck" review that turns explaining-out-loud into a hallucination check. The main session is the PRESENTER (it did the work — a design doc, investigation, or analysis — and holds the real reasoning) and reconstructs the topic to a LISTENER — a spawned subagent pinned to a DIFFERENT-vendor model that has NOT seen the reasoning and interrogates it adversarially, hunting inconsistencies, gaps, unsupported magnitudes, and claims stated as fact but actually inferred. Goal — artifacts that are complete, gaps that are honest, findings that are truthful. Triggers include "rubber duck this", "rubber duck review", "explain this to a skeptic", "reconcile my findings", "is my doc honest".4---56# Rubber Duck Review78## Overview910The classic debugging trope, aimed at hallucination. The **main session is the11Presenter** — it did the work and holds the real reasoning (including the hedges it12never wrote down). It reconstructs the topic *out loud, in its own words*, to a13**Listener**: a spawned subagent pinned to a **different-vendor** model that has NOT14seen the reasoning and interrogates it adversarially. Two forces do the work:15161. **The Feynman effect** — reconstructing the argument from scratch surfaces the17 Presenter's *own* hand-waving before the Listener even replies.182. **An unstaked skeptic** — the Listener has no investment in the conclusion, so it19 catches what the artifact's own self-review rationalized past.2021This is a **dialogue**, not a static-artifact review: the Presenter reconstructs the22argument live, and the divergence between the reconstruction and the written artifact23is itself a finding.2425## When to use / when NOT2627**Use** before shipping a findings doc, design, RCA, or investigation you want to be28honest — anything where a "confirmed" might be hiding an unproven leap, or a magnitude29might be hand-waved. **Do NOT use** for simple lookups or routine turns: it costs one+30extra model run per round *and* real Presenter effort. A deliberate, occasional move.3132## Roles3334- **Presenter — you, the main session.** Reconstructs the topic from understanding35 (NOT copy-paste), answers the Listener's probes honestly, builds the reconciliation36 ledger. *Ideal: reconstruct before re-reading the artifact, so the divergence37 between what you believe and what you wrote is genuine; at minimum, articulate in38 your own words rather than pasting the doc.*39- **Listener — a spawned subagent.** Cross-vendor, large-window, lean. Sees the40 Presenter's explanation plus the original user request (the *ask*, for grounding —41 not the artifact or the reasoning), so it attacks the claims *as articulated*, which42 is what exposes explanation-vs-artifact drift. Residual gap: a self-consistent43 fabrication the Presenter also grounds falsely can survive — the blind Listener bounds44 overclaim and inconsistency, not a mutually-consistent hallucination.4546## Procedure (you are the Presenter)47481. **Reconstruct** — explain the topic in your own words: objective, key observations,49 the mechanism/claim, the eliminations you ran, and the honest status. Compress to50 the load-bearing claims (see constraints).512. **Spawn the Listener** — ONE `spawn_run`, `model=` a large-window model from a52 **different vendor** than your own family. `task` = the Listener charter (below)53 with your explanation *and the original user request* (the *ask*, for grounding)54 filled in. State the topic **neutrally** — do NOT signal which claims you think are55 weak or what you expect it to find; a led listener just mirrors you.563. **Wait** for the `[Subagent completion event]`. Do not answer for it.574. **Answer with evidence, not prose** — for each probe, answer by CHECKING a real58 signal (data, code, source) rather than re-justifying the original wording59 (re-justifying re-anchors you to the error — CoVe). Concede ONLY when the probe shows60 a concrete gap or you can't ground the claim; do NOT cave to pushback alone (models61 frequently reverse a correct answer under mere challenge, absent new evidence). Mark62 each **HELD** (survived *and* grounded) or **CONCEDE**; a probe you can't ground is63 itself a finding. In the reconciliation ledger a CONCEDE maps to **DOWNGRADED** (a64 weaker-but-true wording exists) or **GAP-FLAGGED** (the hole needs new evidence).655. **Iterate to convergence** — keep running rounds while each surfaces a NEW ungrounded66 claim, gap, or contradiction. Each round re-spawns the same-model Listener with a67 **distilled** transcript (open findings + live probes, not the verbatim dialogue — a68 raw transcript blows the 5000-char `task` cap by round 2-3). STOP when a full round69 yields nothing new *and* every prior finding is resolved (HELD-grounded, DOWNGRADED,70 fixed, or logged as an honest OPEN gap). Convergence is the **Listener running dry —71 not you declaring "done"** (a Presenter's self-satisfaction is the very blind spot72 this skill defeats). Safety cap 8 rounds; hitting it unconverged IS a finding — report73 the unresolved OPEN items. Agreement is never a stop signal; only *no new grounded74 objection* is.756. **Reconcile** — build the ledger (below) against the ACTUAL artifact and propose76 edits.7778## Constraints the live prototype exposed — READ THESE7980- **Listener must be LEAN + LARGE-WINDOW.** Subagents inherit the full injected KiroCrew81 context (skill *descriptions*, memory, lessons — not full skill bodies, but still82 large). A small-window model **overflows its context window before it can read your83 task** (a real prototype failure), so pin the Listener to a large-window model from a84 different vendor than your Presenter's family. Trim the inheritance with85 `spawn_run`'s three flags: spawn the Listener with `include_memory=false` and86 `include_lessons=false`, because the Presenter's memory and saved lessons are exactly87 the reasoning the Listener must not have seen. Keep `include_project=true` when the88 topic is code in the active project. The Listener is told which groups were withheld,89 so it flags a gap rather than inventing context.90- **Keep the charter + explanation compact.** If the topic is large, **compress** the91 explanation to its essential claims — do NOT paste the whole artifact, and for a92 genuinely large topic write it to a file and hand the Listener the path. Compression93 is a feature: stating the argument in a few hundred words *is* the rubber-duck94 effect.95- **Cross-vendor is the point.** A same-family Listener *tends to* rationalize the way96 the Presenter does (same-family models often diverge too, but cross-vendor maximizes97 failure-mode diversity). Discover the live menu with `kiro-cli chat --list-models --format98 json`; prefer large `context_window_tokens`, pick a different vendor than yours.99100## Listener charter (the `task`, `{TOPIC_EXPLANATION}` filled in)101102```103You are the LISTENER in a "rubber duck review" — an adversarial skeptic. A presenter104explained a topic to you. You have NOT seen their doc or data — only the explanation105and the original ask below. Force honesty by LOCATING defects — name the specific claim, number, or step106that is suspect and say why; do NOT fix or rewrite anything (error-finding, not fixing,107is your job). Judge only factual support and logical validity — ignore length,108formatting, fluency, and confident tone. Separate OBSERVED from INFERRED and challenge109every inference; demand the counterfactual for any causal claim; flag n=1 / single-110sample bases; refuse "confirmed" for anything whose stated objective has not actually111moved in an experiment; attack estimated or hand-waved magnitudes; hunt internal112contradictions (a number in one place that undercuts another). Don't be agreeable. If113something is genuinely solid, say so in one line and move on — spend your effort on the114soft joints.115116TOPIC EXPLANATION:117"""118{TOPIC_EXPLANATION}119"""120121ORIGINAL USER REQUEST (the ask — for grounding only; NOT the artifact or reasoning):122"""123{ORIGINAL_ASK}124"""125126Produce your interrogation, structured EXACTLY as:1271. HARDEST QUESTIONS — ranked numbered list. Each targets a specific claim and states128 what a satisfying answer must contain.1292. SUSPECTED WEAKNESSES — bullets, each tagged with ONE of: [OVERCLAIM] / [GAP] /130 [INCONSISTENCY] / [UNSUPPORTED-MAGNITUDE] / [MISSING-COUNTERFACTUAL] / [SAMPLE-SIZE].131 State the claim and why it's soft.1323. VERDICT — one paragraph: is the presenter's honesty label accurate, or does it still133 overclaim somewhere? Name the single weakest joint that, if it broke, would collapse134 the most of the thesis.135Be concise and surgical. No preamble.136```137138## Reconciliation ledger — the Presenter's deliverable139140Compare the Listener's findings against the ACTUAL artifact and classify every141challenged claim, one row each, with a proposed edit:142143- **HELD** — survives the probe *and* is grounded; note why the objection fails. A144 coherent-but-ungrounded claim is NOT held — downgrade or gap-flag it (a fluent145 explanation must not launder an unsupported claim into HELD).146- **DOWNGRADED** — overstated; give the corrected, weaker-but-true wording147 (e.g. "confirmed" → "leading hypothesis"; a p99.9-vs-p99.9 ratio → a paired ratio).148- **GAP-FLAGGED** — a real hole; say what's missing and whether it's answerable from149 data on hand vs needs a new experiment.150- **CONTRADICTED** — internally inconsistent; name both sides.151152## Edit mode153154**Propose-only by default.** Present the ledger + proposed edits; apply to the artifact155only on explicit user confirmation — findings docs are high-stakes, keep the human in156the loop. "Apply" mode edits via `artifact_update` / file write *after* sign-off.