brainclaw 1.28.3 → 1.28.5

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 (47) hide show
  1. package/README.md +6 -0
  2. package/dist/brainclaw-vscode.vsix +0 -0
  3. package/dist/cli/register-code-map.js +1 -0
  4. package/dist/commands/code-map.js +5 -1
  5. package/dist/commands/harvest.js +67 -25
  6. package/dist/commands/loops-handlers.js +28 -1
  7. package/dist/commands/mcp-catalog.js +32 -4
  8. package/dist/commands/mcp-read-handlers.js +15 -1
  9. package/dist/commands/mcp-schemas.generated.js +13 -0
  10. package/dist/commands/mcp-write-coordination.js +84 -22
  11. package/dist/commands/mcp-write-memory.js +87 -1
  12. package/dist/commands/mcp.js +60 -11
  13. package/dist/commands/switch.js +8 -1
  14. package/dist/core/code-map/backend.js +19 -5
  15. package/dist/core/code-map/refresh-jobs.js +158 -0
  16. package/dist/core/code-map/refresh-worker.js +12 -0
  17. package/dist/core/context.js +16 -3
  18. package/dist/core/dispatch-status.js +36 -14
  19. package/dist/core/dispatcher.js +28 -20
  20. package/dist/core/entity-operations.js +62 -4
  21. package/dist/core/entity-registry.js +3 -3
  22. package/dist/core/execution-adapters.js +10 -0
  23. package/dist/core/facade-schema.js +10 -0
  24. package/dist/core/ideation-loop-close.js +3 -1
  25. package/dist/core/lane-result-file.js +72 -0
  26. package/dist/core/loop-turn-dispatch.js +2 -0
  27. package/dist/core/loops/brief-assembly.js +19 -11
  28. package/dist/core/loops/next-expected.js +56 -1
  29. package/dist/core/loops/reconcile-turn.js +8 -0
  30. package/dist/core/loops/result-reducers.js +14 -12
  31. package/dist/core/loops/store.js +4 -0
  32. package/dist/core/loops/types.js +14 -2
  33. package/dist/core/loops/verbs.js +8 -1
  34. package/dist/core/loops/worker-reply-contract.js +1 -1
  35. package/dist/core/protocol-tool-policy.js +1 -0
  36. package/dist/core/review-loop-turn-dispatch.js +1 -0
  37. package/dist/core/schema.js +24 -1
  38. package/dist/core/search.js +3 -2
  39. package/dist/core/worktree.js +14 -7
  40. package/dist/facts.js +14 -13
  41. package/dist/facts.json +13 -12
  42. package/docs/cli.md +37 -4
  43. package/docs/code-map.md +30 -18
  44. package/docs/concepts/ideation-loop.md +35 -14
  45. package/docs/integrations/mcp.md +17 -7
  46. package/docs/mcp-schema-changelog.md +63 -6
  47. package/package.json +1 -1
package/dist/facts.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // Generated by scripts/emit-site-facts.mjs at build time. Do not edit manually.
2
- // Source: brainclaw v1.28.3 on 2026-08-25T23:07:33.877Z
2
+ // Source: brainclaw v1.28.5 on 2026-08-28T18:04:39.470Z
3
3
  export const FACTS = {
4
- "version": "1.28.3",
5
- "generated_at": "2026-08-25T23:07:33.877Z",
4
+ "version": "1.28.5",
5
+ "generated_at": "2026-08-28T18:04:39.470Z",
6
6
  "tools": {
7
- "count": 70,
8
- "published_count": 68,
7
+ "count": 71,
8
+ "published_count": 69,
9
9
  "names": [
10
10
  "bclaw_bootstrap",
11
11
  "bclaw_release_notes",
@@ -70,6 +70,7 @@ export const FACTS = {
70
70
  "bclaw_assignment_update",
71
71
  "bclaw_assignment_action",
72
72
  "bclaw_harvest_candidates",
73
+ "bclaw_harvest",
73
74
  "bclaw_find",
74
75
  "bclaw_get",
75
76
  "bclaw_create",
@@ -478,7 +479,7 @@ export const FACTS = {
478
479
  },
479
480
  "bench": {
480
481
  "schema": "brainclaw.bench.v1",
481
- "generated_at": "2026-08-25T23:07:31.792Z",
482
+ "generated_at": "2026-08-28T18:04:37.892Z",
482
483
  "node_version": "v24.19.0",
483
484
  "platform": "linux-x64",
484
485
  "repeats": 3,
@@ -487,7 +488,7 @@ export const FACTS = {
487
488
  "name": "cold_onboard",
488
489
  "volume": "empty",
489
490
  "description": "fresh machine → init → first useful context. Baseline for time-to-first-value.",
490
- "duration_ms_median": 79,
491
+ "duration_ms_median": 51,
491
492
  "payload_chars_median": 1640,
492
493
  "payload_tokens_est_median": 410
493
494
  },
@@ -495,17 +496,17 @@ export const FACTS = {
495
496
  "name": "warm_work",
496
497
  "volume": "medium",
497
498
  "description": "bclaw_work consult over a real-shaped store (~200 plans / 500 handoffs / 450 claims).",
498
- "duration_ms_median": 122,
499
- "payload_chars_median": 2626,
500
- "payload_tokens_est_median": 657
499
+ "duration_ms_median": 72,
500
+ "payload_chars_median": 2625,
501
+ "payload_tokens_est_median": 656
501
502
  },
502
503
  {
503
504
  "name": "first_edit",
504
505
  "volume": "medium",
505
506
  "description": "code_find + code_brief on the fresh-agent path (missing index, first touch).",
506
- "duration_ms_median": 11,
507
- "payload_chars_median": 1629,
508
- "payload_tokens_est_median": 407
507
+ "duration_ms_median": 8,
508
+ "payload_chars_median": 1680,
509
+ "payload_tokens_est_median": 420
509
510
  }
510
511
  ]
511
512
  }
package/dist/facts.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "1.28.3",
3
- "generated_at": "2026-08-25T23:07:33.877Z",
2
+ "version": "1.28.5",
3
+ "generated_at": "2026-08-28T18:04:39.470Z",
4
4
  "tools": {
5
- "count": 70,
6
- "published_count": 68,
5
+ "count": 71,
6
+ "published_count": 69,
7
7
  "names": [
8
8
  "bclaw_bootstrap",
9
9
  "bclaw_release_notes",
@@ -68,6 +68,7 @@
68
68
  "bclaw_assignment_update",
69
69
  "bclaw_assignment_action",
70
70
  "bclaw_harvest_candidates",
71
+ "bclaw_harvest",
71
72
  "bclaw_find",
72
73
  "bclaw_get",
73
74
  "bclaw_create",
@@ -476,7 +477,7 @@
476
477
  },
477
478
  "bench": {
478
479
  "schema": "brainclaw.bench.v1",
479
- "generated_at": "2026-08-25T23:07:31.792Z",
480
+ "generated_at": "2026-08-28T18:04:37.892Z",
480
481
  "node_version": "v24.19.0",
481
482
  "platform": "linux-x64",
482
483
  "repeats": 3,
@@ -485,7 +486,7 @@
485
486
  "name": "cold_onboard",
486
487
  "volume": "empty",
487
488
  "description": "fresh machine → init → first useful context. Baseline for time-to-first-value.",
488
- "duration_ms_median": 79,
489
+ "duration_ms_median": 51,
489
490
  "payload_chars_median": 1640,
490
491
  "payload_tokens_est_median": 410
491
492
  },
@@ -493,17 +494,17 @@
493
494
  "name": "warm_work",
494
495
  "volume": "medium",
495
496
  "description": "bclaw_work consult over a real-shaped store (~200 plans / 500 handoffs / 450 claims).",
496
- "duration_ms_median": 122,
497
- "payload_chars_median": 2626,
498
- "payload_tokens_est_median": 657
497
+ "duration_ms_median": 72,
498
+ "payload_chars_median": 2625,
499
+ "payload_tokens_est_median": 656
499
500
  },
500
501
  {
501
502
  "name": "first_edit",
502
503
  "volume": "medium",
503
504
  "description": "code_find + code_brief on the fresh-agent path (missing index, first touch).",
504
- "duration_ms_median": 11,
505
- "payload_chars_median": 1629,
506
- "payload_tokens_est_median": 407
505
+ "duration_ms_median": 8,
506
+ "payload_chars_median": 1680,
507
+ "payload_tokens_est_median": 420
507
508
  }
508
509
  ]
509
510
  }
package/docs/cli.md CHANGED
@@ -632,18 +632,18 @@ brainclaw note create "Need follow-up on launcher script" --plan pln_abc123
632
632
 
633
633
  ## Code Map
634
634
 
635
- A per-project Tree-sitter symbol + import index (JS/TS, Python, PHP, Java) so agents
635
+ A per-project Tree-sitter symbol + import index across 11 languages so agents
636
636
  can ask "where is X / what should I read first" before editing. The MCP equivalents
637
637
  are `bclaw_code_status` / `bclaw_code_find` / `bclaw_code_brief` / `bclaw_code_refresh`.
638
638
  Full reference (freshness model, supported languages, WASM bundling): [docs/code-map.md](code-map.md).
639
639
 
640
640
  ### `brainclaw code-map status [--cascade]`
641
641
 
642
- Store presence, freshness badge (`fresh` / `stale_changed_files` / `stale_extractor` / `stale_grammar` / `partial` / `missing_index`), and index stats (files, nodes, edges). Read-only. In a multi-project workspace, `--cascade` adds compact coverage counts and names only non-fresh projects. On the MCP surface, the equivalent `bclaw_code_status(cascade=true)` also follows the latest durable cascade job.
642
+ Physical store-path presence, readable-index presence, freshness badge (`fresh` / `stale_changed_files` / `stale_extractor` / `stale_grammar` / `partial` / `missing_index`), and index stats (files, nodes, edges). Read-only. In a multi-project workspace, `--cascade` adds compact coverage counts and names only non-fresh projects. On MCP, status also follows the latest durable refresh job and accepts `project` for explicit targeting.
643
643
 
644
- ### `brainclaw code-map refresh [--all|--changed] [--cascade]`
644
+ ### `brainclaw code-map refresh [--all|--changed|--scope changed|all] [--cascade]`
645
645
 
646
- Build or update the index. `--changed` (default) re-parses only touched files; `--all` does a full re-index. Run this when status shows `missing_index` or a stale badge. Fails fast (never blocks) if another writer holds the project lock. In a multi-project workspace, `--cascade` synchronously refreshes each discovered project into its own store plus a root store scoped to files no child owns (zero double-indexing). The MCP equivalent starts a durable background job instead; follow it with `bclaw_code_status(cascade=true)`. See [docs/code-map.md](code-map.md#cascading-a-multi-project-workspace---cascade).
646
+ Build or update the index. `--changed` (default) re-parses only touched files; `--all` does a full re-index; `--scope changed|all` is the MCP-compatible spelling. Run this when status shows `missing_index` or a stale badge. Fails fast if another writer holds the project lock. In a multi-project workspace, `--cascade` synchronously refreshes each discovered project into its own store plus a root store scoped to files no child owns. MCP refreshes return durable jobs immediately; follow them with `bclaw_code_status`, preserving the same optional `project`, or use `cascade=true` for a workspace job. See [docs/code-map.md](code-map.md#cascading-a-multi-project-workspace---cascade).
647
647
 
648
648
  ### `brainclaw code-map find <query> [--limit <n>]`
649
649
 
@@ -1185,6 +1185,39 @@ brainclaw update-handoff hnd_001 --review-verdict request_changes --reviewed-by
1185
1185
 
1186
1186
  ---
1187
1187
 
1188
+ ## Worker result harvest
1189
+
1190
+ ### `brainclaw harvest [assignment_id]`
1191
+
1192
+ Ingest a worker's `LANE-RESULT.json`, reconcile any bound loop turn, and report
1193
+ the exact continuation. Pass one assignment id or use `--all`; this is distinct
1194
+ from `harvest-candidates`, which imports proposed memory items.
1195
+
1196
+ | Option | Description |
1197
+ |---|---|
1198
+ | `--all` | Scan every managed worktree |
1199
+ | `--integrate` | Also commit a sandboxed worker's worktree diff and settle its lifecycle |
1200
+ | `--orphaned` | Recover a dead worker that left no lane result, without deleting/resetting work |
1201
+ | `--base <ref>` | Base ref used by orphan recovery (default `master`) |
1202
+ | `--dry-run` | Preview without writing events or markers |
1203
+ | `--worktree <path>` | Explicit worktree to scan; repeatable |
1204
+ | `--json` | Return lane results, warnings, and loop continuations as JSON |
1205
+
1206
+ ```bash
1207
+ brainclaw harvest asgn_123
1208
+ brainclaw harvest --all --json
1209
+ brainclaw harvest --integrate asgn_123
1210
+ ```
1211
+
1212
+ The exact filename is `LANE-RESULT.json`. A unique root-level JSON file whose
1213
+ schema and `assignment_id` match can be recovered when a worker chose the wrong
1214
+ name; Brainclaw refuses ambiguous candidates. `artifacts` accepts either string
1215
+ refs or `{type, ref, description?}` objects, while loop workers must also emit
1216
+ the `artifact_type` named in their brief. A repairable schema/contract error
1217
+ keeps the real turn replayable and eligible for corrected re-harvest.
1218
+
1219
+ ---
1220
+
1188
1221
  ## Dispatch
1189
1222
 
1190
1223
  The `dispatch` command group manages the local agent dispatcher: it analyzes the active sequence for lane readiness and assigns work to available agents.
package/docs/code-map.md CHANGED
@@ -13,7 +13,7 @@ code, never blocks `bclaw_work`, and degrades gracefully: if the index is
13
13
  missing or stale, every command says so via a freshness badge instead of
14
14
  returning silently wrong answers.
15
15
 
16
- The index lives under `.brainclaw/code-map/` (one JSONL shard per file, plus
16
+ The index lives under `.brainclaw/code/` (one JSONL shard per file, plus
17
17
  named symbol/import indexes and a manifest). It is safe to delete; a refresh
18
18
  rebuilds it.
19
19
 
@@ -37,8 +37,10 @@ accepts `--json` for machine-readable output, and prints a `Freshness:` line.
37
37
 
38
38
  ### `brainclaw code-map status`
39
39
 
40
- Read-only. Reports whether the store exists, the freshness badge, and index
41
- stats (files indexed, nodes, edges). Never refreshes.
40
+ Read-only. Reports whether the physical store path exists, whether a valid
41
+ index is readable, the freshness badge, and index stats (files indexed, nodes,
42
+ edges). `store_exists`, `index_exists`, and `index_manifest_exists` deliberately
43
+ separate a directory containing job records from a usable index. Never refreshes.
42
44
 
43
45
  ```bash
44
46
  brainclaw code-map status
@@ -47,6 +49,7 @@ brainclaw code-map status
47
49
  ```
48
50
  Code Map status
49
51
  Store: present
52
+ Index: ready
50
53
  Root: /workspace/apps/api
51
54
  Path: /workspace/apps/api/.brainclaw/code
52
55
  Freshness: fresh
@@ -55,7 +58,7 @@ Code Map status
55
58
  Edges: 2410
56
59
  ```
57
60
 
58
- ### `brainclaw code-map refresh [--changed | --all]`
61
+ ### `brainclaw code-map refresh [--changed | --all | --scope changed|all]`
59
62
 
60
63
  Rebuilds the index behind a per-project lock. Defaults to `--changed`.
61
64
 
@@ -63,6 +66,7 @@ Rebuilds the index behind a per-project lock. Defaults to `--changed`.
63
66
  |---|---|
64
67
  | `--changed` (default) | Re-parses files whose **content** changed (git status + file-hash diff) **and** any shard whose stored extractor-config / grammar / engine hashes no longer match the current ones (i.e. `stale_extractor` / `stale_grammar`). A config or grammar bump is therefore healed by this cheap path — not only by `--all`. Compaction is limited to git-proven deletes. |
65
68
  | `--all` | Enumerates every supported file, re-parses, and performs full orphan compaction (drops shards whose file is gone or now ignored). |
69
+ | `--scope changed\|all` | Uses the same scope spelling as MCP. Existing `--changed` / `--all` flags remain supported. |
66
70
 
67
71
  If a live writer already holds the project lock, `refresh` **fails fast** with a
68
72
  clear status rather than blocking — it never stalls `bclaw_work`.
@@ -70,6 +74,7 @@ clear status rather than blocking — it never stalls `bclaw_work`.
70
74
  ```bash
71
75
  brainclaw code-map refresh # changed (cheap, default)
72
76
  brainclaw code-map refresh --all # full rebuild + compaction
77
+ brainclaw code-map refresh --scope changed
73
78
  ```
74
79
 
75
80
  ### `brainclaw code-map find <query>`
@@ -126,11 +131,15 @@ all return a `freshness_badge`:
126
131
 
127
132
  | Tool | Kind | Purpose |
128
133
  |---|---|---|
129
- | `bclaw_code_status` | read | Active-session project store, freshness, index stats; `cascade=true` also follows the latest cascade job. Never refreshes. |
130
- | `bclaw_code_find` | read | Ranked symbol-index search (`query`, optional `limit`). Never refreshes. |
131
- | `bclaw_code_brief` | read | Reading brief for a symbol/path (`target`, optional `limit`, files capped at 12). Never refreshes. |
134
+ | `bclaw_code_status` | read | Active-session or explicit `project` store/path/index diagnostics, freshness, stats, and latest refresh job; `cascade=true` also follows the latest cascade job. Never refreshes. |
135
+ | `bclaw_code_find` | read | Ranked symbol-index search (`query`, optional `limit`/`project`). Never refreshes. |
136
+ | `bclaw_code_brief` | read | Reading brief for a symbol/path (`target`, optional `limit`/`project`, files capped at 12). Never refreshes. |
132
137
  | `bclaw_code_export` | read | Bounded local subgraph around required `target`; direction/depth/node/edge caps, confidence filtering, and optional Mermaid projection. Never refreshes. |
133
- | `bclaw_code_refresh` | write | Rebuild the index. `scope` = `"changed"` (default) or `"all"`; MCP `cascade=true` starts a durable background job and returns immediately. |
138
+ | `bclaw_code_refresh` | write | Accept a durable background rebuild and return immediately. `scope` = `"changed"` (default) or `"all"`; optional `project` targets a named/id/path project, and `cascade=true` spans a workspace. |
139
+
140
+ Every MCP Code Map tool accepts the same optional `project` selector (project
141
+ name, id, or workspace-relative path). It overrides the active session for that
142
+ call without mutating the session.
134
143
 
135
144
  The read tools never trigger a parse — if `bclaw_code_status` /
136
145
  `bclaw_code_find` / `bclaw_code_brief` report `missing_index` or a stale badge,
@@ -186,9 +195,9 @@ reconciliation at the read path:
186
195
  file-hash diff vs the stored shards), so a stale index is always *visible*,
187
196
  never silently wrong.
188
197
  3. `refresh --changed` re-parses only the changed files (incremental); `--all` does
189
- a full rebuild + orphan compaction. The one bounded background path is an
190
- explicitly requested MCP monorepo cascade, whose durable progress is read
191
- through `bclaw_code_status(cascade=true)`.
198
+ a full rebuild + orphan compaction. MCP refreshes are explicit durable jobs;
199
+ their progress is read through `bclaw_code_status` (or
200
+ `bclaw_code_status(cascade=true)` for a workspace cascade).
192
201
  4. `bclaw_work` nudges a refresh when the badge is `missing_index` or stale, so an
193
202
  agent knows to reconcile before trusting the map.
194
203
 
@@ -219,10 +228,12 @@ like any other directory.
219
228
  Both CLI and MCP status responses disclose the exact resolved project root and
220
229
  Code Map store path. The MCP response additionally includes `active_source`, the
221
230
  resolved project identity, the running server version, and the package version
222
- visible on disk. In a monorepo, compare these fields before concluding that an
223
- index is missing: a root store and a child store are intentionally distinct. If
224
- the versions differ, restart the MCP server; if the roots differ, select the
225
- intended project/session (or pass `cascade=true` at the workspace root).
231
+ visible on disk. `store_exists` describes the physical directory;
232
+ `index_exists` describes a valid readable manifest. In a monorepo, compare
233
+ these fields before concluding that an index is missing: a root store and a
234
+ child store are intentionally distinct. If the versions differ, restart the
235
+ MCP server; if the roots differ, use `project="<name-or-path>"`, select the
236
+ intended session project, or pass `cascade=true` at the workspace root.
226
237
 
227
238
  ### Cascading a multi-project workspace (`--cascade`)
228
239
 
@@ -242,9 +253,10 @@ double-indexing**, even when projects nest inside one another. `--cascade` is
242
253
  opt-in; without it, the root refresh keeps its single-tree behaviour (above), and
243
254
  single-project repos ignore the flag entirely.
244
255
 
245
- The CLI cascade stays synchronous. MCP `bclaw_code_refresh(cascade=true)` returns
246
- a durable `job_id` immediately, avoiding the client timeout that a large workspace
247
- can hit; follow it with `bclaw_code_status(cascade=true)`. Status reports completed
256
+ The CLI cascade stays synchronous. Every MCP refresh returns a durable `job_id`
257
+ immediately, avoiding client timeouts; follow a normal refresh with
258
+ `bclaw_code_status(project=...)`, or a cascade with
259
+ `bclaw_code_status(cascade=true)`. Status reports completed
248
260
  and total project counts, the project currently being indexed, and terminal
249
261
  outcomes. Successful rows are aggregated; only exceptions are named. A project
250
262
  with a valid empty index is labeled `no_eligible_files`, while lock contention and
@@ -49,7 +49,7 @@ proposal → critique ↔ revision → synthesis
49
49
  | Phase | Purpose | What the slot produces |
50
50
  |---|---|---|
51
51
  | `proposal` | Seed: the original idea / decision under consideration | A `proposal` artifact (the task text from the caller) |
52
- | `critique` | Adversarial review against project memory | One or more `critique` artifacts citing real memory ids |
52
+ | `critique` | Adversarial review seeded by project memory and verified against the current worktree | One or more `critique` artifacts citing repository evidence and any memory ids used as leads |
53
53
  | `revision` | Champion's response to the critique batch | A `revision` artifact addressing the points raised |
54
54
  | `synthesis` | Final plan_draft folding the cycle's outputs | A `plan_draft` artifact with `addresses_critique:[ids]` |
55
55
 
@@ -171,6 +171,10 @@ goal: …
171
171
  ## what to produce
172
172
  - Phase "critique" expects you to act in role "critic".
173
173
  - Emit findings as LoopArtifacts via bclaw_loop intent='complete_turn'…
174
+ - Treat memory as an investigation lead, not current-code proof.
175
+ - Verify implementation findings against the worktree and cite a path plus a
176
+ line, symbol, assertion, or test/command result. Unverified concerns remain
177
+ questions, not findings.
174
178
  - Cite the memory ids you relied on so the synthesis can audit coverage.
175
179
  ```
176
180
 
@@ -222,26 +226,43 @@ filter, gate, iteration accounting) but want to drive each turn
222
226
  yourself — useful for one-shot consultations or when you don't have
223
227
  a separate critic agent on hand.
224
228
 
225
- ### Multi-agent mode
229
+ ### Multi-instance, multi-turn mode
226
230
 
227
231
  ```
228
232
  bclaw_coordinate(intent='ideate',
229
233
  task='Should we adopt approach A or approach B?',
230
- targetAgents=['codex'])
234
+ targetAgents=['codex', 'codex', 'codex'],
235
+ criticPerspectives=[
236
+ 'challenge assumptions and demand evidence',
237
+ 'focus on failure modes and recovery',
238
+ 'develop alternatives and compare trade-offs'
239
+ ])
231
240
  ```
232
241
 
233
242
  - Opens a loop with `champion` slot (caller) + one `critic` slot per
234
- target agent.
243
+ requested target instance. Repeated identities are intentional: a user with
244
+ only one installed agent can request three isolated Codex, Claude, or other
245
+ critic instances. Each occurrence gets its own slot, claim, worktree,
246
+ assignment, and turn authority; the three-artifact gate does not require
247
+ three different agent families.
235
248
  - Stores `task` as a `proposal` artifact.
236
249
  - Advances proposal → critique.
237
- - For each critic slot: assembles the brief via `buildIdeationBrief`
238
- honouring the critique phase's context_filter, calls
239
- `bclaw_loop(intent='turn')` to flip the slot to `assigned`, and
240
- queues a coordinate message with the brief as body and
241
- `{intent: 'ideate', loop_id, slot_id, phase, iteration,
242
- proposal_artifact_id}` payload.
250
+ - Persists a distinct `perspective` on every critic slot. When
251
+ `criticPerspectives` is omitted, Brainclaw supplies complementary evidence,
252
+ failure-mode, and alternatives/trade-off lenses.
253
+ - Uses `ideation_schedule='sequential'` by default. Only critic A starts
254
+ initially. After its result is harvested, `continuations` and `next_actions`
255
+ name critic B's real `turn(dispatch=true)`; B's brief includes A's critique
256
+ from the current round. C then sees A+B. The champion revises after the gate,
257
+ and the ordered conversation starts again in the next iteration.
258
+ - `ideation_schedule='parallel'` is an explicit latency/quality trade-off that
259
+ starts every critic immediately. It is useful when independent first
260
+ impressions matter more than cross-challenge and token cost.
261
+ - `brainclaw harvest <assignment>` and MCP `bclaw_harvest` both surface the
262
+ loop continuation. Workers may also finish through `complete_turn` directly.
243
263
  - Returns `{loop_id, …, mode: 'multi_agent',
244
- dispatched_critics: N, current_phase: 'critique'}`.
264
+ ideation_schedule, dispatched_critics, pending_critics,
265
+ current_phase: 'critique'}`.
245
266
 
246
267
  When the critique phase brief is truncated for any slot, a per-slot
247
268
  warning surfaces. When dispatch fails (e.g. an agent is unknown), the
@@ -299,9 +320,9 @@ which critiques were honoured vs ignored.
299
320
  framings, and "wrong question" findings that memory-driven critique
300
321
  is structurally unable to produce. Validated empirically; ships on
301
322
  its own cadence after MVP usage telemetry.
302
- - **Profile-based slot diversity.** Champion / simplifier / pessimist
303
- as separate slot types with their own context filters. Deferred
304
- until the single-slot model is validated in production.
323
+ - **Richer perspective presets.** Slots already persist caller-provided or
324
+ default critic lenses. Named reusable perspective packs can build on that
325
+ contract without coupling diversity to agent identity.
305
326
  - **Cross-loop memory.** Promoting validated plan_drafts back into
306
327
  the project memory store with provenance. Today the synthesis
307
328
  artifact lives only in the loop event journal.
@@ -47,7 +47,7 @@ Every tool has one of three tiers in its `annotations.tier` field:
47
47
  - **standard** — Day-to-day coordination tools: plans, claims, messaging, sequences, dispatch, review, memory. Returned by default alongside facades.
48
48
  - **advanced** — Specialized governance, audit, registry, and power tools.
49
49
 
50
- By default, `tools/list` returns **facade + standard** tools (49 tools). To get all tools including advanced, pass `{ "catalog": "all" }`, `{ "include": "all" }`, or `{ "advanced": true }`. To filter by a single tier, pass `{ "tier": "facade" }`, `{ "tier": "standard" }`, or `{ "tier": "advanced" }`.
50
+ By default, `tools/list` returns **facade + standard** tools (50 tools). To get all tools including advanced, pass `{ "catalog": "all" }`, `{ "include": "all" }`, or `{ "advanced": true }`. To filter by a single tier, pass `{ "tier": "facade" }`, `{ "tier": "standard" }`, or `{ "tier": "advanced" }`.
51
51
 
52
52
  Published tools remain callable regardless of catalog filtering — the tier only affects discovery via `tools/list`.
53
53
 
@@ -101,6 +101,7 @@ Each tool also has an `annotations.category` field: `session`, `context`, `memor
101
101
  | `bclaw_assignment_update` | coordination | Report assignment lifecycle status; v2 logical Assignments require the full generation fence and accept only accepted/started/progress before settlement |
102
102
  | `bclaw_assignment_action` | coordination | Resolve or reject a pending ActionRequired item |
103
103
  | `bclaw_harvest_candidates` | coordination | Harvest sandboxed worktree candidate files into the main project store |
104
+ | `bclaw_harvest` | coordination | Harvest or integrate worker `LANE-RESULT.json` files, reconcile loop turns, and return the exact continuation |
104
105
  | `bclaw_find` | memory | List canonical entities with filters |
105
106
  | `bclaw_get` | memory | Fetch a canonical entity by id or short label |
106
107
  | `bclaw_create` | memory | Create a canonical entity |
@@ -108,13 +109,13 @@ Each tool also has an `annotations.category` field: `session`, `context`, `memor
108
109
  | `bclaw_remove` | memory | Archive or purge a canonical entity |
109
110
  | `bclaw_transition` | memory | Move an entity through its validated state machine |
110
111
  | `bclaw_move` | memory | Relocate an item to another project, id-preserving (multi-project) |
111
- | `bclaw_code_status` | discovery | Active-session Code Map freshness + stats; `cascade:true` follows durable monorepo refresh progress and exceptions |
112
- | `bclaw_code_find` | discovery | Search the Code Map symbol index by name (function/class/component/hook/type) |
113
- | `bclaw_code_brief` | discovery | Ranked reading list + related decisions/traps before editing a symbol or path |
112
+ | `bclaw_code_status` | discovery | Active-session or explicit `project` Code Map path/index diagnostics + freshness/stats; follows durable refresh jobs, with `cascade:true` for workspace progress |
113
+ | `bclaw_code_find` | discovery | Search the active or explicit `project` Code Map symbol index by name |
114
+ | `bclaw_code_brief` | discovery | Ranked reading list + related decisions/traps before editing a symbol or path, optionally targeted by `project` |
114
115
  | `bclaw_code_impact` | discovery | Explainable local blast radius from resolved imports: definition, direct dependents, opt-in bounded transitives, tests, and count-based risk |
115
116
  | `bclaw_code_export` | discovery | Compact bounded local nodes/edges around one symbol or file; preserves edge kind/source/confidence, with optional Mermaid projection |
116
117
  | `bclaw_code_outline` | discovery | Source-ordered symbols of one indexed file (span, exported, confidence) — no reparse |
117
- | `bclaw_code_refresh` | discovery | Rebuild the Code Map index (`scope: changed \| all`); `cascade:true` starts a durable background job |
118
+ | `bclaw_code_refresh` | discovery | Accept a durable Code Map rebuild (`scope: changed \| all`, optional `project`) and return immediately; `cascade:true` spans a workspace |
118
119
 
119
120
  See [code map](../code-map.md) for the full Code Map reference (CLI, freshness model, supported languages).
120
121
 
@@ -403,11 +404,20 @@ bclaw_dispatch({ intent: 'review', openLoop: true, reviewMode: 'symmetric' })
403
404
  // synthesis are worker phases available through trusted turn(dispatch:true).
404
405
  bclaw_coordinate({ intent: 'ideate', task: 'Should we extract the dispatcher into a separate package?' })
405
406
 
406
- // Multi-agent ideation: critic gets a context-filtered, BM25-ranked brief auto-dispatched
407
+ // Multi-instance ideation is sequential and multi-turn by default: each critic
408
+ // sees the earlier contributions in its round. Repeated identities are valid.
407
409
  bclaw_coordinate({
408
410
  intent: 'ideate',
409
411
  task: 'Should we adopt approach A or approach B?',
410
- targetAgents: ['codex'],
412
+ targetAgents: ['codex', 'codex', 'codex'],
413
+ criticPerspectives: ['assumptions/evidence', 'failure modes/recovery', 'alternatives/trade-offs'],
414
+ })
415
+
416
+ // Opt into independent immediate fan-out only when latency matters more than
417
+ // cross-challenge and cost.
418
+ bclaw_coordinate({
419
+ intent: 'ideate', task: 'Collect independent first impressions',
420
+ targetAgents: ['codex', 'codex', 'codex'], ideation_schedule: 'parallel',
411
421
  })
412
422
 
413
423
  // Open a direct implementation loop. The caller owns subsequent bind/turn
@@ -8,6 +8,62 @@ guarantees this changelog follows.
8
8
 
9
9
  ---
10
10
 
11
+ ## [1.28.5] — 2026-08-28
12
+
13
+ - MCP public surface fingerprint: `sha256:f410416669e7fc9a`
14
+
15
+ **Changed — Code Map project targeting and durable refresh**
16
+
17
+ - Every `bclaw_code_*` input schema gains the same optional `project` selector
18
+ (name, id, or workspace-relative path). It overrides the active session for
19
+ one call without mutating it.
20
+ - `bclaw_code_refresh` now acknowledges every refresh as a durable job, not
21
+ only multi-project cascades. Its `scope: "changed" | "all"` contract is
22
+ unchanged and no new field is required.
23
+ - `bclaw_code_status` keeps its input compatibility while its result separates
24
+ physical path presence (`store_exists`) from a readable index
25
+ (`index_exists`, `index_manifest_exists`) and exposes the latest single-project
26
+ refresh job.
27
+
28
+ All input changes are additive; no tool was added, removed, or renamed.
29
+
30
+ ## [1.28.4] — 2026-08-28
31
+
32
+ - MCP public surface fingerprint: `sha256:42cd662667260792`
33
+
34
+ **Added — lane-result harvest parity**
35
+
36
+ - `bclaw_harvest` is a new standard coordination write tool matching the CLI
37
+ lane-result path. It accepts one `assignmentId` or `all=true`, optional
38
+ `worktreePaths`, `dryRun`, and `integrate`; successful report harvests return
39
+ reconciled `continuations` and executable `next_actions`.
40
+
41
+ **Changed — ideation is instance-based and sequential by default**
42
+
43
+ - `bclaw_coordinate(intent="ideate")` accepts repeated `targetAgents`, an
44
+ optional positionally aligned `criticPerspectives` array, and
45
+ `ideation_schedule: "sequential" | "parallel"` (default sequential).
46
+ - The result adds `ideation_schedule` and `pending_critics`. Sequential briefs
47
+ include critiques already produced in the same round, so participants
48
+ challenge one another before champion revision and the next bounded round.
49
+
50
+ **Changed — compact, actionable read projections**
51
+
52
+ - `bclaw_find` accepts optional `fields`; one item larger than `budget_tokens`
53
+ is projected to identity/status fields and reports
54
+ `oversized_item_projected` rather than overrunning the response budget.
55
+ - Agent rows add `declared_spawnable`, `executable_now`, `availability_code`,
56
+ and `availability_reason`.
57
+ - Work context's `pending_notifications` is now a compact summary containing
58
+ `actionable_count`, `by_type`, and `telemetry_events_omitted`; the raw event
59
+ count remains available as `unseen_event_count`.
60
+ - `bclaw_dispatch_status` adds canonical `terminal_signal` evidence and may
61
+ diagnose stale explicit progress as `stalled` despite a live wrapper PID or
62
+ unrelated filesystem activity.
63
+
64
+ All changes are additive except the intentionally compacted
65
+ `pending_notifications` value shape.
66
+
11
67
  ## [1.28.3] — 2026-08-26
12
68
 
13
69
  **Changed — durable Code Map cascade execution**
@@ -438,12 +494,13 @@ will still succeed. A follow-up PR will strip the dead handler code.
438
494
  changelog records the published MCP surface fingerprint. When a tool
439
495
  name, tier, category, or input schema changes, the test fails until
440
496
  this section is updated.
441
- - MCP public surface fingerprint: `sha256:be86e5571fcd0226`
442
- (updated 2026-08-24 for persisted continuation authority: additive
443
- `bclaw_loop(intent="continue")` inputs `action_index`, `autonomy_mode`, and
444
- `risk`; the intent evaluates an attested Ideation→Implementation action,
445
- persists AUTO/REQUIRE_APPROVAL/DENY, and reuses the public open/bind path.)
446
- Previous: `sha256:681c47cba85b79c3`
497
+ - MCP public surface fingerprint: `sha256:f410416669e7fc9a`
498
+ (updated 2026-08-28 for optional `project` targeting on every Code Map MCP
499
+ tool. Previous: `sha256:42cd662667260792`, updated for the additive
500
+ `bclaw_harvest` surface, sequential
501
+ ideation controls, compact read projections, and loop-slot perspective and
502
+ completion fields.)
503
+ Previous: `sha256:be86e5571fcd0226`
447
504
  (`LoopSlotInput` gains optional `lane`, `scope_hint`, `plan_ids`, and
448
505
  `step_ids` fields so implementation-loop lane scope and provenance survive
449
506
  through the public facade. Existing callers remain valid.)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brainclaw",
3
- "version": "1.28.3",
3
+ "version": "1.28.5",
4
4
  "description": "Shared project memory for humans and coding agents.",
5
5
  "type": "module",
6
6
  "repository": {