sortie-dogs 0.14.6 → 0.14.8

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 CHANGED
@@ -19,10 +19,10 @@ evidence-backed result, not more agents for their own sake.
19
19
  [![Node.js](https://img.shields.io/node/v/sortie-dogs)](https://www.npmjs.com/package/sortie-dogs)
20
20
  [![MIT License](https://img.shields.io/npm/l/sortie-dogs)](LICENSE)
21
21
 
22
- **Current release: [v0.14.6](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.14.6)**
23
- · [Release notes](docs/release-v0.14.6.md) · [Execution vision](docs/v0.14.0-execution-vision.md)
22
+ **Current release: [v0.14.8](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.14.8)**
23
+ · [Release notes](docs/release-v0.14.8.md) · [Execution vision](docs/v0.14.0-execution-vision.md)
24
24
 
25
- [Quick start](#quick-start) · [Workflow](#mission-workflow) · [Models](#default-models) ·
25
+ [When to use](#when-to-use-sortie-dogs) · [Quick start](#quick-start) · [Workflow](#mission-workflow) · [Models](#default-models) ·
26
26
  [Measured results](#measured-results) · [Configuration](#configuration) · [Documentation](#documentation)
27
27
 
28
28
  > **Beta:** the package is still stabilizing before 1.0. Both host integrations are
@@ -46,6 +46,26 @@ evidence-backed result, not more agents for their own sake.
46
46
  - **Coexistence:** explicit invocation, existing authentication and host settings, one shared
47
47
  Mission lifecycle. Normal OpenCode/Codex use and user-owned files remain yours.
48
48
 
49
+ ## When to use Sortie-dogs
50
+
51
+ Use Sortie with an existing **OpenCode V2 or Codex CLI** when a bounded coding task needs:
52
+
53
+ - The original goal and constraints retained across investigation, multi-file implementation,
54
+ validation, review and correction.
55
+ - Either a direct author or delegated work, with edits, valid checks and cumulative budget retained
56
+ when the author changes.
57
+ - A handoff that distinguishes actual commands, test results, unresolved issues and acceptance
58
+ from a model's completion claim.
59
+
60
+ For example, request a bug fix with a regression test, preservation of unrelated local work, and
61
+ delivery as a reviewed PR. Define the required checks and delivery boundary in the request.
62
+
63
+ **Use the host directly** for ordinary questions or small edits that do not need this lifecycle.
64
+ Sortie is not a replacement for either host, a way to bypass native permissions, or a guarantee of
65
+ unattended completion, lower cost or better benchmark scores. Budget, model access and environment
66
+ requirements still matter. See [host setup](#quick-start) and [evidence and limitations](#measured-results)
67
+ before choosing it.
68
+
49
69
  ## Quick start
50
70
 
51
71
  Choose **one host route**. Both require Node.js **22.6+** and npm; project-local installation is
@@ -57,7 +77,7 @@ Use an existing Codex CLI signed in with **ChatGPT**. On Windows, PowerShell **7
57
77
  available; POSIX uses bash. Sortie does not install Codex, start login or use a metered API fallback.
58
78
 
59
79
  ```sh
60
- npm install --save-dev sortie-dogs@0.14.6
80
+ npm install --save-dev sortie-dogs@0.14.8
61
81
  npx --no-install sortie-dogs codex init .
62
82
  ```
63
83
 
@@ -86,7 +106,7 @@ bridge. [Codex guide: SDK, permissions, progress, resume and manifest route](doc
86
106
  Use **OpenCode V2**. In the target project:
87
107
 
88
108
  ```sh
89
- npm install --save-dev sortie-dogs@0.14.6
109
+ npm install --save-dev sortie-dogs@0.14.8
90
110
  npx --no-install sortie-dogs init .
91
111
  ```
92
112
 
@@ -159,6 +179,12 @@ inferred from token totals.
159
179
 
160
180
  ## Measured results
161
181
 
182
+ **Evidence and limitations:** these are recorded runs with fixed packages, models, tasks and
183
+ execution conditions, not a general performance guarantee or a controlled comparison with the
184
+ native hosts or other harnesses. Historical results do not measure the current release or its
185
+ current default Worker. Mission acceptance, official task scoring and leaderboard acceptance are
186
+ different outcomes; the records below keep them separate.
187
+
162
188
  ### Codex end-to-end completion
163
189
 
164
190
  **Codex integration has completed real Missions on Ubuntu and Windows.** The Windows large-write
@@ -245,7 +271,7 @@ Install the desired package version and rerun **your host's** initializer:
245
271
 
246
272
  An OpenCode config-local bridge may resolve a separate package; npm-global update alone does not
247
273
  update it. [Global/update instructions](docs/configuration.md#global-availability).
248
- The current Mission asset marker is `0.14.6-attachment-terra-v1`; the Codex skill marker is
274
+ The current Mission asset marker is `0.14.8-discovery-fit-v1`; the Codex skill marker is
249
275
  `0.14.6-codex-skill-v1`. Installed markers alone do not prove a running host reloaded the new version.
250
276
 
251
277
  There is no supported uninstall command. Remove the dependency and only known Sortie-owned paths;
@@ -261,9 +287,14 @@ follow the [manual removal guide](docs/uninstall.md), never delete the entire `.
261
287
  [SWE-bench history](docs/benchmarks/swebench-lite-history.md) · [Historical local case study](docs/benchmark-reference.md).
262
288
  - **Development:** [Testing](docs/testing.md) · [CLI testing](docs/cli-testing.md) ·
263
289
  [Windows tests](docs/windows-tests.md) · [Release routine](docs/release-batch.md).
264
- - **Releases:** [v0.14.6](docs/release-v0.14.6.md) · [v0.14.5](docs/release-v0.14.5.md) · [v0.14.4](docs/release-v0.14.4.md) · [v0.14.3](docs/release-v0.14.3.md) · [v0.14.2](docs/release-v0.14.2.md) · [v0.14.1](docs/release-v0.14.1.md) · [v0.14.0](docs/release-v0.14.0.md) · [v0.13.22](docs/release-v0.13.22.md) · [v0.13.21](docs/release-v0.13.21.md) · [v0.13.20](docs/release-v0.13.20.md) · [v0.13.19](docs/release-v0.13.19.md) · [v0.13.18](docs/release-v0.13.18.md) · [v0.13.17](docs/release-v0.13.17.md) · [v0.13.16](docs/release-v0.13.16.md) · [v0.13.15](docs/release-v0.13.15.md) · [v0.13.14](docs/release-v0.13.14.md) · [v0.13.13](docs/release-v0.13.13.md) · [v0.13.12](docs/release-v0.13.12.md) · [v0.13.11](docs/release-v0.13.11.md) · [v0.13.10](docs/release-v0.13.10.md) ·
290
+ - **Releases:** [v0.14.8](docs/release-v0.14.8.md) · [v0.14.7](docs/release-v0.14.7.md) · [v0.14.6](docs/release-v0.14.6.md) · [v0.14.5](docs/release-v0.14.5.md) · [v0.14.4](docs/release-v0.14.4.md) · [v0.14.3](docs/release-v0.14.3.md) · [v0.14.2](docs/release-v0.14.2.md) · [v0.14.1](docs/release-v0.14.1.md) · [v0.14.0](docs/release-v0.14.0.md) · [v0.13.22](docs/release-v0.13.22.md) · [v0.13.21](docs/release-v0.13.21.md) · [v0.13.20](docs/release-v0.13.20.md) · [v0.13.19](docs/release-v0.13.19.md) · [v0.13.18](docs/release-v0.13.18.md) · [v0.13.17](docs/release-v0.13.17.md) · [v0.13.16](docs/release-v0.13.16.md) · [v0.13.15](docs/release-v0.13.15.md) · [v0.13.14](docs/release-v0.13.14.md) · [v0.13.13](docs/release-v0.13.13.md) · [v0.13.12](docs/release-v0.13.12.md) · [v0.13.11](docs/release-v0.13.11.md) · [v0.13.10](docs/release-v0.13.10.md) ·
265
291
  [v0.13.9](docs/release-v0.13.9.md) · [All GitHub releases](https://github.com/zufall-upon/Sortie-dogs/releases).
266
292
 
293
+ ## Support
294
+
295
+ [GitHub Sponsors](https://github.com/sponsors/zufall-upon) — sponsorships become available
296
+ once the maintainer's Sponsors profile is approved and published.
297
+
267
298
  ## Community
268
299
 
269
300
  [Contributing](CONTRIBUTING.md) · [Code of conduct](CODE_OF_CONDUCT.md) ·
@@ -3,6 +3,6 @@
3
3
  * installed project marker without importing every asset body.
4
4
  */
5
5
  export declare const RUNTIME_ASSET_VERSION = "0.3.89-completion-proof-v1";
6
- export declare const V010_RUNTIME_ASSET_VERSION = "0.14.6-attachment-terra-v1";
6
+ export declare const V010_RUNTIME_ASSET_VERSION = "0.14.8-discovery-fit-v1";
7
7
  export declare const CODEX_SKILL_ASSET_VERSION = "0.14.6-codex-skill-v1";
8
8
  export type RuntimeAssetVersion = typeof RUNTIME_ASSET_VERSION | typeof V010_RUNTIME_ASSET_VERSION | typeof CODEX_SKILL_ASSET_VERSION;
@@ -3,5 +3,5 @@
3
3
  * installed project marker without importing every asset body.
4
4
  */
5
5
  export const RUNTIME_ASSET_VERSION = "0.3.89-completion-proof-v1";
6
- export const V010_RUNTIME_ASSET_VERSION = "0.14.6-attachment-terra-v1";
6
+ export const V010_RUNTIME_ASSET_VERSION = "0.14.8-discovery-fit-v1";
7
7
  export const CODEX_SKILL_ASSET_VERSION = "0.14.6-codex-skill-v1";
@@ -8488,12 +8488,16 @@ export const SortieDogsPlugin = async (input, options) => {
8488
8488
  return settled;
8489
8489
  },
8490
8490
  releaseDirectUnit: async (actor) => {
8491
- await releaseWriteGate(actor);
8491
+ const released = JSON.parse(await releaseWriteGate(actor));
8492
+ if (released.status === "denied")
8493
+ throw new Error(`mission-direct-release:${released.reason}`);
8492
8494
  releaseSessionEnforcement(actor);
8493
8495
  },
8494
8496
  assertDirectUnitQuiescent: async (actor) => {
8495
8497
  if (activeSessions.get(actor)?.inFlightCalls.size)
8496
8498
  throw new Error("mission-direct-tools-running");
8499
+ if (bindingOperations.has(actor))
8500
+ throw new Error("mission-direct-binding-in-flight");
8497
8501
  },
8498
8502
  failDirectUnit: async (root, actor) => {
8499
8503
  const direct = await input.runtimeBridge?.directMissionExecution?.(actor);
@@ -1493,8 +1493,8 @@ export function createProfiledPlugin(profile, assetVersion) {
1493
1493
  }
1494
1494
  async function stop(root, reason, retireRoot = true) {
1495
1495
  const directActor = (await operators.read(root))?.units.find(unit => unit.status === "running" && unit.directExecution)?.directExecution?.actor;
1496
- if (directActor)
1497
- await activateDirect(directActor);
1496
+ // Stopping owned execution does not write its artifacts. Its existing reservation
1497
+ // is reconciled by cancelChildren, even when activation never acquired a writer.
1498
1498
  if (retireRoot)
1499
1499
  retired.add(root);
1500
1500
  if (retireRoot)
@@ -2290,7 +2290,9 @@ export function createProfiledPlugin(profile, assetVersion) {
2290
2290
  record(part.state.metadata) && ["running", "pending", "unknown"].includes(String(part.state.metadata.status)))) {
2291
2291
  return JSON.stringify({ status: "direct-handoff-awaits-tools", next_action: "Finish the existing native command before handing off this unit; retain its result and continue here or delegate afterwards." });
2292
2292
  }
2293
- await activateDirect(actor);
2293
+ // Yielding execution is management, not an artifact write. In particular, a
2294
+ // direct admission can exist even when its writer could not bind because another
2295
+ // live owner overlaps. Do not require that contested binding to hand it off.
2294
2296
  const mission = await missions.retainContext(root, actor, history, notes);
2295
2297
  await operators.handoffDirect(root, actor, await missions.handoffContext(mission));
2296
2298
  }
@@ -3600,7 +3602,7 @@ export function createProfiledPlugin(profile, assetVersion) {
3600
3602
  else if (args.status === "blocked" || args.status === "needs-decision") {
3601
3603
  // This owner is stopping its direct work, not validating it. Keep the
3602
3604
  // failed checks/candidate and settle its existing reservation once.
3603
- const direct = await activateDirect(context.sessionID);
3605
+ const direct = await directExecution(context.sessionID);
3604
3606
  if (direct)
3605
3607
  await control.failDirectUnit(root, context.sessionID);
3606
3608
  }
@@ -4015,7 +4017,11 @@ export function createProfiledPlugin(profile, assetVersion) {
4015
4017
  throw new Error(RUNTIME_PROFILE_SESSION_INACTIVE);
4016
4018
  if (request.tool.startsWith("sortie_") && !request.tool.startsWith(profile.toolPrefix))
4017
4019
  throw new Error("runtime-profile-tool-mismatch");
4018
- const direct = await activateDirect(request.sessionID);
4020
+ // Management can reconcile, yield, stop or report the owner's admission.
4021
+ // They must remain reachable when its artifact binding is the thing in conflict.
4022
+ // Ordinary tools and the parts of planning that actually write still activate it.
4023
+ const direct = request.tool === status || request.tool === planUnits || request.tool === cancel || request.tool === submitMission
4024
+ ? await directExecution(request.sessionID) : await activateDirect(request.sessionID);
4019
4025
  const writer = who.role === "dog-worker" || !!direct || !!await reviewerCorrection(request.sessionID);
4020
4026
  if (who.role === "dog-reviewer" && writer) {
4021
4027
  const correction = (await reviewerCorrection(request.sessionID));
@@ -155,6 +155,17 @@ ${MISSION_DEPENDENCY_WORKFLOW}
155
155
  SAME mission before any Worker starts, retains its Coordinator and cumulative spend, and checks
156
156
  old children before preparing a Worker. This is not permission to discard unchanged acceptance:
157
157
  if the scope is uncertain, ask the user which requirements remain instead of inferring a replacement.
158
+ When execution management is inconsistent or manifest-overlap blocks the owning direct writer,
159
+ explain the observed stop, what can be reconciled, and that the existing requirements, results,
160
+ checks and cumulative spend remain. Offer to recover and continue in ordinary conversation;
161
+ an ordinary affirmative reply or a request to self-recover is enough. No hidden command or ID is
162
+ needed from the user, and ordinary autonomous recovery does not require a new approval.
163
+ Inspect operator_status to reconcile only native-proven ended work. If this session owns a quiescent
164
+ direct admission that cannot bind, plan_units with executor: "worker" and no units yields that same
165
+ unit and reservation without acquiring the contested writer. Explain the result and continue the
166
+ returned Task when its write scope is available. A genuinely live or unproven other owner is not
167
+ released: wait or separate work, and do not dispatch repeated conflicting attempts. Do not invent
168
+ terminal state, validation success, a fresh Mission, or a budget reset.
158
169
  If a Coordinator reports mission-replan-worker-still-active after an interrupted native Task,
159
170
  it cannot call cancel_operator (root-only). Inspect operator_status and the native Task outcome.
160
171
  If the Worker is still active, wait, not duplicate. If the user chose to stop/replan, root calls
@@ -494,6 +505,10 @@ in this SAME session when your existing context makes that efficient. You are no
494
505
  Use the Operator's preferred_executor as a starting recommendation. Start useful work with available context;
495
506
  do not investigate merely to confirm the recommendation. Adapt through actual work, honoring explicit user choices.
496
507
  Use plan_units with executor: "self" for direct work, or start_direct_unit for an already prepared unit.
508
+ If a direct admission cannot bind because of manifest-overlap, operator_status and plan_units with
509
+ executor: "worker" and no units remain management operations: yield only this quiescent owner, retain
510
+ its checks and reservation, and wait for a real conflicting writer rather than evicting it. Continue
511
+ the same Mission and actual remaining work; do not create another Mission to clear the conflict.
497
512
  The host binds your native check results to the candidate; finish_direct_unit closes that work without
498
513
  a Worker handoff. Independent Review and Operator final acceptance still follow. This is not limited to
499
514
  micro-edits. Delegate to the configured Worker when that reduces work/cost or provides useful separation.
package/package.json CHANGED
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "name": "sortie-dogs",
3
- "version": "0.14.6",
4
- "description": "Bounded agent harness and validated orchestration loop plugin for OpenCode",
3
+ "version": "0.14.8",
4
+ "description": "Adaptive execution harness for OpenCode and Codex: goal retention, validation, review, and evidence-backed handoff",
5
5
  "keywords": [
6
6
  "opencode",
7
7
  "opencode-plugin",
8
+ "codex",
9
+ "codex-cli",
8
10
  "ai-orchestration",
9
11
  "multi-agent",
10
12
  "agent-harness",