zelari-code 2.1.0 → 2.1.2

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 (114) hide show
  1. package/README.md +4 -4
  2. package/package.json +8 -5
  3. package/dist/cli/ast/engine.test.js +0 -101
  4. package/dist/cli/ast/engine.test.js.map +0 -1
  5. package/dist/cli/ast/tools.test.js +0 -124
  6. package/dist/cli/ast/tools.test.js.map +0 -1
  7. package/dist/cli/headless.test.js +0 -107
  8. package/dist/cli/headless.test.js.map +0 -1
  9. package/dist/cli/headlessE2eSession.test.js +0 -189
  10. package/dist/cli/headlessE2eSession.test.js.map +0 -1
  11. package/dist/cli/headlessHistorySeed.test.js +0 -158
  12. package/dist/cli/headlessHistorySeed.test.js.map +0 -1
  13. package/dist/cli/headlessSessionEvent.test.js +0 -83
  14. package/dist/cli/headlessSessionEvent.test.js.map +0 -1
  15. package/dist/cli/headlessSpine.test.js +0 -153
  16. package/dist/cli/headlessSpine.test.js.map +0 -1
  17. package/dist/cli/hooks/observationStore.test.js +0 -135
  18. package/dist/cli/hooks/observationStore.test.js.map +0 -1
  19. package/dist/cli/hooks/sessionSurface.test.js +0 -112
  20. package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
  21. package/dist/cli/kraken/candidateRegistry.test.js +0 -211
  22. package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
  23. package/dist/cli/kraken/completionGate.test.js +0 -172
  24. package/dist/cli/kraken/completionGate.test.js.map +0 -1
  25. package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
  26. package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
  27. package/dist/cli/kraken/evidenceProvenance.test.js +0 -113
  28. package/dist/cli/kraken/evidenceProvenance.test.js.map +0 -1
  29. package/dist/cli/kraken/executor.workbench.test.js +0 -134
  30. package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
  31. package/dist/cli/kraken/metrics.test.js +0 -145
  32. package/dist/cli/kraken/metrics.test.js.map +0 -1
  33. package/dist/cli/kraken/nativeVerification.test.js +0 -207
  34. package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
  35. package/dist/cli/kraken/planner.test.js +0 -43
  36. package/dist/cli/kraken/planner.test.js.map +0 -1
  37. package/dist/cli/kraken/scriptPlanner.test.js +0 -152
  38. package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
  39. package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
  40. package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
  41. package/dist/cli/kraken/skillSuggest.test.js +0 -157
  42. package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
  43. package/dist/cli/kraken/strictDefaults.test.js +0 -149
  44. package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
  45. package/dist/cli/kraken/strictGatePackIndependence.test.js +0 -112
  46. package/dist/cli/kraken/strictGatePackIndependence.test.js.map +0 -1
  47. package/dist/cli/kraken/turnRuntime.test.js +0 -377
  48. package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
  49. package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
  50. package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
  51. package/dist/cli/kraken/verificationBridge.test.js +0 -177
  52. package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
  53. package/dist/cli/kraken/verifier.test.js +0 -232
  54. package/dist/cli/kraken/verifier.test.js.map +0 -1
  55. package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
  56. package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
  57. package/dist/cli/kraken/verifierLifecycle.test.js +0 -181
  58. package/dist/cli/kraken/verifierLifecycle.test.js.map +0 -1
  59. package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
  60. package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
  61. package/dist/cli/kraken/verifierSettings.test.js +0 -237
  62. package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
  63. package/dist/cli/kraken/verifyReport.test.js +0 -111
  64. package/dist/cli/kraken/verifyReport.test.js.map +0 -1
  65. package/dist/cli/kraken/weaknessMeter.test.js +0 -212
  66. package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
  67. package/dist/cli/kraken/workbench.test.js +0 -253
  68. package/dist/cli/kraken/workbench.test.js.map +0 -1
  69. package/dist/cli/kraken/workbenchView.test.js +0 -130
  70. package/dist/cli/kraken/workbenchView.test.js.map +0 -1
  71. package/dist/cli/legacyContextIsolation.test.js +0 -65
  72. package/dist/cli/legacyContextIsolation.test.js.map +0 -1
  73. package/dist/cli/lsp/tools.test.js +0 -90
  74. package/dist/cli/lsp/tools.test.js.map +0 -1
  75. package/dist/cli/missionContinuation.test.js +0 -117
  76. package/dist/cli/missionContinuation.test.js.map +0 -1
  77. package/dist/cli/profileMatrix.test.js +0 -130
  78. package/dist/cli/profileMatrix.test.js.map +0 -1
  79. package/dist/cli/provider/capabilities.test.js +0 -46
  80. package/dist/cli/provider/capabilities.test.js.map +0 -1
  81. package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
  82. package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
  83. package/dist/cli/providerConfig.test.js +0 -85
  84. package/dist/cli/providerConfig.test.js.map +0 -1
  85. package/dist/cli/sessionReplayInvariant.test.js +0 -187
  86. package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
  87. package/dist/cli/sessionSpine.test.js +0 -171
  88. package/dist/cli/sessionSpine.test.js.map +0 -1
  89. package/dist/cli/thinking.test.js +0 -214
  90. package/dist/cli/thinking.test.js.map +0 -1
  91. package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
  92. package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
  93. package/dist/cli/tools/inspectCommand.test.js +0 -311
  94. package/dist/cli/tools/inspectCommand.test.js.map +0 -1
  95. package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
  96. package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
  97. package/dist/cli/tools/krakenSelectTool.test.js +0 -246
  98. package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
  99. package/dist/cli/tools/observeBatch.test.js +0 -329
  100. package/dist/cli/tools/observeBatch.test.js.map +0 -1
  101. package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
  102. package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
  103. package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
  104. package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
  105. package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
  106. package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
  107. package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
  108. package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
  109. package/dist/cli/workspace/planDriftCheck.test.js +0 -146
  110. package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
  111. package/dist/cli/workspace/planStore.test.js +0 -295
  112. package/dist/cli/workspace/planStore.test.js.map +0 -1
  113. package/dist/cli/zelariMission.test.js +0 -44
  114. package/dist/cli/zelariMission.test.js.map +0 -1
@@ -1,181 +0,0 @@
1
- /**
2
- * verifierLifecycle tests — 2.1 T4: the core VerifierService joins the normal
3
- * headless lifecycle as an OPT-IN advisory pass.
4
- *
5
- * Locks:
6
- * - opt-in rule: default (inherit, no env) OFF; fixed selection ON;
7
- * ZELARI_VERIFIER_REVIEW=1 ON; =0 forces OFF even with a fixed override;
8
- * - disabled → no review attached, evaluation untouched;
9
- * - enabled → review attached and serialized in the verification.run payload
10
- * (verifier.advisory = true) + its own spine event (source verifier-model);
11
- * - ADVISORY ONLY at lifecycle level: a REJECTED review cannot block a PASS
12
- * evaluation, a CONFIRMED review cannot un-block a REPAIR_REQUIRED one;
13
- * - a failing verifier call degrades (declared discrete fallback) and never
14
- * throws into the parent turn.
15
- */
16
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
17
- import { runAdvisoryVerifierReview, verifierReviewEnabled } from './verifierLifecycle.js';
18
- import { evaluateStrictBuildGate, strictGateEventPayload, } from './verificationBridge.js';
19
- import { resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection } from './candidateRegistry.js';
20
- const CHECK = 'session survives concurrent refresh';
21
- function emitSeq() {
22
- let n = 1;
23
- const events = [];
24
- return async (input) => {
25
- events.push(input);
26
- void events;
27
- return { seq: n++ };
28
- };
29
- }
30
- /** Spine emitter that records every appended event (for review-event asserts). */
31
- function recordingEmit() {
32
- const events = [];
33
- let n = 1;
34
- return {
35
- events,
36
- emit: async (input) => {
37
- events.push(input);
38
- return { seq: n++ };
39
- },
40
- };
41
- }
42
- function selectWithChecks(checks) {
43
- resetKrakenCandidates();
44
- setKrakenSelection({
45
- status: 'selected',
46
- winnerIndex: 0,
47
- rationale: 'test',
48
- requiredChecks: checks,
49
- degraded: false,
50
- verifier: null,
51
- judgedBy: 'llm',
52
- });
53
- }
54
- async function evaluatedGate(status, emit) {
55
- selectWithChecks([CHECK]);
56
- setKrakenCheckResults([{ check: CHECK, status, note: 'vitest 58/58' }]);
57
- return evaluateStrictBuildGate('build', { env: {}, ...(emit ? { emit: emit } : {}) });
58
- }
59
- function stubCaller(text) {
60
- return async () => ({ text, provider: 'grok', model: 'verifier-x' });
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('verifierReviewEnabled (opt-in rule)', () => {
76
- const inherit = { mode: 'inherit' };
77
- const fixed = { mode: 'fixed', provider: 'grok', model: 'verifier-x' };
78
- it('default (inherit, no env) is OFF — zero baseline cost', () => {
79
- expect(verifierReviewEnabled(inherit, {})).toBe(false);
80
- });
81
- it('a dedicated (fixed) verifier enables the review', () => {
82
- expect(verifierReviewEnabled(fixed, {})).toBe(true);
83
- });
84
- it('ZELARI_VERIFIER_REVIEW=1 enables it even on inherit', () => {
85
- expect(verifierReviewEnabled(inherit, { ZELARI_VERIFIER_REVIEW: '1' })).toBe(true);
86
- expect(verifierReviewEnabled(inherit, { ZELARI_VERIFIER_REVIEW: 'true' })).toBe(true);
87
- });
88
- it('ZELARI_VERIFIER_REVIEW=0 forces OFF even with a fixed override', () => {
89
- expect(verifierReviewEnabled(fixed, { ZELARI_VERIFIER_REVIEW: '0' })).toBe(false);
90
- expect(verifierReviewEnabled(fixed, { ZELARI_VERIFIER_REVIEW: 'off' })).toBe(false);
91
- });
92
- });
93
- describe('runAdvisoryVerifierReview', () => {
94
- it('disabled → returns null and leaves the evaluation untouched', async () => {
95
- const gate = await evaluatedGate('pass', emitSeq());
96
- const review = await runAdvisoryVerifierReview(gate, {
97
- env: {},
98
- selection: { mode: 'inherit' },
99
- callModel: stubCaller('{"verdict":"confirmed"}'),
100
- });
101
- expect(review).toBeNull();
102
- expect(gate.review).toBeUndefined();
103
- expect(strictGateEventPayload(gate).verifier).toBeNull();
104
- });
105
- it('enabled → attaches the review and serializes it as advisory in the payload', async () => {
106
- const spine = recordingEmit();
107
- const gate = await evaluatedGate('pass', spine.emit);
108
- const review = await runAdvisoryVerifierReview(gate, {
109
- env: {},
110
- selection: { mode: 'fixed', provider: 'grok', model: 'verifier-x' },
111
- callModel: stubCaller('{"verdict":"confirmed","score":0.9,"rationale":"ok"}'),
112
- emit: spine.emit,
113
- });
114
- expect(review).not.toBeNull();
115
- expect(review?.verdict).toBe('confirmed');
116
- expect(gate.review?.verdict).toBe('confirmed');
117
- const payload = strictGateEventPayload(gate);
118
- expect(payload.verifier).toMatchObject({ verdict: 'confirmed', advisory: true });
119
- // Its own spine event, source-tagged verifier-model (VerifierService.emitReview).
120
- const reviewEvents = spine.events.filter((e) => e.data?.source === 'verifier-model');
121
- expect(reviewEvents.length).toBe(1);
122
- });
123
- it('ADVISORY LOCK: a REJECTED review cannot block a PASS evaluation', async () => {
124
- const gate = await evaluatedGate('pass', emitSeq());
125
- await runAdvisoryVerifierReview(gate, {
126
- env: {},
127
- selection: { mode: 'fixed', provider: 'grok', model: 'verifier-x' },
128
- callModel: stubCaller('{"verdict":"rejected","rationale":"suspicious"}'),
129
- });
130
- expect(gate.review?.verdict).toBe('rejected');
131
- expect(gate.blocked).toBe(false);
132
- const payload = strictGateEventPayload(gate);
133
- expect(payload.verdict).not.toBe('BLOCKED');
134
- expect(payload.verifier?.verdict).toBe('rejected');
135
- });
136
- it('ADVISORY LOCK: a CONFIRMED review cannot un-block a failing evaluation', async () => {
137
- const gate = await evaluatedGate('fail', emitSeq());
138
- expect(gate.blocked).toBe(true);
139
- await runAdvisoryVerifierReview(gate, {
140
- env: {},
141
- selection: { mode: 'fixed', provider: 'grok', model: 'verifier-x' },
142
- callModel: stubCaller('{"verdict":"confirmed"}'),
143
- });
144
- // VerifierService itself downgrades confirm-on-failed-deterministic…
145
- expect(gate.review?.verdict).toBe('unknown');
146
- // …and the lifecycle keeps the deterministic verdict either way.
147
- expect(gate.blocked).toBe(true);
148
- expect(gate.evaluation?.verdict).toBe('REPAIR_REQUIRED');
149
- });
150
- it('a failing verifier call degrades (declared fallback) and never throws', async () => {
151
- const gate = await evaluatedGate('pass', emitSeq());
152
- const boom = async () => {
153
- throw new Error('provider 503');
154
- };
155
- const review = await runAdvisoryVerifierReview(gate, {
156
- env: {},
157
- selection: { mode: 'fixed', provider: 'grok', model: 'verifier-x' },
158
- callModel: boom,
159
- });
160
- expect(review?.verdict).toBe('unknown');
161
- expect(review?.fallback).toBe('discrete');
162
- expect(gate.blocked).toBe(false);
163
- });
164
- it('skips turns without strict evidence (nothing to review)', async () => {
165
- const gate = {
166
- gate: { selectionUsed: false, total: 0, passed: 0, failedChecks: [], unknownChecks: [], blocked: false },
167
- strict: false,
168
- evaluation: null,
169
- native: null,
170
- blocked: false,
171
- summary: 'open',
172
- };
173
- const review = await runAdvisoryVerifierReview(gate, {
174
- env: {},
175
- selection: { mode: 'fixed', provider: 'grok', model: 'verifier-x' },
176
- callModel: stubCaller('{"verdict":"confirmed"}'),
177
- });
178
- expect(review).toBeNull();
179
- });
180
- });
181
- //# sourceMappingURL=verifierLifecycle.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifierLifecycle.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierLifecycle.test.ts"],"names":[],"mappings":"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"}
@@ -1,166 +0,0 @@
1
- /**
2
- * verifierRoundTrip — Desktop verifier round-trip smoke (Exit-3.1, plan §9).
3
- *
4
- * Locks the FULL chain the plan requires:
5
- *
6
- * Desktop settings (applySetConfig — the real --set-config channel)
7
- * → persist (provider.json)
8
- * → restart/load (fresh disk read)
9
- * → runtime resolution (loadVerifierModelSelection)
10
- * → VerifierService.reviewCompletion
11
- * → verification.run event logs the ACTUAL model used
12
- *
13
- * The three cases from the plan (§9):
14
- * - Inherit: Primary=A, Verifier=inherit → effective verifier = A
15
- * - Dedicated: Primary=A, Verifier=B → effective verifier = B
16
- * - Reset: Dedicated B → clear override → inherit A
17
- *
18
- * The model call is stubbed at the transport boundary (callModel), reporting
19
- * the provider/model the selected transport would actually use: in inherit
20
- * mode the session transport (A), in fixed mode the dedicated transport (B).
21
- */
22
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
23
- import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
24
- import { tmpdir } from 'node:os';
25
- import path from 'node:path';
26
- import { VerifierService, VerifierConfigSchema, } from '@zelari/core/verification';
27
- import { getKrakenVerifierOverride } from '../providerConfig.js';
28
- import { applySetConfig, buildDesktopConfigSnapshot } from '../desktopConfig.js';
29
- import { loadVerifierModelSelection, verifierOverrideToModelSelection, } from './verifierResolution.js';
30
- // Primary model A (the session/run model).
31
- const PRIMARY = { provider: 'grok', model: 'grok-4.6' };
32
- // Dedicated verifier B.
33
- const DEDICATED = { provider: 'anthropic', model: 'claude-sonnet-4-6' };
34
- let tmpDir = '';
35
- let savedEnv;
36
- beforeEach(() => {
37
- tmpDir = mkdtempSync(path.join(tmpdir(), 'zelari-vrt-'));
38
- savedEnv = process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
39
- process.env.ANATHEMA_PROVIDER_CONFIG_FILE = path.join(tmpDir, 'provider.json');
40
- writeFileSync(process.env.ANATHEMA_PROVIDER_CONFIG_FILE, JSON.stringify({
41
- activeProviderId: PRIMARY.provider,
42
- modelByProvider: { [PRIMARY.provider]: PRIMARY.model },
43
- }, null, 2), 'utf-8');
44
- delete process.env.ZELARI_KRAKEN_SELECT_PROVIDER;
45
- delete process.env.ZELARI_KRAKEN_SELECT_MODEL;
46
- });
47
- afterEach(() => {
48
- if (savedEnv === undefined)
49
- delete process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
50
- else
51
- process.env.ANATHEMA_PROVIDER_CONFIG_FILE = savedEnv;
52
- rmSync(tmpDir, { recursive: true, force: true });
53
- });
54
- /** Enabled VerifierService from the resolved selection; captures spine events. */
55
- function verifierFor(selection, transport, emitted) {
56
- const config = VerifierConfigSchema.parse({ enabled: true, model: selection });
57
- return new VerifierService({
58
- config,
59
- callModel: async () => ({
60
- text: '{"verdict":"confirmed","score":0.9,"rationale":"round-trip smoke"}',
61
- provider: transport.provider,
62
- model: transport.model,
63
- }),
64
- emit: async (input) => {
65
- emitted.push(input);
66
- },
67
- });
68
- }
69
- describe('Desktop verifier round-trip (Exit-3.1)', () => {
70
- it('Inherit: Primary=A, Verifier=inherit → effective verifier = A, event logs A', async () => {
71
- // (1) Desktop settings: no override (the recommended default).
72
- // (2) Restart/load: fresh disk read → inherit.
73
- expect(getKrakenVerifierOverride()).toBeUndefined();
74
- // UI reload leg: the snapshot exposes null = inherit.
75
- expect(buildDesktopConfigSnapshot().krakenVerifier).toBeNull();
76
- // (3) Runtime resolution.
77
- const selection = loadVerifierModelSelection();
78
- expect(selection).toEqual({ mode: 'inherit' });
79
- // (4)+(5) Review + spine event: the session transport reports the primary model.
80
- const emitted = [];
81
- const verifier = verifierFor(selection, PRIMARY, emitted);
82
- const review = await verifier.reviewCompletion({
83
- summary: 'round-trip smoke: all checks green',
84
- results: [],
85
- session: { provider: PRIMARY.provider, model: PRIMARY.model },
86
- });
87
- expect(review.effectiveModel).toEqual({ mode: 'inherit', ...PRIMARY });
88
- expect(emitted).toHaveLength(1);
89
- expect(emitted[0].kind).toBe('verification.run');
90
- const data = emitted[0].data;
91
- expect(data.source).toBe('verifier-model');
92
- expect(data.selectionMode).toBe('inherit');
93
- expect(data.provider).toBe(PRIMARY.provider);
94
- expect(data.model).toBe(PRIMARY.model);
95
- });
96
- it('Dedicated: Primary=A, Verifier=B → effective verifier = B, event logs B', async () => {
97
- // (1) Desktop settings → persist through the real --set-config channel.
98
- const applied = applySetConfig({
99
- verifierProvider: DEDICATED.provider,
100
- verifierModel: DEDICATED.model,
101
- });
102
- expect(applied.ok).toBe(true);
103
- // UI reload leg: the snapshot exposes the dedicated override.
104
- expect(buildDesktopConfigSnapshot().krakenVerifier).toEqual(DEDICATED);
105
- // (2) Restart/load: fresh disk read.
106
- expect(getKrakenVerifierOverride()).toEqual(DEDICATED);
107
- // (3) Runtime resolution.
108
- const selection = loadVerifierModelSelection();
109
- expect(selection).toEqual({ mode: 'fixed', ...DEDICATED });
110
- // (4)+(5) Review + spine: the dedicated transport reports B even though the
111
- // session model is A — this is the "event logs actual model" lock.
112
- const emitted = [];
113
- const verifier = verifierFor(selection, DEDICATED, emitted);
114
- const review = await verifier.reviewCompletion({
115
- summary: 'round-trip smoke: all checks green',
116
- results: [],
117
- session: { provider: PRIMARY.provider, model: PRIMARY.model },
118
- });
119
- expect(review.effectiveModel).toEqual({ mode: 'fixed', ...DEDICATED });
120
- const data = emitted[0].data;
121
- expect(data.selectionMode).toBe('fixed');
122
- expect(data.provider).toBe(DEDICATED.provider);
123
- expect(data.model).toBe(DEDICATED.model);
124
- });
125
- it('Reset: Dedicated B → clear override → inherit A', async () => {
126
- // Start dedicated, then reset through the real channel.
127
- const set = applySetConfig({
128
- verifierProvider: DEDICATED.provider,
129
- verifierModel: DEDICATED.model,
130
- });
131
- expect(set.ok).toBe(true);
132
- const cleared = applySetConfig({ verifierClear: true });
133
- expect(cleared.ok).toBe(true);
134
- // UI reload leg: back to null (inherit).
135
- expect(buildDesktopConfigSnapshot().krakenVerifier).toBeNull();
136
- // Restart/load + resolution.
137
- expect(getKrakenVerifierOverride()).toBeUndefined();
138
- const selection = loadVerifierModelSelection();
139
- expect(selection).toEqual({ mode: 'inherit' });
140
- // Review + spine: back to the primary model A.
141
- const emitted = [];
142
- const verifier = verifierFor(selection, PRIMARY, emitted);
143
- const review = await verifier.reviewCompletion({
144
- summary: 'round-trip smoke: all checks green',
145
- results: [],
146
- session: { provider: PRIMARY.provider, model: PRIMARY.model },
147
- });
148
- expect(review.effectiveModel).toEqual({ mode: 'inherit', ...PRIMARY });
149
- const data = emitted[0].data;
150
- expect(data.selectionMode).toBe('inherit');
151
- expect(data.model).toBe(PRIMARY.model);
152
- });
153
- it('verifierOverrideToModelSelection: partial/blank overrides degrade to inherit', () => {
154
- expect(verifierOverrideToModelSelection(undefined)).toEqual({ mode: 'inherit' });
155
- expect(verifierOverrideToModelSelection(null)).toEqual({ mode: 'inherit' });
156
- expect(verifierOverrideToModelSelection({ provider: 'grok', model: ' ' })).toEqual({ mode: 'inherit' });
157
- expect(verifierOverrideToModelSelection({ provider: '', model: 'm' })).toEqual({ mode: 'inherit' });
158
- // Complete overrides are fixed, trimmed.
159
- expect(verifierOverrideToModelSelection({ provider: ' grok ', model: ' grok-4.6 ' })).toEqual({
160
- mode: 'fixed',
161
- provider: 'grok',
162
- model: 'grok-4.6',
163
- });
164
- });
165
- });
166
- //# sourceMappingURL=verifierRoundTrip.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifierRoundTrip.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierRoundTrip.test.ts"],"names":[],"mappings":"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"}
@@ -1,237 +0,0 @@
1
- /**
2
- * verifierSettings — Fase 9 settings tests (ADR-0020 §57/§64).
3
- *
4
- * Coverage required by the plan:
5
- * - old provider.json (no krakenVerifier field) → verifier inherit
6
- * - inherit → follows the current run model (parent identity)
7
- * - explicit custom verifier → fixed model (survives parent changes)
8
- * - missing/invalid custom verifier → parent model fallback
9
- * - save/reload round-trip persists the override
10
- * - --set-config flag parsing (verifier-provider/model/clear)
11
- * - applySetConfig + snapshot exposure (Desktop save/reload)
12
- *
13
- * All file I/O is redirected to a temp file via ANATHEMA_PROVIDER_CONFIG_FILE.
14
- */
15
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
16
- import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
17
- import { tmpdir } from 'node:os';
18
- import path from 'node:path';
19
- import { getProviderConfig, getKrakenVerifierOverride, setKrakenVerifier, clearKrakenVerifier, } from '../providerConfig.js';
20
- import { parseSetConfigFlags, applySetConfig, buildDesktopConfigSnapshot, } from '../desktopConfig.js';
21
- import { resolveKrakenVerifier } from './verifier.js';
22
- let tmpDir = '';
23
- let savedEnv;
24
- beforeEach(() => {
25
- tmpDir = mkdtempSync(path.join(tmpdir(), 'zelari-vf-'));
26
- savedEnv = process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
27
- process.env.ANATHEMA_PROVIDER_CONFIG_FILE = path.join(tmpDir, 'provider.json');
28
- delete process.env.ZELARI_KRAKEN_SELECT_PROVIDER;
29
- delete process.env.ZELARI_KRAKEN_SELECT_MODEL;
30
- });
31
- afterEach(() => {
32
- if (savedEnv === undefined)
33
- delete process.env.ANATHEMA_PROVIDER_CONFIG_FILE;
34
- else
35
- process.env.ANATHEMA_PROVIDER_CONFIG_FILE = savedEnv;
36
- rmSync(tmpDir, { recursive: true, force: true });
37
- });
38
- /** Write a provider.json blob (as an old or hand-edited file would look). */
39
- function writeConfigFile(raw) {
40
- writeFileSync(process.env.ANATHEMA_PROVIDER_CONFIG_FILE, JSON.stringify(raw, null, 2), 'utf-8');
41
- }
42
- const OLD_FILE = {
43
- activeProviderId: 'grok',
44
- modelByProvider: { grok: 'grok-4.6' },
45
- };
46
- const PARENT = { provider: 'grok', model: 'grok-4.6' };
47
- describe('providerConfig.krakenVerifier', () => {
48
- it('old provider.json without the field → override undefined (inherit)', () => {
49
- writeConfigFile(OLD_FILE);
50
- expect(getKrakenVerifierOverride()).toBeUndefined();
51
- // inherit resolution: exact parent model, no LLM-config surprise
52
- expect(resolveKrakenVerifier(PARENT)).toEqual(PARENT);
53
- });
54
- it('inherit → follows the current run model', () => {
55
- writeConfigFile(OLD_FILE);
56
- const otherParent = { provider: 'glm', model: 'glm-4.6' };
57
- // no override + no env → whatever model the run resolved wins
58
- expect(resolveKrakenVerifier(otherParent)).toEqual(otherParent);
59
- });
60
- it('explicit custom verifier → fixed model, independent of parent', () => {
61
- writeConfigFile(OLD_FILE);
62
- setKrakenVerifier('anthropic', 'claude-sonnet-4-6');
63
- const override = getKrakenVerifierOverride();
64
- expect(override).toEqual({ provider: 'anthropic', model: 'claude-sonnet-4-6' });
65
- // parent changed → verifier stays fixed (the tool passes the persisted
66
- // override as `explicit` — see krakenSelectTool wiring)
67
- expect(resolveKrakenVerifier({ provider: 'grok', model: 'grok-4.6' }, process.env, getKrakenVerifierOverride())).toEqual({
68
- provider: 'anthropic',
69
- model: 'claude-sonnet-4-6',
70
- });
71
- });
72
- it('save/reload round-trip: persisted override survives a fresh read', () => {
73
- writeConfigFile(OLD_FILE);
74
- setKrakenVerifier('minimax', 'MiniMax-M2.5');
75
- const reloaded = getProviderConfig();
76
- expect(reloaded.krakenVerifier).toEqual({ provider: 'minimax', model: 'MiniMax-M2.5' });
77
- });
78
- it('invalid overrides on disk are dropped → parent fallback', () => {
79
- // partial (provider only)
80
- writeConfigFile({ ...OLD_FILE, krakenVerifier: { provider: 'grok' } });
81
- expect(getKrakenVerifierOverride()).toBeUndefined();
82
- // unknown provider
83
- writeConfigFile({
84
- ...OLD_FILE,
85
- krakenVerifier: { provider: 'nope', model: 'm' },
86
- });
87
- expect(getKrakenVerifierOverride()).toBeUndefined();
88
- // empty model
89
- writeConfigFile({
90
- ...OLD_FILE,
91
- krakenVerifier: { provider: 'grok', model: ' ' },
92
- });
93
- expect(getKrakenVerifierOverride()).toBeUndefined();
94
- // non-object garbage
95
- writeConfigFile({ ...OLD_FILE, krakenVerifier: 'grok' });
96
- expect(getKrakenVerifierOverride()).toBeUndefined();
97
- // in every case resolution falls back to the exact parent model
98
- expect(resolveKrakenVerifier(PARENT)).toEqual(PARENT);
99
- });
100
- it('clearKrakenVerifier → back to inherit (no-op when already inherit)', () => {
101
- writeConfigFile(OLD_FILE);
102
- setKrakenVerifier('grok', 'grok-4.6');
103
- clearKrakenVerifier();
104
- expect(getKrakenVerifierOverride()).toBeUndefined();
105
- expect(() => clearKrakenVerifier()).not.toThrow();
106
- });
107
- it('setKrakenVerifier validates provider and model', () => {
108
- writeConfigFile(OLD_FILE);
109
- expect(() => setKrakenVerifier('nope', 'm')).toThrow(/Unknown provider id/);
110
- expect(() => setKrakenVerifier('grok', ' ')).toThrow(/cannot be empty/);
111
- });
112
- it('env override still wins when no persisted config exists', () => {
113
- writeConfigFile(OLD_FILE);
114
- const resolved = resolveKrakenVerifier(PARENT, {
115
- ZELARI_KRAKEN_SELECT_PROVIDER: 'deepseek',
116
- ZELARI_KRAKEN_SELECT_MODEL: 'deepseek-v4-pro',
117
- });
118
- expect(resolved).toEqual({ provider: 'deepseek', model: 'deepseek-v4-pro' });
119
- });
120
- it('persisted override is passed as `explicit` → beats env', () => {
121
- writeConfigFile(OLD_FILE);
122
- setKrakenVerifier('glm', 'glm-4.6');
123
- const resolved = resolveKrakenVerifier(PARENT, {
124
- ZELARI_KRAKEN_SELECT_PROVIDER: 'deepseek',
125
- ZELARI_KRAKEN_SELECT_MODEL: 'deepseek-v4-pro',
126
- }, getKrakenVerifierOverride());
127
- expect(resolved).toEqual({ provider: 'glm', model: 'glm-4.6' });
128
- });
129
- });
130
- describe('parseSetConfigFlags — verifier flags', () => {
131
- it('valid: --verifier-provider + --verifier-model together', () => {
132
- const res = parseSetConfigFlags([
133
- '--set-config',
134
- '--verifier-provider',
135
- 'anthropic',
136
- '--verifier-model',
137
- 'claude-sonnet-4-6',
138
- ]);
139
- expect(res.error).toBeUndefined();
140
- expect(res.request?.verifierProvider).toBe('anthropic');
141
- expect(res.request?.verifierModel).toBe('claude-sonnet-4-6');
142
- expect(res.request?.verifierClear).toBeUndefined();
143
- });
144
- it('valid: --verifier-clear alone', () => {
145
- const res = parseSetConfigFlags(['--set-config', '--verifier-clear']);
146
- expect(res.error).toBeUndefined();
147
- expect(res.request?.verifierClear).toBe(true);
148
- expect(res.request?.verifierProvider).toBeUndefined();
149
- });
150
- it('provider without model → error', () => {
151
- const res = parseSetConfigFlags(['--set-config', '--verifier-provider', 'grok']);
152
- expect(res.request).toBeNull();
153
- expect(res.error).toMatch(/must be used together/);
154
- });
155
- it('model without provider → error', () => {
156
- const res = parseSetConfigFlags(['--set-config', '--verifier-model', 'm']);
157
- expect(res.request).toBeNull();
158
- expect(res.error).toMatch(/must be used together/);
159
- });
160
- it('clear + provider/model → conflict error', () => {
161
- const res = parseSetConfigFlags([
162
- '--set-config',
163
- '--verifier-clear',
164
- '--verifier-provider',
165
- 'grok',
166
- '--verifier-model',
167
- 'm',
168
- ]);
169
- expect(res.request).toBeNull();
170
- expect(res.error).toMatch(/conflicts/);
171
- });
172
- it('empty values → error', () => {
173
- const a = parseSetConfigFlags([
174
- '--set-config',
175
- '--verifier-provider',
176
- ' ',
177
- '--verifier-model',
178
- 'm',
179
- ]);
180
- expect(a.error).toMatch(/cannot be empty/);
181
- const b = parseSetConfigFlags([
182
- '--set-config',
183
- '--verifier-provider',
184
- 'grok',
185
- '--verifier-model',
186
- '',
187
- ]);
188
- expect(b.error).toMatch(/cannot be empty/);
189
- });
190
- it('no flags at all → still an error (same as before)', () => {
191
- const res = parseSetConfigFlags(['--set-config']);
192
- expect(res.request).toBeNull();
193
- expect(res.error).toMatch(/--set-config requires/);
194
- });
195
- });
196
- describe('applySetConfig + snapshot — verifier persistence', () => {
197
- it('set via flags → persisted → snapshot exposes it', () => {
198
- writeConfigFile(OLD_FILE);
199
- const res = applySetConfig({
200
- verifierProvider: 'anthropic',
201
- verifierModel: 'claude-sonnet-4-6',
202
- });
203
- expect(res.ok).toBe(true);
204
- if (res.ok)
205
- expect(res.message).toContain('verifier=anthropic/claude-sonnet-4-6');
206
- const snap = buildDesktopConfigSnapshot();
207
- expect(snap.krakenVerifier).toEqual({
208
- provider: 'anthropic',
209
- model: 'claude-sonnet-4-6',
210
- });
211
- // save/reload equality (Desktop round-trip)
212
- expect(getKrakenVerifierOverride()).toEqual(snap.krakenVerifier);
213
- });
214
- it('unknown verifier provider → explicit error, nothing persisted', () => {
215
- writeConfigFile(OLD_FILE);
216
- const res = applySetConfig({ verifierProvider: 'nope', verifierModel: 'm' });
217
- expect(res.ok).toBe(false);
218
- if (!res.ok)
219
- expect(res.error).toMatch(/unknown verifier provider/);
220
- expect(getKrakenVerifierOverride()).toBeUndefined();
221
- });
222
- it('clear via flags → snapshot back to null (inherit)', () => {
223
- writeConfigFile(OLD_FILE);
224
- setKrakenVerifier('grok', 'grok-4.6');
225
- const res = applySetConfig({ verifierClear: true });
226
- expect(res.ok).toBe(true);
227
- if (res.ok)
228
- expect(res.message).toContain('verifier=inherit');
229
- expect(buildDesktopConfigSnapshot().krakenVerifier).toBeNull();
230
- });
231
- it('fresh install (no file) → snapshot krakenVerifier null, inherit default', () => {
232
- // no config file written in this tmp dir
233
- const snap = buildDesktopConfigSnapshot();
234
- expect(snap.krakenVerifier).toBeNull();
235
- });
236
- });
237
- //# sourceMappingURL=verifierSettings.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verifierSettings.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/verifierSettings.test.ts"],"names":[],"mappings":"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"}