opencode-onboard 0.3.3 → 0.4.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.
Files changed (87) hide show
  1. package/README.md +278 -214
  2. package/content/.agents/agents/basic-engineer.md +30 -0
  3. package/content/.agents/agents/devops-manager.md +38 -29
  4. package/content/.agents/session-log.json +41 -0
  5. package/content/.agents/skills/ob-default/SKILL.md +21 -0
  6. package/content/.agents/skills/ob-generic-guardrails/SKILL.md +32 -0
  7. package/content/.agents/skills/ob-global/SKILL.md +49 -0
  8. package/content/.agents/skills/ob-pullrequest-az/SKILL.md +11 -21
  9. package/content/.agents/skills/ob-pullrequest-gh/SKILL.md +14 -24
  10. package/content/.agents/skills/ob-userstory-az/SKILL.md +8 -14
  11. package/content/.agents/skills/ob-userstory-gh/SKILL.md +6 -14
  12. package/content/.opencode/commands/init.md +8 -0
  13. package/content/.opencode/commands/main.md +17 -0
  14. package/content/.opencode/commands/opsx-apply.md +50 -33
  15. package/content/.opencode/commands/plan.md +37 -0
  16. package/content/.opencode/plugins/session-log.js +1 -1
  17. package/content/.opencode/skills/openspec-apply-change/SKILL.md +50 -33
  18. package/content/AGENTS.md +94 -144
  19. package/content/skills-lock.json +4 -0
  20. package/package.json +6 -1
  21. package/src/commands/join.js +43 -0
  22. package/src/commands/shared.js +12 -0
  23. package/src/commands/shared.test.js +56 -0
  24. package/src/commands/single.js +64 -0
  25. package/src/commands/wizard.js +99 -0
  26. package/src/index.js +25 -202
  27. package/src/presets/browser.json +18 -0
  28. package/src/presets/clean.json +21 -0
  29. package/src/presets/models.json +33 -0
  30. package/src/presets/optimization.json +22 -0
  31. package/src/presets/platforms.json +29 -2
  32. package/src/presets/quota.json +14 -0
  33. package/src/presets/source.json +17 -0
  34. package/src/steps/browser/browser.test.js +81 -0
  35. package/src/steps/{install-browser.js → browser/index.js} +12 -15
  36. package/src/steps/{__tests__/clean-ai-files.test.js → clean/clean.test.js} +28 -13
  37. package/src/steps/{clean-ai-files.js → clean/index.js} +32 -30
  38. package/src/steps/copy/agents.js +106 -0
  39. package/src/steps/{__tests__/copy-content.test.js → copy/copy.test.js} +10 -1
  40. package/src/steps/copy/index.js +33 -0
  41. package/src/steps/copy/skills.js +55 -0
  42. package/src/steps/{write-onboard-config.js → metadata/index.js} +3 -3
  43. package/src/steps/metadata/metadata.test.js +99 -0
  44. package/src/steps/models/format.js +60 -0
  45. package/src/steps/models/format.test.js +75 -0
  46. package/src/steps/models/index.js +52 -0
  47. package/src/steps/models/write.js +54 -0
  48. package/src/steps/models/write.test.js +117 -0
  49. package/src/steps/{init-openspec.js → openspec/ensemble.js} +20 -57
  50. package/src/steps/openspec/ensemble.test.js +79 -0
  51. package/src/steps/openspec/index.js +32 -0
  52. package/src/steps/optimization/caveman-guidance.js +11 -0
  53. package/src/steps/{install-caveman.js → optimization/caveman.js} +5 -19
  54. package/src/steps/optimization/global.js +64 -0
  55. package/src/steps/optimization/index.js +101 -0
  56. package/src/steps/{__tests__/token-optimization.test.js → optimization/optimization.test.js} +37 -22
  57. package/src/steps/{install-quota.js → optimization/quota.js} +12 -10
  58. package/src/steps/platform/index.js +81 -0
  59. package/src/steps/platform/platform.test.js +129 -0
  60. package/src/steps/{choose-source-scope.js → source/index.js} +11 -17
  61. package/src/steps/source/source.test.js +91 -0
  62. package/src/utils/__tests__/copy.test.js +12 -5
  63. package/src/utils/copy.js +4 -24
  64. package/src/utils/exec-spinner.js +47 -0
  65. package/src/utils/exec.js +120 -162
  66. package/src/utils/models-cache.js +25 -68
  67. package/src/utils/models-pricing.js +42 -0
  68. package/src/utils/models-pricing.test.js +93 -0
  69. package/content/.agents/agents/back-engineer.md +0 -87
  70. package/content/.agents/agents/front-engineer.md +0 -86
  71. package/content/.agents/agents/infra-engineer.md +0 -85
  72. package/content/.agents/agents/quality-engineer.md +0 -86
  73. package/content/.agents/agents/security-auditor.md +0 -86
  74. package/src/steps/__tests__/check-env.test.js +0 -70
  75. package/src/steps/__tests__/check-platform.test.js +0 -104
  76. package/src/steps/__tests__/check-rtk.test.js +0 -38
  77. package/src/steps/__tests__/choose-platform.test.js +0 -38
  78. package/src/steps/check-env.js +0 -26
  79. package/src/steps/check-platform.js +0 -80
  80. package/src/steps/check-rtk.js +0 -38
  81. package/src/steps/choose-models.js +0 -165
  82. package/src/steps/choose-platform.js +0 -22
  83. package/src/steps/choose-skills-provider.js +0 -79
  84. package/src/steps/copy-content.js +0 -89
  85. package/src/steps/enable-caveman-guidance.js +0 -78
  86. package/src/steps/patch-agents-md.js +0 -153
  87. package/src/steps/token-optimization.js +0 -59
@@ -13,14 +13,14 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
13
13
  If a name is provided, use it. Otherwise:
14
14
  - Infer from conversation context if the user mentioned a change
15
15
  - Auto-select if only one active change exists
16
- - If ambiguous, run `rtk openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select
16
+ - If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select
17
17
 
18
18
  Always announce: "Using change: <name>" and how to override (e.g., `/opsx-apply <other>`).
19
19
 
20
20
  2. **Check status to understand the schema**
21
21
 
22
22
  ```bash
23
- rtk openspec status --change "<name>" --json
23
+ openspec status --change "<name>" --json
24
24
  ```
25
25
 
26
26
  Parse the JSON to understand:
@@ -30,7 +30,7 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
30
30
  3. **Get apply instructions**
31
31
 
32
32
  ```bash
33
- rtk openspec instructions apply --change "<name>" --json
33
+ openspec instructions apply --change "<name>" --json
34
34
  ```
35
35
 
36
36
  This returns:
@@ -58,7 +58,7 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
58
58
 
59
59
  6. **Implement via ensemble team**
60
60
 
61
- NEVER implement tasks directly. Always delegate to specialists via ensemble.
61
+ NEVER implement tasks directly. Always delegate to engineer workers via ensemble.
62
62
  Do NOT touch any source files before the team is running, not even a single edit.
63
63
 
64
64
  Steps MUST be followed in order. Do not skip any step.
@@ -86,20 +86,40 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
86
86
  DO NOT call team_claim yourself, only agents claim tasks.
87
87
  DO NOT proceed to 6d until team_tasks_add succeeds.
88
88
 
89
- **Step 6d.** Discover relevant skills, then spawn specialists.
90
-
91
- Before spawning, scan `.agents/skills/` and read each `SKILL.md` description line.
92
- Match skills to agents by domain:
93
- - front-engineer: UI, components, framework skills (e.g. next-best-practices, browser-automation)
94
- - back-engineer: API, data, service skills
95
- - infra-engineer: cloud, pipeline, deployment skills
96
- - quality-engineer: testing, coverage skills
89
+ **Step 6d.** Discover available agents, assign tasks by best fit, then spawn workers.
90
+
91
+ Agent discovery and assignment rule:
92
+ - Read `.agents/agents/*.md` and use each agent's `description` and `## Abilities` to understand specialization.
93
+ - For each task ID, choose the best-fit agent based on task domain (backend, frontend, infra, testing, etc.).
94
+ - Prefer specialized agents when available; use `basic-engineer` as fallback only.
95
+ - Only spawn agents that have assigned task IDs.
96
+
97
+ REQUIRED assignment algorithm (do not skip):
98
+ 1. Build candidate list from `.agents/agents/*.md` excluding `devops-manager`.
99
+ 2. Classify each task by domain using task text (api/backend, ui/frontend, infra/devops, testing/qa).
100
+ 3. For each task, score every candidate agent:
101
+ - +3 if agent description explicitly matches domain
102
+ - +2 if agent `## Abilities` include domain-relevant skills
103
+ - +1 if prior tasks of same domain already assigned to that agent (cohesion)
104
+ 4. Assign task to highest-score agent.
105
+ 5. Use `basic-engineer` ONLY when no specialized agent has positive score.
106
+ 6. If all tasks go to `basic-engineer`, you MUST explain why no specialist matched.
107
+
108
+ HARD RULES:
109
+ - NEVER assign a task to `basic-engineer` if a specialized agent has higher score.
110
+ - NEVER skip agent discovery from `.agents/agents/*.md`.
111
+ - ALWAYS include assignment rationale in spawn prompt: "Selected because <domain match>".
112
+
113
+ Skill loading is worker-driven:
114
+ - The spawned agent MUST load `@ob-global` first.
115
+ - Then it MUST load skills from its own `## Abilities` for the claimed task domain.
97
116
 
98
117
  Each team_spawn MUST include the agent field (required, causes NOT NULL error if omitted).
99
118
 
100
119
  The spawn prompt must contain exactly:
101
120
  1. Their name and role on this team
102
121
  2. Which tasks are theirs, list the task IDs and content from the board
122
+ 2.1 Why they were selected for those tasks (domain/abilities match)
103
123
  3. Key context they need (summarized from context files, do NOT tell them to read files themselves)
104
124
  4. The 6 OpenCode tools they have available (these are OpenCode tools, NOT shell commands, call them directly as tools, never via bash):
105
125
  team_claim, team_tasks_complete, team_tasks_list, team_tasks_add, team_message, team_broadcast
@@ -109,21 +129,18 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
109
129
  Keep spawn prompts under 600 tokens. Do not describe team internals or how ensemble works.
110
130
  Only spawn agents whose tasks are actually needed by this change. Skip agents with no tasks.
111
131
 
112
- First spawn all agents (wait for each team_spawn to confirm before the next):
132
+ Spawn one or more best-fit workers (parallel when dependencies allow):
113
133
  ```
114
- team_spawn name:"back" agent:"back-engineer" prompt:"..."
115
- (wait for result)
116
- team_spawn name:"front" agent:"front-engineer" prompt:"..."
117
- (wait for result)
118
- team_spawn name:"infra" agent:"infra-engineer" prompt:"..."
119
- (wait for result)
134
+ team_spawn name:"eng-1" agent:"backend-engineer" prompt:"..."
135
+ team_spawn name:"eng-2" agent:"frontend-engineer" prompt:"..."
136
+ team_spawn name:"eng-3" agent:"basic-engineer" prompt:"..."
120
137
  ```
121
138
 
122
- Then immediately send each spawned agent a start message to kick them off:
139
+ Then immediately send each spawned worker a start message with exact task IDs:
123
140
  ```
124
- team_message to:"back" text:"Start now. Read all skills listed in your prompt first, confirm loaded skills, then claim your first task with team_claim."
125
- team_message to:"front" text:"Start now. Read all skills listed in your prompt first, confirm loaded skills, then claim your first task with team_claim."
126
- team_message to:"infra" text:"Start now. Read all skills listed in your prompt first, confirm loaded skills, then claim your first task with team_claim."
141
+ team_message to:"eng-1" text:"Start now. Load @ob-global first, then use your agent `## Abilities` for these tasks: [task-<id1>] ... Claim each task ID before starting."
142
+ team_message to:"eng-2" text:"Start now. Load @ob-global first, then use your agent `## Abilities` for these tasks: [task-<id2>] ... Claim each task ID before starting."
143
+ team_message to:"eng-3" text:"Start now. Load @ob-global first, then use your agent `## Abilities` for these tasks: [task-<id3>] ... Claim each task ID before starting."
127
144
  ```
128
145
 
129
146
  **Step 6e.** After sending start messages, tell the user what is running, then STOP and wait.
@@ -135,18 +152,18 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
135
152
  If team_merge blocks ("overlapping local changes"), commit or stash your local changes first, then retry.
136
153
  Fix any other blockers reported.
137
154
 
138
- 7. **Quality check**
155
+ 7. **Verification check**
139
156
 
140
- Spawn quality engineer with worktree:false (read-only, no file edits):
141
- ```
142
- team_spawn name:"quality" agent:"quality-engineer" worktree:false prompt:"<verification scope, context summary, run tests + build + lint + verify acceptance criteria, no task claiming required in this phase, send results to lead when done>"
143
- ```
144
- Wait for messageteam_results → fix blockers → team_shutdown (no team_merge needed, worktree:false)
157
+ Run verification tasks (tests/build/lint) using a worker suited for verification scope:
158
+ - either same engineer workers
159
+ - or a dedicated verifier worker if your project defines one
160
+
161
+ Wait for results → fix blockers.
145
162
 
146
163
  8. **Mark tasks complete in openspec**
147
164
 
148
165
  Update tasks.md: `- [ ]` → `- [x]` for each completed task.
149
- Run `rtk openspec status --change "<name>" --json` to confirm.
166
+ Run `openspec status --change "<name>" --json` to confirm.
150
167
 
151
168
  9. **Show status, then cleanup**
152
169
 
@@ -169,10 +186,10 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
169
186
  - ALWAYS pass the task IDs returned by team_tasks_add to each agent's spawn prompt
170
187
  - NEVER edit files between team_spawn and team_merge, team_merge blocks on overlapping local changes
171
188
  - ALWAYS add every task to the board with team_tasks_add before spawning
172
- - ALWAYS spawn agents sequentially (wait for each team_spawn result before the next), then send start messages to all of them together
189
+ - ALWAYS spawn workers based on dependencies: parallel when safe, sequential when required
173
190
  - ALWAYS instruct agents to call team_claim before each task and team_tasks_complete after
174
191
  - If teammates are stuck, use team_message to resend tasks, then wait, never implement directly
175
- - Mark tasks complete in openspec AFTER specialists finish, not before
192
+ - Mark tasks complete in openspec AFTER worker implementation and verification finish, not before
176
193
  - Pause on errors, blockers, or unclear requirements. Do not guess
177
194
  - Use contextFiles from CLI output, do not assume specific file paths
178
- - Use `rtk` wrapper for ALL CLI commands. Never run openspec, git, gh, or az directly
195
+ - Follow CLI rules from `@ob-global` when present
@@ -0,0 +1,37 @@
1
+ ---
2
+ description: Parse a user story URL and produce a plan — proposal, specs, and tasks. Stops before implementation.
3
+ ---
4
+
5
+ Parse the work item at the URL provided after `/plan` and produce a full implementation plan.
6
+
7
+ **Input**: A GitHub Issue URL or Azure DevOps work item URL. Example: `/plan https://github.com/org/repo/issues/42`
8
+
9
+ **Steps:**
10
+
11
+ 1. **Load baseline**
12
+
13
+ Load `@ob-global` first.
14
+
15
+ 2. **Detect URL type and load matching skill**
16
+
17
+ - GitHub Issue URL → load `ob-userstory-gh` skill
18
+ - Azure DevOps URL → load `ob-userstory-az` skill
19
+
20
+ Follow the skill steps exactly: fetch the issue/work item via CLI and create an OpenSpec change.
21
+
22
+ 3. **Propose**
23
+
24
+ Run `/opsx-propose` to generate `proposal.md`, specs, and `tasks.md`.
25
+
26
+ 4. **Show the plan**
27
+
28
+ Display:
29
+ - Change name
30
+ - Total number of tasks
31
+ - Full task list summary
32
+
33
+ 5. **Stop**
34
+
35
+ Ask the user: "Ready to implement? Type `/opsx-apply` to start."
36
+
37
+ Do NOT proceed to implementation. Do NOT run `/opsx-apply` automatically.
@@ -343,7 +343,7 @@ export const SessionLogPlugin = async ({ client, directory }) => {
343
343
  correlationMethod: spawnMatch.spawnedSessionId === sessionId ? "direct" : "time-window",
344
344
  })
345
345
  } else {
346
- // No spawn match schedule an unmatched-session warning
346
+ // No spawn match, schedule an unmatched-session warning
347
347
  const capturedSessionId = sessionId
348
348
  setTimeout(() => {
349
349
  const s = sessionState.get(capturedSessionId)
@@ -19,14 +19,14 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
19
19
  If a name is provided, use it. Otherwise:
20
20
  - Infer from conversation context if the user mentioned a change
21
21
  - Auto-select if only one active change exists
22
- - If ambiguous, run `rtk openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select
22
+ - If ambiguous, run `openspec list --json` to get available changes and use the **AskUserQuestion tool** to let the user select
23
23
 
24
24
  Always announce: "Using change: <name>" and how to override (e.g., `/opsx-apply <other>`).
25
25
 
26
26
  2. **Check status to understand the schema**
27
27
 
28
28
  ```bash
29
- rtk openspec status --change "<name>" --json
29
+ openspec status --change "<name>" --json
30
30
  ```
31
31
 
32
32
  Parse the JSON to understand:
@@ -36,7 +36,7 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
36
36
  3. **Get apply instructions**
37
37
 
38
38
  ```bash
39
- rtk openspec instructions apply --change "<name>" --json
39
+ openspec instructions apply --change "<name>" --json
40
40
  ```
41
41
 
42
42
  This returns:
@@ -64,7 +64,7 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
64
64
 
65
65
  6. **Implement via ensemble team**
66
66
 
67
- NEVER implement tasks directly. Always delegate to specialists via ensemble.
67
+ NEVER implement tasks directly. Always delegate to engineer workers via ensemble.
68
68
  Do NOT touch any source files before the team is running, not even a single edit.
69
69
 
70
70
  Steps MUST be followed in order. Do not skip any step.
@@ -92,20 +92,40 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
92
92
  DO NOT call team_claim yourself, only agents claim tasks.
93
93
  DO NOT proceed to 6d until team_tasks_add succeeds.
94
94
 
95
- **Step 6d.** Discover relevant skills, then spawn specialists.
96
-
97
- Before spawning, scan `.agents/skills/` and read each `SKILL.md` description line.
98
- Match skills to agents by domain:
99
- - front-engineer: UI, components, framework skills (e.g. next-best-practices, browser-automation)
100
- - back-engineer: API, data, service skills
101
- - infra-engineer: cloud, pipeline, deployment skills
102
- - quality-engineer: testing, coverage skills
95
+ **Step 6d.** Discover available agents, assign tasks by best fit, then spawn workers.
96
+
97
+ Agent discovery and assignment rule:
98
+ - Read `.agents/agents/*.md` and use each agent's `description` and `## Abilities` to understand specialization.
99
+ - For each task ID, choose the best-fit agent based on task domain (backend, frontend, infra, testing, etc.).
100
+ - Prefer specialized agents when available; use `basic-engineer` as fallback only.
101
+ - Only spawn agents that have assigned task IDs.
102
+
103
+ REQUIRED assignment algorithm (do not skip):
104
+ 1. Build candidate list from `.agents/agents/*.md` excluding `devops-manager`.
105
+ 2. Classify each task by domain using task text (api/backend, ui/frontend, infra/devops, testing/qa).
106
+ 3. For each task, score every candidate agent:
107
+ - +3 if agent description explicitly matches domain
108
+ - +2 if agent `## Abilities` include domain-relevant skills
109
+ - +1 if prior tasks of same domain already assigned to that agent (cohesion)
110
+ 4. Assign task to highest-score agent.
111
+ 5. Use `basic-engineer` ONLY when no specialized agent has positive score.
112
+ 6. If all tasks go to `basic-engineer`, you MUST explain why no specialist matched.
113
+
114
+ HARD RULES:
115
+ - NEVER assign a task to `basic-engineer` if a specialized agent has higher score.
116
+ - NEVER skip agent discovery from `.agents/agents/*.md`.
117
+ - ALWAYS include assignment rationale in spawn prompt: "Selected because <domain match>".
118
+
119
+ Skill loading is worker-driven:
120
+ - The spawned agent MUST load `@ob-global` first.
121
+ - Then it MUST load skills from its own `## Abilities` for the claimed task domain.
103
122
 
104
123
  Each team_spawn MUST include the agent field (required, causes NOT NULL error if omitted).
105
124
 
106
125
  The spawn prompt must contain exactly:
107
126
  1. Their name and role on this team
108
127
  2. Which tasks are theirs, list the task IDs and content from the board
128
+ 2.1 Why they were selected for those tasks (domain/abilities match)
109
129
  3. Key context they need (summarized from context files, do NOT tell them to read files themselves)
110
130
  4. The 6 OpenCode tools they have available (these are OpenCode tools, NOT shell commands, call them directly as tools, never via bash):
111
131
  team_claim, team_tasks_complete, team_tasks_list, team_tasks_add, team_message, team_broadcast
@@ -115,21 +135,18 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
115
135
  Keep spawn prompts under 600 tokens. Do not describe team internals or how ensemble works.
116
136
  Only spawn agents whose tasks are actually needed by this change. Skip agents with no tasks.
117
137
 
118
- First spawn all agents (wait for each team_spawn to confirm before the next):
138
+ Spawn one or more best-fit workers (parallel when dependencies allow):
119
139
  ```
120
- team_spawn name:"back" agent:"back-engineer" prompt:"..."
121
- (wait for result)
122
- team_spawn name:"front" agent:"front-engineer" prompt:"..."
123
- (wait for result)
124
- team_spawn name:"infra" agent:"infra-engineer" prompt:"..."
125
- (wait for result)
140
+ team_spawn name:"eng-1" agent:"backend-engineer" prompt:"..."
141
+ team_spawn name:"eng-2" agent:"frontend-engineer" prompt:"..."
142
+ team_spawn name:"eng-3" agent:"basic-engineer" prompt:"..."
126
143
  ```
127
144
 
128
- Then immediately send each spawned agent a start message to kick them off:
145
+ Then immediately send each spawned worker a start message with exact task IDs:
129
146
  ```
130
- team_message to:"back" text:"Start now. Read all skills listed in your prompt first, confirm loaded skills, then claim your first task with team_claim."
131
- team_message to:"front" text:"Start now. Read all skills listed in your prompt first, confirm loaded skills, then claim your first task with team_claim."
132
- team_message to:"infra" text:"Start now. Read all skills listed in your prompt first, confirm loaded skills, then claim your first task with team_claim."
147
+ team_message to:"eng-1" text:"Start now. Load @ob-global first, then use your agent `## Abilities` for these tasks: [task-<id1>] ... Claim each task ID before starting."
148
+ team_message to:"eng-2" text:"Start now. Load @ob-global first, then use your agent `## Abilities` for these tasks: [task-<id2>] ... Claim each task ID before starting."
149
+ team_message to:"eng-3" text:"Start now. Load @ob-global first, then use your agent `## Abilities` for these tasks: [task-<id3>] ... Claim each task ID before starting."
133
150
  ```
134
151
 
135
152
  **Step 6e.** After sending start messages, tell the user what is running, then STOP and wait.
@@ -141,18 +158,18 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
141
158
  If team_merge blocks ("overlapping local changes"), commit or stash your local changes first, then retry.
142
159
  Fix any other blockers reported.
143
160
 
144
- 7. **Quality check**
161
+ 7. **Verification check**
145
162
 
146
- Spawn quality engineer with worktree:false (read-only, no file edits):
147
- ```
148
- team_spawn name:"quality" agent:"quality-engineer" worktree:false prompt:"<verification scope, context summary, run tests + build + lint + verify acceptance criteria, no task claiming required in this phase, send results to lead when done>"
149
- ```
150
- Wait for messageteam_results → fix blockers → team_shutdown (no team_merge needed, worktree:false)
163
+ Run verification tasks (tests/build/lint) using a worker suited for verification scope:
164
+ - either same engineer workers
165
+ - or a dedicated verifier worker if your project defines one
166
+
167
+ Wait for results → fix blockers.
151
168
 
152
169
  8. **Mark tasks complete in openspec**
153
170
 
154
171
  Update tasks.md: `- [ ]` → `- [x]` for each completed task.
155
- Run `rtk openspec status --change "<name>" --json` to confirm.
172
+ Run `openspec status --change "<name>" --json` to confirm.
156
173
 
157
174
  9. **Show status, then cleanup**
158
175
 
@@ -175,10 +192,10 @@ Implement tasks from an OpenSpec change using the ensemble agent team.
175
192
  - ALWAYS pass the task IDs returned by team_tasks_add to each agent's spawn prompt
176
193
  - NEVER edit files between team_spawn and team_merge, team_merge blocks on overlapping local changes
177
194
  - ALWAYS add every task to the board with team_tasks_add before spawning
178
- - ALWAYS spawn agents sequentially (wait for each team_spawn result before the next), then send start messages to all of them together
195
+ - ALWAYS spawn workers based on dependencies: parallel when safe, sequential when required
179
196
  - ALWAYS instruct agents to call team_claim before each task and team_tasks_complete after
180
197
  - If teammates are stuck, use team_message to resend tasks, then wait, never implement directly
181
- - Mark tasks complete in openspec AFTER specialists finish, not before
198
+ - Mark tasks complete in openspec AFTER worker implementation and verification finish, not before
182
199
  - Pause on errors, blockers, or unclear requirements. Do not guess
183
200
  - Use contextFiles from CLI output, do not assume specific file paths
184
- - Use `rtk` wrapper for ALL CLI commands. Never run openspec, git, gh, or az directly
201
+ - Follow CLI rules from `@ob-global` when present