zelari-code 2.13.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/headless/policyGate.js +101 -0
- package/dist/cli/headless/policyGate.js.map +1 -0
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/kraken/completionProof.js +89 -41
- package/dist/cli/kraken/completionProof.js.map +1 -1
- package/dist/cli/kraken/completionProofAttestation.js +157 -0
- package/dist/cli/kraken/completionProofAttestation.js.map +1 -0
- package/dist/cli/kraken/completionProofPersist.js +219 -0
- package/dist/cli/kraken/completionProofPersist.js.map +1 -0
- package/dist/cli/kraken/completionProofProbe.js +135 -0
- package/dist/cli/kraken/completionProofProbe.js.map +1 -0
- package/dist/cli/kraken/contractCompiler.js +142 -0
- package/dist/cli/kraken/contractCompiler.js.map +1 -0
- package/dist/cli/kraken/delegationPolicy.js +40 -3
- package/dist/cli/kraken/delegationPolicy.js.map +1 -1
- package/dist/cli/kraken/executor.js +462 -9
- package/dist/cli/kraken/executor.js.map +1 -1
- package/dist/cli/kraken/fileOwnership.js +190 -0
- package/dist/cli/kraken/fileOwnership.js.map +1 -0
- package/dist/cli/kraken/modelReputation.js +208 -0
- package/dist/cli/kraken/modelReputation.js.map +1 -0
- package/dist/cli/kraken/nativeVerification.js +53 -11
- package/dist/cli/kraken/nativeVerification.js.map +1 -1
- package/dist/cli/kraken/planner.js +2 -0
- package/dist/cli/kraken/planner.js.map +1 -1
- package/dist/cli/kraken/reputationStore.js +139 -0
- package/dist/cli/kraken/reputationStore.js.map +1 -0
- package/dist/cli/kraken/semanticOwnership.js +184 -0
- package/dist/cli/kraken/semanticOwnership.js.map +1 -0
- package/dist/cli/kraken/spawnRoi.js +209 -0
- package/dist/cli/kraken/spawnRoi.js.map +1 -0
- package/dist/cli/kraken/transactional.js +104 -0
- package/dist/cli/kraken/transactional.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/dotnet.js +49 -0
- package/dist/cli/kraken/verificationAdapters/dotnet.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/go.js +36 -0
- package/dist/cli/kraken/verificationAdapters/go.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/index.js +47 -0
- package/dist/cli/kraken/verificationAdapters/index.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/java.js +102 -0
- package/dist/cli/kraken/verificationAdapters/java.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/node.js +90 -0
- package/dist/cli/kraken/verificationAdapters/node.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/python.js +86 -0
- package/dist/cli/kraken/verificationAdapters/python.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/rust.js +39 -0
- package/dist/cli/kraken/verificationAdapters/rust.js.map +1 -0
- package/dist/cli/kraken/verificationAdapters/types.js +2 -0
- package/dist/cli/kraken/verificationAdapters/types.js.map +1 -0
- package/dist/cli/kraken/verificationBridge.js +40 -3
- package/dist/cli/kraken/verificationBridge.js.map +1 -1
- package/dist/cli/kraken/verifierLifecycle.js +51 -36
- package/dist/cli/kraken/verifierLifecycle.js.map +1 -1
- package/dist/cli/kraken/verifierRouting.js +264 -0
- package/dist/cli/kraken/verifierRouting.js.map +1 -0
- package/dist/cli/kraken/worktreeScheduling.js +201 -0
- package/dist/cli/kraken/worktreeScheduling.js.map +1 -0
- package/dist/cli/main.bundled.js +3880 -889
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/orchestration/facts.js +127 -0
- package/dist/cli/orchestration/facts.js.map +1 -0
- package/dist/cli/orchestration/policy.js +128 -75
- package/dist/cli/orchestration/policy.js.map +1 -1
- package/dist/cli/orchestration/signals.js +96 -0
- package/dist/cli/orchestration/signals.js.map +1 -0
- package/dist/cli/runHeadless.js +92 -19
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/safety/policyEngine.js +159 -20
- package/dist/cli/safety/policyEngine.js.map +1 -1
- package/dist/cli/safety/policyLoadMode.js +59 -0
- package/dist/cli/safety/policyLoadMode.js.map +1 -0
- package/dist/cli/safety/resourceClaims.js +373 -0
- package/dist/cli/safety/resourceClaims.js.map +1 -0
- package/dist/cli/safety/sandboxPath.js +160 -17
- package/dist/cli/safety/sandboxPath.js.map +1 -1
- package/dist/cli/toolRegistry.js +98 -8
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/tools/execProcess.js +121 -0
- package/dist/cli/tools/execProcess.js.map +1 -0
- package/dist/cli/tools/krakenRadio.js +9 -0
- package/dist/cli/tools/krakenRadio.js.map +1 -1
- package/dist/cli/tools/taskTool.js +8 -3
- package/dist/cli/tools/taskTool.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* completionProofPersist — t20 (§P1.B): the durability contract behind the
|
|
3
|
+
* completion proof artifact.
|
|
4
|
+
*
|
|
5
|
+
* Three responsibilities, kept out of completionProof.ts to hold every file
|
|
6
|
+
* under the 300-LOC discipline:
|
|
7
|
+
*
|
|
8
|
+
* 1. ATOMIC WRITES — tmp → fsync(file) → rename over the final name, with a
|
|
9
|
+
* win32 fallback (EPERM/ENOTEMPTY under AV/indexer locks → rm + rename)
|
|
10
|
+
* and a guarantee that no `.tmp` litter survives success OR failure.
|
|
11
|
+
* 2. PERSISTENCE MODE — `ZELARI_PROOF_PERSISTENCE` env override over
|
|
12
|
+
* surface defaults (headless/mission/CI ⇒ `required`, interactive TUI ⇒
|
|
13
|
+
* `best-effort`), mirroring safety/policyLoadMode's pure-resolver +
|
|
14
|
+
* registered-active-surface pattern.
|
|
15
|
+
* 3. REQUIRED ENFORCEMENT — the pure gate flip: PASS + un-writable proof ⇒
|
|
16
|
+
* BLOCKED (completionGate exit-4 family), with the failure reason
|
|
17
|
+
* appended to the summary so NDJSON/headless surfaces see WHY.
|
|
18
|
+
*/
|
|
19
|
+
import { open, rename, rm } from 'node:fs/promises';
|
|
20
|
+
import { randomBytes } from 'node:crypto';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { computeProofDigest, isSha256Hex, PROOF_KIND, PROOF_VERSION, } from './completionProofAttestation.js';
|
|
23
|
+
/** Env override accepted by resolveProofPersistenceMode. */
|
|
24
|
+
export const PROOF_PERSISTENCE_ENV = 'ZELARI_PROOF_PERSISTENCE';
|
|
25
|
+
function isTruthyFlag(v) {
|
|
26
|
+
const n = v?.trim().toLowerCase();
|
|
27
|
+
return n === '1' || n === 'true' || n === 'yes' || n === 'on';
|
|
28
|
+
}
|
|
29
|
+
const warnedInvalidOverrides = new Set();
|
|
30
|
+
/**
|
|
31
|
+
* Emit ONE warning per distinct invalid override value (hosts surface it;
|
|
32
|
+
* repeat evaluations stay quiet).
|
|
33
|
+
*/
|
|
34
|
+
function warnInvalidOverride(raw, fallback) {
|
|
35
|
+
if (warnedInvalidOverrides.has(raw))
|
|
36
|
+
return;
|
|
37
|
+
warnedInvalidOverrides.add(raw);
|
|
38
|
+
try {
|
|
39
|
+
process.stderr.write(`[zelari] ignoring invalid ${PROOF_PERSISTENCE_ENV}=${JSON.stringify(raw)} ` +
|
|
40
|
+
`(expected "best-effort" or "required") — defaulting to ${fallback}\n`);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* stderr unavailable — resolution continues */
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Pure mode resolution — precedence mirrors safety/policyLoadMode:
|
|
48
|
+
* 1. ZELARI_PROOF_PERSISTENCE=best-effort|required (any other value is
|
|
49
|
+
* IGNORED with a warning and falls through — no typo flips durability);
|
|
50
|
+
* 2. headless and mission surfaces default to `required`: an unattended
|
|
51
|
+
* run without its durable witness is not verifiable-complete;
|
|
52
|
+
* 3. the interactive TUI defaults to `best-effort` (a read-only checkout
|
|
53
|
+
* must not brick chat), tightening to `required` under ambient CI
|
|
54
|
+
* because CI consumes proofs as a pass condition (PW §7).
|
|
55
|
+
*/
|
|
56
|
+
export function resolveProofPersistenceMode(env, ctx) {
|
|
57
|
+
const fallback = ctx.surface === 'headless' || ctx.surface === 'mission' || isTruthyFlag(ctx.ci) ? 'required' : 'best-effort';
|
|
58
|
+
const raw = env[PROOF_PERSISTENCE_ENV];
|
|
59
|
+
if (raw !== undefined) {
|
|
60
|
+
const v = raw.trim().toLowerCase();
|
|
61
|
+
if (v === 'best-effort')
|
|
62
|
+
return 'best-effort';
|
|
63
|
+
if (v === 'required')
|
|
64
|
+
return 'required';
|
|
65
|
+
warnInvalidOverride(raw.trim(), fallback);
|
|
66
|
+
}
|
|
67
|
+
return fallback;
|
|
68
|
+
}
|
|
69
|
+
// ── Active-surface seam (registered once by the host, like policyLoadMode)
|
|
70
|
+
let activeSurface = 'tui';
|
|
71
|
+
/** Register the host BEFORE any proof write (runHeadless pre-flight). */
|
|
72
|
+
export function setActiveProofPersistenceSurface(surface) {
|
|
73
|
+
activeSurface = surface;
|
|
74
|
+
}
|
|
75
|
+
/** Current registration (read-mostly; exposed for tests/diagnostics). */
|
|
76
|
+
export function activeProofPersistenceSurface() {
|
|
77
|
+
return activeSurface;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolve the ACTIVE persistence mode from the registered surface + env.
|
|
81
|
+
* `env` is injectable so callers/tests avoid touching process.env.
|
|
82
|
+
*/
|
|
83
|
+
export function activeProofPersistenceMode(env = process.env) {
|
|
84
|
+
return resolveProofPersistenceMode(env, {
|
|
85
|
+
surface: activeSurface,
|
|
86
|
+
...(typeof env.CI === 'string' ? { ci: env.CI } : {}),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// ── Atomic file write (tmp → fsync → rename) ─────────────────────────────
|
|
90
|
+
/** win32 rename-over-existing can hit transient AV/indexer locks. */
|
|
91
|
+
function isWindowsRenameBlock(err) {
|
|
92
|
+
if (process.platform !== 'win32')
|
|
93
|
+
return false;
|
|
94
|
+
const code = err?.code;
|
|
95
|
+
return code === 'EPERM' || code === 'ENOTEMPTY' || code === 'EEXIST';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Transaction-grade replacement for writeFile: data lands in
|
|
99
|
+
* `<target>.<random>.tmp`, gets fsync'd (`fh.sync()`), closes, and is
|
|
100
|
+
* renamed over the final name — readers never observe a half-written
|
|
101
|
+
* artifact. win32 fallback: EPERM/ENOTEMPTY → rm the previous file, rename
|
|
102
|
+
* again. On ANY failure the tmp file is removed; no `.tmp` litter survives
|
|
103
|
+
* success OR failure.
|
|
104
|
+
*/
|
|
105
|
+
export async function writeFileAtomic(target, data) {
|
|
106
|
+
const dir = path.dirname(target);
|
|
107
|
+
const tmp = path.join(dir, `.${path.basename(target)}.${randomBytes(6).toString('hex')}.tmp`);
|
|
108
|
+
let fh = null;
|
|
109
|
+
try {
|
|
110
|
+
fh = await open(tmp, 'w');
|
|
111
|
+
await fh.writeFile(data, 'utf8');
|
|
112
|
+
await fh.sync(); // flush contents BEFORE the rename publishes them
|
|
113
|
+
await fh.close();
|
|
114
|
+
fh = null;
|
|
115
|
+
try {
|
|
116
|
+
await rename(tmp, target);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (!isWindowsRenameBlock(err))
|
|
120
|
+
throw err;
|
|
121
|
+
await rm(target, { force: true }); // drop the stale artifact, retry
|
|
122
|
+
await rename(tmp, target);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
if (fh !== null) {
|
|
127
|
+
try {
|
|
128
|
+
await fh.close();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
/* already closed */
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
await rm(tmp, { force: true }).catch(() => undefined);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* t20 required-persistence contract, kept PURE so hosts wire it themselves:
|
|
139
|
+
* PASS + unwritable proof ⇒ blocked=true, with the failure reason appended
|
|
140
|
+
* to the summary (visible in NDJSON/log surfacing and any later re-render).
|
|
141
|
+
* An already-BLOCKED gate just records the extra cause. Mutates `gate` in
|
|
142
|
+
* place; returns true when enforcement fired.
|
|
143
|
+
*/
|
|
144
|
+
export function enforceRequiredProofPersistence(gate, outcome) {
|
|
145
|
+
if (!outcome.requiredBlockReason)
|
|
146
|
+
return false;
|
|
147
|
+
if (!gate.blocked) {
|
|
148
|
+
gate.summary = `${gate.summary} [required-proof-persist]: ${outcome.requiredBlockReason}`;
|
|
149
|
+
}
|
|
150
|
+
gate.blocked = true;
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
const ATTESTATION_KEYS = [
|
|
154
|
+
'commitSha',
|
|
155
|
+
'diffDigest',
|
|
156
|
+
'taskContractDigest',
|
|
157
|
+
'verificationPlanDigest',
|
|
158
|
+
'harnessManifestDigest',
|
|
159
|
+
'proofDigest',
|
|
160
|
+
];
|
|
161
|
+
/**
|
|
162
|
+
* Offline validator for a written proof — structural + integrity checks
|
|
163
|
+
* ONLY, no repo access (that is what makes it usable in CI). Re-seals the
|
|
164
|
+
* parsed proof via canonical hashing (order-insensitive) and compares the
|
|
165
|
+
* stored `proofDigest`; every present digest must be well-formed sha256
|
|
166
|
+
* hex. Never throws.
|
|
167
|
+
*/
|
|
168
|
+
export function validateCompletionProof(proofJson) {
|
|
169
|
+
const errors = [];
|
|
170
|
+
if (!proofJson || typeof proofJson !== 'object' || Array.isArray(proofJson)) {
|
|
171
|
+
return { valid: false, errors: ['proof must be a JSON object'] };
|
|
172
|
+
}
|
|
173
|
+
const proof = proofJson;
|
|
174
|
+
if (proof.kind !== PROOF_KIND)
|
|
175
|
+
errors.push(`kind must be "${PROOF_KIND}"`);
|
|
176
|
+
if (proof.version !== PROOF_VERSION)
|
|
177
|
+
errors.push(`version must be ${PROOF_VERSION}`);
|
|
178
|
+
if (!proof.evaluation || typeof proof.evaluation !== 'object' || Array.isArray(proof.evaluation)) {
|
|
179
|
+
errors.push('evaluation must be a JSON object');
|
|
180
|
+
}
|
|
181
|
+
if (!proof.attestation || typeof proof.attestation !== 'object' || Array.isArray(proof.attestation)) {
|
|
182
|
+
return { valid: false, errors: [...errors, 'attestation must be a JSON object'] };
|
|
183
|
+
}
|
|
184
|
+
const att = proof.attestation;
|
|
185
|
+
for (const key of Object.keys(att)) {
|
|
186
|
+
if (!ATTESTATION_KEYS.includes(key))
|
|
187
|
+
errors.push(`attestation.${key} is not a known field`);
|
|
188
|
+
}
|
|
189
|
+
for (const key of ATTESTATION_KEYS) {
|
|
190
|
+
const v = att[key];
|
|
191
|
+
if (v === undefined || v === null) {
|
|
192
|
+
if (key === 'harnessManifestDigest' || key === 'proofDigest')
|
|
193
|
+
errors.push(`attestation.${key} is required`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (key === 'commitSha') {
|
|
197
|
+
if (typeof v !== 'string' || v.trim().length === 0) {
|
|
198
|
+
errors.push('attestation.commitSha must be a non-empty git sha string');
|
|
199
|
+
}
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (!isSha256Hex(v))
|
|
203
|
+
errors.push(`attestation.${key} must be sha256 hex`);
|
|
204
|
+
}
|
|
205
|
+
// Integrity seal: recompute over the parsed tree and compare.
|
|
206
|
+
if (isSha256Hex(att.proofDigest) && !errors.some((e) => e.startsWith('kind') || e.startsWith('version'))) {
|
|
207
|
+
const recomputed = computeProofDigest({
|
|
208
|
+
kind: proof.kind,
|
|
209
|
+
version: proof.version,
|
|
210
|
+
evaluation: proof.evaluation,
|
|
211
|
+
attestation: att,
|
|
212
|
+
});
|
|
213
|
+
if (recomputed !== att.proofDigest) {
|
|
214
|
+
errors.push('proofDigest does not match the sealed content (tampered or stale proof)');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return { valid: errors.length === 0, errors };
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=completionProofPersist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completionProofPersist.js","sourceRoot":"","sources":["../../../src/cli/kraken/completionProofPersist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAEL,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,aAAa,GAGd,MAAM,iCAAiC,CAAC;AAWzC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAWhE,SAAS,YAAY,CAAC,CAAqB;IACzC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC;AAED,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjD;;;GAGG;AACH,SAAS,mBAAmB,CAAC,GAAW,EAAE,QAA8B;IACtE,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC5C,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,qBAAqB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;YAC1E,0DAA0D,QAAQ,IAAI,CACzE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B,CACzC,GAAuC,EACvC,GAAiC;IAEjC,MAAM,QAAQ,GACZ,GAAG,CAAC,OAAO,KAAK,UAAU,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;IAC/G,MAAM,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,aAAa;YAAE,OAAO,aAAa,CAAC;QAC9C,IAAI,CAAC,KAAK,UAAU;YAAE,OAAO,UAAU,CAAC;QACxC,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4EAA4E;AAE5E,IAAI,aAAa,GAA4B,KAAK,CAAC;AAEnD,yEAAyE;AACzE,MAAM,UAAU,gCAAgC,CAAC,OAAgC;IAC/E,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,6BAA6B;IAC3C,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAA0C,OAAO,CAAC,GAAG;IAC9F,OAAO,2BAA2B,CAAC,GAAG,EAAE;QACtC,OAAO,EAAE,aAAa;QACtB,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;AACL,CAAC;AAED,4EAA4E;AAE5E,qEAAqE;AACrE,SAAS,oBAAoB,CAAC,GAAY;IACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAI,GAAoC,EAAE,IAAI,CAAC;IACzD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,QAAQ,CAAC;AACvE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,IAAY;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9F,IAAI,EAAE,GAAsB,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,kDAAkD;QACnE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,EAAE,GAAG,IAAI,CAAC;QACV,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YAC1C,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,iCAAiC;YACpE,MAAM,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAC7C,IAAO,EACP,OAAsE;IAEtE,IAAI,CAAC,OAAO,CAAC,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,8BAA8B,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AASD,MAAM,gBAAgB,GAAG;IACvB,WAAW;IACX,YAAY;IACZ,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,aAAa;CACL,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAkB;IACxD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,SAAuC,CAAC;IACtD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,UAAU,GAAG,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,OAAO,KAAK,aAAa;QAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;IACrF,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACjG,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACpG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,mCAAmC,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,WAAiD,CAAC;IACpE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAE,gBAAsC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,eAAe,GAAG,uBAAuB,CAAC,CAAC;IACrH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAClC,IAAI,GAAG,KAAK,uBAAuB,IAAI,GAAG,KAAK,aAAa;gBAAE,MAAM,CAAC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,CAAC;YAC5G,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YAC1E,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAED,8DAA8D;IAC9D,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,UAAU,GAAG,kBAAkB,CAAC;YACpC,IAAI,EAAE,KAAK,CAAC,IAAc;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAiB;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,GAAkC;SAChD,CAAC,CAAC;QACH,IAAI,UAAU,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* completionProofProbe — t20 (§P1.B): environment-derived attestation
|
|
3
|
+
* inputs for the completion proof. Everything here is BEST-EFFORT and
|
|
4
|
+
* read-only: a missing git binary, a non-repo cwd, a disabled criteria
|
|
5
|
+
* pack or an unreadable package.json simply omits the corresponding
|
|
6
|
+
* attestation field (they are optional by design). Kept apart from the
|
|
7
|
+
* sealing core so that core stays pure and instantly testable.
|
|
8
|
+
*
|
|
9
|
+
* Owns:
|
|
10
|
+
* - harnessManifest: deterministic harness identity (version, pack,
|
|
11
|
+
* adapters, policy precedence/load mode) — PW §7;
|
|
12
|
+
* - gatherGitAttestation: HEAD sha + staged/unstaged `git diff` text;
|
|
13
|
+
* - defaultVerificationPlanSnapshot: the t19 adapter-resolved plan
|
|
14
|
+
* ({packId, commands}) canonically shaped for verificationPlanDigest.
|
|
15
|
+
*/
|
|
16
|
+
import { execFile } from 'node:child_process';
|
|
17
|
+
import { promisify } from 'node:util';
|
|
18
|
+
// t22: the active contract-scope seam feeds the live taskContractDigest.
|
|
19
|
+
import { activeContractScope } from './contractCompiler.js';
|
|
20
|
+
const HARNESS_VERSION_FALLBACK = '2.13.0';
|
|
21
|
+
/**
|
|
22
|
+
* Mirrors verificationAdapters/index.ts REGISTRY ORDER IS CONTRACT. Kept a
|
|
23
|
+
* literal (adapters carry no id field); completionProofProbe.test.ts locks
|
|
24
|
+
* it to the live registry length so a registry extension without a mirror
|
|
25
|
+
* sync fails the suite instead of silently mis-attesting.
|
|
26
|
+
*/
|
|
27
|
+
const ADAPTER_IDS = ['node', 'python', 'rust', 'go', 'java', 'dotnet'];
|
|
28
|
+
let cachedHarnessVersion = null;
|
|
29
|
+
async function readHarnessVersion() {
|
|
30
|
+
if (cachedHarnessVersion !== null)
|
|
31
|
+
return cachedHarnessVersion;
|
|
32
|
+
try {
|
|
33
|
+
const { readFile } = await import('node:fs/promises');
|
|
34
|
+
const { fileURLToPath } = await import('node:url');
|
|
35
|
+
const pkgPath = fileURLToPath(new URL('../../../package.json', import.meta.url));
|
|
36
|
+
const parsed = JSON.parse(await readFile(pkgPath, 'utf8'));
|
|
37
|
+
if (typeof parsed.version === 'string' && parsed.version.length > 0) {
|
|
38
|
+
return (cachedHarnessVersion = parsed.version);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* fall through to the pinned constant */
|
|
43
|
+
}
|
|
44
|
+
return (cachedHarnessVersion = HARNESS_VERSION_FALLBACK);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The deterministic identity of the harness that produced a proof: which
|
|
48
|
+
* binary, which criteria pack, which adapters COULD have bound, and how
|
|
49
|
+
* policies were layered/loaded. Constant per configuration — cheap, and
|
|
50
|
+
* enough to detect cross-environment drift.
|
|
51
|
+
*/
|
|
52
|
+
export async function harnessManifest(env = process.env) {
|
|
53
|
+
const [{ policyPrecedenceFromEnv }, { activePolicyLoadMode }, { ZELARI_CODING_PACK_ID }] = await Promise.all([
|
|
54
|
+
import('../safety/policyEngine.js'),
|
|
55
|
+
import('../safety/policyLoadMode.js'),
|
|
56
|
+
import('@zelari/core/verification'),
|
|
57
|
+
]);
|
|
58
|
+
return {
|
|
59
|
+
harnessVersion: await readHarnessVersion(),
|
|
60
|
+
packId: ZELARI_CODING_PACK_ID,
|
|
61
|
+
adapters: ADAPTER_IDS,
|
|
62
|
+
policyPrecedence: policyPrecedenceFromEnv(),
|
|
63
|
+
policyLoadMode: activePolicyLoadMode(env),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const execFileAsync = promisify(execFile);
|
|
67
|
+
/** Best-effort `git -C <cwd> <args>` → stdout | null (never throws). */
|
|
68
|
+
async function git(cwd, args) {
|
|
69
|
+
try {
|
|
70
|
+
const { stdout } = await execFileAsync('git', ['-C', cwd, ...args], {
|
|
71
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
72
|
+
windowsHide: true,
|
|
73
|
+
});
|
|
74
|
+
return stdout;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve commit + working-tree-diff inputs (staged + unstaged vs HEAD).
|
|
82
|
+
* Any failure omits both fields; never throws.
|
|
83
|
+
*/
|
|
84
|
+
export async function gatherGitAttestation(cwd = process.cwd()) {
|
|
85
|
+
const [head, stagedDiff, unstagedDiff] = await Promise.all([
|
|
86
|
+
git(cwd, ['rev-parse', 'HEAD']),
|
|
87
|
+
git(cwd, ['diff', '--cached']),
|
|
88
|
+
git(cwd, ['diff']),
|
|
89
|
+
]);
|
|
90
|
+
const inputs = {};
|
|
91
|
+
const sha = head?.trim();
|
|
92
|
+
if (sha)
|
|
93
|
+
inputs.commitSha = sha;
|
|
94
|
+
if (stagedDiff !== null && unstagedDiff !== null) {
|
|
95
|
+
inputs.diffText = [stagedDiff, unstagedDiff].filter((s) => s.length > 0).join('\n');
|
|
96
|
+
}
|
|
97
|
+
return inputs;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Snapshot of the resolved native verification plan for THIS repo (t19
|
|
101
|
+
* adapters + env overrides), shaped canonically for verificationPlanDigest.
|
|
102
|
+
* undefined when the pack is disabled / nothing binds / resolution fails.
|
|
103
|
+
* Never throws.
|
|
104
|
+
*/
|
|
105
|
+
export async function defaultVerificationPlanSnapshot(cwd = process.cwd(), env = process.env) {
|
|
106
|
+
try {
|
|
107
|
+
const { nativePackEnabled, resolvePackCommandsForRoot } = await import('./nativeVerification.js');
|
|
108
|
+
const { ZELARI_CODING_PACK_ID } = await import('@zelari/core/verification');
|
|
109
|
+
if (!nativePackEnabled(env))
|
|
110
|
+
return undefined;
|
|
111
|
+
const commands = await resolvePackCommandsForRoot(env, cwd);
|
|
112
|
+
if (!commands.typecheckCommand && !commands.testCommand && !commands.buildCommand)
|
|
113
|
+
return undefined;
|
|
114
|
+
return { packId: ZELARI_CODING_PACK_ID, commands };
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* t22 (PW §8): the LIVE TaskContract of the active turn, read from the
|
|
122
|
+
* contract-scope seam (kraken/contractCompiler.setActiveContractScope).
|
|
123
|
+
* Hosts re-register after every accepted steer, so a proof written after a
|
|
124
|
+
* steer hashes version N+1 — `taskContractDigest` always tracks the CURRENT
|
|
125
|
+
* contract. undefined when no scoped contract is registered; never throws.
|
|
126
|
+
*/
|
|
127
|
+
export function activeTaskContractSnapshot() {
|
|
128
|
+
try {
|
|
129
|
+
return activeContractScope()?.contract;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=completionProofProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completionProofProbe.js","sourceRoot":"","sources":["../../../src/cli/kraken/completionProofProbe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { LocalWorkspace, NodeShellProvider } from '@zelari/core/runtime';
|
|
2
|
+
import { VerificationEngine, } from '@zelari/core/verification';
|
|
3
|
+
import { EMPTY_POLICY_RULE_SET, matchAgentPolicyRule, } from '../safety/policyEngine.js';
|
|
4
|
+
/** Engine packId for contract-derived checks (distinct from the coding pack). */
|
|
5
|
+
export const CONTRACT_CRITERIA_PACK_ID = 'task-contract/v1';
|
|
6
|
+
/** Per-command timeout for compiled criteria (mirrors the native pack default). */
|
|
7
|
+
export const CONTRACT_COMMAND_TIMEOUT_MS = 600_000;
|
|
8
|
+
/** Sanity cap for a hint accepted as one shell command line. */
|
|
9
|
+
const MAX_COMMAND_LENGTH = 512;
|
|
10
|
+
// ── Capability layer (scope → policy rules) ───────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Compile `scope` into edit-category PolicyRules (the ACTUAL policyEngine
|
|
13
|
+
* shape: ordered list, FIRST match wins within the layer). Order encodes
|
|
14
|
+
* precedence so overlaps stay conservative:
|
|
15
|
+
*
|
|
16
|
+
* forbidden denies → allowedPath allows → catch-all deny (`**`)
|
|
17
|
+
*
|
|
18
|
+
* RESTRICT-ONLY by construction: `deny` entries rank highest in
|
|
19
|
+
* intersectEffects; the `allow` entries exist ONLY to opt paths out of the
|
|
20
|
+
* trailing deny-all — ranked lowest they can never relax any other layer or
|
|
21
|
+
* the category decision (identical lattice to policyLayers.ts).
|
|
22
|
+
*/
|
|
23
|
+
export function compileCapabilityRules(contract) {
|
|
24
|
+
const scope = contract.scope;
|
|
25
|
+
if (!scope)
|
|
26
|
+
return [];
|
|
27
|
+
const rules = [];
|
|
28
|
+
for (const glob of scope.forbiddenPaths ?? []) {
|
|
29
|
+
if (glob.trim() === '')
|
|
30
|
+
continue;
|
|
31
|
+
rules.push({ match: glob, effect: 'deny', reason: 'contract:forbiddenPath' });
|
|
32
|
+
}
|
|
33
|
+
const allowed = (scope.allowedPaths ?? []).filter((g) => g.trim() !== '');
|
|
34
|
+
if (allowed.length > 0) {
|
|
35
|
+
for (const glob of allowed) {
|
|
36
|
+
rules.push({ match: glob, effect: 'allow', reason: 'contract:allowedPath' });
|
|
37
|
+
}
|
|
38
|
+
rules.push({ match: '**', effect: 'deny', reason: 'contract:outsideAllowedPaths' });
|
|
39
|
+
}
|
|
40
|
+
return rules;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The compiled layer as a `PolicyRuleSet` (edit-only) so callers can feed it
|
|
44
|
+
* through the SAME evaluators used for global/project layers
|
|
45
|
+
* (matchAgentPolicyRule / matchAgentPolicyRuleLayered): drop it in as an
|
|
46
|
+
* extra source and the deny>ask>allow intersection does the rest.
|
|
47
|
+
*/
|
|
48
|
+
export function contractCapabilityLayer(contract) {
|
|
49
|
+
return { shell: [], edit: compileCapabilityRules(contract) };
|
|
50
|
+
}
|
|
51
|
+
let activeScope;
|
|
52
|
+
/**
|
|
53
|
+
* Register the live contract of THIS mission/turn (call at turn start and
|
|
54
|
+
* again after every accepted steer — `latestTaskContract` + the spine carry
|
|
55
|
+
* the new version). Pass `undefined` to clear. No-op-safe, idempotent.
|
|
56
|
+
*/
|
|
57
|
+
export function setActiveContractScope(contract) {
|
|
58
|
+
activeScope = contract ? { contract, capabilityRules: contractCapabilityLayer(contract) } : undefined;
|
|
59
|
+
}
|
|
60
|
+
/** Current registration (undefined when the turn has no scoped contract). */
|
|
61
|
+
export function activeContractScope() {
|
|
62
|
+
return activeScope;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* One tool invocation's CONTRACT verdict: restrict-only match of the active
|
|
66
|
+
* capability layer over the invocation args (same path normalization /
|
|
67
|
+
* candidates as the global+project layers). Null ⇒ the decision chain is
|
|
68
|
+
* untouched; non-null ⇒ intersect its effect LAST (non-overridable slot).
|
|
69
|
+
*/
|
|
70
|
+
export function matchContractCapabilityRule(required, args, root) {
|
|
71
|
+
return matchAgentPolicyRule(activeScope?.capabilityRules ?? EMPTY_POLICY_RULE_SET, required, args, root);
|
|
72
|
+
}
|
|
73
|
+
// ── Verification criteria (verificationHint → deterministic checks) ───────
|
|
74
|
+
/** True when value parses as ONE sane shell command line (no CR/LF/NUL). */
|
|
75
|
+
function isShellCommandLike(value) {
|
|
76
|
+
const trimmed = value.trim();
|
|
77
|
+
if (trimmed === '' || trimmed.length > MAX_COMMAND_LENGTH)
|
|
78
|
+
return false;
|
|
79
|
+
// eslint-disable-next-line no-control-regex
|
|
80
|
+
return !/[\r\n\0]/.test(trimmed);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Deterministic criteria from `verificationHint` commands: one Criterion per
|
|
84
|
+
* acceptance criterion whose hint parses as a shell command (`Verify:`-style
|
|
85
|
+
* lines). Required:true per user intent — these ARE the definition of done
|
|
86
|
+
* stated by the author. `unknown ≠ pass` still holds end-to-end (an
|
|
87
|
+
* unrunnable command honestly surfaces as unknown, blocking like the pack's).
|
|
88
|
+
* No hints ⇒ [] ⇒ zero contribution (no behavior change for old contracts).
|
|
89
|
+
*/
|
|
90
|
+
export function compileVerificationCriteria(contract, opts = {}) {
|
|
91
|
+
const timeoutMs = opts.timeoutMs ?? CONTRACT_COMMAND_TIMEOUT_MS;
|
|
92
|
+
const out = [];
|
|
93
|
+
for (const c of contract.acceptanceCriteria) {
|
|
94
|
+
const hint = c.verificationHint;
|
|
95
|
+
if (!hint || hint.kind !== 'command')
|
|
96
|
+
continue;
|
|
97
|
+
const command = hint.value?.trim();
|
|
98
|
+
if (!command || !isShellCommandLike(command))
|
|
99
|
+
continue;
|
|
100
|
+
out.push({
|
|
101
|
+
id: `contract:${c.id}`,
|
|
102
|
+
text: c.text,
|
|
103
|
+
source: 'task',
|
|
104
|
+
required: true,
|
|
105
|
+
check: { kind: 'command', command, timeoutMs },
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
/** Brief-named alias — the seam callers use when they hold the contract. */
|
|
111
|
+
export function contractCriteriaFor(contract, opts = {}) {
|
|
112
|
+
return compileVerificationCriteria(contract, opts);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Compiled criteria straight off the ACTIVE seam — how verificationBridge
|
|
116
|
+
* pulls the current-turn contribution without threading options through
|
|
117
|
+
* every host. Empty array when nothing is registered.
|
|
118
|
+
*/
|
|
119
|
+
export function activeContractCriteria(opts = {}) {
|
|
120
|
+
return activeScope ? compileVerificationCriteria(activeScope.contract, opts) : [];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Execute the contract's compiled criteria through the SAME deterministic
|
|
124
|
+
* core engine the native pack uses. Deliberately NOT gated on
|
|
125
|
+
* ZELARI_VERIFY_PACK (user-stated Verify commands stand alone); results join
|
|
126
|
+
* the pack's inside evaluateStrictBuildGate where blockers add up.
|
|
127
|
+
*/
|
|
128
|
+
export async function evaluateContractCriteria(contract, deps = {}) {
|
|
129
|
+
if (!contract)
|
|
130
|
+
return null;
|
|
131
|
+
const cwd = deps.cwd ?? process.cwd();
|
|
132
|
+
const criteria = compileVerificationCriteria(contract, { timeoutMs: deps.timeoutMs });
|
|
133
|
+
if (criteria.length === 0)
|
|
134
|
+
return null;
|
|
135
|
+
const shell = deps.shell ?? new NodeShellProvider(new LocalWorkspace(cwd));
|
|
136
|
+
const engine = deps.emit
|
|
137
|
+
? new VerificationEngine({ shell }, { emit: deps.emit })
|
|
138
|
+
: new VerificationEngine({ shell });
|
|
139
|
+
const results = await engine.evaluate(criteria, { packId: CONTRACT_CRITERIA_PACK_ID });
|
|
140
|
+
return { criteria, results };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=contractCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractCompiler.js","sourceRoot":"","sources":["../../../src/cli/kraken/contractCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* Routing (`ZELARI_KRAKEN_*_MODEL`) answers *which model* a tentacle uses.
|
|
5
5
|
* This policy answers *whether* the lead should create the tentacle at all.
|
|
6
6
|
*
|
|
7
|
-
* `automatic` (default) injects nothing
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* `automatic` (default) injects nothing. Two sources can produce a REAL
|
|
8
|
+
* policy now (t23 / P1.E):
|
|
9
|
+
* 1. this env var (explicit user/host override — WINS below),
|
|
10
|
+
* 2. a strategy-derived mapping from the v2 OrchestrationDecision:
|
|
11
|
+
* `resolveDelegationPolicyForRun(strategy)` in the `--mode auto` path
|
|
12
|
+
* replaces the historical no-op injection with an actual module.
|
|
10
13
|
*
|
|
11
14
|
* Env: `ZELARI_KRAKEN_DELEGATION=automatic|prefer|aggressive|lead-only`
|
|
12
15
|
*/
|
|
@@ -41,6 +44,40 @@ export function resolveDelegationPolicy(raw = process.env[KRAKEN_DELEGATION_ENV]
|
|
|
41
44
|
return 'automatic';
|
|
42
45
|
return ALIASES[v] ?? 'automatic';
|
|
43
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* t23 (§P1.E) — strategy → delegation mapping (replaces the `automatic`
|
|
49
|
+
* no-op when a v2 OrchestrationDecision is present). Maps onto the EXISTING
|
|
50
|
+
* three policy fragments (no new prompt prose invented):
|
|
51
|
+
*
|
|
52
|
+
* lead-only → 'lead-only' (prefer-lead / no tentacles)
|
|
53
|
+
* explore → 'automatic' (solo surface: delegation n/a, neutral)
|
|
54
|
+
* lead+verify → 'prefer' (default WITH the verify pass)
|
|
55
|
+
* parallel-build → 'prefer' (tentacles preferred incl. general)
|
|
56
|
+
* graph → 'prefer' (tentacles preferred incl. general)
|
|
57
|
+
* council → null (n/a on the council surface)
|
|
58
|
+
*/
|
|
59
|
+
export const STRATEGY_DELEGATION = {
|
|
60
|
+
'lead-only': 'lead-only',
|
|
61
|
+
explore: 'automatic',
|
|
62
|
+
'lead+verify': 'prefer',
|
|
63
|
+
'parallel-build': 'prefer',
|
|
64
|
+
graph: 'prefer',
|
|
65
|
+
council: null,
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Effective delegation policy for one run. PRECEDENCE: an explicit
|
|
69
|
+
* non-automatic `ZELARI_KRAKEN_DELEGATION` wins over any strategy-derived
|
|
70
|
+
* value; otherwise the strategy map applies; no strategy ⇒ historical
|
|
71
|
+
* default ('automatic', which still injects nothing).
|
|
72
|
+
*/
|
|
73
|
+
export function resolveDelegationPolicyForRun(strategy, env = process.env) {
|
|
74
|
+
const raw = env[KRAKEN_DELEGATION_ENV]?.trim().toLowerCase() ?? '';
|
|
75
|
+
const explicit = raw ? ALIASES[raw] : undefined;
|
|
76
|
+
if (explicit && explicit !== 'automatic')
|
|
77
|
+
return explicit;
|
|
78
|
+
const derived = strategy ? STRATEGY_DELEGATION[strategy] : undefined;
|
|
79
|
+
return derived ?? 'automatic';
|
|
80
|
+
}
|
|
44
81
|
const PREFER_CONTENT = `# Kraken Delegation Policy
|
|
45
82
|
|
|
46
83
|
Current policy: **prefer tentacles**.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegationPolicy.js","sourceRoot":"","sources":["../../../src/cli/kraken/delegationPolicy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delegationPolicy.js","sourceRoot":"","sources":["../../../src/cli/kraken/delegationPolicy.ts"],"names":[],"mappings":"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"}
|