harness-everything 0.18.0 → 0.19.0
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/AGENTS.md +1 -1
- package/CHANGELOG.md +13 -0
- package/README.md +8 -1
- package/bin/cli.js +16 -0
- package/ci/invariant-routing.test.js +8 -5
- package/ci/mechanism-2ao-plugin-sync.test.js +163 -0
- package/docs/architecture.md +12 -9
- package/docs/platform-capabilities.md +22 -2
- package/docs/platform-compatibility.json +4 -4
- package/docs/routing.md +11 -8
- package/docs/troubleshooting.md +8 -0
- package/docs/workflow-runtime.md +11 -8
- package/harness-everything/SKILL.md +3 -3
- package/harness-everything/references/triage-and-tiers.md +14 -9
- package/harness-everything/scripts/kernel-router-core.js +12 -8
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +4 -2
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/scripts/lib/advisory-text.js +9 -8
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +3 -3
- package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +14 -9
- package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router-core.js +12 -8
- package/scripts/lib/advisory-text.js +9 -8
- package/scripts/plugin-sync.js +465 -0
- package/scripts/plugin-sync.ps1 +5 -0
- package/scripts/plugin-sync.sh +5 -0
|
@@ -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.
|
|
13
|
+
"version": "0.19.0",
|
|
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.
|
|
4
|
+
"version": "0.19.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Miya Daniel"
|
|
7
7
|
},
|
package/AGENTS.md
CHANGED
|
@@ -41,7 +41,7 @@ The retained [OpenCode evidence](benchmarks/results/live-host/opencode-2026-09-1
|
|
|
41
41
|
8. **CHANGELOG.md keeps pending human-authored notes under `[Unreleased]`.** Semantic-release owns stable headings/tags/release notes.
|
|
42
42
|
9. **Conventional Commit type is release input.** Breaking→major; `feat`→minor; `fix`/`perf`/`refactor`/`build`/`revert`→patch; docs/test/ci/style/chore do not release by themselves.
|
|
43
43
|
10. **Selected workflow is planning guidance; reasoning and execution stay flexible.** Before omitting a suggested skill, read/evaluate its complete `SKILL.md` flow. Do not turn routing into a universal TODO/TDD/Fable sequence. Missing workflow evidence should produce a reminder, not a persistent Harness lock.
|
|
44
|
-
11. **User-visible Harness Status is mandatory for non-trivial work.**
|
|
44
|
+
11. **User-visible Harness Status is mandatory for non-trivial work.** Render one readable Markdown block headed `### 🚦 Harness Status`, with bullet-aligned bold `Current`, `Read / Evidence`, `Next`, plus optional `Risk / Blocked`; use nested evidence bullets when useful. Emit it before substantive execution, after major phases, on direction changes, during long work at meaningful boundaries, and before final completion. The routing checkpoint is internal source state, not a second user-facing block. This semantic MUST does not create a hard lock.
|
|
45
45
|
12. **Prefer Git worktree isolation for major mutation.** Read-only discovery may stay in the bound repository. Tier 3 / Fable source and artifact changes should use a verified linked worktree when practical; failure to create one is a prominent risk reminder, not a Harness-owned deadlock. See [workflow-runtime.md](docs/workflow-runtime.md).
|
|
46
46
|
|
|
47
47
|
## Verification Before You Claim Done
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.19.0](https://github.com/dyphn1/Harness-everything/compare/v0.18.1...v0.19.0) (2026-09-21)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **distribution:** add cross-platform plugin install/update command ([0566bf3](https://github.com/dyphn1/Harness-everything/commit/0566bf347feab785af829e0f257fa22899f5c259))
|
|
10
|
+
|
|
11
|
+
## [0.18.1](https://github.com/dyphn1/Harness-everything/compare/v0.18.0...v0.18.1) (2026-09-21)
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **status:** keep presentation contract compact ([942c2a3](https://github.com/dyphn1/Harness-everything/commit/942c2a30a4281d6f07e83bca91977991e53d04ea))
|
|
16
|
+
* **status:** restore readable visual hierarchy ([63223b2](https://github.com/dyphn1/Harness-everything/commit/63223b2eac86926b154b5a90072216fd9e761342))
|
|
17
|
+
|
|
5
18
|
## [0.18.0](https://github.com/dyphn1/Harness-everything/compare/v0.17.0...v0.18.0) (2026-09-21)
|
|
6
19
|
|
|
7
20
|
### Features
|
package/README.md
CHANGED
|
@@ -58,6 +58,11 @@ Harness integrates directly into your workspace. There is no heavy daemon, no pa
|
|
|
58
58
|
# Option B: install Harness hooks/skills/advisory integrations into your workspace
|
|
59
59
|
npx github:dyphn1/Harness-everything install
|
|
60
60
|
|
|
61
|
+
# Option C: install or update the native Claude Code/Codex plugin
|
|
62
|
+
# npx github:dyphn1/Harness-everything plugin-sync
|
|
63
|
+
# ./scripts/plugin-sync.sh # POSIX shells / Git Bash
|
|
64
|
+
# powershell -File scripts/plugin-sync.ps1 # Windows PowerShell
|
|
65
|
+
|
|
61
66
|
# OpenAI/Codex local plugin packaging is repository-owned under:
|
|
62
67
|
# .agents/plugins/marketplace.json
|
|
63
68
|
# plugins/harness-everything/.codex-plugin/plugin.json
|
|
@@ -69,7 +74,7 @@ npx github:dyphn1/Harness-everything install
|
|
|
69
74
|
2. **Preflight / session context where packaged:** Hook-capable surfaces can inject environment/session context automatically; advisory-only surfaces must not be described as if they do.
|
|
70
75
|
3. **Verification boundary:** Completion claims require objective evidence; whether that boundary is mechanically invoked or explicitly called depends on the host surface.
|
|
71
76
|
4. **Mandatory applicable workflow:** Evaluate each suggested skill's complete `SKILL.md` before omission, then resolve the selected topology with objective evidence. Reasoning and implementation remain flexible; escape applies only to a declared uncovered stage with evidence. Tier 3 / Fable mutation requires a verified Git worktree. See the [workflow runtime contract](docs/workflow-runtime.md) for entry, completion, and host limits. Harness does not impose one universal TODO/TDD/Fable sequence.
|
|
72
|
-
5. **Unified user-visible status:** For non-trivial software/project work, the agent MUST
|
|
77
|
+
5. **Unified user-visible status:** For non-trivial software/project work, the agent MUST render one scannable Markdown `### 🚦 Harness Status` block with bold bullet labels for `Current`, `Read / Evidence`, `Next`, plus optional `Risk / Blocked`; multiple evidence items may use nested bullets. Use it at major phase/direction boundaries and before final completion. The routing checkpoint remains internal source state. This is a communication contract, not a hard runtime lock.
|
|
73
78
|
|
|
74
79
|
### What Gets Installed (and How to Remove It)
|
|
75
80
|
|
|
@@ -90,6 +95,8 @@ For `--global`, the installer uses each host's supported user-level skill locati
|
|
|
90
95
|
|
|
91
96
|
The repository also ships a separate local OpenAI/Codex plugin package under `plugins/harness-everything/` with marketplace metadata in `.agents/plugins/marketplace.json`. That package is not the same thing as the `--codex` advisory installer path. The public OpenAI Skills-only upload is narrower again; see [docs/openai-plugin.md](docs/openai-plugin.md).
|
|
92
97
|
|
|
98
|
+
The native `plugin-sync` command detects the installed host CLIs and applies the state-specific operation: an absent plugin is installed, while an already-installed plugin is explicitly updated (Claude Code) or its configured marketplace is upgraded (Codex). If a host cannot report plugin state, the command fails closed without installing or updating blindly.
|
|
99
|
+
|
|
93
100
|
The installer records its state directories in `.git/info/exclude` — a local-only git ignore file — so Harness state never lands in a commit and your working tree (including `.gitignore`) is never modified. Everything owned by the general installer is removed with the built-in uninstaller:
|
|
94
101
|
|
|
95
102
|
```bash
|
package/bin/cli.js
CHANGED
|
@@ -40,6 +40,9 @@ switch (command) {
|
|
|
40
40
|
case 'codex-hooks':
|
|
41
41
|
runCodexHooksCompat(args.slice(1));
|
|
42
42
|
break;
|
|
43
|
+
case 'plugin-sync':
|
|
44
|
+
runPluginSync(args.slice(1));
|
|
45
|
+
break;
|
|
43
46
|
default:
|
|
44
47
|
console.error(`[Error] Unknown command: "${command}"`);
|
|
45
48
|
showHelp();
|
|
@@ -104,6 +107,9 @@ Commands:
|
|
|
104
107
|
that fail to mount enabled plugin-bundled hooks.
|
|
105
108
|
Usage: harness codex-hooks <install|status|uninstall>
|
|
106
109
|
Does not trust hooks or modify Codex config.toml.
|
|
110
|
+
plugin-sync Install or update the native Harness plugin on Claude Code
|
|
111
|
+
and Codex. Existing installations always take the update
|
|
112
|
+
path. Supports --host, --dry-run, and --json.
|
|
107
113
|
verify Run the pre-delivery verification gate (lint/test from the
|
|
108
114
|
nearest package.json). Exits non-zero if checks fail. This is
|
|
109
115
|
the explicit stand-in for a hard stop gate on platforms where
|
|
@@ -179,3 +185,13 @@ function runCodexHooksCompat(compatArgs) {
|
|
|
179
185
|
const result = spawnSync('node', [script, ...compatArgs], { stdio: 'inherit' });
|
|
180
186
|
process.exit(result.status === null ? 1 : result.status);
|
|
181
187
|
}
|
|
188
|
+
|
|
189
|
+
function runPluginSync(pluginArgs) {
|
|
190
|
+
const script = path.resolve(__dirname, '..', 'scripts', 'plugin-sync.js');
|
|
191
|
+
if (!fs.existsSync(script)) {
|
|
192
|
+
console.error('[Error] Native plugin synchronization script not found.');
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
const result = spawnSync('node', [script, ...pluginArgs], { stdio: 'inherit' });
|
|
196
|
+
process.exit(result.status === null ? 1 : result.status);
|
|
197
|
+
}
|
|
@@ -20,9 +20,12 @@ check(!tier2.stdout.includes('unavailable isolation means BLOCKED'),'old worktre
|
|
|
20
20
|
check(tier2.stdout.includes('evaluate-suggestions-before-skip'),'skill suggestions still require evaluation before omission');
|
|
21
21
|
check(tier2.stdout.includes('visible-status-updates'),'workflow plan carries mandatory user-visible status invariant');
|
|
22
22
|
check(tier2.stdout.includes('USER-VISIBLE HARNESS STATUS CONTRACT (MUST)'),'kernel emits the mandatory unified status contract');
|
|
23
|
-
for(const field of ['Harness Status','Current
|
|
24
|
-
check(tier2.stdout.includes(field),'kernel status contract includes '+field);
|
|
23
|
+
for(const field of ['### 🚦 Harness Status','- **Current:**','- **Read / Evidence:**','- **Next:**','- **Risk / Blocked:**']){
|
|
24
|
+
check(tier2.stdout.includes(field),'kernel status contract includes readable Markdown field '+field);
|
|
25
25
|
}
|
|
26
|
+
check(tier2.stdout.includes('HARNESS ROUTING CHECKPOINT (INTERNAL SOURCE STATE — DO NOT RENDER SEPARATELY)'),'routing checkpoint is marked internal rather than user-facing');
|
|
27
|
+
check(!tier2.stdout.includes('HARNESS ROUTING CHECKPOINT (REQUIRED VISIBLE STATE)'),'legacy duplicate-visible checkpoint label is absent');
|
|
28
|
+
check(tier2.stdout.includes('nested bullets when there are multiple items'),'kernel tells agents to split dense evidence into nested bullets');
|
|
26
29
|
check(tier2.stdout.includes('semantic communication MUST, not a hard execution lock'),'kernel separates semantic MUST from mechanical blocking');
|
|
27
30
|
|
|
28
31
|
const tier3=spawnSync(process.execPath,[kernel,'audit the entire repository architecture and coordinate multiple modules'],{cwd:ROOT,encoding:'utf8'});
|
|
@@ -34,7 +37,7 @@ check(tier3.stdout.includes('WORKFLOW GUIDANCE (ADVISORY WHEN SELECTED)'),'Tier
|
|
|
34
37
|
const hs=read('harness-everything/SKILL.md');
|
|
35
38
|
check(/workflow state and numeric limits guide; they do not hard-stop execution/i.test(hs),'Harness skill states non-blocking workflow contract');
|
|
36
39
|
check(/only Rule-of-3 reflection and explicit user\/host permission boundaries may block/i.test(hs),'Harness skill names the only intentional blocking boundaries');
|
|
37
|
-
check(/Surface status.*MUST
|
|
40
|
+
check(/Surface status.*MUST render.*Harness Status/i.test(hs)&&/bold bullets/i.test(hs)&&/Read \/ Evidence/i.test(hs),'Harness skill requires the readable unified user-visible status');
|
|
38
41
|
check(read('plugins/harness-everything/skills/harness-everything/SKILL.md')===hs,'Harness skill mirror matches');
|
|
39
42
|
|
|
40
43
|
const wt=read('using-git-worktrees/SKILL.md');
|
|
@@ -55,13 +58,13 @@ for(const p of ['docs/routing.md','docs/architecture.md','docs/workflow-runtime.
|
|
|
55
58
|
}
|
|
56
59
|
const advisory=read('scripts/lib/advisory-text.js');
|
|
57
60
|
check(/selected workflow topology.*planning guidance/i.test(advisory),'installer advisory text keeps workflow non-blocking');
|
|
58
|
-
check(/USER-VISIBLE STATUS \(MUST\)/i.test(advisory)
|
|
61
|
+
check(/USER-VISIBLE STATUS \(MUST\)/i.test(advisory)&&/### 🚦 Harness Status/i.test(advisory)&&/\*\*Read \/ Evidence:\*\*/i.test(advisory),'instruction-only installers carry the readable mandatory status contract');
|
|
59
62
|
check(/Rule of 3/i.test(advisory)&&/Permission boundaries are separate/i.test(advisory),'installer text preserves Rule-of-3 and permission boundaries');
|
|
60
63
|
check(read('plugins/harness-everything/scripts/lib/advisory-text.js')===advisory,'OpenAI advisory mirror matches');
|
|
61
64
|
|
|
62
65
|
const agents=read('AGENTS.md');
|
|
63
66
|
check(/Selected workflow is planning guidance/i.test(agents),'repository agent contract is guidance-first');
|
|
64
|
-
check(/User-visible Harness Status is mandatory/i.test(agents),'repository agent contract requires unified user-visible status');
|
|
67
|
+
check(/User-visible Harness Status is mandatory/i.test(agents)&&/### 🚦 Harness Status/i.test(agents)&&/nested evidence bullets/i.test(agents),'repository agent contract requires readable unified user-visible status');
|
|
65
68
|
check(/Prefer Git worktree isolation/i.test(agents),'repository worktree rule is a recommendation');
|
|
66
69
|
|
|
67
70
|
const hooks=JSON.parse(read('hooks/hooks.json'));
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const assert = require('assert');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const {
|
|
7
|
+
findMarketplace,
|
|
8
|
+
findPlugin,
|
|
9
|
+
parseJsonOutput,
|
|
10
|
+
sync
|
|
11
|
+
} = require('../scripts/plugin-sync');
|
|
12
|
+
|
|
13
|
+
const ROOT = path.resolve(__dirname, '..');
|
|
14
|
+
|
|
15
|
+
function fakeHost({ claudeInstalled = false, codexInstalled = false, claudeMarketplace = true, codexMarketplace = true, unknownClaudePluginState = false } = {}) {
|
|
16
|
+
const calls = [];
|
|
17
|
+
const state = {
|
|
18
|
+
claudeInstalled,
|
|
19
|
+
codexInstalled,
|
|
20
|
+
claudeMarketplace,
|
|
21
|
+
codexMarketplace
|
|
22
|
+
};
|
|
23
|
+
const runner = (command, args) => {
|
|
24
|
+
calls.push({ command, args: [...args] });
|
|
25
|
+
const joined = args.join(' ');
|
|
26
|
+
|
|
27
|
+
if (command === 'claude') {
|
|
28
|
+
if (joined.includes('marketplace list --json')) {
|
|
29
|
+
return { status: 0, stdout: JSON.stringify({ marketplaces: state.claudeMarketplace ? [{ name: 'harness-everything' }] : [] }), stderr: '' };
|
|
30
|
+
}
|
|
31
|
+
if (joined === 'plugin marketplace list') {
|
|
32
|
+
return { status: 0, stdout: state.claudeMarketplace ? 'harness-everything\n' : '', stderr: '' };
|
|
33
|
+
}
|
|
34
|
+
if (joined.startsWith('plugin marketplace add')) {
|
|
35
|
+
state.claudeMarketplace = true;
|
|
36
|
+
return { status: 0, stdout: '', stderr: '' };
|
|
37
|
+
}
|
|
38
|
+
if (joined.startsWith('plugin marketplace update')) return { status: 0, stdout: '', stderr: '' };
|
|
39
|
+
if (joined.includes('plugin list --json')) {
|
|
40
|
+
if (unknownClaudePluginState) return { status: 1, stdout: '', stderr: 'unsupported --json' };
|
|
41
|
+
return { status: 0, stdout: JSON.stringify({ plugins: state.claudeInstalled ? [{ id: 'harness-everything@harness-everything' }] : [] }), stderr: '' };
|
|
42
|
+
}
|
|
43
|
+
if (joined === 'plugin list') {
|
|
44
|
+
if (unknownClaudePluginState) return { status: 1, stdout: '', stderr: 'unsupported list' };
|
|
45
|
+
return { status: 0, stdout: state.claudeInstalled ? 'harness-everything@harness-everything\n' : '', stderr: '' };
|
|
46
|
+
}
|
|
47
|
+
if (joined.startsWith('plugin install') || joined.startsWith('plugin update')) {
|
|
48
|
+
state.claudeInstalled = true;
|
|
49
|
+
return { status: 0, stdout: '{}', stderr: '' };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (command === 'codex') {
|
|
54
|
+
if (joined.includes('marketplace list --json')) {
|
|
55
|
+
return { status: 0, stdout: JSON.stringify({ marketplaces: state.codexMarketplace ? [{ name: 'harness-everything' }] : [] }), stderr: '' };
|
|
56
|
+
}
|
|
57
|
+
if (joined === 'plugin marketplace list') {
|
|
58
|
+
return { status: 0, stdout: state.codexMarketplace ? 'harness-everything\n' : '', stderr: '' };
|
|
59
|
+
}
|
|
60
|
+
if (joined.startsWith('plugin marketplace add')) {
|
|
61
|
+
state.codexMarketplace = true;
|
|
62
|
+
return { status: 0, stdout: '{}', stderr: '' };
|
|
63
|
+
}
|
|
64
|
+
if (joined.startsWith('plugin marketplace upgrade')) return { status: 0, stdout: '{}', stderr: '' };
|
|
65
|
+
if (joined.includes('plugin list --marketplace harness-everything --json') || joined === 'plugin list --json') {
|
|
66
|
+
return { status: 0, stdout: JSON.stringify({ plugins: state.codexInstalled ? [{ name: 'harness-everything', marketplace: 'harness-everything' }] : [] }), stderr: '' };
|
|
67
|
+
}
|
|
68
|
+
if (joined === 'plugin list --marketplace harness-everything' || joined === 'plugin list') {
|
|
69
|
+
return { status: 0, stdout: state.codexInstalled ? 'harness-everything@harness-everything\n' : '', stderr: '' };
|
|
70
|
+
}
|
|
71
|
+
if (joined.startsWith('plugin add')) {
|
|
72
|
+
state.codexInstalled = true;
|
|
73
|
+
return { status: 0, stdout: '{}', stderr: '' };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return { status: 0, stdout: '', stderr: '' };
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
calls,
|
|
82
|
+
runner,
|
|
83
|
+
commandAvailable: () => true
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function callsFor(calls, command, prefix) {
|
|
88
|
+
return calls.filter(call => call.command === command && call.args.join(' ').startsWith(prefix));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function runHost(host, fake) {
|
|
92
|
+
return sync({ host, repository: 'dyphn1/Harness-everything', ref: 'main' }, {
|
|
93
|
+
...fake,
|
|
94
|
+
log: () => {},
|
|
95
|
+
warn: () => {}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
assert.strictEqual(parseJsonOutput('status\n{"ok":true}\n').ok, true);
|
|
100
|
+
assert.strictEqual(findMarketplace({ marketplaces: [{ name: 'harness-everything' }] }, 'harness-everything'), true);
|
|
101
|
+
assert.strictEqual(findPlugin({ plugins: [{ id: 'harness-everything@harness-everything' }] }, 'harness-everything', 'harness-everything'), true);
|
|
102
|
+
|
|
103
|
+
{
|
|
104
|
+
const fake = fakeHost({ claudeInstalled: false });
|
|
105
|
+
const result = runHost('claude', fake);
|
|
106
|
+
assert.strictEqual(result.failed, 0);
|
|
107
|
+
assert.strictEqual(result.results[0].action, 'install');
|
|
108
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin install').length, 1, 'absent Claude plugin must install');
|
|
109
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin update').length, 0, 'absent Claude plugin must not update');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
{
|
|
113
|
+
const fake = fakeHost({ claudeInstalled: true });
|
|
114
|
+
const result = runHost('claude', fake);
|
|
115
|
+
assert.strictEqual(result.failed, 0);
|
|
116
|
+
assert.strictEqual(result.results[0].action, 'update');
|
|
117
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin update').length, 1, 'installed Claude plugin must update');
|
|
118
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin install').length, 0, 'installed Claude plugin must not reinstall');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
{
|
|
122
|
+
const fake = fakeHost({ codexInstalled: false });
|
|
123
|
+
const result = runHost('codex', fake);
|
|
124
|
+
assert.strictEqual(result.failed, 0);
|
|
125
|
+
assert.strictEqual(result.results[0].action, 'install');
|
|
126
|
+
assert.strictEqual(callsFor(fake.calls, 'codex', 'plugin add').length, 1, 'absent Codex plugin must install');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
{
|
|
130
|
+
const fake = fakeHost({ codexInstalled: true });
|
|
131
|
+
const result = runHost('codex', fake);
|
|
132
|
+
assert.strictEqual(result.failed, 0);
|
|
133
|
+
assert.strictEqual(result.results[0].action, 'update');
|
|
134
|
+
assert.strictEqual(callsFor(fake.calls, 'codex', 'plugin marketplace upgrade').length, 1, 'installed Codex plugin must upgrade its marketplace');
|
|
135
|
+
assert.strictEqual(callsFor(fake.calls, 'codex', 'plugin add').length, 0, 'installed Codex plugin must not be re-added');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
{
|
|
139
|
+
const fake = fakeHost({ unknownClaudePluginState: true });
|
|
140
|
+
const result = runHost('claude', fake);
|
|
141
|
+
assert.strictEqual(result.failed, 1, 'unknown installed state must fail closed');
|
|
142
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin install').length, 0, 'unknown state must not install');
|
|
143
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin update').length, 0, 'unknown state must not update blindly');
|
|
144
|
+
assert.strictEqual(callsFor(fake.calls, 'claude', 'plugin marketplace update').length, 0, 'unknown state must not refresh the marketplace blindly');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
{
|
|
148
|
+
const result = sync({ host: 'all' }, { commandAvailable: () => false, log: () => {}, warn: () => {} });
|
|
149
|
+
assert.strictEqual(result.skipped, 2);
|
|
150
|
+
assert.strictEqual(result.failed, 0);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
for (const wrapper of ['scripts/plugin-sync.sh', 'scripts/plugin-sync.ps1']) {
|
|
154
|
+
const text = fs.readFileSync(path.join(ROOT, wrapper), 'utf8');
|
|
155
|
+
assert.match(text, /plugin-sync\.js/);
|
|
156
|
+
assert.doesNotMatch(text, /\.codex\/plugins\/cache|config\.toml/);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const cli = fs.readFileSync(path.join(ROOT, 'bin', 'cli.js'), 'utf8');
|
|
160
|
+
assert.match(cli, /case 'plugin-sync'/);
|
|
161
|
+
assert.match(cli, /Existing installations always take the update/);
|
|
162
|
+
|
|
163
|
+
console.log('Native plugin sync verified: absent plugins install, installed plugins update, and unknown state fails closed.');
|
package/docs/architecture.md
CHANGED
|
@@ -57,17 +57,20 @@ The router does not tell the model *how* to solve each stage. It decides what li
|
|
|
57
57
|
|
|
58
58
|
### User-visible status protocol
|
|
59
59
|
|
|
60
|
-
Non-trivial work MUST expose one stable progress shape to the user:
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
Harness Status
|
|
64
|
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
60
|
+
Non-trivial work MUST expose one stable, scannable Markdown progress shape to the user:
|
|
61
|
+
|
|
62
|
+
```md
|
|
63
|
+
### 🚦 Harness Status
|
|
64
|
+
|
|
65
|
+
- **Current:** <what is being done now>
|
|
66
|
+
- **Read / Evidence:**
|
|
67
|
+
- <important file/source/evidence read or confirmed>
|
|
68
|
+
- <another item when multiple evidence items improve scanability>
|
|
69
|
+
- **Next:** <next intended action>
|
|
70
|
+
- **Risk / Blocked:** <only when materially applicable; omit otherwise>
|
|
68
71
|
```
|
|
69
72
|
|
|
70
|
-
The agent emits
|
|
73
|
+
Use nested evidence bullets when multiple items would otherwise become one dense sentence. The agent emits the status before substantive execution, after major phases, on material direction changes, at meaningful long-running phase boundaries, and before final completion. The router checkpoint feeds this status as internal source state but is not a second user-facing template.
|
|
71
74
|
|
|
72
75
|
This is a semantic contract, not another cognitive lock. Hook-capable hosts may observe or remind about compliance; instruction-only hosts still receive the MUST contract without pretending they can mechanically enforce it.
|
|
73
76
|
|
|
@@ -27,9 +27,9 @@ This is a **repository/agent contract**, not an automatic upgrade to any platfor
|
|
|
27
27
|
|
|
28
28
|
| Platform surface | Standalone skills | Plugin support | Hooks/lifecycle | Project scope | Global scope | Current evidence boundary |
|
|
29
29
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
30
|
-
| Codex | `Supported` | `Mechanism verified` | `Mechanism verified` for the local OpenAI package, including session, prompt, supported-tool, subagent, and stop hooks | `.agents/skills/`, `AGENTS.md` | `~/.agents/skills/` | Local package hooks are mechanically checked; live loading and marketplace refresh remain
|
|
30
|
+
| Codex | `Supported` | `Mechanism verified` | `Mechanism verified` for the local OpenAI package, including session, prompt, supported-tool, subagent, and stop hooks | `.agents/skills/`, `AGENTS.md` | `~/.agents/skills/` | Local package hooks and the state-specific marketplace sync command are mechanically checked; live loading and marketplace refresh remain unverified. |
|
|
31
31
|
| ChatGPT / OpenAI Plugin | `Unknown` for a repository-local standalone path | `Mechanism verified` | `Partial`: local Work/Codex hooks are separate from ordinary Chat | Managed workspace marketplace | Not established | The public Skills-only bundle is mechanically reproducible; import, approval, and live behavior remain `Unknown`. |
|
|
32
|
-
| Claude Code | `Supported` | `Supported` | `Mechanism verified` for Harness configuration | `.claude/skills/` | `~/.claude/skills/` | Native Claude surfaces
|
|
32
|
+
| Claude Code | `Supported` | `Supported` | `Mechanism verified` for Harness configuration | `.claude/skills/` | `~/.claude/skills/` | Native Claude surfaces and the state-specific plugin sync command are mechanically checked; fresh-host execution is not preserved here. |
|
|
33
33
|
| OpenCode | `Supported` | `Partial` live-host loading for the project-scope, `.js`-filename install path on OpenCode 1.18.31 (macOS); other install paths remain `Mechanism verified` | `Partial` live-host evidence for project-scope `.js` loading and edit/verification state; hard lock reported only, with no retained blocked-tool trace and a post-reset final snapshot | `.opencode/skills/`, `.agents/skills/`, `.opencode/plugins/` | `~/.config/opencode/skills/`, `~/.agents/skills/`, `~/.config/opencode/plugins/` | [Retained evidence](../benchmarks/results/live-host/opencode-2026-09-16/README.md): loading and state effects verified in one host session; final snapshot post-reset; hard lock only an interactive observation; reflection operator-seeded, then agent-rewritten; no raw transcript or behavioral-effectiveness claim. `.mjs` auto-discovery broken (issue #127); global scope, npm-package installation, and other host versions remain unverified. |
|
|
34
34
|
| GitHub Copilot agent surfaces | `Supported` | `Unknown` for a Harness-specific plugin install | `Unknown` | `.github/skills/`, `.agents/skills/`, repository instructions | `~/.copilot/skills/`, `~/.agents/skills/` | GitHub Agent Skills paths and installer behavior are checked; no live Copilot session or plugin install is preserved. |
|
|
35
35
|
| Cursor | `Supported` | `Mechanism verified` for the portable package shape | `Unknown` for Harness | `.cursor/skills/`, `.agents/skills/` | `~/.cursor/skills/`, `~/.agents/skills/` | Official paths and package shape are checked; Cursor plugin loading and hooks remain unverified. |
|
|
@@ -64,6 +64,26 @@ Codex has two paths that must not be collapsed:
|
|
|
64
64
|
|
|
65
65
|
The package is tested at the mechanism layer and remains subject to the host’s hook review/trust flow. A fresh host session is still required before claiming that a particular ChatGPT/Codex installation loaded and fired the hooks or that the model followed read-before-skip.
|
|
66
66
|
|
|
67
|
+
### Native plugin install/update synchronization
|
|
68
|
+
|
|
69
|
+
The repository also ships a host-facing synchronization command for the native marketplace/plugin surfaces:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx github:dyphn1/Harness-everything plugin-sync
|
|
73
|
+
# or, from a checkout:
|
|
74
|
+
./scripts/plugin-sync.sh
|
|
75
|
+
powershell -File scripts/plugin-sync.ps1
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The command detects Claude Code and Codex independently, ensures the Harness marketplace is configured, reads the installed-plugin state, then refreshes that marketplace before choosing the operation:
|
|
79
|
+
|
|
80
|
+
- absent plugin → install;
|
|
81
|
+
- existing Claude Code plugin → `claude plugin update harness-everything@harness-everything`;
|
|
82
|
+
- existing Codex plugin → `codex plugin marketplace upgrade harness-everything`;
|
|
83
|
+
- unknown plugin state → fail closed, with no blind install/re-add.
|
|
84
|
+
|
|
85
|
+
The installed branch is intentionally an update branch even when the current release is already the newest version; the host command may report “already latest.” Codex marketplace upgrade is the current native refresh operation; the command does not edit private cache paths or `config.toml`. These are deterministic command/state tests, not live-host evidence, so `liveHostVerification` remains `Unknown` in the matrix.
|
|
86
|
+
|
|
67
87
|
### Explicit Codex user-hook compatibility fallback
|
|
68
88
|
|
|
69
89
|
Current Codex documentation supports plugin-bundled hooks, so native plugin mounting remains the preferred path. Some host/source combinations have nevertheless failed to expose enabled plugin hooks for review/entry attribution (#122 and upstream Codex reports). Harness therefore provides an **explicit compatibility fallback**, not an automatic replacement for native plugin hooks:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "harness-platform-compatibility-v1",
|
|
3
|
-
"last_reviewed": "2026-09-
|
|
3
|
+
"last_reviewed": "2026-09-21",
|
|
4
4
|
"status_vocabulary": {
|
|
5
5
|
"Supported": "An official or native mechanism exists and the Harness behavior is verified.",
|
|
6
6
|
"Mechanism verified": "Harness package, adapter, or installer checks pass, but a real host run is not confirmed.",
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"globalScope": {"status": "Mechanism verified", "paths": {"skills": ["~/.agents/skills"]}},
|
|
115
115
|
"installUninstallSymmetry": {"status": "Mechanism verified", "notes": "General Harness installer ownership is mechanism-tested. The optional codex-hooks compatibility fallback separately has exact-entry update/uninstall ownership tests and preserves unrelated user hooks; live Codex trust/dispatch still requires host evidence."},
|
|
116
116
|
"assetsReferences": {"status": "Mechanism verified", "notes": "Packaged skill references are checked and remain inside the package."},
|
|
117
|
-
"updateSync": {"status": "
|
|
117
|
+
"updateSync": {"status": "Mechanism verified", "notes": "scripts/plugin-sync.js detects installed state and uses marketplace upgrade for an installed Codex plugin; no live Codex host refresh is preserved."},
|
|
118
118
|
"liveHostVerification": {"status": "Unknown", "notes": "No preserved Codex plugin/session artifact proves current bundled-hook entry. Native plugin mounting is preferred; the explicit user-hook fallback is mechanism-verified only and does not solve host carriers that bypass hook dispatch."}
|
|
119
119
|
}
|
|
120
120
|
},
|
|
@@ -159,7 +159,7 @@
|
|
|
159
159
|
"globalScope": {"status": "Mechanism verified", "paths": {"skills": ["~/.claude/skills"], "hooks": ["~/.claude/settings.json"]}},
|
|
160
160
|
"installUninstallSymmetry": {"status": "Mechanism verified", "notes": "Owned settings, skills, agents, and user files are covered by round-trip tests."},
|
|
161
161
|
"assetsReferences": {"status": "Mechanism verified", "notes": "Skill-local references, scripts, and templates are checked."},
|
|
162
|
-
"updateSync": {"status": "
|
|
162
|
+
"updateSync": {"status": "Mechanism verified", "notes": "scripts/plugin-sync.js detects installed state and uses the explicit Claude plugin update command for an installed plugin; no live Claude host refresh is preserved."},
|
|
163
163
|
"liveHostVerification": {"status": "Unknown", "notes": "No fresh Claude Code plugin session artifact is committed for this revision."}
|
|
164
164
|
}
|
|
165
165
|
},
|
|
@@ -267,4 +267,4 @@
|
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
]
|
|
270
|
-
}
|
|
270
|
+
}
|
package/docs/routing.md
CHANGED
|
@@ -47,17 +47,20 @@ On a host where `UserPromptSubmit` is wired, reuse that hook output instead of r
|
|
|
47
47
|
|
|
48
48
|
## User-visible status contract
|
|
49
49
|
|
|
50
|
-
For non-trivial software/project work, the user-facing progress protocol is a semantic **MUST** and
|
|
50
|
+
For non-trivial software/project work, the user-facing progress protocol is a semantic **MUST** and uses the same readable Markdown presentation across execution topologies:
|
|
51
51
|
|
|
52
|
-
```
|
|
53
|
-
Harness Status
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
52
|
+
```md
|
|
53
|
+
### 🚦 Harness Status
|
|
54
|
+
|
|
55
|
+
- **Current:** <what is being done now>
|
|
56
|
+
- **Read / Evidence:**
|
|
57
|
+
- <important file/source/evidence read or confirmed>
|
|
58
|
+
- <another item when multiple evidence items improve scanability>
|
|
59
|
+
- **Next:** <next intended action>
|
|
60
|
+
- **Risk / Blocked:** <only when materially applicable; omit otherwise>
|
|
58
61
|
```
|
|
59
62
|
|
|
60
|
-
Emit
|
|
63
|
+
Keep one short evidence item inline when that reads better; use nested bullets for multiple evidence items. Emit the status before substantive execution, after a major phase, when direction materially changes, at meaningful long-running phase boundaries, and before final completion. The final response may fold the last status into its completion summary. The routing checkpoint is internal source state for this protocol, not a second user-facing progress template.
|
|
61
64
|
|
|
62
65
|
This MUST is semantic rather than a hard runtime lock: hosts may observe/remind with different strength, but lack of a blocking hook does not downgrade the contract to optional advice.
|
|
63
66
|
|
package/docs/troubleshooting.md
CHANGED
|
@@ -189,6 +189,14 @@ If those checks pass but the host still shows an older copy:
|
|
|
189
189
|
|
|
190
190
|
The local plugin mechanically injects the session policy and invariant-first routing contract, and its package includes mechanism-tested supported-tool, subagent, and stop adapters. If those events do not appear in a live session, verify the host loaded the current package and that changed command hooks were reviewed/trusted; package tests alone cannot prove host loading.
|
|
191
191
|
|
|
192
|
+
For the native host install/update path, run:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npx github:dyphn1/Harness-everything plugin-sync --json
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The command installs only when the plugin is absent. An installed Claude plugin uses the explicit Claude update command; an installed Codex plugin uses marketplace upgrade. If plugin state cannot be read, synchronization stops without re-adding or overwriting the plugin.
|
|
199
|
+
|
|
192
200
|
See [openai-plugin.md](openai-plugin.md) for installation and validation details.
|
|
193
201
|
|
|
194
202
|
### Public OpenAI Skills-only plugin behaves differently from local Codex plugin
|
package/docs/workflow-runtime.md
CHANGED
|
@@ -17,17 +17,20 @@ None of those cognitive workflow conditions should trap a session or require a r
|
|
|
17
17
|
|
|
18
18
|
A semantic MUST is not the same thing as a hard runtime lock. User-visible status, routing/applicability obligations, and verification-before-claim can remain mandatory agent contracts while host hooks observe or remind on a best-effort basis. Do not downgrade a semantic obligation to optional advice merely because the host cannot block it.
|
|
19
19
|
|
|
20
|
-
The unified status shape
|
|
20
|
+
The unified status shape uses a visible Markdown hierarchy:
|
|
21
21
|
|
|
22
|
-
```
|
|
23
|
-
Harness Status
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
22
|
+
```md
|
|
23
|
+
### 🚦 Harness Status
|
|
24
|
+
|
|
25
|
+
- **Current:** <what is being done now>
|
|
26
|
+
- **Read / Evidence:**
|
|
27
|
+
- <important file/source/evidence read or confirmed>
|
|
28
|
+
- <another item when multiple evidence items improve scanability>
|
|
29
|
+
- **Next:** <next intended action>
|
|
30
|
+
- **Risk / Blocked:** <only when materially applicable; omit otherwise>
|
|
28
31
|
```
|
|
29
32
|
|
|
30
|
-
Emit it before substantive execution, after major phases, on material direction changes, at meaningful long-running phase boundaries, and before final completion.
|
|
33
|
+
Keep one short evidence item inline; use nested evidence bullets when multiple items improve scanability. Emit it before substantive execution, after major phases, on material direction changes, at meaningful long-running phase boundaries, and before final completion.
|
|
31
34
|
|
|
32
35
|
The two intentionally separate hard boundaries are:
|
|
33
36
|
|
|
@@ -4,7 +4,7 @@ description: "Route software/project work through the Harness kernel: classify T
|
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: Miya Daniel
|
|
7
|
-
version: 0.18.
|
|
7
|
+
version: 0.18.1
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Harness Everything
|
|
@@ -23,12 +23,12 @@ Kernel routing entry.
|
|
|
23
23
|
2. **Verify before claim** — seek objective evidence before saying work is done.
|
|
24
24
|
3. **Zoom out on repetition** — after 3 same-signature failures, use `zoom-out`.
|
|
25
25
|
4. **Evaluate before omission** — read each suggested skill's `SKILL.md` before deciding applicability.
|
|
26
|
-
5. **Surface status** — non-trivial work MUST
|
|
26
|
+
5. **Surface status** — non-trivial work MUST render `### 🚦 Harness Status` with bold bullets: `Current`, `Read / Evidence`, `Next`; optional `Risk / Blocked`.
|
|
27
27
|
6. **Keep agency** — workflow state and numeric limits guide; they do not hard-stop execution.
|
|
28
28
|
|
|
29
29
|
## Workflow
|
|
30
30
|
1. Reuse kernel output, or run `node "<this-skill-dir>/scripts/kernel-router.js" "<prompt summary>"`.
|
|
31
|
-
2.
|
|
31
|
+
2. Keep the **Harness Routing Checkpoint** internal; never render it separately.
|
|
32
32
|
3. Read each suggested `SKILL.md`; evaluate `USE FOR`, `DO NOT USE FOR`, workflow/basic flow, and hard rules.
|
|
33
33
|
4. Use the selected topology as planning guidance. Choose, combine, reorder, or skip steps when evidence supports doing so.
|
|
34
34
|
5. Prefer worktree isolation for broad/Tier-3 mutation and objective verification before completion.
|
|
@@ -151,23 +151,28 @@ Never turn mechanism/package evidence into a cross-host live-enforcement claim.
|
|
|
151
151
|
|
|
152
152
|
## 6. User-visible status contract
|
|
153
153
|
|
|
154
|
-
For non-trivial software/project work, user-facing progress **MUST** use one stable shape across direct, iterative, Fable, and multi-agent execution:
|
|
155
|
-
|
|
156
|
-
```
|
|
157
|
-
Harness Status
|
|
158
|
-
|
|
159
|
-
-
|
|
160
|
-
-
|
|
161
|
-
-
|
|
154
|
+
For non-trivial software/project work, user-facing progress **MUST** use one stable Markdown shape across direct, iterative, Fable, and multi-agent execution:
|
|
155
|
+
|
|
156
|
+
```md
|
|
157
|
+
### 🚦 Harness Status
|
|
158
|
+
|
|
159
|
+
- **Current:** <what is being done now>
|
|
160
|
+
- **Read / Evidence:**
|
|
161
|
+
- <important file/source/evidence read or confirmed>
|
|
162
|
+
- <another item when multiple evidence items improve scanability>
|
|
163
|
+
- **Next:** <next intended action>
|
|
164
|
+
- **Risk / Blocked:** <only when materially applicable; omit otherwise>
|
|
162
165
|
```
|
|
163
166
|
|
|
167
|
+
When there is only one short evidence item, keep it inline on the **Read / Evidence** bullet. Use nested bullets when multiple items would otherwise become one dense sentence.
|
|
168
|
+
|
|
164
169
|
Emit it before substantive execution, after a major phase completes, when the plan/assumption/direction materially changes, at meaningful phase boundaries during long-running work, and before final completion. The final response may merge the last status naturally.
|
|
165
170
|
|
|
166
171
|
This is a semantic communication MUST. It does **not** create a runtime lock, counter, reset requirement, or permission boundary. The routing checkpoint below is source state for this format, not a second competing progress template.
|
|
167
172
|
|
|
168
173
|
## 7. Routing Checkpoint
|
|
169
174
|
|
|
170
|
-
For software/project work, consume this runtime state when producing the first Harness Status:
|
|
175
|
+
For software/project work, consume this internal runtime state when producing the first Harness Status; do not render the checkpoint as a separate user-facing block:
|
|
171
176
|
|
|
172
177
|
```markdown
|
|
173
178
|
## 🚦 Harness Routing Checkpoint
|
|
@@ -24,7 +24,7 @@ const { applyEnsemblePolicy } = require('./ensemble-policy');
|
|
|
24
24
|
const INVARIANT_TEXT = {
|
|
25
25
|
'scope-lock': 'Route before execution: stay inside the authorized task/repository scope.',
|
|
26
26
|
'verify-before-claim': 'Verify before claim: completion claims require objective evidence appropriate to the change.',
|
|
27
|
-
'visible-status-updates': 'User-visible status is mandatory:
|
|
27
|
+
'visible-status-updates': 'User-visible status is mandatory: render the single Markdown Harness Status with a visible heading, bullet-aligned bold labels, Current, Read / Evidence, and Next; add Risk / Blocked only when materially applicable.',
|
|
28
28
|
'replan-after-repeated-failure': 'Re-plan on repetition: after 3 same-signature failures, stop micro-retrying and zoom out/re-diagnose.',
|
|
29
29
|
'evaluate-suggestions-before-skip': 'Evaluate before skip: read each suggested skill\'s complete SKILL.md entry/basic flow before omitting it.',
|
|
30
30
|
'loop-awareness': 'When iterative work runs long, remind the agent to verify assumptions or re-plan; never hard-stop on a count.',
|
|
@@ -149,7 +149,7 @@ function printRoutingCheckpoint(plan) {
|
|
|
149
149
|
const invariants = Array.isArray(plan.requiredInvariants) ? plan.requiredInvariants : [];
|
|
150
150
|
const suggestions = uniqueSuggestedSkills(plan);
|
|
151
151
|
|
|
152
|
-
console.log('\n=> HARNESS ROUTING CHECKPOINT (
|
|
152
|
+
console.log('\n=> HARNESS ROUTING CHECKPOINT (INTERNAL SOURCE STATE — DO NOT RENDER SEPARATELY):');
|
|
153
153
|
console.log(` - Tier: ${displayTier(plan.tier)}`);
|
|
154
154
|
console.log(` - Strategy: ${plan.strategy || 'deferred'}`);
|
|
155
155
|
console.log(` - Required invariants: ${invariants.length ? invariants.join(', ') : 'none'}`);
|
|
@@ -169,12 +169,16 @@ function printKernelContract(plan) {
|
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
console.log('\n=> USER-VISIBLE HARNESS STATUS CONTRACT (MUST):');
|
|
172
|
-
console.log(' - For non-trivial software/project work, the agent MUST
|
|
173
|
-
console.log(' Harness Status');
|
|
174
|
-
console.log('
|
|
175
|
-
console.log(' -
|
|
176
|
-
console.log(' -
|
|
177
|
-
console.log('
|
|
172
|
+
console.log(' - For non-trivial software/project work, the agent MUST render this single Markdown status shape:');
|
|
173
|
+
console.log(' ### 🚦 Harness Status');
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log(' - **Current:** <what is being done now>');
|
|
176
|
+
console.log(' - **Read / Evidence:**');
|
|
177
|
+
console.log(' - <important file/source/evidence read or confirmed>');
|
|
178
|
+
console.log(' - <another item when multiple evidence items improve scanability>');
|
|
179
|
+
console.log(' - **Next:** <next intended action>');
|
|
180
|
+
console.log(' - **Risk / Blocked:** <only when materially applicable; omit otherwise>');
|
|
181
|
+
console.log(' - Keep evidence inline when there is only one short item; use nested bullets when there are multiple items.');
|
|
178
182
|
console.log(' - Emit it before substantive execution, after a major phase, when direction materially changes, at meaningful long-running phase boundaries, and before final completion (the final response may merge it naturally).');
|
|
179
183
|
console.log(' - This is a semantic communication MUST, not a hard execution lock, counter, or reset condition.');
|
|
180
184
|
|