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,113 +0,0 @@
1
- /**
2
- * 2.1 T5 — original-tool-backed provenance (pattern A vs pattern B).
3
- *
4
- * Locks:
5
- * - A note matching a RAW captured tool execution anchors the EvidenceRef to
6
- * a `verification.evidence` event carrying the tool output digest
7
- * (observation: 'tool-result', provenance: 'tentacle-tool-capture').
8
- * - A note with NO matching capture falls back to the deprecated note event
9
- * (observation: 'verify-report-note', provenance: 'note-fallback').
10
- * - Counts distinguish the two patterns.
11
- * - Matching is best-effort: command overlap first, then distinctive output
12
- * fragments (counts like "41/41").
13
- */
14
- import { describe, expect, it } from 'vitest';
15
- import { anchorSelectionEvidence, matchNoteToToolTrace, } from './verificationBridge.js';
16
- function resultWithNote(criterionId, note) {
17
- return {
18
- criterionId,
19
- status: 'pass',
20
- source: 'verify-agent',
21
- evidence: [{ tier: 'tool-output', ref: note, capturedAt: Date.now() }],
22
- evaluatedAt: Date.now(),
23
- durationMs: 0,
24
- };
25
- }
26
- const VITEST_TRACE = [
27
- {
28
- tool: 'bash',
29
- callId: 'c-1',
30
- ok: true,
31
- command: 'npx vitest run src/session',
32
- output: 'Test Files 4 passed (4)\nTests 67 passed (67)',
33
- durationMs: 1200,
34
- endedAt: Date.now(),
35
- },
36
- ];
37
- describe('matchNoteToToolTrace', () => {
38
- it('matches by command overlap (note cites the command)', () => {
39
- const m = matchNoteToToolTrace('npx vitest run src/session — 67/67 pass', VITEST_TRACE);
40
- expect(m?.callId).toBe('c-1');
41
- });
42
- it('matches by distinctive output fragment when the command is not cited', () => {
43
- const m = matchNoteToToolTrace('test suite green: 67 passed (67)', VITEST_TRACE);
44
- expect(m?.callId).toBe('c-1');
45
- });
46
- it('returns null when nothing overlaps', () => {
47
- const m = matchNoteToToolTrace('manually inspected the diff, looks fine', VITEST_TRACE);
48
- expect(m).toBeNull();
49
- });
50
- it('returns null on empty note or empty trace', () => {
51
- expect(matchNoteToToolTrace('', VITEST_TRACE)).toBeNull();
52
- expect(matchNoteToToolTrace('vitest 41/41', [])).toBeNull();
53
- });
54
- });
55
- describe('anchorSelectionEvidence (T5 provenance)', () => {
56
- function makeEmitter() {
57
- const events = [];
58
- let seq = 100;
59
- const emit = async (input) => {
60
- seq += 1;
61
- events.push({ seq, ...input.data });
62
- return { seq };
63
- };
64
- return { events, emit };
65
- }
66
- it('pattern A: anchors to a tool-result event with digest when the note matches a capture', async () => {
67
- const r = resultWithNote('check-1-vitest', 'npx vitest run src/session — all green');
68
- const { events, emit } = makeEmitter();
69
- const counts = await anchorSelectionEvidence([r], emit, VITEST_TRACE);
70
- expect(counts.toolResultAnchored).toBe(1);
71
- expect(counts.noteFallback).toBe(0);
72
- expect(r.evidence[0].seq).toBe(101);
73
- expect(r.evidence[0].digest).toMatch(/^[0-9a-f]{64}$/);
74
- expect(events[0]).toMatchObject({
75
- observation: 'tool-result',
76
- provenance: 'tentacle-tool-capture',
77
- tool: 'bash',
78
- callId: 'c-1',
79
- ok: true,
80
- criterionId: 'check-1-vitest',
81
- });
82
- });
83
- it('pattern B: deprecated note fallback when no capture matches', async () => {
84
- const r = resultWithNote('check-1-manual', 'agent says it reviewed the code by eye');
85
- const { events, emit } = makeEmitter();
86
- const counts = await anchorSelectionEvidence([r], emit, VITEST_TRACE);
87
- expect(counts.toolResultAnchored).toBe(0);
88
- expect(counts.noteFallback).toBe(1);
89
- expect(r.evidence[0].seq).toBe(101);
90
- expect(r.evidence[0].digest).toBeUndefined();
91
- expect(events[0]).toMatchObject({
92
- observation: 'verify-report-note',
93
- provenance: 'note-fallback',
94
- });
95
- });
96
- it('no emitter → nothing anchored, policy will BLOCK (RC false-done guard intact)', async () => {
97
- const r = resultWithNote('check-1-vitest', 'npx vitest run src/session — all green');
98
- const counts = await anchorSelectionEvidence([r], undefined, VITEST_TRACE);
99
- expect(counts.toolResultAnchored).toBe(0);
100
- expect(counts.noteFallback).toBe(0);
101
- expect(r.evidence[0].seq).toBeUndefined();
102
- });
103
- it('already-anchored refs are skipped (idempotent)', async () => {
104
- const r = resultWithNote('check-1-vitest', 'npx vitest run src/session — all green');
105
- r.evidence[0].seq = 55;
106
- const { events, emit } = makeEmitter();
107
- const counts = await anchorSelectionEvidence([r], emit, VITEST_TRACE);
108
- expect(counts.toolResultAnchored + counts.noteFallback).toBe(0);
109
- expect(events).toHaveLength(0);
110
- expect(r.evidence[0].seq).toBe(55);
111
- });
112
- });
113
- //# sourceMappingURL=evidenceProvenance.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evidenceProvenance.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/evidenceProvenance.test.ts"],"names":[],"mappings":"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"}
@@ -1,134 +0,0 @@
1
- /**
2
- * Executor → workbench wiring — tests.
3
- *
4
- * The WorkbenchWriter used to be a "prepared but unwired" feature: nothing in
5
- * the production flow ever constructed it, so `.zelari/radio/workbench-<id>.md`
6
- * never appeared and the desktop graph/tail tabs stayed empty no matter how
7
- * much the graph ran. These tests pin the wiring: run a tiny mock graph
8
- * through KrakenGraphExecutor and assert the workbench file is written with
9
- * the node rows and their statuses.
10
- */
11
- import { describe, expect, it } from 'vitest';
12
- import { promises as fs } from 'node:fs';
13
- import os from 'node:os';
14
- import path from 'node:path';
15
- import { buildGraphFromPlan } from './planner.js';
16
- import { KrakenGraphExecutor } from './executor.js';
17
- const WORKBENCH_ENV = 'ZELARI_KRAKEN_WORKBENCH';
18
- async function listRadioDir(cwd) {
19
- const dir = path.join(cwd, '.zelari', 'radio');
20
- try {
21
- return await fs.readdir(dir);
22
- }
23
- catch {
24
- return [];
25
- }
26
- }
27
- function okResult(description) {
28
- return {
29
- ok: true,
30
- agent: 'explore',
31
- thoroughness: 'medium',
32
- model: 'mock-model',
33
- result: `done: ${description}`,
34
- footer: '',
35
- worktreePath: null,
36
- worktreeHandle: null,
37
- };
38
- }
39
- describe('executor → workbench wiring', () => {
40
- it('writes a workbench file with nodes, deps and terminal statuses after a run', async () => {
41
- const cwd = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-wb-exec-'));
42
- const prev = process.env[WORKBENCH_ENV];
43
- process.env[WORKBENCH_ENV] = '1';
44
- try {
45
- const graph = buildGraphFromPlan('kraken-exec-test', [
46
- { id: 'e1', kind: 'explore', label: 'map auth', prompt: 'map auth', deps: [] },
47
- {
48
- id: 'g1',
49
- kind: 'general',
50
- label: 'auth fix',
51
- prompt: 'fix auth',
52
- scope: ['src/auth'],
53
- deps: ['e1'],
54
- },
55
- {
56
- id: 'g2',
57
- kind: 'general',
58
- label: 'tests',
59
- prompt: 'add tests',
60
- scope: ['tests/auth'],
61
- deps: ['e1'],
62
- },
63
- ]);
64
- const executor = new KrakenGraphExecutor({
65
- taskToolDeps: {
66
- createSubAgentContext: async () => null,
67
- },
68
- parentCwd: cwd,
69
- sessionId: 'sess-exec-test',
70
- goal: 'fix auth',
71
- runTentacleFn: async (opts) => okResult(opts.args.description),
72
- mergeFn: async () => ({
73
- ok: true,
74
- merged: false,
75
- committed: false,
76
- conflict: false,
77
- message: 'no-op',
78
- }),
79
- });
80
- const summary = await executor.execute(graph);
81
- expect(summary.converged).toBe(true);
82
- const files = await listRadioDir(cwd);
83
- const wb = files.find((f) => f.startsWith('workbench-') && f.endsWith('.md'));
84
- expect(wb, `expected a workbench-*.md file, got: ${files.join(', ')}`).toBeTruthy();
85
- const body = await fs.readFile(path.join(cwd, '.zelari', 'radio', wb), 'utf8');
86
- expect(body).toContain('**Goal:** fix auth');
87
- // Original planned nodes are in the Wave table...
88
- expect(body).toContain('| e1 | map auth | explore');
89
- expect(body).toContain('| g1 | auth fix | general |');
90
- // ...auto-injected verify + merge nodes too...
91
- expect(body).toContain('verify-');
92
- expect(body).toContain('| merge | merge parallel work |');
93
- // ...with terminal statuses and no lingering pending/running rows.
94
- expect(body).not.toContain('| ↑');
95
- expect(body).not.toContain('| ○');
96
- // ...and the run outcome is recorded in the event tail.
97
- expect(body).toContain('graph_converged');
98
- }
99
- finally {
100
- if (prev === undefined)
101
- delete process.env[WORKBENCH_ENV];
102
- else
103
- process.env[WORKBENCH_ENV] = prev;
104
- await fs.rm(cwd, { recursive: true, force: true });
105
- }
106
- });
107
- it('respects ZELARI_KRAKEN_WORKBENCH=0 (no workbench file written)', async () => {
108
- const cwd = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-wb-off-'));
109
- const prev = process.env[WORKBENCH_ENV];
110
- process.env[WORKBENCH_ENV] = '0';
111
- try {
112
- const graph = buildGraphFromPlan('kraken-exec-off', [
113
- { id: 'e1', kind: 'explore', label: 'a', prompt: 'a', deps: [] },
114
- ]);
115
- const executor = new KrakenGraphExecutor({
116
- taskToolDeps: { createSubAgentContext: async () => null },
117
- parentCwd: cwd,
118
- sessionId: 'sess-exec-off',
119
- runTentacleFn: async (opts) => okResult(opts.args.description),
120
- });
121
- await executor.execute(graph);
122
- const files = await listRadioDir(cwd);
123
- expect(files.filter((f) => f.startsWith('workbench-'))).toEqual([]);
124
- }
125
- finally {
126
- if (prev === undefined)
127
- delete process.env[WORKBENCH_ENV];
128
- else
129
- process.env[WORKBENCH_ENV] = prev;
130
- await fs.rm(cwd, { recursive: true, force: true });
131
- }
132
- });
133
- });
134
- //# sourceMappingURL=executor.workbench.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"executor.workbench.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/executor.workbench.test.ts"],"names":[],"mappings":"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"}
@@ -1,145 +0,0 @@
1
- import { afterEach, describe, expect, it } from 'vitest';
2
- import { collectKrakenTurnMetrics, markRepairSucceeded, markRepairTriggered, recordCandidateTokens, recordSelectionOutcome, resetKrakenTurnMetrics, } from './metrics.js';
3
- import { registerCandidate, resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
4
- function verdict(partial) {
5
- return {
6
- status: 'selected',
7
- winnerIndex: 1,
8
- rationale: 'test',
9
- requiredChecks: [],
10
- degraded: false,
11
- verifier: null,
12
- judgedBy: 'deterministic',
13
- ...partial,
14
- };
15
- }
16
- function check(check, status) {
17
- return { check, status };
18
- }
19
- afterEach(() => {
20
- resetKrakenCandidates();
21
- resetKrakenTurnMetrics();
22
- });
23
- describe('collectKrakenTurnMetrics — null when no selection activity', () => {
24
- it('returns null on a plain turn (flag off ⇒ zero telemetry)', () => {
25
- resetKrakenCandidates();
26
- resetKrakenTurnMetrics();
27
- expect(collectKrakenTurnMetrics()).toBeNull();
28
- });
29
- it('returns null when only unrelated counters were touched', () => {
30
- recordCandidateTokens(0); // ignored by the guard
31
- expect(collectKrakenTurnMetrics()).toBeNull();
32
- });
33
- });
34
- describe('candidate counters', () => {
35
- it('counts registered candidates (ok and malformed both cost)', () => {
36
- registerCandidate({
37
- status: 'ok',
38
- description: 'h1',
39
- report: {
40
- hypothesis: 'h1',
41
- evidence: [{ claim: 'observed', basis: 'src/x.ts:10', degraded: false }],
42
- risks: [],
43
- hasDegradedEvidence: false,
44
- },
45
- raw: '',
46
- });
47
- registerCandidate({ status: 'malformed', description: 'h2', error: 'bad', raw: '' });
48
- const m = collectKrakenTurnMetrics();
49
- expect(m?.candidateCount).toBe(2);
50
- expect(m?.selectionUsed).toBe(false); // no kraken_select yet
51
- });
52
- it('sums provider-reported candidate tokens, ignoring junk', () => {
53
- registerCandidate({
54
- status: 'ok',
55
- description: 'h1',
56
- report: {
57
- hypothesis: 'h1',
58
- evidence: [],
59
- risks: [],
60
- hasDegradedEvidence: false,
61
- },
62
- raw: '',
63
- });
64
- recordCandidateTokens(1200);
65
- recordCandidateTokens(800.4); // rounded
66
- recordCandidateTokens(-5); // ignored
67
- recordCandidateTokens(Number.NaN); // ignored
68
- const m = collectKrakenTurnMetrics();
69
- expect(m?.candidateTokens).toBe(2000);
70
- });
71
- });
72
- describe('selection counters', () => {
73
- it('records latency/tokens/fallback from the judging call', () => {
74
- recordSelectionOutcome({ latencyMs: 1500, tokens: 900, degraded: false });
75
- const m = collectKrakenTurnMetrics();
76
- expect(m?.selectionLatencyMs).toBe(1500);
77
- expect(m?.selectionTokens).toBe(900);
78
- expect(m?.selectionFallback).toBe(false);
79
- });
80
- it('keeps tokens undefined when the provider reports none', () => {
81
- recordSelectionOutcome({ latencyMs: 200, degraded: true, fallbackReason: 'verifier call failed' });
82
- const m = collectKrakenTurnMetrics();
83
- expect(m?.selectionTokens).toBeUndefined();
84
- expect(m?.selectionFallback).toBe(true);
85
- expect(m?.selectionFallbackReason).toBe('verifier call failed');
86
- });
87
- it('flags needs_more_evidence from the persisted verdict', () => {
88
- setKrakenSelection(verdict({ status: 'needs_more_evidence', winnerIndex: null }));
89
- const m = collectKrakenTurnMetrics();
90
- expect(m?.selectionUsed).toBe(true);
91
- expect(m?.needsMoreEvidence).toBe(true);
92
- });
93
- });
94
- describe('verification counters', () => {
95
- it('classifies pass/fail/unknown from registry state', () => {
96
- setKrakenSelection(verdict({ requiredChecks: ['tests pass', 'build clean', 'lint clean'] }));
97
- setKrakenCheckResults([
98
- check('tests pass', 'pass'),
99
- check('build clean', 'fail'),
100
- // 'lint clean' unreported ⇒ unknown
101
- ]);
102
- const m = collectKrakenTurnMetrics();
103
- expect(m?.verificationPass).toBe(1);
104
- expect(m?.verificationFail).toBe(1);
105
- expect(m?.verificationUnknown).toBe(1);
106
- });
107
- it('reports zero verification counters before any verify tentacle', () => {
108
- setKrakenSelection(verdict({ requiredChecks: ['tests pass'] }));
109
- const m = collectKrakenTurnMetrics();
110
- expect(m?.verificationPass).toBe(0);
111
- expect(m?.verificationUnknown).toBe(1);
112
- });
113
- });
114
- describe('repair flags', () => {
115
- it('tracks triggered and success independently', () => {
116
- markRepairTriggered();
117
- let m = collectKrakenTurnMetrics();
118
- expect(m?.repairTriggered).toBe(true);
119
- expect(m?.repairSucceeded).toBe(false);
120
- markRepairSucceeded();
121
- m = collectKrakenTurnMetrics();
122
- expect(m?.repairSucceeded).toBe(true);
123
- });
124
- it('success without trigger is ignored (defensive)', () => {
125
- setKrakenSelection(verdict({})); // activity so the snapshot is non-null
126
- markRepairSucceeded();
127
- const m = collectKrakenTurnMetrics();
128
- expect(m?.repairTriggered).toBe(false);
129
- expect(m?.repairSucceeded).toBe(false);
130
- });
131
- });
132
- describe('reset', () => {
133
- it('clears transient counters but derives fresh from the registry', () => {
134
- recordSelectionOutcome({ latencyMs: 100, tokens: 50, degraded: false });
135
- markRepairTriggered();
136
- resetKrakenTurnMetrics();
137
- expect(collectKrakenTurnMetrics()).toBeNull(); // registry also empty here
138
- setKrakenSelection(verdict({}));
139
- const m = collectKrakenTurnMetrics();
140
- expect(m?.repairTriggered).toBe(false);
141
- expect(m?.candidateTokens).toBe(0);
142
- expect(m?.selectionLatencyMs).toBeUndefined();
143
- });
144
- });
145
- //# sourceMappingURL=metrics.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/metrics.test.ts"],"names":[],"mappings":"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"}
@@ -1,207 +0,0 @@
1
- /**
2
- * nativeVerification tests — F2 / Exit-2.4: the Zelari Coding Criteria Pack
3
- * runs natively in the Kraken strict-build path.
4
- *
5
- * Locks the composition contract:
6
- * - pack is opt-in (ZELARI_VERIFY_PACK=1), default off during the alpha;
7
- * - env overrides replace `npm run <script>` binding (hermetic tests);
8
- * - required criteria without a bound command are DROPPED, not unknowned;
9
- * - a failing pack command forces REPAIR_REQUIRED even when every selection
10
- * check passed with verify-agent evidence (deterministic beats narrative);
11
- * - all-pass pack + all-pass selection → PASS, and the spine payload
12
- * carries the native results with command digests.
13
- */
14
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
15
- import { buildNativeCriteria, evaluateNativePack, nativePackEnabled, packTimeoutMs, resolvePackCommands, } from './nativeVerification.js';
16
- import { evaluateStrictBuildGate, strictGateEventPayload, } from './verificationBridge.js';
17
- import { resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection } from './candidateRegistry.js';
18
- const CHECKS = ['session survives concurrent refresh'];
19
- function emitSeq() {
20
- let n = 1;
21
- return async () => ({ seq: n++ });
22
- }
23
- function selectWithChecks(checks) {
24
- resetKrakenCandidates();
25
- setKrakenSelection({
26
- status: 'selected',
27
- winnerIndex: 0,
28
- rationale: 'test',
29
- requiredChecks: checks,
30
- degraded: false,
31
- verifier: null,
32
- judgedBy: 'llm',
33
- });
34
- }
35
- /** Deterministic shell stub: map each command to a canned ShellResult. */
36
- function stubShell(byCommand) {
37
- return {
38
- async exec(command) {
39
- const canned = byCommand[command] ?? { exit: 0, stdout: '' };
40
- return {
41
- exitCode: canned.exit ?? 0,
42
- stdout: canned.stdout ?? '',
43
- stderr: canned.stderr ?? '',
44
- durationMs: 1,
45
- timedOut: false,
46
- };
47
- },
48
- };
49
- }
50
- const TYPECHECK = 'fake-typecheck';
51
- const TEST = 'fake-test';
52
- const BUILD = 'fake-build';
53
- function packEnv(overrides = {}) {
54
- return {
55
- ZELARI_VERIFY_PACK: '1',
56
- ZELARI_VERIFY_TYPECHECK_CMD: TYPECHECK,
57
- ZELARI_VERIFY_TEST_CMD: TEST,
58
- ZELARI_VERIFY_BUILD_CMD: BUILD,
59
- ...overrides,
60
- };
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('nativePackEnabled (alpha opt-in)', () => {
76
- it('is OFF by default and only enabled by explicit flags', () => {
77
- expect(nativePackEnabled({})).toBe(false);
78
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: '1' })).toBe(true);
79
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: 'on' })).toBe(true);
80
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: 'true' })).toBe(true);
81
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: '0' })).toBe(false);
82
- expect(nativePackEnabled({ ZELARI_VERIFY_PACK: 'yes' })).toBe(false);
83
- });
84
- });
85
- describe('resolvePackCommands', () => {
86
- it('binds npm scripts present in package.json', () => {
87
- const cmds = resolvePackCommands({}, { typecheck: 'tsc -p .', test: 'vitest run' });
88
- expect(cmds.typecheckCommand).toBe('npm run typecheck');
89
- expect(cmds.testCommand).toBe('npm run test');
90
- expect(cmds.buildCommand).toBeNull(); // script absent → unbound
91
- });
92
- it('env override wins; empty string explicitly disables', () => {
93
- const cmds = resolvePackCommands({ ZELARI_VERIFY_TYPECHECK_CMD: 'tsc --noEmit', ZELARI_VERIFY_TEST_CMD: '' }, { typecheck: 'x', test: 'y', build: 'z' });
94
- expect(cmds.typecheckCommand).toBe('tsc --noEmit');
95
- expect(cmds.testCommand).toBeNull();
96
- expect(cmds.buildCommand).toBe('npm run build');
97
- });
98
- it('packTimeoutMs clamps to [1, 3600000] and defaults to 600000', () => {
99
- expect(packTimeoutMs({})).toBe(600_000);
100
- expect(packTimeoutMs({ ZELARI_VERIFY_TIMEOUT_MS: '5000' })).toBe(5_000);
101
- expect(packTimeoutMs({ ZELARI_VERIFY_TIMEOUT_MS: '-3' })).toBe(600_000);
102
- expect(packTimeoutMs({ ZELARI_VERIFY_TIMEOUT_MS: '99999999' })).toBe(3_600_000);
103
- });
104
- });
105
- describe('buildNativeCriteria', () => {
106
- it('drops required criteria without a bound command; keeps advisory ones', () => {
107
- const criteria = buildNativeCriteria({ typecheckCommand: 'tsc', testCommand: null, buildCommand: null }, 1_000);
108
- const ids = criteria.map((c) => c.id);
109
- expect(ids).toContain('correctness.error-signals');
110
- expect(ids).not.toContain('correctness.specification');
111
- expect(ids).not.toContain('correctness.observable-output');
112
- // advisories stay even unbound — they surface as honest `unknown`
113
- expect(ids).toContain('evidence.verification-quality');
114
- });
115
- });
116
- describe('evaluateNativePack', () => {
117
- it('returns null when disabled or when no command is bound', async () => {
118
- expect(await evaluateNativePack({ env: {}, shell: stubShell({}) })).toBeNull();
119
- expect(await evaluateNativePack({
120
- env: { ZELARI_VERIFY_PACK: '1' },
121
- cwd: 'Z:/__no_such_repo__',
122
- shell: stubShell({}),
123
- })).toBeNull();
124
- });
125
- it('runs bound commands through the core engine and returns digested evidence', async () => {
126
- const pack = await evaluateNativePack({
127
- env: packEnv(),
128
- shell: stubShell({
129
- [TYPECHECK]: { exit: 0, stdout: 'no errors' },
130
- [TEST]: { exit: 0, stdout: '58 passed' },
131
- [BUILD]: { exit: 0, stdout: 'bundled' },
132
- }),
133
- });
134
- expect(pack).not.toBeNull();
135
- const byId = new Map(pack.results.map((r) => [r.criterionId, r]));
136
- expect(byId.get('correctness.error-signals')?.status).toBe('pass');
137
- expect(byId.get('correctness.specification')?.status).toBe('pass');
138
- const ev = byId.get('correctness.specification')?.evidence[0];
139
- expect(ev?.tier).toBe('command-output');
140
- expect(ev?.digest).toMatch(/^[0-9a-f]{64}$/);
141
- });
142
- });
143
- describe('evaluateStrictBuildGate × native pack (F2 lock)', () => {
144
- it('failing typecheck forces REPAIR_REQUIRED even when every selection check passes with notes', async () => {
145
- selectWithChecks(CHECKS);
146
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 58/58' }]);
147
- const gate = await evaluateStrictBuildGate('build', {
148
- env: packEnv(),
149
- emit: emitSeq(),
150
- shell: stubShell({
151
- [TYPECHECK]: { exit: 2, stderr: 'TS2345: argument of type...' },
152
- [TEST]: { exit: 0, stdout: '58 passed' },
153
- [BUILD]: { exit: 0, stdout: 'ok' },
154
- }),
155
- });
156
- expect(gate.strict).toBe(true);
157
- expect(gate.native).not.toBeNull();
158
- expect(gate.evaluation.verdict).toBe('REPAIR_REQUIRED');
159
- expect(gate.blocked).toBe(true);
160
- const failed = gate.evaluation.unsatisfied.find((u) => u.id === 'correctness.error-signals');
161
- expect(failed?.status).toBe('fail');
162
- });
163
- it('all-pass pack + all-pass selection → PASS with native results in the payload', async () => {
164
- selectWithChecks(CHECKS);
165
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 58/58' }]);
166
- const gate = await evaluateStrictBuildGate('build', {
167
- env: packEnv(),
168
- emit: emitSeq(),
169
- shell: stubShell({
170
- [TYPECHECK]: { exit: 0 },
171
- [TEST]: { exit: 0, stdout: '58 passed' },
172
- [BUILD]: { exit: 0 },
173
- }),
174
- });
175
- expect(gate.evaluation.verdict).toBe('PASS');
176
- expect(gate.blocked).toBe(false);
177
- const payload = strictGateEventPayload(gate);
178
- expect(payload.engine).toBe('kraken-legacy+completion-policy+criteria-pack');
179
- expect(payload.native).toMatchObject({ packId: 'zelari-coding/v1' });
180
- const results = payload.native.results;
181
- expect(results.filter((r) => r.status === 'pass').length).toBeGreaterThanOrEqual(3);
182
- });
183
- it('pack disabled (default) → native null and identical legacy-only verdict', async () => {
184
- selectWithChecks(CHECKS);
185
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'vitest 58/58' }]);
186
- const gate = await evaluateStrictBuildGate('build', { env: {}, emit: emitSeq(), shell: stubShell({}) });
187
- expect(gate.native).toBeNull();
188
- expect(gate.evaluation.verdict).toBe('PASS');
189
- expect(strictGateEventPayload(gate).engine).toBe('kraken-legacy+completion-policy');
190
- });
191
- it('a pack criterion timing out is unknown — blockers add, unknown never passes silently', async () => {
192
- selectWithChecks(CHECKS);
193
- setKrakenCheckResults([{ check: CHECKS[0], status: 'pass', note: 'ok' }]);
194
- const timeoutShell = {
195
- async exec(command) {
196
- if (command === TEST) {
197
- return { exitCode: null, stdout: '', stderr: '', durationMs: 9, timedOut: true };
198
- }
199
- return { exitCode: 0, stdout: '', stderr: '', durationMs: 1, timedOut: false };
200
- },
201
- };
202
- const gate = await evaluateStrictBuildGate('build', { env: packEnv(), emit: emitSeq(), shell: timeoutShell });
203
- expect(gate.evaluation.verdict).toBe('BLOCKED'); // unknown ≠ pass
204
- expect(gate.blocked).toBe(true);
205
- });
206
- });
207
- //# sourceMappingURL=nativeVerification.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nativeVerification.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/nativeVerification.test.ts"],"names":[],"mappings":"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"}