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.
Files changed (51) hide show
  1. package/dist/cli/headless.js +9 -0
  2. package/dist/cli/headless.js.map +1 -1
  3. package/dist/cli/headlessE2eSession.test.js +189 -0
  4. package/dist/cli/headlessE2eSession.test.js.map +1 -0
  5. package/dist/cli/headlessSessionEvent.test.js +83 -0
  6. package/dist/cli/headlessSessionEvent.test.js.map +1 -0
  7. package/dist/cli/headlessSpine.js +25 -0
  8. package/dist/cli/headlessSpine.js.map +1 -1
  9. package/dist/cli/hooks/chatState.js.map +1 -1
  10. package/dist/cli/hooks/eventsToMessages.js.map +1 -1
  11. package/dist/cli/hooks/useChatTurn.js +40 -7
  12. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  13. package/dist/cli/hooks/useSession.js +0 -2
  14. package/dist/cli/hooks/useSession.js.map +1 -1
  15. package/dist/cli/kraken/evidenceAnchoring.test.js +92 -0
  16. package/dist/cli/kraken/evidenceAnchoring.test.js.map +1 -0
  17. package/dist/cli/kraken/nativeVerification.js +113 -0
  18. package/dist/cli/kraken/nativeVerification.js.map +1 -0
  19. package/dist/cli/kraken/nativeVerification.test.js +207 -0
  20. package/dist/cli/kraken/nativeVerification.test.js.map +1 -0
  21. package/dist/cli/kraken/strictDefaults.test.js +149 -0
  22. package/dist/cli/kraken/strictDefaults.test.js.map +1 -0
  23. package/dist/cli/kraken/verificationBridge.js +121 -8
  24. package/dist/cli/kraken/verificationBridge.js.map +1 -1
  25. package/dist/cli/kraken/verificationBridge.session.test.js +104 -0
  26. package/dist/cli/kraken/verificationBridge.session.test.js.map +1 -0
  27. package/dist/cli/kraken/verificationBridge.test.js +63 -17
  28. package/dist/cli/kraken/verificationBridge.test.js.map +1 -1
  29. package/dist/cli/kraken/verifierAdvisoryLock.test.js +154 -0
  30. package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +1 -0
  31. package/dist/cli/kraken/verifierResolution.js +28 -0
  32. package/dist/cli/kraken/verifierResolution.js.map +1 -0
  33. package/dist/cli/kraken/verifierRoundTrip.test.js +166 -0
  34. package/dist/cli/kraken/verifierRoundTrip.test.js.map +1 -0
  35. package/dist/cli/legacyContextIsolation.test.js +65 -0
  36. package/dist/cli/legacyContextIsolation.test.js.map +1 -0
  37. package/dist/cli/main.bundled.js +893 -317
  38. package/dist/cli/main.bundled.js.map +4 -4
  39. package/dist/cli/missionContinuation.test.js +117 -0
  40. package/dist/cli/missionContinuation.test.js.map +1 -0
  41. package/dist/cli/profileMatrix.test.js +130 -0
  42. package/dist/cli/profileMatrix.test.js.map +1 -0
  43. package/dist/cli/runHeadless.js +68 -8
  44. package/dist/cli/runHeadless.js.map +1 -1
  45. package/dist/cli/sessionManager.js +7 -0
  46. package/dist/cli/sessionManager.js.map +1 -1
  47. package/dist/cli/sessionSpine.js +43 -3
  48. package/dist/cli/sessionSpine.js.map +1 -1
  49. package/dist/cli/zelariMission.js +16 -0
  50. package/dist/cli/zelariMission.js.map +1 -1
  51. 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 + pass WITHOUT evidence → BLOCKED (false-done guard)', () => {
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":"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"}
1
+ {"version":3,"file":"verificationBridge.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verificationBridge.test.ts"],"names":[],"mappings":"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"}
@@ -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"}