@bradheitmann/odin-sentinel 0.4.11 → 0.4.13
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/.claude-plugin/marketplace.json +23 -0
- package/README.md +20 -16
- package/dist/src/mcp/server.js +32 -0
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/protocol/repository.d.ts +6 -0
- package/dist/src/protocol/repository.js +12 -2
- package/dist/src/protocol/repository.js.map +1 -1
- package/dist/src/protocol/service.js +17 -9
- package/dist/src/protocol/service.js.map +1 -1
- package/dist/src/protocol/version.d.ts +2 -2
- package/dist/src/protocol/version.js +2 -2
- package/docs/guides/quick-start.md +7 -7
- package/docs/guides/quickstart-prompts.md +4 -4
- package/docs/reference/client-compatibility.md +1 -1
- package/docs/reference/distribution.md +11 -5
- package/docs/reference/public-surface-audit.md +2 -2
- package/package.json +5 -3
- package/plugins/odin-scp/.claude-plugin/plugin.json +25 -0
- package/plugins/odin-scp/README.md +62 -0
- package/plugins/odin-scp/skills/odin-scp/CHANGELOG.md +25 -0
- package/plugins/odin-scp/skills/odin-scp/SKILL.md +1518 -0
- package/plugins/odin-scp/skills/odin-scp/agents/openai.yaml +4 -0
- package/plugins/odin-scp/skills/odin-scp/references/boot-receipt-examples.md +439 -0
- package/plugins/odin-scp/skills/odin-scp/references/canonical-introduction-prompt.md +118 -0
- package/plugins/odin-scp/skills/odin-scp/references/harness-skill-targets.md +56 -0
- package/plugins/odin-scp/skills/odin-scp/references/team-bootstrap-runbook.md +298 -0
- package/plugins/odin-scp/skills/odin-scp/scripts/sync-installations.sh +233 -0
- package/protocol/SCP.md +3 -3
- package/protocol/bootstrap-skill.md +22 -13
- package/protocol/closeout.yaml +1 -1
- package/protocol/delegation.yaml +1 -1
- package/protocol/model-profiles.yaml +2 -2
- package/protocol/receipts/team-manifest.yaml +1 -1
- package/protocol/roles.yaml +1 -1
- package/protocol/skill-references/boot-receipt-examples.md +439 -0
- package/protocol/skill-references/canonical-introduction-prompt.md +118 -0
- package/protocol/skill-references/harness-skill-targets.md +56 -0
- package/protocol/skill-references/team-bootstrap-runbook.md +298 -0
- package/protocol/topology.yaml +1 -1
- package/scripts/audit/public-surface.mjs +32 -3
- package/scripts/audit/verify-pack.mjs +175 -12
- package/templates/team-manifest-template.yaml +6 -6
package/protocol/closeout.yaml
CHANGED
package/protocol/delegation.yaml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
version: 0.4.
|
|
1
|
+
version: 0.4.13
|
|
2
2
|
policy:
|
|
3
3
|
semantics: Recommended starter profiles, not bundled dependencies or availability guarantees.
|
|
4
4
|
runtime_requirement: Users must install and configure their own harnesses. Launchers must verify local harness/model availability before dispatch and apply fallbacks when unavailable.
|
|
@@ -29,7 +29,7 @@ policy:
|
|
|
29
29
|
- mcp_tool_hydration
|
|
30
30
|
- governed_role_ready
|
|
31
31
|
non_governed_one_shot_only: Harnesses without MCP access, native SCP skill, or full injected protocol text must be classified NON_GOVERNED_ONE_SHOT_ONLY and must not hold persistent governed roles.
|
|
32
|
-
scp_skill_install_recommendation: Skill-capable harnesses should install the
|
|
32
|
+
scp_skill_install_recommendation: Skill-capable harnesses should install the odin-scp skill before governed launch; native skill discoverability improved compliance in observed runs.
|
|
33
33
|
harness_capabilities:
|
|
34
34
|
Codex:
|
|
35
35
|
can_hydrate_deferred_mcp_tools_at_boot: true
|
|
@@ -45,6 +45,6 @@ watcher_assignments:
|
|
|
45
45
|
- heartbeat_ledger
|
|
46
46
|
minimum_compatible_mcp_version: 0.4.5
|
|
47
47
|
scp_context_sources:
|
|
48
|
-
- native
|
|
48
|
+
- native odin-scp skill
|
|
49
49
|
- odin-sentinel MCP at or above minimum version
|
|
50
50
|
- full injected SCP protocol text
|
package/protocol/roles.yaml
CHANGED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
# SCP Boot Receipt Examples
|
|
2
|
+
|
|
3
|
+
Use these as patterns. Replace placeholder values with live command output.
|
|
4
|
+
|
|
5
|
+
## Minimal Bootstrap Receipt
|
|
6
|
+
|
|
7
|
+
Use this only for initial pane readiness and parking. It is not enough to activate work, mutate files, perform QA, commit, push, or claim closure.
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
SCP_MIN_BOOT_RECEIPT:
|
|
11
|
+
agent_id: c-dev-1
|
|
12
|
+
team: C
|
|
13
|
+
role: DEV WORKER
|
|
14
|
+
reports_to: C/TEAM-PM
|
|
15
|
+
cwd: <pwd or EXEC PM supplied>
|
|
16
|
+
branch: <branch or EXEC PM supplied>
|
|
17
|
+
head_sha: <sha or EXEC PM supplied>
|
|
18
|
+
may_implement: false
|
|
19
|
+
may_qa_accept: false
|
|
20
|
+
permission_mode: READ_ONLY
|
|
21
|
+
current_state: BOOTSTRAPPED_IDLE
|
|
22
|
+
terminal_locator:
|
|
23
|
+
terminal_app: cmux
|
|
24
|
+
terminal_adapter: cmux
|
|
25
|
+
workspace_ref: <workspace:1>
|
|
26
|
+
workspace_id: <uuid-or-unavailable>
|
|
27
|
+
window_ref: <window-or-unavailable>
|
|
28
|
+
window_id: <uuid-or-unavailable>
|
|
29
|
+
pane_ref: <pane>
|
|
30
|
+
pane_id: <uuid-or-unavailable>
|
|
31
|
+
surface_ref: <surface>
|
|
32
|
+
surface_id: <uuid-or-unavailable>
|
|
33
|
+
tab_ref: <tab-or-unavailable>
|
|
34
|
+
tab_id: <uuid-or-unavailable>
|
|
35
|
+
surface_type: terminal
|
|
36
|
+
title: C/DEV-1
|
|
37
|
+
route_command: cmux send --workspace <workspace> --surface <surface>
|
|
38
|
+
locator_source: EXEC PM supplied from cmux --json --id-format both
|
|
39
|
+
locator_captured_at: <ISO-8601 timestamp>
|
|
40
|
+
target_sha_or_base: <declared base>
|
|
41
|
+
proof_source: EXEC PM supplied branch/SHA/cwd/locator plus pane role acknowledgment
|
|
42
|
+
next_expected_receipt: SCP_BOOT_RECEIPT before activation
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## EXEC PM
|
|
46
|
+
|
|
47
|
+
```yaml
|
|
48
|
+
SCP_BOOT_RECEIPT:
|
|
49
|
+
agent_id: a-exec-pm
|
|
50
|
+
terminal_locator:
|
|
51
|
+
terminal_app: cmux
|
|
52
|
+
terminal_adapter: cmux
|
|
53
|
+
workspace_ref: <workspace:1>
|
|
54
|
+
workspace_id: <uuid>
|
|
55
|
+
window_ref: <window:1>
|
|
56
|
+
window_id: <uuid>
|
|
57
|
+
pane_ref: <pane:47>
|
|
58
|
+
pane_id: <uuid>
|
|
59
|
+
surface_ref: <surface:40>
|
|
60
|
+
surface_id: <uuid>
|
|
61
|
+
tab_ref: <tab:40>
|
|
62
|
+
tab_id: <uuid>
|
|
63
|
+
surface_type: terminal
|
|
64
|
+
title: A/EXEC-PM
|
|
65
|
+
route_command: cmux send --workspace <workspace> --surface <surface>
|
|
66
|
+
locator_source: cmux --json --id-format both identify
|
|
67
|
+
locator_captured_at: <ISO-8601 timestamp>
|
|
68
|
+
vt_state_snapshot:
|
|
69
|
+
vt_provider: unavailable
|
|
70
|
+
vt_api_stability: unknown
|
|
71
|
+
terminal_instance_ref: unavailable
|
|
72
|
+
terminal_instance_id: unavailable
|
|
73
|
+
pty_ref: unavailable
|
|
74
|
+
capture_source: cmux read-screen
|
|
75
|
+
formatter_format: plain
|
|
76
|
+
rows: unavailable
|
|
77
|
+
cols: unavailable
|
|
78
|
+
total_rows: unavailable
|
|
79
|
+
scrollback_rows: unavailable
|
|
80
|
+
width_px: unavailable
|
|
81
|
+
height_px: unavailable
|
|
82
|
+
active_screen: unavailable
|
|
83
|
+
cursor_x: unavailable
|
|
84
|
+
cursor_y: unavailable
|
|
85
|
+
cursor_visible: unavailable
|
|
86
|
+
cursor_pending_wrap: unavailable
|
|
87
|
+
title: A/EXEC-PM
|
|
88
|
+
pwd: unavailable
|
|
89
|
+
render_dirty: unavailable
|
|
90
|
+
semantic_prompt_observed: unavailable
|
|
91
|
+
semantic_input_observed: unavailable
|
|
92
|
+
semantic_output_observed: unavailable
|
|
93
|
+
paste_safety_checked: unavailable
|
|
94
|
+
paste_safe: unavailable
|
|
95
|
+
key_encoding_provider: unavailable
|
|
96
|
+
mouse_encoding_provider: unavailable
|
|
97
|
+
focus_encoding_provider: unavailable
|
|
98
|
+
snapshot_captured_at: <ISO-8601 timestamp>
|
|
99
|
+
team: A
|
|
100
|
+
role: EXEC PM
|
|
101
|
+
authority_layer: executive
|
|
102
|
+
model_harness: <model>/<harness>
|
|
103
|
+
cost_tier: high_reasoning
|
|
104
|
+
capability_profile: orchestration, authorization, branch-visible claim framing
|
|
105
|
+
cwd: <pwd>
|
|
106
|
+
branch: <git branch --show-current>
|
|
107
|
+
upstream: <git rev-parse --abbrev-ref --symbolic-full-name @{u}>
|
|
108
|
+
head_sha: <git rev-parse HEAD>
|
|
109
|
+
target_sha_or_base: <declared base>
|
|
110
|
+
may_implement: false
|
|
111
|
+
may_qa_accept: false
|
|
112
|
+
delegates_to: [EXEC ASST, EXEC RSCH, EXEC QA, TEAM PM, TEAM SENTINEL]
|
|
113
|
+
reports_to: human operator
|
|
114
|
+
worker_exception_authority: human operator only
|
|
115
|
+
write_scope: governance/control artifacts explicitly assigned
|
|
116
|
+
read_scope: active repo, evidence, panes, handoffs
|
|
117
|
+
prohibited_paths: product source, runtime mutation, holdout, secrets, design unless authorized
|
|
118
|
+
evidence_path: <control evidence or handoff path>
|
|
119
|
+
terminal_state_vocabulary: READINESS_ONLY, FROZEN, QUARANTINED, DEV_COMPLETE_QA_PENDING
|
|
120
|
+
proof_source: pwd; git status; git rev-parse HEAD @{u}
|
|
121
|
+
permission_mode: <declared mode>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## TEAM PM
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
SCP_BOOT_RECEIPT:
|
|
128
|
+
agent_id: c-team-pm
|
|
129
|
+
terminal_locator:
|
|
130
|
+
terminal_app: cmux
|
|
131
|
+
terminal_adapter: cmux
|
|
132
|
+
workspace_ref: <workspace:1>
|
|
133
|
+
workspace_id: <uuid>
|
|
134
|
+
window_ref: <window:1>
|
|
135
|
+
window_id: <uuid>
|
|
136
|
+
pane_ref: <pane>
|
|
137
|
+
pane_id: <uuid>
|
|
138
|
+
surface_ref: <surface>
|
|
139
|
+
surface_id: <uuid>
|
|
140
|
+
tab_ref: <tab>
|
|
141
|
+
tab_id: <uuid>
|
|
142
|
+
surface_type: terminal
|
|
143
|
+
title: C/TEAM-PM
|
|
144
|
+
route_command: cmux send --workspace <workspace> --surface <surface>
|
|
145
|
+
locator_source: EXEC PM supplied from cmux --json --id-format both
|
|
146
|
+
locator_captured_at: <ISO-8601 timestamp>
|
|
147
|
+
vt_state_snapshot:
|
|
148
|
+
vt_provider: unavailable
|
|
149
|
+
vt_api_stability: unknown
|
|
150
|
+
terminal_instance_ref: unavailable
|
|
151
|
+
terminal_instance_id: unavailable
|
|
152
|
+
pty_ref: unavailable
|
|
153
|
+
capture_source: cmux read-screen
|
|
154
|
+
formatter_format: plain
|
|
155
|
+
rows: unavailable
|
|
156
|
+
cols: unavailable
|
|
157
|
+
total_rows: unavailable
|
|
158
|
+
scrollback_rows: unavailable
|
|
159
|
+
width_px: unavailable
|
|
160
|
+
height_px: unavailable
|
|
161
|
+
active_screen: unavailable
|
|
162
|
+
cursor_x: unavailable
|
|
163
|
+
cursor_y: unavailable
|
|
164
|
+
cursor_visible: unavailable
|
|
165
|
+
cursor_pending_wrap: unavailable
|
|
166
|
+
title: C/TEAM-PM
|
|
167
|
+
pwd: unavailable
|
|
168
|
+
render_dirty: unavailable
|
|
169
|
+
semantic_prompt_observed: unavailable
|
|
170
|
+
semantic_input_observed: unavailable
|
|
171
|
+
semantic_output_observed: unavailable
|
|
172
|
+
paste_safety_checked: unavailable
|
|
173
|
+
paste_safe: unavailable
|
|
174
|
+
key_encoding_provider: unavailable
|
|
175
|
+
mouse_encoding_provider: unavailable
|
|
176
|
+
focus_encoding_provider: unavailable
|
|
177
|
+
snapshot_captured_at: <ISO-8601 timestamp>
|
|
178
|
+
team: C
|
|
179
|
+
role: TEAM PM
|
|
180
|
+
authority_layer: pod_assignment_owner
|
|
181
|
+
model_harness: <model>/<harness>
|
|
182
|
+
cost_tier: high_reasoning_or_mid_reasoning
|
|
183
|
+
capability_profile: pod routing, worker activation, pod status, escalation
|
|
184
|
+
cwd: <pwd>
|
|
185
|
+
branch: <branch>
|
|
186
|
+
upstream: <upstream>
|
|
187
|
+
head_sha: <sha>
|
|
188
|
+
target_sha_or_base: <declared base>
|
|
189
|
+
may_implement: false
|
|
190
|
+
may_qa_accept: false
|
|
191
|
+
delegates_to: [C/DEV-1, C/QA-1, C/SHADOW-1]
|
|
192
|
+
reports_to: EXEC PM
|
|
193
|
+
worker_exception_authority: human operator or EXEC PM with branch-visible exception record
|
|
194
|
+
write_scope: pod ledger, prompts, pod handoff only
|
|
195
|
+
read_scope: assigned pod panes, assigned artifacts, validators
|
|
196
|
+
prohibited_paths: worker deliverables, product source, QA acceptance artifacts unless assigned
|
|
197
|
+
evidence_path: <pod ledger or handoff>
|
|
198
|
+
terminal_state_vocabulary: BOOTSTRAPPED_IDLE, READINESS_ONLY, FROZEN, QUARANTINED
|
|
199
|
+
proof_source: pwd; git status; git rev-parse HEAD @{u}; cmux read-screen
|
|
200
|
+
permission_mode: <declared mode>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## TEAM SENTINEL
|
|
204
|
+
|
|
205
|
+
```yaml
|
|
206
|
+
SCP_BOOT_RECEIPT:
|
|
207
|
+
agent_id: c-team-sentinel
|
|
208
|
+
terminal_locator:
|
|
209
|
+
terminal_app: cmux
|
|
210
|
+
terminal_adapter: cmux
|
|
211
|
+
workspace_ref: <workspace:1>
|
|
212
|
+
workspace_id: <uuid>
|
|
213
|
+
window_ref: <window:1>
|
|
214
|
+
window_id: <uuid>
|
|
215
|
+
pane_ref: <pane>
|
|
216
|
+
pane_id: <uuid>
|
|
217
|
+
surface_ref: <surface>
|
|
218
|
+
surface_id: <uuid>
|
|
219
|
+
tab_ref: <tab>
|
|
220
|
+
tab_id: <uuid>
|
|
221
|
+
surface_type: terminal
|
|
222
|
+
title: C/TEAM-SENTINEL
|
|
223
|
+
route_command: cmux send --workspace <workspace> --surface <surface>
|
|
224
|
+
locator_source: cmux --json --id-format both identify
|
|
225
|
+
locator_captured_at: <ISO-8601 timestamp>
|
|
226
|
+
vt_state_snapshot:
|
|
227
|
+
vt_provider: unavailable
|
|
228
|
+
vt_api_stability: unknown
|
|
229
|
+
terminal_instance_ref: unavailable
|
|
230
|
+
terminal_instance_id: unavailable
|
|
231
|
+
pty_ref: unavailable
|
|
232
|
+
capture_source: cmux read-screen
|
|
233
|
+
formatter_format: plain
|
|
234
|
+
rows: unavailable
|
|
235
|
+
cols: unavailable
|
|
236
|
+
total_rows: unavailable
|
|
237
|
+
scrollback_rows: unavailable
|
|
238
|
+
width_px: unavailable
|
|
239
|
+
height_px: unavailable
|
|
240
|
+
active_screen: unavailable
|
|
241
|
+
cursor_x: unavailable
|
|
242
|
+
cursor_y: unavailable
|
|
243
|
+
cursor_visible: unavailable
|
|
244
|
+
cursor_pending_wrap: unavailable
|
|
245
|
+
title: C/TEAM-SENTINEL
|
|
246
|
+
pwd: unavailable
|
|
247
|
+
render_dirty: unavailable
|
|
248
|
+
semantic_prompt_observed: unavailable
|
|
249
|
+
semantic_input_observed: unavailable
|
|
250
|
+
semantic_output_observed: unavailable
|
|
251
|
+
paste_safety_checked: unavailable
|
|
252
|
+
paste_safe: unavailable
|
|
253
|
+
key_encoding_provider: unavailable
|
|
254
|
+
mouse_encoding_provider: unavailable
|
|
255
|
+
focus_encoding_provider: unavailable
|
|
256
|
+
snapshot_captured_at: <ISO-8601 timestamp>
|
|
257
|
+
team: C
|
|
258
|
+
role: TEAM SENTINEL
|
|
259
|
+
authority_layer: team_control_lead
|
|
260
|
+
model_harness: <model>/<harness>
|
|
261
|
+
cost_tier: high_reasoning
|
|
262
|
+
capability_profile: watchdog control, polling, intervention, scope control
|
|
263
|
+
cwd: <pwd>
|
|
264
|
+
branch: <branch>
|
|
265
|
+
upstream: <upstream>
|
|
266
|
+
head_sha: <sha>
|
|
267
|
+
target_sha_or_base: <declared base>
|
|
268
|
+
may_implement: false
|
|
269
|
+
may_qa_accept: false
|
|
270
|
+
delegates_to: [C/TEAM-PM, C/DEV-1, C/QA-1, C/SHADOW-1]
|
|
271
|
+
reports_to: EXEC PM
|
|
272
|
+
coordination_note: C/TEAM-PM owns normal worker activation; TEAM SENTINEL may relay corrective prompts and freeze unsafe lanes.
|
|
273
|
+
worker_exception_authority: human operator or EXEC PM with branch-visible exception record
|
|
274
|
+
write_scope: control ledger, prompts, lane handoff only
|
|
275
|
+
read_scope: assigned pod panes, assigned artifacts, validators
|
|
276
|
+
prohibited_paths: worker deliverables, product source, QA acceptance artifacts unless assigned
|
|
277
|
+
evidence_path: <lane ledger or handoff>
|
|
278
|
+
terminal_state_vocabulary: READINESS_ONLY, FROZEN, QUARANTINED
|
|
279
|
+
proof_source: pwd; git status; git rev-parse HEAD @{u}; cmux read-screen
|
|
280
|
+
permission_mode: <declared mode>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## DEV WORKER
|
|
284
|
+
|
|
285
|
+
```yaml
|
|
286
|
+
SCP_BOOT_RECEIPT:
|
|
287
|
+
agent_id: c-dev-1
|
|
288
|
+
terminal_locator:
|
|
289
|
+
terminal_app: tmux
|
|
290
|
+
terminal_adapter: tmux
|
|
291
|
+
workspace_ref: <session-name>
|
|
292
|
+
workspace_id: unavailable
|
|
293
|
+
window_ref: <window-index-or-name>
|
|
294
|
+
window_id: <window-id-or-unavailable>
|
|
295
|
+
pane_ref: <%pane-id>
|
|
296
|
+
pane_id: <%pane-id>
|
|
297
|
+
surface_ref: <%pane-id>
|
|
298
|
+
surface_id: unavailable
|
|
299
|
+
tab_ref: unavailable
|
|
300
|
+
tab_id: unavailable
|
|
301
|
+
surface_type: terminal
|
|
302
|
+
title: C/DEV-1
|
|
303
|
+
route_command: tmux send-keys -t <session:window.%pane> '<message>' Enter
|
|
304
|
+
locator_source: tmux display-message -p
|
|
305
|
+
locator_captured_at: <ISO-8601 timestamp>
|
|
306
|
+
vt_state_snapshot:
|
|
307
|
+
vt_provider: terminal-capture
|
|
308
|
+
vt_api_stability: unknown
|
|
309
|
+
terminal_instance_ref: unavailable
|
|
310
|
+
terminal_instance_id: unavailable
|
|
311
|
+
pty_ref: <tty or unavailable>
|
|
312
|
+
capture_source: tmux capture-pane
|
|
313
|
+
formatter_format: plain
|
|
314
|
+
rows: <tmux pane_height or unavailable>
|
|
315
|
+
cols: <tmux pane_width or unavailable>
|
|
316
|
+
total_rows: unavailable
|
|
317
|
+
scrollback_rows: unavailable
|
|
318
|
+
width_px: unavailable
|
|
319
|
+
height_px: unavailable
|
|
320
|
+
active_screen: unavailable
|
|
321
|
+
cursor_x: unavailable
|
|
322
|
+
cursor_y: unavailable
|
|
323
|
+
cursor_visible: unavailable
|
|
324
|
+
cursor_pending_wrap: unavailable
|
|
325
|
+
title: C/DEV-1
|
|
326
|
+
pwd: <pane_current_path or unavailable>
|
|
327
|
+
render_dirty: unavailable
|
|
328
|
+
semantic_prompt_observed: unavailable
|
|
329
|
+
semantic_input_observed: unavailable
|
|
330
|
+
semantic_output_observed: unavailable
|
|
331
|
+
paste_safety_checked: false
|
|
332
|
+
paste_safe: unavailable
|
|
333
|
+
key_encoding_provider: terminal
|
|
334
|
+
mouse_encoding_provider: terminal
|
|
335
|
+
focus_encoding_provider: terminal
|
|
336
|
+
snapshot_captured_at: <ISO-8601 timestamp>
|
|
337
|
+
team: C
|
|
338
|
+
role: DEV WORKER
|
|
339
|
+
authority_layer: worker
|
|
340
|
+
model_harness: <model>/<harness>
|
|
341
|
+
cost_tier: bounded_execution
|
|
342
|
+
capability_profile: implementation inside exact write scope, evidence capture
|
|
343
|
+
cwd: <pwd>
|
|
344
|
+
branch: <branch>
|
|
345
|
+
upstream: <upstream>
|
|
346
|
+
head_sha: <sha>
|
|
347
|
+
target_sha_or_base: <declared base>
|
|
348
|
+
may_implement: true
|
|
349
|
+
may_qa_accept: false
|
|
350
|
+
delegates_to: []
|
|
351
|
+
reports_to: C/TEAM-SENTINEL
|
|
352
|
+
worker_exception_authority: not_applicable
|
|
353
|
+
write_scope: <exact files or directories from slice>
|
|
354
|
+
read_scope: <required reading list>
|
|
355
|
+
prohibited_paths: outside write scope, holdout, secrets, unrelated design/runtime
|
|
356
|
+
evidence_path: <dev evidence path declared by dispatch>
|
|
357
|
+
terminal_state_vocabulary: DEV_COMPLETE_QA_PENDING, BLOCKED_BY_LIMIT, FROZEN
|
|
358
|
+
proof_source: assigned slice; pwd; git status; validators
|
|
359
|
+
permission_mode: <declared mode>
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## QA WORKER
|
|
363
|
+
|
|
364
|
+
```yaml
|
|
365
|
+
SCP_BOOT_RECEIPT:
|
|
366
|
+
agent_id: c-qa-1
|
|
367
|
+
terminal_locator:
|
|
368
|
+
terminal_app: unknown
|
|
369
|
+
terminal_adapter: unavailable
|
|
370
|
+
workspace_ref: unavailable
|
|
371
|
+
workspace_id: unavailable
|
|
372
|
+
window_ref: unavailable
|
|
373
|
+
window_id: unavailable
|
|
374
|
+
pane_ref: unavailable
|
|
375
|
+
pane_id: unavailable
|
|
376
|
+
surface_ref: unavailable
|
|
377
|
+
surface_id: unavailable
|
|
378
|
+
tab_ref: unavailable
|
|
379
|
+
tab_id: unavailable
|
|
380
|
+
surface_type: unknown
|
|
381
|
+
title: C/QA-1
|
|
382
|
+
route_command: unavailable
|
|
383
|
+
locator_source: self-reported; not independently verified
|
|
384
|
+
locator_captured_at: unavailable
|
|
385
|
+
vt_state_snapshot:
|
|
386
|
+
vt_provider: unavailable
|
|
387
|
+
vt_api_stability: unknown
|
|
388
|
+
terminal_instance_ref: unavailable
|
|
389
|
+
terminal_instance_id: unavailable
|
|
390
|
+
pty_ref: unavailable
|
|
391
|
+
capture_source: unavailable
|
|
392
|
+
formatter_format: unavailable
|
|
393
|
+
rows: unavailable
|
|
394
|
+
cols: unavailable
|
|
395
|
+
total_rows: unavailable
|
|
396
|
+
scrollback_rows: unavailable
|
|
397
|
+
width_px: unavailable
|
|
398
|
+
height_px: unavailable
|
|
399
|
+
active_screen: unavailable
|
|
400
|
+
cursor_x: unavailable
|
|
401
|
+
cursor_y: unavailable
|
|
402
|
+
cursor_visible: unavailable
|
|
403
|
+
cursor_pending_wrap: unavailable
|
|
404
|
+
title: C/QA-1
|
|
405
|
+
pwd: unavailable
|
|
406
|
+
render_dirty: unavailable
|
|
407
|
+
semantic_prompt_observed: unavailable
|
|
408
|
+
semantic_input_observed: unavailable
|
|
409
|
+
semantic_output_observed: unavailable
|
|
410
|
+
paste_safety_checked: unavailable
|
|
411
|
+
paste_safe: unavailable
|
|
412
|
+
key_encoding_provider: unavailable
|
|
413
|
+
mouse_encoding_provider: unavailable
|
|
414
|
+
focus_encoding_provider: unavailable
|
|
415
|
+
snapshot_captured_at: unavailable
|
|
416
|
+
team: C
|
|
417
|
+
role: QA WORKER
|
|
418
|
+
authority_layer: worker
|
|
419
|
+
model_harness: <model>/<harness>
|
|
420
|
+
cost_tier: bounded_review
|
|
421
|
+
capability_profile: adversarial qa-review, evidence authenticity, independent gates
|
|
422
|
+
cwd: <pwd>
|
|
423
|
+
branch: <branch>
|
|
424
|
+
upstream: <upstream>
|
|
425
|
+
head_sha: <sha>
|
|
426
|
+
target_sha_or_base: <dev commit or evidence base>
|
|
427
|
+
may_implement: false
|
|
428
|
+
may_qa_accept: true
|
|
429
|
+
delegates_to: []
|
|
430
|
+
reports_to: C/TEAM-SENTINEL or EXEC QA
|
|
431
|
+
worker_exception_authority: not_applicable
|
|
432
|
+
write_scope: QA report/evidence paths only
|
|
433
|
+
read_scope: DEV evidence, changed files, validators, slice contract
|
|
434
|
+
prohibited_paths: product implementation, own lifecycle closure, hidden holdout, secrets
|
|
435
|
+
evidence_path: <qa evidence path declared by dispatch>
|
|
436
|
+
terminal_state_vocabulary: QA_INCOMPLETE, FROZEN, ACCEPT, REJECT
|
|
437
|
+
proof_source: qa-review; independent validator commands; git status
|
|
438
|
+
permission_mode: <declared mode>
|
|
439
|
+
```
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Canonical SCP v3.5 Introduction Prompt For `EXEC PM`
|
|
2
|
+
|
|
3
|
+
Use this prompt to introduce SCP to the `EXEC PM` pane in any repository. It is intentionally explicit because the dangerous failures are premature activation, narrative closure, role blurring, stale QA, hidden capacity, and unsupported harness assumptions.
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
EXEC PM - SCP v3.5 generic policy introduction, repo preflight, adoption-gate bootstrap, and controlled dissemination.
|
|
7
|
+
|
|
8
|
+
You are the repo-capable pre-activation executive PM for this task. This is not an activation order unless the user explicitly says SCP is active. This is a governance-package landing, verification, and startup-planning task.
|
|
9
|
+
|
|
10
|
+
Use the `odin-scp` skill if available. Also read local project authority files when present:
|
|
11
|
+
- AGENTS.md
|
|
12
|
+
- CLAUDE.md
|
|
13
|
+
- config/constitutional/constitutional-agent.md
|
|
14
|
+
- project-local governance or constitution files declared by the repository
|
|
15
|
+
- .odin/handoffs/
|
|
16
|
+
- .odin/audit/
|
|
17
|
+
|
|
18
|
+
Authority boundary:
|
|
19
|
+
- SCP is not active until adoption/startup gates are branch-visible or explicitly acknowledged, adversarial QA accepts any governance/package mutation, and the user authority explicitly declares activation or asks you to operate under SCP.
|
|
20
|
+
- Until activation, the user's active directives, AGENTS.md, project-local lifecycle/governance rules, and task-specific scope remain controlling.
|
|
21
|
+
- Do not announce transition. Do not instruct panes to switch behavior under SCP until activation authority is explicit.
|
|
22
|
+
- Do not run a pilot wave unless the user explicitly asks for execution.
|
|
23
|
+
|
|
24
|
+
Hard no:
|
|
25
|
+
- No product code edits unless separately authorized.
|
|
26
|
+
- No lifecycle closure based only on SCP narration.
|
|
27
|
+
- No bare completion language. Use observed, branch-visible, QA-accepted, blocked, or pending labels.
|
|
28
|
+
- No self-acceptance. Governance or package changes require adversarial QA before adoption can clear.
|
|
29
|
+
- No secret output. Do not print tokens, API keys, OAuth tokens, or config secret values.
|
|
30
|
+
- No hidden subagents or off-ledger workers while SCP is active.
|
|
31
|
+
|
|
32
|
+
Core objective:
|
|
33
|
+
Load SCP v3.5, discover repo state and handoffs, bootstrap the executive office plus the requested number of development pods, and stop before product execution unless the user explicitly gave an execution task.
|
|
34
|
+
|
|
35
|
+
Phase 0 - live preflight:
|
|
36
|
+
1. Confirm current repo and worktree:
|
|
37
|
+
- pwd
|
|
38
|
+
- git status --short --branch --untracked-files=all
|
|
39
|
+
- git branch --show-current
|
|
40
|
+
- git rev-parse HEAD
|
|
41
|
+
- git rev-parse @{u}, if upstream exists
|
|
42
|
+
2. Discover handoffs and audit state:
|
|
43
|
+
- .odin/handoffs/
|
|
44
|
+
- .odin/audit/
|
|
45
|
+
3. If no handoff exists, treat the repo as a fresh SCP bootstrap.
|
|
46
|
+
4. Record exact assumptions before creating teams.
|
|
47
|
+
|
|
48
|
+
Phase 1 - default startup topology:
|
|
49
|
+
1. Unless the user says otherwise, create the executive office and one development pod.
|
|
50
|
+
2. If the user says "spin up N dev pods", create the executive office and N development pods.
|
|
51
|
+
3. Required executive office roles:
|
|
52
|
+
- A/EXEC-PM
|
|
53
|
+
- A/EXEC-ODIN
|
|
54
|
+
- A/EXEC-ASST
|
|
55
|
+
- A/EXEC-RSCH
|
|
56
|
+
- A/EXEC-QA
|
|
57
|
+
4. Required development pod roles per pod:
|
|
58
|
+
- <TEAM>/TEAM-PM
|
|
59
|
+
- <TEAM>/ODIN
|
|
60
|
+
- <TEAM>/DEV-1
|
|
61
|
+
- <TEAM>/QA-1
|
|
62
|
+
- <TEAM>/SHADOW-1
|
|
63
|
+
|
|
64
|
+
Phase 2 - default model/harness profile:
|
|
65
|
+
Use exact model names when available. When a named family version is unavailable, use the latest available same-family model and record the substitution.
|
|
66
|
+
|
|
67
|
+
- A/EXEC-PM: Codex CLI, GPT-5.5, high reasoning.
|
|
68
|
+
- A/EXEC-ODIN: Codex CLI, GPT-5.5, xhigh/max-equivalent reasoning.
|
|
69
|
+
- A/EXEC-ASST: Claude Code, latest available Claude Haiku.
|
|
70
|
+
- A/EXEC-RSCH: Droid, Kimi K2.6, high reasoning.
|
|
71
|
+
- A/EXEC-QA: Droid, Kimi K2.6, high reasoning.
|
|
72
|
+
- <TEAM>/TEAM-PM: Claude Code, Claude Opus 4.7 or latest available Opus, high reasoning when supported.
|
|
73
|
+
- <TEAM>/ODIN: Codex CLI, GPT-5.5, low reasoning.
|
|
74
|
+
- <TEAM>/DEV-1: Droid, Kimi K2.6, high reasoning.
|
|
75
|
+
- <TEAM>/QA-1: Crush, GLM-5.1, high reasoning.
|
|
76
|
+
- <TEAM>/SHADOW-1: Droid, Kimi K2.6, high reasoning.
|
|
77
|
+
|
|
78
|
+
Fallback:
|
|
79
|
+
- If Crush fails for a worker-style role, try Droid.
|
|
80
|
+
- If Crush and Droid both fail, use Claude Code with Claude Sonnet 4.6 or latest available Sonnet.
|
|
81
|
+
- Record every substitution in the team manifest and boot receipt.
|
|
82
|
+
|
|
83
|
+
Phase 3 - role interchangeability contract:
|
|
84
|
+
Record this in the startup artifact and dissemination text:
|
|
85
|
+
- Any supported agent can serve any SCP role when assigned that role and booted with the correct role contract.
|
|
86
|
+
- Role is per-assignment. Harness identity, model family, pane name, or vendor brand does not grant authority.
|
|
87
|
+
- Use generic role names in panes/tabs where possible: `EXEC PM`, `EXEC ODIN`, `EXEC ASST`, `EXEC RSCH`, `EXEC QA`, `TEAM PM`, `TEAM ODIN`, `DEV WORKER`, `QA WORKER`, and `SHADOW REVIEWER`.
|
|
88
|
+
- ODIN roles are meta-control roles accountable to user authority. They coordinate with PM roles but are not PM subordinates.
|
|
89
|
+
- Control-plane roles do not implement worker deliverables, author worker evidence, or perform QA acceptance by default.
|
|
90
|
+
- An agent may not QA and close the same deliverable.
|
|
91
|
+
- Text left in a terminal input bar is not delivery. Terminal delegation requires enter/send plus screen confirmation and later ack observation or follow-up.
|
|
92
|
+
|
|
93
|
+
Phase 4 - receipts:
|
|
94
|
+
1. Create `SCP-TEAM-MANIFEST` before dispatching product work.
|
|
95
|
+
2. Require `SCP_BOOT_RECEIPT` from every role before activation.
|
|
96
|
+
3. Minimal parking receipts may be used during initial setup, but real work requires full receipt.
|
|
97
|
+
4. Control/sentinel panes must emit `[SCP-POLL]`, `[SCP-DELEGATE]`, `[SCP-TERMINAL-DELIVERY]` or `[SCP-CMUX-DELIVERY]`, `[SCP-COORDINATION]`, `[SCP-IDLE]`, `[SCP-FREEZE]`, and `[SCP-FINISH]` receipts as applicable.
|
|
98
|
+
|
|
99
|
+
Phase 5 - ODIN mesh:
|
|
100
|
+
1. At bootstrap, every ODIN sends every other ODIN a short identity and team-composition message.
|
|
101
|
+
2. During active execution, run the default 10-minute ODIN round-robin health/status cadence unless the user changes it.
|
|
102
|
+
3. The executive ODIN compiles the round-robin report and delivers it to EXEC PM after checking for outstanding dispatch/switchboard communications.
|
|
103
|
+
|
|
104
|
+
Phase 6 - closeout:
|
|
105
|
+
`$odin-scp --finish` starts controlled closeout, not product work.
|
|
106
|
+
|
|
107
|
+
Use one of two modes:
|
|
108
|
+
- `PARK_FOR_CONTINUITY`: keep CMUX role slots open, reset/park occupants, and preserve continuity for restart.
|
|
109
|
+
- `FULL_SESSION_SHUTDOWN`: after handoffs and snapshots, quit each live agent occupant with the correct harness/app exit path, verify exit, then close its CMUX surface/pane, leaving only the user-designated final surface.
|
|
110
|
+
|
|
111
|
+
Final report:
|
|
112
|
+
- State branch, HEAD, upstream, clean/dirty status.
|
|
113
|
+
- State handoffs discovered and which one controlled startup.
|
|
114
|
+
- State exact team topology and model/harness substitutions.
|
|
115
|
+
- State startup/activation status.
|
|
116
|
+
- State what was not touched.
|
|
117
|
+
- State what remains pending before product execution.
|
|
118
|
+
```
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# SCP Harness Skill Targets
|
|
2
|
+
|
|
3
|
+
This file records local skill/adapters for SCP policy access. Verify live paths before claiming a harness uses a native skill loader.
|
|
4
|
+
|
|
5
|
+
## Source Of Truth And Sync Policy
|
|
6
|
+
|
|
7
|
+
Master editable source:
|
|
8
|
+
|
|
9
|
+
- `~/.agents/skills/odin-scp/`
|
|
10
|
+
|
|
11
|
+
Runtime copies are synchronized snapshots, not independent policy forks. Edit the master first, then run `scripts/sync-installations.sh` from the master directory to copy the full directory to each native `SKILL.md` target and verify hashes.
|
|
12
|
+
|
|
13
|
+
After every sync, verify all native `SKILL.md` files have the same SHA-256 hash and that adapters mention the current mandatory markers: `SCP_BOOT_RECEIPT`, `SCP-TEAM-MANIFEST`, `[SCP-DELEGATE]`, `[SCP-CMUX-DELIVERY]`, `[SCP-FINISH]`, `$odin-scp --finish`, `HOOK-EXCEPTION`, `BLOCKED_BY_LIMIT`, control-plane non-implementation, self-bootstrap, and post-run hygiene reset.
|
|
14
|
+
|
|
15
|
+
## Native or Apparent SKILL.md Targets
|
|
16
|
+
|
|
17
|
+
Install the `odin-scp` skill directory into:
|
|
18
|
+
|
|
19
|
+
- Codex: `~/.codex/skills/odin-scp`
|
|
20
|
+
- Claude Code: `~/.claude/skills/odin-scp`
|
|
21
|
+
- Shared agent pool: `~/.agents/skills/odin-scp`
|
|
22
|
+
- Goose: `~/.config/goose/skills/odin-scp`
|
|
23
|
+
- KiloCode: `~/.kilocode/skills/odin-scp`
|
|
24
|
+
- Cursor shared skills: `~/.cursor/skills/odin-scp`
|
|
25
|
+
- Cursor-specific skills: `~/.cursor/skills-cursor/odin-scp`
|
|
26
|
+
- OpenHands: `~/.openhands/skills/odin-scp`
|
|
27
|
+
- Pi: `~/.pi/agent/skills/odin-scp`
|
|
28
|
+
|
|
29
|
+
## Adapter Targets
|
|
30
|
+
|
|
31
|
+
These harnesses were present locally but do not expose the same verified native skill directory in the inspected configuration:
|
|
32
|
+
|
|
33
|
+
- OpenCode: install adapter prompt at `~/.config/opencode/skills/odin-scp/SKILL.md` and `~/.opencode/skills/odin-scp/SKILL.md`.
|
|
34
|
+
- Droid: use `--append-system-prompt-file` with the canonical prompt adapter, or paste the Boot Block plus role assignment into the pane.
|
|
35
|
+
- Crush: install a command adapter at `~/.crush/commands/odin-scp.md`.
|
|
36
|
+
- Zed: install a file adapter at `~/.zed/skills/odin-scp/SKILL.md`; Zed/ACP agents can also be started with the canonical prompt pasted into the agent panel.
|
|
37
|
+
|
|
38
|
+
## Fallback Rule
|
|
39
|
+
|
|
40
|
+
If a harness cannot load SKILL.md directly, it is still eligible for any SCP role when the dispatch prompt embeds:
|
|
41
|
+
|
|
42
|
+
1. The active role.
|
|
43
|
+
2. The `SCP_BOOT_RECEIPT`.
|
|
44
|
+
3. `authority_layer`, `may_implement`, `may_qa_accept`, `delegates_to`, `reports_to`, and `worker_exception_authority`.
|
|
45
|
+
4. The exact write scope.
|
|
46
|
+
5. The canonical repo path.
|
|
47
|
+
6. The closure label rules.
|
|
48
|
+
7. The adversarial QA requirement.
|
|
49
|
+
8. Hook/validator exception rules.
|
|
50
|
+
9. Branch-authority preclaim gates.
|
|
51
|
+
10. `[SCP-POLL]`, `[SCP-DELEGATE]`, `[SCP-CMUX-DELIVERY]`, `[SCP-COORDINATION]`, `[SCP-IDLE]`, `[SCP-FREEZE]`, and `[SCP-FINISH]` receipt requirements.
|
|
52
|
+
11. The control-plane non-implementation rule.
|
|
53
|
+
12. The self-bootstrap team lifecycle and `SCP-TEAM-MANIFEST` requirement when one `EXEC PM` pane is asked to create teams.
|
|
54
|
+
13. A pointer to the branch-visible SCP package once adoption is active.
|
|
55
|
+
|
|
56
|
+
Interchangeability means any harness can occupy any role when given the same role contract and proof gates. It does not mean an agent may self-accept, self-close, or ignore separation of duties.
|