doubt-driven-development
addyosmani/agent-skills
Каждое нетривиальное решение подвергается проверке в новом контексте с учетом противоположных точек зрения, прежде чем оно будет утверждено, при этом в случае кода, от которого зависит многое, или незнакомого кода приоритет отдается корректности, а не скорости.
...Расширить всеСобираетесь принять архитектурное решение в условиях неопределённости
Когда НЕ следует использовать:
- Механические операции (переименование, форматирование, перемещение файлов)
- Выполнение чётких и однозначных инструкций пользователя
- Чтение или обобщение существующего кода
- Однострочные изменения с очевидной правильностью
- Чисто инструментальные операции (запуск тестов, вывод списка файлов)
- Пользователь явно предпочёл скорость проверке
Если вы сомневаетесь в каждом нажатии клавиши, вы ничего не выпустите. Этот навык применим только к нетривиальным решениям, как определено выше.
Ограничения при загрузке
Этот навык предназначен для координатора основной сессии, где на этапе 3 (СОМНЕНИЕ, подробно описанном ниже) может запускаться рецензент с новым контекстом.
- НЕ добавляйте этот навык в
набор навыковперсонажа:frontmatter. Персонаж, следующий шагу 3, создаст другого персонажа — это антипаттерн оркестрации, явно запрещённый вфайле references/orchestration-patterns.md(«персонажи не вызывают других персонажей»). - Если вы обнаружите, что применяете этот навык из контекста субагента (где Claude Code предотвращает вложенное создание субагентов): предпочтительным путем является уведомить пользователя о том, что «doubt-driven» не может работать вложенно, и позволить основной сессии справиться с этим. Только в крайнем случае существует упрощённый резервный вариант самоанализа — переформулируйте ARTIFACT + CONTRACT в виде нового самозапроса с чётким ментальным разграничением от вашего предыдущего рассуждения и выполните шаги 1–5. Это не является пересмотром в новом контексте (вы несете свой собственный контекст с собой), поэтому помечайте результат как ухудшенный и отдавайте предпочтение эскалации, когда пользователь доступен.
Процесс
Скопируйте этот чек-лист при применении навыка:
Цикл сомнений:
- [ ] Шаг 1: УТВЕРЖДЕНИЕ — сформулировал утверждение + объяснил, почему это важно
- [ ] Шаг 2: ВЫДЕЛЕНИЕ — выделил артефакт + контракт, исключил обоснование
- [ ] Шаг 3: СОМНЕНИЕ — обратился к рецензенту со свежим контекстом с провокационным запросом
- [ ] Шаг 4: СОГЛАСОВАНИЕ — классифицировал каждый результат в сопоставлении с текстом артефакта
- [ ] Шаг 5: ОСТАНОВКА — выполнено условие остановки (тривиальные результаты, 3 цикла или отмена пользователем)
Шаг 1: УТВЕРЖДЕНИЕ — выявление того, что остаётся
Опишите решение в двух-трёх строках:
УТВЕРЖДЕНИЕ: «Новый уровень кэширования является потокобезопасным при
нагрузке с интенсивным чтением, описанной в спецификации».
ПОЧЕМУ ЭТО ВАЖНО: гонка доступа в данном случае приводит к повреждению пользовательских данных и
трудно обнаруживается при контроле качества.
Если вы не можете сформулировать утверждение столь лаконично, у вас есть лишь догадка, а не решение. Сформулируйте его, прежде чем подвергать тщательному анализу.
Шаг 2: ВЫДЕЛЕНИЕ — Наименьшая единица для рецензирования
Рецензенту, не знакомому с контекстом, нужны артефакт и контракт, а не весь путь его создания.
- Код: разница или функция — а не весь файл
- Решение: предложение в 3–5 предложениях плюс ограничения, которым оно должно удовлетворять
- Утверждение: утверждение плюс доказательства, которые, предположительно, его подтверждают (отдельно от блока «УТВЕРЖДЕНИЕ» на этапе 1, представляющего собой гипотезу оркестратора, подвергаемую критическому анализу)
Упростите своё обоснование. Если вы предоставите готовые выводы, то в ответ получите лишь подтверждение этих выводов. Раздел должен быть достаточно небольшим, чтобы рецензент мог удержать его в памяти за одно прочтение — если это PR на 500 строк, сначала разбейте его на части.
Шаг 3: СОМНЕНИЕ — Привлеките рецензента со свежим взглядом
Задание для рецензента должно быть постанов кой задачи в духе «противника». Формулировка задачи определяет ответ.
Конфронтационная рецензия. Найдите, что не так с этим артефактом.
Предполагайте, что автор слишком самоуверен. Ищите:
- Невысказанные допущения
- Необработанные пограничные случаи
- Скрытую связность или общее состояние
- Способы, которыми может быть нарушен контракт
- Существующие конвенции, которые это может нарушить
- Режимы сбоев при неожиданных входных данных
НЕ проводите валидацию. НЕ делайте резюме. Найдите проблемы или
явно укажите, что после тщательного изучения вы не обнаружили никаких.
АРТЕФАКТ:
КОНТРАКТ:
Передавайте ТОЛЬКО АРТЕФАКТ + КОНТРАКТ. НЕ передавайте УТВЕРЖДЕНИЕ. Передача рецензенту вашего заключения склоняет его к согласию. Рецензент должен самостоятельно определить, соответствует ли артефакт контракту.
В Claude Code рецензенты на основе ролей в каталоге agents/ по замыслу работают с изолированным контекстом и могут использоваться в данном случае — см. каталог agents/ для списка рецензентов и сопоставления по доменам.
Приведенный выше противнический промпт имеет приоритет над стандартной формой ответа персонажа. Персонажи, такие как code-reviewer, написаны так, чтобы выдавать сбалансированные вердикты, содержащие как сильные, так и слабые стороны; в случае сомнений требуется вывод, содержащий только проблемы. Вставьте провокационную подсказку дословно в вызов, чтобы она переопределила настройки по умолчанию персонажа. Если структуру ответа персонажа невозможно чисто переопределить, воспользуйтесь общим субагентом с этой провокационной подсказкой.
Эскалация между моделями
Рецензент, использующий одну модель, имеет те же «слепые зоны», что и автор текста — их выявляет более «непредвзятая» модель с иной архитектурой. Режим «Doubt-driven» уже включен по умолчанию для принятия нетривиальных решений, поэтому в рамках этого контекста предложение межмодельного подхода является частью ценности данного навыка, а не дополнительным препятствием.
Интерактивные сессии: всегда предлагайте. Никогда не пропускайте их без предупреждения.
Шаг 1: Спросите пользователя
После проверки одной модели на этапе 3 выше, но перед этапом «RECONCILE», сделайте паузу и спросите:
«Проверка по одной модели завершена. Хотите получить второе мнение по нескольким моделям? Варианты: Gemini CLI, Codex CLI, ручная внешняя проверка (вы вставляете текст в другое место) или пропустить».
Этот вопрос является обязательным в каждом интерактивном цикле проверки — даже в отношении артефактов, которые кажутся малозначимыми. Пользователь — а не агент — решает, оправданы ли затраты. Задача агента — предложить этот выбор.
Шаг 2: Если пользователь выбирает CLI — проверьте, а затем запустите
- Убедитесь,
чтоинструмент находится в PATH (gemini,codex). - Проверьте, работает ли он (
gemini --versionили эквивалент), прежде чем передавать полный запрос — устаревший или поврежденный бинарник может пройтипроверку, но дать сбой при реальной вводной информации. - Уточните у пользователя точный вариант вызова, включая необходимые флаги, авторизацию и переменные среды (например, ключи API). Реализации могут различаться; никогда не делайте предположений.
- Передавайте ТОЛЬКО АРТЕФАКТ + КОНТРАКТ + вредоносный запрос. Никакого контекста сеанса, никакого ЗАЯВЛЕНИЯ.
- Учитывайте экранирование оболочки. Если артефакт содержит кавычки,
$(...)или обратные кавычки, отдавайте предпочтение stdin (echo … | gemini) или heredoc вместо встроенного-p "…". В случае сомнений попросите пользователя подтвердить вызов перед его запуском. - Перенесите вывод в Шаг 4 (RECONCILE).
Никогда не вставляйте артефакт в аргумент, заключённый в кавычки оболочки. Запросы кода, Markdown и ревью обычно содержат обратные кавычки, $(...) и символы кавычек, которые либо обрежут запрос, либо запустят встроенную оболочку. Запишите полный запрос в файл и передайте его через stdin.
Примеры форм (проверьте флаги на совместимость с вашим установленным инструментом — синтаксис различается в разных реализациях и версиях):
# Сначала запишите вредоносную подсказку + АРТЕФАКТ + КОНТРАКТ во временный файл.
# Затем передайте его через stdin, чтобы метасимволы оболочки в артефакте оставались неактивными.
# Codex (песочница в режиме «только для чтения» не позволяет CLI записывать данные в вашу рабочую область):
codex exec --sandbox read-only -C - < /tmp/doubt-prompt.md
# Gemini (параметр «--approval-mode plan» работает только в режиме «только для чтения»; «-p ""» запускает неинтерактивный
# режим, и подсказка считывается из stdin):
gemini --approval-mode plan -p "" < /tmp/doubt-prompt.md
Песочница в режиме «только для чтения» — это ключевой момент: артефакт сомнения может сам по себе содержать инструкции (намеренную или случайную вставку подсказки), которые в противном случае межмодельный CLI выполнил бы в вашем рабочем пространстве.
Шаг 3: Если CLI недоступна или даёт сбой
Явно сообщите об ошибке. Предложите: запустить вручную, попробовать другой инструмент или пропустить. Не переключайтесь молча на одномодельный режим — пользователь должен знать, что межмодельное взаимодействие не состоялось.
Шаг 4: Если пользователь пропускает
Укажите в выводе, что этап был пропущен («Продолжаем работу только с результатами для одной модели»), и перейдите к этапу RECONCILE. Пропуск допустим; скрытый пропуск — нет.
Неинтерактивные контексты (CI, /loop, autonomous-loop, запланированные запуски):
- Межмодельный анализ пропускается, и об этом пропуске должно быть указано в выводе: «Межмодельный анализ пропущен: неинтерактивный контекст».
- Никогда не вызывайте внешний CLI без явного разрешения пользователя — это критически важное свойство безопасности.
Межмодельная проверка увеличивает затраты, задержку и уязвимость инструмента. Агент выводит предложение о выборе в каждом цикле; пользователь решает, оправдывает ли данный артефакт его запуск.
Шаг 4: СВЯЗЫВАНИЕ — интеграция результатов
Результат работы рецензента — это данные, а не вердикт. Вы по-прежнему остаётесь координатором. Перед классификацией ещё раз прочитайте текст артефакта в свете каждого вывода — автоматическое одобрение рецензента является таким же источником ошибок, как и его игнорирование.
Для каждого вывода классифицируйте в следующем порядке приоритета (первая подходящая категория имеет преимущество):
- Неправильное толкование контракта — рецензент выделил что-то именно потому, что предоставленный вами КОНТРАКТ был неясным или неполным. Сначала исправьте контракт, а в следующем цикле переклассифицируйте.
- Допустимо + требует действий — реальная проблема, требующая изменения артефакта. Внесите изменения, повторите цикл.
- Обоснованный компромисс — проблема реальна, но затраты на исправление превышают затраты на ее принятие. Четко задокументируйте этот компромисс, чтобы пользователь мог его увидеть.
- Шум — рецензент отметил что-то, что на самом деле является правильным в контексте, которого у него не было. Отметьте это, двигайтесь дальше и спросите себя: помогло бы добавление этого контекста в контракт предотвратить ложную отметку?
Новый рецензент может ошибаться из-за отсутствия контекста. Не отклоняйте замечание только потому, что рецензент «новый».
Шаг 5: STOP — ограниченный цикл, а не рекурсия
Остановитесь, когда:
- следующая итерация возвращает только тривиальные или уже рассмотренные результаты, либо
- завершились 3 цикла (сообщите об этом пользователю, не пытайтесь пройти четвёртый самостоятельно), или
- пользователь явно скажет «выпускайте»
Если после 3 циклов рецензент по-прежнему выявляет существенные проблемы, возможно, продукт ещё не готов. Сообщите об этом пользователю — три нерешённых цикла являются информацией о продукте, а не поводом для продолжения цикла.
Если 3 цикла «явно недостаточно» из-за большого объема артефакта: артефакт слишком велик — вернитесь к шагу 2 и разбейте его на части. Не снимайте ограничение.
Распространённые оправдания
| Оправдание | Реальность |
|---|---|
| «Я уверен, поэтому пропускаю этап сомнений» | Уверенность слабо коррелирует с правильностью решения новых задач. Моменты уверенности — это именно те моменты, когда скрываются слепые зоны. |
| «Поиск рецензента — дело дорогостоящее» | Отладка ошибочного коммита в производственной среде обходится дороже. Стоимость проверки ограничена, а баг — нет. |
| «Рецензент будет просто придираться» | Только если не задать рамки. Ограничьте запрос «проблемами, которые приведут к сбою в соответствии с контрактом». |
«Я проверю всё на наличие сомнений в конце с помощью /review» |
/review — это последний барьер. Проверка на основе сомнений позволяет выявить неправильные направления на ранней стадии, когда исправление курса обходится недорого. К моменту создания PR уже слишком поздно. |
| «Если я буду сомневаться на каждом шагу, я никогда не выпущу релиз» | Этот навык применим к нетривиальным решениям, а не к каждому нажатию клавиши. Перечитайте раздел «Когда НЕ следует использовать». |
| «Два мнения всегда лучше, чем одно» | Не в том случае, когда второе мнение основано на недостаточном контексте и вносит лишний шум. Примиряйте мнения, а не откладывайте решение. |
| «Рецензент не согласился, значит, я был неправ» | Рецензенту не хватает вашего контекста — несогласие — это информация, а не вердикт. Перечитайте артефакт, классифицируйте, а затем принимайте решение. |
| «Межмодельный анализ всегда лучше» | Межмодельный подход выявляет «слепые зоны», присущие одной модели самой себе, но он увеличивает затраты и уязвимость инструмента. Предлагайте его на каждом цикле интерактивного обсуждения — пользователь сам решает, оправдан ли это в данном случае. Задача агента — предложить выбор, а не ограничивать его. |
| «Пользователь однажды сказал «да», поэтому я могу продолжать вызывать CLI» | Каждый вызов — это отдельное разрешение. Артефакт, подсказка и флаги меняются между вызовами — перед каждым запуском заново подтверждайте точную команду у пользователя. |
Красные флажки
- Запуск рецензента с новым контекстом для переименования одной строки или изменения форматирования
- Рассматривать вывод рецензента как авторитетный, не перечитывая текст артефакта
- Прохождение более 3 циклов проверки без эскалации вопроса пользователю
- Обращение к рецензенту с вопросом «так хорошо?» вместо «найдите проблемы»
- Игнорирование сомнений под давлением времени при принятии решения с высокими рисками
- Повторный запуск рецензента в новом контексте для неизменённого артефакта (вы получите те же результаты; вы просто тянете время)
- «Театр сомнений» (проверяемый сигнал): в течение двух или более циклов, когда рецензент выявлял существенные проблемы, ни одна из них не была классифицирована как требующая действий. Вы проводите валидацию, а не выражаете сомнения. Остановитесь и доложите выше.
- Выражение сомнений только после фиксации — это
/review, а не разработка, основанная на сомнениях - Жесткое кодирование вызова внешнего CLI без подтверждения у пользователя, что инструмент существует, настроен и принимает именно этот синтаксис
- Бесшумный пропуск межмодельного проверки в интерактивном цикле сомнений. Даже если это не рекомендуется, предложение должно быть видимым. Пропуск допустим; бесшумный пропуск — нет.
- Тихое переключение на резервный вариант при ошибке внешнего CLI или его отсутствии — отобразите сбой и дайте пользователю возможность перенаправить запрос
- Удаление контракта из ввода рецензента
- Передача УТВЕРЖДЕНИЯ рецензенту (предвзятость в сторону согласия)
Взаимодействие с другими навыками
code-review-and-quality//review: взаимодополняющие./review— это постфактумное заключение по PR; подход, основанный на сомнениях, — это текущий анализ каждого решения. Используйте оба.разработка-на-основе-исходного-кода: SDD проверяет факты о фреймворках на соответствие официальной документации. Подход, основанный на сомнении, проверяет ваши рассуждения об артефакте. SDD проверяет наличие API; подход, основанный на сомнении, проверяет, правильно ли вы его использовали в соответствии с контрактом.test-driven-development: этап RED в TDD — это конкретизация сомнения: неудачный тест — это попытка опровержения. Когда применяется TDD, этот неудачный тест и является этапом проверки на сомнение для утверждений о поведении.отладка-и-восстановление-после-ошибок: когда рецензент выявляет реальный режим сбоя, переключитесь на навык отладки, чтобы локализовать и исправить проблему.- Правила оркестрации репозитория (
references/orchestration-patterns.md): этот навык обеспечивает оркестрацию из основной сессии. Вызов одного персонажа другим персонажем является антипаттерном B — см. раздел «Ограничения загрузки» выше.
Верификация
После применения метода разработки, основанного на сомнениях:
- каждое нетривиальное решение (согласно приведенному выше определению) явно обозначалось как УТВЕРЖДЕНИЕ перед тем, как стать окончательным
- Проводился как минимум один обзор в новом контексте для каждого нетривиального артефакта (неудачный тест, сгенерированный на этапе RED в рамках TDD, удовлетворяет этому требованию для поведенческих утверждений, согласно разделу «Взаимодействие с другими навыками»)
- Рецензент получал АРТЕФАКТ + КОНТРАКТ — а НЕ УТВЕРЖДЕНИЕ и НЕ ваши обоснования
- Задание для рецензента было сформулировано в духе соперничества («найди проблемы»), а не в духе утверждения («хорошо ли это»)
- Результаты проверки классифицировались на основе текста артефакта (а не утверждались автоматически) с использованием следующего порядка приоритетов: неверное толкование контракта / требующее действий / компромисс / шум
- Было выполнено условие остановки (тривиальные выводы, 3 цикла или отмена рецензентом)
- В интерактивном режиме пользователю явно предлагался межмодельный анализ (независимо от значимости артефакта), и ответ фиксировался в выводе
- В неинтерактивном режиме межмодельное сравнение пропускалось, и об этом сообщалось
- Любому внешнему вызову CLI предшествовали проверка PATH, тест работоспособности бинарного файла, подтверждение синтаксиса с пользователем и явное разрешение на запуск
---
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
Все файлы
0 файловУстановить doubt-driven-development
Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.
Скачать ZIPКлонируйте репозиторий и скопируйте файлы навыка в свой проект.
git clone https://github.com/addyosmani/agent-skills/tree/main/skills/doubt-driven-development # Copy SKILL.md to your .claude/skills/ directory
Копировать





Дом
