sortie-dogs 0.13.7 → 0.13.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
@@ -35,10 +35,10 @@ implementation, validation, review, and model routing.
35
35
  Guides: [日本語](docs/guide-ja.md) · [简体中文](docs/guide-zh-CN.md) ·
36
36
  [Testing](docs/testing.md) · [CLI testing](docs/cli-testing.md)
37
37
 
38
- **Current release: [v0.13.7](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.13.7)**
39
- ([release notes](docs/release-v0.13.7.md)). The default Mission runtime retains the `v010`
38
+ **Current release: [v0.13.8](https://github.com/zufall-upon/Sortie-dogs/releases/tag/v0.13.8)**
39
+ ([release notes](docs/release-v0.13.8.md)). The default Mission runtime retains the `v010`
40
40
  profile, command and configuration names for compatibility; these names do not mean v0.10 is installed.
41
- The current asset marker is `0.13.7-review-recovery-v1`.
41
+ The current asset marker is `0.13.8-native-binding-v1`.
42
42
 
43
43
  ## SWE-bench Lite: 170/300 (56.67%)
44
44
 
@@ -48,7 +48,7 @@ The fixed **Sortie-dogs v0.12.24** harness resolved **170 of 300 SWE-bench Lite
48
48
 
49
49
  The single official 300-instance report and frozen predictions are hash-bound in the report. Confirmed inference expense was **$162.99**; a separate **$34.60** of usage has unknown pricing and is held against the campaign cap, **not** counted as known expense. Leaderboard registration and maintainer acceptance are separate from this official local evaluation.
50
50
 
51
- Historical scores below belong to their fixed candidates, not v0.13.7. SWE-bench is a separate,
51
+ Historical scores below belong to their fixed candidates, not v0.13.8. SWE-bench is a separate,
52
52
  optional measurement rather than a mandatory release gate.
53
53
 
54
54
  > **Beta:** v0.13.x is still stabilizing. Runtime behavior,
@@ -93,7 +93,19 @@ existing local bridge loads enforcement and model routing. OpenCode can reload w
93
93
  but replacing an installed dependency may require a full restart. A new chat session alone does not
94
94
  prove the newly installed plugin is loaded.
95
95
 
96
- ## v0.13.7 runtime updates
96
+ ## v0.13.8 runtime updates
97
+
98
+ PR #161 captures native validation bindings through the readable resolved target of a Windows
99
+ directory junction instead of enumerating its failing logical alias. Logical evidence labels,
100
+ link identity and complete target bytes remain bound; unchanged readable junctions retain their
101
+ evidence identity. External-link/cycle handling, actual source/output freshness and Review remain
102
+ unchanged. No new approval, permissions or model changes. The PR's isolated native Windows fixture
103
+ reached independent Review PASS and accepted completion after resuming the same Mission, without
104
+ rerunning its successful check; this does not claim original product recovery or uninterrupted
105
+ single-turn completion. Release receipts: `_testenv/releases/0.13.8/`;
106
+ see [release notes](docs/release-v0.13.8.md).
107
+
108
+ ## v0.13.7 runtime updates (retained)
97
109
 
98
110
  PRs #158/#159 prevent late write-only reports from falsely invalidating bound non-generating
99
111
  native checks, while preserving actual source/output freshness, failed checks and legacy recipes.
@@ -436,7 +448,7 @@ register stable and `v010` from the same package installation path in one host.
436
448
  Project-local installation is recommended. To expose the current Mission assets globally:
437
449
 
438
450
  ```sh
439
- npm install --global sortie-dogs@0.13.7
451
+ npm install --global sortie-dogs@0.13.8
440
452
  sortie-dogs init --global --profile v010
441
453
  ```
442
454
 
@@ -448,7 +460,7 @@ can resolve a **separate dependency** under that config root. Updating npm-globa
448
460
  it. For that layout, also install the same release at the actual config root, then rerun global init:
449
461
 
450
462
  ```sh
451
- npm install --prefix "$HOME/.config/opencode" sortie-dogs@0.13.7
463
+ npm install --prefix "$HOME/.config/opencode" sortie-dogs@0.13.8
452
464
  sortie-dogs init --global --profile v010
453
465
  ```
454
466
 
@@ -471,7 +483,7 @@ version, preserves user configuration, and stops safely on unknown ownership or
471
483
  conflicting files.
472
484
 
473
485
  Align any exact version pin or separate bridge dependency with the intended release too. An installed
474
- marker of `0.13.7-review-recovery-v1` identifies the assets; it does not prove an already-running
486
+ marker of `0.13.8-native-binding-v1` identifies the assets; it does not prove an already-running
475
487
  OpenCode process has reloaded the plugin.
476
488
 
477
489
  There is no supported uninstall command. Remove the npm dependency separately,
@@ -3,5 +3,5 @@
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.13.7-review-recovery-v1";
6
+ export declare const V010_RUNTIME_ASSET_VERSION = "0.13.8-native-binding-v1";
7
7
  export type RuntimeAssetVersion = typeof RUNTIME_ASSET_VERSION | typeof V010_RUNTIME_ASSET_VERSION;
@@ -3,4 +3,4 @@
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.13.7-review-recovery-v1";
6
+ export const V010_RUNTIME_ASSET_VERSION = "0.13.8-native-binding-v1";
@@ -92,7 +92,7 @@ async function protectedScopeDigest(projectRoot, paths, manifestHash, sourcePoli
92
92
  const entries = [];
93
93
  const canonicalRoot = await realpath(projectRoot);
94
94
  const scratchExcluded = binding ? snapshotScratchExclusion(binding) : () => false;
95
- const visit = async (absolute, ancestors = new Set(), projectArtifacts = false) => {
95
+ const visit = async (absolute, ancestors = new Set(), projectArtifacts = false, physical = absolute) => {
96
96
  if (excluded.some(root => !outside(root, absolute)))
97
97
  return true;
98
98
  if (scratchExcluded(absolute))
@@ -102,7 +102,7 @@ async function protectedScopeDigest(projectRoot, paths, manifestHash, sourcePoli
102
102
  return false;
103
103
  if ((sourcePolicy === "project-files-v1" || projectArtifacts) && isRuntimeControlPath(scoped))
104
104
  return true;
105
- const metadata = await lstat(absolute).catch((error) => {
105
+ const metadata = await lstat(physical).catch((error) => {
106
106
  if (error.code === "ENOENT")
107
107
  return undefined;
108
108
  throw error;
@@ -112,7 +112,7 @@ async function protectedScopeDigest(projectRoot, paths, manifestHash, sourcePoli
112
112
  return true;
113
113
  }
114
114
  if (metadata.isSymbolicLink()) {
115
- const target = await realpath(absolute).catch(() => undefined);
115
+ const target = await realpath(physical).catch(() => undefined);
116
116
  if (target === undefined)
117
117
  return false;
118
118
  const relativeTarget = relative(canonicalRoot, target);
@@ -120,13 +120,16 @@ async function protectedScopeDigest(projectRoot, paths, manifestHash, sourcePoli
120
120
  ancestors.has(target))
121
121
  return false;
122
122
  const targetMetadata = await stat(target);
123
- const link = await readlink(absolute);
123
+ const link = await readlink(physical);
124
124
  if (targetMetadata.isDirectory()) {
125
125
  // Keep the logical scope path and link target in the digest; do not follow external links or cycles.
126
126
  entries.push([scoped, `symlink:${link}`]);
127
127
  const next = new Set([...ancestors, target]);
128
- for (const child of (await readdir(absolute)).sort())
129
- if (!await visit(join(absolute, child), next, projectArtifacts))
128
+ // Windows compatibility junctions can deny enumeration through the alias while
129
+ // their resolved directory remains readable. Traverse the already resolved target.
130
+ // Retain logical entry labels so unchanged existing evidence keeps its identity.
131
+ for (const child of (await readdir(target)).sort())
132
+ if (!await visit(join(absolute, child), next, projectArtifacts, join(target, child)))
130
133
  return false;
131
134
  return true;
132
135
  }
@@ -136,19 +139,19 @@ async function protectedScopeDigest(projectRoot, paths, manifestHash, sourcePoli
136
139
  return true;
137
140
  }
138
141
  if (metadata.isDirectory()) {
139
- const real = await realpath(absolute);
142
+ const real = await realpath(physical);
140
143
  if (ancestors.has(real))
141
144
  return false;
142
145
  entries.push([scoped, "directory"]);
143
146
  const next = new Set([...ancestors, real]);
144
- for (const child of (await readdir(absolute)).sort())
145
- if (!await visit(join(absolute, child), next, projectArtifacts))
147
+ for (const child of (await readdir(physical)).sort())
148
+ if (!await visit(join(absolute, child), next, projectArtifacts, join(physical, child)))
146
149
  return false;
147
150
  return true;
148
151
  }
149
152
  if (!metadata.isFile())
150
153
  return false;
151
- entries.push([scoped, "file", createHash("sha256").update(await readFile(absolute)).digest("hex")]);
154
+ entries.push([scoped, "file", createHash("sha256").update(await readFile(physical)).digest("hex")]);
152
155
  return true;
153
156
  };
154
157
  for (const path of [...new Set(paths)].sort()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sortie-dogs",
3
- "version": "0.13.7",
3
+ "version": "0.13.8",
4
4
  "description": "Bounded agent harness and validated orchestration loop plugin for OpenCode",
5
5
  "keywords": [
6
6
  "opencode",