Claude Skill

clarify

Use when a spec exists and must be de-risked before planning — hunt its ambiguities, unstated assumptions and edge cases, ask the few build-changing questions, bake the answers back into the spec. The rsc SDD gate between `specify` (writes the spec) and `plan` (designs the build)

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download ericrisco-rsc-harness-skills_clarify-953fef5.zip · 11 KB
Part of ericrisco/rsc-harness — 46 skills

Install

skills CLI npx skills add https://github.com/ericrisco/rsc-harness/tree/main/skills/clarify
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install ericrisco-rsc-harness@llmmart
Git git clone https://github.com/ericrisco/rsc-harness.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole ericrisco/rsc-harness collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Clarify — the de-risking gate before planning

A spec written in one sitting always lies a little. It states what the author thought of, and stays silent on everything they didn't — the edge cases, the unstated defaults, the words that mean two things. Those silences don't disappear; they get discovered later, mid-implementation, where they cost ten times as much to fix. Clarify is the gate that drags those silences into the open while they are still cheap.

This is the fourth phase of the rsc SDD chain (constitution → specify → clarify → plan → tasks → analyze → implement → verify → review → ship); the method itself lives in ../sdd/SKILL.md. specify turned a fuzzy intent into a spec; clarify interrogates that spec, asks the user the questions that actually change the build, and writes the answers back so the spec becomes safe to plan from. It produces no new artifact — it sharpens the existing one in place. The line is specify creates, clarify de-risks, plan designs: if you find yourself proposing how to build it, you have left clarify.

Model tier: balanced — this phase ranks and asks the few high-leverage questions, it does not design architecture. Resolve and apply it per ../sdd/references/model-routing.md; routing is off unless models.enabled: true in 02-DOCS/wiki/sdd/config.yaml.

Accompaniment dial. Read the level from 02-DOCS/wiki/harness/user-profile.md (the dial and the 02-DOCS/wiki/ convention are owned by ../harness/SKILL.md). Clarify is question-heavy, so the dial matters here more than almost anywhere — it sets how many questions you ask and how you frame them. With no profile: default to non-technical framing, ask the two gauging questions (technical level + accompaniment) first, then proceed at the stated level.

Dial Ask
L0 "cavernícola" ONLY the questions whose answer changes the architecture or scope. Propose safe defaults for everything else and list them tersely as "assumed unless you object". Minimal prose.
L1 "breve" The high-leverage batch, one line of why per question.
L2 "explica decisiones" The batch plus the trade-off behind each option, so the user chooses informed.
L3 "acompañamiento total" Walk the taxonomy out loud, explain what each kind of gap costs if left unresolved, ask broadly (including the medium-leverage questions), and teach the why as you go. Ideal for non-technical users who benefit from seeing the hidden decisions.

Read first — the inputs

Clarify never works blind. Before asking a single question, load three things:

  1. The spec. Read the target spec under 02-DOCS/wiki/sdd/specs/<slug>.md end to end. If the path wasn't given, find the most recently touched spec or ask which one. Its Points to clarify is a typed handoff, not a question list — read the types before you plan a single question (below).
  2. The constitution. Read 02-DOCS/wiki/sdd/constitution.md if it exists. Its principles (stack canon, quality bars, conventions) resolve a surprising number of "ambiguities" without bothering the user — if the constitution already fixes the auth method or the data region, that's answered, not open.
  3. The harness profile. 02-DOCS/wiki/harness/user-profile.md, for the dial above.

Citing what you read ("checked the constitution — auth is already fixed to OAuth, so that's not an open question") shows your work and prevents re-litigating settled decisions.

The typed handoff — what specify already decided

Points to clarify holds four different objects, and each one gets a different action from you. Treating all four as questions is how clarify re-asks what was already decided and disturbs what was deliberately deferred:

Type in the spec What it means Your action
pregunta abierta Formulable, unanswered Ask it — this is your queue
suposición tomada specify decided it; the basis is written Validate, don't re-ask: state the assumption and its basis back, and ask only whether it still holds
decisión diferida Sharp, out of this cycle on purpose Leave it. Do not reopen scope the author closed
área no formulable Known to be coming, not yet phrasable Note it. If your pass sharpens it into a real question, it graduates — say that it did

Declare what you did with each entry. Close the pass with one line per point: asked, validated (held / broke), left deferred, or graduated. An entry you silently dropped is the gap that comes back at implementation time.

An untyped entry (an older spec, or a hurried one) is read as pregunta abierta — the costliest reading, so nothing gets skipped by accident. Type it as you go, so the spec improves on the way through.

Sharpness, not difficulty, is what separates a question from an unformulable area: can you state it precisely now? Not can you answer it?

The ambiguity taxonomy — where specs hide their gaps

Scan the spec against these categories. Most real gaps fall into one of them; walking the list is how you find the ones the author didn't think to write down.

Category What to hunt Tell-tale phrasing in the spec
Underspecified behavior A described feature with a missing branch — what happens in the other case "the user logs in" (and if it fails? locked out? wrong password vs no account?)
Unstated assumptions Defaults the author assumed everyone shares no mention of auth, tenancy, currency, timezone, locale
Edge & boundary cases Empty, zero, max, duplicate, concurrent, first-run, offline lists with no empty-state, counts with no upper bound
Ambiguous terms A word doing two jobs "user" (end-user or admin?), "delete" (soft or hard?), "fast" (how fast?)
Missing acceptance criteria A goal with no observable done-condition "should be performant", "easy to use", "handle errors gracefully"
Scope edges What's explicitly OUT vs left dangling features hinted at but never bounded — "for now", "eventually"
Data & state Lifecycle, ownership, retention, migration of existing data new entity with no story for what happens to old records
Failure & recovery What happens when a dependency is down, a write half-completes, input is hostile happy-path-only flows
Non-functional Performance, scale, security, accessibility, i18n targets vague "non-functional requirements" or none at all
Actors & permissions Who can do each thing a verb with no subject — "can be edited" (by whom?)

You are not filling every cell for every spec. You are scanning all ten so the gaps that do exist surface instead of hiding.

The pass — five steps

Run in order. The discipline is: find many candidate gaps, keep only the ones that change the build, ask those well, write the answers back.

  1. Inventory. Walk the spec against the taxonomy above. Produce a raw list of every candidate ambiguity, edge case, and unstated assumption. Over-collect here; you'll prune next. Note for each which category it is and where in the spec it lives.

  2. Resolve what you already can. For each candidate, check the constitution and the spec's own later sections before asking the user. Many "gaps" are answered elsewhere. Mark each candidate resolved-internally (cite the source), inferable (a safe default you'll propose, not silently assume), or must-ask (only the user can decide).

  3. Rank by leverage. Sort the must-ask list by impact: how much does the build change depending on the answer? A question whose two answers lead to two different architectures ranks above a cosmetic one. Cut low-leverage questions — clarify is not an interrogation, it's the few questions that matter. Cap the batch to the dial.

  4. Ask — one focused batch, sized to the dial. How you ask determines whether you get a usable answer:

    • Make it a decision, not an essay prompt. "Should deletes be soft (recoverable, hidden) or hard (gone immediately)? I'd recommend soft because the spec mentions an audit trail — confirm?" beats "How should deletion work?".
    • Carry your own recommendation when there's a defensible default, matched to the constitution. The user confirms or overrides — far less effort than authoring from scratch.
    • Quote the spec. Anchor each question to the exact line or section it came from, so the user sees why it's open.
    • One batch, ranked, then stop. Don't drip questions one at a time over many turns unless the dial is L3; don't dump thirty at once. Then wait: never ask and answer in the same breath, and never assume the user's intent on a must-ask item.
  5. Bake the answers back into the spec. This is the deliverable — an un-baked answer is a lost answer. For each resolved item, edit the spec in place:

    • Tighten the relevant section with the decided behavior.
    • Add or sharpen acceptance criteria so the decision is now observable.
    • Append a ## Clarifications log to the spec: dated entries of Q → decision → why, so the reasoning survives, not just the result.
    • Move anything explicitly dropped into an ## Out of scope section so it's bounded, not dangling.

    Then re-read the spec once more: did resolving one gap open a new one? If so, one more short loop. Otherwise, the gate is passed.

Worked micro-example

Spec line: "Users can upload a profile photo."

Clarify's inventory against the taxonomy:

- Ambiguous term  : "photo" — which formats? (PNG/JPG/HEIC/SVG?)
- Boundary        : max file size? max dimensions? what if it's 50 MB?
- Edge case       : no photo uploaded — is there a default/placeholder?
- Failure         : upload fails mid-transfer — retry, or lose it?
- Data lifecycle  : replacing a photo — is the old file deleted or orphaned?
- Actors          : can an admin change another user's photo?
- Non-functional  : is the image resized/compressed server-side? stored where?
- Security        : is the file type validated, or can someone upload an .svg with script?

Resolved-internally (cite): constitution fixes storage to the project's object store → "stored where" is answered. Must-ask, ranked: formats + max size (changes validation and UX), security validation (changes the upload path), old-file deletion (changes data model). Cosmetic placeholder choice → propose a default, don't burn a question on it.

After baking back, the spec line becomes a bounded, testable behavior with acceptance criteria ("rejects files >5 MB with a clear message", "accepts PNG/JPG/HEIC only", "replacing a photo deletes the prior file") and a ## Clarifications entry recording why.

Anti-patterns

Anti-pattern Why it breaks the gate / do instead
Skipping clarify because the spec "reads clear enough" Clear to the author ≠ unambiguous. Run the taxonomy; the gaps you can't see are exactly the expensive ones.
Assuming the sensible default and moving on An assumption is an unrecorded decision. Either it's resolvable from the constitution (cite it) or it's a must-ask. Silent defaults resurface as bugs — and "the user is busy" is not an exception; a wrong guess costs more than a one-tap question.
Sketching how you'd build it while you're in there That's plan. Clarify decides what, not how. Proposing architecture means you left the gate.
Asking everything you can think of, to be safe Thirty questions is noise that buries the three that matter. Rank by leverage, ask the few, default the rest — and batch them once instead of dripping one per turn.
Answering the questions in your head and leaving the spec as-is The deliverable is the edited spec plus the Clarifications log, not a clean conscience.
Leaving edge cases "to the implementer" Edge cases are spec problems. Resolving them now is the whole point of the gate.

Exit gate

The gate is passed when the spec, constitution and profile were all read (settled questions cited, not re-asked); every typed point in the handoff has its declared outcome (asked / validated / left deferred / graduated), with nothing silently dropped; all ten taxonomy categories were considered; only the build-changing gaps were put to the user, as dial-sized decisions with recommendations; every answer is baked into the spec body with observable acceptance criteria, logged under ## Clarifications and bounded under ## Out of scope; and the final re-read opened no new gap.

Result envelope

End with the parseable block every SDD phase shares, so the dispatcher can chain without interpreting prose (contract: ../sdd/SKILL.md):

{
  "status": "complete|blocked|failed",
  "executive_summary": "Open points resolved; the spec is de-risked and ready to plan against.",
  "artifact": "02-DOCS/wiki/sdd/specs/<slug>.md",
  "next_recommended": "plan",
  "risk": "low|medium|high",
  "skill_resolution": {
    "used": ["clarify"],
    "missing": [],
    "fallback": [],
    "compact_rules": ["Ask only what changes the spec.", "An unanswered question is recorded, never invented."]
  },
  "evidence": ["answers folded back into the spec", "remaining open points listed with their owner"]
}

Next in the chain

Hand off to plan — turn the now-sharp spec into a technical implementation plan (architecture, interfaces, data flow, testing strategy, risks), deferring stack specifics to the relevant stack skill. The chain continues: clarify → plan → tasks → analyze → implement → verify → review → ship. debug is callable any time if what you are "clarifying" turns out to be a runtime fault, not a spec gap.

Orientación (siempre)

Cierra cada turno con el bloque-brújula (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de 02-DOCS/wiki/harness/user-profile.md. Nunca termines en seco. Protocolo completo: skill orient → skills/orient/references/orientation-contract.md. (Defiere a suggest el "¿instalo la skill que falta?".)

Files (rsc-harness)
  • evals
    • cases.yaml 5.9 KB
      skill: clarify
      
      # Prompts that MUST load the `clarify` skill. Clarify is the fourth phase of the
      # rsc SDD chain: a spec already exists and needs DE-RISKING before planning —
      # surface ambiguities, edge cases, unstated assumptions, ask the high-leverage
      # questions, bake the answers back into the spec. It creates no new artifact; it
      # sharpens the existing spec in place. It is NOT spec authoring (specify) and NOT
      # the technical plan (plan).
      should_trigger:
        - prompt: "Here's our spec for the new billing flow — poke holes in it before we start planning."
          why: "Hunting holes/ambiguities in an existing spec ahead of planning is the literal job of clarify."
      
        - prompt: "Is this spec actually ready to build, or is something still underspecified?"
          why: "Readiness-to-plan and underspecified-area detection is the de-risking gate clarify owns; phrased without naming the skill."
      
        - prompt: "This requirements doc feels vague and I keep getting stuck whenever I try to plan from it."
          why: "A vague spec that stalls planning is the exact symptom clarify exists to resolve — the gap is in the spec, not the plan."
      
        - prompt: "Aclara el spec del onboarding: qué casos límite y supuestos nos estamos saltando."
          why: "Spanish trigger ('clarify the spec', edge cases and assumptions) — clarify is bilingual and edge-cases/assumptions are core taxonomy categories."
      
        - prompt: "Before we design the architecture, what questions about this feature do I actually need answered first?"
          why: "Surfacing the high-leverage open questions to answer BEFORE design/plan is clarify's ranking-and-asking step; the user even separates it from the architecture."
      
        - prompt: "Go through 02-DOCS/wiki/sdd/specs/checkout.md and flag every ambiguous term and missing acceptance criterion."
          why: "Operating directly on a spec under the canonical SDD specs path, hunting ambiguous terms and missing acceptance criteria — taxonomy categories owned here."
      
        - prompt: "We wrote what the feature should do but never decided what happens on the error paths or empty states — sort that out in the spec."
          why: "Underspecified failure/edge behavior that needs deciding and writing back into the spec is precisely clarify's pass, no skill name used."
      
      # NEAR-MISS prompts that must NOT load `clarify`. Each routes to a real sibling.
      # The recurring trap: anything about a spec/feature that is actually authoring it
      # (specify), designing the build (plan), cross-checking artifacts (analyze), or
      # diagnosing a runtime fault (debug).
      should_not_trigger:
        - prompt: "I have a fuzzy idea for a referral feature but no spec yet — help me write one."
          route_to: "specify"
          why: "There is no spec to interrogate yet; turning fuzzy intent into a first spec is specify, the phase before clarify."
      
        - prompt: "The spec is clear — now give me the architecture, interfaces, and data flow to build it."
          route_to: "plan"
          why: "The what is settled and the user wants the technical how; that's plan, the phase after clarify."
      
        - prompt: "Cross-check our constitution, spec, plan, and task list for contradictions and scope drift."
          route_to: "analyze"
          why: "Consistency check ACROSS multiple SDD artifacts is analyze; clarify works on the spec alone, before a plan even exists."
      
        - prompt: "Checkout throws a 500 in production sometimes — figure out why."
          route_to: "debug"
          why: "Diagnosing a runtime fault's root cause is debug; 'figure out why' here is about live behavior, not spec ambiguity."
      
        - prompt: "Decide our project-wide non-negotiables: stack canon, quality bars, and conventions."
          route_to: "constitution"
          why: "Establishing project-wide principles is the constitution phase; clarify reads the constitution but does not author it."
      
      # Capability scenario with a rubric to grade WITH vs WITHOUT the skill loaded.
      # A skill-guided pass walks the taxonomy, resolves what the constitution already
      # fixes, ranks by leverage, asks as decisions, and bakes answers back with a
      # Clarifications log. An ungrounded pass typically free-associates a few
      # questions and never edits the spec or records the reasoning.
      capability:
        - scenario: "We have a spec at 02-DOCS/wiki/sdd/specs/profile.md whose only line about photos is 'Users can upload a profile photo.' De-risk it before we plan."
          must_include:
            - "Reads the spec, the constitution (02-DOCS/wiki/sdd/constitution.md), and the harness profile first — citing anything the constitution already fixes (e.g. storage) as resolved rather than re-asking it."
            - "Scans against the ambiguity taxonomy and surfaces concrete gaps: accepted formats, max file size / dimensions, empty/no-photo state, upload-failure recovery, old-file deletion on replace, who-can-edit (actor/permission), and security validation of the file type."
            - "Ranks the gaps by leverage — asks only the build-changing ones (formats+size, security validation, old-file deletion) and proposes safe defaults for the cosmetic ones instead of burning a question on each."
            - "Frames questions as decisions with a recommendation (e.g. 'soft vs hard delete — recommend X because…'), one dial-sized batch, anchored to the spec line, rather than open-ended essay prompts or one-at-a-time drips."
            - "Adapts question count to the accompaniment dial from user-profile.md (L0 = only architecture/scope-changing questions + listed assumed-defaults; L3 = broader, taught)."
            - "Bakes the resolved answers BACK into the spec: tightens the photo section into bounded behavior, adds observable acceptance criteria, and bounds dropped items under '## Out of scope'."
            - "Appends a dated '## Clarifications' log of Q → decision → why so the reasoning survives, and does a final re-read to confirm no new gap was opened."
            - "Stays in its lane: decides WHAT, never proposes the technical HOW (no architecture/library choices) and ends by pointing to plan as the next phase."
      
    • README.md 3.7 KB
      # Eval harness — `clarify` skill
      
      These evals check two things: that the skill **triggers** on the right prompts
      (and stays quiet on near-misses that belong to a neighbouring SDD phase), and
      that it **measurably improves** the de-risking pass over a spec. Cases live in
      `cases.yaml`. There is no pure shell runner — grading is a judgment call done by
      an **agent harness** (a Claude Code agent with the skill catalog loaded) plus a
      human spot-check.
      
      ## What's in `cases.yaml`
      
      - `should_trigger` — prompts that MUST load `clarify` (a spec exists; the user
        wants it de-risked / hole-poked / readiness-checked before planning).
      - `should_not_trigger` — near-misses routed to the genuinely correct sibling
        via `route_to` (`specify`, `plan`, `analyze`, `debug`, `constitution`).
      - `capability` — a scenario with a `must_include` rubric to grade WITH vs
        WITHOUT the skill loaded.
      
      ## Triggering eval
      
      Goal: the skill fires when a spec needs de-risking, and never on an adjacent
      SDD phase.
      
      1. Configure an agent with the **full catalog of skill descriptions** available
         for routing — the SDD chain siblings (`specify`, `plan`, `analyze`, `debug`,
         `constitution`, and the rest) plus the stack/process skills (`harness`,
         `init`, `fastapi`, `nextjs`, `go`, `postgresdb`, `flutter`, `design`,
         `marketing`, …) so routing competes realistically.
      2. For each `should_trigger` prompt: feed it cold and record whether `clarify`
         is the skill loaded. Run **3–5 trials** per prompt with fresh context.
      3. For each `should_not_trigger` prompt: confirm `clarify` does NOT load and
         that the chosen skill matches `route_to`. Same 3–5 trials.
      4. Score: `triggered_correctly / total_trials` across both lists.
      
      **Pass bar: ≥ 90% trigger accuracy** over all prompts and trials, with **zero
      systematic false-positives** on the `specify` and `plan` near-misses — those are
      the known traps. The boundary clarify must hold: no-spec-yet is `specify`,
      how-to-build-it is `plan`. If it grabs either, the description is leaking.
      
      ## Capability eval
      
      Goal: prove the skill changes the de-risking pass, not just the routing.
      
      1. For the `capability` scenario, run it **twice**:
         - **WITHOUT** the skill (base agent, no `clarify` loaded).
         - **WITH** the `clarify` skill loaded.
      2. Grade each output against the `must_include` checklist — one point per
         checkable item covered. A human or grading agent marks each present / absent.
      3. Compute coverage = `items_covered / total_items` per run.
      
      **Pass bar: WITH the skill covers ≥ 80% of `must_include`; WITHOUT clearly
      lower** (target a ≥ 30-point gap). The discriminating behaviors are the ones a
      base agent reliably misses: reading the constitution and citing what's already
      resolved, ranking gaps by leverage instead of dumping every question, framing
      questions as decisions-with-a-recommendation, and — the highest-signal item —
      actually **baking answers back into the spec with a dated Clarifications log**
      rather than just listing questions in chat.
      
      ## Notes on honesty
      
      - Trials are stochastic; report the raw fraction, not a rounded "pass".
      - The single highest-signal capability check is **the edit-back**: an answer
        that asks good questions but never modifies the spec or records the reasoning
        is a capability failure even if the questions are sharp. Clarify's deliverable
        is the sharpened spec, not the conversation.
      - A second tell: a base agent often slides into proposing *how to build* the
        feature. A correct clarify pass stays on WHAT and defers HOW to `plan`. Treat
        architecture suggestions as a scope-leak failure.
      - Re-run after any edit to `SKILL.md` — wording changes shift both triggering
        (especially the `specify`/`plan` boundary) and rubric coverage.
      
  • SKILL.md 14.4 KB
    ---
    name: clarify
    description: "Use when a spec exists and must be de-risked before planning — hunt its ambiguities, unstated assumptions and edge cases, ask the few build-changing questions, bake the answers back into the spec. The rsc SDD gate between `specify` (writes the spec) and `plan` (designs the build). NOT the cross-artifact consistency check (that is `analyze`)."
    tags: [sdd, clarify, questions]
    recommends: [plan]
    profiles: [core, full]
    origin: risco
    ---
    
    # Clarify — the de-risking gate before planning
    
    A spec written in one sitting always lies a little. It states what the author *thought of*, and stays silent on everything they didn't — the edge cases, the unstated defaults, the words that mean two things. Those silences don't disappear; they get discovered later, mid-implementation, where they cost ten times as much to fix. **Clarify is the gate that drags those silences into the open while they are still cheap.**
    
    This is the fourth phase of the rsc SDD chain (`constitution` → `specify` → **`clarify`** → `plan` → `tasks` → `analyze` → `implement` → `verify` → `review` → `ship`); the method itself lives in `../sdd/SKILL.md`. `specify` turned a fuzzy intent into a spec; clarify interrogates that spec, asks the user the questions that actually change the build, and writes the answers back so the spec becomes safe to plan from. It produces **no new artifact** — it sharpens the existing one in place. The line is **specify creates, clarify de-risks, plan designs**: if you find yourself proposing how to *build* it, you have left clarify.
    
    **Model tier: `balanced`** — this phase ranks and asks the few high-leverage questions, it does not design architecture. Resolve and apply it per `../sdd/references/model-routing.md`; routing is off unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`.
    
    **Accompaniment dial.** Read the level from `02-DOCS/wiki/harness/user-profile.md` (the dial and the `02-DOCS/wiki/` convention are owned by `../harness/SKILL.md`). Clarify is question-heavy, so the dial matters here more than almost anywhere — it sets **how many questions you ask and how you frame them**. With no profile: default to non-technical framing, ask the two gauging questions (technical level + accompaniment) first, then proceed at the stated level.
    
    | Dial | Ask |
    | --- | --- |
    | **L0** "cavernícola" | ONLY the questions whose answer changes the architecture or scope. Propose safe defaults for everything else and list them tersely as "assumed unless you object". Minimal prose. |
    | **L1** "breve" | The high-leverage batch, one line of *why* per question. |
    | **L2** "explica decisiones" | The batch plus the trade-off behind each option, so the user chooses informed. |
    | **L3** "acompañamiento total" | Walk the taxonomy out loud, explain what each kind of gap costs if left unresolved, ask broadly (including the medium-leverage questions), and teach the *why* as you go. Ideal for non-technical users who benefit from seeing the hidden decisions. |
    
    ## Read first — the inputs
    
    Clarify never works blind. Before asking a single question, load three things:
    
    1. **The spec.** Read the target spec under `02-DOCS/wiki/sdd/specs/<slug>.md` end to end. If the path wasn't given, find the most recently touched spec or ask which one. Its *Points to clarify* is a **typed** handoff, not a question list — read the types before you plan a single question (below).
    2. **The constitution.** Read `02-DOCS/wiki/sdd/constitution.md` if it exists. Its principles (stack canon, quality bars, conventions) resolve a surprising number of "ambiguities" without bothering the user — if the constitution already fixes the auth method or the data region, that's answered, not open.
    3. **The harness profile.** `02-DOCS/wiki/harness/user-profile.md`, for the dial above.
    
    Citing what you read ("checked the constitution — auth is already fixed to OAuth, so that's not an open question") shows your work and prevents re-litigating settled decisions.
    
    ## The typed handoff — what `specify` already decided
    
    *Points to clarify* holds four different objects, and each one gets a different action from you.
    Treating all four as questions is how clarify re-asks what was already decided and disturbs what was
    deliberately deferred:
    
    | Type in the spec | What it means | Your action |
    | --- | --- | --- |
    | **pregunta abierta** | Formulable, unanswered | Ask it — this is your queue |
    | **suposición tomada** | `specify` decided it; the basis is written | **Validate**, don't re-ask: state the assumption and its basis back, and ask only whether it still holds |
    | **decisión diferida** | Sharp, out of this cycle on purpose | Leave it. Do not reopen scope the author closed |
    | **área no formulable** | Known to be coming, not yet phrasable | Note it. If your pass sharpens it into a real question, it graduates — say that it did |
    
    **Declare what you did with each entry.** Close the pass with one line per point: asked, validated
    (held / broke), left deferred, or graduated. An entry you silently dropped is the gap that comes back
    at implementation time.
    
    **An untyped entry** (an older spec, or a hurried one) is read as **pregunta abierta** — the
    costliest reading, so nothing gets skipped by accident. Type it as you go, so the spec improves on
    the way through.
    
    Sharpness, not difficulty, is what separates a question from an unformulable area: *can you state it
    precisely now?* Not *can you answer it?*
    
    ## The ambiguity taxonomy — where specs hide their gaps
    
    Scan the spec against these categories. Most real gaps fall into one of them; walking the list is how you find the ones the author didn't think to write down.
    
    | Category | What to hunt | Tell-tale phrasing in the spec |
    | --- | --- | --- |
    | **Underspecified behavior** | A described feature with a missing branch — what happens in the *other* case | "the user logs in" (and if it fails? locked out? wrong password vs no account?) |
    | **Unstated assumptions** | Defaults the author assumed everyone shares | no mention of auth, tenancy, currency, timezone, locale |
    | **Edge & boundary cases** | Empty, zero, max, duplicate, concurrent, first-run, offline | lists with no empty-state, counts with no upper bound |
    | **Ambiguous terms** | A word doing two jobs | "user" (end-user or admin?), "delete" (soft or hard?), "fast" (how fast?) |
    | **Missing acceptance criteria** | A goal with no observable done-condition | "should be performant", "easy to use", "handle errors gracefully" |
    | **Scope edges** | What's explicitly OUT vs left dangling | features hinted at but never bounded — "for now", "eventually" |
    | **Data & state** | Lifecycle, ownership, retention, migration of existing data | new entity with no story for what happens to old records |
    | **Failure & recovery** | What happens when a dependency is down, a write half-completes, input is hostile | happy-path-only flows |
    | **Non-functional** | Performance, scale, security, accessibility, i18n targets | vague "non-functional requirements" or none at all |
    | **Actors & permissions** | Who can do each thing | a verb with no subject — "can be edited" (by whom?) |
    
    You are not filling every cell for every spec. You are scanning all ten so the gaps that *do* exist surface instead of hiding.
    
    ## The pass — five steps
    
    Run in order. The discipline is: find many candidate gaps, keep only the ones that change the build, ask those well, write the answers back.
    
    1. **Inventory.** Walk the spec against the taxonomy above. Produce a raw list of every candidate ambiguity, edge case, and unstated assumption. Over-collect here; you'll prune next. Note for each which category it is and where in the spec it lives.
    
    2. **Resolve what you already can.** For each candidate, check the constitution and the spec's own later sections before asking the user. Many "gaps" are answered elsewhere. Mark each candidate **resolved-internally** (cite the source), **inferable** (a safe default you'll propose, not silently assume), or **must-ask** (only the user can decide).
    
    3. **Rank by leverage.** Sort the must-ask list by impact: how much does the build change depending on the answer? A question whose two answers lead to two different architectures ranks above a cosmetic one. Cut low-leverage questions — clarify is not an interrogation, it's the *few* questions that matter. Cap the batch to the dial.
    
    4. **Ask — one focused batch, sized to the dial.** How you ask determines whether you get a usable answer:
       - **Make it a decision, not an essay prompt.** "Should deletes be soft (recoverable, hidden) or hard (gone immediately)? I'd recommend soft because the spec mentions an audit trail — confirm?" beats "How should deletion work?".
       - **Carry your own recommendation** when there's a defensible default, matched to the constitution. The user confirms or overrides — far less effort than authoring from scratch.
       - **Quote the spec.** Anchor each question to the exact line or section it came from, so the user sees *why* it's open.
       - **One batch, ranked, then stop.** Don't drip questions one at a time over many turns unless the dial is L3; don't dump thirty at once. Then wait: never ask and answer in the same breath, and never assume the user's intent on a must-ask item.
    
    5. **Bake the answers back into the spec.** This is the deliverable — an un-baked answer is a lost answer. For each resolved item, edit the spec in place:
       - Tighten the relevant section with the decided behavior.
       - Add or sharpen acceptance criteria so the decision is now observable.
       - Append a `## Clarifications` log to the spec: dated entries of `Q → decision → why`, so the *reasoning* survives, not just the result.
       - Move anything explicitly dropped into an `## Out of scope` section so it's bounded, not dangling.
    
       Then re-read the spec once more: did resolving one gap open a new one? If so, one more short loop. Otherwise, the gate is passed.
    
    ## Worked micro-example
    
    Spec line: *"Users can upload a profile photo."*
    
    Clarify's inventory against the taxonomy:
    
    ```text
    - Ambiguous term  : "photo" — which formats? (PNG/JPG/HEIC/SVG?)
    - Boundary        : max file size? max dimensions? what if it's 50 MB?
    - Edge case       : no photo uploaded — is there a default/placeholder?
    - Failure         : upload fails mid-transfer — retry, or lose it?
    - Data lifecycle  : replacing a photo — is the old file deleted or orphaned?
    - Actors          : can an admin change another user's photo?
    - Non-functional  : is the image resized/compressed server-side? stored where?
    - Security        : is the file type validated, or can someone upload an .svg with script?
    ```
    
    Resolved-internally (cite): constitution fixes storage to the project's object store → "stored where" is answered. Must-ask, ranked: formats + max size (changes validation and UX), security validation (changes the upload path), old-file deletion (changes data model). Cosmetic placeholder choice → propose a default, don't burn a question on it.
    
    After baking back, the spec line becomes a bounded, testable behavior with acceptance criteria ("rejects files >5 MB with a clear message", "accepts PNG/JPG/HEIC only", "replacing a photo deletes the prior file") and a `## Clarifications` entry recording why.
    
    ## Anti-patterns
    
    | Anti-pattern | Why it breaks the gate / do instead |
    | --- | --- |
    | Skipping clarify because the spec "reads clear enough" | Clear to the author ≠ unambiguous. Run the taxonomy; the gaps you can't see are exactly the expensive ones. |
    | Assuming the sensible default and moving on | An assumption is an unrecorded decision. Either it's resolvable from the constitution (cite it) or it's a must-ask. Silent defaults resurface as bugs — and "the user is busy" is not an exception; a wrong guess costs more than a one-tap question. |
    | Sketching how you'd build it while you're in there | That's `plan`. Clarify decides *what*, not *how*. Proposing architecture means you left the gate. |
    | Asking everything you can think of, to be safe | Thirty questions is noise that buries the three that matter. Rank by leverage, ask the few, default the rest — and batch them once instead of dripping one per turn. |
    | Answering the questions in your head and leaving the spec as-is | The deliverable is the *edited spec* plus the Clarifications log, not a clean conscience. |
    | Leaving edge cases "to the implementer" | Edge cases are *spec* problems. Resolving them now is the whole point of the gate. |
    
    ## Exit gate
    
    The gate is passed when the spec, constitution and profile were all read (settled questions cited, not re-asked); **every typed point in the handoff has its declared outcome** (asked / validated / left deferred / graduated), with nothing silently dropped; all ten taxonomy categories were considered; only the build-changing gaps were put to the user, as dial-sized decisions with recommendations; every answer is baked into the spec body with observable acceptance criteria, logged under `## Clarifications` and bounded under `## Out of scope`; and the final re-read opened no new gap.
    
    ## Result envelope
    
    End with the parseable block every SDD phase shares, so the dispatcher can chain without
    interpreting prose (contract: `../sdd/SKILL.md`):
    
    ```json result-envelope
    {
      "status": "complete|blocked|failed",
      "executive_summary": "Open points resolved; the spec is de-risked and ready to plan against.",
      "artifact": "02-DOCS/wiki/sdd/specs/<slug>.md",
      "next_recommended": "plan",
      "risk": "low|medium|high",
      "skill_resolution": {
        "used": ["clarify"],
        "missing": [],
        "fallback": [],
        "compact_rules": ["Ask only what changes the spec.", "An unanswered question is recorded, never invented."]
      },
      "evidence": ["answers folded back into the spec", "remaining open points listed with their owner"]
    }
    ```
    
    ## Next in the chain
    
    Hand off to **`plan`** — turn the now-sharp spec into a technical implementation plan (architecture, interfaces, data flow, testing strategy, risks), deferring stack specifics to the relevant stack skill. The chain continues: clarify → **plan** → tasks → analyze → implement → verify → review → ship. `debug` is callable any time if what you are "clarifying" turns out to be a runtime fault, not a spec gap.
    
    ## Orientación (siempre)
    
    Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ✅ qué hiciste · 🧭 por qué · ➡️ siguiente, terminando en pregunta), calibrado al dial de `02-DOCS/wiki/harness/user-profile.md`. **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related