When bassclef breaks at 2am
Six named failure classes. Each carries a symptom, a diagnose command, an expected output, and the recovery step.
Use this when
Something bassclef is supposed to do is not happening, or a session just did something you did not expect. Look for the symptom that matches your case. Run the diagnose command. Compare against the expected output. Follow the recovery step.
Skip this when
You are evaluating bassclef or reading the docs for fun. This page is for the moment things break. Bookmark it now so you can find it later.
The six classes
Session-start hook did not fire
- Symptom
- Claude Code opens but no BLOCKED banner appears, no whereami read, no substrate sync. The session feels like a fresh clone with no bassclef wiring.
- Diagnose
cat ~/.claude/settings.json | jq '.hooks.SessionStart'- Expected output
- An array with at least one entry pointing at bassclef-sync.sh or a dispatcher path
- Recovery
- Run
bassclef checkto see which hooks are wired. If the SessionStart entry is missing, runbassclef initagain in the repo root. Ifbassclef checkitself is not found, reinstall the CLI.
Skill dispatches but produces no output
- Symptom
- You type /riff or /launch and Claude answers as if the skill is not there. No skill-specific procedure runs. Claude falls back to freeform text.
- Diagnose
ls ~/.claude/skills/riff/SKILL.md- Expected output
- A file listing that shows the SKILL.md exists at the expected path
- Recovery
- The symlink is broken or the skill was not synced. Run
bassclef syncto re-symlink from the bassclef release. If the symlink target is a version you did not want, edit.bassclef-source.jsonand set the version explicitly.
Hook silently blocks work
- Symptom
- Claude tries to edit a file and the edit does not happen. No error appears in the response. Claude keeps going as if the edit succeeded.
- Diagnose
tail -50 ~/.claude/logs/hook-trace.log- Expected output
- A recent entry naming the hook that fired, the tool it blocked, and the reason
- Recovery
- Read the hook name in the trace log. Find the matching rule under
.claude/rules/— the rule body carries the override env var (usuallySKIP_<NAME>=1). Set the override for your next call if the block is a false-positive, or fix the underlying condition the hook is checking.
Auto-sync fetched a broken release
- Symptom
- A session that worked yesterday breaks today. New errors appear about missing skills, missing rules, or hooks that reference paths that do not exist.
- Diagnose
cat .bassclef-source.json && ls -la ~/.claude/skills/ | head- Expected output
- A source config with a version pinned, and skill symlinks pointing at the fetched release directory
- Recovery
- Set
auto_sync: falsein.bassclef-source.json, pin an explicit version that worked (see the release feed for the last known-good tag), and re-runbassclef sync. Report the broken release on GitHub Issues so upstream can fix it.
State-spine schema validation fails on write
- Symptom
- Something tries to update whereami or a marker and the write is refused with an ajv error about missing or extra fields.
- Diagnose
bash .claude/hooks/state-validate.sh <path-to-file>- Expected output
- Either PASS or a specific error naming the failing field and the schema constraint
- Recovery
- Fix the field to match the schema, or update the schema if it is genuinely wrong (that requires a PR). For a one-off migration, set
SKIP_STATE_VALIDATE=1— logged to trace; use rarely. Full detail at the rule doc.
Session ended abruptly and left work uncommitted
- Symptom
- Next session starts with a BLOCKED banner about a session-rescue file in docs/deferred-actions/. The rescue file names an unfinished obligation from the prior session.
- Diagnose
ls docs/deferred-actions/ | grep session-rescue- Expected output
- One or more *-session-rescue.md files
- Recovery
- Read the rescue file's body. Run
/session-endto complete the flagged obligations. If the rescue was a false-positive (work was actually done), Pattern B applies —git mv docs/deferred-actions/<file> docs/deferred-actions/completed/. Commit with a note explaining the false-positive reason.
Something else broke
If your symptom is not on this page, file an issue with the diagnose output attached: Report an issue on GitHub. The page grows as new classes surface.
2026-07-26 — CF token outage narrative flip
A 9-day production outage attributed to "gateway drift" that was really invalid token value on day 1. Assert-only-after-verify discipline pattern.
State spine
bassclef's authoritative state layer — JSON-on-git with typed accessors so consumers do not reach into raw files.