Idea critic
Independent attack on the claim that something should be done, before
the owner sees it. Dynamic hat, not a standing bot and not a profile.
Not artifact polish, not deep-code-review, not a decision matrix. Those
run on artifacts or already-narrowed options. This runs on a plan,
architecture, process, new agent/skill/cron, or unsolicited "we should".
Persisted artifacts stay normal English. Chat may be terse. Do not vendor
a voice skill here; see
JuliusBrussee/caveman if a
project wants compressed assistant prose.
Prime directive — default to dissent, not assent
The failure mode this hat exists to kill is reflexive agreement —
"great idea", "you're right", "good call", "makes sense" — that flatters
the requester and ships a weak idea. Agreement is earned by surviving the
attack, never given by default: before you agree, you must have tried
and failed to break the claim. This holds for the owner's ideas as hard as
for the agent's own — a direct request is a reason to deliver the work
anyway, not a reason to skip the attack. Any draft reply that contains
"great", "excellent", "you're right", "good call", or "makes sense" is the
trigger to stop and run the hats first.
Attack before substantive work, not after. Writing, editing, and
committing are substantive; orientation (finding files, reading source) is
not. A critique that lands after the build is sunk cost, not a gate — this
is the evaluator step of an evaluator-optimizer loop, run up front.
Verify your own objection — the critic is a lead, not an oracle
A pushback is itself a claim, and it must survive the skeptic hat too.
Before an objection stands — "that will thrash / cost too much / collide /
there is no capacity / it is slower / it already exists" — check the
premise against current, verified state: run the query, read the file at
the pinned ref, count what is actually running now. Never dissent from a
remembered, assumed, or stale number; the most common failure is citing a
figure from earlier in the session as if it were current. A critic that
blocks good work with an out-of-date fact is a false negative dressed as
rigor — worse than no critic. If the premise cannot be verified, say so
and gather the evidence before letting the objection stand. The critic's
own findings are leads the parent re-verifies at source, never truths acted
on directly.
When to Use
Load before any of these would reach the owner:
- A recommendation, plan, architecture, or operating-model change.
- A new agent, skill, cron, or tool the owner did not already ask for.
- An unsolicited option set that asks the owner to choose.
- Agentic-delivery G0/G1 approach choice.
Don't use for: mechanical execution of already-approved work; factual
lookups; irreversible-action confirmations (those keep their human gate);
exact-revision code review; a one-file owner-requested edit.
Direct owner requests are never silently killed. Attack them, then
deliver the work and the dissent. Agent-originated recommendations
may be held or revised without bothering the owner.
Hats
One skill, three hats. Default: run all three. Do not invent a fourth.
| Hat |
Mandate |
Kill if missing |
skeptic |
Attack assumptions, inverted incentives, "what would have to be true" |
Unsupported claims presented as fact |
better-way |
Cheaper, simpler, or already-existing paths; Chesterton's fence |
No alternative considered |
kill-criteria |
When not to do it, reversibility, what reverses the rec; run a premortem — assume this has already failed badly, write why, then extract kill criteria from it (Klein, 2007) |
No stop condition |
How to run
- Classify origin.
owner-request vs agent-originated. Only the
latter may be withheld.
- Write the packet: claim, steelman (the strongest defensible
version of the claim — attack this, not a convenient weak one), origin,
blast, reversibility, evidence on hand, alternatives already rejected,
what the parent wants to tell the owner.
- Independence. Low-blast / same-turn: parent runs the three hats
and labels the verdict
inline. High-blast, unsolicited, or
owner-decision: a different context (another session, another
model, a throwaway checkout). Calling inline "independent" is a lie.
A different context alone is a weaker decorrelation than a
different model family — a model that can recognize an output as its
own tends to score it more favorably (Panickssery, Bowman & Feng,
2024; tested on GPT-4/Llama 2, not independently confirmed on every
model family). Reserve a genuinely different model/vendor for
owner-decision-grade or irreversible claims; same-model-different-
context is the floor for the highest-blast tier, not the ceiling.
- Return only the verdict schema. Invalid or missing =
HOLD.
- Act before any owner-facing message:
HOLD — do not recommend it. Owner hears nothing unless they asked.
REVISE — incorporate the attack; re-run. Do not show the original.
PASS_TO_USER — show the rec and a short dissent ledger.
- Join before claiming ready. A background critic is a hard
dependency. Pending or missing verdicts fail closed.
Verdict schema
Required keys:
verdict HOLD | REVISE | PASS_TO_USER
independence inline | independent
origin owner-request | agent-originated
claim <one sentence>
steelman the strongest defensible version of the claim
hats_run skeptic, better-way, kill-criteria
assumptions list or NONE
better_ways list or NONE
kill_criteria list or NONE
strongest_attack_survived the single sharpest objection actually tried,
and why it failed — required and non-generic
whenever verdict is PASS_TO_USER
questions_parent_must_resolve list or NONE
user_question one direct line, or NONE (never a list)
dissent_ledger short
remaining_risk short
NONE is valid for empty arrays. Missing evidence is UNVERIFIED,
never pass.
- Critics are reviewers, not evidence sources. Re-check objective claims.
owner-request + HOLD is illegal. Attack, then REVISE or
PASS_TO_USER.
steelman and strongest_attack_survived must not be empty. A
PASS_TO_USER whose strongest_attack_survived reads as generic or
performative ("none", "no issues found", "looks good") is rejected —
attacking a convenient weak reading of the claim, or recording nothing
about the attack, both defeat the point of running the hats at all
(an assigned dissent that never really attacked is measurably worse
than no critic: Nemeth, Brown & Rogers 2001, docs/standards-index.md).
Validate a machine-readable verdict:
python3 scripts/validate_verdict.py --file <verdict.json>
Exit 0 valid, 1 contract violation, 2 usage or unreadable input. The
script ships next to this file and is copied by install.sh.
Parent obligations
- Do not create a new identity, bot, or profile for this hat.
- Do not route a private
HOLD / REVISE attack to the owner for
agent-originated ideas.
- Do not ask the owner questions the parent can answer.
- After a recurring miss, patch this skill. Memory alone is not the
fix.
Pitfalls
- Duplicating code review or artifact polish.
- A fifth bot / sticky critic profile.
- Silent kill of a direct request.
- Question dumping.
- Same-brain pass labeled independent.
- Bureaucracy: if the cheaper path is "do the approved thing",
HOLD
the new process.
- Slop recs.
HOLD a recommendation whose only content is extra
docs, restyle, or a second delivery OS, unless a named defect requires
it. Prefer the existing bar.
- False-closure REVISE. Treating
REVISE as done once the objection
reads as addressed in wording, without the hats actually re-attacking
the revised claim — dissent resolved pro forma leaves people more
entrenched, not less (Nemeth, 2018).
Anti-rationalization (excuse → rebuttal)
Pre-written rebuttals to shortcuts the critic — or the parent — has not
yet taken. Close the shortcut before it is taken.
| Excuse |
Rebuttal |
| "Too small to attack." |
Blast radius is not line count. A one-line rec can still be a standing bot, a second delivery OS, or an unsigned HEAD install. |
| "Owner already wants it." |
Owner-request forbids HOLD, not the attack. Deliver the work and the dissent. |
| "Steelman later." |
Attack the strongest defensible reading now. A convenient weak reading is a fake critic. |
| "Seems right / no issues found." |
PASS_TO_USER with a generic strongest_attack_survived is rejected. Name the sharpest objection actually tried. |
| "I'll skip the hats; we already discussed it." |
Discussion is not a verdict. Missing keys = HOLD. |
| "Inline is independent enough." |
Calling inline independent is a lie. Different context is the floor; different model family is the ceiling for irreversible claims. |
Verification
- A planted unsupported claim yields
HOLD or REVISE, never
PASS_TO_USER.
scripts/validate_verdict.py rejects a missing key, illegal
owner-request+HOLD, a list-shaped user_question, an empty
steelman, and a PASS_TO_USER whose strongest_attack_survived is
empty or a generic pass phrase.
- An agent-originated
HOLD never appears in the owner-facing reply.
- No new profile or bot was created.
evals/evals.json plants owner-request-cannot-hold and
planted-unsupported-claim-hold-or-revise.
1---2name: idea-critic3description: Use when attacking a plan, architecture, process, new agent, new skill, or unsolicited "we should" before it reaches the owner. Three hats — skeptic, better-way, kill-criteria — return HOLD, REVISE, or PASS_TO_USER. Owner-request cannot HOLD. Not code review and not artifact polish. Opt-in overlay; install with --with-critic or --full.4license: MIT5---67# Idea critic89Independent attack on the *claim that something should be done*, before10the owner sees it. Dynamic hat, not a standing bot and not a profile.1112Not artifact polish, not `deep-code-review`, not a decision matrix. Those13run on artifacts or already-narrowed options. This runs on a plan,14architecture, process, new agent/skill/cron, or unsolicited "we should".1516Persisted artifacts stay normal English. Chat may be terse. Do not vendor17a voice skill here; see18[JuliusBrussee/caveman](https://github.com/JuliusBrussee/caveman) if a19project wants compressed assistant prose.2021---2223## Prime directive — default to dissent, not assent2425The failure mode this hat exists to kill is **reflexive agreement** —26"great idea", "you're right", "good call", "makes sense" — that flatters27the requester and ships a weak idea. Agreement is **earned by surviving the28attack, never given by default**: before you agree, you must have *tried29and failed* to break the claim. This holds for the owner's ideas as hard as30for the agent's own — a direct request is a reason to deliver the work31anyway, not a reason to skip the attack. Any draft reply that contains32"great", "excellent", "you're right", "good call", or "makes sense" is the33trigger to stop and run the hats first.3435Attack **before substantive work**, not after. Writing, editing, and36committing are substantive; orientation (finding files, reading source) is37not. A critique that lands after the build is sunk cost, not a gate — this38is the evaluator step of an evaluator-optimizer loop, run up front.3940## Verify your own objection — the critic is a lead, not an oracle4142A pushback is itself a claim, and it must survive the skeptic hat too.43Before an objection stands — "that will thrash / cost too much / collide /44there is no capacity / it is slower / it already exists" — **check the45premise against current, verified state**: run the query, read the file at46the pinned ref, count what is actually running now. Never dissent from a47remembered, assumed, or stale number; the most common failure is citing a48figure from earlier in the session as if it were current. A critic that49blocks good work with an out-of-date fact is a **false negative dressed as50rigor** — worse than no critic. If the premise cannot be verified, say so51and gather the evidence before letting the objection stand. The critic's52own findings are leads the parent re-verifies at source, never truths acted53on directly.5455---5657## When to Use5859Load before any of these would reach the owner:6061- A recommendation, plan, architecture, or operating-model change.62- A new agent, skill, cron, or tool the owner did not already ask for.63- An unsolicited option set that asks the owner to choose.64- Agentic-delivery G0/G1 approach choice.6566**Don't use for:** mechanical execution of already-approved work; factual67lookups; irreversible-action confirmations (those keep their human gate);68exact-revision code review; a one-file owner-requested edit.6970Direct owner requests are never silently killed. Attack them, then71deliver the work **and** the dissent. Agent-originated recommendations72may be held or revised without bothering the owner.7374---7576## Hats7778One skill, three hats. Default: run all three. Do not invent a fourth.7980| Hat | Mandate | Kill if missing |81|---|---|---|82| `skeptic` | Attack assumptions, inverted incentives, "what would have to be true" | Unsupported claims presented as fact |83| `better-way` | Cheaper, simpler, or already-existing paths; Chesterton's fence | No alternative considered |84| `kill-criteria` | When not to do it, reversibility, what reverses the rec; run a **premortem** — assume this has already failed badly, write why, then extract kill criteria from it (Klein, 2007) | No stop condition |8586---8788## How to run89901. **Classify origin.** `owner-request` vs `agent-originated`. Only the91 latter may be withheld.922. **Write the packet:** claim, **steelman** (the strongest defensible93 version of the claim — attack this, not a convenient weak one), origin,94 blast, reversibility, evidence on hand, alternatives already rejected,95 what the parent wants to tell the owner.963. **Independence.** Low-blast / same-turn: parent runs the three hats97 and labels the verdict `inline`. High-blast, unsolicited, or98 owner-decision: a **different context** (another session, another99 model, a throwaway checkout). Calling `inline` "independent" is a lie.100 A different context alone is a **weaker** decorrelation than a101 different model family — a model that can recognize an output as its102 own tends to score it more favorably (Panickssery, Bowman & Feng,103 2024; tested on GPT-4/Llama 2, not independently confirmed on every104 model family). Reserve a genuinely different model/vendor for105 owner-decision-grade or irreversible claims; same-model-different-106 context is the floor for the highest-blast tier, not the ceiling.1074. **Return only the verdict schema.** Invalid or missing = `HOLD`.1085. **Act before any owner-facing message:**109 - `HOLD` — do not recommend it. Owner hears nothing unless they asked.110 - `REVISE` — incorporate the attack; re-run. Do not show the original.111 - `PASS_TO_USER` — show the rec **and** a short dissent ledger.1126. **Join before claiming ready.** A background critic is a hard113 dependency. Pending or missing verdicts fail closed.114115---116117## Verdict schema118119Required keys:120121```text122verdict HOLD | REVISE | PASS_TO_USER123independence inline | independent124origin owner-request | agent-originated125claim <one sentence>126steelman the strongest defensible version of the claim127hats_run skeptic, better-way, kill-criteria128assumptions list or NONE129better_ways list or NONE130kill_criteria list or NONE131strongest_attack_survived the single sharpest objection actually tried,132 and why it failed — required and non-generic133 whenever verdict is PASS_TO_USER134questions_parent_must_resolve list or NONE135user_question one direct line, or NONE (never a list)136dissent_ledger short137remaining_risk short138```139140- `NONE` is valid for empty arrays. Missing evidence is `UNVERIFIED`,141 never pass.142- Critics are reviewers, not evidence sources. Re-check objective claims.143- `owner-request` + `HOLD` is illegal. Attack, then `REVISE` or144 `PASS_TO_USER`.145- `steelman` and `strongest_attack_survived` must not be empty. A146 `PASS_TO_USER` whose `strongest_attack_survived` reads as generic or147 performative ("none", "no issues found", "looks good") is rejected —148 attacking a convenient weak reading of the claim, or recording nothing149 about the attack, both defeat the point of running the hats at all150 (an assigned dissent that never really attacked is measurably worse151 than no critic: Nemeth, Brown & Rogers 2001, `docs/standards-index.md`).152153Validate a machine-readable verdict:154155```text156python3 scripts/validate_verdict.py --file <verdict.json>157```158159Exit 0 valid, 1 contract violation, 2 usage or unreadable input. The160script ships next to this file and is copied by `install.sh`.161162---163164## Parent obligations165166- Do not create a new identity, bot, or profile for this hat.167- Do not route a private `HOLD` / `REVISE` attack to the owner for168 agent-originated ideas.169- Do not ask the owner questions the parent can answer.170- After a recurring miss, patch **this** skill. Memory alone is not the171 fix.172173---174175## Pitfalls176177- Duplicating code review or artifact polish.178- A fifth bot / sticky critic profile.179- Silent kill of a direct request.180- Question dumping.181- Same-brain pass labeled independent.182- Bureaucracy: if the cheaper path is "do the approved thing", `HOLD`183 the new process.184- **Slop recs.** `HOLD` a recommendation whose only content is extra185 docs, restyle, or a second delivery OS, unless a named defect requires186 it. Prefer the existing bar.187- **False-closure REVISE.** Treating `REVISE` as done once the objection188 reads as addressed in wording, without the hats actually re-attacking189 the revised claim — dissent resolved pro forma leaves people **more**190 entrenched, not less (Nemeth, 2018).191192## Anti-rationalization (excuse → rebuttal)193194Pre-written rebuttals to shortcuts the critic — or the parent — has not195yet taken. Close the shortcut before it is taken.196197| Excuse | Rebuttal |198|---|---|199| "Too small to attack." | Blast radius is not line count. A one-line rec can still be a standing bot, a second delivery OS, or an unsigned HEAD install. |200| "Owner already wants it." | Owner-request forbids `HOLD`, not the attack. Deliver the work **and** the dissent. |201| "Steelman later." | Attack the strongest defensible reading now. A convenient weak reading is a fake critic. |202| "Seems right / no issues found." | `PASS_TO_USER` with a generic `strongest_attack_survived` is rejected. Name the sharpest objection actually tried. |203| "I'll skip the hats; we already discussed it." | Discussion is not a verdict. Missing keys = `HOLD`. |204| "Inline is independent enough." | Calling `inline` independent is a lie. Different context is the floor; different model family is the ceiling for irreversible claims. |205206---207208## Verification209210- A planted unsupported claim yields `HOLD` or `REVISE`, never211 `PASS_TO_USER`.212- `scripts/validate_verdict.py` rejects a missing key, illegal213 `owner-request`+`HOLD`, a list-shaped `user_question`, an empty214 `steelman`, and a `PASS_TO_USER` whose `strongest_attack_survived` is215 empty or a generic pass phrase.216- An agent-originated `HOLD` never appears in the owner-facing reply.217- No new profile or bot was created.218- `evals/evals.json` plants `owner-request-cannot-hold` and219 `planted-unsupported-claim-hold-or-revise`.