| name | doubt |
| description | Use when you are about to tell the user something works, hand over a decision you feel confident about, or make a change that can't be undone โ and when a review came back suspiciously clean. Symptoms: "are you sure?", "you said that was fixed last time", nothing to report, the answer feels too tidy. Not for a routine small change; not for reviewing a finished diff โ that's `code-reviewer`; not for driving a finished change end-to-end to get evidence โ that's `qa`. Doubt tests a claim (a diagnosis, a design call, an answer), which is often not runnable code. |
MasterMind โ Doubt
You are about to hand over something you believe. Belief is not evidence
(~/.mastermind/engineering/core/rigor.md โ Report against evidence), and the check that catches a wrong
claim has to happen while the work is still moving โ not after the user has acted on it. Claim:
$ARGUMENTS.
The kernel's rule โ whatever did the work doesn't get to grade it โ is the entire mechanism here.
This applies it to a claim, not only to a diff.
The five moves
-
Claim. Write the belief you are about to act on or hand over, in one sentence: "the retry
loop now handles the expired-token case." A paragraph means several claims โ doubt them one at a
time. The claim stays with you; it is the thing under test, not context to share.
-
Extract. Split it into the artifact (the code, the design, the answer, the diagnosis) and the
contract it must satisfy (the requirement, the spec line, the invariant, the question actually
asked). If you can't write the contract down, stop and get one. Without it there is no bar, and
any reviewer defaults to grading your intent.
-
Doubt. Dispatch a reviewer in a fresh context with the artifact and the contract, nothing else.
Brief it adversarially:
Find what is wrong with this. Assume the author is overconfident. Do not validate and do not
summarize โ report what fails the contract, or state plainly that you could not find anything
after thorough examination.
Hand the artifact over via a file or stdin, never interpolated into a shell-quoted argument โ
code and prompts carry backticks, $(...), and quotes that truncate the message or execute in your
shell. A clipped artifact reviews clean for the worst reason: the flaw didn't survive the paste.
Never pass it your claim. The excuse is always "it'll review faster with the context" โ but the
context you're about to add is your conclusion, and a reviewer handed a conclusion hunts for reasons
it holds. You would be buying agreement and calling it review.
-
Reconcile. Take each finding through these in order and stop at the first that fits:
- It misread the contract โ the contract was ambiguous, not the artifact wrong. Then rewrite
the contract and run the cycle again; this class is where self-serving reconciliation hides, so
it costs a cycle rather than discarding a finding.
- Valid and actionable โ fix it.
- Valid, and a trade-off worth accepting โ park it with the reason and the cost, in writing.
- Noise โ drop it, and name which ones you dropped.
Write each verdict in one line: <finding> โ <class> ยท <reason>. Nothing else belongs in that
line โ no gratitude, no "you're absolutely right", no praise for the reviewer. Agreement language is
the tell that you settled a finding socially instead of evaluating it. A reviewer is a function, not
a colleague whose goodwill you need.
-
Stop. Bounded at three cycles, then every open finding exits as fixed ยท parked-with-a-reason ยท
blocked (handed to the human) โ the same close-out, in the same words, build step 6 runs
(~/.mastermind/skills/build/SKILL.md), including its two prohibitions.
The red flag: doubt theater
Count it, don't feel it. Across two or more cycles where the reviewer surfaced substantive findings,
how many did you classify actionable? Zero means you are validating, not doubting.
Stop the loop there. Hand the reviewer's findings to the human unreconciled, alongside your
reasoning for each, and let them adjudicate. A reviewer that keeps finding real things while you keep
finding reasons they don't apply is not evidence of a clean artifact โ it is evidence of a broken judge,
and the judge is you.
Doubt vs. code-reviewer
code-reviewer (~/.mastermind/agents/code-reviewer.md) reviews a diff that already exists, at
diff scope, and returns ranked must-fix/should-fix/nits for a human to decide on โ it proposes and never
applies. Doubt interrogates a claim still in flight, which is often not code at all: a diagnosis, a
design call, an answer, a "this works" you're one sentence from saying. It ends with your written
verdict on every finding, before the user sees anything.
When the artifact is a finished diff, that is code-reviewer โ and build step 6 already runs it.
Don't wrap one in the other.