Assumption-first planning and design gap analysis. Use when user is in PLANNING mode, explicitly asks to plan or discuss, asks for a gap analysis / design review / stress-test of a spec or design document, or when agent faces open decisions — including headless tasks where the deliverable is proposals and open questions as files. Instead of interrogating the user, the agent proposes concrete tagged answers in small verify-style rounds (or directly in the output documents when no user is in the loop), surfaces contradictions as questions, and asks only the questions that genuinely fork the design.
78
91%
Does it follow best practices?
Impact
56%
1.05xAverage score across 1 eval scenario
Passed
No known issues
Systematic approach for closing open decisions before implementation — by drafting answers, not by interrogating.
The user is an editor, not an answer machine. Producing a correct answer is expensive for the user; recognizing a wrong one is cheap. So for every open decision the agent proposes a concrete answer and lets the user veto it, instead of asking and waiting. Questions are reserved for decisions where a wrong guess is expensive to undo.
The review is brought to the user, in small bites, with everything needed to judge shown in place — the user never hunts through a document. And the review happens before the document is touched: proposals live in the conversation; the document receives only final text, once.
Some tasks ask for the analysis as files — a gap analysis, a design review, a batch run — with no user available for a veto pass. The whole process still applies; only the review surface moves: the output documents are the veto pass, prepared for a reader who will veto later.
topic: recommended answer entries — the recommendation is mandatory. A bare question hands the reader a generation task instead of a veto. One line means literally one line: no sub-sections, no trade-off discussion, no alternatives list — if a question needs that context, it belongs in the proposals document under the related theme, and the parked entry links to it by number.**Assumption:** markers are unnecessary in documents that are explicitly proposals — the whole file is unconfirmed by construction. They still apply when writing into the design document itself.Every open decision goes into exactly one bucket:
Hard rule: a contradiction is never assumed away. When two sources disagree — the doc with itself, the doc with the code, the user with either — surface it as a question no matter how cheap the fix looks. The boundary: filling silence is assuming; overwriting what the user or the doc already says is contradicting, even when you are sure the existing text is wrong. Contradictions are exactly the hidden problems this process exists to find.
Heuristic: assume anything fixable with one edit; ask anything other decisions depend on.
If more than ~3 questions survive triage, re-triage — you are over-asking. Most "questions" are assumptions that lost their nerve.
Stack, conventions, constraints, scale signals: pull what you can from the project itself (code, docs, config, git history) before involving the user. A question the repository can answer is never asked and never assumed — it is looked up. If the project keeps a glossary (CONTEXT.md) or a decision log (docs/adr/, decisions.md), read it first: settled terms and settled decisions are neither re-asked nor re-assumed.
Scan the entire task and collect ALL decision points first, then triage them as one batch. Never surface questions one at a time as you stumble on them — drip questioning is exactly what this skill exists to prevent.
Then partition the surviving decision points into themes — one section or subtree each (retries and failures, storage layout, CLI shape). A theme is the unit of one work round: small enough to review in one sitting.
Process one theme per round: walk its tree, stress-test it with scenarios, propose its answers in the conversation, and only after the user's veto write the confirmed text into the document. The rhythm is analyze → propose → confirm → write, theme by theme — never one giant review, and never writing ahead of the review. A round should carry 3–7 proposals; if a theme yields more, split it. Each round builds on decisions the user just confirmed, so vetoes stay cheap and never cascade far.
The breadth scan finds surface gaps; the hidden problems sit one level down. Within the current theme, resolve decision points in dependency order, and after drafting each proposal ask: what does this decision imply? Drafting "retries are configured per reviewer" immediately raises "what is the retry budget?" and "does partial output from the failed attempt survive?" — decision points no surface scan produces. Walk each branch until it stops generating new points.
Invent a handful of concrete, awkward scenarios and trace each one through the design end to end. Wherever the design goes silent, or two parts of it disagree about what happens, you have found a new decision point — send it through triage. Prefer the weird scenarios: the empty input, the double failure, the thing that arrives twice. Scenarios find gaps that checklists cannot.
A fuzzy or overloaded term is a decision point in disguise. When the same concept has two names, or one name covers two concepts, propose a canonical definition — as a proposal, like any other. When the user's wording conflicts with the project's established vocabulary, that is a contradiction: surface it. Update the project glossary once a term is confirmed (create CONTEXT.md lazily if none exists; definitions only, no implementation details).
Close every theme with a veto pass in the conversation, before touching the document. The user must be able to judge each proposal without opening anything — show the proposal's full final text plus the one line of surrounding context it hangs on.
The full text lives in a plain text message, printed before any question tool is called. Question-tool fields (question text, option labels, option descriptions) are too small to carry a proposal — a topic label like "config file shape" is not vetoable text. The tool call only references the numbers from the printed list; the list itself is the review surface. A veto pass with no text message above it is a blind veto pass.
Every proposal follows these rules:
The veto pass itself:
Only after the user has responded does the document change. Write each confirmed decision in its final form, in the place where it belongs — once. Confirmed text is plain text: no marker, it was just reviewed.
The **Assumption:** marker is reserved for text written without explicit confirmation — skipped questions (step 9), cheap assumptions made mid-execution (step 10), anything the user has not seen:
> **Assumption:** on timeout the reviewer process gets SIGTERM and is counted
> as failed, no automatic retry; partial stdout is kept as raw output.Use the exact literal **Assumption:** so markers can be found mechanically (grep). A marker stays until the user confirms the decision at the next veto pass — then drop it.
Never write a proposal into the document before its veto pass and edit it again after: every piece of text lands once. The only second write a decision ever gets is a real veto.
If the user skips a question, re-ask it once, explicitly. If it is still unanswered and the dependent work cannot be parked, proceed with your recommended option written as a marked assumption, flagged loudly at the top of the next veto pass. Do not block indefinitely; do not convert silently.
A rejected veto pass (the user dismisses the question tool) or a session that ends mid-round is open, not vetoed — but its analysis lives only in the conversation and dies with it. On rejection, stop and wait as the harness demands; the next contact starts by re-showing that round in full before any new theme. If the user is wrapping up with the round still open ("let's stop here"), park its items in the document's open-questions section first — topic + recommended answer, one line each; parking a summary is not writing the proposal — so the next session can pick the round up instead of re-deriving it.
New ambiguity during implementation goes through the same triage — assume if cheap (written with the marker, confirmed at the next contact), park if deferrable, stop and ask only if it forks the remaining work. Exception: anything that contradicts a confirmed decision or an explicit earlier answer from the user is always stop-and-ask.
A confirmed fork decision (asked, answered) gets recorded durably, so no future round — or other model — re-asks it. A one-paragraph ADR is enough: what was the context, what was decided, why (1–3 sentences; docs/adr/NNNN-slug.md, or the project's decision log if it keeps one). Apply the same gate as for asking: hard to reverse, surprising without context, real trade-off — decisions that fail the gate don't need an ADR, the confirmed text in the document is enough.
Write artifacts — glossary entries, ADRs — right after the veto pass that confirmed them, while the context is fresh.
**Assumption:** has been either confirmed (marker removed) or vetoed (text rewritten).