harness-everything 0.30.8 → 0.30.9
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 +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.github/workflows/ci.yml +31 -0
- package/CHANGELOG.md +7 -0
- package/README.md +1 -1
- package/ci/fixtures/system-one-resident-stub.py +7 -1
- package/ci/mechanism-system-one-resident.test.js +70 -3
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/plugin.json +1 -1
- package/sbom.cdx.json +7 -7
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "harness-everything",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
|
|
13
|
-
"version": "0.30.
|
|
13
|
+
"version": "0.30.9",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Miya Daniel"
|
|
16
16
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harness-everything",
|
|
3
3
|
"description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
|
|
4
|
-
"version": "0.30.
|
|
4
|
+
"version": "0.30.9",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Miya Daniel"
|
|
7
7
|
},
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -29,6 +29,37 @@ jobs:
|
|
|
29
29
|
- name: Run focused mutation checks
|
|
30
30
|
run: npm run test:mutations
|
|
31
31
|
|
|
32
|
+
# Pin the patched version: floating Node 24 already passed before #284.
|
|
33
|
+
system-one-windows-node24-patched:
|
|
34
|
+
runs-on: windows-latest
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v7
|
|
37
|
+
- uses: actions/setup-node@v7
|
|
38
|
+
with:
|
|
39
|
+
node-version: '24.20.0'
|
|
40
|
+
- name: Verify exact patched runtime
|
|
41
|
+
run: node -e "if (process.versions.node !== '24.20.0') process.exit(1)"
|
|
42
|
+
- name: Exercise real evaluator subprocess and repeated resident teardown
|
|
43
|
+
run: node --test ci/mechanism-system-one-resident.test.js
|
|
44
|
+
|
|
45
|
+
# Node >=22 also includes the odd-numbered Node 23 line. Keep its
|
|
46
|
+
# documented Windows shutdown failure visible, without narrowing engines.
|
|
47
|
+
system-one-windows-node-legacy-policy:
|
|
48
|
+
runs-on: windows-latest
|
|
49
|
+
strategy:
|
|
50
|
+
fail-fast: false
|
|
51
|
+
matrix:
|
|
52
|
+
node: ['23.6.0', '24.15.0']
|
|
53
|
+
steps:
|
|
54
|
+
- uses: actions/checkout@v7
|
|
55
|
+
- uses: actions/setup-node@v7
|
|
56
|
+
with:
|
|
57
|
+
node-version: ${{ matrix.node }}
|
|
58
|
+
- name: Verify exact affected runtime
|
|
59
|
+
run: node -e "if (process.versions.node !== '${{ matrix.node }}') process.exit(1)"
|
|
60
|
+
- name: Confirm explicit RS13 skip with version-policy unit coverage
|
|
61
|
+
run: node --test --test-name-pattern="S1-RS00|S1-RS13" ci/mechanism-system-one-resident.test.js
|
|
62
|
+
|
|
32
63
|
runtime-floor:
|
|
33
64
|
runs-on: ubuntu-latest
|
|
34
65
|
steps:
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.30.9](https://github.com/dyphn1/Harness-everything/compare/v0.30.8...v0.30.9) (2026-10-08)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
* **system-one:** cover Windows Node 23 shutdown regression ([75ef983](https://github.com/dyphn1/Harness-everything/commit/75ef9833e4fcfb697c8323836f08eed3dfc7ff8d))
|
|
10
|
+
* **test:** correct Windows Node version policy regex ([c0b63cc](https://github.com/dyphn1/Harness-everything/commit/c0b63cc3f18dc7126e4680f4fa7682ea2a4729ef))
|
|
11
|
+
|
|
5
12
|
## [0.30.8](https://github.com/dyphn1/Harness-everything/compare/v0.30.7...v0.30.8) (2026-10-07)
|
|
6
13
|
|
|
7
14
|
### Bug Fixes
|
package/README.md
CHANGED
|
@@ -48,7 +48,7 @@ The exact "Harness" behavior depends on the installation surface. Claude Code ha
|
|
|
48
48
|
|
|
49
49
|
Harness integrates directly into your workspace. There is no heavy daemon, no paid external APIs, and zero configuration required.
|
|
50
50
|
|
|
51
|
-
**Runtime:** Harness supports **Node.js 22
|
|
51
|
+
**Runtime:** Harness supports **Node.js 22+** (including odd-numbered versions); Node.js **24** is the primary development and CI runtime (`.nvmrc`). **On Windows, System One evaluator subprocess verification should use Node 22 or Node 24.20+**. Node 23.x has a documented Windows process-shutdown assertion ([nodejs/node#56645](https://github.com/nodejs/node/issues/56645)); Node 24.0–24.19 predates the backported libuv fix ([nodejs/node#61999](https://github.com/nodejs/node/pull/61999)) and may likewise crash at process exit (`0xC0000409`). RS13 visibly skips **only** on those Windows versions while retaining the real evaluator subprocess elsewhere. A skip is not a pass or evidence of a fixed Node runtime. CI pins Windows Node 23.6.0 and 24.15.0 to validate their skip policy, and Node 24.20.0 to run the complete subprocess/regression suite. These tests do not reduce the package's general `>=22` engine compatibility claim. The generated current-state runtime/workflow summary is [docs/repository-contract.md](docs/repository-contract.md).
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
# Option A: Claude Code plugin (marketplace manifest included)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Stub scorer behind the real resident server code; never model-quality evidence."""
|
|
2
2
|
import importlib.util
|
|
3
|
+
import json
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
import sys
|
|
5
6
|
import time
|
|
@@ -28,4 +29,9 @@ def factory(weights, manifest):
|
|
|
28
29
|
if __name__ == '__main__':
|
|
29
30
|
if sys.argv[1:2] != ['--serve']:
|
|
30
31
|
sys.exit(2)
|
|
31
|
-
|
|
32
|
+
result = adapter.serve_main(sys.argv[2:], scorer_factory=factory)
|
|
33
|
+
# Deterministic teardown fixture: the state/socket are closed, but PID is
|
|
34
|
+
# deliberately alive to distinguish state unlink from full process exit.
|
|
35
|
+
if json.loads(sys.argv[2]).get('modelId') == 'stub-exit-linger':
|
|
36
|
+
time.sleep(0.5)
|
|
37
|
+
sys.exit(result)
|
|
@@ -29,10 +29,57 @@ function fixture(modelId = 'stub', extra = {}) {
|
|
|
29
29
|
const deps = { command: m => { spawns.push(m.modelId); return [python, [stub, '--serve']]; } };
|
|
30
30
|
return { dir, manifest, manifestPath, spawns, deps };
|
|
31
31
|
}
|
|
32
|
+
// State-file unlink precedes process exit. Windows cleanup must wait for the
|
|
33
|
+
// captured resident PID, not merely for the disappearance of its state file.
|
|
34
|
+
function pidAlive(pid) {
|
|
35
|
+
try { process.kill(pid, 0); return true; }
|
|
36
|
+
catch (err) { return err.code === 'EPERM'; }
|
|
37
|
+
}
|
|
32
38
|
function cleanup(f) {
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
const { state } = resident.stateFiles(f.manifest, f.manifestPath);
|
|
40
|
+
const server = resident.readState(state);
|
|
41
|
+
try { resident.stop(f.manifest, f.manifestPath); } catch (_) { /* best effort after an assertion failure */ }
|
|
42
|
+
const deadline = Date.now() + 7500;
|
|
43
|
+
while ((fs.existsSync(state) || (process.platform === 'win32' && server && pidAlive(server.pid)))
|
|
44
|
+
&& Date.now() < deadline) sleep(25);
|
|
45
|
+
assert.equal(fs.existsSync(state), false, 'resident state must disappear before fixture removal');
|
|
46
|
+
if (process.platform === 'win32' && server) {
|
|
47
|
+
assert.equal(pidAlive(server.pid), false, `detached resident PID ${server.pid} survived shutdown`);
|
|
48
|
+
}
|
|
49
|
+
fs.rmSync(f.dir, { recursive: true, force: true, maxRetries: 20, retryDelay: 50 });
|
|
50
|
+
}
|
|
51
|
+
// Windows Node 23 (nodejs/node#56645) and Node 24 before the fix in
|
|
52
|
+
// 24.20.0 (nodejs/node#61999) can abort during libuv/process shutdown.
|
|
53
|
+
// Preserve RS13's actual evaluator subprocess on unaffected runtimes.
|
|
54
|
+
function windowsNodeShutdownIssue(platform, version) {
|
|
55
|
+
const parts = /^(\d+)\.(\d+)\.(\d+)$/.exec(version);
|
|
56
|
+
if (platform !== 'win32' || !parts) return false;
|
|
57
|
+
const major = Number(parts[1]);
|
|
58
|
+
if (major === 23) {
|
|
59
|
+
return 'Windows Node 23.x has a known process-shutdown assertion (nodejs/node#56645); use Node 22 or Node 24.20+';
|
|
60
|
+
}
|
|
61
|
+
if (major === 24 && Number(parts[2]) < 20) {
|
|
62
|
+
return 'Windows Node 24 < 24.20.0 lacks upstream shutdown fix nodejs/node#61999; use Node 24.20+ or Node 22';
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
35
65
|
}
|
|
66
|
+
const nodeShutdownIssue = windowsNodeShutdownIssue(process.platform, process.versions.node);
|
|
67
|
+
|
|
68
|
+
test('S1-RS00 Windows Node 23 and 24 shutdown compatibility boundary', () => {
|
|
69
|
+
for (const version of ['23.0.0', '23.4.0', '23.6.0', '23.11.1']) {
|
|
70
|
+
assert.match(windowsNodeShutdownIssue('win32', version), /Node 23/);
|
|
71
|
+
assert.equal(windowsNodeShutdownIssue('linux', version), false);
|
|
72
|
+
assert.equal(windowsNodeShutdownIssue('darwin', version), false);
|
|
73
|
+
}
|
|
74
|
+
for (const version of ['24.0.0', '24.15.0', '24.18.0', '24.19.9']) {
|
|
75
|
+
assert.match(windowsNodeShutdownIssue('win32', version), /Node 24/);
|
|
76
|
+
assert.equal(windowsNodeShutdownIssue('linux', version), false);
|
|
77
|
+
}
|
|
78
|
+
for (const version of ['22.16.0', '24.20.0', '24.21.0', '25.0.0', '26.0.0', 'bogus']) {
|
|
79
|
+
assert.equal(windowsNodeShutdownIssue('win32', version), false, version);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
36
83
|
// A client view whose state file names the live server with a wrong token. The server polls only its own
|
|
37
84
|
// state file and exits once that file stops naming it, so rewriting it would race the wrong-token request.
|
|
38
85
|
function wrongTokenView(f) {
|
|
@@ -295,7 +342,7 @@ test('S1-RS12 the evaluator times the async path: no worker thread per warm scor
|
|
|
295
342
|
} finally { cleanup(f); }
|
|
296
343
|
});
|
|
297
344
|
|
|
298
|
-
test('S1-RS13 manifest acceptance thresholds are validated, carried by scored results and applied by the evaluator', async () => {
|
|
345
|
+
test('S1-RS13 manifest acceptance thresholds are validated, carried by scored results and applied by the evaluator', { skip: nodeShutdownIssue }, async () => {
|
|
299
346
|
const acceptance = { minConfidence: 0.6, minMargin: 0.3 };
|
|
300
347
|
const base = fixture();
|
|
301
348
|
try {
|
|
@@ -344,3 +391,23 @@ test('S1-RS14 resident transport names its adapter and stays inside the scripts
|
|
|
344
391
|
assert.throws(() => resident.defaultCommand({ ...f.manifest, adapter: '../evil.py' }));
|
|
345
392
|
} finally { cleanup(f); }
|
|
346
393
|
});
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
// The test server keeps its PID alive for 500 ms after state-file unlink.
|
|
397
|
+
// A state-only teardown passes too early, whereas PID-aware cleanup cannot.
|
|
398
|
+
test('S1-RS15 repeated teardown waits for resident PID and removes every fixture', () => {
|
|
399
|
+
for (let round = 0; round < 6; round++) {
|
|
400
|
+
const f = fixture('stub-exit-linger');
|
|
401
|
+
let pid;
|
|
402
|
+
try {
|
|
403
|
+
assert.equal(resident.ensureReady(f.manifest, f.manifestPath, 20000, f.deps), true);
|
|
404
|
+
const state = resident.readState(resident.stateFiles(f.manifest, f.manifestPath).state);
|
|
405
|
+
assert.ok(state && state.pid > 0);
|
|
406
|
+
pid = state.pid;
|
|
407
|
+
} finally { cleanup(f); }
|
|
408
|
+
assert.equal(fs.existsSync(f.dir), false, `fixture remained after teardown ${round}`);
|
|
409
|
+
if (process.platform === 'win32') {
|
|
410
|
+
assert.equal(pidAlive(pid), false, `resident PID ${pid} leaked in teardown ${round}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "harness-everything",
|
|
4
|
-
"version": "0.30.
|
|
4
|
+
"version": "0.30.9",
|
|
5
5
|
"description": "Invariant-first engineering harness for routing, verification, and failure recovery while preserving agent autonomy.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Miya Daniel",
|
package/sbom.cdx.json
CHANGED
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
"$schema": "https://cyclonedx.org/schema/bom-1.7.schema.json",
|
|
3
3
|
"bomFormat": "CycloneDX",
|
|
4
4
|
"specVersion": "1.7",
|
|
5
|
-
"serialNumber": "urn:uuid:
|
|
5
|
+
"serialNumber": "urn:uuid:fdd6adf4-625c-5667-8d1c-1dd030c7b4a4",
|
|
6
6
|
"version": 1,
|
|
7
7
|
"metadata": {
|
|
8
|
-
"timestamp": "2026-10-
|
|
8
|
+
"timestamp": "2026-10-08T03:48:56.742Z",
|
|
9
9
|
"tools": [
|
|
10
10
|
{
|
|
11
11
|
"vendor": "Harness Everything",
|
|
12
12
|
"name": "generate-sbom.js",
|
|
13
|
-
"version": "0.30.
|
|
13
|
+
"version": "0.30.9"
|
|
14
14
|
}
|
|
15
15
|
],
|
|
16
16
|
"component": {
|
|
17
17
|
"type": "application",
|
|
18
|
-
"bom-ref": "pkg:npm/harness-everything@0.30.
|
|
18
|
+
"bom-ref": "pkg:npm/harness-everything@0.30.9",
|
|
19
19
|
"name": "harness-everything",
|
|
20
|
-
"version": "0.30.
|
|
21
|
-
"purl": "pkg:npm/harness-everything@0.30.
|
|
20
|
+
"version": "0.30.9",
|
|
21
|
+
"purl": "pkg:npm/harness-everything@0.30.9"
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"components": [
|
|
@@ -1999,7 +1999,7 @@
|
|
|
1999
1999
|
]
|
|
2000
2000
|
},
|
|
2001
2001
|
{
|
|
2002
|
-
"ref": "pkg:npm/harness-everything@0.30.
|
|
2002
|
+
"ref": "pkg:npm/harness-everything@0.30.9",
|
|
2003
2003
|
"dependsOn": [
|
|
2004
2004
|
"pkg:npm/%40commitlint/cli@19.8.1",
|
|
2005
2005
|
"pkg:npm/%40commitlint/config-conventional@19.8.1",
|