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.
- package/README.md +8 -0
- package/dist/brainclaw-vscode.vsix +0 -0
- package/dist/cli.js +12 -2
- package/dist/commands/dispatch.js +2 -0
- package/dist/commands/doctor.js +17 -0
- package/dist/commands/mcp.js +31 -7
- package/dist/core/agent-capability.js +67 -0
- package/dist/core/agentrun-reconciler.js +126 -52
- package/dist/core/coordination.js +10 -9
- package/dist/core/dispatcher.js +99 -29
- package/dist/core/entity-operations.js +54 -1
- package/dist/core/execution-adapters.js +32 -51
- package/dist/core/execution.js +14 -8
- package/dist/core/instruction-templates.js +4 -3
- package/dist/core/runtime-signals.js +102 -0
- package/dist/core/spawn-check.js +125 -0
- package/dist/facts.js +3 -3
- package/dist/facts.json +2 -2
- package/docs/cli.md +8 -4
- package/docs/integrations/mcp.md +48 -15
- package/docs/mcp-schema-changelog.md +16 -5
- package/docs/playbooks/team/index.md +7 -5
- package/package.json +1 -1
|
@@ -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.
|
|
2
|
+
// Source: brainclaw v1.7.2 on 2026-06-04T21:46:11.832Z
|
|
3
3
|
export const FACTS = {
|
|
4
|
-
"version": "1.7.
|
|
5
|
-
"generated_at": "2026-06-
|
|
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
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
|
|
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
|
|
package/docs/integrations/mcp.md
CHANGED
|
@@ -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,
|
|
48
|
-
|
|
49
|
-
By default, `tools/list` returns **facade + standard** tools (
|
|
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
|
-
| `
|
|
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
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
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:
|
|
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
|