brainclaw 1.28.3 → 1.28.4

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 (40) hide show
  1. package/README.md +6 -0
  2. package/dist/brainclaw-vscode.vsix +0 -0
  3. package/dist/commands/harvest.js +67 -25
  4. package/dist/commands/loops-handlers.js +28 -1
  5. package/dist/commands/mcp-catalog.js +23 -2
  6. package/dist/commands/mcp-read-handlers.js +15 -1
  7. package/dist/commands/mcp-schemas.generated.js +13 -0
  8. package/dist/commands/mcp-write-coordination.js +84 -22
  9. package/dist/commands/mcp-write-memory.js +87 -1
  10. package/dist/commands/mcp.js +16 -2
  11. package/dist/core/context.js +16 -3
  12. package/dist/core/dispatch-status.js +36 -14
  13. package/dist/core/dispatcher.js +28 -20
  14. package/dist/core/entity-operations.js +62 -4
  15. package/dist/core/entity-registry.js +3 -3
  16. package/dist/core/execution-adapters.js +10 -0
  17. package/dist/core/facade-schema.js +10 -0
  18. package/dist/core/ideation-loop-close.js +3 -1
  19. package/dist/core/lane-result-file.js +72 -0
  20. package/dist/core/loop-turn-dispatch.js +2 -0
  21. package/dist/core/loops/brief-assembly.js +19 -11
  22. package/dist/core/loops/next-expected.js +56 -1
  23. package/dist/core/loops/reconcile-turn.js +8 -0
  24. package/dist/core/loops/result-reducers.js +14 -12
  25. package/dist/core/loops/store.js +4 -0
  26. package/dist/core/loops/types.js +14 -2
  27. package/dist/core/loops/verbs.js +8 -1
  28. package/dist/core/loops/worker-reply-contract.js +1 -1
  29. package/dist/core/protocol-tool-policy.js +1 -0
  30. package/dist/core/review-loop-turn-dispatch.js +1 -0
  31. package/dist/core/schema.js +24 -1
  32. package/dist/core/search.js +3 -2
  33. package/dist/core/worktree.js +14 -7
  34. package/dist/facts.js +9 -8
  35. package/dist/facts.json +8 -7
  36. package/docs/cli.md +33 -0
  37. package/docs/concepts/ideation-loop.md +35 -14
  38. package/docs/integrations/mcp.md +13 -3
  39. package/docs/mcp-schema-changelog.md +42 -6
  40. 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.4 on 2026-08-28T07:25:30.486Z
3
3
  export const FACTS = {
4
- "version": "1.28.3",
5
- "generated_at": "2026-08-25T23:07:33.877Z",
4
+ "version": "1.28.4",
5
+ "generated_at": "2026-08-28T07:25:30.486Z",
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-28T07:25:28.367Z",
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": 80,
491
492
  "payload_chars_median": 1640,
492
493
  "payload_tokens_est_median": 410
493
494
  },
@@ -495,7 +496,7 @@ 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
+ "duration_ms_median": 124,
499
500
  "payload_chars_median": 2626,
500
501
  "payload_tokens_est_median": 657
501
502
  },
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.4",
3
+ "generated_at": "2026-08-28T07:25:30.486Z",
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-28T07:25:28.367Z",
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": 80,
489
490
  "payload_chars_median": 1640,
490
491
  "payload_tokens_est_median": 410
491
492
  },
@@ -493,7 +494,7 @@
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
+ "duration_ms_median": 124,
497
498
  "payload_chars_median": 2626,
498
499
  "payload_tokens_est_median": 657
499
500
  },
package/docs/cli.md CHANGED
@@ -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.
@@ -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 |
@@ -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,43 @@ guarantees this changelog follows.
8
8
 
9
9
  ---
10
10
 
11
+ ## [1.28.4] — 2026-08-28
12
+
13
+ - MCP public surface fingerprint: `sha256:42cd662667260792`
14
+
15
+ **Added — lane-result harvest parity**
16
+
17
+ - `bclaw_harvest` is a new standard coordination write tool matching the CLI
18
+ lane-result path. It accepts one `assignmentId` or `all=true`, optional
19
+ `worktreePaths`, `dryRun`, and `integrate`; successful report harvests return
20
+ reconciled `continuations` and executable `next_actions`.
21
+
22
+ **Changed — ideation is instance-based and sequential by default**
23
+
24
+ - `bclaw_coordinate(intent="ideate")` accepts repeated `targetAgents`, an
25
+ optional positionally aligned `criticPerspectives` array, and
26
+ `ideation_schedule: "sequential" | "parallel"` (default sequential).
27
+ - The result adds `ideation_schedule` and `pending_critics`. Sequential briefs
28
+ include critiques already produced in the same round, so participants
29
+ challenge one another before champion revision and the next bounded round.
30
+
31
+ **Changed — compact, actionable read projections**
32
+
33
+ - `bclaw_find` accepts optional `fields`; one item larger than `budget_tokens`
34
+ is projected to identity/status fields and reports
35
+ `oversized_item_projected` rather than overrunning the response budget.
36
+ - Agent rows add `declared_spawnable`, `executable_now`, `availability_code`,
37
+ and `availability_reason`.
38
+ - Work context's `pending_notifications` is now a compact summary containing
39
+ `actionable_count`, `by_type`, and `telemetry_events_omitted`; the raw event
40
+ count remains available as `unseen_event_count`.
41
+ - `bclaw_dispatch_status` adds canonical `terminal_signal` evidence and may
42
+ diagnose stale explicit progress as `stalled` despite a live wrapper PID or
43
+ unrelated filesystem activity.
44
+
45
+ All changes are additive except the intentionally compacted
46
+ `pending_notifications` value shape.
47
+
11
48
  ## [1.28.3] — 2026-08-26
12
49
 
13
50
  **Changed — durable Code Map cascade execution**
@@ -438,12 +475,11 @@ will still succeed. A follow-up PR will strip the dead handler code.
438
475
  changelog records the published MCP surface fingerprint. When a tool
439
476
  name, tier, category, or input schema changes, the test fails until
440
477
  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`
478
+ - MCP public surface fingerprint: `sha256:42cd662667260792`
479
+ (updated 2026-08-28 for the additive `bclaw_harvest` surface, sequential
480
+ ideation controls, compact read projections, and loop-slot perspective and
481
+ completion fields.)
482
+ Previous: `sha256:be86e5571fcd0226`
447
483
  (`LoopSlotInput` gains optional `lane`, `scope_hint`, `plan_ids`, and
448
484
  `step_ids` fields so implementation-loop lane scope and provenance survive
449
485
  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.4",
4
4
  "description": "Shared project memory for humans and coding agents.",
5
5
  "type": "module",
6
6
  "repository": {