harness-everything 0.31.1 → 0.31.3

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.
Files changed (38) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +30 -0
  4. package/bin/cli.js +1 -0
  5. package/ci/lib/isolated-test-process.js +30 -0
  6. package/ci/mechanism-2al-codex-hooks-compat.test.js +14 -14
  7. package/ci/mechanism-2ao-plugin-sync.test.js +19 -2
  8. package/ci/mechanism-2as-workflow-disposition-help.test.js +41 -0
  9. package/ci/mechanism-2at-fable-execution-phases.test.js +46 -0
  10. package/ci/mechanism-2au-codex-runtime-safety.test.js +340 -0
  11. package/ci/mechanism-2av-test-home-isolation.test.js +48 -0
  12. package/ci/mechanism-test.js +2 -2
  13. package/docs/platform-capabilities.md +4 -0
  14. package/docs/platform-compatibility.json +1 -1
  15. package/fable-mode/SKILL.md +1 -1
  16. package/fable-mode/execution-guardrails/SKILL.md +1 -1
  17. package/fable-mode/fable-haiku/SKILL.md +1 -1
  18. package/fable-mode/fable-opus/SKILL.md +1 -1
  19. package/fable-mode/fable-sonnet/SKILL.md +1 -1
  20. package/fable-mode/references/execution-phases.md +93 -25
  21. package/hooks/scripts/workflow-disposition.js +4 -0
  22. package/opencode-plugin/plugin.json +1 -1
  23. package/package.json +2 -2
  24. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  25. package/plugins/harness-everything/hooks/scripts/workflow-disposition.js +4 -0
  26. package/plugins/harness-everything/plugin.json +1 -1
  27. package/plugins/harness-everything/skills/fable-mode/SKILL.md +1 -1
  28. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +1 -1
  29. package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +1 -1
  30. package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +1 -1
  31. package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +1 -1
  32. package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +93 -25
  33. package/plugins/harness-everything/skills/self-evolve/SKILL.md +1 -1
  34. package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +8 -6
  35. package/sbom.cdx.json +12 -12
  36. package/scripts/codex-hooks-compat.js +265 -25
  37. package/self-evolve/SKILL.md +1 -1
  38. package/self-evolve/scripts/self-regression.js +8 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "harness-enforcement",
3
3
  "description": "Repository inventory for the opencode enforcement plugin and its standalone helper",
4
- "version": "0.31.1",
4
+ "version": "0.31.3",
5
5
  "runtime": "index.mjs",
6
6
  "hooks": {
7
7
  "verify": "hooks/verify.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-everything",
3
- "version": "0.31.1",
3
+ "version": "0.31.3",
4
4
  "description": "Harness OS: An Orchestrated Agent Operating System for AI-driven Development",
5
5
  "main": "harness-everything/scripts/bootstrap.js",
6
6
  "bin": {
@@ -63,7 +63,7 @@
63
63
  "waza:check": "node scripts/waza-harness-check.js",
64
64
  "test:waza:compat": "node ci/mechanism-2aj-waza-reference-adapter.test.js",
65
65
  "codex:hooks": "node scripts/codex-hooks-compat.js",
66
- "test:codex:hooks-compat": "node ci/mechanism-2al-codex-hooks-compat.test.js"
66
+ "test:codex:hooks-compat": "node ci/mechanism-2al-codex-hooks-compat.test.js && node ci/mechanism-2au-codex-runtime-safety.test.js"
67
67
  },
68
68
  "engines": {
69
69
  "node": ">=22"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-everything",
3
- "version": "0.31.1",
3
+ "version": "0.31.3",
4
4
  "description": "Invariant-first engineering harness for routing, verification, and failure recovery while preserving agent autonomy.",
5
5
  "author": {
6
6
  "name": "Miya Daniel",
@@ -149,6 +149,10 @@ function activatePlan(workflow, plan) {
149
149
  }
150
150
 
151
151
  function main() {
152
+ if (process.argv[2] === '--help' || process.argv[2] === '-h') {
153
+ process.stdout.write(usage() + '\n');
154
+ return;
155
+ }
152
156
  const args = parseArgs(process.argv.slice(2));
153
157
  if (!WORKFLOW_CONTROLLER_COMMANDS.has(args.command)) throw new Error(usage());
154
158
  const sessionId = args.sessionId || readCurrentSession(getWorkspaceRoot());
@@ -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.31.1",
4
+ "version": "0.31.3",
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",
@@ -4,7 +4,7 @@ description: "Stage large tasks through plans, named fable agents, failable chec
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Miya Daniel
7
- version: 0.31.0
7
+ version: 0.31.3
8
8
  ---
9
9
 
10
10
  # Fable Mode
@@ -4,7 +4,7 @@ description: "Reference guardrails for verified warnings and safe replacements;
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Miya Daniel
7
- version: 0.31.0
7
+ version: 0.31.3
8
8
  ---
9
9
 
10
10
  # Execution Guardrails
@@ -4,7 +4,7 @@ description: "Reference mechanical behavior profile (legacy alias haiku) for bul
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Miya Daniel
7
- version: 0.31.0
7
+ version: 0.31.3
8
8
  ---
9
9
 
10
10
  # Fable Mode — Haiku
@@ -4,7 +4,7 @@ description: "Reference orchestrator behavior profile (legacy alias opus) for st
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Miya Daniel
7
- version: 0.31.0
7
+ version: 0.31.3
8
8
  ---
9
9
 
10
10
  # Fable Mode — Opus
@@ -4,7 +4,7 @@ description: "Reference reasoning behavior profile (legacy alias sonnet/sonnect)
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Miya Daniel
7
- version: 0.31.0
7
+ version: 0.31.3
8
8
  ---
9
9
 
10
10
  # Fable Mode — Sonnet
@@ -2,37 +2,105 @@
2
2
 
3
3
  ```mermaid
4
4
  flowchart TD
5
- Start[Qualifying Tier 3 task] --> Discover[Discover sources, runtime, and authorized scope]
6
- Discover --> Plan[Write stage map and pass conditions]
7
- Plan --> Select[Resolve requested model and write audit record]
8
- Select --> Delegate[Delegate to named agent or visible inline fallback]
9
- Delegate --> Contract[Write stage contract]
10
- Contract --> Verify[Run the named failable check]
11
- Verify --> Review[Cold-review high-stakes deliverables]
12
- Review --> Done[Record result or escalate blocker]
5
+ Start[Qualifying Tier 3 task] --> Discover[Discover runtime and authorized scope]
6
+ Discover --> Profile[Resolve behavior profile and runtime choice]
7
+ Profile --> Plan[Write dependency-aware stage map and checks]
8
+ Plan --> Register[Write workflow-stages.json in session state]
9
+ Register --> Execute[Start workflow-disposition and execute ready stages]
10
+ Execute --> Check[Run exact check and record correlated evidence]
11
+ Check --> Review[Cold-review when the selected plan requires it]
12
+ Review --> Done[Record result or blocker]
13
13
  ```
14
14
 
15
15
  ## Discovery and planning
16
16
 
17
- Read the relevant files and sources before producing an artifact. Lock the
18
- authorized write scope in the handoff. Number the stages, assign one artifact
19
- and one pass condition to each. Replan counts are advisory and never a hard
20
- stop; three same-signature failures still require Rule-of-3 `zoom-out`.
17
+ Read relevant files and sources before producing an artifact. Record the
18
+ authorized write scope. Give each stage an objective, dependencies, write set,
19
+ expected output, exact check command, and pass condition. Required and optional
20
+ bindings belong on the stage that needs them. Replan counts are advisory; after
21
+ three same-signature failures, use Rule-of-3 `zoom-out`.
21
22
 
22
- ## Delegation
23
+ ## Profiles and delegation
23
24
 
24
- Use `fable-orchestrator` for Opus macro work, `fable-worker-sonnet` for
25
- reasoning and synthesis, and `fable-worker-haiku` for mechanical work. Brief
26
- each worker with its exact output path, context, audit record, and check.
27
- Workers do not spawn workers. If the named agent is unavailable, choose the
28
- explicit inline fallback or stop and escalate; do not silently change models.
25
+ Resolve a requested behavior profile with Fable's profile selector and record
26
+ it separately from the runtime choice. `fable-orchestrator`,
27
+ `fable-worker-sonnet`, and `fable-worker-haiku` name coordination,
28
+ reasoning/synthesis, and mechanical-work roles. These are behavior-profile
29
+ aliases; they do not switch the runtime model. Preserve an explicit user or
30
+ host runtime choice. Workers do not spawn workers. If a named worker is
31
+ unavailable, use a declared inline fallback or report the gap.
29
32
 
30
- ## Verification and handoff
33
+ ## Active workflow
34
+
35
+ For an active mandatory workflow, use the router-displayed session path for
36
+ `workflow-stages.json` and the router-displayed `workflow-disposition.js`
37
+ controller. Do not register active stages in a repository-local contracts
38
+ directory. Every required stage needs `dependsOn`, `writeSet`, `checkCommand`,
39
+ and `passCondition`; an independent plan also needs a read-only `fable-verifier`
40
+ stage that depends on all implementation stages.
41
+
42
+ Start the selected run with the controller path and session id from the router:
43
+
44
+ ```bash
45
+ node "<workflow-disposition.js path from the router>" start --session-id "<session-id>"
46
+ ```
47
+
48
+ The controller creates correlated run-scoped contracts. Load only bindings on
49
+ dependency-ready stages. Record each disposition with evidence:
50
+
51
+ ```bash
52
+ node "<workflow-disposition.js path from the router>" stage-binding \
53
+ --session-id "<session-id>" --stage-id "<stage-id>" \
54
+ --binding-id "<binding-id>" --disposition loaded \
55
+ --evidence "Read the resolved required reference for this stage."
56
+ ```
57
+
58
+ Run the exact `checkCommand`; the post-tool `contract-test.js` records the
59
+ session, run, stage, worker identity, numeric exit code, and check evidence. If
60
+ bindings are unresolved, resolve them and rerun the exact check before passing
61
+ the stage. Keep results under the run's `contracts/<stageId>.json` and
62
+ `evidence/<stageId>.json` records. Stage checks, required bindings, and selected
63
+ independent verification remain semantic MUSTs. The controller and lifecycle
64
+ hooks are reminder-only: unresolved evidence stays visible without locking
65
+ ordinary tools or Stop. See [`../CONTRACT-FORMAT.md`](../CONTRACT-FORMAT.md) for
66
+ the schema and correlation rules.
67
+
68
+ ## Blocked recovery
31
69
 
32
- Before each spot-check, create `.claude/harness-everything/state/contracts/<stage>.json`
33
- using `CONTRACT-FORMAT.md`, then run the exact command in that contract. A
34
- stage is not complete until the command passes and the audit record contains
35
- the verifier result. Use `fable-verifier` with only the spec and artifact for
36
- high-stakes or unsupervised delivery. Review scope-guard output before merging.
70
+ If `start` is called while the workflow is running, it exits 2 with
71
+ `workflow already running; record a blocker before replanning`. From that
72
+ running state, record evidence with `block`:
73
+
74
+ ```bash
75
+ node "<workflow-disposition.js path from the router>" block \
76
+ --session-id "<session-id>" \
77
+ --evidence "The current stage map needs a bounded recovery update."
78
+ ```
79
+
80
+ Update the same session's `workflow-stages.json`, retaining the approved
81
+ requirements, workflow selection, dependencies, and required bindings. Then
82
+ start the revised stage map:
83
+
84
+ ```bash
85
+ node "<workflow-disposition.js path from the router>" start --session-id "<session-id>"
86
+ ```
87
+
88
+ This starts a new run and clears the recorded block reason. If the session is
89
+ already `blocked`, update its stage map and run `start` directly. Do not call
90
+ `plan` from `blocked`: planning is accepted only while the workflow is pending
91
+ or active. When an explicitly authorized scope change requires new requirement
92
+ composition, route a new session instead of replacing approved requirements.
93
+
94
+ ## Legacy/manual fallback
95
+
96
+ The path `.claude/harness-everything/state/contracts/<stage>.json` belongs only
97
+ to an explicitly selected legacy/manual workflow without an active mandatory
98
+ run. It does not register stages or correlated evidence for the current
99
+ workflow controller. Do not use it for an active Fable workflow.
100
+
101
+ ## Verification and handoff
37
102
 
38
- When macro scaffolding ends, transition to `tdd` for focused implementation.
103
+ Run each named check and review scope-guard evidence before delivery. When the
104
+ selected plan requires independent verification, the verifier is read-only and
105
+ uses a distinct worker identity after all other stages pass. Record a blocker
106
+ or an evidence-backed result; do not discard unresolved requirements.
@@ -4,7 +4,7 @@ description: "Extract root causes from resolved problems and persist them as def
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Miya Daniel
7
- version: 0.12.0
7
+ version: 0.31.3
8
8
  ---
9
9
 
10
10
  # Self-evolve
@@ -6,7 +6,6 @@
6
6
  * their results must not be confused with a local tracker simulation.
7
7
  */
8
8
 
9
- const { spawnSync } = require('child_process');
10
9
  const path = require('path');
11
10
  const fs = require('fs');
12
11
 
@@ -22,12 +21,15 @@ if (pkgName !== 'harness-everything') {
22
21
  process.exit(0);
23
22
  }
24
23
 
24
+ // This development-only helper is absent from installed skill packages.
25
+ const { spawnTestNode } = require('../../ci/lib/isolated-test-process');
26
+
25
27
  console.log('=================================================');
26
28
  console.log(' Harness OS - Self-Regression Test Suite ');
27
29
  console.log('=================================================');
28
30
 
29
31
  function runNode(label, script, args = [], options = {}) {
30
- const result = spawnSync('node', [script, ...args], {
32
+ const result = spawnTestNode([script, ...args], {
31
33
  cwd: projectRoot,
32
34
  stdio: 'inherit',
33
35
  ...options,
@@ -54,7 +56,7 @@ function walkDir(dir) {
54
56
  }
55
57
  for (const folder of foldersToScan) walkDir(path.join(projectRoot, folder));
56
58
  for (const file of jsFiles) {
57
- const check = spawnSync('node', ['--check', file]);
59
+ const check = spawnTestNode(['--check', file]);
58
60
  if (check.status !== 0) {
59
61
  console.error(` FAIL syntax: ${path.relative(projectRoot, file)}`);
60
62
  console.error(check.stderr.toString().trim());
@@ -65,7 +67,7 @@ console.log(` PASS syntax: ${jsFiles.length} JavaScript file(s)`);
65
67
 
66
68
  console.log('\n[Phase 1b] CLI Command Smoke Test...');
67
69
  const cliPath = path.join(projectRoot, 'bin', 'cli.js');
68
- const nextCheck = spawnSync('node', [cliPath, 'next', 'add a new login endpoint with tests'], { cwd: projectRoot });
70
+ const nextCheck = spawnTestNode([cliPath, 'next', 'add a new login endpoint with tests'], { cwd: projectRoot });
69
71
  if (nextCheck.status !== 0 || !nextCheck.stdout.toString().includes('RECOMMENDED TIER')) {
70
72
  console.error(' FAIL `harness next` did not produce a routing recommendation.');
71
73
  hasErrors = true;
@@ -73,7 +75,7 @@ if (nextCheck.status !== 0 || !nextCheck.stdout.toString().includes('RECOMMENDED
73
75
  console.error(' FAIL `harness next` did not establish the invariant-first kernel contract.');
74
76
  hasErrors = true;
75
77
  } else console.log(' PASS `harness next` produced routing + invariant contract.');
76
- const verifyCheck = spawnSync('node', [cliPath, 'verify'], {
78
+ const verifyCheck = spawnTestNode([cliPath, 'verify'], {
77
79
  cwd: projectRoot,
78
80
  env: { ...process.env, HARNESS_SKIP_PROJECT_CHECKS: '1' },
79
81
  });
@@ -105,7 +107,7 @@ runNode('behavioral case validation', path.join(projectRoot, 'behavioral-evals',
105
107
  console.log('\n[Phase 3b] Fable Model Mode Contract Tests...');
106
108
  const fableModeTestPath = path.join(projectRoot, 'ci', 'fable-mode-test.js');
107
109
  if (fs.existsSync(fableModeTestPath)) {
108
- const fableModeCheck = spawnSync('node', [fableModeTestPath], { stdio: 'inherit', cwd: projectRoot });
110
+ const fableModeCheck = spawnTestNode([fableModeTestPath], { stdio: 'inherit', cwd: projectRoot });
109
111
  if (fableModeCheck.status !== 0) {
110
112
  console.error("\n ❌ Fable model mode contract suite failed!");
111
113
  hasErrors = true;
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:1eaedc2c-236e-55be-b84d-9f710a2e88a2",
5
+ "serialNumber": "urn:uuid:8fcaff79-dd3a-5e6d-8ae9-f34d935267de",
6
6
  "version": 1,
7
7
  "metadata": {
8
- "timestamp": "2026-10-13T09:35:47.413Z",
8
+ "timestamp": "2026-10-16T05:41:55.836Z",
9
9
  "tools": [
10
10
  {
11
11
  "vendor": "Harness Everything",
12
12
  "name": "generate-sbom.js",
13
- "version": "0.31.1"
13
+ "version": "0.31.3"
14
14
  }
15
15
  ],
16
16
  "component": {
17
17
  "type": "application",
18
- "bom-ref": "pkg:npm/harness-everything@0.31.1",
18
+ "bom-ref": "pkg:npm/harness-everything@0.31.3",
19
19
  "name": "harness-everything",
20
- "version": "0.31.1",
21
- "purl": "pkg:npm/harness-everything@0.31.1"
20
+ "version": "0.31.3",
21
+ "purl": "pkg:npm/harness-everything@0.31.3"
22
22
  }
23
23
  },
24
24
  "components": [
@@ -920,15 +920,15 @@
920
920
  },
921
921
  {
922
922
  "type": "library",
923
- "bom-ref": "pkg:npm/fast-uri@3.1.6",
923
+ "bom-ref": "pkg:npm/fast-uri@3.1.8",
924
924
  "name": "fast-uri",
925
- "version": "3.1.6",
925
+ "version": "3.1.8",
926
926
  "scope": "excluded",
927
- "purl": "pkg:npm/fast-uri@3.1.6",
927
+ "purl": "pkg:npm/fast-uri@3.1.8",
928
928
  "hashes": [
929
929
  {
930
930
  "alg": "SHA-512",
931
- "content": "7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q=="
931
+ "content": "GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg=="
932
932
  }
933
933
  ]
934
934
  },
@@ -1896,7 +1896,7 @@
1896
1896
  "ref": "pkg:npm/ajv@8.20.0",
1897
1897
  "dependsOn": [
1898
1898
  "pkg:npm/fast-deep-equal@3.1.3",
1899
- "pkg:npm/fast-uri@3.1.6",
1899
+ "pkg:npm/fast-uri@3.1.8",
1900
1900
  "pkg:npm/json-schema-traverse@1.0.0",
1901
1901
  "pkg:npm/require-from-string@2.0.2"
1902
1902
  ]
@@ -1999,7 +1999,7 @@
1999
1999
  ]
2000
2000
  },
2001
2001
  {
2002
- "ref": "pkg:npm/harness-everything@0.31.1",
2002
+ "ref": "pkg:npm/harness-everything@0.31.3",
2003
2003
  "dependsOn": [
2004
2004
  "pkg:npm/%40commitlint/cli@19.8.1",
2005
2005
  "pkg:npm/%40commitlint/config-conventional@19.8.1",