brainclaw 1.7.1 → 1.7.2

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.
@@ -0,0 +1,125 @@
1
+ /**
2
+ * pln#520 step 2 — `brainclaw doctor --spawn-check`.
3
+ *
4
+ * A real, minimal spawn round-trip per installed agent BEFORE any real dispatch
5
+ * (and in CI). For each CLI-spawnable agent whose binary is on PATH, it spawns
6
+ * an ack-wrapped probe and waits for the ack + completed sentinels on the
7
+ * current host. This validates delivery + the spawn/handshake/sentinel
8
+ * mechanism on the actual agent×OS cell — it would have caught the 6 silent
9
+ * deaths of can_f792cacd before launching them (a worker that spawns but never
10
+ * reaches completion shows up here as `delivered_no_completion`).
11
+ *
12
+ * Uninstalled agents are skipped (`not_installed`), so this is safe to run in
13
+ * CI where most agent CLIs are absent.
14
+ *
15
+ * @module
16
+ */
17
+ import fs from 'node:fs';
18
+ import os from 'node:os';
19
+ import path from 'node:path';
20
+ import { buildInvokeCommand, getSpawnableAgents, getCapabilityProfile, } from './agent-capability.js';
21
+ import { defaultExecutionAdapter, resolveBinaryOnPath } from './execution-adapters.js';
22
+ import { signalExists, readLogTail } from './runtime-signals.js';
23
+ const DEFAULT_PROBE_TIMEOUT_MS = 15_000;
24
+ const DEFAULT_PROBE_PROMPT = 'Reply with exactly: OK';
25
+ async function sleep(ms) {
26
+ return new Promise((r) => setTimeout(r, ms));
27
+ }
28
+ /** Check one agent's spawn round-trip. Exposed for focused testing. */
29
+ export async function checkAgentSpawn(agent, options = {}) {
30
+ const start = Date.now();
31
+ const profile = getCapabilityProfile(agent);
32
+ if (!profile?.invoke_template || !profile?.invoke_binary || !profile.runtime.canBeSpawnedCli) {
33
+ return { agent, status: 'no_template', delivered: false, completed: false, duration_ms: 0, detail: 'no CLI invoke template' };
34
+ }
35
+ const binary = resolveBinaryOnPath(profile.invoke_binary);
36
+ if (!binary) {
37
+ return { agent, binary: profile.invoke_binary, status: 'not_installed', delivered: false, completed: false, duration_ms: 0, detail: `binary '${profile.invoke_binary}' not on PATH` };
38
+ }
39
+ const invoke = options.probeFor?.(agent)
40
+ ?? buildInvokeCommand(agent, options.probePrompt ?? DEFAULT_PROBE_PROMPT, { mode: 'consult' });
41
+ if (!invoke) {
42
+ return { agent, binary, status: 'no_template', delivered: false, completed: false, duration_ms: 0, detail: 'could not build invoke command' };
43
+ }
44
+ // Isolated signals root so the probe never pollutes the project's runtime dir.
45
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), `bclaw-spawncheck-${agent}-`));
46
+ const assignmentId = 'spawn_check';
47
+ try {
48
+ defaultExecutionAdapter.start(invoke, { agent, assignmentId, ackRoot: root, worktreePath: root });
49
+ const timeout = options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
50
+ const deadline = Date.now() + timeout;
51
+ while (Date.now() < deadline) {
52
+ if (signalExists(root, assignmentId, 'completed'))
53
+ break;
54
+ if (signalExists(root, assignmentId, 'failed'))
55
+ break;
56
+ await sleep(100);
57
+ }
58
+ const delivered = signalExists(root, assignmentId, 'ack');
59
+ const completed = signalExists(root, assignmentId, 'completed');
60
+ const failed = signalExists(root, assignmentId, 'failed');
61
+ const duration_ms = Date.now() - start;
62
+ if (completed) {
63
+ return { agent, binary, status: 'ok', delivered, completed: true, duration_ms, detail: 'ack + completed round-trip' };
64
+ }
65
+ if (failed) {
66
+ const tail = readLogTail(root, assignmentId, 'stderr', 400).trim() || readLogTail(root, assignmentId, 'stdout', 400).trim();
67
+ return { agent, binary, status: 'failed', delivered, completed: false, duration_ms, detail: `wrapper reported failure${tail ? ` — ${tail.replace(/\s+/g, ' ').slice(0, 200)}` : ''}` };
68
+ }
69
+ if (delivered) {
70
+ return { agent, binary, status: 'delivered_no_completion', delivered: true, completed: false, duration_ms, detail: `spawned + ack but no completion within ${timeout}ms (silent-death symptom)` };
71
+ }
72
+ return { agent, binary, status: 'failed', delivered: false, completed: false, duration_ms, detail: `no ack within ${timeout}ms — delivery failed` };
73
+ }
74
+ finally {
75
+ try {
76
+ fs.rmSync(root, { recursive: true, force: true });
77
+ }
78
+ catch { /* best-effort */ }
79
+ }
80
+ }
81
+ export async function runSpawnCheck(options = {}) {
82
+ const agentNames = options.agents ?? getSpawnableAgents().map((a) => a.name);
83
+ const entries = [];
84
+ for (const agent of agentNames) {
85
+ try {
86
+ entries.push(await checkAgentSpawn(agent, options));
87
+ }
88
+ catch (err) {
89
+ entries.push({
90
+ agent, status: 'failed', delivered: false, completed: false, duration_ms: 0,
91
+ detail: `spawn-check threw: ${err instanceof Error ? err.message : String(err)}`,
92
+ });
93
+ }
94
+ }
95
+ const installed = entries.filter((e) => e.status !== 'not_installed' && e.status !== 'no_template');
96
+ const ok = installed.filter((e) => e.status === 'ok').length;
97
+ const failures = installed.filter((e) => e.status === 'failed' || e.status === 'delivered_no_completion').length;
98
+ const not_installed = entries.filter((e) => e.status === 'not_installed').length;
99
+ return {
100
+ host_os: process.platform,
101
+ total: entries.length,
102
+ ok,
103
+ failures,
104
+ not_installed,
105
+ entries,
106
+ exit_code: failures > 0 ? 1 : 0,
107
+ };
108
+ }
109
+ export function renderSpawnCheckReport(report) {
110
+ const lines = [];
111
+ lines.push(`Spawn-check — ${report.ok} ok / ${report.failures} failed / ${report.not_installed} not installed (host: ${report.host_os})`);
112
+ lines.push('');
113
+ for (const e of report.entries) {
114
+ const icon = e.status === 'ok' ? '✔'
115
+ : e.status === 'not_installed' || e.status === 'no_template' ? '·'
116
+ : '✗';
117
+ lines.push(` ${icon} ${e.agent.padEnd(16)} ${e.status}${e.duration_ms ? ` (${e.duration_ms}ms)` : ''} — ${e.detail}`);
118
+ }
119
+ if (report.failures > 0) {
120
+ lines.push('');
121
+ lines.push('✗ One or more installed agents failed their spawn round-trip — fix before dispatching.');
122
+ }
123
+ return lines.join('\n');
124
+ }
125
+ //# sourceMappingURL=spawn-check.js.map
package/dist/facts.js CHANGED
@@ -1,8 +1,8 @@
1
1
  // Generated by scripts/emit-site-facts.mjs at build time. Do not edit manually.
2
- // Source: brainclaw v1.7.1 on 2026-06-02T10:24:49.702Z
2
+ // Source: brainclaw v1.7.2 on 2026-06-04T21:46:11.832Z
3
3
  export const FACTS = {
4
- "version": "1.7.1",
5
- "generated_at": "2026-06-02T10:24:49.702Z",
4
+ "version": "1.7.2",
5
+ "generated_at": "2026-06-04T21:46:11.832Z",
6
6
  "tools": {
7
7
  "count": 62,
8
8
  "published_count": 61,
package/dist/facts.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.7.1",
3
- "generated_at": "2026-06-02T10:24:49.702Z",
2
+ "version": "1.7.2",
3
+ "generated_at": "2026-06-04T21:46:11.832Z",
4
4
  "tools": {
5
5
  "count": 62,
6
6
  "published_count": 61,
package/docs/cli.md CHANGED
@@ -1933,7 +1933,7 @@ The default catalog is intentionally small and centred on the canonical grammar.
1933
1933
  | `bclaw_work(intent)` | Start a session, load context, and (for `intent="execute"`) claim a scope in one call. Returns a compact payload by default (pass `compact: false` for the full context). |
1934
1934
  | `bclaw_context(kind)` | Unified context read: `kind` is one of `memory`, `execution`, `board`, `board_summary`, or `delta`. |
1935
1935
 
1936
- **Canonical grammar** — your main tool for working with memory entities (plan, decision, constraint, trap, handoff, runtime_note, candidate, claim, action, assignment, agent_run):
1936
+ **Canonical grammar** — your main tool for working with memory entities (plan, decision, constraint, trap, handoff, runtime_note, candidate, sequence, claim, action, assignment, agent_run):
1937
1937
 
1938
1938
  | Tool | Purpose |
1939
1939
  |---|---|
@@ -1944,13 +1944,17 @@ The default catalog is intentionally small and centred on the canonical grammar.
1944
1944
  | `bclaw_remove(entity, id, purge?)` | Soft-delete (or purge) an entity. |
1945
1945
  | `bclaw_transition(entity, id, to)` | Change an entity's status (e.g. plan `todo` → `in_progress` → `done`, candidate `pending` → `accepted`). |
1946
1946
 
1947
- **Multi-agent coordination** (escalation path when delegating to other agents):
1947
+ **Multi-agent coordination** (escalation path when delegating to other agents):
1948
1948
 
1949
1949
  | Tool | Purpose |
1950
1950
  |---|---|
1951
1951
  | `bclaw_coordinate(intent)` | Assign, consult, review, reroute, or summarize across agents. Pass `open_loop: true` on `intent="review"` to also dispatch the reviewer turn. |
1952
1952
  | `bclaw_dispatch(intent)` | Parallelize execute across a sequence's lanes (analysis / execute / review). |
1953
- | `bclaw_loop(intent)` | Drive a turn in an existing multi-turn loop (`turn`, `complete_turn`, `advance`, `close`). Do not call `bclaw_loop(intent="open")` directly without dispatch — use `bclaw_coordinate(intent="review", open_loop: true)` instead. |
1953
+ | `bclaw_loop(intent)` | Drive a turn in an existing multi-turn loop (`turn`, `complete_turn`, `advance`, `close`). Do not call `bclaw_loop(intent="open")` directly without dispatch — use `bclaw_coordinate(intent="review", open_loop: true)` instead. |
1954
+
1955
+ **Sequences**:
1956
+
1957
+ `bclaw_list_sequences`, `bclaw_create_sequence`, `bclaw_update_sequence`, `bclaw_delete_sequence`. Sequence items use `{ planId, stepId?, rank, hard_after?, soft_after?, lane?, scope_hint?, rationale? }`. Create/update a sequence to `active`, inspect readiness with `bclaw_dispatch(intent="analysis")`, then dispatch ready lanes with `bclaw_dispatch(intent="execute")`.
1954
1958
 
1955
1959
  **Session, claims, plans, handoffs**:
1956
1960
 
@@ -1960,7 +1964,7 @@ The default catalog is intentionally small and centred on the canonical grammar.
1960
1964
 
1961
1965
  `bclaw_write_note`, `bclaw_quick_capture`, `bclaw_search`, `bclaw_setup`, `bclaw_bootstrap`, `bclaw_switch`, `bclaw_release_notes`, `bclaw_doctor`.
1962
1966
 
1963
- **Legacy per-entity tools** (`bclaw_list_plans` / `bclaw_list_claims` / `bclaw_list_candidates` / `bclaw_list_sequences`, `bclaw_get_context` / `bclaw_get_execution_context` / `bclaw_get_agent_board`, `bclaw_create_plan` / `bclaw_create_candidate`, `bclaw_update_plan` / `bclaw_update_handoff` / `bclaw_update_memory`, `bclaw_read_handoff` / `bclaw_delete_memory`, `bclaw_accept` / `bclaw_reject`, `bclaw_dispatch_analysis` / `bclaw_dispatch_review`, and others) were removed from the discoverable catalog at v1.0. Direct calls still succeed as a migration escape hatch but emit a redirect warning pointing at the canonical grammar. The full removal list and replacement map lives in [`docs/mcp-schema-changelog.md`](mcp-schema-changelog.md) under the v1.0 "Removed" section. Raw MCP clients can request the full advanced catalog with `tools/list` params `{ catalog: "all" }`.
1967
+ **Legacy per-entity tools** (`bclaw_list_plans` / `bclaw_list_claims` / `bclaw_list_candidates`, `bclaw_get_context` / `bclaw_get_execution_context` / `bclaw_get_agent_board`, `bclaw_create_plan` / `bclaw_create_candidate`, `bclaw_update_plan` / `bclaw_update_handoff` / `bclaw_update_memory`, `bclaw_read_handoff` / `bclaw_delete_memory`, `bclaw_accept` / `bclaw_reject`, `bclaw_dispatch_analysis` / `bclaw_dispatch_review`, and others) were removed from the discoverable catalog at v1.0. Direct calls still succeed as a migration escape hatch but emit a redirect warning pointing at the canonical grammar. The full removal list and replacement map lives in [`docs/mcp-schema-changelog.md`](mcp-schema-changelog.md) under the v1.0 "Removed" section. Raw MCP clients can request the full advanced catalog with `tools/list` params `{ catalog: "all" }`.
1964
1968
 
1965
1969
  ---
1966
1970
 
@@ -43,10 +43,10 @@ All 59 published MCP tools are discoverable via `tools/list`. Each tool carries
43
43
  Every tool has one of three tiers in its `annotations.tier` field:
44
44
 
45
45
  - **facade** — High-level entry points for agents that don't need granular access. Start here.
46
- - **standard** — Day-to-day coordination tools: plans, claims, messaging, dispatch, review, memory. Returned by default alongside facades.
47
- - **advanced** — Specialized governance, audit, registry, sequences, and power tools.
48
-
49
- By default, `tools/list` returns **facade + standard** tools (34 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" }`.
46
+ - **standard** — Day-to-day coordination tools: plans, claims, messaging, sequences, dispatch, review, memory. Returned by default alongside facades.
47
+ - **advanced** — Specialized governance, audit, registry, and power tools.
48
+
49
+ By default, `tools/list` returns **facade + standard** tools (38 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
50
 
51
51
  Published tools remain callable regardless of catalog filtering — the tier only affects discovery via `tools/list`.
52
52
 
@@ -90,9 +90,13 @@ Each tool also has an `annotations.category` field: `session`, `context`, `memor
90
90
  | `bclaw_session_end` | session | End session, optionally auto-reflect notes or handoffs |
91
91
  | `bclaw_add_step` | coordination | Add a sub-step to a plan item |
92
92
  | `bclaw_complete_step` | coordination | Mark a plan sub-step as done |
93
- | `bclaw_update_step` | coordination | Update a plan sub-step's status, text, or assignee |
94
- | `bclaw_delete_step` | coordination | Remove a sub-step from a plan |
95
- | `bclaw_correct_handoff` | coordination | Write an immutable correction handoff that supersedes an earlier one |
93
+ | `bclaw_update_step` | coordination | Update a plan sub-step's status, text, or assignee |
94
+ | `bclaw_delete_step` | coordination | Remove a sub-step from a plan |
95
+ | `bclaw_list_sequences` | coordination | Coordination sequence listing |
96
+ | `bclaw_create_sequence` | coordination | Create a coordination sequence |
97
+ | `bclaw_update_sequence` | coordination | Update a sequence's status, metadata, or items |
98
+ | `bclaw_delete_sequence` | coordination | Delete a sequence by ID |
99
+ | `bclaw_correct_handoff` | coordination | Write an immutable correction handoff that supersedes an earlier one |
96
100
  | `bclaw_assignment_update` | coordination | Report assignment lifecycle status |
97
101
  | `bclaw_assignment_action` | coordination | Resolve or reject a pending ActionRequired item |
98
102
  | `bclaw_harvest_candidates` | coordination | Harvest sandboxed worktree candidate files into the main project store |
@@ -123,13 +127,9 @@ Each tool also has an `annotations.category` field: `session`, `context`, `memor
123
127
  | `bclaw_who` | discovery | List active agent sessions on workspace |
124
128
  | `bclaw_add_capability` | discovery | Register a project capability |
125
129
  | `bclaw_add_tool` | discovery | Register a project tool |
126
- | `bclaw_list_sequences` | coordination | Coordination sequence listing |
127
- | `bclaw_create_sequence` | coordination | Create a coordination sequence |
128
- | `bclaw_update_sequence` | coordination | Update a sequence's status, metadata, or items |
129
- | `bclaw_get_thread` | coordination | Get all messages in a thread across inboxes |
130
- | `bclaw_delete_plan` | coordination | Delete a plan item by ID |
131
- | `bclaw_delete_sequence` | coordination | Delete a sequence by ID |
132
- | `bclaw_delete_memory` | memory | Delete a memory item by ID |
130
+ | `bclaw_get_thread` | coordination | Get all messages in a thread across inboxes |
131
+ | `bclaw_delete_plan` | coordination | Delete a plan item by ID |
132
+ | `bclaw_delete_memory` | memory | Delete a memory item by ID |
133
133
  | `bclaw_update_memory` | memory | Update a memory item's text or metadata |
134
134
  | `bclaw_compact` | memory | LLM-driven semantic memory compaction (two-phase) |
135
135
 
@@ -157,11 +157,44 @@ for the full 1.0.0 changelog.
157
157
  | `bclaw_transition(entity, id, to, reason?)` | State machine transition with side-effect tags | `bclaw_accept`, `bclaw_reject`, status-update flows |
158
158
 
159
159
  Supported entities: plan, decision, constraint, trap, handoff,
160
- runtime_note, candidate, claim, action, assignment, agent_run
160
+ runtime_note, candidate, sequence, claim, action, assignment, agent_run
161
161
  (with assignment lifecycle now writable through `bclaw_transition` and
162
162
  `bclaw_remove`; `agent_run` remains read-only). Declarative transition matrix +
163
163
  updatable field list live in [src/core/entity-registry.ts](../../src/core/entity-registry.ts).
164
164
 
165
+ #### Sequence workflow
166
+
167
+ Sequences are in the default catalog because they are the normal path
168
+ for parallel agent work. Use the specialized sequence tools when
169
+ building lanes; the canonical grammar can still read or patch the same
170
+ entity when that is more convenient.
171
+
172
+ Sequence items use this shape:
173
+
174
+ ```json
175
+ {
176
+ "planId": "pln_xxx",
177
+ "stepId": "stp_xxx",
178
+ "rank": 1,
179
+ "hard_after": [],
180
+ "soft_after": [],
181
+ "lane": "api",
182
+ "scope_hint": "src/api/**",
183
+ "rationale": "Independent API lane"
184
+ }
185
+ ```
186
+
187
+ `planId` and `rank` are required. `stepId` is optional and narrows the
188
+ sequence item to a specific plan step. `hard_after` blocks readiness
189
+ until predecessor items complete; `soft_after` is advisory.
190
+
191
+ Typical MCP flow:
192
+
193
+ 1. `bclaw_create_sequence({ name, status: "draft", items })`
194
+ 2. `bclaw_update_sequence({ id, status: "active" })`
195
+ 3. `bclaw_dispatch({ intent: "analysis" })`
196
+ 4. `bclaw_dispatch({ intent: "execute", agents: [...] })`
197
+
165
198
  For assignments specifically:
166
199
  - `bclaw_transition(entity="assignment", id=..., to="cancelled", reason=...)` is the canonical supervisor/admin cancel path.
167
200
  - `bclaw_remove(entity="assignment", id=...)` archives by cancelling the assignment.
@@ -19,7 +19,7 @@ guarantees this changelog follows.
19
19
  to `sha256:860fbaa30a486093` (zod 4). No tool was added, removed,
20
20
  renamed, or had its required arguments change.
21
21
 
22
- **Changed — `bclaw_loop(intent: 'open')` anti-pattern gate (pln#461)**
22
+ **Changed — `bclaw_loop(intent: 'open')` anti-pattern gate (pln#461)**
23
23
  - New optional field `allow_orphan: boolean` on `BclawLoopOpenSchema`.
24
24
  - Default (absent / `false`) — handler rejects with `validation_error`
25
25
  and points to `bclaw_coordinate(intent: 'review', open_loop: true)`
@@ -28,9 +28,20 @@ guarantees this changelog follows.
28
28
  out in `CLAUDE.md`.
29
29
  - `allow_orphan: true` — explicit acknowledgement that the caller
30
30
  will drive `turn()` + dispatch manually (advanced / test use only).
31
- - Internal callers (`bclaw_coordinate`, `bclaw_dispatch`) are not
32
- affected — they bypass `handleBclawLoop` and invoke the core
33
- `openLoop()` directly.
31
+ - Internal callers (`bclaw_coordinate`, `bclaw_dispatch`) are not
32
+ affected — they bypass `handleBclawLoop` and invoke the core
33
+ `openLoop()` directly.
34
+
35
+ **Changed — sequence tools promoted to default discovery (pln#522)**
36
+ - `bclaw_list_sequences`, `bclaw_create_sequence`,
37
+ `bclaw_update_sequence`, and `bclaw_delete_sequence` move from
38
+ `advanced` to `standard`, so fresh agents see them in the default
39
+ `tools/list` catalog. Sequences are a core agent-first coordination
40
+ primitive for parallel dispatch, not an advanced-only admin surface.
41
+ - `bclaw_create_sequence.items` and `bclaw_update_sequence.items` now
42
+ expose the full item shape in JSON Schema: `planId`, optional
43
+ `stepId`, `rank`, `hard_after`, `soft_after`, `lane`, `scope_hint`,
44
+ and `rationale`.
34
45
 
35
46
  ---
36
47
 
@@ -82,7 +93,7 @@ will still succeed. A follow-up PR will strip the dead handler code.
82
93
  changelog records the published MCP surface fingerprint. When a tool
83
94
  name, tier, category, or input schema changes, the test fails until
84
95
  this section is updated.
85
- - MCP public surface fingerprint: `sha256:4a6f612ad952fb52`
96
+ - MCP public surface fingerprint: `sha256:a1881ff57ddce377`
86
97
  (updated 2026-05-27: added the `ref` property to the bclaw_coordinate
87
98
  inputSchema — pln#520 Tier 2 / trp#371, the scope-aware dirty guard;
88
99
  `ref` lets a dispatch build its worktree from an explicit git ref.
@@ -48,11 +48,13 @@ These rules apply to any feature that touches this audience:
48
48
  - `bclaw_check_policy` — scope compliance with glob matching, returns blocks + warnings
49
49
  - `bclaw_who` — list all active agent sessions on the workspace
50
50
 
51
- ### Planning & Sequencing
52
- - `bclaw_create(entity="plan", data)` / `bclaw_update(entity="plan", id, patch)` / `bclaw_transition(entity="plan", id, to)` — shared work planning with priority/effort/assignee/status
53
- - `bclaw_find(entity="plan", filter?)` — list plans
54
- - `bclaw_add_step` / `bclaw_complete_step` / `bclaw_update_step` / `bclaw_delete_step` — plan sub-steps for granular tracking
55
- - `bclaw_create_sequence` / `bclaw_list_sequences` / `bclaw_update_sequence` — multi-step coordination sequences with lane analysis
51
+ ### Planning & Sequencing
52
+ - `bclaw_create(entity="plan", data)` / `bclaw_update(entity="plan", id, patch)` / `bclaw_transition(entity="plan", id, to)` — shared work planning with priority/effort/assignee/status
53
+ - `bclaw_find(entity="plan", filter?)` — list plans
54
+ - `bclaw_add_step` / `bclaw_complete_step` / `bclaw_update_step` / `bclaw_delete_step` — plan sub-steps for granular tracking
55
+ - `bclaw_create_sequence` / `bclaw_list_sequences` / `bclaw_update_sequence` — multi-step coordination sequences with lane analysis
56
+
57
+ Sequence items are explicit lane records: `{ planId, stepId?, rank, hard_after?, soft_after?, lane?, scope_hint?, rationale? }`. `planId` and `rank` are required; `stepId` lets a sequence dispatch a specific plan step instead of the whole plan. A normal parallel flow is: create sequence as `draft`, update it to `active`, run `bclaw_dispatch(intent="analysis")`, then run `bclaw_dispatch(intent="execute", agents=[...])`.
56
58
 
57
59
  ### Multi-Agent Dispatch
58
60
  - `bclaw_dispatch(intent)` — `analysis` analyses an active sequence (ready/active/blocked/done per lane), `execute` fans out parallel work across lanes, `review` dispatches code reviews for completed handoffs
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brainclaw",
3
- "version": "1.7.1",
3
+ "version": "1.7.2",
4
4
  "description": "Shared project memory for humans and coding agents.",
5
5
  "type": "module",
6
6
  "bin": {