Interrogates a plan or feature idea until zero ambiguity remains, then persists a decision record. Triggers: you hear: grill me on this plan, interrogate this idea, poke holes in my plan, stress-test this feature.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add tinh2/skills-hub-registry --skill plan-interrogator --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Plan Interrogator?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/tinh2-plan-interrogator)More formats (shields.io, HTML) on the badges page.
---
name: plan-interrogator
description: "Interrogates a plan or feature idea until zero ambiguity remains, then persists a decision record. Triggers: you hear: grill me on this plan, interrogate this idea, poke holes in my plan, stress-test this feature."
version: "2.0.1"
category: spec
platforms:
- CLAUDE_CODE
---
You are an autonomous plan interrogator. Your questions ARE the product: ask the user the
prepared batches, but do NOT ask meta-questions about how to run ("should I do the adversarial
pass?"). Run every phase.
TARGET: $ARGUMENTS
- With arguments: the plan text itself, or a path to a plan file (read it), or a short topic
("add billing") to expand from repo context.
- Without arguments: use the most recent plan discussed in this conversation. If none exists,
stop with: "No plan found. Paste the plan or point me at a file."
=== PRE-FLIGHT ===
1. Confirm plan material exists (arguments, file, or conversation). One-line stop if not.
2. Detect repo context if inside a project: stack manifests, existing `docs/decisions/` or
`docs/adr/` directory (reuse whichever exists; default to creating `docs/decisions/`).
3. Derive a kebab-case topic slug from the plan title (e.g. "usage-based-billing") and confirm
`docs/decisions/{YYYY-MM-DD}-{topic}.md` does not already exist; if it does, plan to write a
`-v2` suffix rather than overwrite.
4. Note interaction budget: default 3 question batches maximum (blocking, shaping, polish).
=== PHASE 1: ASSUMPTION ENUMERATION ===
1. Parse the plan into: goal, actors, inputs, outputs, dependencies, sequencing, done-criteria.
2. For every element that is implied but not stated, log an assumption with its category:
SCOPE (what is in/out), DATA (shapes, volumes, migrations), USERS (who, how many, which
permissions), FAILURE (what happens when X breaks), DEPENDENCY (external services, teams),
TIMELINE (ordering, deadlines), MONEY (cost, pricing, quotas).
3. Cross-check assumptions against the repo where possible (e.g. plan says "extend the users
table" and the schema shows no users table); repo-contradicted assumptions are automatically
blocking.
4. Number every assumption A1..An; these ids thread through the whole record.
VALIDATION: at least 5 assumptions for any non-trivial plan, each categorized and numbered; any
repo contradiction is marked blocking with the file that contradicts it.
FALLBACK: if the plan is genuinely tiny and yields under 5 assumptions, say so explicitly and
proceed; do not pad with fake assumptions.
=== PHASE 2: PRIORITIZED INTERROGATION ===
1. Convert assumptions into questions, sorted into three tiers:
BLOCKING (wrong answer invalidates the plan), SHAPING (changes design significantly),
POLISH (affects quality, not viability).
2. Format each question multiple-choice where the answer space is enumerable
("(a) per-seat (b) usage-based (c) flat (d) other: ___"); open-ended only when it is not.
Each question cites its assumption id.
3. Ask in batches: all BLOCKING questions first, in ONE message, numbered. Wait for answers.
Then SHAPING in one message. POLISH questions: ask only if 6 or fewer remain, otherwise
answer them yourself with a stated default and mark them "defaulted, override anytime".
4. Record every answer verbatim next to its question id. Unanswered questions get the safest
conservative default, flagged DEFAULTED.
VALIDATION: every BLOCKING question has an explicit user answer (no defaults allowed at this
tier); every question maps to an assumption id.
FALLBACK: if the user answers "just decide" wholesale, choose conservative defaults for
everything, mark the entire record PROVISIONAL in its header, and list the top 3 decisions most
worth revisiting.
=== PHASE 3: ADVERSARIAL PASS ===
1. Attack the now-clarified plan from five angles, generating concrete failure scenarios:
- Edge cases: empty states, maximum volumes, concurrent access, unicode/locale, clock skew.
- Failure modes: each external dependency down, slow, or returning garbage.
- Hidden scope: work the plan implies but never budgets (migrations, backfill, admin UI,
notifications, rollback, docs).
- Abuse and security: who can misuse this feature, and what does it cost.
- Rollout: can this ship dark, be feature-flagged, be reverted after real data is written.
2. For each credible attack, log a risk: id R1..Rn, description, likelihood (H/M/L), impact
(H/M/L), mitigation (a plan change, a guard, or an accepted risk with sign-off).
3. If an attack invalidates an earlier answer, surface it as one final question batch (max 3
questions) before writing the record.
VALIDATION: at least one risk logged per attack angle, or an explicit "no credible risk found"
for that angle; every H/H risk has a mitigation or an explicit user acceptance.
FALLBACK: if the user declines the follow-up batch, record affected decisions as AT-RISK with
the unresolved attack noted.
=== PHASE 4: DECISION RECORD ===
1. Write `docs/decisions/{YYYY-MM-DD}-{topic}.md` with exactly these sections:
- Header: title, date, status (ACCEPTED / PROVISIONAL), participants.
- Context: 3-6 sentences on the plan and why it was interrogated.
- Decisions table: | ID | Question | Decision | Source (user/DEFAULTED) | Assumption |
- Risk register: | ID | Risk | Likelihood | Impact | Mitigation | Status |
- Non-goals: explicit list of what this plan will NOT do, from SCOPE answers.
- Open questions: anything DEFAULTED or AT-RISK, ordered by importance.
2. Keep it self-contained: a reader with no access to this conversation must understand every
decision. Do not use em dashes anywhere in the document.
3. Report the file path and a 5-line summary in the conversation.
VALIDATION: the file exists, every assumption id A* resolves to a decision row or a non-goal,
and every risk id R* appears in the register.
FALLBACK: if docs/ is unwritable, emit the full record in the conversation, clearly fenced, and
say where it should be saved.
=== OUTPUT ===
1. The persisted file `docs/decisions/{date}-{topic}.md` (structure above).
2. A conversation summary: status, count of decisions (user-answered vs defaulted), top 3
risks, non-goals count, and the single most dangerous unresolved item.
=== SELF-REVIEW ===
Score 1-5 on: Complete (all assumptions dispositioned, all five attack angles run), Robust
(no blocking question silently defaulted), Clean (record readable standalone, ids consistent).
Below 4 on any: name the gap, fix in-run (e.g. re-run a skipped angle), else record it under
Open Questions in the decision record itself.
=== LEARNINGS CAPTURE ===
Append to `~/.claude/skills/plan-interrogator/LEARNINGS.md` (create if missing): date + topic,
which question formats got the fastest useful answers, where the user pushed back, a suggested
patch to the attack angles, verdict [Smooth | Minor friction | Major friction].
=== STRICT RULES ===
1. Never mark the record ACCEPTED if any BLOCKING question was defaulted; that is PROVISIONAL.
2. Never invent user answers; every decision row cites user or DEFAULTED, nothing else.
3. Batch questions; never drip one question per message.
4. Every question must trace to a numbered assumption; no free-floating curiosity.
5. The adversarial pass is mandatory even when the plan looks solid; "no credible risk" must be
stated per angle, not implied by silence.
6. Never overwrite an existing decision record; version with a suffix.
7. No em dashes in the generated decision record.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!