brainclaw 1.17.0 → 1.19.0

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.
Files changed (97) hide show
  1. package/README.md +5 -5
  2. package/dist/brainclaw-vscode.vsix +0 -0
  3. package/dist/commands/code-map.js +4 -1
  4. package/dist/commands/codev.js +61 -30
  5. package/dist/commands/doctor.js +14 -1
  6. package/dist/commands/harvest.js +223 -43
  7. package/dist/commands/inbox.js +10 -4
  8. package/dist/commands/install-hooks.js +184 -27
  9. package/dist/commands/loop.js +2 -2
  10. package/dist/commands/loops-handlers.js +82 -1
  11. package/dist/commands/mcp-catalog.js +12 -4
  12. package/dist/commands/mcp-read-handlers.js +90 -7
  13. package/dist/commands/mcp-schemas.generated.js +3 -0
  14. package/dist/commands/mcp-write-claims.js +57 -0
  15. package/dist/commands/mcp-write-coordination.js +216 -57
  16. package/dist/commands/mcp-write-entities.js +11 -0
  17. package/dist/commands/mcp.js +29 -2
  18. package/dist/commands/session-end.js +15 -0
  19. package/dist/commands/session-start.js +19 -0
  20. package/dist/core/agentrun-reconciler.js +171 -7
  21. package/dist/core/agentruns.js +6 -1
  22. package/dist/core/claim-conformity.js +193 -0
  23. package/dist/core/claim-scope.js +155 -0
  24. package/dist/core/claims.js +127 -2
  25. package/dist/core/code-map/aggregate.js +473 -0
  26. package/dist/core/code-map/backend.js +36 -10
  27. package/dist/core/code-map/freshness.js +36 -1
  28. package/dist/core/code-map/lang/c/imports.scm +12 -0
  29. package/dist/core/code-map/lang/c/index.js +150 -0
  30. package/dist/core/code-map/lang/c/tags.scm +68 -0
  31. package/dist/core/code-map/lang/cpp/imports.scm +14 -0
  32. package/dist/core/code-map/lang/cpp/index.js +149 -0
  33. package/dist/core/code-map/lang/cpp/tags.scm +87 -0
  34. package/dist/core/code-map/lang/csharp/imports.scm +20 -0
  35. package/dist/core/code-map/lang/csharp/index.js +224 -0
  36. package/dist/core/code-map/lang/csharp/tags.scm +63 -0
  37. package/dist/core/code-map/lang/go/imports.scm +13 -0
  38. package/dist/core/code-map/lang/go/index.js +139 -0
  39. package/dist/core/code-map/lang/go/tags.scm +36 -0
  40. package/dist/core/code-map/lang/providers.js +12 -1
  41. package/dist/core/code-map/lang/ruby/imports.scm +24 -0
  42. package/dist/core/code-map/lang/ruby/index.js +198 -0
  43. package/dist/core/code-map/lang/ruby/tags.scm +49 -0
  44. package/dist/core/code-map/lang/rust/imports.scm +44 -0
  45. package/dist/core/code-map/lang/rust/index.js +136 -0
  46. package/dist/core/code-map/lang/rust/tags.scm +47 -0
  47. package/dist/core/code-map/query.js +229 -80
  48. package/dist/core/code-map/types.js +18 -0
  49. package/dist/core/code-map/work-section.js +8 -7
  50. package/dist/core/codev-responses.js +16 -0
  51. package/dist/core/dispatcher.js +176 -22
  52. package/dist/core/execution-adapters.js +29 -3
  53. package/dist/core/facade-schema.js +32 -0
  54. package/dist/core/guidance-telemetry.js +197 -0
  55. package/dist/core/ideation-loop-close.js +152 -0
  56. package/dist/core/instruction-templates.js +11 -3
  57. package/dist/core/loops/artifact-resolver.js +197 -0
  58. package/dist/core/loops/attempt-reservation.js +576 -0
  59. package/dist/core/loops/commit-intent.js +494 -0
  60. package/dist/core/loops/facade-schema.js +48 -0
  61. package/dist/core/loops/impl-bind.js +144 -0
  62. package/dist/core/loops/index.js +1 -1
  63. package/dist/core/loops/iteration-engine.js +29 -0
  64. package/dist/core/loops/lock.js +14 -0
  65. package/dist/core/loops/project-resolution.js +157 -0
  66. package/dist/core/loops/reconcile-turn.js +369 -0
  67. package/dist/core/loops/result-reducers.js +88 -0
  68. package/dist/core/loops/store.js +46 -7
  69. package/dist/core/loops/types.js +139 -11
  70. package/dist/core/loops/verbs.js +49 -4
  71. package/dist/core/loops/verify-command.js +209 -0
  72. package/dist/core/messaging.js +58 -5
  73. package/dist/core/next-actions.js +157 -0
  74. package/dist/core/review-loop-close.js +27 -6
  75. package/dist/core/review-loop-turn-dispatch.js +290 -28
  76. package/dist/core/runtime-signals.js +68 -0
  77. package/dist/core/schema.js +64 -0
  78. package/dist/core/surface-freshness.js +150 -0
  79. package/dist/core/warnings.js +98 -0
  80. package/dist/core/worktree.js +24 -0
  81. package/dist/facts.js +9 -9
  82. package/dist/facts.json +8 -8
  83. package/dist/wasm/tree-sitter-c.wasm +0 -0
  84. package/dist/wasm/tree-sitter-c_sharp.wasm +0 -0
  85. package/dist/wasm/tree-sitter-cpp.wasm +0 -0
  86. package/dist/wasm/tree-sitter-go.wasm +0 -0
  87. package/dist/wasm/tree-sitter-ruby.wasm +0 -0
  88. package/dist/wasm/tree-sitter-rust.wasm +0 -0
  89. package/docs/cli.md +1 -1
  90. package/docs/code-map.md +22 -6
  91. package/docs/concepts/loop-engine.md +24 -0
  92. package/docs/concepts/observer-protocol.md +22 -0
  93. package/docs/concepts/plans-and-claims.md +57 -0
  94. package/docs/integrations/claude-code.md +53 -0
  95. package/docs/integrations/mcp.md +45 -0
  96. package/docs/mcp-schema-changelog.md +118 -2
  97. package/package.json +1 -1
@@ -166,6 +166,63 @@ Without claims, multiple agents can easily touch the same area at once and gener
166
166
  Claims are not necessarily hard file locks.
167
167
  They are a shared coordination signal.
168
168
 
169
+ ### Scope grammar and conformity (v1.19.0+)
170
+
171
+ A claim's `scope` is a free string, and in practice it is used three ways. Measured
172
+ over the 613 real claims in the dogfood store:
173
+
174
+ | Shape | Share | Example |
175
+ |---|---|---|
176
+ | Path-like | 57.6% | `src/core/auth.ts`, `docs/` |
177
+ | Loop reference | 22.8% | `review-loop:lop_…`, `ideate-loop:lop_…:lsl_…` |
178
+ | Free prose | 19.6% | `Loop engine residuals #1-4` |
179
+
180
+ So **42.4% of real scopes cannot be matched to a file path at all** — and the
181
+ non-matchable share is *growing*, because coordinator-created lane claims are the
182
+ ones being minted. Any check built naively on path matching would false-accuse on
183
+ nearly one claim in two.
184
+
185
+ brainclaw therefore classifies a scope into `paths` / `loop_ref` / `prose` / `empty`
186
+ and reports conformity as `in_scope`, `out_of_scope`, or **`unverifiable`** — a
187
+ first-class verdict that every consumer renders as **silence**. Only a
188
+ path-resolvable scope with concrete stray files can ever produce an accusation.
189
+ `.brainclaw/` and `.git/` are never counted as out of scope: every brainclaw call
190
+ rewrites them, so counting them would accuse every agent on every claim.
191
+
192
+ The reserved loop prefixes are **enumerated**, not inferred from shape — so
193
+ `project-resolution: the gate` reads as prose, and a Windows absolute path
194
+ (`C:/Users/…`) stays a path rather than being read as a `C:` prefix.
195
+
196
+ ### `base_sha` and declared `paths[]`
197
+
198
+ A new claim records **`base_sha`**, the commit its work started from, resolved once
199
+ at creation and never moved. This is the baseline any "what did this claim actually
200
+ touch?" comparison needs: neither `git diff HEAD` nor the worktree's dirty set is
201
+ authoritative, because a lane that commits mid-work moves the ground under both —
202
+ each would report "touched nothing" the instant it committed.
203
+
204
+ Optionally a creator can declare **`paths[]`**, a machine-readable footprint that
205
+ raises conformity coverage above what classifying a free-string `scope` can reach.
206
+
207
+ Both are additive and never backfilled. A claim with no baseline is `unverifiable`,
208
+ never guessed, and acquiring a claim **never fails or blocks** because a baseline
209
+ could not be computed — outside a git repo the claim is simply created without one.
210
+
211
+ > `paths[]` is currently settable through the core and the CLI, but is not yet
212
+ > exposed in `bclaw_claim`'s published MCP inputSchema.
213
+
214
+ ### Liveness: file evidence, not just a session
215
+
216
+ A spawned sandboxed worker cannot reach MCP, so it cannot maintain any server-side
217
+ liveness record — which is why proof-of-life lives in filesystem sentinels the
218
+ worker writes into its own worktree. Since v1.19.0 claim liveness reads that same
219
+ evidence (worktree/project heartbeat plus filesystem activity) **before** consulting
220
+ any session record, with the same 30-minute freshness window an assignment gets.
221
+
222
+ Previously a demonstrably-alive worker kept its *assignment* while its *claim* aged
223
+ out on wall-clock alone — and a coordinator-created claim, which carries no
224
+ `session_id`, fell straight through to `never-adopted`.
225
+
169
226
  ## Policy checks
170
227
 
171
228
  Before editing a scope, agents can verify governance compliance using `check-policy`:
@@ -17,6 +17,59 @@ brainclaw export --format claude-md --write
17
17
  - use `.brainclaw/project.md` as a readable fallback (it is a derived view, regenerated best-effort — run `brainclaw rebuild` if stale)
18
18
  - use hooks or workflow checks when a stronger reminder is needed
19
19
 
20
+ ## The advisory PreToolUse hook (v1.19.0+)
21
+
22
+ `brainclaw install-hooks` generates `.git/hooks/claude-pre-tool.sh` **and activates
23
+ it** by merging a `PreToolUse` entry into `.claude/settings.json`. Before v1.19.0 it
24
+ only printed instructions, so the hook was dead even for operators who ran the
25
+ command.
26
+
27
+ It nudges an agent that is editing files without holding a claim of its own. It is
28
+ **advisory and can never block**: `permissionDecision` is always `allow` and the
29
+ exit code is always 0 (trp_5f342186 — a hook cascade once destroyed work).
30
+
31
+ ### The channel matters, and it is not stderr
32
+
33
+ Per the Claude Code hook contract:
34
+
35
+ | Exit | stderr goes to | Tool |
36
+ |---|---|---|
37
+ | 0 | **nobody** — not the model | proceeds |
38
+ | 2 | the model | **BLOCKED** |
39
+ | other non-zero | the user only | proceeds |
40
+
41
+ So "advisory = exit 0 + write to stderr" is **structurally mute**, and that is
42
+ exactly what brainclaw's generated hook did for an unknown number of releases: even
43
+ once its other defects were fixed, it would still have spoken into the void. The
44
+ only non-blocking channel that reaches the model is JSON on **stdout** at exit 0:
45
+
46
+ ```json
47
+ { "hookSpecificOutput": {
48
+ "hookEventName": "PreToolUse",
49
+ "permissionDecision": "allow",
50
+ "additionalContext": "[brainclaw] Editing without an active claim of your own…" } }
51
+ ```
52
+
53
+ If you write hooks of your own, this is the shape to copy.
54
+
55
+ ### What it matches, and what it deliberately does not
56
+
57
+ The matcher is `Edit|Write|MultiEdit|NotebookEdit` — the tools whose `tool_input`
58
+ exposes a concrete file path. **`Bash` is excluded on purpose**: a shell command's
59
+ file footprint is not statically knowable, so it is `unverifiable`, never guessed.
60
+ Matching it was one source of the noise that made the pre-v1.19 hook worth ignoring.
61
+
62
+ Activation is non-destructive: unknown settings keys are preserved, a pre-existing
63
+ `PreToolUse` array is appended to rather than replaced, and a `settings.json` that
64
+ cannot be parsed is left **byte-identical** with a manual instruction printed —
65
+ that file holds your permission allow-list, and clobbering it would be far worse
66
+ than an unactivated advisory.
67
+
68
+ > **Spawned workers get no hooks.** `.claude/` is gitignored, so a dispatched
69
+ > worker's worktree never receives this hook (nor Codex's `.codex/hooks.json`).
70
+ > Lifecycle parity for dispatched lanes runs through the brief today — see
71
+ > trp#1277.
72
+
20
73
  ## Key idea
21
74
 
22
75
  Claude Code should not carry all workspace state in static instructions.
@@ -141,6 +141,51 @@ See [code map](../code-map.md) for the full Code Map reference (CLI, freshness m
141
141
  | `bclaw_update_memory` | memory | Update a memory item's text or metadata |
142
142
  | `bclaw_compact` | memory | LLM-driven semantic memory compaction (two-phase) |
143
143
 
144
+ ### What a response tells you to do next (v1.19.0+)
145
+
146
+ Responses are self-teaching: rather than requiring you to memorise the API, they
147
+ carry the follow-up derived from **what actually happened**.
148
+
149
+ **`next_actions`** — an array of `{tool, args?, when?}`. Present only when there is
150
+ a genuine follow-up, so its presence is meaningful; a handler with nothing to add
151
+ omits the key entirely rather than padding it. It is derived from the outcome, not
152
+ from a static table: releasing a claim proposes something different depending on
153
+ whether the plan cascade fired or refused. Fan-out is capped at 3, with an explicit
154
+ note when more were available.
155
+
156
+ **`warning_details`** — the structured sibling of `warnings: string[]`. Each entry
157
+ carries a stable `code`, human `message`, the `data` the prose mentions, and — the
158
+ part a bare string could never hold — `next_actions` naming the way out.
159
+
160
+ ```jsonc
161
+ {
162
+ "code": "wrote_outside_claim_scope",
163
+ "message": "Claim clm_… declared 'src/core' but 2 touched file(s) sit outside it: …",
164
+ "data": { "claim_id": "clm_…", "scope": "src/core", "unexpected_paths": ["docs/x.md"] },
165
+ "next_actions": [{ "tool": "bclaw_update", "args": { "entity": "claim", "…": "…" } }]
166
+ }
167
+ ```
168
+
169
+ `warnings` keeps its type **and** its byte-identical historical contents, so a
170
+ consumer that ignores `warning_details` sees no change. Read `warnings` for
171
+ completeness and `warning_details` for the codes that carry a recovery path — the
172
+ structured channel is a subset, not a mirror.
173
+
174
+ Codes you may see today:
175
+
176
+ | Code | Emitted by | Meaning |
177
+ |---|---|---|
178
+ | `scope_already_claimed` | `bclaw_coordinate` | Another agent holds the scope |
179
+ | `plan_already_assigned` | `bclaw_coordinate` | A second assignment on one plan |
180
+ | `agent_validation_failed` | `bclaw_coordinate` | Target is not dispatchable |
181
+ | `wrote_outside_claim_scope` | release / assignment-completed / harvest / session-end | Files were written outside the claim's declared scope. **Advisory** — the write already happened |
182
+ | `generated_surfaces_stale` | `session-start` | Generated guidance on disk was written by an older brainclaw. Recovery is `brainclaw export --write`; no MCP tool performs it, so no `next_actions` is offered rather than one the engine would reject |
183
+
184
+ Conformity warnings are **silent on doubt** by construction: a claim whose scope is
185
+ a loop reference, free prose or a glob — 42.4% of the real corpus — yields
186
+ `unverifiable` and emits nothing. An accuser that is wrong that often teaches
187
+ agents to ignore the channel, which is worse than shipping no check at all.
188
+
144
189
  ### Canonical grammar (standard tier, v1.0+)
145
190
 
146
191
  Phase 3 shipped a unified grammar that replaces the per-entity tools
@@ -8,7 +8,108 @@ guarantees this changelog follows.
8
8
 
9
9
  ---
10
10
 
11
- ## Unreleased
11
+ ## [1.19.0] — 2026-08-01
12
+
13
+ **Added — `warning_details` on the facade response contract (pln#635)**
14
+ - Additive sibling of `warnings: string[]`, which keeps both its type and its
15
+ byte-identical historical contents. Each record carries `code` / `message` /
16
+ optional `data` / optional `next_actions`, so a consumer no longer has to
17
+ sniff-parse a string that may or may not be JSON to recover structure.
18
+ - The legacy string is DERIVED from the record, and only for an **enumerated**
19
+ set of codes that historically shipped a JSON blob (`agent_validation_failed`,
20
+ `plan_already_assigned`, `scope_already_claimed`). Enumerated rather than
21
+ inferred so a NEW code can never start emitting JSON at a consumer that has
22
+ only ever seen prose.
23
+ - Read contract, not input: no tool added/removed/renamed, no inputSchema change,
24
+ **no surface-fingerprint movement**. `warnings` remains the complete channel;
25
+ `warning_details` is a structured subset (see `src/core/warnings.ts` for why).
26
+
27
+ **Added — `next_actions` emitted by the write surfaces (pln#634 PR1)**
28
+ - `FacadeResponseSchema.next_actions` already existed and was optional; the write
29
+ facades simply never populated it. They now do, derived from the OUTCOME rather
30
+ than from a static table — and omit the key entirely when there is no genuine
31
+ follow-up, so its presence stays meaningful. Response-only; no fingerprint move.
32
+
33
+ **Added — new structured warning codes**
34
+ - `wrote_outside_claim_scope` (pln#636 C2) — emitted on `bclaw_release_claim`, on
35
+ assignment→`completed`, at LANE-RESULT harvest ingestion and at `session-end`.
36
+ Carries `claim_id`, `scope`, `declared_pathspecs`, `unexpected_paths`,
37
+ `base_sha`, and two recovery actions. Advisory: the write already happened.
38
+ - `generated_surfaces_stale` (pln#638 2b) — surfaced on `session-start` as
39
+ `stale_surfaces` when a generated guidance surface on disk was stamped by an
40
+ older brainclaw than the running one. Deliberately carries **no**
41
+ `next_actions`: the recovery is `brainclaw export --write` and no MCP tool
42
+ performs it, so the command travels in `message` + `data.refresh_command`
43
+ rather than as an action whose args the engine would reject.
44
+
45
+ **Added — `ClaimSchema.base_sha` / `ClaimSchema.paths` (pln#636 C0-b)**
46
+ - Both optional and never backfilled; legacy claims parse unchanged and a missing
47
+ baseline is treated as `unverifiable`, never guessed.
48
+ - Record shape only. `paths` is NOT exposed in `bclaw_claim`'s published
49
+ inputSchema — settable via the core and CLI, readable by the conformity
50
+ reconcile — so this moves **no** surface fingerprint. Widening the published
51
+ input belongs in its own governed change (tracked as a known gap in
52
+ CHANGELOG 1.19.0).
53
+
54
+ **Added — `SessionEndResult.scope_warnings`, `LaneHarvestResult.warnings`**
55
+ - Both are `WarningDetail[]`, born structured (hence `toWarningDetail`, which
56
+ builds the record without inventing a throwaway legacy string array). Additive
57
+ result fields on non-MCP surfaces; `LaneHarvestResult.warnings` is always
58
+ present (empty when nothing was ingested), which is an exact-shape change for
59
+ any caller asserting `deepEqual` on that result.
60
+
61
+ **Changed — a content-less loop artifact no longer satisfies a gate (pln#639)**
62
+ - Behavioural, not schema: `artifact.body` stays optional (ref-based artifacts
63
+ legitimately have none), but an artifact with neither a non-empty `body` nor a
64
+ `ref` no longer counts toward `min_artifacts_by_type`. The unmet-gate reason
65
+ string now names how many artifacts of that type were discarded as empty.
66
+ - Verified against the live corpus before shipping (219 loops / 321 artifacts,
67
+ zero content-less), so no running loop can be stalled by the stricter rule.
68
+
69
+ **Changed — loop artifacts are attributed to their DISPATCH phase (pln#639)**
70
+ - The ideation and review closers recorded `phase: loop.current_phase` (close
71
+ time); they now use the phase stamped on the slot at dispatch. A lane returning
72
+ after a phase advance is filed under the phase it was asked to work in.
73
+ - No gate in the engine keys on `type: 'verdict'` and `reviewer_green` scans all
74
+ phases, so review-loop outcomes are unaffected — attribution changes, verdicts
75
+ do not.
76
+
77
+ ---
78
+
79
+ ## [1.18.0] — 2026-07-31
80
+
81
+ > These entries sat under an `Unreleased` heading THROUGH the 1.18.0 release and
82
+ > are rolled retroactively here. pln#630 / pln#627 / pln#628 shipped in 1.18.0
83
+ > (see CHANGELOG.md); the pln#625 Phase 3 entry below predates it and was never
84
+ > rolled either. Rolling the section is part of cutting a release — the 1.19.0
85
+ > prep found it still open.
86
+
87
+ **Added — turn-attempt evidence-correlation fields (pln#630 PR2b-a)**
88
+ - Additive, backward-compatible: `LaneResultSchema` gains optional `turn_id` /
89
+ `run_id` / `nonce`; `RuntimeEventSchema` gains optional `turn_id` / `nonce`
90
+ (`run_id` already present); `LoopSlotSchema` gains optional `current_turn_id`;
91
+ a `turn_reserved` variant joins the loop event journal. All optional/defaulted
92
+ — legacy records parse unchanged; no tool added/removed/renamed.
93
+ - `LoopSlotSchema.current_turn_id` flows into the zod-derived `LoopSlotInput`
94
+ embedded in `bclaw_loop`'s published inputSchema, so it DOES move the public
95
+ MCP surface fingerprint (bumped in the `(current)` section below) and
96
+ regenerates `mcp-schemas.generated.ts`. Additive optional field — no breaking
97
+ change to the tool contract.
98
+
99
+ **Changed — `bclaw_read_inbox` bounded + focused reads (pln#627 Phase A)**
100
+ - Default status filter is now **actionable** (pending + read); acknowledged and
101
+ archived are hidden unless `includeAll=true` or an explicit `status` is passed.
102
+ Previously an unset status returned every message (the "pending by default"
103
+ description was wrong).
104
+ - Results are ordered **newest-first** by `created_at` before pagination, so a
105
+ bounded page serves the most recent messages instead of the oldest debris.
106
+ - Message bodies are **previewed** (~500 chars) with `text_length` + `truncated`;
107
+ the full body is returned only with `full=true`. The page is size-bounded by
108
+ `budget_tokens` (like `bclaw_find` / `bclaw_search`), with `has_more` /
109
+ `next_offset` paging hints — a single read can no longer blow the token budget.
110
+ - Input schema gains `includeAll`, `full`, and `budget_tokens` (additive; moves
111
+ the surface fingerprint — see the current section). `structuredContent.messages`
112
+ now carries `text_length` + `truncated` per message.
12
113
 
13
114
  **Added — `LaneResultSchema.review_verdict` / `review_summary` (pln#628 Focus 4B)**
14
115
  - `LANE-RESULT.json` (the worktree-root file a dispatched worker writes) gains two
@@ -238,7 +339,22 @@ will still succeed. A follow-up PR will strip the dead handler code.
238
339
  changelog records the published MCP surface fingerprint. When a tool
239
340
  name, tier, category, or input schema changes, the test fails until
240
341
  this section is updated.
241
- - MCP public surface fingerprint: `sha256:468f0103414e97e8`
342
+ - MCP public surface fingerprint: `sha256:8241fa50b8cb4805`
343
+ (updated 2026-07-25 for pln#632: `bclaw_loop` gains the `bind` intent — an
344
+ implementation loop dispatches its linked sequence and advances bind→execute — plus
345
+ its typed inputSchema properties `dry_run`, `lanes`, `auto_execute`, `model`, and
346
+ `max_assignments`. Additive — no tool added/removed/renamed; the new enum value + the
347
+ new properties move the fingerprint.)
348
+ Previous: `sha256:f3d49b28d2d366bb`
349
+ (updated 2026-07-24 for pln#630 PR2b-a: `LoopSlotSchema` gains an optional
350
+ `current_turn_id`, which flows through the zod-derived `LoopSlotInput` into
351
+ `bclaw_loop`'s published inputSchema. Additive optional field; regenerates
352
+ `mcp-schemas.generated.ts`.)
353
+ Previous: `sha256:fd8a7e910bf5f751`
354
+ (updated 2026-07-24 for pln#627 Phase A: the `bclaw_read_inbox` input schema
355
+ gains `includeAll`, `full`, and `budget_tokens`. Additive — no tool
356
+ added/removed/renamed; the three new typed properties move the fingerprint.)
357
+ Previous: `sha256:468f0103414e97e8`
242
358
  (updated 2026-07-18 for pln#625 PR #83 + Codex review: `bclaw_list_agents`
243
359
  retired and `bclaw_find(entity='agent')` gains `includeReputation` — now typed
244
360
  as a boolean in `GRAMMAR_FILTER_CONTRACT.booleanKeys` and validated at the MCP
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brainclaw",
3
- "version": "1.17.0",
3
+ "version": "1.19.0",
4
4
  "description": "Shared project memory for humans and coding agents.",
5
5
  "type": "module",
6
6
  "repository": {