Skip to content

Release 0.1.2 — agentic-review fixes (automaticity, write-surface, ergonomics)#11

Merged
jumbodaddystack merged 2 commits into
mainfrom
claude/crumb-kit-review-fixes-6t8iro
Jun 27, 2026
Merged

Release 0.1.2 — agentic-review fixes (automaticity, write-surface, ergonomics)#11
jumbodaddystack merged 2 commits into
mainfrom
claude/crumb-kit-review-fixes-6t8iro

Conversation

@jumbodaddystack

Copy link
Copy Markdown
Owner

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

  • capture summarizes the git diff (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_note MCP tool — the missing write-surface (parse-verified, validate-gated, refreshes the resume packet); adds the idea body vocabulary.
  • crumb schema [--json] [--template] + named attempt flags (--problem/--tried/--result/--why/--do-not-retry/--related).
  • Entropy-scanner allowlist for path/CamelCase-identifier tokens, with anti-laundering tests proving real secrets still flag.
  • crumb mcp serve|register — MCP discoverable from crumb --help.

Tier 2 — init bootstrapper (the dominant finding)

Adapter signpost injection, .mcp.json merge, tri-state --with-*/--no-* flags + first-run interactive picker, --print-integrations (dry run), --remove-integrations (clean reversal), and crumb doctor. Default non-interactive init is byte-identical to before.

Tier 3 — Claude Code hooks

crumb hook session|guard|capture translators + init --with-hooks settings.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

  • Version bumped to 0.1.2 across pyproject.toml, breadcrumbs/__init__.py, breadcrumbs/cli.py.
  • Adds CHANGELOG.md; refreshes RELEASING.md.

Tests

244 passing (5 new test files + extensions to 3). Record schema_version stays 1.

🤖 Generated with Claude Code


Generated by Claude Code

claude added 2 commits June 26, 2026 22:43
…, 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
@jumbodaddystack jumbodaddystack merged commit cf2812d into main Jun 27, 2026
4 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread breadcrumbs/cli.py
Comment on lines +385 to +386
plan = resolve_integration_plan(root, args)
applied = apply_integrations(root, plan)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Comment thread breadcrumbs/cli.py
arr = hooks.get(cc_event)
if not isinstance(arr, list):
continue
kept = [g for g in arr if not _group_is_breadcrumbs(g)]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment thread breadcrumbs/cli.py
result = {"ok": True, "kind": "trap", "ref": f"trap_{slug}", "path": str(path)}

elif kind == "idea":
sections = dict(fields.get("sections") or {})

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants