Full Close
Effort: free — ordering discipline on a fix you already owe: disk-truth probes and the failing test come first, not extra. Removes: option menus and per-step confirmations lobbed at the human mid-outage.
When the human reports breakage or says "fix it", there is exactly one right answer:
a full, understanding-first close. Root cause with evidence, a failing test first,
green, live proof on the human's own path, then commit. Never a menu of options back
at them, and never a confirmation prompt per step — they already said fix it.
Where sibling skills demand an explicit yes for destructive acts, this rule wins the
reversible half only: the human's "fix it" IS the standing yes for reversible recovery
writes that leave a backup trail; anything irreversible (data destruction, spend,
external sends) still crosses the decision-bar, and the bar wins.
Ask the human for something only when it is provably lost everywhere else and only
they can supply it. Every other input, you go find.
The method
- Probe the normal surface — then stop trusting it. Call the API or CLI once. If
it answers normally, this is not an incident-closure situation; hand off. If it returns
401/403, connection refused, empty results where data should be, or stale data,
stop treating that surface as authoritative.
- Establish ground truth from disk, not from the API. Never trust a broken
service to describe its own state. Read the data files, directory listings, and
modification times yourself, and compare to what the API claims. Divergence is the
diagnostic signal.
- Scan the blast radius. Search every top-level data directory for files touched
inside the failure window (e.g.
find /data/volumes -newermt "<start>" ! -newermt "<end>"). Aim for a one-screen answer to "what got touched, what didn't". Narrow
radius (one volume, one table) is recoverable here. Broad radius (many volumes, the
whole data dir) is disaster recovery — escalate, don't improvise.
- Inventory survivors vs losses. Classify every affected asset:
- intact on disk — recover as-is
- rebuildable from the repo — configs and backups checked into git
- rebuildable from env or credential files — tokens, passwords
- permanently lost — encrypted with a missing key, runtime-only state
Only the last bucket warrants asking the human. Everything else you rebuild.
- Root cause with evidence, then a red test. Name why it broke, with proof from
disk — not a guess. Where the defect is code, write the failing test that captures
it before the fix, and make it green. See red-first and
root-cause-first.
- Cascade down through layers — never up to the human. When the preferred path is
broken, drop one layer and try again:
API / SDK → CLI inside the container → direct DB writes → filesystem surgery.
Do not prompt the human while cascades remain untried. Every rung down is cheaper
than asking.
- Assume dependencies are broken too. Recovery code uses only your language's
standard library for HTTP and JSON — third-party clients may be part of what died.
- Write idempotently, with backup trails. Every disk write leaves a timestamped
.bak copy beside the target. Read, sanity-check, copy, write, re-check — never
blind-overwrite. If you temp-swap a credential to mint a new key, back up the
original first and restore it before returning: the human's own login survives
untouched.
- Verify with live calls on the human's own path. Re-run the step-1 probe and
confirm the numbers match the pre-incident inventory or the repo backups. Green DB
state is not proof; the surface the human uses working again is proof.
- Commit and report. Commit the fix's own files only. Report: what was probed,
the blast radius, actions taken in order, counts restored, what is permanently
lost (empty if nothing), and any step that failed non-fatally.
Red flags — stop and re-probe
- "Let me ask the human why it broke" — no; find out from disk first.
- "The API says there's nothing here" — a broken API's view of itself is not truth.
- "I'll just reinstall clean" — you are discarding recoverable state.
- "The key is gone so the credentials are useless" — plaintext values often still
live in env or credential files; recreate the credential.
- "Confirm before each step?" — the human said fix it; run the cascade, report at end.
Hard rules — any one of these fails the skill
- Options presented back to the human when a clear solve exists.
- A destructive write with no
.bak trail.
- The human asked for anything before the cascade and the inventory ran dry.
- A retired subsystem "helpfully" restored — a decommissioned service staying down is
the desired state, and re-enabling it is the human's deliberate call.
- Recovery claimed done off internal state instead of a live probe on their path.
- Fix left uncommitted (unless the human explicitly said no commit).
Works well with
1---2name: incident-closure3description: Use when the human reports breakage or says "fix it" — especially when the normal control plane (API, CLI, service) is dead and you must reach underneath it. The answer is a full understanding-first close (root cause with evidence, failing test first, green, live proof on the human's own path, commit), never a menu of options back at them. Trigger words: fix it, fix shit, full close, broken, wiped, down, it stopped working, recover, restore.4license: MIT5---67# Full Close8**Effort:** free — ordering discipline on a fix you already owe: disk-truth probes and the failing test come first, not extra. Removes: option menus and per-step confirmations lobbed at the human mid-outage.910When the human reports breakage or says "fix it", there is exactly one right answer:11a full, understanding-first close. Root cause with evidence, a failing test first,12green, live proof on the human's own path, then commit. Never a menu of options back13at them, and never a confirmation prompt per step — they already said fix it.1415Where sibling skills demand an explicit yes for destructive acts, this rule wins the16reversible half only: the human's "fix it" IS the standing yes for reversible recovery17writes that leave a backup trail; anything irreversible (data destruction, spend,18external sends) still crosses the [decision-bar](../decision-bar/SKILL.md), and the bar wins.1920Ask the human for something only when it is provably lost everywhere else and only21they can supply it. Every other input, you go find.2223## The method24251. **Probe the normal surface — then stop trusting it.** Call the API or CLI once. If26 it answers normally, this is not an incident-closure situation; hand off. If it returns27 401/403, connection refused, empty results where data should be, or stale data,28 stop treating that surface as authoritative.292. **Establish ground truth from disk, not from the API.** Never trust a broken30 service to describe its own state. Read the data files, directory listings, and31 modification times yourself, and compare to what the API claims. Divergence is the32 diagnostic signal.333. **Scan the blast radius.** Search every top-level data directory for files touched34 inside the failure window (e.g. `find /data/volumes -newermt "<start>" ! -newermt35 "<end>"`). Aim for a one-screen answer to "what got touched, what didn't". Narrow36 radius (one volume, one table) is recoverable here. Broad radius (many volumes, the37 whole data dir) is disaster recovery — escalate, don't improvise.384. **Inventory survivors vs losses.** Classify every affected asset:39 - intact on disk — recover as-is40 - rebuildable from the repo — configs and backups checked into git41 - rebuildable from env or credential files — tokens, passwords42 - permanently lost — encrypted with a missing key, runtime-only state43 Only the last bucket warrants asking the human. Everything else you rebuild.445. **Root cause with evidence, then a red test.** Name why it broke, with proof from45 disk — not a guess. Where the defect is code, write the failing test that captures46 it before the fix, and make it green. See [red-first](../red-first/SKILL.md) and47 [root-cause-first](../root-cause-first/SKILL.md).486. **Cascade down through layers — never up to the human.** When the preferred path is49 broken, drop one layer and try again:50 API / SDK → CLI inside the container → direct DB writes → filesystem surgery.51 Do not prompt the human while cascades remain untried. Every rung down is cheaper52 than asking.537. **Assume dependencies are broken too.** Recovery code uses only your language's54 standard library for HTTP and JSON — third-party clients may be part of what died.558. **Write idempotently, with backup trails.** Every disk write leaves a timestamped56 `.bak` copy beside the target. Read, sanity-check, copy, write, re-check — never57 blind-overwrite. If you temp-swap a credential to mint a new key, back up the58 original first and restore it before returning: the human's own login survives59 untouched.609. **Verify with live calls on the human's own path.** Re-run the step-1 probe and61 confirm the numbers match the pre-incident inventory or the repo backups. Green DB62 state is not proof; the surface the human uses working again is proof.6310. **Commit and report.** Commit the fix's own files only. Report: what was probed,64 the blast radius, actions taken in order, counts restored, what is permanently65 lost (empty if nothing), and any step that failed non-fatally.6667## Red flags — stop and re-probe6869- "Let me ask the human why it broke" — no; find out from disk first.70- "The API says there's nothing here" — a broken API's view of itself is not truth.71- "I'll just reinstall clean" — you are discarding recoverable state.72- "The key is gone so the credentials are useless" — plaintext values often still73 live in env or credential files; recreate the credential.74- "Confirm before each step?" — the human said fix it; run the cascade, report at end.7576## Hard rules — any one of these fails the skill7778- Options presented back to the human when a clear solve exists.79- A destructive write with no `.bak` trail.80- The human asked for anything before the cascade and the inventory ran dry.81- A retired subsystem "helpfully" restored — a decommissioned service staying down is82 the desired state, and re-enabling it is the human's deliberate call.83- Recovery claimed done off internal state instead of a live probe on their path.84- Fix left uncommitted (unless the human explicitly said no commit).8586## Works well with8788- [repair-loop](../repair-loop/SKILL.md) — the code-fix loop this close runs when the defect is in code.89- [root-cause-first](../root-cause-first/SKILL.md) · [red-first](../red-first/SKILL.md)90- [decision-bar](../decision-bar/SKILL.md) — what may reach the human, and how.