crumb-kit 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crumb_kit-0.1.0/LICENSE +21 -0
- crumb_kit-0.1.0/PKG-INFO +359 -0
- crumb_kit-0.1.0/README.md +317 -0
- crumb_kit-0.1.0/breadcrumbs/__init__.py +18 -0
- crumb_kit-0.1.0/breadcrumbs/__main__.py +6 -0
- crumb_kit-0.1.0/breadcrumbs/cli.py +3610 -0
- crumb_kit-0.1.0/breadcrumbs/mcp_core.py +371 -0
- crumb_kit-0.1.0/breadcrumbs/mcp_server.py +186 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/README.md +54 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/attempts/.gitkeep +0 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/current.md +15 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/decisions/.gitkeep +0 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/evidence/refs.yml +15 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/generated/README.md +20 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/generated/memory-index.md +8 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/generated/resume-packet.md +8 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/generated/stale-report.md +7 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/handoff.md +41 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/ideas/.gitkeep +0 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/index/README.md +14 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/known-traps.md +20 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/manifest.yml +11 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/open-questions.md +15 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/private/README.md +15 -0
- crumb_kit-0.1.0/breadcrumbs/templates/project-memory/sessions/.gitkeep +0 -0
- crumb_kit-0.1.0/crumb_kit.egg-info/PKG-INFO +359 -0
- crumb_kit-0.1.0/crumb_kit.egg-info/SOURCES.txt +44 -0
- crumb_kit-0.1.0/crumb_kit.egg-info/dependency_links.txt +1 -0
- crumb_kit-0.1.0/crumb_kit.egg-info/entry_points.txt +3 -0
- crumb_kit-0.1.0/crumb_kit.egg-info/requires.txt +5 -0
- crumb_kit-0.1.0/crumb_kit.egg-info/top_level.txt +1 -0
- crumb_kit-0.1.0/pyproject.toml +63 -0
- crumb_kit-0.1.0/setup.cfg +4 -0
- crumb_kit-0.1.0/tests/test_audit.py +252 -0
- crumb_kit-0.1.0/tests/test_capture.py +163 -0
- crumb_kit-0.1.0/tests/test_fixtures.py +149 -0
- crumb_kit-0.1.0/tests/test_guard.py +303 -0
- crumb_kit-0.1.0/tests/test_identity.py +51 -0
- crumb_kit-0.1.0/tests/test_init.py +190 -0
- crumb_kit-0.1.0/tests/test_mcp.py +256 -0
- crumb_kit-0.1.0/tests/test_parser.py +131 -0
- crumb_kit-0.1.0/tests/test_remember.py +169 -0
- crumb_kit-0.1.0/tests/test_resume.py +264 -0
- crumb_kit-0.1.0/tests/test_search.py +126 -0
- crumb_kit-0.1.0/tests/test_secrets.py +186 -0
- crumb_kit-0.1.0/tests/test_validate.py +165 -0
crumb_kit-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Breadcrumbs contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
crumb_kit-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: crumb-kit
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Breadcrumbs — leave a trail your future self and your agents can follow back: a portable, repo-local, human-readable ledger of durable project state for human–agent software work.
|
|
5
|
+
License: MIT License
|
|
6
|
+
|
|
7
|
+
Copyright (c) 2026 Breadcrumbs contributors
|
|
8
|
+
|
|
9
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
11
|
+
in the Software without restriction, including without limitation the rights
|
|
12
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
13
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
14
|
+
furnished to do so, subject to the following conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be included in all
|
|
17
|
+
copies or substantial portions of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
22
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
23
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
|
+
SOFTWARE.
|
|
26
|
+
|
|
27
|
+
Project-URL: Homepage, https://github.com/jumbodaddystack/breadcrumbs
|
|
28
|
+
Project-URL: Documentation, https://github.com/jumbodaddystack/breadcrumbs/tree/main/docs
|
|
29
|
+
Keywords: agent,memory,continuity,cli,project-memory,handoff
|
|
30
|
+
Classifier: Development Status :: 4 - Beta
|
|
31
|
+
Classifier: Environment :: Console
|
|
32
|
+
Classifier: Intended Audience :: Developers
|
|
33
|
+
Classifier: Programming Language :: Python :: 3
|
|
34
|
+
Classifier: Topic :: Software Development
|
|
35
|
+
Classifier: Topic :: Utilities
|
|
36
|
+
Requires-Python: >=3.9
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
License-File: LICENSE
|
|
39
|
+
Provides-Extra: mcp
|
|
40
|
+
Requires-Dist: mcp>=1.2; python_version >= "3.10" and extra == "mcp"
|
|
41
|
+
Dynamic: license-file
|
|
42
|
+
|
|
43
|
+
# Breadcrumbs
|
|
44
|
+
|
|
45
|
+
**Breadcrumbs — leave a trail your future self and your agents can follow back.**
|
|
46
|
+
|
|
47
|
+
A portable, repo-local, human-readable ledger of durable project state for
|
|
48
|
+
human–agent software work (the **Project Continuity Memory** capability).
|
|
49
|
+
|
|
50
|
+
> **North-star.** Project Continuity Memory is a repo-local, human-readable ledger
|
|
51
|
+
> of durable project state: what was decided, what failed, what is active, what is
|
|
52
|
+
> risky, what is unresolved, and what the next agent or human must know before
|
|
53
|
+
> acting. It is **not** a transcript archive, **not** a vector database, and **not**
|
|
54
|
+
> a replacement for source code, tests, current human instruction, or authoritative
|
|
55
|
+
> docs.
|
|
56
|
+
|
|
57
|
+
It stores durable project state as typed, human-readable records inside a target
|
|
58
|
+
project's `.project-memory/` directory, so humans and agents can resume work across
|
|
59
|
+
sessions, tools, devices, branches, and time without re-discovering decisions,
|
|
60
|
+
repeating failed attempts, or trusting stale context.
|
|
61
|
+
|
|
62
|
+
- **PyPI package name:** `crumb-kit` (`pip install crumb-kit`)
|
|
63
|
+
- **Import package / GitHub repo:** `breadcrumbs`
|
|
64
|
+
- **CLI binary name:** `crumb`
|
|
65
|
+
- **Formal capability name:** Project Continuity Memory
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Non-goals
|
|
70
|
+
|
|
71
|
+
This tool deliberately does **not**:
|
|
72
|
+
|
|
73
|
+
1. Build a vector database as the source of truth (vectors are a later, disposable
|
|
74
|
+
search accelerator).
|
|
75
|
+
2. Store full chat transcripts as memory (it extracts durable decisions, attempts,
|
|
76
|
+
handoffs, questions, traps, and evidence).
|
|
77
|
+
3. Rely on one vendor's memory feature (Claude, Codex, Cursor, Gemini, and future
|
|
78
|
+
agents all read the same plain records).
|
|
79
|
+
4. Require MCP, hooks, or a daemon for baseline functionality (plain files + CLI
|
|
80
|
+
work first).
|
|
81
|
+
5. Use `AGENTS.md` / `CLAUDE.md` / Cursor / Gemini rules as the memory database
|
|
82
|
+
(those are signposts only).
|
|
83
|
+
6. Store secrets, credentials, customer PII, or sensitive local notes in committed
|
|
84
|
+
project memory.
|
|
85
|
+
7. Make capture so heavy that humans stop using it (routine capture targets under
|
|
86
|
+
90 seconds).
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Install
|
|
91
|
+
|
|
92
|
+
`breadcrumbs` is a stdlib-only Python package (no third-party runtime
|
|
93
|
+
dependencies) that installs a single `crumb` binary. The recommended path
|
|
94
|
+
is [`pipx`](https://pipx.pypa.io/), which puts the CLI on your PATH in its own
|
|
95
|
+
isolated environment:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
pipx install crumb-kit # from a published artifact (future)
|
|
99
|
+
pipx install . # from a source checkout (this repo dir)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Plain `pip` works too (prefer a virtualenv):
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
python -m pip install . # or: pip install <built-wheel>.whl
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
After install, the binary is on PATH and the `.project-memory/` template tree
|
|
109
|
+
ships **inside the package** (`breadcrumbs/templates/`), so `init` finds it
|
|
110
|
+
wherever the package lives — there is no repo-relative path dependency:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
crumb --version # breadcrumbs X.Y.Z (record schema_version N)
|
|
114
|
+
crumb init # locates bundled templates post-install
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Versioning.** The package uses semantic versioning. `crumb --version`
|
|
118
|
+
prints the package version *and* the **record `schema_version`** (the manifest's
|
|
119
|
+
`schema_version: 1`). These are independent: the package version moves with the
|
|
120
|
+
code; the record schema version moves only on a breaking change to the on-disk
|
|
121
|
+
record format, and a package MAJOR bump accompanies it.
|
|
122
|
+
|
|
123
|
+
**Requires** Python ≥ 3.9.
|
|
124
|
+
|
|
125
|
+
### No `npx` (deliberate)
|
|
126
|
+
|
|
127
|
+
There is intentionally **no `npx`/Node distribution**. The tool is Python and
|
|
128
|
+
ships via `pipx`/`pip`. JavaScript-ecosystem reach (an `npx crumb` wrapper)
|
|
129
|
+
is a separately-justified future decision, **not** a default migration — it would
|
|
130
|
+
only be added if dogfooding shows a concrete need, and would wrap the same Python
|
|
131
|
+
core rather than reimplement it.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Quickstart
|
|
136
|
+
|
|
137
|
+
> **Two invocation forms.** Once installed (above), run `crumb <command>`.
|
|
138
|
+
> From a **source checkout** without installing, the equivalent is
|
|
139
|
+
> `python crumb.py <command>` (a thin shim over `breadcrumbs.cli`); the
|
|
140
|
+
> per-command examples below use that source form. They are interchangeable.
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
crumb init # install .project-memory/ + manifest + .gitignore rules
|
|
144
|
+
crumb validate # deterministically check the store (schema + invariants)
|
|
145
|
+
crumb remember decision # capture a durable choice
|
|
146
|
+
crumb capture session # record session end (git-prefilled); updates handoff + current
|
|
147
|
+
crumb resume # print a bounded resume packet with computed staleness
|
|
148
|
+
crumb search "auth middleware" # deterministic keyword/tag/file lookup over records
|
|
149
|
+
crumb guard "rewrite the auth middleware" # warn before repeating a known mistake
|
|
150
|
+
crumb audit # heuristic health/safety report (stale/unsafe/bloated)
|
|
151
|
+
crumb scan-secrets # block if committed memory holds token-like strings
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
In this build, `init`, `validate`, `remember`, `capture session`, `resume`,
|
|
155
|
+
`search`, `guard`, `audit`, and `scan-secrets` are all implemented — the full
|
|
156
|
+
**MVP** (capture → resume → trust). `resume` closes the **capture → resume value
|
|
157
|
+
loop (MVP-core)**; `guard` adds the **"don't repeat the expensive mistake"**
|
|
158
|
+
capability that separates a continuity engine from a scrapbook; and `audit` +
|
|
159
|
+
`scan-secrets` complete **MVP-trust** — the heuristic safety net (secrets,
|
|
160
|
+
instruction-like text, generated-packet drift, staleness, bloat) that lets you
|
|
161
|
+
*trust* the memory, not just use it.
|
|
162
|
+
|
|
163
|
+
### `crumb init`
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
python crumb.py init # prompt for session policy (default: full)
|
|
167
|
+
python crumb.py init --session-tracking distillate # keep sessions/ local
|
|
168
|
+
python crumb.py init --no-commit-generated # keep generated/*.md local
|
|
169
|
+
python crumb.py init --project /path/to/repo --json # init elsewhere, JSON summary
|
|
170
|
+
python crumb.py init --force # overwrite an existing scaffold
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
`init` copies the `.project-memory/` template tree into the target project,
|
|
174
|
+
writes `manifest.yml` (recording the chosen tracking policies), and inserts a
|
|
175
|
+
managed block into the project `.gitignore`. It runs on non-git folders too,
|
|
176
|
+
printing a notice that git-derived record fields will use defined sentinels.
|
|
177
|
+
|
|
178
|
+
### `crumb validate`
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
python crumb.py validate # human-readable report; exit 1 on problems
|
|
182
|
+
python crumb.py validate --json # structured findings + exit code
|
|
183
|
+
python crumb.py validate --verbose # also list the passing checks
|
|
184
|
+
python crumb.py validate --project /path/repo # validate elsewhere
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
`validate` is **fully deterministic** — it checks structural invariants only
|
|
188
|
+
(manifest version, core files, record frontmatter, filename-canonical identity,
|
|
189
|
+
status/privacy vocabularies, evidence/handoff/session requirements, generated
|
|
190
|
+
markers). It performs **no** heuristic content scanning; secret and
|
|
191
|
+
instruction-like-text detection live in `audit` / `scan-secrets`. Exit codes: `0`
|
|
192
|
+
clean, `1` problems found, `2` no `.project-memory/` store present.
|
|
193
|
+
|
|
194
|
+
### `crumb remember decision | attempt`
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# non-interactive (agent-friendly): title + sections + evidence as flags
|
|
198
|
+
python crumb.py remember decision \
|
|
199
|
+
--title "Use repo-local Markdown as source of truth" \
|
|
200
|
+
--set Context "needed a tool-independent store" \
|
|
201
|
+
--set Decision "Markdown + YAML frontmatter" \
|
|
202
|
+
--evidence commit abc1234 --evidence command "npm test" \
|
|
203
|
+
--tags memory,architecture
|
|
204
|
+
|
|
205
|
+
python crumb.py remember attempt --title "Tried a sqlite store" \
|
|
206
|
+
--set Result "too heavy for the value" --confidence low
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Frontmatter is auto-derived (clock + git) and defaulted; you supply only a title
|
|
210
|
+
and a few section lines (`--set HEADING TEXT`, repeatable). Run with no `--title`
|
|
211
|
+
in a terminal for an interactive prompt. A decision/attempt **must** carry
|
|
212
|
+
evidence or `--confidence low` (validate §16.9) — the command enforces this and
|
|
213
|
+
refuses to write an invalid record. `--json` emits a machine summary.
|
|
214
|
+
|
|
215
|
+
### `crumb capture session`
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
python crumb.py capture session --next "wire up the resume packet" # git-prefilled
|
|
219
|
+
python crumb.py capture session --fast --next "tired — resume here" # ~15s, no prompts
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`capture session` reads git since the last session record and pre-fills **Work
|
|
223
|
+
Completed** (`git log`), **Files Touched** (`git diff --stat`), then asks only for
|
|
224
|
+
narrative confirmation + a required **Next Action**. It writes the session record
|
|
225
|
+
and refreshes `handoff.md` and `current.md`. `--fast` skips all prompts and any
|
|
226
|
+
LLM, writing a git snapshot + the one-line `--next`. No path requires an LLM.
|
|
227
|
+
With `session_tracking: distillate`, the session file is written locally but stays
|
|
228
|
+
gitignored — promote durable items with `remember` to commit them.
|
|
229
|
+
|
|
230
|
+
### `crumb resume`
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
python crumb.py resume # full bounded packet (writes generated/resume-packet.md)
|
|
234
|
+
python crumb.py resume --fast # git snapshot + focus + next action + staleness (print-only)
|
|
235
|
+
python crumb.py resume --json # structured packet (sections + warnings) for agents
|
|
236
|
+
python crumb.py resume --stale-days 14 # tighten the aged-unresolved threshold (default 21)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`resume` assembles a **bounded, paste-anywhere packet** (≤5k tokens) from the
|
|
240
|
+
canonical records — project/branch/commit, current focus, next action, active
|
|
241
|
+
decisions (id + one-line rationale), failed attempts to avoid (id + do-not-retry),
|
|
242
|
+
known traps, open questions, likely files, and verification commands — followed by
|
|
243
|
+
**computed staleness warnings**:
|
|
244
|
+
|
|
245
|
+
- handoff **age + commit-distance** ("handoff is 6 days old, written 14 commits
|
|
246
|
+
behind current HEAD") — the primary "train of thought went cold" signal;
|
|
247
|
+
- **aged-unresolved** open questions and active decisions older than the threshold;
|
|
248
|
+
- **branch mismatch** (record/handoff branch ≠ current HEAD, incl. detached HEAD);
|
|
249
|
+
- **expired** (`expires_at`) and **low-confidence** records.
|
|
250
|
+
|
|
251
|
+
Current/handoff/active-decisions are prioritized over old session observations, and
|
|
252
|
+
sections are capped then trimmed to stay within budget even with hundreds of
|
|
253
|
+
records. The packet carries a source `commit`/`inputs_hash`/`generated_at` header so
|
|
254
|
+
later `audit` (Phase 6) can detect drift. Raw transcripts are never included.
|
|
255
|
+
`--fast` is a print-only reorientation view and does not overwrite the committed
|
|
256
|
+
packet.
|
|
257
|
+
|
|
258
|
+
### `crumb search`
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
python crumb.py search "auth middleware" # keyword search over records
|
|
262
|
+
python crumb.py search --tag auth # filter by tag/component
|
|
263
|
+
python crumb.py search --file src/auth/x.ts # filter by referenced file path
|
|
264
|
+
python crumb.py search "session" --type decision --json
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
`search` is a **deterministic, dependency-free** lookup over the canonical records
|
|
268
|
+
(decisions, attempts, traps, open questions). It matches on exact/keyword text,
|
|
269
|
+
tags/component, and file paths — **no embeddings** (SQLite FTS / vectors are a later
|
|
270
|
+
phase). Same input → same output. It is the permissive lookup layer that `guard`
|
|
271
|
+
builds on.
|
|
272
|
+
|
|
273
|
+
### `crumb guard`
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
python crumb.py guard "rewrite the auth middleware" # human report (§11 shape)
|
|
277
|
+
python crumb.py guard "delete the accounts table" --files src/db/accounts.ts
|
|
278
|
+
python crumb.py guard "store the token in the url" --json # structured, for agents
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
`guard` is **guard-before-action**: given a proposed action it warns you if a failed
|
|
282
|
+
attempt or active decision says *don't go that way* — the capability that separates a
|
|
283
|
+
continuity engine from a scrapbook. It **tokenizes** the action, **classifies** it
|
|
284
|
+
(routine edit / refactor / architecture / dependency / migration / deletion / external
|
|
285
|
+
side effect / security-permission), **searches + scores** the records against §11.4
|
|
286
|
+
signals (same file · same tag/component · status · recency + commit-distance · branch
|
|
287
|
+
match · explicit *Do Not Retry Unless* · open-blocker), and emits **one verdict** —
|
|
288
|
+
`PROCEED | READ_FIRST | PAUSE | ASK_HUMAN` — with up to **5** ranked records, the reason
|
|
289
|
+
each matched, and a synthesized **next safest action**.
|
|
290
|
+
|
|
291
|
+
Two guarantees hold:
|
|
292
|
+
|
|
293
|
+
- **Matched memory is data, never instruction** (§15). `guard` reads record text to
|
|
294
|
+
rank and cite it; it never executes phrasing found in a record body. The next safest
|
|
295
|
+
action is synthesized from match *structure*; only structured evidence (e.g. a
|
|
296
|
+
recorded verification command) is echoed back.
|
|
297
|
+
- **Anti-noise** (§19b.8). A single shared generic word never raises a warning — a
|
|
298
|
+
stop-word filter strips generic tokens and a pure-text match needs at least two
|
|
299
|
+
*specific* shared keywords; only file-path or tag/component hits qualify on their own.
|
|
300
|
+
|
|
301
|
+
Superseded/rejected/stale records and resolved questions are demoted to a **history**
|
|
302
|
+
note (mentioned, never treated as active). A stale or wrong-branch handoff surfaces the
|
|
303
|
+
same computed staleness warnings `resume` shows. Verdict aggressiveness is governed by
|
|
304
|
+
named `GUARD_*` thresholds at the top of the guard section in `breadcrumbs/cli.py`, so it can
|
|
305
|
+
be tuned from dogfood feedback without rearchitecting.
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Plain-file fallback (cloud agents, no CLI)
|
|
310
|
+
|
|
311
|
+
The tool degrades gracefully when `crumb` cannot run (e.g. a read-only cloud
|
|
312
|
+
agent). With the default policy `commit_generated_projections: true`, `resume`
|
|
313
|
+
writes `generated/resume-packet.md` and that file is **committed**, so an agent that
|
|
314
|
+
cannot execute the CLI can still reorient by reading:
|
|
315
|
+
|
|
316
|
+
1. `.project-memory/generated/resume-packet.md` — the pre-built bounded packet; then
|
|
317
|
+
2. the plain canonical files directly — `current.md`, `handoff.md`,
|
|
318
|
+
`decisions/`, `attempts/`, `known-traps.md`, `open-questions.md`.
|
|
319
|
+
|
|
320
|
+
Everything is human-readable Markdown, so no binary store or vendor runtime is
|
|
321
|
+
required to resume. (`generated/resume-packet.md` is a rebuildable projection — if
|
|
322
|
+
it disagrees with the canonical records, the records win and it should be
|
|
323
|
+
regenerated; `audit` flags this drift by comparing the packet's stamped
|
|
324
|
+
`inputs_hash` against the canonical inputs.)
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Status
|
|
329
|
+
|
|
330
|
+
| Command | State |
|
|
331
|
+
|---|---|
|
|
332
|
+
| `init` | implemented (Phase 1) |
|
|
333
|
+
| `validate` | implemented (Phase 2) |
|
|
334
|
+
| `remember decision` / `remember attempt` | implemented (Phase 3) |
|
|
335
|
+
| `capture session` (incl. `--fast`) | implemented (Phase 3) |
|
|
336
|
+
| `resume` (incl. `--fast`, computed staleness) | implemented (Phase 4 — **MVP-core**) |
|
|
337
|
+
| `search` (deterministic keyword/tag/file) | implemented (Phase 5) |
|
|
338
|
+
| `guard` (deterministic ranking, §11 verdicts) | implemented (Phase 5) |
|
|
339
|
+
| `audit` (heuristic: secrets, instruction-like, drift, staleness, bloat) | implemented (Phase 6 — **MVP-trust**) |
|
|
340
|
+
| `scan-secrets` (committed-memory secret gate) | implemented (Phase 6) |
|
|
341
|
+
| `pipx`/`pip` packaging (`crumb` console script, bundled templates) | implemented (Phase 7) |
|
|
342
|
+
| MCP server (`breadcrumbs-mcp`: 8 resources, 6 prompts, 7 tools) | implemented (Phase 8 — **optional**) |
|
|
343
|
+
|
|
344
|
+
With Phase 6 the full MVP (capture → resume → trust) is complete and CI-guarded;
|
|
345
|
+
Phase 7 packages it as a `pipx`-installable `crumb` binary (see **Install**
|
|
346
|
+
above). Phase 8 adds an **optional** MCP server (`pip install
|
|
347
|
+
"crumb-kit[mcp]"`) that exposes the same memory engine to agents without
|
|
348
|
+
shelling out — a thin wrapper over the Phase 1–6 functions, never required for
|
|
349
|
+
baseline use. See [`docs/`](docs/) for the architecture, record schema, CLI spec,
|
|
350
|
+
[MCP spec](docs/mcp-spec.md), and security posture.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Memory is advisory
|
|
355
|
+
|
|
356
|
+
Current user instruction, source code, tests, build output, current authoritative
|
|
357
|
+
docs, and security policy **outrank** anything stored in `.project-memory/`.
|
|
358
|
+
If memory conflicts with reality, mark it `disputed` or `stale` and link evidence —
|
|
359
|
+
do not let it override the present.
|