doubt-driven-development
Questions all important decisions before they are made. It's useful when accuracy is crucial, to ensure there are no hidden flaws and that the plan is robust.
What it does
Checks important decisions before implementing them. It asks a 'reviewer,' tasked with finding flaws rather than approving, to analyze what you've written or planned. This helps ensure everything is correct and safe, especially in critical situations.
When to use it
- ✓When making a significant architectural decision for a project.
- ✓When writing complex code or code that modifies critical parts.
- ✓When making a non-obvious claim, like 'this is safe' or 'this will perform well'.
Example of what to ask your AI
“Review this decision: 'The new authentication method is secure against common attacks.' Check for flaws or incorrect assumptions.”
Want more? Open the sections below.
How to use
The easiest way: copy the message below and paste it into Claude, ChatGPT, Cursor or any AI. It reads the skill and follows the instructions.
Skill link
Ready-to-paste message
How it works
The AI separates the important part (the 'artifact') and the rules it must follow (the 'contract'). Then, it asks another AI, configured to be critical, to find problems in this 'artifact' based on the 'contract'. Finally, it compares the found issues with what was written.
Installation
Easiest way: copy the skill link and paste it into Claude, ChatGPT or Cursor asking it to follow the instructions.
In the terminal (Claude Code, Codex, Cursor), in your project folder:
npx skills add addyosmani/agent-skills --skill doubt-driven-developmentOr download just the file:
curl -L https://raw.githubusercontent.com/addyosmani/agent-skills/main/skills/doubt-driven-development/SKILL.md -o SKILL.mdTechnical content (original SKILL.md)
Original text by the author, straight from GitHub.
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
…
FAQ
When should I NOT use this?
Do not use for simple tasks like renaming files, formatting code, moving files, reading or summarizing existing code, or when speed is more important than verification.
What is a 'non-trivial' decision?
It's a decision involving complex logic, touching different system parts, making claims the computer can't verify alone (like security), depending on information that might be lost over time, or having irreversible consequences.
Why use a 'reviewer' that only finds faults?
Because it's easier to approve something already done than to find flaws. A reviewer focused on finding problems helps ensure all assumptions are questioned and potential errors are discovered before they cause bigger issues.
Details
Original description by the author
Subjects every non-trivial decision to a fresh-context adversarial review before it stands. Use when you want every assumption cross-examined before proceeding, when stress-testing a plan for hidden failure modes, when correctness matters more than speed, when working in unfamiliar code, when stakes are high (production auth, security-sensitive logic, a high-stakes migration, irreversible operatio
repo: addyosmani/agent-skills
Popularity
- GitHub stars
- 107k
- Ranking position
- #350
- License
- MIT
- Updated
- 10/13/2026
Comments
- …
More skills from this repository
api-and-interface-design
Helps create well-defined APIs and interfaces. It's useful when designing how different parts of software will communicate.
addyosmani/agent-skills
browser-testing-with-devtools
Helps your agent test code directly in real browsers. It's useful for checking how something works in the environment where it will be used, finding errors and performance issues.
addyosmani/agent-skills
ci-cd-and-automation
Teaches your AI agent to automate repetitive tasks and ship projects and manage infrastructure.
addyosmani/agent-skills
code-review-and-quality
Performs detailed code reviews on multiple fronts. It's useful before merging new changes to ensure quality and prevent future problems.
addyosmani/agent-skills
Similar skills
carrier-relationship-management
Manages relationships with carriers. It helps negotiate freight rates, evaluate performance, and build transportation strategies.
affaan-m/ECC
cost-tracking
Tracks and reports agent token usage and costs. It's useful for efficiently controlling spending and budgets.
affaan-m/ECC
plan-canvas
Opens plans and artifacts in a browser window for you to comment on. It makes giving visual feedback on needed changes easier.
affaan-m/ECC