Release 0.1.2 — agentic-review fixes (automaticity, write-surface, ergonomics)#11
Conversation
…, ergonomics) Addresses the findings from the 2026-06-26 agentic review. The dominant finding was that the memory store's value was gated on the agent remembering to invoke the CLI; this wires the existing automaticity primitives together so the store is consulted automatically. Groundwork: - Generalize the .gitignore fenced-block writer into rewrite_managed_block (Markdown comments + removal); add merge_json_file for safe .mcp.json / settings.json merges that preserve sibling keys. Tier 1 (bug fixes + ergonomics): - capture: summarize git diff as `N files changed, +X/-Y` (git diff --shortstat) instead of inlining the per-file --stat — fixes record bloat and the self-inflicted high-entropy secret false-positive (§6.1). - note: new `crumb note question|trap|idea` write-surface + memory_note MCP tool; parse-verified, validate-gated, refreshes the resume packet; adds the `idea` body-section vocabulary (§6.6). - schema: new `crumb schema [--json] [--template]` plus named attempt flags (--problem/--tried/--result/--why/--do-not-retry/--related) (§6.2/§8). - secrets: allowlist path/identifier-shaped tokens in the entropy scanner without lowering the floor; real base64/=-padded blobs still flag (§6.4). - mcp: surface the server via `crumb mcp serve|register` (§6.3). Tier 2 (init bootstrapper — the dominant finding §5/§7): - Inject a small, reversible signpost block into detected agent-guidance files; merge a breadcrumbs entry into .mcp.json; tri-state --with-*/--no-* flags with a first-run interactive picker, --print-integrations (dry run) and --remove-integrations (clean reversal). Default non-interactive init is unchanged. New `crumb doctor` reports integration health (non-zero when a store exists but nothing is wired up). Tier 3 (Claude Code hooks §A.6): - `crumb hook session|guard|capture` translators + `init --with-hooks` settings.json merge. SessionStart auto-loads the resume packet; the cost-aware PreToolUse guard (string pre-filter + risk regex, no record I/O on the common path) surfaces matched memory as context and never denies from memory alone; Stop snapshots a session record. Docs updated (README, cli-spec, mcp-spec, security) and stale Phase 9 forward- references replaced. Adds 5 test files and extends 3; full suite 244 passing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3oh2xigdp8u59UGyReAvC
- Bump package version 0.1.1 -> 0.1.2 across pyproject.toml, breadcrumbs/__init__.py (__version__), and breadcrumbs/cli.py (_FALLBACK_VERSION). Record schema_version stays 1. - Add CHANGELOG.md documenting the 0.1.2 agentic-review fixes (init bootstrapper, doctor, hooks, note, schema, capture diff-stat summary, entropy allowlist, mcp serve|register). - Refresh RELEASING.md (stale version note + sync-the-three-locations reminder). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V3oh2xigdp8u59UGyReAvC
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fe24133026
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| plan = resolve_integration_plan(root, args) | ||
| applied = apply_integrations(root, plan) |
There was a problem hiding this comment.
Apply integration-only flags to existing stores
When a store already exists (the common state after the default non-interactive crumb init), crumb init --with-adapter --with-mcp still returns from the existing-store guard above before this integration plan is reached. That makes the nudge/docs command unable to wire memory later unless users pass --force, which re-scaffolds and can replace existing memory; integration-only flags need the same pre-guard path as --print-integrations/--remove-integrations.
Useful? React with 👍 / 👎.
| arr = hooks.get(cc_event) | ||
| if not isinstance(arr, list): | ||
| continue | ||
| kept = [g for g in arr if not _group_is_breadcrumbs(g)] |
There was a problem hiding this comment.
Preserve non-breadcrumb hooks in mixed groups
If a user's .claude/settings.json has a hook group containing both their command and a crumb hook ... command, --remove-integrations drops the entire group here because _group_is_breadcrumbs is evaluated at group level. That deletes unrelated hooks despite this function promising to remove only breadcrumbs entries; filter each group's hooks list and keep the group when non-breadcrumb hooks remain.
Useful? React with 👍 / 👎.
| result = {"ok": True, "kind": "trap", "ref": f"trap_{slug}", "path": str(path)} | ||
|
|
||
| elif kind == "idea": | ||
| sections = dict(fields.get("sections") or {}) |
There was a problem hiding this comment.
Validate MCP idea section names before writing
For MCP callers, memory_note(kind="idea", fields={"sections": ...}) reaches this path without the CLI's _collect_set_sections canonicalization. A typo or even a case mismatch returns ok: true but the supplied content is omitted because render_body only reads exact canonical headings, so MCP clients can silently lose idea notes; reject or canonicalize section keys before calling write_record.
Useful? React with 👍 / 👎.
Implements the fixes from the 2026-06-26 agentic review and bumps the package to 0.1.2 for a PyPI release.
Highlights
The dominant review finding was that the store's value was gated on the agent remembering to invoke the CLI. This wires the existing primitives together so memory is consulted automatically.
Tier 1 — bug fixes & ergonomics
N files changed, +X/-Y) instead of inlining the per-file--stat— fixes record bloat and the self-inflicted high-entropy secret false-positive.crumb note question|trap|idea+memory_noteMCP tool — the missing write-surface (parse-verified, validate-gated, refreshes the resume packet); adds theideabody vocabulary.crumb schema [--json] [--template]+ named attempt flags (--problem/--tried/--result/--why/--do-not-retry/--related).crumb mcp serve|register— MCP discoverable fromcrumb --help.Tier 2 —
initbootstrapper (the dominant finding)Adapter signpost injection,
.mcp.jsonmerge, tri-state--with-*/--no-*flags + first-run interactive picker,--print-integrations(dry run),--remove-integrations(clean reversal), andcrumb doctor. Default non-interactiveinitis byte-identical to before.Tier 3 — Claude Code hooks
crumb hook session|guard|capturetranslators +init --with-hookssettings.json merge. SessionStart auto-loads the resume packet; the cost-aware PreToolUse guard surfaces matched memory but never denies from memory alone; Stop snapshots a session record.Release
pyproject.toml,breadcrumbs/__init__.py,breadcrumbs/cli.py.CHANGELOG.md; refreshesRELEASING.md.Tests
244 passing (5 new test files + extensions to 3). Record
schema_versionstays1.🤖 Generated with Claude Code
Generated by Claude Code