doubt-driven-development
addyosmani/agent-skills
Soumet chaque décision non triviale à un examen antagoniste dans un nouveau contexte avant qu’elle ne soit validée, en privilégiant l’exactitude plutôt que la rapidité pour le code à haut risque ou peu familier.
...Développer toutSur le point de prendre une décision architecturale en situation d'incertitude
Quand NE PAS l'utiliser :
- Opérations mécaniques (renommage, mise en forme, déplacement de fichiers)
- Suivre une instruction utilisateur claire et sans ambiguïté
- Lecture ou synthèse de code existant
- Modifications d’une seule ligne dont l’exactitude est évidente
- Opérations purement techniques (exécution de tests, listage de fichiers)
- L'utilisateur a explicitement privilégié la rapidité à la vérification
Si vous remettez en question chaque frappe, vous ne livrerez jamais rien. Cette compétence ne s'applique qu'aux décisions non triviales telles que définies ci-dessus.
Contraintes de chargement
Cette compétence est destinée à l’orchestrateur de la session principale, où l’étape 3 (DOUTE, détaillée ci-dessous) peut donner lieu à la création d’un réviseur dans un nouveau contexte.
- N’ajoutez PAS cette compétence aux
compétencesd’un persona:frontmatter. Un persona qui suivrait l’étape 3 créerait un autre persona — ce qui constitue un anti-modèle d’orchestration explicitement interdit parreferences/orchestration-patterns.md(« les personas n’invoquent pas d’autres personas »). - Si vous vous retrouvez à appliquer cette compétence depuis le contexte d’un sous-agent (où le code Claude empêche la création imbriquée de sous-agents) : la solution privilégiée consiste à signaler à l’utilisateur que le mode « doubt-driven » ne peut pas s’exécuter de manière imbriquée et à laisser la session principale gérer cela. En dernier recours uniquement, il existe une solution de repli dégradée basée sur l’auto-questionnement : réécrivez ARTIFACT + CONTRACT sous la forme d’une nouvelle auto-invite, en établissant une séparation mentale nette par rapport à votre raisonnement précédent, puis suivez les étapes 1 à 5. Il ne s’agit pas d’une réévaluation dans un nouveau contexte (vous conservez votre propre contexte), donc marquez le résultat comme dégradé et privilégiez l’escalade dès que l’utilisateur est joignable.
Le processus
Copiez cette liste de contrôle lorsque vous appliquez cette compétence :
Cycle de doute :
- [ ] Étape 1 : AFFIRMATION — rédaction de l’affirmation + explication de son importance
- [ ] Étape 2 : EXTRACTION — isolation de l’artefact + du contrat, suppression du raisonnement
- [ ] Étape 3 : DOUTE — appel d’un réviseur en contexte frais avec une invite contradictoire
- [ ] Étape 4 : RÉCONCILIATION — classification de chaque résultat par rapport au texte de l’artefact
- [ ] Étape 5 : ARRÊT — condition d’arrêt remplie (résultats triviaux, 3 cycles ou annulation par l’utilisateur)
Étape 1 : AFFIRMATION — Mettre en évidence ce qui ressort
Formulez la décision en deux ou trois lignes :
AFFIRMATION : « La nouvelle couche de mise en cache est thread-safe dans le cadre de la
charge de travail à forte intensité de lecture décrite dans le cahier des charges. »
POURQUOI C'EST IMPORTANT : une condition de concurrence à cet endroit corrompt les données utilisateur et est
difficile à détecter lors des tests d'assurance qualité.
Si vous ne parvenez pas à formuler cette affirmation de manière aussi concise, il s’agit d’une intuition, et non d’une décision. Exprimez-la clairement avant de l’examiner en détail.
Étape 2 : EXTRAIRE — La plus petite unité révisable
Un réviseur qui aborde le sujet avec un regard neuf a besoin de l ’artefact et du contrat, pas du parcours.
- Code : le diff ou la fonction — pas le fichier entier
- Décision : la proposition en 3 à 5 phrases, ainsi que les contraintes auxquelles elle doit satisfaire
- Affirmation : l’affirmation ainsi que les preuves censées l’étayer (à distinguer du bloc « CLAIM » de l’étape 1, qui correspond à l’hypothèse de l’orchestrateur soumise à examen)
Simplifiez votre raisonnement. Si vous présentez des conclusions, on vous renverra une validation de ces conclusions. L’unité doit être suffisamment petite pour qu’un relecteur puisse la garder à l’esprit en une seule lecture — s’il s’agit d’une pull request de 500 lignes, décomposez-la d’abord.
Étape 3 : DOUTE — Faites appel à un relecteur ayant un regard neuf
La consigne donnée au relecteur doit être contradictoire. Le cadre de la question détermine la réponse.
Révision contradictoire. Trouvez ce qui ne va pas dans cet artefact.
Partez du principe que l’auteur est trop sûr de lui. Recherchez :
- Les hypothèses non formulées
- Les cas limites non traités
- Les couplages cachés ou les états partagés
- Les failles potentielles du contrat
- Les conventions existantes que cela pourrait enfreindre
- Les modes de défaillance en cas d’entrée inattendue
NE validez PAS. NE résumez PAS. Identifiez les problèmes, ou indiquez
explicitement que vous n’en avez trouvé aucun après un examen approfondi.
ARTÉFACT :
CONTRAT :
Ne transmettez que l’ARTIFACT et le CONTRAT. Ne transmettez PAS la CLAIM. Le fait de communiquer votre conclusion au réviseur l’incite à se rallier à votre avis. Le réviseur doit déterminer de manière indépendante si l’artifact satisfait au contrat.
Dans Claude Code, les évaluateurs basés sur les rôles dans agents/ partent par conception d’un contexte isolé et sont utilisables ici — voir agents/ pour la liste et la correspondance par domaine.
La prompt adversaire ci-dessus prévaut sur le modèle de réponse par défaut du persona. Les personas tels que « code-reviewer » sont conçus pour produire des verdicts équilibrés comportant à la fois des points forts et des points faibles ; une approche fondée sur le doute nécessite une sortie se limitant aux problèmes. Collez la consigne antagoniste mot pour mot dans l’invocation afin qu’elle remplace la réponse par défaut du personnage. Si la structure de réponse d’un personnage ne peut pas être remplacée proprement, recourez à un sous-agent générique avec la consigne antagoniste.
Escalade inter-modèles
Un réviseur utilisant un seul modèle partage les angles morts de l’auteur d’origine — un modèle plus « froid », doté d’une architecture différente, permet de les détecter. Le mode « Doubt-driven » est déjà activé par défaut pour les décisions non triviales ; dans ce cadre, proposer l’escalade inter-modèles fait partie de la valeur ajoutée de la compétence, et ne constitue pas une friction facultative.
Sessions interactives : toujours les proposer. Ne jamais les ignorer en silence.
Étape 1 : Demander à l’utilisateur
Après l’examen du modèle unique à l’étape 3 ci-dessus, mais avant RECONCILE, faites une pause et demandez :
« L'examen par un seul modèle est terminé. Souhaitez-vous obtenir un deuxième avis en comparant plusieurs modèles ? Options : Gemini CLI, Codex CLI, examen externe manuel (vous collez le contenu ailleurs) ou ignorer. »
Cette question est obligatoire à chaque cycle interactif de vérification — même pour les éléments qui semblent présenter peu d'enjeux. C'est l'utilisateur — et non l'agent — qui décide si le coût en vaut la peine. Le rôle de l'agent est de proposer ce choix.
Étape 2 : si l’utilisateur choisit une interface CLI — vérifier, puis exécuter
- Vérifiez que l’outil se trouve dans le PATH (
qu’il s’agisse de geminioude codex). - Testez son fonctionnement (
gemini --versionou équivalent) avant de transmettre l’invite complète — un binaire obsolète ou défectueux pourrait passerle test, mais échouer avec une entrée réelle. - Confirmez l’invocation exacte avec l’utilisateur, y compris les options requises, l’authentification et les variables d’environnement (par exemple, les clés API). Les implémentations varient ; ne faites jamais de suppositions.
- Transmettez UNIQUEMENT l’ARTIFACT + le CONTRAT + la ligne de commande adversaire. Pas de contexte de session, pas de CLAIM.
- Faites attention à l’échappement du shell. Si l’artefact contient des guillemets,
des $(...)ou des guillemets inversés, privilégiez stdin (echo … | gemini) ou un heredoc plutôt que-p "…"en ligne. En cas de doute, demandez à l’utilisateur de confirmer l’invocation avant de l’exécuter. - Transférez la sortie à l’étape 4 (RECONCILE).
N’interpolez jamais l’artefact dans un argument entre guillemets de shell. Les invites de code, de Markdown et de révision contiennent systématiquement des guillemets inversés, des $(...) et des guillemets qui risquent soit de tronquer l’invite, soit d’exécuter le shell intégré. Écrivez l’invite complète dans un fichier et redirigez-la via stdin.
Exemples de formes (vérifiez les options par rapport à votre outil installé — la syntaxe diffère selon les implémentations et les versions) :
# Écrivez d’abord la ligne de commande adversaire + ARTIFACT + CONTRACT dans un fichier temporaire.
# Transférez-la ensuite via l’entrée standard (stdin) afin que les métacaractères du shell présents dans l’artefact restent inactifs.
# Codex (le bac à sable en lecture seule empêche l’interface en ligne de commande d’écrire dans votre espace de travail) :
codex exec --sandbox read-only -C - < /tmp/doubt-prompt.md
# Gemini (« --approval-mode plan » est en lecture seule ; « -p "" » active le mode non interactif
# et la consigne est lue depuis l’entrée standard) :
gemini --approval-mode plan -p "" < /tmp/doubt-prompt.md
Un bac à sable en lecture seule est l’élément clé : un artefact de doute peut lui-même contenir des instructions (injection intentionnelle ou accidentelle de l’invite) que l’interface CLI inter-modèles exécuterait autrement sur votre espace de travail.
Étape 3 : Si l’interface CLI n’est pas disponible ou échoue
Signalez explicitement l’échec. Proposez : de l’exécuter manuellement, d’essayer un autre outil ou de passer à l’étape suivante. Ne basculez pas silencieusement vers le mode mono-modèle — l’utilisateur doit savoir que le traitement inter-modèles n’a pas eu lieu.
Étape 4 : Si l'utilisateur ignore cette étape
Signalez cette omission dans le résultat (« Poursuite de l'analyse avec les résultats d'un seul modèle uniquement ») et passez à l'étape RECONCILE. Il est acceptable de sauter cette étape ; en revanche, il ne faut pas le faire sans le signaler.
Contextes non interactifs (CI, /loop, autonomous-loop, exécutions planifiées) :
- L'analyse inter-modèles est ignorée, et cette omission doit être signalée dans la sortie : « Analyse inter-modèles ignorée : contexte non interactif. »
- N’invoquez jamais une interface CLI externe sans l’autorisation explicite de l’utilisateur — il s’agit d’une propriété de sécurité essentielle.
Le « Cross-model » entraîne un surcoût, une latence et une fragilité de l’outil. L’agent propose ce choix à chaque cycle ; l’utilisateur décide si cet artefact le justifie.
Étape 4 : RÉCONCILIATION — Intégrer les résultats
Le résultat fourni par le réviseur est une donnée, pas un verdict. C’est vous qui restez le chef d’orchestre. Relisez le texte de l’artefact à la lumière de chaque constat avant de le classer : approuver aveuglément le réviseur revient au même que de l’ignorer.
Pour chaque constat, classez-le selon l’ordre de priorité suivant (la première catégorie correspondante l’emporte) :
- Mauvaise interprétation du contrat — le relecteur a signalé un élément précisément parce que le CONTRAT que vous avez fourni n’était pas clair ou était incomplet. Corrigez d’abord le contrat, puis reclassez-le lors du cycle suivant.
- Valide + actionnable — problème réel nécessitant une modification de l’artefact. Modifiez-le, puis recommencez le cycle.
- Compromis valable — le problème est réel, mais le coût de sa correction dépasse celui de son acceptation. Documentez explicitement ce compromis afin que l’utilisateur en prenne connaissance.
- Faux positif — le réviseur a signalé un élément qui est en réalité correct dans un contexte dont il n’avait pas connaissance. Prenez-en note, passez à autre chose et posez-vous la question suivante : l’ajout de ce contexte au contrat aurait-il permis d’éviter ce faux signal ?
Un réviseur « frais » peut se tromper parce qu’il manque de contexte. Ne repoussez pas la décision simplement parce qu’il est « frais ».
Étape 5 : STOP — Boucle bornée, pas de récursivité
S'arrêter lorsque :
- l’itération suivante ne renvoie que des résultats insignifiants ou déjà pris en compte, ou
- 3 cycles sont terminés (transmettez à l'utilisateur, ne vous acharnez pas seul sur un quatrième), ou
- l'utilisateur demande explicitement de « le livrer »
Si, après 3 cycles, le relecteur continue de soulever des problèmes de fond, le produit n’est peut-être pas prêt. Signalez-le à l’utilisateur : trois cycles sans résolution constituent une information sur le produit, et non une raison de continuer à tourner en boucle.
Si 3 cycles sont « manifestement insuffisants » parce que l'artefact est volumineux : l'artefact est trop volumineux — revenez à l'étape 2 et décomposez-le. Ne relevez pas la limite.
Rationalisations courantes
| Rationalisation | Réalité |
|---|---|
| « Je suis sûr de moi, je passe l'étape du doute » | La confiance n’est pas forcément synonyme d’exactitude face à des problèmes inédits. C’est justement dans les moments de certitude que se cachent les angles morts. |
| « Faire appel à un relecteur coûte cher » | Déboguer un commit erroné en production coûte plus cher. La vérification a une portée limitée ; le bug, lui, n'en a pas. |
| « Le relecteur ne fera que chercher la petite bête » | Seulement s’il n’y a pas de cadre défini. Limitez la demande à « les problèmes qui entraîneraient un échec au regard du contrat ». |
« Je vérifierai tout à la fin avec /review » |
/review est une dernière barrière. Le fait de remettre en question permet de détecter tôt les mauvaises orientations, quand corriger le tir ne coûte pas cher. Au moment de la PR, il est trop tard. |
| « Si je remets en question chaque étape, je ne livrerai jamais rien » | Cette technique s’applique aux décisions importantes, pas à chaque frappe. Relisez la section « Quand NE PAS l’utiliser ». |
| « Deux avis valent toujours mieux qu’un seul » | Pas lorsque la seconde opinion manque de contexte et ne fait qu’ajouter du bruit. Conciliez les points de vue, ne remettez pas la décision à plus tard. |
| « Le réviseur n’était pas d’accord, donc j’avais tort » | Le relecteur ne dispose pas de votre contexte — un désaccord est une information, pas un verdict. Relisez l’artefact, classez-le, puis décidez. |
| « L'approche inter-modèles est toujours meilleure » | L’approche inter-modèles permet de détecter les angles morts qu’un modèle unique partage avec lui-même, mais elle augmente les coûts et la fragilité de l’outil. Proposez-la à chaque cycle de doute interactif : c’est l’utilisateur qui décide si l’artefact le justifie. Le rôle de l’agent est de mettre en évidence le choix, pas de le restreindre. |
| « L’utilisateur a dit oui une fois, je peux donc continuer à invoquer l’interface en ligne de commande » | Chaque invocation constitue une autorisation distincte. L’artefact, l’invite et les indicateurs changent d’un appel à l’autre — reconfirmez la commande exacte auprès de l’utilisateur avant chaque exécution. |
Signaux d’alerte
- Lancer un réviseur dans un nouveau contexte pour un simple changement de nom ou de mise en forme d’une ligne
- Considérer la sortie du réviseur comme faisant autorité sans relire le texte de l’artefact
- Effectuer plus de trois cycles sans escalader le problème vers l’utilisateur
- Demander au relecteur « Est-ce que ça va ? » au lieu de « Trouvez les problèmes »
- Ignorer ses doutes sous la pression du temps lors d’une décision à fort enjeu
- Relancer un contexte neuf sur un artefact inchangé (vous obtiendrez les mêmes résultats ; vous ne faites que gagner du temps)
- Le « théâtre du doute » (signal vérifiable): sur au moins deux cycles où le relecteur a soulevé des constatations substantielles, aucune n’a été classée comme nécessitant une action. Vous validez, vous ne remettez pas en question. Arrêtez-vous et remontez l’information.
- Ne douter qu’après avoir validé — c’est
du /review, pas du développement guidé par le doute - Codage en dur d’un appel CLI externe sans vérifier auprès de l’utilisateur que l’outil existe, qu’il est configuré et qu’il accepte cette syntaxe exacte
- Ignorer silencieusement la vérification inter-modèles dans un cycle de doute interactif. Même si cela n’est pas recommandé, l’option doit être visible. Ignorer est acceptable ; ignorer en silence ne l’est pas.
- Recourir silencieusement à une solution de secours lorsqu’une CLI externe renvoie une erreur ou est manquante — signaler l’échec et laisser l’utilisateur rediriger
- Supprimer le contrat de la contribution du réviseur
- Transmettre l’AFFIRMATION au réviseur (biais en faveur de l’accord)
Interaction avec d’autres compétences
code-review-and-quality//review: complémentaire./reviewcorrespond à un verdict a posteriori sur la PR ; l’approche « guidée par le doute » s’applique en temps réel, à chaque décision. Utilisez les deux.source-driven-development: le SDD vérifie les faits concernant les frameworks par rapport à la documentation officielle. L’approche « doubt-driven » vérifie votre raisonnement concernant l’artefact. Le SDD vérifie que l’API existe ; l’approche « doubt-driven » vérifie que vous l’avez utilisée correctement conformément au contrat.développement-piloté-par-les-tests: l’étape RED du TDD concrétise le doute — un test qui échoue est une tentative de réfutation. Lorsque le TDD s’applique, ce test qui échoue constitue l’étape du doute pour les affirmations comportementales.débogage-et-récupération-après-erreur: lorsque le relecteur met en évidence un véritable mode de défaillance, passez à la compétence de débogage pour localiser et corriger le problème.- Règles d’orchestration du dépôt (
references/orchestration-patterns.md) : cette compétence s’organise à partir de la session principale. Une persona appelant une autre persona constitue l’anti-modèle B — voir « Contraintes de chargement » ci-dessus.
Vérification
Après avoir appliqué le développement guidé par le doute :
- Chaque décision non triviale (selon la définition ci-dessus) a été explicitement désignée comme une « affirmation » avant d’être validée
- Au moins une revue dans un nouveau contexte par artefact non trivial (un test échoué produit par l’étape RED du TDD satisfait cette exigence pour les revendications comportementales, conformément à la section « Interaction avec d’autres compétences »)
- Le réviseur a reçu l’ARTÉFACT + le CONTRAT — et NON l’AFFIRMATION, ni votre raisonnement
- La consigne donnée au réviseur était de nature contradictoire (« trouver des problèmes »), et non de validation (« est-ce que c'est bien »)
- Les résultats ont été classés par rapport au texte de l’artefact (et non pas approuvés sans examen) selon l’ordre de priorité suivant : mauvaise interprétation du contrat / actionnable / compromis / bruit
- Une condition d’arrêt a été remplie (constatations insignifiantes, 3 cycles ou annulation par l’utilisateur)
- En mode interactif, la comparaison inter-modèles a été explicitement proposée à l’utilisateur (quelle que soit l’importance de l’artefact) et la réponse a été prise en compte dans le résultat
- En mode non interactif, la vérification inter-modèles a été ignorée et cette omission a été signalée
- Toute invocation externe de l’interface en ligne de commande (CLI) était précédée d’une vérification du chemin d’accès (PATH), d’un test de bon fonctionnement du binaire, d’une confirmation de la syntaxe avec l’utilisateur et d’une autorisation explicite d’exécution
---
name: doubt-driven-development
description: Subjects every non-trivial decision to a fresh-context adversarial review before it stands, prioritizing correctness over speed for high-stakes or unfamiliar code.
---
# Doubt-Driven Development
## Overview
A confident answer is not a correct one. Long sessions accumulate context that quietly turns assumptions into "facts" without anyone noticing. Doubt-driven development is the discipline of materializing a fresh-context reviewer — biased to **disprove**, not approve — before any non-trivial output stands.
This is not `/review`. `/review` is a verdict on a finished artifact. This is an in-flight posture: non-trivial decisions get cross-examined while course-correction is still cheap.
## When to Use
A decision is **non-trivial** when at least one of these is true:
- It introduces or modifies branching logic
- It crosses a module or service boundary
- It asserts a property the type system or compiler cannot verify (thread safety, idempotence, ordering, invariants)
- Its correctness depends on context the future reader cannot see
- Its blast radius is irreversible (production deploy, data migration, public API change)
Apply the skill when:
- About to make an architectural decision under uncertainty
- About to commit non-trivial code
- About to claim a non-obvious fact ("this is safe", "this scales", "this matches the spec")
- Working in code you don't fully understand
**When NOT to use:**
- Mechanical operations (renaming, formatting, file moves)
- Following a clear, unambiguous user instruction
- Reading or summarizing existing code
- One-line changes with obvious correctness
- Pure tooling operations (running tests, listing files)
- The user has explicitly asked for speed over verification
If you doubt every keystroke, you ship nothing. The skill applies only to non-trivial decisions as defined above.
## Loading Constraints
This skill is designed for the **main-session orchestrator**, where Step 3 (DOUBT, detailed below) can spawn a fresh-context reviewer.
- **Do NOT add this skill to a persona's `skills:` frontmatter.** A persona that follows Step 3 would spawn another persona — the orchestration anti-pattern explicitly forbidden by `references/orchestration-patterns.md` ("personas do not invoke other personas").
- **If you find yourself applying this skill from inside a subagent context** (where Claude Code prevents nested subagent spawn): the preferred path is to surface to the user that doubt-driven cannot run nested and let the main session handle it. As a last resort only, a degraded self-questioning fallback exists — rewrite ARTIFACT + CONTRACT as a fresh self-prompt with a hard mental separator from your prior reasoning, and walk Steps 1–5. This is **not fresh-context review** (you carry your own context with you), so flag the result as degraded and prefer escalation whenever the user is reachable.
## The Process
Copy this checklist when applying the skill:
```
Doubt cycle:
- [ ] Step 1: CLAIM — wrote the claim + why-it-matters
- [ ] Step 2: EXTRACT — isolated artifact + contract, stripped reasoning
- [ ] Step 3: DOUBT — invoked fresh-context reviewer with adversarial prompt
- [ ] Step 4: RECONCILE — classified every finding against the artifact text
- [ ] Step 5: STOP — met stop condition (trivial findings, 3 cycles, or user override)
```
### Step 1: CLAIM — Surface what stands
Name the decision in two or three lines:
```
CLAIM: "The new caching layer is thread-safe under the
read-heavy workload described in the spec."
WHY THIS MATTERS: a race here corrupts user data and is
hard to detect in QA.
```
If you can't write the claim that compactly, you have a vibe, not a decision. Surface it before scrutinizing it.
### Step 2: EXTRACT — Smallest reviewable unit
A fresh-context reviewer needs the **artifact** and the **contract**, not the journey.
- Code: the diff or the function — not the whole file
- Decision: the proposal in 3–5 sentences plus the constraints it has to satisfy
- Assertion: the claim plus the evidence that supposedly supports it (kept distinct from the Step 1 CLAIM block, which is the orchestrator's hypothesis under scrutiny)
Strip your reasoning. If you hand over conclusions, you'll get back validation of your conclusions. The unit must be small enough that a reviewer can hold it in mind in one read — if it's a 500-line PR, decompose first.
### Step 3: DOUBT — Invoke the fresh-context reviewer
The reviewer's prompt **must be adversarial**. Framing decides the answer.
```
Adversarial review. Find what is wrong with this artifact.
Assume the author is overconfident. Look for:
- Unstated assumptions
- Edge cases not handled
- Hidden coupling or shared state
- Ways the contract could be violated
- Existing conventions this might break
- Failure modes under unexpected input
Do NOT validate. Do NOT summarize. Find issues, or state
explicitly that you cannot find any after thorough examination.
ARTIFACT: <paste artifact>
CONTRACT: <paste contract>
```
**Pass ARTIFACT + CONTRACT only. Do NOT pass the CLAIM.** Handing the reviewer your conclusion biases it toward agreement. The reviewer must independently determine whether the artifact satisfies the contract.
In Claude Code, the role-based reviewers in `agents/` start with isolated context by design and are usable here — see `agents/` for the roster and per-domain match.
**The adversarial prompt above takes precedence over the persona's default response shape.** Personas like `code-reviewer` are written to produce balanced verdicts with both strengths and weaknesses; doubt-driven needs issues-only output. Paste the adversarial prompt verbatim into the invocation so it overrides the persona's default. If a persona's response shape can't be overridden cleanly, fall back to a generic subagent with the adversarial prompt.
#### Cross-model escalation
A single-model reviewer shares blind spots with the original author — a colder, different-architecture model catches them. Doubt-driven is already opt-in for non-trivial decisions, so within that scope offering cross-model is part of the skill's value, not optional friction.
**Interactive sessions: always offer. Never silently skip.**
**Step 1: Ask the user**
After the single-model review in Step 3 above, but before RECONCILE, pause and ask:
> *"Single-model review complete. Want a cross-model second opinion? Options: Gemini CLI, Codex CLI, manual external review (you paste it elsewhere), or skip."*
This question is mandatory in every interactive doubt cycle — even on artifacts that feel low-stakes. The user — not the agent — decides whether the cost is worth it. The agent's job is to surface the choice.
**Step 2: If the user picks a CLI — verify, then invoke**
1. Check the tool is in PATH (`which gemini`, `which codex`).
2. Test it works (`gemini --version` or equivalent) before passing the full prompt — a stale or broken binary may pass `which` but fail on real input.
3. Confirm the exact invocation with the user, including required flags, auth, and env vars (e.g., API keys). Implementations vary; never assume.
4. Pass ARTIFACT + CONTRACT + the adversarial prompt **only**. No session context, no CLAIM.
5. Mind shell escaping. If the artifact contains quotes, `$(...)`, or backticks, prefer stdin (`echo … | gemini`) or a heredoc over inline `-p "…"`. When in doubt, ask the user to confirm the invocation before running it.
6. Take the output into Step 4 (RECONCILE).
**Never interpolate the artifact into a shell-quoted argument.** Code, markdown, and review prompts routinely contain backticks, `$(...)`, and quote characters that will either truncate the prompt or execute embedded shell. Write the full prompt to a file and pipe it through stdin.
Example shapes (verify flags against your installed tool — syntax differs across implementations and versions):
```bash
# Write the adversarial prompt + ARTIFACT + CONTRACT to a temp file first.
# Then pipe via stdin so shell metacharacters in the artifact stay inert.
# Codex (read-only sandbox keeps the CLI from writing to your workspace):
codex exec --sandbox read-only -C <repo-path> - < /tmp/doubt-prompt.md
# Gemini ('--approval-mode plan' is read-only; '-p ""' triggers non-interactive
# mode and the prompt is read from stdin):
gemini --approval-mode plan -p "" < /tmp/doubt-prompt.md
```
A read-only sandbox is the load-bearing detail: a doubt artifact may itself contain instructions (intentional or accidental prompt injection) that the cross-model CLI would otherwise execute against your workspace.
**Step 3: If the CLI is unavailable or fails**
Surface the failure explicitly. Offer: run it manually, try a different tool, or skip. Do not silently fall back to single-model — the user should know cross-model didn't happen.
**Step 4: If the user skips**
Acknowledge the skip in the output (*"Proceeding with single-model findings only"*) and continue to RECONCILE. Skipping is fine; silent skipping is not.
**Non-interactive contexts** (CI, `/loop`, autonomous-loop, scheduled runs):
- Cross-model is **skipped**, and the skip must be **announced** in the output: *"Cross-model skipped: non-interactive context."*
- **Never invoke an external CLI without explicit user authorization** — this is a load-bearing safety property.
Cross-model adds cost, latency, and tool fragility. The agent surfaces the choice every cycle; the user decides whether this artifact warrants it.
### Step 4: RECONCILE — Fold findings back
The reviewer's output is data, not verdict. **You are still the orchestrator.** Re-read the artifact text against each finding before classifying — rubber-stamping the reviewer is the same failure mode as ignoring it.
For each finding, classify in this **precedence order** (first matching class wins):
1. **Contract misread** — reviewer flagged something specifically because the CONTRACT you provided was unclear or incomplete. Fix the contract first, re-classify on the next cycle.
2. **Valid + actionable** — real issue requiring a change to the artifact. Change it, re-loop.
3. **Valid trade-off** — issue is real but cost of fixing exceeds cost of accepting. Document the trade-off explicitly so the user sees it.
4. **Noise** — reviewer flagged something that's actually correct under context the reviewer didn't have. Note it, move on, and ask: would adding that context to the contract have prevented the false flag?
A fresh reviewer can be wrong because it lacks context. Don't defer just because it's "fresh."
### Step 5: STOP — Bounded loop, not recursion
Stop when:
- Next iteration returns only trivial or already-considered findings, **or**
- 3 cycles completed (escalate to user, don't grind a fourth alone), **or**
- User explicitly says "ship it"
If after 3 cycles the reviewer still surfaces substantive issues, the artifact may not be ready. Surface this to the user — three unresolved cycles is information about the artifact, not a reason to keep looping.
If 3 cycles is "obviously insufficient" because the artifact is large: the artifact is too big — return to Step 2 and decompose. Do not lift the bound.
## Common Rationalizations
| Rationalization | Reality |
|---|---|
| "I'm confident, skip the doubt step" | Confidence correlates poorly with correctness on novel problems. Moments of certainty are exactly when blind spots hide. |
| "Spawning a reviewer is expensive" | Debugging a wrong commit in production is more expensive. The check is bounded; the bug isn't. |
| "The reviewer will just nitpick" | Only if unscoped. Constrain the prompt to "issues that would make this fail under the contract." |
| "I'll do doubt at the end with `/review`" | `/review` is a final gate. Doubt-driven catches wrong directions early when course-correction is cheap. By PR time it's too late. |
| "If I doubt every step I'll never ship" | The skill applies to non-trivial decisions, not every keystroke. Re-read "When NOT to Use." |
| "Two opinions are always better than one" | Not when the second has less context and produces noise. Reconcile, don't defer. |
| "The reviewer disagreed so I was wrong" | The reviewer lacks your context — disagreement is information, not verdict. Re-read the artifact, classify, then decide. |
| "Cross-model is always better" | Cross-model catches blind spots a single model shares with itself, but it adds cost and tool fragility. Offer it every interactive doubt cycle — the user decides whether the artifact warrants it. The agent's job is to surface the choice, not to gate it. |
| "User said yes once, so I can keep invoking the CLI" | Each invocation is its own authorization. The artifact, the prompt, and the flags change between calls — re-confirm the exact command with the user before every run. |
## Red Flags
- Spawning a fresh-context reviewer for a one-line rename or formatting change
- Treating reviewer output as authoritative without re-reading the artifact text
- Looping >3 cycles without escalating to the user
- Prompting the reviewer with "is this good?" instead of "find issues"
- Skipping doubt under time pressure on a high-stakes decision
- Re-spawning fresh-context on an unchanged artifact (you'll get the same findings; you're stalling)
- **Doubt theater (checkable signal)**: across 2 or more cycles where the reviewer surfaced substantive findings, zero findings were classified as actionable. You are validating, not doubting. Stop and escalate.
- Doubting only after committing — that's `/review`, not doubt-driven development
- Hardcoding an external CLI invocation without confirming with the user that the tool exists, is configured, and accepts that exact syntax
- **Silently skipping cross-model in an interactive doubt cycle.** Even when not recommending it, the offer must be visible. Skipping is fine; silent skipping is not.
- Falling back silently when an external CLI errors or is missing — surface the failure and let the user redirect
- Stripping the contract from the reviewer's input
- Passing the CLAIM to the reviewer (biases toward agreement)
## Interaction with Other Skills
- **`code-review-and-quality` / `/review`**: complementary. `/review` is post-hoc PR verdict; doubt-driven is in-flight per-decision. Use both.
- **`source-driven-development`**: SDD verifies *facts about frameworks* against official docs. Doubt-driven verifies *your reasoning about the artifact*. SDD checks the API exists; doubt-driven checks you used it correctly under the contract.
- **`test-driven-development`**: TDD's RED step is doubt made concrete — a failing test is a disproof attempt. When TDD applies, that failing test *is* the doubt step for behavioral claims.
- **`debugging-and-error-recovery`**: when the reviewer surfaces a real failure mode, drop into the debugging skill to localize and fix.
- **Repo orchestration rules** (`references/orchestration-patterns.md`): this skill orchestrates from the main session. A persona calling another persona is anti-pattern B — see Loading Constraints above.
## Verification
After applying doubt-driven development:
- [ ] Every non-trivial decision (per the definition above) was named explicitly as a CLAIM before standing
- [ ] At least one fresh-context review per non-trivial artifact (a failing test produced by TDD's RED step satisfies this for behavioral claims, per Interaction with Other Skills)
- [ ] The reviewer received ARTIFACT + CONTRACT — NOT the CLAIM, NOT your reasoning
- [ ] The reviewer's prompt was adversarial ("find issues"), not validating ("is it good")
- [ ] Findings were classified against the artifact text (not rubber-stamped) using the precedence: contract misread / actionable / trade-off / noise
- [ ] A stop condition was met (trivial findings, 3 cycles, or user override)
- [ ] In interactive mode, cross-model was **explicitly offered** to the user (regardless of artifact stakes) and the response was acknowledged in the output
- [ ] In non-interactive mode, cross-model was skipped and the skip was announced
- [ ] Any external CLI invocation was preceded by a PATH check, a working-binary test, syntax confirmation with the user, and explicit authorization to run
Tous les fichiers
0 fichiersInstaller doubt-driven-development
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/addyosmani/agent-skills/tree/main/skills/doubt-driven-development # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
