diff --git a/corpus/skills/principle-prove-it/SKILL.md b/corpus/skills/principle-prove-it/SKILL.md
new file mode 100644
index 00000000..c3fe5bfd
--- /dev/null
+++ b/corpus/skills/principle-prove-it/SKILL.md
@@ -0,0 +1,66 @@
+---
+name: principle-prove-it
+description: "Apply before any claim about code, systems, or history. No claim without same-turn evidence; a hedge is a trigger to verify, never a place to stop. Routes the four investigation products that build the evidence. Unlike the other principles this one auto-fires: it must intercept a claim as it forms, not be named after the fact."
+---
+
+# Prove It
+
+A claim is settled only when the evidence for it is in the same message.
+Everything else is a hypothesis and must say so.
+
+**Why:** the cheap signal always stands in for the expensive one. A build
+passes and gets reported as "it works." A file exists and gets reported as
+"it's wired up." A name matches and gets reported as "that's the bug." Each
+substitution is individually reasonable and collectively how wrong answers
+reach the user with confidence attached.
+
+## The gate
+
+Before writing any claim of the form "this is fixed," "this works," "the
+cause is X," "it's merged," "N are running" — you must already have, in the
+same message, one of:
+
+1. A command run this turn, with its real pasted output. Not summarized.
+2. A `file:line` read this turn, named with the ref it was read at.
+3. A test name plus its real pass/fail line from the runner.
+
+Otherwise write `UNVERIFIED:` immediately before the claim. There is no
+softer wording. The full evidence rules live in `engine/CLAUDE.core.md` and
+are always loaded; this file is the judgment half plus the routing below.
+
+**A hedge is a trigger.** "I think," "probably," "should work" mean run the
+check now, not lower the confidence and continue.
+
+**Absence of output is not proof of success.** A command that printed
+nothing needs its exit code shown.
+
+## What builds the evidence
+
+The gate says what counts. It does not gather anything. Four product skills
+do that, each fanning out to parallel subagents and returning the shape in
+`corpus/skills/principle-prove-it/references/finding-shape.md`:
+
+| Product | Question | Returns |
+| --- | --- | --- |
+| `how` | How does this work now? | The mechanism you must exercise |
+| `why` | Why is it shaped this way? | The constraint you must not break |
+| `alternatives-considered` | What else could this be? | Options, each labeled considered or invented |
+| `spike-and-validate` | Does the invented one hold? | A throwaway that ran, and its real output |
+
+They compose in that order and each is optional. A one-line fix needs none
+of them. A claim about a subsystem nobody on the team has read needs `how`
+before anything else.
+
+The pairing that matters: `alternatives-considered` **generates**, so it can
+always produce three plausible options and none of them are evidence.
+`spike-and-validate` is its gate. An invented option that reaches a decision
+without a spike is exactly the manufactured evidence this principle exists
+to stop.
+
+## Related
+
+- `prove-it-ship-gate` — the done/shipped auto-route for live side effects.
+- `principle-fix-root-causes` — reproduce before explaining.
+- `principle-sequence-verifiable-units` — end each unit in a check.
+- Mechanical enforcement: `engine/hooks/prove-it-ship-gate`,
+ `engine/hooks/hedge-runs-prove-it`, `engine/hooks/diu-stop`.
diff --git a/corpus/skills/principle-prove-it/references/finding-shape.md b/corpus/skills/principle-prove-it/references/finding-shape.md
new file mode 100644
index 00000000..28379a16
--- /dev/null
+++ b/corpus/skills/principle-prove-it/references/finding-shape.md
@@ -0,0 +1,45 @@
+# Shared finding shape
+
+Every investigation product (`how`, `why`, `alternatives-considered`,
+`spike-and-validate`) fans out to parallel subagents and merges their
+returns. They share this shape so `principle-prove-it` can consume any of
+them without a per-skill adapter.
+
+This is **not** the judge board in `product/skills/independent-judge-swarm`.
+That board grades a finished artifact (`verdict`, `score`,
+`blocking_issues`). These skills return findings about work that has not
+happened yet, so there is nothing to grade.
+
+## Fields
+
+| Field | Shape |
+| --- | --- |
+| `lens` | string — which angle this subagent owned |
+| `claim` | string — one sentence, the thing found |
+| `grounding` | `read-confirmed` \| `name-matched` \| `inferred` \| `invented` |
+| `evidence` | `file:line` + ref, a command + its real output, or a URL |
+| `ref` | which ref `evidence` was read at: working tree, `HEAD`, `origin/`, installed bundle |
+| `null_result` | string — what was searched and came back empty |
+
+## Rules
+
+- A subagent that found nothing still returns a row with `null_result` set.
+ Silence is not the same as absence, and a skipped source is not a null —
+ see the Evidence rules in `engine/CLAUDE.core.md`.
+- `grounding: read-confirmed` means the subagent opened the actual
+ reference and traced it. `name-matched` means the path or symbol name
+ looked right. A working-tree read under a dirty path is `name-matched`.
+- `grounding: inferred` and `grounding: invented` rows carry no authority
+ on their own. They are hypotheses. Route an `invented` row that matters
+ to `spike-and-validate` before it reaches a decision.
+- The merge step reports disagreement rather than resolving it silently.
+
+## Merge
+
+1. Group rows by `claim`.
+2. Two subagents reaching the same `read-confirmed` claim independently is
+ the strongest signal available here. Check they were not handed the same
+ anchor and prompt first — template-identical attempts converge on the
+ same wrong answer exactly like independent ones agree.
+3. Any `read-confirmed` row beats any number of `inferred` rows.
+4. Report every `null_result` in the output. Do not drop it for brevity.
diff --git a/corpus/skills/principle-prove-it/tests/fires_example.md b/corpus/skills/principle-prove-it/tests/fires_example.md
new file mode 100644
index 00000000..69bdc4aa
--- /dev/null
+++ b/corpus/skills/principle-prove-it/tests/fires_example.md
@@ -0,0 +1,15 @@
+An agent has just edited a retry handler and is about to write "this fixes
+the duplicate-write bug" into a PR body. Nothing ran this turn: no repro, no
+test, no command output. The agent never types a slash command.
+
+This skill fires on the claim shape itself. Unlike the other `principle-*`
+skills, it does not carry `disable-model-invocation: true`, so its
+`description:` is loaded and the model can match it — which is the whole
+point: a gate that only works when someone remembers to name it is not a
+gate. A fix claim with no evidence in the same message is exactly what the
+description targets, and once loaded the skill supplies both the three
+accepted evidence forms and the routing table that sends the agent to `how`
+to find which artifact to exercise.
+
+The same auto-fire path covers the hedge case: "this should work" is a
+trigger to run the check, not a softer way to state the claim.
diff --git a/corpus/skills/principle-prove-it/tests/stays_silent_example.md b/corpus/skills/principle-prove-it/tests/stays_silent_example.md
new file mode 100644
index 00000000..a2a32262
--- /dev/null
+++ b/corpus/skills/principle-prove-it/tests/stays_silent_example.md
@@ -0,0 +1,12 @@
+A user asks which name reads better for a local variable in a helper they are
+writing, `retryCount` or `attempts`, and the agent gives an opinion.
+
+This skill stays silent. Auto-firing is driven by the presence of a claim to
+hold evidence against, and there is none here: a naming preference asserts
+nothing about behavior, system state, history, or a cause. There is no
+"this is fixed", no "the cause is X", no hedge about code that could be
+checked by running something.
+
+Firing here would be the skill misbehaving rather than working — demanding a
+command run and pasted output before answering a style question is the
+false-positive this fixture exists to pin down.
diff --git a/product/skills/alternatives-considered/SKILL.md b/product/skills/alternatives-considered/SKILL.md
new file mode 100644
index 00000000..ee64b395
--- /dev/null
+++ b/product/skills/alternatives-considered/SKILL.md
@@ -0,0 +1,87 @@
+---
+name: alternatives-considered
+description: >-
+ Produce the real option set for a decision before committing to the first
+ shape that came to mind. Use before a design, a schema, a naming or format
+ choice, or any change expensive to reverse. Every option is labeled
+ considered (cited) or invented (untested); invented options route to
+ `spike-and-validate` before they can decide anything.
+---
+
+# Alternatives considered
+
+One attempt at a hard design locks in the first shape the model thought of.
+This produces the option set, with each option honest about where it came
+from.
+
+## The asymmetry that governs this skill
+
+`how` and `why` read what exists. They can come back empty, and an empty
+result is informative.
+
+This skill **generates**. It can always produce three plausible options, and
+plausibility is free. Left ungated it manufactures evidence for
+`principle-prove-it` — which is the exact failure that principle exists to
+stop.
+
+So every option carries a label and the label is load-bearing:
+
+| Label | Means | Authority |
+| --- | --- | --- |
+| `considered` | Someone actually weighed this — cite the PR comment, commit, doc, or rejected design | Evidence |
+| `invented` | Produced here, never tried | Hypothesis only |
+
+An `invented` option may not decide anything until `spike-and-validate`
+turns it into a run with real output. Saying "we considered X and rejected
+it" about an option nobody ran is a false claim about the record.
+
+## Step 1. Bound the decision
+
+State in one line: what is being chosen, and what makes it expensive to
+reverse. A decision that is cheap to reverse does not need this skill —
+make it, and move on.
+
+Pull **Avoid** from `why` if it ran. Options already tried and failed are
+`considered` with a citation, not fresh ideas.
+
+## Step 2. Fan out
+
+2–4 subagents, spawned in **one message**, each given the same brief and a
+different constraint to optimize for (fewest moving parts, easiest to
+delete later, best for the caller, cheapest to migrate). Different
+constraints, not different phrasings — same-brief subagents converge.
+
+Each returns rows in the shape at
+`corpus/skills/principle-prove-it/references/finding-shape.md`, with
+`grounding` set to `invented` unless it can cite where the option was
+already weighed.
+
+Give each one its own worktree if it writes anything. Scope wording is not
+filesystem isolation.
+
+## Step 3. Merge into an option set
+
+For each surviving option:
+
+- **Shape** — what the caller writes, first. Then types and boundaries.
+- **Label** — `considered` with citation, or `invented`.
+- **Cost to reverse** — the real question behind most of these decisions.
+- **What would kill it** — the check that would rule it out. This line is
+ the spike brief.
+
+Include the status quo as an option. It is `considered` by definition and
+frequently wins.
+
+## Step 4. Route
+
+- All options `considered` → decide now, cite the record.
+- The leading option is `invented` and expensive to reverse →
+ `spike-and-validate` before committing.
+- Subagents disagree on which constraint matters → that is the real
+ decision. Surface it instead of picking quietly.
+
+## Do not
+
+- Pad the set. Two real options beat four where two are strawmen.
+- Present an `invented` option as prior art.
+- Run this on a reversible decision.
diff --git a/product/skills/alternatives-considered/tests/fires_example.md b/product/skills/alternatives-considered/tests/fires_example.md
new file mode 100644
index 00000000..d0940ca0
--- /dev/null
+++ b/product/skills/alternatives-considered/tests/fires_example.md
@@ -0,0 +1,12 @@
+A user is designing a cache key format for a service and says: "this is
+expensive to change once it's in production — what are our real options
+here?"
+
+This skill fires. It is a design decision that is expensive to reverse,
+which is the stated trigger, and the user is explicitly asking for the
+option set rather than a recommendation. Step 2 fans out subagents each
+optimizing a different constraint (fewest moving parts, cheapest to migrate,
+best for the caller), and Step 3 labels every returned option `considered`
+with a citation or `invented`. Because the leading option is expensive to
+reverse, Step 4 routes it to `spike-and-validate` before it can decide
+anything.
diff --git a/product/skills/alternatives-considered/tests/stays_silent_example.md b/product/skills/alternatives-considered/tests/stays_silent_example.md
new file mode 100644
index 00000000..0c668690
--- /dev/null
+++ b/product/skills/alternatives-considered/tests/stays_silent_example.md
@@ -0,0 +1,8 @@
+A user asks the agent to rename a local variable inside one function from
+`res` to `response`, and confirms the function is not exported.
+
+This skill stays silent. The decision is cheap to reverse — a rename inside
+one unexported function is a single edit undone by a single edit — and the
+skill's Step 1 says a cheap-to-reverse decision does not need it. There is
+no option set worth generating, and producing three labeled alternatives for
+a local rename would be the padding its own "do not" list forbids.
diff --git a/product/skills/how/SKILL.md b/product/skills/how/SKILL.md
new file mode 100644
index 00000000..44ebc6fc
--- /dev/null
+++ b/product/skills/how/SKILL.md
@@ -0,0 +1,77 @@
+---
+name: how
+description: >-
+ Trace how a subsystem actually works before changing it. Use for "how does
+ X work", a walkthrough before an edit, or placement questions ("where
+ should this live", "which package owns this"). Fans out read-only
+ explorers for a subsystem, one explainer for a narrow question. Use `why`
+ for motivation, `alternatives-considered` for options.
+---
+
+# How
+
+Build a working mental model of code you are about to change. The output is
+the mechanism, not annotated source.
+
+Feeds `principle-prove-it`: you cannot exercise the real artifact until you
+know which artifact is real.
+
+## Step 1. Size the question
+
+State your reading of the scope in one line, then proceed. The user can
+redirect.
+
+- **Narrow** — one module, one function, one file. No fan-out. Read and
+ explain in a single pass. Go to Step 3.
+- **Broad** — a subsystem across files or packages, a cross-cutting flow, an
+ architectural overview. Fan out first. Go to Step 2.
+
+When it is ambiguous, take the narrow path. A second pass is cheaper than
+four subagents answering a question that had one file in it.
+
+## Step 2. Fan out (broad only)
+
+Split the question into 2–4 angles that do not overlap. Spawn all explorers
+in **one message** so they run concurrently:
+
+- `subagent_type: Explore` (or `general-purpose` where Explore is absent)
+- read-only; no edits, no worktree needed
+
+Each explorer owns one angle and returns rows in the shape at
+`corpus/skills/principle-prove-it/references/finding-shape.md`.
+
+**Prompt hygiene:** give each explorer the question and the entry points,
+not your working theory. A primed explorer finds roughly what you already
+suspected.
+
+**Every explorer states grounding per row.** `read-confirmed` means it
+opened the actual import or call site and traced it. `name-matched` means
+the path looked right. Two files can hold the same symbol name; a subagent
+reasoning by name-proximity hands back a confident wrong file.
+
+## Step 3. Explain
+
+Merge the rows and write the explanation yourself. Sections, dropping any
+that do not apply:
+
+- **Overview** — what this does, in two sentences.
+- **Runtime flow** — the actual call path, entry point to effect.
+- **Key types** — the data structures the logic is written against.
+- **Where things live** — `file:line` per claim, with the ref.
+- **Gotchas** — the non-obvious parts, and what looks wrong but isn't.
+- **Not traced** — every angle that came back empty or was not covered.
+
+Do not drop the last section for brevity. A gap you name is a gap the reader
+can fill; a gap you omit reads as coverage.
+
+## Hand-off
+
+When `how` precedes a change, end with the mechanism that must still work
+afterward, phrased as a command or check. That line is what
+`principle-prove-it` will demand output from later.
+
+## Do not
+
+- Explain from a grep hit. A name match is not a read.
+- Fan out on a question one file answers.
+- Report a flow you inferred from function names as if you traced it.
diff --git a/product/skills/how/tests/fires_example.md b/product/skills/how/tests/fires_example.md
new file mode 100644
index 00000000..682c0f2f
--- /dev/null
+++ b/product/skills/how/tests/fires_example.md
@@ -0,0 +1,11 @@
+A user is about to add a new notification channel and asks: "how does the
+dedupe path work before I touch it? is there an n+1 when we look up
+subscribers?"
+
+This skill fires. The question is a mechanism question about a subsystem the
+agent has not read, asked ahead of an edit — the skill's stated trigger. It
+spans more than one file (dedupe plus subscriber lookup), so Step 1 sizes it
+broad and Step 2 fans out read-only explorers on non-overlapping angles.
+Each returned row carries `read-confirmed` or `name-matched` grounding, and
+the merged explanation ends with the mechanism that must still work after
+the change — the line `principle-prove-it` will later demand output from.
diff --git a/product/skills/how/tests/stays_silent_example.md b/product/skills/how/tests/stays_silent_example.md
new file mode 100644
index 00000000..0a3f2a01
--- /dev/null
+++ b/product/skills/how/tests/stays_silent_example.md
@@ -0,0 +1,10 @@
+A user asks to bump a timeout constant from 30 to 60 seconds in a file they
+are currently looking at, and pastes the line. The agent makes the one-token
+edit.
+
+This skill stays silent. There is no mechanism to trace: the target is a
+single literal in a file already in context, the user supplied the code, and
+nothing about the change depends on understanding a call path. Step 1 would
+size this narrow and the skill's own "do not" list rules out fanning
+subagents at a question one file answers. Running `how` here would spend
+subagents to re-explain a line the user just read.
diff --git a/product/skills/spike-and-validate/SKILL.md b/product/skills/spike-and-validate/SKILL.md
new file mode 100644
index 00000000..fc0e71b8
--- /dev/null
+++ b/product/skills/spike-and-validate/SKILL.md
@@ -0,0 +1,80 @@
+---
+name: spike-and-validate
+description: >-
+ Turn an untested assumption into real output by building the smallest
+ throwaway that would kill it, running it, then discarding the code and
+ keeping the finding. Use before committing to an invented option, an
+ unfamiliar library or API, or a performance assumption. The gate on
+ `alternatives-considered`.
+---
+
+# Spike and validate
+
+A spike is an experiment, not a draft of the real change. Its only product
+is a run with real output. The code goes in the bin.
+
+This is the gate that makes `alternatives-considered` safe: an option nobody
+ran is a hypothesis, and a spike is the cheapest way to stop it from
+becoming a decision.
+
+## Step 1. Write the kill condition first
+
+Before any code, in one line: **what result would rule this out?**
+
+If you cannot write that line, you are not spiking, you are starting the
+implementation. Stop and say so.
+
+The kill condition is falsifiable and specific. "See if the library works"
+is not one. "Parses our 40MB fixture in under 2s on this machine" is.
+
+## Step 2. Build the smallest thing that could fail
+
+- Own worktree or scratch directory. Never the live checkout.
+- Hardcode everything not under test. Config, auth, error handling, and
+ edge cases are not what you are learning.
+- No tests, no cleanup, no comments. This code is not going to review.
+- Timebox it and say the box out loud. A spike that outgrows its box has
+ become the implementation without anyone deciding that.
+
+## Step 3. Run it and paste the output
+
+The whole point. Real command, real output, in the same message as the
+verdict — `principle-prove-it`, applied to your own experiment.
+
+A spike that only passes proves less than you think. Where the assumption
+has a failing side, show both: the case that works and the case that
+breaks. A run that could not fail did not test anything.
+
+## Step 4. Discard the code, keep the finding
+
+**Delete the spike.** A spike promoted to production carries every shortcut
+in Step 2 with it, and nobody remembers which lines were deliberate.
+
+What survives is one row in the shape at
+`corpus/skills/principle-prove-it/references/finding-shape.md`:
+
+- `claim` — the assumption, now resolved.
+- `grounding` — `read-confirmed`, because you ran it.
+- `evidence` — the command and its real output.
+- `null_result` — what the spike did **not** cover. Always fill this in. A
+ spike proves one thing on one machine with one fixture.
+
+Then say plainly: **validated**, **killed**, or **inconclusive**.
+Inconclusive is a real outcome and much better than a spike quietly
+reported as a pass.
+
+## When not to spike
+
+- The answer is in the code — that is `how`.
+- The answer is in the history — that is `why`.
+- The decision is cheap to reverse. Build it and change it later.
+- You already know the answer and want cover for it. That is not an
+ experiment.
+
+## Do not
+
+- Spike in the live checkout.
+- Skip the kill condition and decide after the fact what the run showed.
+- Ship the spike. If it turns out to be the right shape, rebuild it with
+ the shortcuts removed.
+- Report a spike that never ran as evidence for anything.
diff --git a/product/skills/spike-and-validate/tests/fires_example.md b/product/skills/spike-and-validate/tests/fires_example.md
new file mode 100644
index 00000000..edfa935d
--- /dev/null
+++ b/product/skills/spike-and-validate/tests/fires_example.md
@@ -0,0 +1,12 @@
+A plan needs a streaming ZIP reader for uploads up to 2GB. Nobody on the
+team has used the candidate library, and `alternatives-considered` returned
+it labeled `invented` — plausible, never run here.
+
+This skill fires. An untested assumption is about to decide an expensive
+choice, which is the stated trigger and the gate
+`alternatives-considered` routes to. Step 1 writes the kill condition first
+("streams a 2GB fixture without loading it into memory, under 4GB RSS"),
+Step 2 builds a hardcoded throwaway in its own scratch directory, Step 3
+runs it and pastes the real output including the case that breaks, and Step
+4 deletes the code, keeps one finding row with `null_result` naming what the
+spike did not cover, and reports validated, killed, or inconclusive.
diff --git a/product/skills/spike-and-validate/tests/stays_silent_example.md b/product/skills/spike-and-validate/tests/stays_silent_example.md
new file mode 100644
index 00000000..1343dfc1
--- /dev/null
+++ b/product/skills/spike-and-validate/tests/stays_silent_example.md
@@ -0,0 +1,10 @@
+A user asks why an existing export job writes duplicate rows after a retry.
+The behavior is already implemented, already reproducible, and the answer is
+in the code.
+
+This skill stays silent. Its own "when not to spike" section rules this out
+directly: the answer is in the code, so this is `how`, and the causal
+question about an existing defect belongs to the repro-then-fix path in
+`principle-fix-root-causes`. There is no untested assumption about something
+that does not exist yet, and building a throwaway would not answer a
+question the real code already answers.
diff --git a/product/skills/why/SKILL.md b/product/skills/why/SKILL.md
new file mode 100644
index 00000000..85c6a37c
--- /dev/null
+++ b/product/skills/why/SKILL.md
@@ -0,0 +1,94 @@
+---
+name: why
+description: >-
+ Recover why code is shaped the way it is before changing it. Use for "why
+ does X work this way", "why was this threshold picked", design rationale,
+ and dead-code questions. Anchors in git history and PR bodies first, then
+ fans out one investigator per available evidence source and reports every
+ null. Use `how` for runtime behavior.
+---
+
+# Why
+
+`how` answers what the code does. `why` answers what forces produced it.
+
+Feeds `principle-prove-it`: a constraint you cannot see is a constraint you
+will delete. Most "we changed it back a week later" bugs are this.
+
+## Operating posture
+
+Careful and explicit about the line between what the record says and what
+you are inferring from it. Never smooth an inference into a fact because it
+reads better.
+
+## Step 1. Anchor in the code
+
+Build this inline **before** spawning anything. Every investigator starts
+from it, so a weak anchor wastes the whole fan-out.
+
+```sh
+git blame -L , -- # last-touch commits
+git log --oneline -20 -- # recent commits, PR numbers visible
+git log --follow -p -- # full history through renames
+gh pr view --json title,body,author,mergedAt,comments,reviews
+```
+
+Capture: file paths, line ranges, key symbols, commit SHAs, PR numbers, and
+any ticket IDs those PR bodies reference. Read the PR bodies yourself. Review
+discussion is where implementation-time rationale actually lives, and it is
+usually the answer.
+
+## Step 2. Fan out over the sources that exist
+
+List the evidence sources actually available in this environment before
+assigning any. Typical set: git and `gh` (always), the issue tracker,
+long-form docs, team chat, error tracking, observability, analytics —
+whichever have a working MCP or CLI here.
+
+One investigator per source, spawned in **one message**. Do not hand one
+subagent two sources; it will search the easy one and summarize the other.
+
+Each returns rows in the shape at
+`corpus/skills/principle-prove-it/references/finding-shape.md`.
+
+**Document the null.** A source that returned nothing gets a row with
+`null_result` set and a line in Sources Consulted. Skipping a source needs a
+written reason in the output — "no MCP available here" or "provably
+irrelevant, this is a build-time script with no runtime path." "Probably
+irrelevant" is not a reason.
+
+This is the same rule as the projection rule in `engine/CLAUDE.core.md`:
+absence from a projection is not proof of absent state.
+
+## Step 3. Report with the confidence separated
+
+- **The question** — restated, and the code it points at.
+- **What the record says** — cited. Commit, PR, ticket, message, with the ref.
+- **What we can reasonably infer** — clearly marked as inference.
+- **Competing explanations** — when two readings both fit, give both.
+- **What we don't know** — including every null and every skipped source.
+- **Sources consulted** — one line each, including the empty ones.
+
+"Nobody wrote it down" is a real answer and often the most useful one: it
+means the constraint is unprotected and the next person will break it too.
+
+## Step 4. Convert to constraints (when a change follows)
+
+If the `why` precedes an edit, end with:
+
+- **Preserve** — behavior the history says was paid for.
+- **Change** — what the original reason no longer justifies.
+- **Avoid** — approaches the record shows were already tried and failed.
+- **Risk** — what breaks if the recovered reason is wrong.
+
+Hand that set to the plan. `alternatives-considered` treats **Avoid** as
+already-explored ground.
+
+## Do not
+
+- Treat the most recent commit as authoritative. The current shape is
+ usually accretion, not a decision.
+- Report a PR body's claim as a fact about today's code without checking the
+ code still matches it.
+- Answer inline from one commit unless you can say why every other available
+ source would have been redundant.
diff --git a/product/skills/why/tests/fires_example.md b/product/skills/why/tests/fires_example.md
new file mode 100644
index 00000000..02e9a3c6
--- /dev/null
+++ b/product/skills/why/tests/fires_example.md
@@ -0,0 +1,12 @@
+A user is cleaning up a retry helper and asks: "why is the retry limit set
+to five? does that reason still hold, or can I raise it?"
+
+This skill fires. It is a rationale question about an existing constant, not
+a behavior question, and it precedes a change — the skill's stated trigger.
+Step 1 anchors inline with `git blame -L` on the constant, `git log
+--oneline` for the PR number, and `gh pr view` on the merge commit before
+any subagent spawns. Step 2 fans out one investigator per source actually
+available here, and a source with no MCP gets a null row plus a written
+reason rather than being dropped. The report separates what the record says
+from what is inferred, and Step 4 converts the answer into
+Preserve / Change / Avoid / Risk for the edit that follows.
diff --git a/product/skills/why/tests/stays_silent_example.md b/product/skills/why/tests/stays_silent_example.md
new file mode 100644
index 00000000..a7f6ce9c
--- /dev/null
+++ b/product/skills/why/tests/stays_silent_example.md
@@ -0,0 +1,10 @@
+A user asks the agent to add a `--json` flag to a CLI command that has no
+existing output-format handling, on a file created in this same session.
+
+This skill stays silent. There is no lineage to recover: the code was
+written minutes ago in the current session, there is no blame history, no
+merged PR, and no prior decision anyone could have written down. Step 1's
+anchor commands would return the session's own commit or nothing at all, and
+fanning investigators across an issue tracker and team chat for a file that
+never existed before today would produce nothing but null rows. The
+motivation is in the user's request, already stated.