@jaggerxtrm/specialists 3.5.1 → 3.6.1

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.
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "execution": {
22
22
  "mode": "tool",
23
- "model": "anthropic/claude-sonnet-4-6",
23
+ "model": "openai-codex/gpt-5.3-codex",
24
24
  "fallback_model": "openai-codex/gpt-5.4",
25
25
  "timeout_ms": 0,
26
26
  "stall_timeout_ms": 120000,
@@ -24,6 +24,7 @@
24
24
  "response_format": "markdown",
25
25
  "output_type": "workflow",
26
26
  "permission_required": "MEDIUM",
27
+ "requires_worktree": false,
27
28
  "max_retries": 0,
28
29
  "interactive": false
29
30
  },
@@ -2,297 +2,47 @@
2
2
  "specialist": {
3
3
  "metadata": {
4
4
  "name": "node-coordinator",
5
- "version": "1.1.0",
6
- "description": "Coordinator hub for research nodes. READ_ONLY orchestrator that emits structured JSON decisions to route work across member specialists.",
5
+ "version": "1.3.0",
6
+ "description": "Coordinator hub for research nodes. LOW-permission orchestrator that drives node lifecycle through sp node CLI commands.",
7
7
  "category": "orchestration",
8
8
  "tags": [
9
9
  "node",
10
10
  "coordinator",
11
11
  "orchestration",
12
- "json",
12
+ "cli",
13
13
  "keep-alive",
14
14
  "worktree"
15
15
  ],
16
16
  "created": "2026-04-03",
17
- "updated": "2026-04-04"
17
+ "updated": "2026-04-10"
18
18
  },
19
19
  "execution": {
20
20
  "mode": "tool",
21
- "model": "anthropic/claude-sonnet-4-6",
22
- "fallback_model": "openai-codex/gpt-5.4",
21
+ "model": "openai-codex/gpt-5.4",
22
+ "fallback_model": "anthropic/claude-sonnet-4-6",
23
23
  "timeout_ms": 0,
24
24
  "stall_timeout_ms": 180000,
25
25
  "interactive": true,
26
- "response_format": "json",
27
- "output_type": "orchestration",
28
- "permission_required": "READ_ONLY",
26
+ "permission_required": "LOW",
27
+ "requires_worktree": false,
29
28
  "thinking_level": "low",
30
29
  "max_retries": 0
31
30
  },
32
31
  "prompt": {
33
- "system": "You are a node coordinator. You manage a team of specialist members working toward a shared research goal. You are READ_ONLY \u2014 you do not write files or run code. You emit structured JSON decisions only.\n\nYour responsibilities:\n- Read member updates injected into your context\n- Decide which members to resume, steer, or stop next\n- Maintain a running memory patch as typed entries (fact/question/decision)\n- Track coordination state (current_goal, active_members, waiting_on_members)\n- Emit a next_trigger so the NodeSupervisor knows when to resume you\n- If you need human input, set status: waiting and blocking_on.kind: human_input\n\n## Worktree Lifecycle\n\nEvery executor member runs in its own isolated git worktree. You control this through action payloads:\n\n- spawn_member with type=executor: NodeSupervisor provisions a new worktree via --worktree. The executor gets its own branch (feature/<bead-id>-<specialist-slug>) and isolated file tree.\n- spawn_member with type=reviewer/debugger/test-runner: NodeSupervisor routes into the executor's worktree via --job <executor-job-id>. These members see the executor's branch, not main.\n- complete_node or wave completion: triggers merge of worktree branches into master in FIFO dependency order. Orchestrator (or xt-merge) handles sequencing.\n\nKey rules:\n- Parallel executors are only allowed when their file sets are provably disjoint\n- Reviewers/debuggers/test-runners always enter via --job, never --worktree\n- After a wave completes, branches must be merged before the next wave starts\n- If a reviewer returns PARTIAL, create a fix bead as child of the impl bead and re-enter the same worktree via --job\n\nRefer to the using-specialists skill loaded in your context for full orchestration patterns, CLI flags, chained bead pipeline details, and merge protocol.\n\nNEVER emit prose outside of the JSON object. Your entire response must be a single valid JSON object matching the output schema.\n",
34
- "task_template": "$prompt\n\nNode context:\n$bead_context\n\nMember updates (if any):\n$pre_script_output\n",
35
- "output_schema": {
36
- "type": "object",
37
- "required": [
38
- "summary",
39
- "status",
40
- "actions",
41
- "memory_patch",
42
- "coordination_state",
43
- "routing_rationale",
44
- "next_trigger"
45
- ],
46
- "properties": {
47
- "summary": {
48
- "type": "string"
49
- },
50
- "status": {
51
- "type": "string",
52
- "enum": [
53
- "success",
54
- "partial",
55
- "failed",
56
- "waiting"
57
- ]
58
- },
59
- "issues_closed": {
60
- "type": "array",
61
- "items": {
62
- "type": "string"
63
- }
64
- },
65
- "issues_created": {
66
- "type": "array",
67
- "items": {
68
- "type": "string"
69
- }
70
- },
71
- "follow_ups": {
72
- "type": "array",
73
- "items": {
74
- "type": "string"
75
- }
76
- },
77
- "risks": {
78
- "type": "array",
79
- "items": {
80
- "type": "string"
81
- }
82
- },
83
- "verification": {
84
- "type": "array",
85
- "items": {
86
- "type": "string"
87
- }
88
- },
89
- "actions": {
90
- "type": "array",
91
- "items": {
92
- "oneOf": [
93
- {
94
- "type": "object",
95
- "required": [
96
- "type",
97
- "memberId",
98
- "task"
99
- ],
100
- "properties": {
101
- "type": {
102
- "type": "string",
103
- "enum": [
104
- "resume"
105
- ]
106
- },
107
- "memberId": {
108
- "type": "string"
109
- },
110
- "task": {
111
- "type": "string"
112
- }
113
- }
114
- },
115
- {
116
- "type": "object",
117
- "required": [
118
- "type",
119
- "memberId",
120
- "message"
121
- ],
122
- "properties": {
123
- "type": {
124
- "type": "string",
125
- "enum": [
126
- "steer"
127
- ]
128
- },
129
- "memberId": {
130
- "type": "string"
131
- },
132
- "message": {
133
- "type": "string"
134
- }
135
- }
136
- },
137
- {
138
- "type": "object",
139
- "required": [
140
- "type",
141
- "memberId"
142
- ],
143
- "properties": {
144
- "type": {
145
- "type": "string",
146
- "enum": [
147
- "stop"
148
- ]
149
- },
150
- "memberId": {
151
- "type": "string"
152
- }
153
- }
154
- }
155
- ]
156
- }
157
- },
158
- "blocking_on": {
159
- "type": "object",
160
- "properties": {
161
- "kind": {
162
- "type": "string",
163
- "enum": [
164
- "human_input",
165
- "member_output",
166
- "external_dependency"
167
- ]
168
- },
169
- "target": {
170
- "type": "string"
171
- },
172
- "details": {
173
- "type": "string"
174
- }
175
- }
176
- },
177
- "memory_patch": {
178
- "type": "array",
179
- "items": {
180
- "type": "object",
181
- "required": [
182
- "entry_type",
183
- "summary"
184
- ],
185
- "properties": {
186
- "entry_type": {
187
- "type": "string",
188
- "enum": [
189
- "fact",
190
- "question",
191
- "decision"
192
- ]
193
- },
194
- "entry_id": {
195
- "type": "string"
196
- },
197
- "summary": {
198
- "type": "string"
199
- },
200
- "source_member_id": {
201
- "type": "string"
202
- },
203
- "confidence": {
204
- "type": "number"
205
- },
206
- "provenance": {
207
- "type": "object"
208
- }
209
- }
210
- }
211
- },
212
- "coordination_state": {
213
- "type": "object",
214
- "properties": {
215
- "current_goal": {
216
- "type": "string"
217
- },
218
- "active_members": {
219
- "type": "array",
220
- "items": {
221
- "type": "string"
222
- }
223
- },
224
- "waiting_on_members": {
225
- "type": "array",
226
- "items": {
227
- "type": "string"
228
- }
229
- },
230
- "pending_decisions": {
231
- "type": "array",
232
- "items": {
233
- "type": "string"
234
- }
235
- },
236
- "blockers": {
237
- "type": "array",
238
- "items": {
239
- "type": "string"
240
- }
241
- }
242
- }
243
- },
244
- "routing_rationale": {
245
- "type": "string"
246
- },
247
- "next_trigger": {
248
- "type": "object",
249
- "required": [
250
- "event"
251
- ],
252
- "properties": {
253
- "event": {
254
- "type": "string",
255
- "enum": [
256
- "on_member_update",
257
- "on_human_input",
258
- "on_external_update",
259
- "on_timeout",
260
- "manual_resume"
261
- ]
262
- },
263
- "target": {
264
- "type": "string"
265
- },
266
- "details": {
267
- "type": "string"
268
- }
269
- }
270
- }
271
- }
272
- }
32
+ "system": "You are node-coordinator.\n\nLoad and follow the using-nodes skill for full operating details.\n\nRole:\n- Pure orchestrator. You coordinate you do NOT do the work yourself.\n- You are the CEO of this node run. CEOs route work to specialists; they do not write code, read files, or produce research themselves.\n- Coordinate exclusively by running sp node plus sp ps/sp result commands via bash and reading structured JSON responses.\n\nHard constraints:\n- NO file reads. Do not call read, ls, find, grep, or any file inspection tool. You have no such tools.\n- NO git operations\n- NO bd operations\n- NO implementation of the task yourself — not even partially\n- Use ONLY the node orchestration command surface (sp node + sp ps + sp result).\n- Your only tool is bash. Your only bash commands are sp node, sp ps, and sp result.\n- Keep responses concise, operational, and state-aware\n\n## Node Coordinator Contract (SSoT: src/specialist/node-contract.ts)\n- Coordinator is CLI-native: reason in natural language, then call sp node commands.\n- Never emit contract JSON objects as final coordinator output.\n- Use only these orchestration commands:\n- `sp node spawn-member --node $SPECIALISTS_NODE_ID --member-key <key> --specialist <name> [--bead <id>] [--phase <id>] [--json]`\n- `sp node create-bead --node $SPECIALISTS_NODE_ID --title \"...\" [--type task] [--priority 2] [--depends-on <id>] [--json]`\n- `sp node wait-phase --node $SPECIALISTS_NODE_ID --phase <id> --members <k1,k2,...> [--json]`\n- `sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json`\n- `sp ps --node $SPECIALISTS_NODE_ID --json`\n- Node refs accept any unique prefix for operator commands (e.g. `research`, `research-5eaf`, or full ID), but coordinator commands should use `$SPECIALISTS_NODE_ID`.\n- Every command should be called with `--json` when the result is used for decisions.\n- Wait-phase is a hard barrier: do not advance to next phase until it reports completion.\n- After each wait-phase barrier, read participating member results with `sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json`, synthesize the evidence, then decide the next phase or remain waiting for operator closure.\n- On command errors, inspect JSON error payload, adjust plan, and retry with corrected inputs.\n- Nested nodes are forbidden (do not spawn node-coordinator as a member).\n- If you find yourself wanting to read a file or explore the codebase directly — STOP. That is a member's job. Spawn an explorer member and read its result via sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json.\n\nExecution loop:\n1) Read node status and member registry snapshots with `sp ps --node $SPECIALISTS_NODE_ID --json`.\n2) Decide the next phase/member action from the current state and coordinator goal.\n3) Execute exactly the next command needed.\n4) If a phase barrier completes, read every participating member result with `sp result $SPECIALISTS_NODE_ID:<member-key> --wait --json`.\n5) Synthesize the member evidence before deciding whether to launch another phase, create a bead, or enter waiting.\n6) Repeat until the node is blocked or waiting with explicit operator closure guidance.\n\nFew-shot command sequences:\n- Explore phase then synthesize:\n sp ps --node $SPECIALISTS_NODE_ID --json\n sp node spawn-member --node $SPECIALISTS_NODE_ID --member-key explore-1 --specialist explorer --phase explore-1 --json\n sp node wait-phase --node $SPECIALISTS_NODE_ID --phase explore-1 --members explore-1 --json\n sp result $SPECIALISTS_NODE_ID:explore-1 --wait --json\n Synthesize the explore-1 evidence, then decide whether to launch an impl/design phase.\n- Create follow-up bead then continue:\n sp node create-bead --node $SPECIALISTS_NODE_ID --title 'Investigate retry loop failure path' --json\n sp ps --node $SPECIALISTS_NODE_ID --json\n- Final synthesis then wait for operator closure:\n sp ps --node $SPECIALISTS_NODE_ID --json\n sp result $SPECIALISTS_NODE_ID:review-1 --wait --json\n Synthesize the review evidence and remain in waiting; operator closes via sp node stop.\n\nWhen a command returns ok:false, adjust arguments and retry with a corrected command or mark blocked with the concrete error.",
33
+ "task_template": "$prompt\n\nNode context:\n$bead_context\n\nMember updates (if any):\n$pre_script_output\n"
273
34
  },
274
35
  "skills": {
275
36
  "paths": [
276
- ".xtrm/skills/active/pi/using-specialists/"
277
- ],
278
- "scripts": [
279
- {
280
- "run": "specialists list",
281
- "phase": "pre",
282
- "inject_output": true
283
- }
37
+ ".xtrm/skills/active/pi/using-nodes"
284
38
  ]
285
39
  },
286
40
  "capabilities": {
287
41
  "required_tools": [
288
- "read",
289
- "grep",
290
- "find",
291
- "ls"
42
+ "bash"
292
43
  ],
293
44
  "external_commands": [
294
- "bd",
295
- "git",
45
+ "sp",
296
46
  "specialists"
297
47
  ]
298
48
  },
@@ -301,10 +51,9 @@
301
51
  },
302
52
  "validation": {
303
53
  "files_to_watch": [
304
- "src/specialist/schema.ts",
305
- "src/specialist/runner.ts",
306
- "src/specialist/worktree.ts",
307
- "src/specialist/supervisor.ts"
54
+ "src/specialist/node-contract.ts",
55
+ "src/specialist/node-supervisor.ts",
56
+ "src/cli/node.ts"
308
57
  ],
309
58
  "stale_threshold_days": 30
310
59
  },
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "execution": {
19
19
  "mode": "tool",
20
- "model": "anthropic/claude-sonnet-4-6",
20
+ "model": "openai-codex/gpt-5.4",
21
21
  "fallback_model": "google-gemini-cli/gemini-3.1-pro-preview",
22
22
  "timeout_ms": 0,
23
23
  "stall_timeout_ms": 120000,
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "execution": {
19
19
  "mode": "tool",
20
- "model": "anthropic/claude-haiku-4-5",
20
+ "model": "dashscope/qwen3.5-plus",
21
21
  "fallback_model": "anthropic/claude-sonnet-4-6",
22
22
  "timeout_ms": 0,
23
23
  "stall_timeout_ms": 120000,
@@ -35,7 +35,8 @@
35
35
  "paths": [
36
36
  ".xtrm/skills/active/pi/find-docs/SKILL.md",
37
37
  ".xtrm/skills/active/pi/deepwiki/SKILL.md",
38
- ".xtrm/skills/active/pi/github-search/SKILL.md"
38
+ ".xtrm/skills/active/pi/github-search/SKILL.md",
39
+ ".xtrm/skills/default/last30days"
39
40
  ],
40
41
  "scripts": []
41
42
  },
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "execution": {
18
18
  "mode": "tool",
19
- "model": "anthropic/claude-sonnet-4-6",
19
+ "model": "openai-codex/gpt-5.3-codex",
20
20
  "timeout_ms": 0,
21
21
  "stall_timeout_ms": 120000,
22
22
  "response_format": "markdown",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "execution": {
19
19
  "mode": "tool",
20
- "model": "anthropic/claude-sonnet-4-6",
20
+ "model": "dashscope/glm-5",
21
21
  "fallback_model": "google-gemini-cli/gemini-3-flash-preview",
22
22
  "timeout_ms": 0,
23
23
  "stall_timeout_ms": 120000,