# Plan Interrogator

> 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.

- Skill: `tinh2/plan-interrogator` (Agent Skill)
- Install (CLI): `npx skillmds add tinh2/plan-interrogator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tinh2/plan-interrogator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tinh2 (https://skillmd.com/u/tinh2)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/tinh2/plan-interrogator

---


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.

