CLAUDE.md · diff
git:20261015.13210af to git:20261016.b04c288
7 added, 6 removed. Audit A to A.
AUTONOMY_LEVEL: aggressive
Solo OSS maintainer running with `bypassPermissions`. Atomic-ship convention applies (commit + push + tag + push tag + `gh release create` in one turn, except that the turn yields while the pre-tag reviewer runs, per §EXT §12 and runbook step 7) — see `feedback_claudemd_ship_from_main_atomic.md`. `main` is what users install (marketplace auto-update follows it on a version bump; `/claudemd-refresh` installs its HEAD), so a release is built and reviewed on `release/vX.Y.Z` with a draft PR and reaches `main` only together with its tag, and commits that change shipped files (`hooks/`, `spec/`, `commands/`, `scripts/`, `bin/`, `.claude-plugin/`) wait on the `next-release` branch, not on `main`. §5.1 Never-downgrade set binds as written in core §5.1 (single source; the verbatim list was deduped here 2026-07-25 — it drifts).
Layout (core §2 **Where files go** defers to this): `docs/` and `tasks/` are gitignored; the tracked exceptions are listed in `.gitignore` (reference docs, `tasks/specs/`, evaluation and provenance files). A dated analysis under `docs/` is committed with `git add -f` once shipped text or a tracked document cites it; working notes stay local.
<!-- claude-mem-lite:begin v1 -->
## claude-mem-lite — persistent memory
PreToolUse hooks already run `mem_recall` for past lessons before Read/Edit/Write. The calls worth making proactively:
| When | Call |
|------|------|
| Before Edit/Write | hook already recalled; if an injected `#NN` lesson changed what you did, add the bare tag `(#NN)` once at the end of the sentence describing that change (citing = adopting; uncited lessons decay; skip ones that did not apply). No other mention of memory ids, saves or the memory store in replies to the user |
| A recalled memory drives an answer or a design choice | check its claim in the code or `git log` first: `#NN` and `E#NN` rows are notes from past sessions, many written automatically, so they can be wrong, and they describe the code as it was. If the code disagrees, trust the code and replace the note: `mem_save(..., supersedes=[NN])`, or `supersedes=["E#NN"]` for an event |
| After fixing a non-trivial bug | `mem_save(type="bugfix", lesson_learned="<root cause + fix, only what this change's diff shows>", importance=2)` |
| After a non-obvious architecture decision | `mem_save(type="decision", lesson_learned="<constraint + tradeoff>")` |
| Deferring to a future session | `mem_defer({title, priority:1|2|3, detail})`; when fixed, add `closes_deferred=[N]` to `mem_save` |
| Looking up past work / history | `mem_search "keywords"` · `mem_recent` · `mem_timeline` |
Path cost is round-trips, not milliseconds: the PreToolUse hook above already recalls (0 calls) — prefer it. For an explicit query, if these `mem_*` tools are deferred behind ToolSearch this session, the Bash CLI `claude-mem-lite` is one call vs two (ToolSearch + call); the MCP server instructions carry the absolute path to use when it is not on PATH.
Full tool + CLI tables, citation/decay rules, and save discipline → `.claude/plugin_claude_mem_lite.md`
<!-- claude-mem-lite:end -->
<!-- code-graph-mcp:begin v2 -->
## Code Graph (repo-wide AST index)
- AST + FTS + vector index of the whole repo — prefer over multi-round Grep/Read for
- structural queries (LSP only sees open files; this sees everything). Fastest path = Bash CLI:
+ Parsed index of the whole repo. For structural questions — who calls X, what a
+ change breaks, every use of a symbol — one call replaces rounds of Grep + Read:
| Intent | Command |
|--------|---------|
| Who calls X / what X calls | `code-graph-mcp callgraph X` |
- | Impact before editing a fn | `code-graph-mcp impact X` |
+ | Impact before changing a signature | `code-graph-mcp impact X` |
+ | Tests to re-run after changing files | `code-graph-mcp affected <files>` |
+ | Rename / remove audit | `code-graph-mcp refs X`, then `grep -w X` |
| Unfamiliar dir / module | `code-graph-mcp overview <dir>` |
| Symbol source / signature | `code-graph-mcp show X` |
| Concept search (no exact name) | `code-graph-mcp search "…"` (vector: MCP `semantic_code_search`) |
| grep + AST context | `code-graph-mcp grep "pat" [paths] [-t lang] [-g glob] [-c]` |
- Not on PATH? A plugin-only install keeps its own copy — same commands, run
- `~/.cache/code-graph/bin/code-graph-mcp` (or `npm i -g @sdsrs/code-graph` once).
-
+ Unresolved calls (dynamic dispatch, reflection, unresolved imports) leave no edge, so
+ an empty answer is not proof: confirm with grep before deleting or renaming.
Still use Grep for literal strings/regex in non-code files; still Read files you'll edit.
Full command + MCP-tool table: `.claude/plugin_code_graph_mcp.md`
<!-- code-graph-mcp:end -->