From fno
Repair a broken state. Routes to the fast one-fix-per-iteration loop with auto-revert (fix, default) or the scientific-method hypothesis loop (investigate). Use when: 'fix all errors', 'make tests pass', 'fix the build', 'debug this', 'investigate this failure'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/fno:fix [fix|investigate] (fix: [from-debug] [--scope <glob>] [--guard <cmd>] [--category test|type|lint|build] [Iterations: N])[fix|investigate] (fix: [from-debug] [--scope <glob>] [--guard <cmd>] [--category test|type|lint|build] [Iterations: N])The summary Claude sees in its skill listing — used to decide when to auto-load this skill
**One verb on a broken state.** `/fix` routes between fast repair and methodical diagnosis.
One verb on a broken state. /fix routes between fast repair and methodical diagnosis.
| Mode | What runs | Use when |
|---|---|---|
fix (default) | fast one-fix-per-iteration loop, auto-revert on regression | you know roughly what is broken and want it green |
investigate | scientific-method hypothesis loop (BDD criteria + failing repro) | the cause is unknown and you need to find it first |
This is a router. It parses the first argument as a mode, announces the resolved mode, then either runs the default loop here or loads the investigate reference and follows it. It never calls another skill at runtime (it dispatches the tournament-debugger via the Task/Agent tool and loads the investigate flow via Read).
/fix writes code. Before resolving the mode, consult the shared location verdict (the SAME one /target and /do use, so the canonical-main rule never drifts). Resolve the plugin root portably so the helper is found on non-Claude surfaces too (where CLAUDE_PLUGIN_ROOT is unset and the project checkout is NOT the abilities plugin): try CLAUDE_PLUGIN_ROOT, then CODEX_PLUGIN_ROOT, then the persisted ~/.fno/plugin-root pointer (written by session-start.sh), then the git root.
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-${CODEX_PLUGIN_ROOT:-$(cat "$HOME/.fno/plugin-root" 2>/dev/null || git rev-parse --show-toplevel 2>/dev/null)}}"
LOC_HELPER="$PLUGIN_ROOT/hooks/helpers/check-impl-location.sh"
[[ -f "$LOC_HELPER" ]] && bash "$LOC_HELPER" || echo "verdict=ok"
If the output carries verdict=canonical-protected AND TARGET_LOCATION_OK is not main-acknowledged, REFUSE: do not resolve the mode, do not write. Name the branch (from the branch= line) and print the exact escape, then stop:
/fix refused: canonical checkout on '<branch>' (sibling terminals share .fno/).
worktree: git worktree add ~/conductor/workspaces/<repo>/<slug> -b feature/<slug>
branch: git checkout -b feature/<slug>
override: re-run with TARGET_LOCATION_OK=main-acknowledged
Otherwise (verdict=ok, a linked worktree, or the helper absent) continue to Step 1.
Parse the first argument token:
investigate -> mode is investigate. Print running investigate (hypothesis loop). Go to "Investigate mode".
fix -> mode is fix (explicit). Print running fix (repair loop). Consume the token; the rest are fix's arguments. Go to "Fix mode".
empty, from-debug, a --flag, or Iterations: N -> mode is fix (default). Print running fix (default). Keep the token as fix's own argument. Go to "Fix mode".
any other bare non-flag word -> this is an unknown mode (likely a typo). Do NOT default, do NOT guess. Print:
unknown fix mode: '<token>'
valid modes: fix (default), investigate
and stop with a non-zero result. This is the locked router contract: an unknown non-empty mode never silently falls through.
Load investigate.md and execute it in full, in this context. That reference is the canonical scientific-method debugging loop: define acceptance criteria, prove the bug with a failing reproduction, then test one falsifiable hypothesis per iteration. When it finishes with confirmed findings, the natural next step is the default repair loop - /fix from-debug consumes those findings in severity order.
Repair a broken state iteratively until the error count reaches zero or the loop exhausts its budget.
Load these references as needed:
Iterations: 15fix/{YYMMDD}-{HHMM}-{slug}/If the user did not provide explicit target information, auto-detect failures first and then ask in one batched AskUserQuestion call:
The first question should summarize the detected failure counts.
Use verification-patterns.md to identify:
If from-debug modifier is set, read the latest debug/*/findings.md (or .fno/debug/*.md) and populate the queue from confirmed bugs first.
Nothing-to-fix exit (EDGE). If detection finds zero failures across every category (clean working tree, no failing test, no debug findings), report nothing to fix and exit cleanly. Do NOT enter the iteration loop on an empty queue.
Fix order:
Load iteration-loop.md and run this atomic loop:
git commit before verifydeltafix-results.tsvMaximum rework attempts per item: 2. After that, add it to the blocked list and continue.
Write:
fix/{YYMMDD}-{HHMM}-{slug}/fix-results.tsvfix/{YYMMDD}-{HHMM}-{slug}/summary.mdsummary.md must include:
/review), or run the project's test/lint/build commands to verify fixes| Category | Strategy |
|---|---|
| build | fix the exact import, syntax, or config break |
| type | proper types, null handling, generics, explicit narrowing |
| test | fix implementation, not the test, unless the test is provably wrong |
| lint | satisfy the rule, do not suppress it |
| bug | apply the concrete fix implied by the debug evidence |
Discard and re-queue any fix that uses:
@ts-ignoreeslint-disable# type: ignore# noqaany used only to silence type errorsdelta > 0 and the guard passesdelta > 0 but the guard failsdelta <= 0fix_score = reduction * 0.60 + guard_health * 0.25 + quality * 0.15
npx claudepluginhub bllshttng/footnote --plugin fnoCreates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.