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.
- package/README.md +4 -4
- package/package.json +8 -5
- package/dist/cli/ast/engine.test.js +0 -101
- package/dist/cli/ast/engine.test.js.map +0 -1
- package/dist/cli/ast/tools.test.js +0 -124
- package/dist/cli/ast/tools.test.js.map +0 -1
- package/dist/cli/headless.test.js +0 -107
- package/dist/cli/headless.test.js.map +0 -1
- package/dist/cli/headlessE2eSession.test.js +0 -189
- package/dist/cli/headlessE2eSession.test.js.map +0 -1
- package/dist/cli/headlessHistorySeed.test.js +0 -158
- package/dist/cli/headlessHistorySeed.test.js.map +0 -1
- package/dist/cli/headlessSessionEvent.test.js +0 -83
- package/dist/cli/headlessSessionEvent.test.js.map +0 -1
- package/dist/cli/headlessSpine.test.js +0 -153
- package/dist/cli/headlessSpine.test.js.map +0 -1
- package/dist/cli/hooks/observationStore.test.js +0 -135
- package/dist/cli/hooks/observationStore.test.js.map +0 -1
- package/dist/cli/hooks/sessionSurface.test.js +0 -112
- package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
- package/dist/cli/kraken/candidateRegistry.test.js +0 -211
- package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
- package/dist/cli/kraken/completionGate.test.js +0 -172
- package/dist/cli/kraken/completionGate.test.js.map +0 -1
- package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
- package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
- package/dist/cli/kraken/evidenceProvenance.test.js +0 -113
- package/dist/cli/kraken/evidenceProvenance.test.js.map +0 -1
- package/dist/cli/kraken/executor.workbench.test.js +0 -134
- package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
- package/dist/cli/kraken/metrics.test.js +0 -145
- package/dist/cli/kraken/metrics.test.js.map +0 -1
- package/dist/cli/kraken/nativeVerification.test.js +0 -207
- package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
- package/dist/cli/kraken/planner.test.js +0 -43
- package/dist/cli/kraken/planner.test.js.map +0 -1
- package/dist/cli/kraken/scriptPlanner.test.js +0 -152
- package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
- package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
- package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
- package/dist/cli/kraken/skillSuggest.test.js +0 -157
- package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
- package/dist/cli/kraken/strictDefaults.test.js +0 -149
- package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
- package/dist/cli/kraken/strictGatePackIndependence.test.js +0 -112
- package/dist/cli/kraken/strictGatePackIndependence.test.js.map +0 -1
- package/dist/cli/kraken/turnRuntime.test.js +0 -377
- package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
- package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
- package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
- package/dist/cli/kraken/verificationBridge.test.js +0 -177
- package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
- package/dist/cli/kraken/verifier.test.js +0 -232
- package/dist/cli/kraken/verifier.test.js.map +0 -1
- package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
- package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
- package/dist/cli/kraken/verifierLifecycle.test.js +0 -181
- package/dist/cli/kraken/verifierLifecycle.test.js.map +0 -1
- package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
- package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
- package/dist/cli/kraken/verifierSettings.test.js +0 -237
- package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
- package/dist/cli/kraken/verifyReport.test.js +0 -111
- package/dist/cli/kraken/verifyReport.test.js.map +0 -1
- package/dist/cli/kraken/weaknessMeter.test.js +0 -212
- package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
- package/dist/cli/kraken/workbench.test.js +0 -253
- package/dist/cli/kraken/workbench.test.js.map +0 -1
- package/dist/cli/kraken/workbenchView.test.js +0 -130
- package/dist/cli/kraken/workbenchView.test.js.map +0 -1
- package/dist/cli/legacyContextIsolation.test.js +0 -65
- package/dist/cli/legacyContextIsolation.test.js.map +0 -1
- package/dist/cli/lsp/tools.test.js +0 -90
- package/dist/cli/lsp/tools.test.js.map +0 -1
- package/dist/cli/missionContinuation.test.js +0 -117
- package/dist/cli/missionContinuation.test.js.map +0 -1
- package/dist/cli/profileMatrix.test.js +0 -130
- package/dist/cli/profileMatrix.test.js.map +0 -1
- package/dist/cli/provider/capabilities.test.js +0 -46
- package/dist/cli/provider/capabilities.test.js.map +0 -1
- package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
- package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
- package/dist/cli/providerConfig.test.js +0 -85
- package/dist/cli/providerConfig.test.js.map +0 -1
- package/dist/cli/sessionReplayInvariant.test.js +0 -187
- package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
- package/dist/cli/sessionSpine.test.js +0 -171
- package/dist/cli/sessionSpine.test.js.map +0 -1
- package/dist/cli/thinking.test.js +0 -214
- package/dist/cli/thinking.test.js.map +0 -1
- package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
- package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
- package/dist/cli/tools/inspectCommand.test.js +0 -311
- package/dist/cli/tools/inspectCommand.test.js.map +0 -1
- package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
- package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
- package/dist/cli/tools/krakenSelectTool.test.js +0 -246
- package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
- package/dist/cli/tools/observeBatch.test.js +0 -329
- package/dist/cli/tools/observeBatch.test.js.map +0 -1
- package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
- package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
- package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
- package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
- package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
- package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
- package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
- package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
- package/dist/cli/workspace/planDriftCheck.test.js +0 -146
- package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
- package/dist/cli/workspace/planStore.test.js +0 -295
- package/dist/cli/workspace/planStore.test.js.map +0 -1
- package/dist/cli/zelariMission.test.js +0 -44
- package/dist/cli/zelariMission.test.js.map +0 -1
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the planner system prompt builder.
|
|
3
|
-
*
|
|
4
|
-
* Today the only knob is the Bennett's Razor opt-in. Future knobs (e.g.
|
|
5
|
-
* "include the Gauntlet Loop recipe", "include an example plan") belong
|
|
6
|
-
* here as well — keep all prompt-shape decisions in one tested place.
|
|
7
|
-
*
|
|
8
|
-
* @since v1.31.x — Bennett's Razor opt-in
|
|
9
|
-
*/
|
|
10
|
-
import { describe, expect, it } from 'vitest';
|
|
11
|
-
import { KRAKEN_PLANNER_SYSTEM_PROMPT, buildPlannerSystemPrompt, } from './planner.js';
|
|
12
|
-
describe('buildPlannerSystemPrompt', () => {
|
|
13
|
-
it('returns the base prompt unchanged when the env var is unset', () => {
|
|
14
|
-
expect(buildPlannerSystemPrompt({})).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
15
|
-
expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
16
|
-
});
|
|
17
|
-
it('returns the base prompt for non-truthy env values', () => {
|
|
18
|
-
expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '0' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
19
|
-
expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: 'false' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
20
|
-
expect(buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: 'no' })).toBe(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
21
|
-
});
|
|
22
|
-
it('appends the Bennett\'s Razor section when ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR=1', () => {
|
|
23
|
-
const prompt = buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '1' });
|
|
24
|
-
expect(prompt).toContain(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
25
|
-
expect(prompt).toMatch(/Bennett/i);
|
|
26
|
-
expect(prompt).toMatch(/assumes? the least/i);
|
|
27
|
-
expect(prompt).toMatch(/tie-breaker/i);
|
|
28
|
-
expect(prompt.length).toBeGreaterThan(KRAKEN_PLANNER_SYSTEM_PROMPT.length + 200);
|
|
29
|
-
});
|
|
30
|
-
it('also accepts "true" (case-insensitive) as truthy', () => {
|
|
31
|
-
const prompt = buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: 'TRUE' });
|
|
32
|
-
expect(prompt).toMatch(/Bennett/i);
|
|
33
|
-
});
|
|
34
|
-
it('appends the section AFTER the base prompt (not before)', () => {
|
|
35
|
-
const prompt = buildPlannerSystemPrompt({ ZELARI_KRAKEN_PLANNER_BENNETTS_RAZOR: '1' });
|
|
36
|
-
const baseIdx = prompt.indexOf(KRAKEN_PLANNER_SYSTEM_PROMPT);
|
|
37
|
-
const razorIdx = prompt.indexOf("Bennett's Razor");
|
|
38
|
-
expect(baseIdx).toBe(0);
|
|
39
|
-
expect(razorIdx).toBeGreaterThan(0);
|
|
40
|
-
expect(razorIdx).toBeGreaterThan(KRAKEN_PLANNER_SYSTEM_PROMPT.length);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
//# sourceMappingURL=planner.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planner.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/planner.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAEtB,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACjF,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAClF,4BAA4B,CAC7B,CAAC;QACF,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CACtF,4BAA4B,CAC7B,CAAC;QACF,MAAM,CAAC,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACnF,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,4BAA4B,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,wBAAwB,CAAC,EAAE,oCAAoC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Kraken script planner — tests.
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - `extractCodeBlock` — markdown fence stripping
|
|
6
|
-
* - `planScript` — happy path, retry on compile failure, empty response
|
|
7
|
-
*
|
|
8
|
-
* Tests pass a `llmClient` override so the planner never hits the network.
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect } from 'vitest';
|
|
11
|
-
import { promises as fs } from 'node:fs';
|
|
12
|
-
import os from 'node:os';
|
|
13
|
-
import path from 'node:path';
|
|
14
|
-
import { extractCodeBlock, planScript, KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT, } from './scriptPlanner.js';
|
|
15
|
-
function fakeClient(responses) {
|
|
16
|
-
const calls = [];
|
|
17
|
-
let i = 0;
|
|
18
|
-
const client = {
|
|
19
|
-
async complete({ system, user }) {
|
|
20
|
-
calls.push(user);
|
|
21
|
-
const out = responses[i] ?? responses[responses.length - 1] ?? '';
|
|
22
|
-
i += 1;
|
|
23
|
-
// Sanity: the system prompt should mention the SDK.
|
|
24
|
-
if (!system.includes('tentacle')) {
|
|
25
|
-
throw new Error('system prompt missing tentacle mention');
|
|
26
|
-
}
|
|
27
|
-
return out;
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
return { client, calls };
|
|
31
|
-
}
|
|
32
|
-
describe('extractCodeBlock', () => {
|
|
33
|
-
it('strips a ```ts fence', () => {
|
|
34
|
-
expect(extractCodeBlock('```ts\nconst x = 1;\n```', 'ts')).toBe('const x = 1;');
|
|
35
|
-
});
|
|
36
|
-
it('strips a ```typescript fence', () => {
|
|
37
|
-
expect(extractCodeBlock('```typescript\nconst x = 1;\n```', 'ts')).toBe('const x = 1;');
|
|
38
|
-
});
|
|
39
|
-
it('strips a ``` fence with no language', () => {
|
|
40
|
-
expect(extractCodeBlock('```\nconst x = 1;\n```', 'ts')).toBe('const x = 1;');
|
|
41
|
-
});
|
|
42
|
-
it('returns the original text if no fence is present', () => {
|
|
43
|
-
const src = 'const x = 1;';
|
|
44
|
-
expect(extractCodeBlock(src, 'ts')).toBe(src);
|
|
45
|
-
});
|
|
46
|
-
it('trims surrounding whitespace', () => {
|
|
47
|
-
expect(extractCodeBlock(' \n const x = 1;\n ', 'ts')).toBe('const x = 1;');
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT', () => {
|
|
51
|
-
it('mentions the SDK capabilities', () => {
|
|
52
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('tentacle');
|
|
53
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('merge');
|
|
54
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('while_');
|
|
55
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('until');
|
|
56
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('checkpoint');
|
|
57
|
-
});
|
|
58
|
-
it('warns against process / require / Buffer', () => {
|
|
59
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('process');
|
|
60
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('require');
|
|
61
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toContain('Buffer');
|
|
62
|
-
});
|
|
63
|
-
it('says return ONLY code (no fence)', () => {
|
|
64
|
-
expect(KRAKEN_SCRIPT_PLANNER_SYSTEM_PROMPT).toMatch(/no markdown fence/i);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
describe('planScript', () => {
|
|
68
|
-
it('writes a compilable plan to .zelari/kraken/runs/<graphId>/plan.ts', async () => {
|
|
69
|
-
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-scriptplan-'));
|
|
70
|
-
const goodSource = `
|
|
71
|
-
import { tentacle, merge } from '@zelari/kraken-runtime';
|
|
72
|
-
const a = await tentacle({ kind: 'explore', label: 'map', prompt: 'x' });
|
|
73
|
-
await merge([a]);
|
|
74
|
-
`;
|
|
75
|
-
const { client, calls } = fakeClient([goodSource]);
|
|
76
|
-
const result = await planScript({
|
|
77
|
-
prompt: 'map the auth system',
|
|
78
|
-
graphId: 'g-happy',
|
|
79
|
-
cwd: tmp,
|
|
80
|
-
llmClient: client,
|
|
81
|
-
});
|
|
82
|
-
expect(result.compiled).toBe(true);
|
|
83
|
-
expect(result.attempts).toBe(1);
|
|
84
|
-
expect(result.source).toContain("import { tentacle");
|
|
85
|
-
expect(calls).toHaveLength(1);
|
|
86
|
-
// The file is on disk.
|
|
87
|
-
const written = await fs.readFile(result.planPath, 'utf8');
|
|
88
|
-
expect(written).toBe(goodSource.trim());
|
|
89
|
-
// Path is the expected one.
|
|
90
|
-
expect(result.planPath).toBe(path.join(tmp, '.zelari', 'kraken', 'runs', 'g-happy', 'plan.ts'));
|
|
91
|
-
});
|
|
92
|
-
it('retries on compile failure and succeeds on the second attempt', async () => {
|
|
93
|
-
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-scriptplan-'));
|
|
94
|
-
// A real SYNTAX error: unbalanced brace. esbuild fails on parse.
|
|
95
|
-
const broken = `function oops( { return 1;`;
|
|
96
|
-
const good = `import { log } from '@zelari/kraken-runtime';\nlog('hello');`;
|
|
97
|
-
const { client, calls } = fakeClient([broken, good]);
|
|
98
|
-
const result = await planScript({
|
|
99
|
-
prompt: 'do a thing',
|
|
100
|
-
graphId: 'g-retry',
|
|
101
|
-
cwd: tmp,
|
|
102
|
-
llmClient: client,
|
|
103
|
-
});
|
|
104
|
-
expect(result.attempts).toBe(2);
|
|
105
|
-
expect(result.compiled).toBe(true);
|
|
106
|
-
expect(calls).toHaveLength(2);
|
|
107
|
-
// The corrective user message should mention the previous error.
|
|
108
|
-
expect(calls[1]).toMatch(/failed to compile/i);
|
|
109
|
-
});
|
|
110
|
-
it('throws after MAX_PLAN_ATTEMPTS on persistent compile failure', async () => {
|
|
111
|
-
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-scriptplan-'));
|
|
112
|
-
const broken = `function oops( { return 1;`;
|
|
113
|
-
const { client } = fakeClient([broken, broken]);
|
|
114
|
-
await expect(planScript({
|
|
115
|
-
prompt: 'still broken',
|
|
116
|
-
graphId: 'g-fail',
|
|
117
|
-
cwd: tmp,
|
|
118
|
-
llmClient: client,
|
|
119
|
-
})).rejects.toThrowError(/failed to produce a compilable plan/);
|
|
120
|
-
});
|
|
121
|
-
it('retries on empty response and succeeds on the second attempt', async () => {
|
|
122
|
-
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-scriptplan-'));
|
|
123
|
-
const good = `import { log } from '@zelari/kraken-runtime';\nlog('ok');`;
|
|
124
|
-
const { client } = fakeClient(['', good]);
|
|
125
|
-
const result = await planScript({
|
|
126
|
-
prompt: 'empty first',
|
|
127
|
-
graphId: 'g-empty',
|
|
128
|
-
cwd: tmp,
|
|
129
|
-
llmClient: client,
|
|
130
|
-
});
|
|
131
|
-
expect(result.attempts).toBe(2);
|
|
132
|
-
expect(result.compiled).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
it('strips a ```ts fence from the LLM reply', async () => {
|
|
135
|
-
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), 'kraken-scriptplan-'));
|
|
136
|
-
const fenced = '```ts\nimport { log } from \'@zelari/kraken-runtime\';\nlog(\'ok\');\n```';
|
|
137
|
-
const { client } = fakeClient([fenced]);
|
|
138
|
-
const result = await planScript({
|
|
139
|
-
prompt: 'fenced',
|
|
140
|
-
graphId: 'g-fence',
|
|
141
|
-
cwd: tmp,
|
|
142
|
-
llmClient: client,
|
|
143
|
-
});
|
|
144
|
-
expect(result.compiled).toBe(true);
|
|
145
|
-
expect(result.source.startsWith('import')).toBe(true);
|
|
146
|
-
expect(result.source).not.toContain('```');
|
|
147
|
-
});
|
|
148
|
-
it('rejects an empty prompt (Zod schema)', async () => {
|
|
149
|
-
await expect(planScript({ prompt: '', llmClient: fakeClient(['']).client })).rejects.toThrowError(/prompt|Too small/i);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
//# sourceMappingURL=scriptPlanner.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scriptPlanner.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/scriptPlanner.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,mCAAmC,GAEpC,MAAM,oBAAoB,CAAC;AAG5B,SAAS,UAAU,CAAC,SAAmB;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,MAAM,GAAqB;QAC/B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;YAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAClE,CAAC,IAAI,CAAC,CAAC;YACP,oDAAoD;YACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,gBAAgB,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,CAAC,mCAAmC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,mCAAmC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG;;;;KAIlB,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,MAAM,EAAE,qBAAqB;YAC7B,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,uBAAuB;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,4BAA4B;QAC5B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,iEAAiE;QACjE,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAC5C,MAAM,IAAI,GAAG,8DAA8D,CAAC;QAC5E,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,iEAAiE;QACjE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAEhD,MAAM,MAAM,CACV,UAAU,CAAC;YACT,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,QAAQ;YACjB,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,MAAM;SAClB,CAAC,CACH,CAAC,OAAO,CAAC,YAAY,CAAC,qCAAqC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,2DAA2D,CAAC;QACzE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,2EAA2E,CAAC;QAC3F,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,SAAS;YAClB,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,CACV,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAuB,CAAC,CACpF,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import { krakenSelectionPlaybook } from './selectionPlaybook.js';
|
|
3
|
-
import { KRAKEN_LEAD_PLAYBOOK_MODULE } from '@zelari/core/skills';
|
|
4
|
-
const FLAG = 'ZELARI_KRAKEN_SELECTION';
|
|
5
|
-
describe('krakenSelectionPlaybook (Fase 5 — adaptive playbook)', () => {
|
|
6
|
-
const prev = process.env[FLAG];
|
|
7
|
-
afterEach(() => {
|
|
8
|
-
if (prev === undefined)
|
|
9
|
-
delete process.env[FLAG];
|
|
10
|
-
else
|
|
11
|
-
process.env[FLAG] = prev;
|
|
12
|
-
});
|
|
13
|
-
it('flag off ⇒ no module (prompt byte-identical, regression guard)', () => {
|
|
14
|
-
delete process.env[FLAG];
|
|
15
|
-
expect(krakenSelectionPlaybook(true)).toEqual([]);
|
|
16
|
-
});
|
|
17
|
-
it('non-kraken call site ⇒ no module even with flag on', () => {
|
|
18
|
-
process.env[FLAG] = '1';
|
|
19
|
-
expect(krakenSelectionPlaybook(false)).toEqual([]);
|
|
20
|
-
});
|
|
21
|
-
it('flag on + kraken path ⇒ exactly one module', () => {
|
|
22
|
-
process.env[FLAG] = '1';
|
|
23
|
-
const mods = krakenSelectionPlaybook(true);
|
|
24
|
-
expect(mods).toHaveLength(1);
|
|
25
|
-
expect(mods[0].title).toMatch(/Verified Selection/i);
|
|
26
|
-
});
|
|
27
|
-
it('carries the adaptive thresholds (simple→direct, ambiguous→2, uncertainty→3)', () => {
|
|
28
|
-
process.env[FLAG] = '1';
|
|
29
|
-
const c = krakenSelectionPlaybook(true)[0].content;
|
|
30
|
-
expect(c).toMatch(/DIRECT/i);
|
|
31
|
-
expect(c).toMatch(/2 candidates/);
|
|
32
|
-
expect(c).toMatch(/up to 3 candidates/);
|
|
33
|
-
});
|
|
34
|
-
it('carries the orchestration contract (purpose=candidate, kraken_select, single path)', () => {
|
|
35
|
-
process.env[FLAG] = '1';
|
|
36
|
-
const c = krakenSelectionPlaybook(true)[0].content;
|
|
37
|
-
expect(c).toContain('purpose="candidate"');
|
|
38
|
-
expect(c).toContain('kraken_select');
|
|
39
|
-
expect(c).toContain('needs_more_evidence');
|
|
40
|
-
expect(c).toMatch(/Never blend/i);
|
|
41
|
-
});
|
|
42
|
-
it('carries check routing (PLAN → plan section, BUILD → verify Acceptance) + integrity', () => {
|
|
43
|
-
process.env[FLAG] = '1';
|
|
44
|
-
const c = krakenSelectionPlaybook(true)[0].content;
|
|
45
|
-
expect(c).toMatch(/verification section/i);
|
|
46
|
-
expect(c).toMatch(/Acceptance/i);
|
|
47
|
-
expect(c).toMatch(/proof of absence/i);
|
|
48
|
-
});
|
|
49
|
-
it('sorts after the lead playbook (priority ordering preserved)', () => {
|
|
50
|
-
process.env[FLAG] = '1';
|
|
51
|
-
const [m] = krakenSelectionPlaybook(true);
|
|
52
|
-
expect(m.priority).toBeGreaterThan(KRAKEN_LEAD_PLAYBOOK_MODULE.priority);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
//# sourceMappingURL=selectionPlaybook.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectionPlaybook.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/selectionPlaybook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Kraken skill auto-suggest — tests.
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - `slugifyLabel` produces kebab-case ids
|
|
6
|
-
* - No suggestions when the run did not converge
|
|
7
|
-
* - No suggestions when no reviewer failed
|
|
8
|
-
* - One suggestion produced for a typical FAIL→fix pattern
|
|
9
|
-
* - Suggestion contains the failure findings and the promote command
|
|
10
|
-
* - Confidence scales with the depth of evidence
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect } from 'vitest';
|
|
13
|
-
import { slugifyLabel, suggestSkillsFromRun, renderSuggestionCard, } from './skillSuggest.js';
|
|
14
|
-
function makeRef(over) {
|
|
15
|
-
return {
|
|
16
|
-
scope: [],
|
|
17
|
-
findings: '',
|
|
18
|
-
...over,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function makeResult(opts) {
|
|
22
|
-
const tentaclesById = new Map();
|
|
23
|
-
for (const r of opts.refs)
|
|
24
|
-
tentaclesById.set(r.id, r);
|
|
25
|
-
return {
|
|
26
|
-
tentacles: tentaclesById,
|
|
27
|
-
mergeCount: 1,
|
|
28
|
-
converged: opts.converged,
|
|
29
|
-
cancelled: false,
|
|
30
|
-
durationMs: 1000,
|
|
31
|
-
unresolvedFindings: [],
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
describe('slugifyLabel', () => {
|
|
35
|
-
it('converts a label to kebab-case', () => {
|
|
36
|
-
expect(slugifyLabel('Acceptance Test 1')).toBe('acceptance-test-1');
|
|
37
|
-
});
|
|
38
|
-
it('drops punctuation and trims', () => {
|
|
39
|
-
expect(slugifyLabel(' Hello, World! ')).toBe('hello-world');
|
|
40
|
-
});
|
|
41
|
-
it('falls back to "kraken-skill" for empty input', () => {
|
|
42
|
-
expect(slugifyLabel('')).toBe('kraken-skill');
|
|
43
|
-
expect(slugifyLabel('!!!')).toBe('kraken-skill');
|
|
44
|
-
});
|
|
45
|
-
it('caps at 40 chars', () => {
|
|
46
|
-
const long = 'a'.repeat(100);
|
|
47
|
-
expect(slugifyLabel(long).length).toBeLessThanOrEqual(40);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('suggestSkillsFromRun', () => {
|
|
51
|
-
it('returns [] when the run did not converge', () => {
|
|
52
|
-
const result = makeResult({
|
|
53
|
-
converged: false,
|
|
54
|
-
refs: [
|
|
55
|
-
makeRef({ id: 't0001', kind: 'verify', label: 'judge', status: 'done', verdict: 'fail', findings: 'x'.repeat(200) }),
|
|
56
|
-
makeRef({ id: 't0002', kind: 'fix', label: 'rework', status: 'done', findings: 'y'.repeat(200) }),
|
|
57
|
-
],
|
|
58
|
-
});
|
|
59
|
-
expect(suggestSkillsFromRun(result, { graphId: 'g1', goal: 'x' })).toEqual([]);
|
|
60
|
-
});
|
|
61
|
-
it('returns [] when no reviewer failed', () => {
|
|
62
|
-
const result = makeResult({
|
|
63
|
-
converged: true,
|
|
64
|
-
refs: [
|
|
65
|
-
makeRef({ id: 't0001', kind: 'general', label: 'do', status: 'done', findings: 'ok' }),
|
|
66
|
-
makeRef({ id: 't0002', kind: 'verify', label: 'judge', status: 'done', verdict: 'pass', findings: 'ok' }),
|
|
67
|
-
],
|
|
68
|
-
});
|
|
69
|
-
expect(suggestSkillsFromRun(result, { graphId: 'g2', goal: 'x' })).toEqual([]);
|
|
70
|
-
});
|
|
71
|
-
it('returns [] when there are no fix-nodes', () => {
|
|
72
|
-
const result = makeResult({
|
|
73
|
-
converged: true,
|
|
74
|
-
refs: [
|
|
75
|
-
makeRef({ id: 't0001', kind: 'general', label: 'do', status: 'done' }),
|
|
76
|
-
makeRef({ id: 't0002', kind: 'verify', label: 'judge', status: 'done', verdict: 'fail', findings: 'broken' }),
|
|
77
|
-
],
|
|
78
|
-
});
|
|
79
|
-
expect(suggestSkillsFromRun(result, { graphId: 'g3', goal: 'x' })).toEqual([]);
|
|
80
|
-
});
|
|
81
|
-
it('produces one suggestion for a FAIL→fix pattern', () => {
|
|
82
|
-
const result = makeResult({
|
|
83
|
-
converged: true,
|
|
84
|
-
refs: [
|
|
85
|
-
makeRef({ id: 't0001', kind: 'general', label: 'refactor auth', status: 'done', findings: 'wrote code' }),
|
|
86
|
-
makeRef({
|
|
87
|
-
id: 't0002',
|
|
88
|
-
kind: 'verify',
|
|
89
|
-
label: 'acceptance check',
|
|
90
|
-
status: 'done',
|
|
91
|
-
verdict: 'fail',
|
|
92
|
-
findings: 'function `slugify` is missing from src/util.ts',
|
|
93
|
-
}),
|
|
94
|
-
makeRef({
|
|
95
|
-
id: 't0003',
|
|
96
|
-
kind: 'fix',
|
|
97
|
-
label: 'rework: refactor auth',
|
|
98
|
-
status: 'done',
|
|
99
|
-
findings: 'added slugify, removed unused import',
|
|
100
|
-
}),
|
|
101
|
-
],
|
|
102
|
-
});
|
|
103
|
-
const out = suggestSkillsFromRun(result, { graphId: 'g-abc', goal: 'refactor auth' });
|
|
104
|
-
expect(out).toHaveLength(1);
|
|
105
|
-
const s = out[0];
|
|
106
|
-
expect(s.id).toMatch(/^kraken-skill-/);
|
|
107
|
-
expect(s.id).toContain('g-abc');
|
|
108
|
-
expect(s.title).toMatch(/acceptance check/);
|
|
109
|
-
expect(s.sourceKind).toBe('verify');
|
|
110
|
-
expect(s.body).toContain('slugify');
|
|
111
|
-
expect(s.body).toContain('/promote-skill');
|
|
112
|
-
expect(s.confidence).toBeGreaterThan(0);
|
|
113
|
-
});
|
|
114
|
-
it('confidence is high when findings are concrete and the goal is non-trivial', () => {
|
|
115
|
-
const failure = 'function `slugify` is missing from src/util.ts: it should take a string and return a slugified version. '.repeat(5);
|
|
116
|
-
const fix = 'added slugify, removed unused import, updated test to cover unicode. '.repeat(5);
|
|
117
|
-
const result = makeResult({
|
|
118
|
-
converged: true,
|
|
119
|
-
refs: [
|
|
120
|
-
makeRef({ id: 't0001', kind: 'general', label: 'do', status: 'done' }),
|
|
121
|
-
makeRef({ id: 't0002', kind: 'verify', label: 'judge', status: 'done', verdict: 'fail', findings: failure }),
|
|
122
|
-
makeRef({ id: 't0003', kind: 'fix', label: 'rework', status: 'done', findings: fix }),
|
|
123
|
-
makeRef({ id: 't0004', kind: 'merge', label: 'merge', status: 'done' }),
|
|
124
|
-
],
|
|
125
|
-
});
|
|
126
|
-
const out = suggestSkillsFromRun(result, { graphId: 'g-rich', goal: 'ship a working slugify that handles unicode' });
|
|
127
|
-
expect(out[0].confidence).toBeGreaterThanOrEqual(0.9);
|
|
128
|
-
});
|
|
129
|
-
it('handles spec and conformance reviewers the same way as verify', () => {
|
|
130
|
-
const result = makeResult({
|
|
131
|
-
converged: true,
|
|
132
|
-
refs: [
|
|
133
|
-
makeRef({ id: 't0001', kind: 'general', label: 'do', status: 'done' }),
|
|
134
|
-
makeRef({ id: 't0002', kind: 'spec', label: 'spec review', status: 'done', verdict: 'fail', findings: 'spec mismatch' }),
|
|
135
|
-
makeRef({ id: 't0003', kind: 'conformance', label: 'conformance', status: 'done', verdict: 'fail', findings: 'literal mismatch' }),
|
|
136
|
-
makeRef({ id: 't0004', kind: 'fix', label: 'rework', status: 'done', findings: 'fixed' }),
|
|
137
|
-
],
|
|
138
|
-
});
|
|
139
|
-
const out = suggestSkillsFromRun(result, { graphId: 'g-multi', goal: 'match the spec' });
|
|
140
|
-
expect(out).toHaveLength(1);
|
|
141
|
-
expect(out[0].sourceKind).toBe('spec'); // first reviewer fail wins
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
describe('renderSuggestionCard', () => {
|
|
145
|
-
it('returns the suggestion body unchanged', () => {
|
|
146
|
-
const s = {
|
|
147
|
-
id: 'test',
|
|
148
|
-
title: 'T',
|
|
149
|
-
body: 'hello',
|
|
150
|
-
sourceKind: 'verify',
|
|
151
|
-
failureFindings: 'broken',
|
|
152
|
-
confidence: 0.5,
|
|
153
|
-
};
|
|
154
|
-
expect(renderSuggestionCard(s)).toBe('hello');
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
//# sourceMappingURL=skillSuggest.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillSuggest.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/skillSuggest.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,SAAS,OAAO,CAAC,IAAoH;IACnI,OAAO;QACL,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAiD;IACnE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO;QACL,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,IAAI;QAChB,kBAAkB,EAAE,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE;gBACJ,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpH,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;aAClG;SACF,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACtF,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aAC1G;SACF,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBACtE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;aAC9G;SACF,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;gBACzG,OAAO,CAAC;oBACN,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,kBAAkB;oBACzB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,gDAAgD;iBAC3D,CAAC;gBACF,OAAO,CAAC;oBACN,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,uBAAuB;oBAC9B,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,sCAAsC;iBACjD,CAAC;aACH;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,OAAO,GAAG,0GAA0G,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrI,MAAM,GAAG,GAAG,uEAAuE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBACtE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;gBAC5G,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;gBACrF,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;aACxE;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC,CAAC;QACrH,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBACtE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;gBACxH,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;gBAClI,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;aAC1F;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG;YACR,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,QAAQ;YACpB,eAAe,EAAE,QAAQ;YACzB,UAAU,EAAE,GAAG;SAChB,CAAC;QACF,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ADR-0025 lock tests — strict done defaults per surface.
|
|
3
|
-
*
|
|
4
|
-
* Kraken (default surface): opt-in via ZELARI_STRICT_DONE, else off (1.x compat).
|
|
5
|
-
* Mission: strict evidence gate ON by default; ZELARI_MISSION_STRICT=0|false
|
|
6
|
-
* is the only opt-out. These defaults are product decisions, not accidents —
|
|
7
|
-
* a regression here changes what "done" means for autonomous missions.
|
|
8
|
-
*/
|
|
9
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
10
|
-
import { evaluateStrictBuildGate, strictDoneEnabled, } from './verificationBridge.js';
|
|
11
|
-
import { resetKrakenCandidates, setKrakenCheckResults, setKrakenSelection, } from './candidateRegistry.js';
|
|
12
|
-
const CHECKS = ['mission slice keeps the spine replayable', 'export round-trips'];
|
|
13
|
-
function emitSeq() {
|
|
14
|
-
let n = 1;
|
|
15
|
-
return async () => ({ seq: n++ });
|
|
16
|
-
}
|
|
17
|
-
function selectWithChecks(checks) {
|
|
18
|
-
resetKrakenCandidates();
|
|
19
|
-
setKrakenSelection({
|
|
20
|
-
status: 'selected',
|
|
21
|
-
winnerIndex: 0,
|
|
22
|
-
rationale: 'test',
|
|
23
|
-
requiredChecks: checks,
|
|
24
|
-
degraded: false,
|
|
25
|
-
verifier: null,
|
|
26
|
-
judgedBy: 'llm',
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
let prevKraken;
|
|
30
|
-
let prevMission;
|
|
31
|
-
let prevPack;
|
|
32
|
-
/** Swap both strict envs for the duration of fn; restore in finally. */
|
|
33
|
-
async function withEnv(kraken, mission, fn) {
|
|
34
|
-
const k = process.env.ZELARI_STRICT_DONE;
|
|
35
|
-
const m = process.env.ZELARI_MISSION_STRICT;
|
|
36
|
-
if (kraken === undefined)
|
|
37
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
38
|
-
else
|
|
39
|
-
process.env.ZELARI_STRICT_DONE = kraken;
|
|
40
|
-
if (mission === undefined)
|
|
41
|
-
delete process.env.ZELARI_MISSION_STRICT;
|
|
42
|
-
else
|
|
43
|
-
process.env.ZELARI_MISSION_STRICT = mission;
|
|
44
|
-
try {
|
|
45
|
-
return await fn();
|
|
46
|
-
}
|
|
47
|
-
finally {
|
|
48
|
-
if (k === undefined)
|
|
49
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
50
|
-
else
|
|
51
|
-
process.env.ZELARI_STRICT_DONE = k;
|
|
52
|
-
if (m === undefined)
|
|
53
|
-
delete process.env.ZELARI_MISSION_STRICT;
|
|
54
|
-
else
|
|
55
|
-
process.env.ZELARI_MISSION_STRICT = m;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
beforeEach(() => {
|
|
59
|
-
prevKraken = process.env.ZELARI_STRICT_DONE;
|
|
60
|
-
prevMission = process.env.ZELARI_MISSION_STRICT;
|
|
61
|
-
prevPack = process.env.ZELARI_VERIFY_PACK;
|
|
62
|
-
delete process.env.ZELARI_VERIFY_PACK;
|
|
63
|
-
resetKrakenCandidates();
|
|
64
|
-
});
|
|
65
|
-
afterEach(() => {
|
|
66
|
-
if (prevKraken === undefined)
|
|
67
|
-
delete process.env.ZELARI_STRICT_DONE;
|
|
68
|
-
else
|
|
69
|
-
process.env.ZELARI_STRICT_DONE = prevKraken;
|
|
70
|
-
if (prevMission === undefined)
|
|
71
|
-
delete process.env.ZELARI_MISSION_STRICT;
|
|
72
|
-
else
|
|
73
|
-
process.env.ZELARI_MISSION_STRICT = prevMission;
|
|
74
|
-
if (prevPack === undefined)
|
|
75
|
-
delete process.env.ZELARI_VERIFY_PACK;
|
|
76
|
-
else
|
|
77
|
-
process.env.ZELARI_VERIFY_PACK = prevPack;
|
|
78
|
-
resetKrakenCandidates();
|
|
79
|
-
});
|
|
80
|
-
describe('strictDoneEnabled defaults (ADR-0025)', () => {
|
|
81
|
-
it('kraken: default OFF, opt-in via ZELARI_STRICT_DONE', async () => {
|
|
82
|
-
await withEnv(undefined, undefined, () => {
|
|
83
|
-
expect(strictDoneEnabled()).toBe(false);
|
|
84
|
-
expect(strictDoneEnabled('kraken')).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
await withEnv('1', undefined, () => expect(strictDoneEnabled()).toBe(true));
|
|
87
|
-
await withEnv('true', undefined, () => expect(strictDoneEnabled()).toBe(true));
|
|
88
|
-
await withEnv('0', undefined, () => expect(strictDoneEnabled()).toBe(false));
|
|
89
|
-
});
|
|
90
|
-
it('mission: default ON regardless of ZELARI_STRICT_DONE', async () => {
|
|
91
|
-
await withEnv(undefined, undefined, () => expect(strictDoneEnabled('mission')).toBe(true));
|
|
92
|
-
await withEnv('0', undefined, () => expect(strictDoneEnabled('mission')).toBe(true));
|
|
93
|
-
await withEnv('false', undefined, () => expect(strictDoneEnabled('mission')).toBe(true));
|
|
94
|
-
});
|
|
95
|
-
it('mission: ZELARI_MISSION_STRICT=0|false is the only opt-out', async () => {
|
|
96
|
-
await withEnv(undefined, '0', () => expect(strictDoneEnabled('mission')).toBe(false));
|
|
97
|
-
await withEnv(undefined, 'false', () => expect(strictDoneEnabled('mission')).toBe(false));
|
|
98
|
-
await withEnv(undefined, '1', () => expect(strictDoneEnabled('mission')).toBe(true));
|
|
99
|
-
await withEnv('1', '0', () => expect(strictDoneEnabled('mission')).toBe(false));
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('evaluateStrictBuildGate surface wiring (ADR-0025)', () => {
|
|
103
|
-
it('mission surface enforces the evidence contract by default (unknown → blocked)', async () => {
|
|
104
|
-
await withEnv(undefined, undefined, async () => {
|
|
105
|
-
selectWithChecks(CHECKS);
|
|
106
|
-
// No check results reported → every required criterion is unknown.
|
|
107
|
-
const gate = await evaluateStrictBuildGate('build', { surface: 'mission' });
|
|
108
|
-
expect(gate.strict).toBe(true);
|
|
109
|
-
expect(gate.blocked).toBe(true);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
it('mission opt-out restores the legacy-only outcome', async () => {
|
|
113
|
-
await withEnv(undefined, '0', async () => {
|
|
114
|
-
selectWithChecks(CHECKS);
|
|
115
|
-
setKrakenCheckResults(CHECKS.map((c) => ({ check: c, status: 'pass', note: 'ok (stub)' })));
|
|
116
|
-
const gate = await evaluateStrictBuildGate('build', { surface: 'mission' });
|
|
117
|
-
expect(gate.strict).toBe(false);
|
|
118
|
-
expect(gate.blocked).toBe(false); // legacy gate green + no strict overlay
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
it('kraken surface (default) stays opt-in even with checks registered', async () => {
|
|
122
|
-
await withEnv(undefined, undefined, async () => {
|
|
123
|
-
selectWithChecks(CHECKS);
|
|
124
|
-
setKrakenCheckResults(CHECKS.map((c) => ({ check: c, status: 'pass', note: 'ok (stub)' })));
|
|
125
|
-
const gate = await evaluateStrictBuildGate('build'); // no surface → kraken
|
|
126
|
-
expect(gate.strict).toBe(false);
|
|
127
|
-
expect(gate.blocked).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
it('mission default does not run the native pack without ZELARI_VERIFY_PACK', async () => {
|
|
131
|
-
// The mission default gates on the selection contract only; the native
|
|
132
|
-
// criteria pack (real typecheck/test/build commands) stays opt-in so the
|
|
133
|
-
// default never adds process spawns the user did not ask for.
|
|
134
|
-
await withEnv(undefined, undefined, async () => {
|
|
135
|
-
selectWithChecks([CHECKS[0]]);
|
|
136
|
-
setKrakenCheckResults([
|
|
137
|
-
{ check: CHECKS[0], status: 'pass', note: 'spine replay ok (stub)' },
|
|
138
|
-
]);
|
|
139
|
-
const gate = await evaluateStrictBuildGate('build', { surface: 'mission', emit: emitSeq() });
|
|
140
|
-
expect(gate.strict).toBe(true);
|
|
141
|
-
expect(gate.native).toBeNull();
|
|
142
|
-
expect(gate.blocked).toBe(false); // pass with event-backed note → PASS
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
// Type-level lock: the surface union is exactly the two ADR-0025 surfaces.
|
|
147
|
-
const _surfaceUnionLock = ['kraken', 'mission'];
|
|
148
|
-
void _surfaceUnionLock;
|
|
149
|
-
//# sourceMappingURL=strictDefaults.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"strictDefaults.test.js","sourceRoot":"","sources":["../../../src/cli/kraken/strictDefaults.test.ts"],"names":[],"mappings":"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"}
|