sortie-dogs 0.10.5 → 0.10.6
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 +320 -644
- package/dist/asset-version.d.ts +1 -1
- package/dist/asset-version.js +1 -1
- package/dist/core/goal-bound.d.ts +12 -3
- package/dist/core/goal-bound.js +30 -6
- package/dist/core/observed-goal-evidence.d.ts +2 -0
- package/dist/core/observed-goal-evidence.js +4 -1
- package/dist/core/operator-proposal.js +1 -1
- package/dist/core/operator-runtime.d.ts +39 -2
- package/dist/core/operator-runtime.js +132 -22
- package/dist/core/run-flight-ledger.d.ts +22 -7
- package/dist/core/run-flight-ledger.js +90 -25
- package/dist/core/types.d.ts +3 -1
- package/dist/core/validation-budget.d.ts +42 -3
- package/dist/core/validation-budget.js +104 -11
- package/dist/core/worktree-commit-artifact.d.ts +3 -2
- package/dist/core/worktree-commit-artifact.js +358 -344
- package/dist/core/worktree-integration-queue.js +18 -5
- package/dist/core/worktree-parallel-dispatch.d.ts +24 -0
- package/dist/core/worktree-parallel-dispatch.js +68 -21
- package/dist/plugin/config.d.ts +4 -0
- package/dist/plugin/config.js +10 -1
- package/dist/plugin/continuation.js +9 -1
- package/dist/plugin/index.js +173 -31
- package/dist/plugin/model-cost.d.ts +1 -1
- package/dist/plugin/model-cost.js +2 -0
- package/dist/plugin/profiled.d.ts +11 -0
- package/dist/plugin/profiled.js +115 -15
- package/dist/plugin/runtime-bridge.d.ts +4 -0
- package/dist/plugin/sortie-debrief.d.ts +8 -0
- package/dist/plugin/sortie-debrief.js +27 -2
- package/dist/runtime-assets-v010.d.ts +1 -1
- package/dist/runtime-assets-v010.js +70 -34
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,64 +1,20 @@
|
|
|
1
|
-
# Sortie-dogs
|
|
2
|
-
|
|
3
|
-
**A goal-preserving, adaptive execution harness for OpenCode
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
Use OpenCode normally. Invoke Sortie only when you want
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- **
|
|
12
|
-
|
|
13
|
-
- **Coexistence
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
The v0.10.x line is being developed around an **Astra operator / Terra dogs** split. Astra is the
|
|
19
|
-
top-level decision authority that protects the accepted goal, quality bar, escalation decisions,
|
|
20
|
-
and final acceptance. Because Astra is expensive, it should do only the small amount of work that
|
|
21
|
-
requires that level of judgment. Terra-based dogs handle most bounded planning, coordination, and
|
|
22
|
-
execution. The intended result is Astra-level judgment with Terra-level operating cost.
|
|
23
|
-
|
|
24
|
-
This is an architectural direction under active validation, not a demonstrated benchmark result.
|
|
25
|
-
Goal and quality authority remain centralized; implementation volume does not.
|
|
26
|
-
|
|
27
|
-
## Try it
|
|
28
|
-
|
|
29
|
-
Requirements: Node.js 22.6 or newer, npm, and OpenCode.
|
|
30
|
-
Start in your project directory. This block covers all four steps;
|
|
31
|
-
the JSON belongs in the configuration file, and `/sortie` runs inside OpenCode.
|
|
32
|
-
If the configuration already exists, add `sortie-dogs` to its `plugin` array
|
|
33
|
-
while keeping existing entries and settings.
|
|
34
|
-
|
|
35
|
-
```text
|
|
36
|
-
1. Install — run in your terminal
|
|
37
|
-
npm install --save-dev sortie-dogs
|
|
38
|
-
npx sortie-dogs init .
|
|
39
|
-
|
|
40
|
-
2. Add plugin — save or merge into .opencode/opencode.json
|
|
41
|
-
{
|
|
42
|
-
"plugin": ["sortie-dogs"]
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
3. Restart OpenCode
|
|
46
|
-
|
|
47
|
-
4. Start a task — enter in OpenCode
|
|
48
|
-
/sortie <task>
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Project-local setup is recommended. `init` installs runtime assets;
|
|
52
|
-
the plugin entry enables the plugin, including model routing.
|
|
53
|
-
See [configuration details](#configuration) for model selection and other setup options.
|
|
54
|
-
|
|
55
|
-
> **v0.10.x migration:** Give workflow instructions to **`dog-operator`**, not
|
|
56
|
-
> `dog-coordinator`. `dog-operator` is the user-facing authority in v0.10.x;
|
|
57
|
-
> coordinator roles are internal delegates and are not the task entry point.
|
|
58
|
-
|
|
59
|
-
> **Project status: Beta.** v0.10.x is under active stabilization. Runtime
|
|
60
|
-
> behavior, configuration, and runtime assets may still change before 1.0.
|
|
61
|
-
|
|
1
|
+
# Sortie-dogs
|
|
2
|
+
|
|
3
|
+
**A goal-preserving, adaptive execution harness for OpenCode that optimizes cost,
|
|
4
|
+
time, and proof without taking your setup over.**
|
|
5
|
+
|
|
6
|
+
Use OpenCode normally. Invoke Sortie only when you want scoped investigation,
|
|
7
|
+
implementation, validation, review, and model routing.
|
|
8
|
+
|
|
9
|
+
- **Goal invariance**: accepted outcomes and proof requirements survive delegation,
|
|
10
|
+
continuation, remediation, and restart.
|
|
11
|
+
- **Adaptive execution**: small work stays small; additional agents and stronger
|
|
12
|
+
models are used only when task shape or risk justifies them.
|
|
13
|
+
- **Coexistence**: Sortie activates only when selected and preserves normal
|
|
14
|
+
OpenCode agents, settings, and user-owned files.
|
|
15
|
+
- **Cost, time, and proof**: the objective is a verified result at the lowest
|
|
16
|
+
practical cost and wall time, not the largest agent count.
|
|
17
|
+
|
|
62
18
|
[](https://github.com/zufall-upon/Sortie-dogs/releases/latest)
|
|
63
19
|
[](https://www.npmjs.com/package/sortie-dogs)
|
|
64
20
|
[](https://github.com/zufall-upon/Sortie-dogs/actions/workflows/test.yml)
|
|
@@ -66,586 +22,306 @@ See [configuration details](#configuration) for model selection and other setup
|
|
|
66
22
|
[](https://www.typescriptlang.org/)
|
|
67
23
|
[](https://www.npmjs.com/package/sortie-dogs)
|
|
68
24
|
[](LICENSE)
|
|
69
|
-
|
|
70
|
-

|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
`
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
repository: a child candidate may use its own `handoff.json` while OpenCode is
|
|
373
|
-
opened at the parent workspace. For operational work the coordinator creates
|
|
374
|
-
that valid handoff before dispatch and sends its exact absolute path; the
|
|
375
|
-
binding child must use the built-in Read tool on it immediately before bind.
|
|
376
|
-
New coordinator contracts are emitted under the candidate-relative
|
|
377
|
-
`.sortie-dogs/contracts/` directory as `handoff.<id>.json` and
|
|
378
|
-
`<id>.operation-manifest.json`. The directory is ignored by this repository's
|
|
379
|
-
`.gitignore`; legacy root/scoped paths and configured custom paths remain
|
|
380
|
-
readable and preflight-compatible, but are never moved or deleted.
|
|
381
|
-
Remove the directory only when no Sortie run is active.
|
|
382
|
-
- `readOnlyTools` adds host-specific tool names that never change files, such as
|
|
383
|
-
MCP tools. Unknown tools are denied for a bound session by default.
|
|
384
|
-
- `dedicatedWorkerModel` selects the serial implementation target used by
|
|
385
|
-
`implementation`, `remediation`, `blocker-resolution`, `sol-worker-mk2a2`, and
|
|
386
|
-
`dog-worker`. It defaults to `openai/gpt-5.6-sol` with variant `medium`.
|
|
387
|
-
The installed `dog-luna-worker` fabric route remains fixed to
|
|
388
|
-
`openai/gpt-5.6-luna` with variant `max`; pointing the serial target at that
|
|
389
|
-
Luna model is invalid because it would collapse the two route identities. The
|
|
390
|
-
coordinator dispatches this role only for a ready descriptor of a prepared
|
|
391
|
-
`luna-fabric` run; a `sol-serial` run keeps `dog-worker`.
|
|
392
|
-
- `continuation` bounds the batch loop. After a terminal unit and its checkpoint,
|
|
393
|
-
`dog-coordinator` calls `sortie_compact_and_continue`, which compacts the run
|
|
394
|
-
and resumes the same root session on the next independent unit. Only a root
|
|
395
|
-
`dog-coordinator` session is ever resumed: a child session is never promoted and
|
|
396
|
-
another coordinator is never adopted. Set `enabled` to `false` to keep every
|
|
397
|
-
batch manual, lower `maxAutoContinues` (default and maximum `10`) to change the
|
|
398
|
-
ceiling, and set `summarizeModel` to override the latest coordinator
|
|
399
|
-
model used for compaction. Normal OpenCode auto-compaction keeps the
|
|
400
|
-
host's auto-continue behavior; Sortie suppresses it only while its own
|
|
401
|
-
explicitly queued rollover owns the resume.
|
|
402
|
-
Every terminal root-coordinator response that does not resume another unit
|
|
403
|
-
compacts without auto-continuing, so completed tool output is not carried into
|
|
404
|
-
the next user request.
|
|
405
|
-
- `reflection` is an opt-in process-prevention companion for an activated root
|
|
406
|
-
`dog-coordinator`. It is disabled by default. Run and project layers default
|
|
407
|
-
to enabled after opt-in; the cross-project global storage layer remains
|
|
408
|
-
disabled unless explicitly enabled. Child and non-coordinator sessions fail
|
|
409
|
-
closed, and `SORTIE_REFLECTION=0` is an immediate kill switch. The coordinator
|
|
410
|
-
injects the governing `REFLECTION_POLICY` only while reflection is enabled.
|
|
411
|
-
`maxInjectedTokens` budgets the dynamic `SORTIE_PROCESS_REFLECTIONS` heading
|
|
412
|
-
and persisted entry lines; the policy is outside that entry budget.
|
|
413
|
-
The coordinator
|
|
414
|
-
evaluates it only after a resolved blocker/review defect and at a terminal
|
|
415
|
-
unit, with a maximum of three records per run; routine bugs and external
|
|
416
|
-
failures are never journaled.
|
|
417
|
-
|
|
418
|
-
## Example run
|
|
419
|
-
|
|
420
|
-
An illustrative low-risk run stays bounded and reports its gates:
|
|
421
|
-
|
|
422
|
-
```text
|
|
423
|
-
You: /sortie Add the requested behavior
|
|
424
|
-
dog-coordinator: manifest confirmed
|
|
425
|
-
dog-scout: skipped — no concrete evidence gap
|
|
426
|
-
dog-worker: implementation complete
|
|
427
|
-
validation: npm test — PASS
|
|
428
|
-
review: skipped — low risk
|
|
429
|
-
dog-coordinator: completion evidence accepted
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
## The workflow
|
|
433
|
-
|
|
434
|
-
1. **Freeze the goal and plan** — `dog-coordinator` turns the request into invariant
|
|
435
|
-
acceptance criteria, a write manifest, and validation requirements.
|
|
436
|
-
2. **Optional scout** — one bounded, read-only investigation runs only for a
|
|
437
|
-
concrete pre-worker evidence gap.
|
|
438
|
-
3. **Adaptive execution** — the coordinator selects one worker or bounded parallel
|
|
439
|
-
units according to task shape; workers implement only their approved manifests.
|
|
440
|
-
4. **Canonical validation** — the declared test or build command must produce
|
|
441
|
-
acceptable evidence.
|
|
442
|
-
5. **Risk-based review** — high-risk candidates receive independent review;
|
|
443
|
-
low-risk candidates can skip that extra pass after validation.
|
|
444
|
-
6. **Goal-level completion** — only the coordinator closes the loop after every
|
|
445
|
-
accepted criterion has manifest, validation, review, and evidence coverage.
|
|
446
|
-
7. **Bounded continuation** — restart recovery and compaction handoffs preserve
|
|
447
|
-
progress; repeated batches remain bounded rather than becoming endless
|
|
448
|
-
delegation.
|
|
449
|
-
|
|
450
|
-
## Built to work on itself
|
|
451
|
-
|
|
452
|
-
Self-improvement keeps the same scoped manifests, worker ownership, validation,
|
|
453
|
-
and review gates as other work. A loaded plugin is not treated as hot-reloadable:
|
|
454
|
-
source changes are validated first, then packaged into an isolated `_testenv`
|
|
455
|
-
fixture and exercised through the real OpenCode CLI. Continuation and compaction
|
|
456
|
-
changes must demonstrate same-session recovery and terminal completion there.
|
|
457
|
-
|
|
458
|
-
`npm run test:full` is reserved for explicit release validation; ordinary
|
|
459
|
-
changes run targeted tests and `npm test`. The control plane coordinating a run
|
|
460
|
-
is not replaced while that run is in flight.
|
|
461
|
-
|
|
462
|
-
## A visual walkthrough
|
|
463
|
-
|
|
464
|
-
### Control complexity
|
|
465
|
-
|
|
466
|
-

|
|
467
|
-
|
|
468
|
-
The coordinator keeps investigation, implementation, validation, and review in
|
|
469
|
-
separate roles. Manifest gates keep their writes bounded even as the project
|
|
470
|
-
gets more complex.
|
|
471
|
-
|
|
472
|
-
### Finish with evidence
|
|
473
|
-
|
|
474
|
-

|
|
475
|
-
|
|
476
|
-
Validation and risk-based review happen before coordinator-owned completion, so
|
|
477
|
-
the result returns with a concise record of what changed and how it was checked.
|
|
478
|
-
|
|
479
|
-
## Scope and session guarantees
|
|
480
|
-
|
|
481
|
-
The plugin is passive by default. It activates a session only when a message
|
|
482
|
-
uses `/sortie` or the selected agent is `dog-coordinator`. It validates exact
|
|
483
|
-
write scope through source or operation manifests and rejects invalid worker
|
|
484
|
-
handoffs. Standard OpenCode agents, roles, settings, and unrelated sessions are
|
|
485
|
-
preserved.
|
|
486
|
-
|
|
487
|
-
On `session.idle`, the final handoff is checked and the session is released. A
|
|
488
|
-
`session.deleted` event also releases it. A later request must activate the
|
|
489
|
-
workflow again.
|
|
490
|
-
|
|
491
|
-
One host defect is repaired in place. A subagent result is built from the last
|
|
492
|
-
text part of the child's final message, so a reasoning model that closes its
|
|
493
|
-
turn with an empty text part returns an empty result and the coordinator
|
|
494
|
-
re-dispatches work the worker already finished. When a completed `task` result
|
|
495
|
-
is empty, Sortie-dogs restores the last real assistant text from that child
|
|
496
|
-
session. Non-empty results, other tools, and unreadable child sessions are left
|
|
497
|
-
untouched.
|
|
498
|
-
|
|
499
|
-
## Model routing
|
|
500
|
-
|
|
501
|
-
Default routes split work by required capability and repeated-context cost.
|
|
502
|
-
Sortie-dogs keeps retrieval on Luna, coordinator routing on Terra, and independent
|
|
503
|
-
review on Sol unless the host declares another target.
|
|
504
|
-
|
|
505
|
-
`dog-coordinator` defaults to `openai/gpt-5.6-terra` with the `high` variant. Coordinator quality controls
|
|
506
|
-
planning and forward progress, so Terra High is the default balance between capability and cost.
|
|
507
|
-
Project or global `modelRouting` can override
|
|
508
|
-
this default. If the host proves Terra unavailable,
|
|
509
|
-
the existing availability policy uses a configured free-tier fallback when present
|
|
510
|
-
and otherwise preserves the session model.
|
|
511
|
-
|
|
512
|
-
`dog-scout` defaults to `openai/gpt-5.6-luna` with the `high` variant, since
|
|
513
|
-
gathering bounded evidence is retrieval rather than reasoning and that tier is
|
|
514
|
-
where the curve gives the most per unit of cost. Nobody selects a model for a
|
|
515
|
-
session the loop spawns, which is why delegated roles carry defaults and the
|
|
516
|
-
coordinator does not. Project-local routing can override this default.
|
|
517
|
-
|
|
518
|
-
The `implementation`, `remediation`, `blocker-resolution`, `sol-worker-mk2a2`,
|
|
519
|
-
and `dog-worker` roles always use the stable serial target,
|
|
520
|
-
`openai/gpt-5.6-sol` with the `medium` variant. `dedicatedWorkerModel` may move
|
|
521
|
-
that serial target when a host cannot serve it. The installed `dog-luna-worker`
|
|
522
|
-
route is separately fixed to `openai/gpt-5.6-luna` with the `max` variant. Its
|
|
523
|
-
shared worker contract requires one validated fabric descriptor: the coordinator
|
|
524
|
-
admits a v0.8 DAG contract with `sortie_admit_luna_fabric`, prepares it with
|
|
525
|
-
`sortie_prepare_luna_fabric`, and materializes only the current ready wave, with
|
|
526
|
-
at most five distinct Luna units. The complete DAG may contain up to 64 units.
|
|
527
|
-
After every active artifact is verified, `sortie_advance_luna_fabric_wave`
|
|
528
|
-
integrates them into a runtime-owned hidden candidate, cleans those worktrees,
|
|
529
|
-
and creates fresh worktrees from that exact snapshot. After the final wave,
|
|
530
|
-
`sortie_validate_luna_fabric_candidate` runs canonical validation once and
|
|
531
|
-
`sortie_accept_luna_fabric_candidate` records review before one target CAS.
|
|
532
|
-
Declared shared-path ownership serializes overlapping units
|
|
533
|
-
across waves; unowned overlap or any admission defect routes the whole job back
|
|
534
|
-
to one `dog-worker`. The fabric never duplicates one unit across lanes.
|
|
535
|
-
`modelRouting` cannot replace either fixed
|
|
536
|
-
route, and a serial override naming the Luna fabric model is invalid rather than
|
|
537
|
-
silently collapsing both identities. Version 0.7.0 routed `dog-worker` to Luna
|
|
538
|
-
Max; v0.8 intentionally preserves that history while splitting stable Sol and
|
|
539
|
-
fabric Luna roles. Other explicit routes try the preferred target, then ordered
|
|
540
|
-
fallbacks. Roles without a built-in default or explicit route keep OpenCode's
|
|
541
|
-
already selected model.
|
|
542
|
-
|
|
543
|
-
`dog-reviewer` and `dog-advisor` must never inherit the caller's model, because
|
|
544
|
-
review and strategy lose their value when they run on the model that produced
|
|
545
|
-
the candidate. Both default to `anthropic/claude-opus-5` when the catalog
|
|
546
|
-
declares it, and otherwise fall back to `openai/gpt-5.6-sol` with the `xhigh`
|
|
547
|
-
variant. That fallback uses higher effort than the Sol Medium worker because
|
|
548
|
-
review has to be able to reject work the worker just produced. Moving
|
|
549
|
-
`dedicatedWorkerModel` does not change consultation policy. Nothing here requires
|
|
550
|
-
a particular vendor: both roles stay fully configurable, so declare whichever
|
|
551
|
-
model you can actually serve.
|
|
552
|
-
|
|
553
|
-
```json
|
|
554
|
-
{
|
|
555
|
-
"dedicatedWorkerModel": {
|
|
556
|
-
"model": "openai/gpt-5.6-sol",
|
|
557
|
-
"variant": "medium"
|
|
558
|
-
},
|
|
559
|
-
"modelRouting": {
|
|
560
|
-
"dog-coordinator": {
|
|
561
|
-
"preferred": { "model": "openai/gpt-5.6-luna", "variant": "max" }
|
|
562
|
-
},
|
|
563
|
-
"dog-scout": {
|
|
564
|
-
"preferred": { "model": "openai/gpt-5.6-luna", "variant": "high" }
|
|
565
|
-
},
|
|
566
|
-
"dog-reviewer": {
|
|
567
|
-
"preferred": { "model": "anthropic/claude-opus-5" },
|
|
568
|
-
"fallback": [{ "model": "openai/gpt-5.6-sol", "variant": "xhigh" }]
|
|
569
|
-
},
|
|
570
|
-
"dog-advisor": {
|
|
571
|
-
"preferred": { "model": "openai/gpt-5.6-sol", "variant": "xhigh" }
|
|
572
|
-
}
|
|
573
|
-
},
|
|
574
|
-
"modelCatalog": {
|
|
575
|
-
"project": [
|
|
576
|
-
{ "model": "openai/gpt-5.6-sol", "variants": ["medium", "xhigh"] },
|
|
577
|
-
{ "model": "openai/gpt-5.6-luna", "variants": ["max", "high"] },
|
|
578
|
-
{ "model": "anthropic/claude-opus-5" }
|
|
579
|
-
]
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
```
|
|
583
|
-
|
|
584
|
-
`dog-worker` intentionally has no `modelRouting` entry. It uses
|
|
585
|
-
`dedicatedWorkerModel`, shared with the other stable serial implementation roles.
|
|
586
|
-
`dog-luna-worker` remains a separate fixed fabric route.
|
|
587
|
-
|
|
588
|
-
Save project configuration as `.opencode/sortie-dogs.json`. `modelCatalog`
|
|
589
|
-
declares provider models and named variants that are actually available;
|
|
590
|
-
Sortie-dogs does not invent, probe, or translate variants. The built-in catalog
|
|
591
|
-
intentionally omits `anthropic/claude-opus-5`, so the preferred consultation
|
|
592
|
-
model applies only after you declare it. Resolution tries the preferred target
|
|
593
|
-
and then its fallbacks, rejecting an explicitly routed role when no candidate
|
|
594
|
-
appears in the catalog.
|
|
595
|
-
|
|
596
|
-
`dog-advisor` accepts bounded Strategy or SourceReview consultation from the
|
|
597
|
-
coordinator. `dog-reviewer` independently checks high-risk candidates after
|
|
598
|
-
canonical validation. Neither role implements, stages, commits, or acts as a
|
|
599
|
-
user-facing worker.
|
|
600
|
-
|
|
601
|
-
## Optional global availability
|
|
602
|
-
|
|
603
|
-
If you intentionally want the Sortie roles available across projects, install
|
|
604
|
-
the CLI and runtime assets globally:
|
|
605
|
-
|
|
606
|
-
```sh
|
|
607
|
-
npm install --global sortie-dogs
|
|
608
|
-
sortie-dogs init --global
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
This writes canonical Sortie runtime assets to OpenCode's global configuration;
|
|
612
|
-
it does not make project-local initialization global. Load the plugin from the
|
|
613
|
-
global `~/.config/opencode/opencode.json` when using these assets:
|
|
614
|
-
|
|
615
|
-
```json
|
|
616
|
-
{
|
|
617
|
-
"plugin": ["sortie-dogs"]
|
|
618
|
-
}
|
|
619
|
-
```
|
|
620
|
-
|
|
621
|
-
Project-local configuration and plugin loading remain available when a project
|
|
622
|
-
needs its own settings or dependency.
|
|
623
|
-
|
|
624
|
-
## Updates and migration
|
|
625
|
-
|
|
626
|
-
After replacing the dependency with a newer release asset, run:
|
|
627
|
-
|
|
628
|
-
```sh
|
|
629
|
-
npx sortie-dogs init .
|
|
630
|
-
```
|
|
631
|
-
|
|
632
|
-
After initialization, fully restart the OpenCode host before resuming a coordinator or opening a
|
|
633
|
-
fresh session. Plugin modules are process-scoped, so a new session alone cannot load the update.
|
|
634
|
-
|
|
635
|
-
`init` is idempotent. It updates files owned by Sortie-dogs, migrates recognized
|
|
636
|
-
older runtime files, and records the installed version in
|
|
637
|
-
`.opencode/sortie-dogs.version`. Conflicting or unrecognized files remain
|
|
638
|
-
untouched and initialization stops safely. User-owned configuration—including
|
|
639
|
-
`.opencode/sortie-dogs.json`—and standard OpenCode files are preserved.
|
|
640
|
-
|
|
641
|
-
## Maintainer releases
|
|
642
|
-
|
|
643
|
-
The [release batch guide](docs/release-batch.md) covers fixed-tarball CLI verification,
|
|
644
|
-
global application, resumable GitHub publication, and manual npm publication checks.
|
|
645
|
-
|
|
646
|
-
## Safe manual removal
|
|
647
|
-
|
|
648
|
-
There is no supported Sortie-dogs uninstall command. Remove the npm dependency
|
|
649
|
-
separately, then follow the [safe manual removal guide](docs/uninstall.md) to
|
|
650
|
-
delete only Sortie-dogs-owned runtime files without affecting user files or
|
|
651
|
-
standard OpenCode agents.
|
|
25
|
+
|
|
26
|
+

|
|
27
|
+
|
|
28
|
+
Guides: [日本語](docs/guide-ja.md) · [简体中文](docs/guide-zh-CN.md) ·
|
|
29
|
+
[Testing](docs/testing.md) · [CLI testing](docs/cli-testing.md)
|
|
30
|
+
|
|
31
|
+
Release: [v0.10.6](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.10.6)
|
|
32
|
+
|
|
33
|
+
> **Beta:** v0.10.x is under active stabilization. Runtime behavior,
|
|
34
|
+
> configuration, and generated assets may still change before 1.0.
|
|
35
|
+
|
|
36
|
+
## Quick start
|
|
37
|
+
|
|
38
|
+
Requirements: Node.js 22.6 or newer, npm, and OpenCode.
|
|
39
|
+
|
|
40
|
+
Run these commands in the target project:
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
npm install --save-dev sortie-dogs
|
|
44
|
+
npx sortie-dogs init .
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The beta package defaults to the v0.10 profile. Add the plugin and the required
|
|
48
|
+
two-level subagent depth to `.opencode/opencode.json`, preserving existing values:
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"plugin": ["sortie-dogs"],
|
|
53
|
+
"subagent_depth": 2
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Restart OpenCode, then run:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
/sortie-v010 <task>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Selecting `dog-operator` directly starts the same workflow. `dog-operator` is the
|
|
64
|
+
only user-facing v0.10 authority. `dogs-coordinator` and every `*-v010` role are
|
|
65
|
+
internal children and must not be selected as task entry points.
|
|
66
|
+
|
|
67
|
+
`init` installs runtime assets; the `plugin` entry loads runtime enforcement and
|
|
68
|
+
model routing. Both are required. A new session alone does not reload an updated
|
|
69
|
+
plugin process, so restart OpenCode after installation or upgrade.
|
|
70
|
+
|
|
71
|
+
## v0.10.x direction
|
|
72
|
+
|
|
73
|
+
v0.10.x separates strategic authority from bounded operations:
|
|
74
|
+
|
|
75
|
+
- `dog-operator` preserves the original request, acceptance criteria, scope,
|
|
76
|
+
review decision, and final acceptance.
|
|
77
|
+
- Hidden `dogs-coordinator` investigates or advances an approved serial queue,
|
|
78
|
+
but cannot edit source, change acceptance, review, or publish.
|
|
79
|
+
- `dog-worker-v010` implements one host-generated unit inside exact read, write,
|
|
80
|
+
and validation boundaries.
|
|
81
|
+
- Scout, advisor, and reviewer roles are optional and bounded by an explicit
|
|
82
|
+
evidence gap, strategy trigger, or risk decision.
|
|
83
|
+
|
|
84
|
+
The v0.10 profile is serial by design. The stable profile's Luna fabric and
|
|
85
|
+
parallel integration path are not exposed in this profile. More agents are not a
|
|
86
|
+
goal; preserving quality while reducing unnecessary expensive work is.
|
|
87
|
+
|
|
88
|
+
### SWE-bench policy from v0.10.6
|
|
89
|
+
|
|
90
|
+
Starting with v0.10.6, development proceeds alongside recurring SWE-bench
|
|
91
|
+
measurement. This is a measurement policy, not a claim that an unrun suite passed.
|
|
92
|
+
|
|
93
|
+
- Freeze the task input, package/source snapshot, model routes, budgets, tools,
|
|
94
|
+
and stop endpoint before comparing runs.
|
|
95
|
+
- Freeze the candidate only after all writers stop, then grade a separate copy
|
|
96
|
+
with one pinned official verifier execution.
|
|
97
|
+
- Record benchmark completion, official task correctness, and harness terminal
|
|
98
|
+
state independently. A Sortie `DONE` or review `PASS` is not an official
|
|
99
|
+
verifier reward.
|
|
100
|
+
- Record agent-to-freeze and verifier time separately, plus root and descendant
|
|
101
|
+
tokens, model steps, children, cache behavior, estimated cost, and coverage.
|
|
102
|
+
- Keep infrastructure failure distinct from scored failure. Small or unmatched
|
|
103
|
+
samples remain case studies, not leaderboard or general success-rate claims.
|
|
104
|
+
|
|
105
|
+
The pre-v0.10.6 local benchmark condition is closed historical evidence. New
|
|
106
|
+
development decisions use SWE-bench measurements collected under the frozen
|
|
107
|
+
contract in [Coding benchmark completion and correctness](docs/benchmark-completion-contract.md).
|
|
108
|
+
|
|
109
|
+
## Historical local case study
|
|
110
|
+
|
|
111
|
+
These are completion-filtered local references on one frozen DeepSWE task,
|
|
112
|
+
`datacurve/anko-typed-variable-bindings`, collected from 2026-09-14 through
|
|
113
|
+
2026-09-18. They are not matched pairs or a leaderboard result.
|
|
114
|
+
|
|
115
|
+
- Bare OpenCode: Verified PASS `0/3`, F2P `3/27`, median agent wall `24.5 min`,
|
|
116
|
+
median completed-run API-equivalent cost `$3.53`.
|
|
117
|
+
- Sortie v0.9.12: Verified PASS `0/3`, F2P `23/27`, median wall `25.7 min`,
|
|
118
|
+
median completed-run cost `$2.85`; two additional interrupted attempts cost
|
|
119
|
+
an estimated `$6.20`.
|
|
120
|
+
- Sortie v0.10.3 one-shot: Verified PASS `0/1`, F2P `7/9`, wall `22.7 min`,
|
|
121
|
+
estimated cost `$3.79`.
|
|
122
|
+
- Sortie v0.10.5 one-shot: Verified PASS `1/1`, F2P `9/9`, P2P `94/94`, wall
|
|
123
|
+
`43.8 min`, estimated cost `$2.58`.
|
|
124
|
+
|
|
125
|
+
The v0.10.5 result is one verified success, not a success rate. Historical rate
|
|
126
|
+
schedules and endpoints differ, and the host-reported zero cost is not treated as
|
|
127
|
+
a bill. See [definitions, frozen inputs, and limitations](docs/benchmark-reference.md)
|
|
128
|
+
and [machine-readable values](docs/benchmarks/provisional-reference.json).
|
|
129
|
+
|
|
130
|
+
## How v0.10.6 works
|
|
131
|
+
|
|
132
|
+
1. **Freeze intent**: `dog-operator` preserves the complete request as ordered
|
|
133
|
+
requirements, negative constraints, quality thresholds, references, and finite
|
|
134
|
+
proposal/execution budgets.
|
|
135
|
+
2. **Investigate only when needed**: a nontrivial task can send one bounded,
|
|
136
|
+
read-only proposal investigation to `dogs-coordinator`. It cannot edit, run
|
|
137
|
+
shell commands, dispatch workers, or widen its approved read prefixes.
|
|
138
|
+
3. **Approve an exact plan**: the root compares the proposal with the original
|
|
139
|
+
request and approves its exact revision and hash. Uncovered requirements or
|
|
140
|
+
widened scope fail closed. A simple task with a complete known contract can
|
|
141
|
+
use the direct worker fast path.
|
|
142
|
+
4. **Generate controls**: the host creates and schema-validates the handoff,
|
|
143
|
+
operation manifest, acceptance ledger, and short task reference. Models do not
|
|
144
|
+
hand-authorize their own write scope.
|
|
145
|
+
5. **Execute serial units**: one unit goes directly to `dog-worker-v010`; a
|
|
146
|
+
multi-unit plan is advanced serially by hidden `dogs-coordinator`. A worker
|
|
147
|
+
binds once and can modify only declared paths and run only declared validation.
|
|
148
|
+
6. **Collect host evidence**: validation identity binds source snapshot,
|
|
149
|
+
candidate, command, environment, scope, and owner. Claims in prose do not
|
|
150
|
+
become proof.
|
|
151
|
+
7. **Review by risk**: high-risk candidates receive independent SourceReview;
|
|
152
|
+
low-risk review may be explicitly skipped. The reviewer is tool-free and does
|
|
153
|
+
not implement fixes.
|
|
154
|
+
8. **Remediate without weakening the goal**: acceptance failures and blocking
|
|
155
|
+
review findings create a same-goal replacement from the committed candidate,
|
|
156
|
+
retaining acceptance and cumulative budget. Scope growth still requires a
|
|
157
|
+
later explicit user decision.
|
|
158
|
+
9. **Accept explicitly**: only the root's successful completion operation closes
|
|
159
|
+
the run. Terminal states remain `DONE`, `INTERRUPTED`, `BLOCKED`, and
|
|
160
|
+
`NEED_DECISION`; the host-generated return report uses observed evidence.
|
|
161
|
+
|
|
162
|
+
Durable profile state and hash-bound task references support restart and
|
|
163
|
+
compaction recovery without reconstructing criteria from summary prose. Stale,
|
|
164
|
+
foreign-root, or changed references are rejected. An optional Git lifecycle can
|
|
165
|
+
create one non-overwriting branch and one explicit-path commit; it never grants
|
|
166
|
+
arbitrary Git, force push, release, or publication authority.
|
|
167
|
+
|
|
168
|
+
## Configuration
|
|
169
|
+
|
|
170
|
+
### Profile files and precedence
|
|
171
|
+
|
|
172
|
+
The default package entry is the v0.10 profile:
|
|
173
|
+
|
|
174
|
+
- Command: `/sortie-v010`
|
|
175
|
+
- Primary agent: `dog-operator`
|
|
176
|
+
- Project settings: `.opencode/sortie-dogs-v010.json`
|
|
177
|
+
- Global settings: `~/.config/opencode/sortie-dogs-v010.json`
|
|
178
|
+
- JSON environment override: `SORTIE_DOGS_V010_CONFIG`
|
|
179
|
+
- Runtime state: `.sortie-dogs-v010/`
|
|
180
|
+
- Installed asset marker: `.opencode/sortie-dogs-v010.version`
|
|
181
|
+
|
|
182
|
+
Precedence is built-in defaults, global file, project file, environment JSON,
|
|
183
|
+
then plugin factory options. Unknown properties or invalid types are rejected.
|
|
184
|
+
Use external v0.10 role names such as `dog-operator`, `dogs-coordinator`, and
|
|
185
|
+
`dog-reviewer-v010` in `modelRouting`; do not also declare their stable aliases.
|
|
186
|
+
|
|
187
|
+
Example `.opencode/sortie-dogs-v010.json`:
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"validationProfile": "balanced",
|
|
192
|
+
"readOnlyTools": ["my_mcp_search"],
|
|
193
|
+
"freeTierFallbackModels": ["opencode/deepseek-v4-flash-free"],
|
|
194
|
+
"modelRouting": {
|
|
195
|
+
"dog-operator": {
|
|
196
|
+
"preferred": { "model": "provider/model", "variant": "high" }
|
|
197
|
+
},
|
|
198
|
+
"dogs-coordinator": {
|
|
199
|
+
"preferred": { "model": "provider/model", "variant": "deep" }
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"modelCatalog": {
|
|
203
|
+
"project": [
|
|
204
|
+
{ "model": "provider/model", "variants": ["high", "deep"] }
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
"continuation": {
|
|
208
|
+
"enabled": true,
|
|
209
|
+
"maxAutoContinues": 10,
|
|
210
|
+
"taskWatchdogMilliseconds": 300000
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Declare only models and named variants the host actually provides. Sortie does
|
|
216
|
+
not invent, probe, or translate variant names.
|
|
217
|
+
|
|
218
|
+
### Settings reference
|
|
219
|
+
|
|
220
|
+
- `readOnlyTools`: additional host-specific tools known not to mutate project
|
|
221
|
+
files. Values accumulate across configuration layers. Unknown tools are denied
|
|
222
|
+
in a bound worker session.
|
|
223
|
+
- `modelRouting`: preferred and ordered fallback targets by external profile role.
|
|
224
|
+
- `modelCatalog`: available `project` and `global` model/variant declarations.
|
|
225
|
+
- `freeTierFallbackModels`: ordered global last-resort model IDs. Default:
|
|
226
|
+
`opencode/deepseek-v4-flash-free`; `[]` disables this fallback.
|
|
227
|
+
- `dedicatedWorkerModel`: canonical stable serial target, default
|
|
228
|
+
`openai/gpt-5.6-sol` / `medium`. The v0.10 profile also supplies its explicit
|
|
229
|
+
role routes below; do not infer the v0.10 worker route from this stable setting.
|
|
230
|
+
- `consultation.strategy`: fixed advisor identity, optional `required`, and
|
|
231
|
+
positive `maxCallsPerCandidate`; default one call and not required.
|
|
232
|
+
- `consultation.sourceReview`: risk-based review with `maxCallsPerCandidate`
|
|
233
|
+
default `1` and `maxArtifactBytes` default/maximum `30720`. Unavailable review
|
|
234
|
+
blocks only when review is required.
|
|
235
|
+
- `continuation.enabled`: default `true`.
|
|
236
|
+
- `continuation.maxAutoContinues`: positive integer, default and maximum `10`.
|
|
237
|
+
- `continuation.taskWatchdogMilliseconds`: root inactivity while an implementation
|
|
238
|
+
Task is outstanding; default `300000`, valid range `10..1800000`.
|
|
239
|
+
- `continuation.summarizeModel`: optional explicit compaction model; omission
|
|
240
|
+
reuses the latest observed root model.
|
|
241
|
+
- `validationProfile`: `fast`, `balanced`, or `assurance`; default `balanced`.
|
|
242
|
+
- `reflection`: accepted by the shared schema, but reflection writes are not
|
|
243
|
+
exposed by the serial v0.10 profile. Stable reflection remains opt-in and off by
|
|
244
|
+
default.
|
|
245
|
+
|
|
246
|
+
The v0.10 host owns handoff and manifest controls under
|
|
247
|
+
`.sortie-dogs-v010/contracts/`. Do not create a legacy root
|
|
248
|
+
`operation-manifest.json` for this profile and do not edit generated controls.
|
|
249
|
+
Delete `.sortie-dogs-v010/` only when no Sortie run is active.
|
|
250
|
+
|
|
251
|
+
### Validation policy
|
|
252
|
+
|
|
253
|
+
`validationProfile` chooses non-canonical depth:
|
|
254
|
+
|
|
255
|
+
- `fast`: static checks
|
|
256
|
+
- `balanced`: targeted checks
|
|
257
|
+
- `assurance`: related checks
|
|
258
|
+
|
|
259
|
+
Canonical proof remains canonical. Full-suite execution requires release context
|
|
260
|
+
or explicit risk. Workers own static, targeted, and related checks; the root owns
|
|
261
|
+
canonical and full-suite checks. An unchanged candidate, command, and environment
|
|
262
|
+
reuse the same evidence instead of spending the validation budget again.
|
|
263
|
+
|
|
264
|
+
### Default v0.10 routes
|
|
265
|
+
|
|
266
|
+
- `dog-operator`: `openai/gpt-5.6-luna-fast` / `max`
|
|
267
|
+
- `dogs-coordinator`: `openai/gpt-5.6-terra` / `xhigh`
|
|
268
|
+
- `dog-worker-v010`: `openai/gpt-5.6-luna-fast` / `max`
|
|
269
|
+
- `dog-scout-v010`: `openai/gpt-5.6-luna-fast` / `xhigh`
|
|
270
|
+
- `dog-reviewer-v010`: `openai/gpt-5.6-terra` / `xhigh`
|
|
271
|
+
- `dog-advisor-v010`: preferred declared `anthropic/claude-opus-5`, otherwise
|
|
272
|
+
`openai/gpt-5.6-sol` / `xhigh`
|
|
273
|
+
|
|
274
|
+
An explicit model and variant selected in OpenCode remains authoritative for that
|
|
275
|
+
session. Child role defaults fill absent native settings and may be overridden by
|
|
276
|
+
valid profile routing. Review never silently inherits the implementation model.
|
|
277
|
+
|
|
278
|
+
## Stable compatibility profile
|
|
279
|
+
|
|
280
|
+
The earlier parallel-capable runtime remains available explicitly:
|
|
281
|
+
|
|
282
|
+
```sh
|
|
283
|
+
npx sortie-dogs init . --profile stable
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Load it through a project bridge instead of the default package plugin entry:
|
|
287
|
+
|
|
288
|
+
```ts
|
|
289
|
+
export { SortieDogsPlugin } from "sortie-dogs/plugin/stable";
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
The stable profile uses `/sortie`, `dog-coordinator`,
|
|
293
|
+
`.opencode/sortie-dogs.json`, `SORTIE_DOGS_CONFIG`, and `.sortie-dogs/`. Do not
|
|
294
|
+
register stable and v0.10 from the same package installation path in one host.
|
|
295
|
+
|
|
296
|
+
## Global availability
|
|
297
|
+
|
|
298
|
+
Project-local installation is recommended. To expose v0.10 assets globally:
|
|
299
|
+
|
|
300
|
+
```sh
|
|
301
|
+
npm install --global sortie-dogs
|
|
302
|
+
sortie-dogs init --global --profile v010
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Then add `sortie-dogs` and `subagent_depth: 2` to the global OpenCode config.
|
|
306
|
+
Global initialization installs assets only; it does not silently change the
|
|
307
|
+
default agent or merge user settings.
|
|
308
|
+
|
|
309
|
+
## Updates and removal
|
|
310
|
+
|
|
311
|
+
After replacing the dependency, rerun initialization and restart OpenCode:
|
|
312
|
+
|
|
313
|
+
```sh
|
|
314
|
+
npx sortie-dogs init .
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
`init` is idempotent. It updates recognized Sortie-owned assets, records the asset
|
|
318
|
+
version, preserves user configuration, and stops safely on unknown ownership or
|
|
319
|
+
conflicting files.
|
|
320
|
+
|
|
321
|
+
There is no supported uninstall command. Remove the npm dependency separately,
|
|
322
|
+
then follow the [safe manual removal guide](docs/uninstall.md). Delete only known
|
|
323
|
+
Sortie-owned paths; never remove the whole `.opencode` directory or use broad
|
|
324
|
+
wildcards.
|
|
325
|
+
|
|
326
|
+
Maintainers: the [release batch guide](docs/release-batch.md) covers fixed-tarball
|
|
327
|
+
validation, global application, GitHub publication, and manual npm publication.
|