zelari-code 2.0.0-alpha.5 → 2.0.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/dist/cli/headless.js +9 -0
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/headlessE2eSession.test.js +189 -0
- package/dist/cli/headlessE2eSession.test.js.map +1 -0
- package/dist/cli/headlessSessionEvent.test.js +83 -0
- package/dist/cli/headlessSessionEvent.test.js.map +1 -0
- package/dist/cli/headlessSpine.js +25 -0
- package/dist/cli/headlessSpine.js.map +1 -1
- package/dist/cli/hooks/chatState.js.map +1 -1
- package/dist/cli/hooks/eventsToMessages.js.map +1 -1
- package/dist/cli/hooks/useChatTurn.js +40 -7
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/hooks/useSession.js +0 -2
- package/dist/cli/hooks/useSession.js.map +1 -1
- package/dist/cli/kraken/evidenceAnchoring.test.js +92 -0
- package/dist/cli/kraken/evidenceAnchoring.test.js.map +1 -0
- package/dist/cli/kraken/nativeVerification.js +113 -0
- package/dist/cli/kraken/nativeVerification.js.map +1 -0
- package/dist/cli/kraken/nativeVerification.test.js +207 -0
- package/dist/cli/kraken/nativeVerification.test.js.map +1 -0
- package/dist/cli/kraken/strictDefaults.test.js +149 -0
- package/dist/cli/kraken/strictDefaults.test.js.map +1 -0
- package/dist/cli/kraken/verificationBridge.js +121 -8
- package/dist/cli/kraken/verificationBridge.js.map +1 -1
- package/dist/cli/kraken/verificationBridge.session.test.js +104 -0
- package/dist/cli/kraken/verificationBridge.session.test.js.map +1 -0
- package/dist/cli/kraken/verificationBridge.test.js +63 -17
- package/dist/cli/kraken/verificationBridge.test.js.map +1 -1
- package/dist/cli/kraken/verifierAdvisoryLock.test.js +154 -0
- package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +1 -0
- package/dist/cli/kraken/verifierResolution.js +28 -0
- package/dist/cli/kraken/verifierResolution.js.map +1 -0
- package/dist/cli/kraken/verifierRoundTrip.test.js +166 -0
- package/dist/cli/kraken/verifierRoundTrip.test.js.map +1 -0
- package/dist/cli/legacyContextIsolation.test.js +65 -0
- package/dist/cli/legacyContextIsolation.test.js.map +1 -0
- package/dist/cli/main.bundled.js +893 -317
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/missionContinuation.test.js +117 -0
- package/dist/cli/missionContinuation.test.js.map +1 -0
- package/dist/cli/profileMatrix.test.js +130 -0
- package/dist/cli/profileMatrix.test.js.map +1 -0
- package/dist/cli/runHeadless.js +68 -8
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/sessionManager.js +7 -0
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/sessionSpine.js +43 -3
- package/dist/cli/sessionSpine.js.map +1 -1
- package/dist/cli/zelariMission.js +16 -0
- package/dist/cli/zelariMission.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* verificationBridge.session — Exit-2/E2.1 spine round-trip.
|
|
3
|
+
*
|
|
4
|
+
* The strict build gate decision must be reconstructible from the session
|
|
5
|
+
* log alone: evaluate → `strictGateEventPayload` → spine append → replay →
|
|
6
|
+
* `evaluateStrictBuildGateFromSession` yields the same verdict. A missing
|
|
7
|
+
* record is "no evidence" (open, not pass); a non-strict record is not
|
|
8
|
+
* admissible.
|
|
9
|
+
*/
|
|
10
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
11
|
+
import { promises as fs } from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import os from 'node:os';
|
|
14
|
+
import { readSessionLog, resolveSessionsDir } from '@zelari/core/session';
|
|
15
|
+
import { lastVerificationRun } from '@zelari/core/verification';
|
|
16
|
+
import { evaluateStrictBuildGateFromSession, strictGateEventPayload, } from './verificationBridge.js';
|
|
17
|
+
import { openHeadlessSpine } from '../headlessSpine.js';
|
|
18
|
+
let tmp;
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'zelari-verify-spine-'));
|
|
21
|
+
});
|
|
22
|
+
afterEach(async () => {
|
|
23
|
+
await fs.rm(tmp, { recursive: true, force: true });
|
|
24
|
+
});
|
|
25
|
+
function eventsPath(sessionId) {
|
|
26
|
+
return path.join(resolveSessionsDir({ baseDir: tmp }), sessionId, 'events.jsonl');
|
|
27
|
+
}
|
|
28
|
+
function fakeGate(blocked) {
|
|
29
|
+
return {
|
|
30
|
+
selectionUsed: true,
|
|
31
|
+
total: 2,
|
|
32
|
+
passed: blocked ? 1 : 2,
|
|
33
|
+
failedChecks: blocked ? ['run tests'] : [],
|
|
34
|
+
unknownChecks: [],
|
|
35
|
+
blocked,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function fakeStrictEvaluation(verdict) {
|
|
39
|
+
if (verdict === 'PASS') {
|
|
40
|
+
return {
|
|
41
|
+
gate: fakeGate(false),
|
|
42
|
+
strict: true,
|
|
43
|
+
evaluation: {
|
|
44
|
+
verdict: 'PASS',
|
|
45
|
+
satisfied: ['check-1-run-tests', 'check-2-lint'],
|
|
46
|
+
unsatisfied: [],
|
|
47
|
+
evidenceComplete: true, eventBackedEvidenceComplete: true,
|
|
48
|
+
summary: 'open (strict PASS): 2/2 criteria pass with evidence',
|
|
49
|
+
},
|
|
50
|
+
blocked: false,
|
|
51
|
+
summary: 'open (strict PASS)',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
gate: fakeGate(true),
|
|
56
|
+
strict: true,
|
|
57
|
+
evaluation: {
|
|
58
|
+
verdict: 'BLOCKED',
|
|
59
|
+
satisfied: ['check-2-lint'],
|
|
60
|
+
unsatisfied: [{ id: 'check-1-run-tests', status: 'fail', reason: 'exit 1' }],
|
|
61
|
+
evidenceComplete: false, eventBackedEvidenceComplete: false,
|
|
62
|
+
summary: 'incomplete (BLOCKED): check-1-run-tests=fail',
|
|
63
|
+
},
|
|
64
|
+
blocked: true,
|
|
65
|
+
summary: 'blocked (strict BLOCKED)',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
describe('evaluateStrictBuildGateFromSession (E2.1)', () => {
|
|
69
|
+
it('round-trips a BLOCKED verdict through the spine log', async () => {
|
|
70
|
+
const handle = await openHeadlessSpine({ sessionId: 'verify-resume', baseDir: tmp, quiet: true });
|
|
71
|
+
handle.verificationRun(strictGateEventPayload(fakeStrictEvaluation('BLOCKED')));
|
|
72
|
+
await handle.spine.flush();
|
|
73
|
+
const report = await readSessionLog(eventsPath('verify-resume'));
|
|
74
|
+
const snap = lastVerificationRun(report.events);
|
|
75
|
+
expect(snap).not.toBeNull();
|
|
76
|
+
expect(snap.verdict).toBe('BLOCKED');
|
|
77
|
+
const fromSession = evaluateStrictBuildGateFromSession('build', snap);
|
|
78
|
+
expect(fromSession.blocked).toBe(true);
|
|
79
|
+
expect(fromSession.strict).toBe(true);
|
|
80
|
+
expect(fromSession.evaluation.verdict).toBe('BLOCKED');
|
|
81
|
+
expect(fromSession.evaluation.unsatisfied[0].id).toBe('check-1-run-tests');
|
|
82
|
+
expect(fromSession.summary).toContain(`seq=${snap.seq}`); // traces back to the log
|
|
83
|
+
await handle.close('test-done');
|
|
84
|
+
});
|
|
85
|
+
it('round-trips a PASS-with-evidence verdict', async () => {
|
|
86
|
+
const handle = await openHeadlessSpine({ sessionId: 'verify-pass', baseDir: tmp, quiet: true });
|
|
87
|
+
handle.verificationRun(strictGateEventPayload(fakeStrictEvaluation('PASS')));
|
|
88
|
+
await handle.spine.flush();
|
|
89
|
+
const report = await readSessionLog(eventsPath('verify-pass'));
|
|
90
|
+
const fromSession = evaluateStrictBuildGateFromSession('build', lastVerificationRun(report.events));
|
|
91
|
+
expect(fromSession.blocked).toBe(false);
|
|
92
|
+
expect(fromSession.evaluation.verdict).toBe('PASS');
|
|
93
|
+
expect(fromSession.evaluation.evidenceComplete).toBe(true);
|
|
94
|
+
await handle.close('test-done');
|
|
95
|
+
});
|
|
96
|
+
it('treats a missing record as no evidence — open, never pass', () => {
|
|
97
|
+
const fromSession = evaluateStrictBuildGateFromSession('build', null);
|
|
98
|
+
expect(fromSession.blocked).toBe(false);
|
|
99
|
+
expect(fromSession.strict).toBe(false);
|
|
100
|
+
expect(fromSession.evaluation).toBeNull();
|
|
101
|
+
expect(fromSession.summary).toContain('no strict verification record');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=verificationBridge.session.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verificationBridge.session.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verificationBridge.session.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,14 @@
|
|
|
6
6
|
* subtract), and the machine-readable payload shape.
|
|
7
7
|
*/
|
|
8
8
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
9
|
-
import { evaluateStrictBuildGate, krakenResultsToContract, strictDoneEnabled, strictGateEventPayload, } from './verificationBridge.js';
|
|
9
|
+
import { evaluateStrictBuildGate, krakenResultsToContract, strictDoneEnabled, strictGateEventPayload, strictGateExitCode, } from './verificationBridge.js';
|
|
10
10
|
import { resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
|
|
11
11
|
const CHECKS = ['session survives concurrent refresh', 'rotated cookie rejects the old token'];
|
|
12
|
+
/** Fake spine emitter that stamps sequential seq so notes become event-backed. */
|
|
13
|
+
function emitSeq() {
|
|
14
|
+
let n = 1;
|
|
15
|
+
return async () => ({ seq: n++ });
|
|
16
|
+
}
|
|
12
17
|
function selectWithChecks(checks) {
|
|
13
18
|
resetKrakenCandidates();
|
|
14
19
|
setKrakenSelection({
|
|
@@ -34,13 +39,13 @@ afterEach(() => {
|
|
|
34
39
|
resetKrakenCandidates();
|
|
35
40
|
});
|
|
36
41
|
describe('krakenResultsToContract', () => {
|
|
37
|
-
it('maps every required check to a required criterion with a stable id', () => {
|
|
42
|
+
it('maps every required check to a required criterion with a stable id', async () => {
|
|
38
43
|
const contract = krakenResultsToContract(CHECKS, [], 1000);
|
|
39
44
|
expect(contract.criteria).toHaveLength(2);
|
|
40
45
|
expect(contract.criteria.every((c) => c.required && c.source === 'kraken-selection')).toBe(true);
|
|
41
46
|
expect(contract.results.every((r) => r.status === 'unknown' && r.source === 'verify-agent')).toBe(true);
|
|
42
47
|
});
|
|
43
|
-
it('a pass WITH a note carries evidence; a pass WITHOUT a note does not', () => {
|
|
48
|
+
it('a pass WITH a note carries evidence; a pass WITHOUT a note does not', async () => {
|
|
44
49
|
const results = [
|
|
45
50
|
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
46
51
|
{ check: CHECKS[1], status: 'pass' },
|
|
@@ -50,7 +55,7 @@ describe('krakenResultsToContract', () => {
|
|
|
50
55
|
expect(contract.results[0].evidence[0].tier).toBe('tool-output');
|
|
51
56
|
expect(contract.results[1].evidence).toHaveLength(0);
|
|
52
57
|
});
|
|
53
|
-
it('tolerates lightly reworded check text (containment matching)', () => {
|
|
58
|
+
it('tolerates lightly reworded check text (containment matching)', async () => {
|
|
54
59
|
const results = [
|
|
55
60
|
{ check: 'Session survives concurrent REFRESH (reworded)', status: 'pass', note: 'x' },
|
|
56
61
|
];
|
|
@@ -60,7 +65,7 @@ describe('krakenResultsToContract', () => {
|
|
|
60
65
|
});
|
|
61
66
|
});
|
|
62
67
|
describe('evaluateStrictBuildGate', () => {
|
|
63
|
-
it('strict off (default): mirrors the legacy gate exactly', () => {
|
|
68
|
+
it('strict off (default): mirrors the legacy gate exactly', async () => {
|
|
64
69
|
delete process.env.ZELARI_STRICT_DONE;
|
|
65
70
|
expect(strictDoneEnabled()).toBe(false);
|
|
66
71
|
selectWithChecks(CHECKS);
|
|
@@ -68,64 +73,105 @@ describe('evaluateStrictBuildGate', () => {
|
|
|
68
73
|
{ check: CHECKS[0], status: 'pass', note: 'ok' },
|
|
69
74
|
{ check: CHECKS[1], status: 'fail', note: 'assert' },
|
|
70
75
|
]);
|
|
71
|
-
const evaluation = evaluateStrictBuildGate('build');
|
|
76
|
+
const evaluation = await evaluateStrictBuildGate('build');
|
|
72
77
|
expect(evaluation.strict).toBe(false);
|
|
73
78
|
expect(evaluation.evaluation).toBeNull();
|
|
74
79
|
expect(evaluation.blocked).toBe(true);
|
|
75
80
|
});
|
|
76
|
-
it('strict on + all pass with notes → PASS', () => {
|
|
81
|
+
it('strict on + all pass with notes → PASS', async () => {
|
|
77
82
|
process.env.ZELARI_STRICT_DONE = '1';
|
|
78
83
|
selectWithChecks(CHECKS);
|
|
79
84
|
setKrakenCheckResults([
|
|
80
85
|
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
81
86
|
{ check: CHECKS[1], status: 'pass', note: 'curl 401' },
|
|
82
87
|
]);
|
|
83
|
-
const evaluation = evaluateStrictBuildGate('build');
|
|
88
|
+
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
84
89
|
expect(evaluation.strict).toBe(true);
|
|
85
90
|
expect(evaluation.evaluation.verdict).toBe('PASS');
|
|
86
91
|
expect(evaluation.blocked).toBe(false);
|
|
87
92
|
});
|
|
88
|
-
it('strict on +
|
|
93
|
+
it('strict on + notes without spine emit → BLOCKED (event-backed required)', async () => {
|
|
94
|
+
process.env.ZELARI_STRICT_DONE = '1';
|
|
95
|
+
selectWithChecks(CHECKS);
|
|
96
|
+
setKrakenCheckResults([
|
|
97
|
+
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
98
|
+
{ check: CHECKS[1], status: 'pass', note: 'curl 401' },
|
|
99
|
+
]);
|
|
100
|
+
const evaluation = await evaluateStrictBuildGate('build'); // no emit → unanchored
|
|
101
|
+
expect(evaluation.evaluation.verdict).toBe('BLOCKED');
|
|
102
|
+
expect(evaluation.evaluation.unsatisfied[0].reason).toContain('event-backed');
|
|
103
|
+
});
|
|
104
|
+
it('strict on + pass WITHOUT evidence → BLOCKED (false-done guard)', async () => {
|
|
89
105
|
process.env.ZELARI_STRICT_DONE = '1';
|
|
90
106
|
selectWithChecks(CHECKS);
|
|
91
107
|
setKrakenCheckResults([
|
|
92
108
|
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
93
109
|
{ check: CHECKS[1], status: 'pass' }, // no note → no evidence
|
|
94
110
|
]);
|
|
95
|
-
const evaluation = evaluateStrictBuildGate('build');
|
|
111
|
+
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
96
112
|
expect(evaluation.evaluation.verdict).toBe('BLOCKED');
|
|
97
113
|
expect(evaluation.blocked).toBe(true);
|
|
98
114
|
expect(evaluation.evaluation.unsatisfied[0].status).toBe('unknown');
|
|
99
115
|
expect(evaluation.evaluation.unsatisfied[0].reason).toContain('without evidence');
|
|
100
116
|
});
|
|
101
|
-
it('strict on + legacy fail → REPAIR_REQUIRED (fail wins over unknown)', () => {
|
|
117
|
+
it('strict on + legacy fail → REPAIR_REQUIRED (fail wins over unknown)', async () => {
|
|
102
118
|
process.env.ZELARI_STRICT_DONE = '1';
|
|
103
119
|
selectWithChecks(CHECKS);
|
|
104
120
|
setKrakenCheckResults([
|
|
105
121
|
{ check: CHECKS[0], status: 'fail', note: 'assert false' },
|
|
106
122
|
{ check: CHECKS[1], status: 'unknown' },
|
|
107
123
|
]);
|
|
108
|
-
const evaluation = evaluateStrictBuildGate('build');
|
|
124
|
+
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
109
125
|
expect(evaluation.evaluation.verdict).toBe('REPAIR_REQUIRED');
|
|
110
126
|
expect(evaluation.blocked).toBe(true);
|
|
111
127
|
});
|
|
112
|
-
it('PLAN turns and turns without selection stay open', () => {
|
|
128
|
+
it('PLAN turns and turns without selection stay open', async () => {
|
|
113
129
|
process.env.ZELARI_STRICT_DONE = '1';
|
|
114
|
-
expect(evaluateStrictBuildGate('plan').blocked).toBe(false);
|
|
130
|
+
expect((await evaluateStrictBuildGate('plan')).blocked).toBe(false);
|
|
115
131
|
resetKrakenCandidates();
|
|
116
|
-
expect(evaluateStrictBuildGate('build').blocked).toBe(false);
|
|
132
|
+
expect((await evaluateStrictBuildGate('build')).blocked).toBe(false);
|
|
117
133
|
});
|
|
118
134
|
});
|
|
119
135
|
describe('strictGateEventPayload', () => {
|
|
120
|
-
it('is JSON-serializable and carries both gate layers', () => {
|
|
136
|
+
it('is JSON-serializable and carries both gate layers', async () => {
|
|
121
137
|
process.env.ZELARI_STRICT_DONE = '1';
|
|
122
138
|
selectWithChecks(CHECKS);
|
|
123
139
|
setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'n' }]);
|
|
124
|
-
const payload = strictGateEventPayload(evaluateStrictBuildGate('build'));
|
|
140
|
+
const payload = strictGateEventPayload(await evaluateStrictBuildGate('build', { emit: emitSeq() }));
|
|
125
141
|
expect(() => JSON.stringify(payload)).not.toThrow();
|
|
126
142
|
expect(payload).toMatchObject({ strict: true, engine: 'kraken-legacy+completion-policy' });
|
|
127
143
|
expect(payload.legacy).toMatchObject({ total: 2 });
|
|
128
144
|
expect(payload.evidence).not.toBeNull();
|
|
129
145
|
});
|
|
130
146
|
});
|
|
147
|
+
describe('strictGateExitCode (E2.2 — blocked strict done closes non-success)', () => {
|
|
148
|
+
it('strict on + blocked after repair → dedicated exit code 4', async () => {
|
|
149
|
+
process.env.ZELARI_STRICT_DONE = '1';
|
|
150
|
+
selectWithChecks(CHECKS);
|
|
151
|
+
setKrakenCheckResults([
|
|
152
|
+
{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' },
|
|
153
|
+
{ check: CHECKS[1], status: 'unknown' },
|
|
154
|
+
]);
|
|
155
|
+
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
156
|
+
expect(evaluation.blocked).toBe(true);
|
|
157
|
+
expect(strictGateExitCode(evaluation)).toBe(4);
|
|
158
|
+
});
|
|
159
|
+
it('strict on + evidence complete → 0 (run outcome unchanged)', async () => {
|
|
160
|
+
process.env.ZELARI_STRICT_DONE = '1';
|
|
161
|
+
selectWithChecks([CHECKS[0]]);
|
|
162
|
+
setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 41/41' }]);
|
|
163
|
+
const evaluation = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
164
|
+
expect(evaluation.blocked).toBe(false);
|
|
165
|
+
expect(strictGateExitCode(evaluation)).toBe(0);
|
|
166
|
+
});
|
|
167
|
+
it('strict off + legacy blocked → 0 (enforcement is strict-only)', async () => {
|
|
168
|
+
delete process.env.ZELARI_STRICT_DONE;
|
|
169
|
+
selectWithChecks(CHECKS);
|
|
170
|
+
setKrakenCheckResults([{ check: CHECKS[0], status: 'fail', note: 'red' }]);
|
|
171
|
+
const evaluation = await evaluateStrictBuildGate('build');
|
|
172
|
+
expect(evaluation.blocked).toBe(true);
|
|
173
|
+
expect(evaluation.strict).toBe(false);
|
|
174
|
+
expect(strictGateExitCode(evaluation)).toBe(0);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
131
177
|
//# sourceMappingURL=verificationBridge.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verificationBridge.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verificationBridge.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"verificationBridge.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verificationBridge.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAGhC,MAAM,MAAM,GAAG,CAAC,qCAAqC,EAAE,sCAAsC,CAAC,CAAC;AAE/F,kFAAkF;AAClF,SAAS,OAAO;IACd,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAgB;IACxC,qBAAqB,EAAE,CAAC;IACxB,kBAAkB,CAAC;QACjB,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,IAAI,OAA2B,CAAC;AAEhC,UAAU,CAAC,GAAG,EAAE;IACd,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACzC,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;;QAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC;IAC9C,qBAAqB,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,OAAO,GAAwB;YACnC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;YAC1D,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;SACrC,CAAC;QACF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,OAAO,GAAwB;YACnC,EAAE,KAAK,EAAE,gDAAgD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;SACvF,CAAC;QACF,MAAM,QAAQ,GAAG,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;YAChD,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;SACrD,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;YAC1D,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;SACvD,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;YAC1D,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;SACvD,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB;QAClF,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;YAC1D,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,wBAAwB;SAC/D,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrE,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;YAC1D,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,UAAU,CAAC,UAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,MAAM,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,qBAAqB,EAAE,CAAC;QACxB,MAAM,CAAC,CAAC,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACpG,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAClF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC;YACpB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;YAC1D,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC;QACrC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* verifierAdvisoryLock — Exit-2.3 lock tests (ADR-0023 × strict BUILD gate).
|
|
3
|
+
*
|
|
4
|
+
* Locks the composition rule the 2.0 verification contract depends on:
|
|
5
|
+
* when the optional LLM verifier is ACTIVE, the deterministic CompletionPolicy
|
|
6
|
+
* stays the FINAL authority of the Kraken BUILD gate.
|
|
7
|
+
*
|
|
8
|
+
* Caso 1 — deterministic criterion UNKNOWN/FAIL + verifier CONFIRMED
|
|
9
|
+
* → no clean success (BLOCKED / REPAIR_REQUIRED, strict exit ≠ 0).
|
|
10
|
+
* Caso 2 — deterministic criteria PASS + verifier REJECTED
|
|
11
|
+
* → the deterministic verdict is NOT rewritten; the review is
|
|
12
|
+
* recorded in the spine as advisory only (exit stays 0).
|
|
13
|
+
*
|
|
14
|
+
* The verifier may add information, never authority. Breaking either test
|
|
15
|
+
* below is a contract regression, not a refactor.
|
|
16
|
+
*/
|
|
17
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
18
|
+
import { DEFAULT_VERIFIER_CONFIG, VerifierService, } from '@zelari/core/verification';
|
|
19
|
+
import { evaluateStrictBuildGate, krakenResultsToContract, strictGateEventPayload, strictGateExitCode, } from './verificationBridge.js';
|
|
20
|
+
import { getKrakenCheckResults, krakenRequiredChecks, resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
|
|
21
|
+
const CHECKS = ['typecheck passes', 'suite verde'];
|
|
22
|
+
function emitSeq() {
|
|
23
|
+
let n = 1;
|
|
24
|
+
return async () => ({ seq: n++ });
|
|
25
|
+
}
|
|
26
|
+
function selectWithChecks() {
|
|
27
|
+
resetKrakenCandidates();
|
|
28
|
+
setKrakenSelection({
|
|
29
|
+
status: 'selected',
|
|
30
|
+
winnerIndex: 1,
|
|
31
|
+
rationale: 'stronger evidence',
|
|
32
|
+
requiredChecks: CHECKS,
|
|
33
|
+
degraded: false,
|
|
34
|
+
verifier: null,
|
|
35
|
+
judgedBy: 'llm',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Enabled verifier with a fixed test model; `reply` is the raw LLM answer. */
|
|
39
|
+
function activeVerifier(reply, emitted) {
|
|
40
|
+
return new VerifierService({
|
|
41
|
+
callModel: async () => ({
|
|
42
|
+
text: reply,
|
|
43
|
+
provider: 'test',
|
|
44
|
+
model: 'verifier-1',
|
|
45
|
+
}),
|
|
46
|
+
config: {
|
|
47
|
+
...DEFAULT_VERIFIER_CONFIG,
|
|
48
|
+
enabled: true,
|
|
49
|
+
model: { mode: 'fixed', provider: 'test', model: 'verifier-1' },
|
|
50
|
+
},
|
|
51
|
+
emit: async (input) => {
|
|
52
|
+
emitted.push(input);
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const CONFIRMED = '{"verdict":"confirmed","score":0.97,"rationale":"looks done to me"}';
|
|
57
|
+
const REJECTED = '{"verdict":"rejected","score":0.05,"rationale":"not convinced"}';
|
|
58
|
+
/** Contract the runtime hands to BOTH the strict gate and the verifier. */
|
|
59
|
+
function currentContract() {
|
|
60
|
+
return krakenResultsToContract(krakenRequiredChecks(), getKrakenCheckResults());
|
|
61
|
+
}
|
|
62
|
+
let envPrev;
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
envPrev = process.env.ZELARI_STRICT_DONE;
|
|
65
|
+
process.env.ZELARI_STRICT_DONE = '1';
|
|
66
|
+
resetKrakenCandidates();
|
|
67
|
+
});
|
|
68
|
+
afterEach(() => {
|
|
69
|
+
if (envPrev === undefined)
|
|
70
|
+
delete process.env.ZELARI_STRICT_DONE;
|
|
71
|
+
else
|
|
72
|
+
process.env.ZELARI_STRICT_DONE = envPrev;
|
|
73
|
+
resetKrakenCandidates();
|
|
74
|
+
});
|
|
75
|
+
describe('Exit-2.3 lock: verifier LLM active cannot change the completion authority', () => {
|
|
76
|
+
it('Caso 1a — unknown criterion + verifier CONFIRMED → BLOCKED, strict exit 4 (advisory recorded, never applied)', async () => {
|
|
77
|
+
selectWithChecks();
|
|
78
|
+
setKrakenCheckResults([]); // verify tentacle never reported → unknown ≠ pass
|
|
79
|
+
const emitted = [];
|
|
80
|
+
const verifier = activeVerifier(CONFIRMED, emitted);
|
|
81
|
+
const review = await verifier.reviewCompletion({
|
|
82
|
+
summary: 'done: all green',
|
|
83
|
+
results: currentContract().results,
|
|
84
|
+
});
|
|
85
|
+
const gate = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
86
|
+
// The review itself may say "confirmed" — it is advisory information only.
|
|
87
|
+
expect(review.verdict).toBe('confirmed');
|
|
88
|
+
expect(review.effectiveModel).toEqual({
|
|
89
|
+
mode: 'fixed',
|
|
90
|
+
provider: 'test',
|
|
91
|
+
model: 'verifier-1',
|
|
92
|
+
});
|
|
93
|
+
// The deterministic policy stays the final authority: unknown → BLOCKED.
|
|
94
|
+
expect(gate.strict).toBe(true);
|
|
95
|
+
expect(gate.evaluation.verdict).toBe('BLOCKED');
|
|
96
|
+
expect(gate.blocked).toBe(true);
|
|
97
|
+
expect(strictGateExitCode(gate)).toBe(4);
|
|
98
|
+
expect(strictGateEventPayload(gate).verdict).toBe('BLOCKED');
|
|
99
|
+
// The spine keeps the verifier review as a separate advisory record.
|
|
100
|
+
expect(emitted).toHaveLength(1);
|
|
101
|
+
const data = emitted[0].data;
|
|
102
|
+
expect(data.source).toBe('verifier-model');
|
|
103
|
+
expect(data.verdict).toBe('confirmed');
|
|
104
|
+
expect(data.model).toBe('verifier-1');
|
|
105
|
+
expect(data.selectionMode).toBe('fixed');
|
|
106
|
+
});
|
|
107
|
+
it('Caso 1b — FAIL criterion + verifier CONFIRMED → REPAIR_REQUIRED (fail wins), review downgraded to unknown', async () => {
|
|
108
|
+
selectWithChecks();
|
|
109
|
+
setKrakenCheckResults([
|
|
110
|
+
{ check: CHECKS[0], status: 'pass', note: 'tsc clean' },
|
|
111
|
+
{ check: CHECKS[1], status: 'fail', note: 'vitest 1/2' },
|
|
112
|
+
]);
|
|
113
|
+
const emitted = [];
|
|
114
|
+
const verifier = activeVerifier(CONFIRMED, emitted);
|
|
115
|
+
const review = await verifier.reviewCompletion({
|
|
116
|
+
summary: 'done: mostly green',
|
|
117
|
+
results: currentContract().results,
|
|
118
|
+
});
|
|
119
|
+
const gate = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
120
|
+
// The service itself refuses to confirm over a failed deterministic check.
|
|
121
|
+
expect(review.verdict).toBe('unknown');
|
|
122
|
+
expect(review.fallback).toBe('discrete');
|
|
123
|
+
expect(review.rationale).toContain('cannot confirm');
|
|
124
|
+
// And even if it had not: the policy converts fail into repair, not done.
|
|
125
|
+
expect(gate.evaluation.verdict).toBe('REPAIR_REQUIRED');
|
|
126
|
+
expect(gate.blocked).toBe(true);
|
|
127
|
+
expect(strictGateExitCode(gate)).toBe(4);
|
|
128
|
+
});
|
|
129
|
+
it('Caso 2 — deterministic PASS + verifier REJECTED → PASS untouched, exit 0, rejection recorded as advisory', async () => {
|
|
130
|
+
selectWithChecks();
|
|
131
|
+
setKrakenCheckResults([
|
|
132
|
+
{ check: CHECKS[0], status: 'pass', note: 'tsc clean' },
|
|
133
|
+
{ check: CHECKS[1], status: 'pass', note: 'vitest 41/41' },
|
|
134
|
+
]);
|
|
135
|
+
const emitted = [];
|
|
136
|
+
const verifier = activeVerifier(REJECTED, emitted);
|
|
137
|
+
const review = await verifier.reviewCompletion({
|
|
138
|
+
summary: 'done: all green',
|
|
139
|
+
results: currentContract().results,
|
|
140
|
+
});
|
|
141
|
+
const gate = await evaluateStrictBuildGate('build', { emit: emitSeq() });
|
|
142
|
+
// The rejection is real, recorded, and advisory — it cannot dirty a
|
|
143
|
+
// deterministic strict PASS (no false-block from narration either).
|
|
144
|
+
expect(review.verdict).toBe('rejected');
|
|
145
|
+
expect(gate.evaluation.verdict).toBe('PASS');
|
|
146
|
+
expect(gate.blocked).toBe(false);
|
|
147
|
+
expect(strictGateExitCode(gate)).toBe(0);
|
|
148
|
+
expect(strictGateEventPayload(gate).verdict).toBe('PASS');
|
|
149
|
+
const data = emitted[0].data;
|
|
150
|
+
expect(data.verdict).toBe('rejected');
|
|
151
|
+
expect(data.source).toBe('verifier-model');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=verifierAdvisoryLock.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifierAdvisoryLock.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierAdvisoryLock.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getKrakenVerifierOverride } from '../providerConfig.js';
|
|
2
|
+
/**
|
|
3
|
+
* Override → ModelSelection. A complete, non-empty {provider, model} pair is
|
|
4
|
+
* `fixed`; anything else (undefined, null, partial, blank) is `inherit` —
|
|
5
|
+
* matching providerConfig, which already drops invalid overrides on load.
|
|
6
|
+
*/
|
|
7
|
+
export function verifierOverrideToModelSelection(override) {
|
|
8
|
+
if (override &&
|
|
9
|
+
typeof override.provider === 'string' &&
|
|
10
|
+
typeof override.model === 'string' &&
|
|
11
|
+
override.provider.trim().length > 0 &&
|
|
12
|
+
override.model.trim().length > 0) {
|
|
13
|
+
return {
|
|
14
|
+
mode: 'fixed',
|
|
15
|
+
provider: override.provider.trim(),
|
|
16
|
+
model: override.model.trim(),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return { mode: 'inherit' };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Live runtime resolution: read provider.json the way a fresh process would
|
|
23
|
+
* after a Desktop restart and map it to the VerifierService model selection.
|
|
24
|
+
*/
|
|
25
|
+
export function loadVerifierModelSelection() {
|
|
26
|
+
return verifierOverrideToModelSelection(getKrakenVerifierOverride());
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=verifierResolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifierResolution.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierResolution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAQjE;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAC9C,QAAsC;IAEtC,IACE,QAAQ;QACR,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;QACrC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;QAClC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACnC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAChC,CAAC;QACD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,gCAAgC,CAAC,yBAAyB,EAAE,CAAC,CAAC;AACvE,CAAC"}
|