harness-everything 0.10.0 → 0.11.1
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/CHANGELOG.md +21 -0
- package/ci/contract-integrity.test.js +203 -0
- package/ci/mechanism-2ah-workflow-lifecycle.test.js +34 -1
- package/contract-integrity/fixtures/consistent-trace.json +94 -0
- package/contract-integrity/fixtures/reconciled-trace.json +105 -0
- package/contract-integrity/fixtures/ticket-drift-trace.json +94 -0
- package/contract-integrity/schemas/trace.schema.json +77 -0
- package/contract-integrity/scripts/audit.js +536 -0
- package/docs/contract-integrity.md +109 -0
- package/hooks/scripts/lib/workflow-runtime.js +2 -1
- package/hooks/scripts/workflow-disposition.js +7 -2
- package/hooks/scripts/workflow-gate.js +4 -3
- 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/hooks/scripts/lib/workflow-runtime.js +2 -1
- package/plugins/harness-everything/hooks/scripts/workflow-disposition.js +7 -2
- package/plugins/harness-everything/hooks/scripts/workflow-gate.js +4 -3
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/skills/self-evolve/SKILL.md +1 -1
- package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +2 -1
- package/self-evolve/SKILL.md +1 -1
- package/self-evolve/scripts/self-regression.js +2 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Contract Integrity Audit
|
|
2
|
+
|
|
3
|
+
The contract-integrity audit reconciles the chain:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
ADR decision -> living spec requirement -> ticket/change
|
|
7
|
+
-> #58 completeness evidence -> predeclared protection probes
|
|
8
|
+
-> implementation evidence
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Phase 1 is a **trace/reconciliation engine**. It does not yet generate or execute mutation probes. A green existing suite therefore cannot manufacture a protection PASS.
|
|
12
|
+
|
|
13
|
+
## Inputs
|
|
14
|
+
|
|
15
|
+
`contract-integrity/schemas/trace.schema.json` defines version `1.0.0`.
|
|
16
|
+
|
|
17
|
+
Every current requirement has:
|
|
18
|
+
|
|
19
|
+
- a stable `requirementId` and revision;
|
|
20
|
+
- one current living spec;
|
|
21
|
+
- zero or more governing ADR decisions;
|
|
22
|
+
- linked tickets, tests, and implementation evidence;
|
|
23
|
+
- **predeclared** `requiredProbeIds`;
|
|
24
|
+
- explicit source validity.
|
|
25
|
+
|
|
26
|
+
Artifacts use stable IDs and lifecycle state instead of appending ticket history into ADR text.
|
|
27
|
+
|
|
28
|
+
Protection probe dispositions are:
|
|
29
|
+
|
|
30
|
+
- `KILLED`: valid only when an isolated source-derived contract probe fails for the expected contract reason;
|
|
31
|
+
- `SURVIVED`: the implementation violated the contract and the tests did not stop it;
|
|
32
|
+
- `INVALID`: build/infrastructure/flaky or otherwise unusable evidence;
|
|
33
|
+
- `NOT_EVALUATED`: not executed.
|
|
34
|
+
|
|
35
|
+
A compile/build failure is never counted as a killed contract probe.
|
|
36
|
+
|
|
37
|
+
## Scoring
|
|
38
|
+
|
|
39
|
+
Completeness is not reimplemented. Pass `--tdd-evidence` and Harness calls the existing #58 evaluator.
|
|
40
|
+
|
|
41
|
+
Protection is intentionally anti-padding:
|
|
42
|
+
|
|
43
|
+
1. each requirement declares `requiredProbeIds` before execution;
|
|
44
|
+
2. only those probe IDs affect its score;
|
|
45
|
+
3. a requirement is 100 only when **every required probe is validly KILLED**;
|
|
46
|
+
4. any required `SURVIVED` probe makes that requirement 0;
|
|
47
|
+
5. missing/invalid/not-evaluated required evidence also gives 0 and `NOT_EVALUATED`;
|
|
48
|
+
6. extra killed probes do not change the requirement score.
|
|
49
|
+
|
|
50
|
+
The project score is:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
contractIntegrityScore = min(completenessScore, protectionScore)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Scores never override a drift or evidence gate.
|
|
57
|
+
|
|
58
|
+
## Drift vocabulary
|
|
59
|
+
|
|
60
|
+
The machine report uses:
|
|
61
|
+
|
|
62
|
+
- `CONSISTENT`
|
|
63
|
+
- `UNTRACED_CHANGE`
|
|
64
|
+
- `STALE_SPEC`
|
|
65
|
+
- `STALE_TEST`
|
|
66
|
+
- `STALE_IMPLEMENTATION`
|
|
67
|
+
- `SOURCE_DEFECT`
|
|
68
|
+
- `SOURCE_CONFLICT`
|
|
69
|
+
- `INTENTIONAL_SUPERSESSION`
|
|
70
|
+
- `NOT_EVALUATED`
|
|
71
|
+
|
|
72
|
+
A ticket with behavior/architecture impact targeting a newer requirement revision than the living spec is `STALE_SPEC + UNTRACED_CHANGE`. Test/probe evidence must point to the current living spec, not merely have a green score.
|
|
73
|
+
|
|
74
|
+
## CLI
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
node contract-integrity/scripts/audit.js trace.json \
|
|
78
|
+
--tdd-evidence tdd-evidence.json \
|
|
79
|
+
--output contract-report.json \
|
|
80
|
+
--markdown contract-report.md
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Or:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm run contract:integrity -- trace.json --tdd-evidence tdd-evidence.json
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Modes
|
|
90
|
+
|
|
91
|
+
`strict`
|
|
92
|
+
: unresolved drift, missing completeness evidence, surviving/invalid/missing probes, source defects/conflicts, or a score below 100 fail the completion gate.
|
|
93
|
+
|
|
94
|
+
`audit`
|
|
95
|
+
: intended for migration of legacy projects. It returns an audit report and exits zero for valid input even when debt exists, but `gateEligible` remains false and it **cannot authorize completion**.
|
|
96
|
+
|
|
97
|
+
Malformed input/evidence returns exit 2 in either mode.
|
|
98
|
+
|
|
99
|
+
## Reports
|
|
100
|
+
|
|
101
|
+
JSON contains raw artifact/requirement/probe counts, both component scores, integrity score, drift counts, per-requirement reason codes, and the compact contract graph.
|
|
102
|
+
|
|
103
|
+
Markdown stays concise. Detailed lineage belongs in the generated graph/report, not as raw ticket chronology appended to ADRs/specs.
|
|
104
|
+
|
|
105
|
+
## Phase boundary
|
|
106
|
+
|
|
107
|
+
Phase 1 consumes declared probe evidence but does not create it. Phase 3 of #84 will define project adapters and execute source-derived probes in isolated/recoverable workspaces. Until then, absent probe evidence is `NOT_EVALUATED`, never PASS.
|
|
108
|
+
|
|
109
|
+
No new directly routed skill is introduced in Phase 1. Phase 2 must first review routing/description collision before integrating this audit into `grill-with-docs`, `to-spec`, `to-tickets`, or completion workflows.
|
|
@@ -7,6 +7,7 @@ const { atomicWriteJson, readJson } = require('./fable-contracts');
|
|
|
7
7
|
|
|
8
8
|
const OPEN_STATES = new Set(['pending', 'active', 'running', 'failed', 'blocked', 'escaped']);
|
|
9
9
|
const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
10
|
+
const WORKFLOW_CONTROLLER_COMMANDS = new Set(['start', 'revision', 'reset-budget', 'escape', 'block']);
|
|
10
11
|
|
|
11
12
|
function isMajorWorkflow(workflow) {
|
|
12
13
|
return Boolean(workflow && (workflow.mutationIsolation?.required || workflow.tier === 'tier3' || String(workflow.strategy || '').startsWith('fable-')));
|
|
@@ -251,4 +252,4 @@ function readHookInput(decide) {
|
|
|
251
252
|
process.stdin.on('error', finish);
|
|
252
253
|
}
|
|
253
254
|
|
|
254
|
-
module.exports = { OPEN_STATES, SAFE_ID, isMajorWorkflow, loadWorkflow, saveWorkflow, budgetLimits, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun, matchingRun, unresolvedStages, readHookInput };
|
|
255
|
+
module.exports = { OPEN_STATES, SAFE_ID, WORKFLOW_CONTROLLER_COMMANDS, isMajorWorkflow, loadWorkflow, saveWorkflow, budgetLimits, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun, matchingRun, unresolvedStages, readHookInput };
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
|
6
|
-
const { loadWorkflow, saveWorkflow, matchingRun, OPEN_STATES, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun } = require('./lib/workflow-runtime');
|
|
6
|
+
const { loadWorkflow, saveWorkflow, matchingRun, OPEN_STATES, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun, WORKFLOW_CONTROLLER_COMMANDS } = require('./lib/workflow-runtime');
|
|
7
7
|
const { getWorkspaceRoot, readCurrentSession } = require('./lib/harness-state');
|
|
8
8
|
const { atomicWriteJson, readJson } = require('./lib/fable-contracts');
|
|
9
9
|
|
|
@@ -20,6 +20,10 @@ function parseArgs(argv) {
|
|
|
20
20
|
return args;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
function usage() {
|
|
24
|
+
return `Usage: workflow-disposition.js <${[...WORKFLOW_CONTROLLER_COMMANDS].join('|')}> --session-id <id> [--stage-id <id> --reason-code <reason> --scope <scope> --evidence <evidence>]`;
|
|
25
|
+
}
|
|
26
|
+
|
|
23
27
|
function consumer() {
|
|
24
28
|
for (const relative of ['../../fable-mode/scripts/workflow-plan-consumer.js', '../../skills/fable-mode/scripts/workflow-plan-consumer.js']) {
|
|
25
29
|
const file = path.resolve(__dirname, relative);
|
|
@@ -30,6 +34,7 @@ function consumer() {
|
|
|
30
34
|
|
|
31
35
|
function main() {
|
|
32
36
|
const args = parseArgs(process.argv.slice(2));
|
|
37
|
+
if (!WORKFLOW_CONTROLLER_COMMANDS.has(args.command)) throw new Error(usage());
|
|
33
38
|
const sessionId = args.sessionId || readCurrentSession(getWorkspaceRoot());
|
|
34
39
|
if (!sessionId) throw new Error('no active Harness session; pass --session-id explicitly');
|
|
35
40
|
const context = loadWorkflow({ session_id: sessionId });
|
|
@@ -96,7 +101,7 @@ function main() {
|
|
|
96
101
|
if (!args.evidence?.trim()) throw new Error('--evidence is required');
|
|
97
102
|
workflow.state = 'blocked';
|
|
98
103
|
workflow.blockReason = args.evidence.trim();
|
|
99
|
-
} else throw new Error(
|
|
104
|
+
} else throw new Error(usage());
|
|
100
105
|
saveWorkflow(context);
|
|
101
106
|
syncBudgetToRun(context);
|
|
102
107
|
process.stdout.write(JSON.stringify({ state: workflow.state, workflowId: workflow.workflowId, runId: workflow.runId, revision: workflow.revision, escapes: workflow.escapes }) + '\n');
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const fs = require('fs');
|
|
6
|
-
const { loadWorkflow, saveWorkflow, isMajorWorkflow, matchingRun, recordBudgetEvent, readHookInput } = require('./lib/workflow-runtime');
|
|
6
|
+
const { loadWorkflow, saveWorkflow, isMajorWorkflow, matchingRun, recordBudgetEvent, readHookInput, WORKFLOW_CONTROLLER_COMMANDS } = require('./lib/workflow-runtime');
|
|
7
7
|
const { key, classifyShell, cwdOf, commandOf, mutationPaths, linkedWorktree, assertTargets, assertShellScope } = require('./lib/workflow-isolation');
|
|
8
8
|
|
|
9
9
|
const DIRECT = new Set(['Edit', 'Write', 'apply_patch']);
|
|
@@ -12,8 +12,9 @@ const SHELL = new Set(['Bash', 'PowerShell', 'exec_command']);
|
|
|
12
12
|
function isController(command, cwd) {
|
|
13
13
|
// One trusted local executable, literal arguments, no shell evaluation.
|
|
14
14
|
if (/[;&|`\r\n<>$(){}]/.test(command)) return false;
|
|
15
|
-
const match = command.match(/^node\s+(?:"([^"]+)"|'([^']+)'|(\S+))\s+(
|
|
16
|
-
return Boolean(match &&
|
|
15
|
+
const match = command.match(/^node\s+(?:"([^"]+)"|'([^']+)'|(\S+))\s+([A-Za-z][A-Za-z0-9-]*)\b/);
|
|
16
|
+
return Boolean(match && WORKFLOW_CONTROLLER_COMMANDS.has(match[4]) &&
|
|
17
|
+
key(path.resolve(cwd, match[1] || match[2] || match[3])) === key(path.join(__dirname, 'workflow-disposition.js')));
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
function decide(payload) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "harness-everything",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
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": {
|
|
@@ -50,7 +50,9 @@
|
|
|
50
50
|
"commitlint": "commitlint --edit",
|
|
51
51
|
"test:telemetry": "node ci/telemetry.test.js",
|
|
52
52
|
"telemetry:report": "node telemetry/scripts/report.js",
|
|
53
|
-
"telemetry:benchmark": "node telemetry/scripts/benchmark.js"
|
|
53
|
+
"telemetry:benchmark": "node telemetry/scripts/benchmark.js",
|
|
54
|
+
"test:contract-integrity": "node ci/contract-integrity.test.js",
|
|
55
|
+
"contract:integrity": "node contract-integrity/scripts/audit.js"
|
|
54
56
|
},
|
|
55
57
|
"engines": {
|
|
56
58
|
"node": ">=22"
|
|
@@ -7,6 +7,7 @@ const { atomicWriteJson, readJson } = require('./fable-contracts');
|
|
|
7
7
|
|
|
8
8
|
const OPEN_STATES = new Set(['pending', 'active', 'running', 'failed', 'blocked', 'escaped']);
|
|
9
9
|
const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
10
|
+
const WORKFLOW_CONTROLLER_COMMANDS = new Set(['start', 'revision', 'reset-budget', 'escape', 'block']);
|
|
10
11
|
|
|
11
12
|
function isMajorWorkflow(workflow) {
|
|
12
13
|
return Boolean(workflow && (workflow.mutationIsolation?.required || workflow.tier === 'tier3' || String(workflow.strategy || '').startsWith('fable-')));
|
|
@@ -251,4 +252,4 @@ function readHookInput(decide) {
|
|
|
251
252
|
process.stdin.on('error', finish);
|
|
252
253
|
}
|
|
253
254
|
|
|
254
|
-
module.exports = { OPEN_STATES, SAFE_ID, isMajorWorkflow, loadWorkflow, saveWorkflow, budgetLimits, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun, matchingRun, unresolvedStages, readHookInput };
|
|
255
|
+
module.exports = { OPEN_STATES, SAFE_ID, WORKFLOW_CONTROLLER_COMMANDS, isMajorWorkflow, loadWorkflow, saveWorkflow, budgetLimits, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun, matchingRun, unresolvedStages, readHookInput };
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
|
6
|
-
const { loadWorkflow, saveWorkflow, matchingRun, OPEN_STATES, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun } = require('./lib/workflow-runtime');
|
|
6
|
+
const { loadWorkflow, saveWorkflow, matchingRun, OPEN_STATES, ensureWorkflowBudget, recordBudgetEvent, resetWorkflowBudget, syncBudgetToRun, WORKFLOW_CONTROLLER_COMMANDS } = require('./lib/workflow-runtime');
|
|
7
7
|
const { getWorkspaceRoot, readCurrentSession } = require('./lib/harness-state');
|
|
8
8
|
const { atomicWriteJson, readJson } = require('./lib/fable-contracts');
|
|
9
9
|
|
|
@@ -20,6 +20,10 @@ function parseArgs(argv) {
|
|
|
20
20
|
return args;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
function usage() {
|
|
24
|
+
return `Usage: workflow-disposition.js <${[...WORKFLOW_CONTROLLER_COMMANDS].join('|')}> --session-id <id> [--stage-id <id> --reason-code <reason> --scope <scope> --evidence <evidence>]`;
|
|
25
|
+
}
|
|
26
|
+
|
|
23
27
|
function consumer() {
|
|
24
28
|
for (const relative of ['../../fable-mode/scripts/workflow-plan-consumer.js', '../../skills/fable-mode/scripts/workflow-plan-consumer.js']) {
|
|
25
29
|
const file = path.resolve(__dirname, relative);
|
|
@@ -30,6 +34,7 @@ function consumer() {
|
|
|
30
34
|
|
|
31
35
|
function main() {
|
|
32
36
|
const args = parseArgs(process.argv.slice(2));
|
|
37
|
+
if (!WORKFLOW_CONTROLLER_COMMANDS.has(args.command)) throw new Error(usage());
|
|
33
38
|
const sessionId = args.sessionId || readCurrentSession(getWorkspaceRoot());
|
|
34
39
|
if (!sessionId) throw new Error('no active Harness session; pass --session-id explicitly');
|
|
35
40
|
const context = loadWorkflow({ session_id: sessionId });
|
|
@@ -96,7 +101,7 @@ function main() {
|
|
|
96
101
|
if (!args.evidence?.trim()) throw new Error('--evidence is required');
|
|
97
102
|
workflow.state = 'blocked';
|
|
98
103
|
workflow.blockReason = args.evidence.trim();
|
|
99
|
-
} else throw new Error(
|
|
104
|
+
} else throw new Error(usage());
|
|
100
105
|
saveWorkflow(context);
|
|
101
106
|
syncBudgetToRun(context);
|
|
102
107
|
process.stdout.write(JSON.stringify({ state: workflow.state, workflowId: workflow.workflowId, runId: workflow.runId, revision: workflow.revision, escapes: workflow.escapes }) + '\n');
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const fs = require('fs');
|
|
6
|
-
const { loadWorkflow, saveWorkflow, isMajorWorkflow, matchingRun, recordBudgetEvent, readHookInput } = require('./lib/workflow-runtime');
|
|
6
|
+
const { loadWorkflow, saveWorkflow, isMajorWorkflow, matchingRun, recordBudgetEvent, readHookInput, WORKFLOW_CONTROLLER_COMMANDS } = require('./lib/workflow-runtime');
|
|
7
7
|
const { key, classifyShell, cwdOf, commandOf, mutationPaths, linkedWorktree, assertTargets, assertShellScope } = require('./lib/workflow-isolation');
|
|
8
8
|
|
|
9
9
|
const DIRECT = new Set(['Edit', 'Write', 'apply_patch']);
|
|
@@ -12,8 +12,9 @@ const SHELL = new Set(['Bash', 'PowerShell', 'exec_command']);
|
|
|
12
12
|
function isController(command, cwd) {
|
|
13
13
|
// One trusted local executable, literal arguments, no shell evaluation.
|
|
14
14
|
if (/[;&|`\r\n<>$(){}]/.test(command)) return false;
|
|
15
|
-
const match = command.match(/^node\s+(?:"([^"]+)"|'([^']+)'|(\S+))\s+(
|
|
16
|
-
return Boolean(match &&
|
|
15
|
+
const match = command.match(/^node\s+(?:"([^"]+)"|'([^']+)'|(\S+))\s+([A-Za-z][A-Za-z0-9-]*)\b/);
|
|
16
|
+
return Boolean(match && WORKFLOW_CONTROLLER_COMMANDS.has(match[4]) &&
|
|
17
|
+
key(path.resolve(cwd, match[1] || match[2] || match[3])) === key(path.join(__dirname, 'workflow-disposition.js')));
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
function decide(payload) {
|
|
@@ -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.
|
|
4
|
+
"version": "0.11.1",
|
|
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",
|
|
@@ -42,7 +42,7 @@ function runNode(label, script, args = [], options = {}) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
console.log('\n[Phase 1] Static Syntax Check...');
|
|
45
|
-
const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'telemetry', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode', 'multi-agent-workspace'];
|
|
45
|
+
const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'telemetry', 'contract-integrity', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode', 'multi-agent-workspace'];
|
|
46
46
|
const jsFiles = [];
|
|
47
47
|
function walkDir(dir) {
|
|
48
48
|
if (!fs.existsSync(dir)) return;
|
|
@@ -96,6 +96,7 @@ runNode('self-evolve closed loop phase 1-3', path.join(projectRoot, 'ci', 'self-
|
|
|
96
96
|
runNode('phase 5 pre-action gate', path.join(projectRoot, 'ci', 'action-gate.test.js'));
|
|
97
97
|
runNode('phase 5 platform evidence boundary', path.join(projectRoot, 'ci', 'action-gate-platform-doc.test.js'));
|
|
98
98
|
runNode('cross-agent telemetry', path.join(projectRoot, 'ci', 'telemetry.test.js'));
|
|
99
|
+
runNode('contract integrity phase 1', path.join(projectRoot, 'ci', 'contract-integrity.test.js'));
|
|
99
100
|
runNode('issue #99 runtime correctness', path.join(projectRoot, 'ci', 'issue99-runtime.test.js'));
|
|
100
101
|
|
|
101
102
|
console.log('\n[Phase 3] Skill Reference and Behavioral Case Checks...');
|
package/self-evolve/SKILL.md
CHANGED
|
@@ -42,7 +42,7 @@ function runNode(label, script, args = [], options = {}) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
console.log('\n[Phase 1] Static Syntax Check...');
|
|
45
|
-
const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'telemetry', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode', 'multi-agent-workspace'];
|
|
45
|
+
const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'telemetry', 'contract-integrity', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode', 'multi-agent-workspace'];
|
|
46
46
|
const jsFiles = [];
|
|
47
47
|
function walkDir(dir) {
|
|
48
48
|
if (!fs.existsSync(dir)) return;
|
|
@@ -96,6 +96,7 @@ runNode('self-evolve closed loop phase 1-3', path.join(projectRoot, 'ci', 'self-
|
|
|
96
96
|
runNode('phase 5 pre-action gate', path.join(projectRoot, 'ci', 'action-gate.test.js'));
|
|
97
97
|
runNode('phase 5 platform evidence boundary', path.join(projectRoot, 'ci', 'action-gate-platform-doc.test.js'));
|
|
98
98
|
runNode('cross-agent telemetry', path.join(projectRoot, 'ci', 'telemetry.test.js'));
|
|
99
|
+
runNode('contract integrity phase 1', path.join(projectRoot, 'ci', 'contract-integrity.test.js'));
|
|
99
100
|
runNode('issue #99 runtime correctness', path.join(projectRoot, 'ci', 'issue99-runtime.test.js'));
|
|
100
101
|
|
|
101
102
|
console.log('\n[Phase 3] Skill Reference and Behavioral Case Checks...');
|