zelari-code 2.38.0 → 2.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cli/headless/runOneTurn.js +7 -0
  2. package/dist/cli/headless/runOneTurn.js.map +1 -1
  3. package/dist/cli/hooks/useChatTurn.js +56 -10
  4. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  5. package/dist/cli/hooks/useSlashDispatch.js +16 -1
  6. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  7. package/dist/cli/kraken/executor.js +126 -11
  8. package/dist/cli/kraken/executor.js.map +1 -1
  9. package/dist/cli/kraken/exploreCoverage.js +201 -0
  10. package/dist/cli/kraken/exploreCoverage.js.map +1 -0
  11. package/dist/cli/kraken/exploreFlipGate.js +197 -0
  12. package/dist/cli/kraken/exploreFlipGate.js.map +1 -0
  13. package/dist/cli/kraken/planner.js.map +1 -1
  14. package/dist/cli/kraken/verifyReask.js +134 -0
  15. package/dist/cli/kraken/verifyReask.js.map +1 -0
  16. package/dist/cli/main.bundled.js +4315 -3605
  17. package/dist/cli/main.bundled.js.map +4 -4
  18. package/dist/cli/memory/opsKnowledge.js +284 -0
  19. package/dist/cli/memory/opsKnowledge.js.map +1 -0
  20. package/dist/cli/memory/promotion.js +20 -0
  21. package/dist/cli/memory/promotion.js.map +1 -1
  22. package/dist/cli/memory/repeatFailure.js +60 -0
  23. package/dist/cli/memory/repeatFailure.js.map +1 -0
  24. package/dist/cli/runHeadless.js +6 -1
  25. package/dist/cli/runHeadless.js.map +1 -1
  26. package/dist/cli/slashCommands.js +18 -2
  27. package/dist/cli/slashCommands.js.map +1 -1
  28. package/dist/cli/slashHandlers/memory.js +1 -0
  29. package/dist/cli/slashHandlers/memory.js.map +1 -1
  30. package/dist/cli/slashHandlers/missionResume.js +54 -0
  31. package/dist/cli/slashHandlers/missionResume.js.map +1 -0
  32. package/dist/cli/tools/taskTool.js +22 -0
  33. package/dist/cli/tools/taskTool.js.map +1 -1
  34. package/dist/cli/zelariMission.js.map +1 -1
  35. package/package.json +6 -2
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Ops-knowledge promotion (Cursor-Projects steal, slice 1.1 / 3.2).
3
+ *
4
+ * After a strict completion gate PASSes with deterministic, event-backed
5
+ * evidence, remember a `procedure` candidate in Memory V2 so the next
6
+ * agent can reuse the command that actually passed.
7
+ *
8
+ * Slice 3.2: a REPAIR_REQUIRED / BLOCKED gate records a `failure` node keyed
9
+ * by a stable fingerprint (command + exit code + output digest). Seeing the
10
+ * SAME fingerprint a second time promotes a `constraint` candidate ("stesso
11
+ * fallimento ripetuto") that a human may lint or `/memory promote` by hand —
12
+ * this module never writes AGENTS.md and never emits lint files.
13
+ *
14
+ * Default OFF (`ZELARI_PROMOTE_OPS_KNOWLEDGE`). Never writes AGENTS.md.
15
+ * Never throws to the parent run.
16
+ */
17
+ import { createHash } from 'node:crypto';
18
+ import { formatPromoteNotice, meetsPromoteThreshold } from './promotion.js';
19
+ import { CONSTRAINT_CONFIDENCE, CONSTRAINT_IMPORTANCE, constraintNodeId, failureFingerprint, failureNodeId, guessExitCode, repeatConstraintText, } from './repeatFailure.js';
20
+ export { constraintNodeId, failureFingerprint, failureNodeId, repeatConstraintText, } from './repeatFailure.js';
21
+ const ALLOWED_TIERS = new Set(['command-output', 'fs-observation']);
22
+ export function isOpsKnowledgePromotionEnabled(env = process.env) {
23
+ const v = env.ZELARI_PROMOTE_OPS_KNOWLEDGE?.trim().toLowerCase();
24
+ return v === '1' || v === 'true' || v === 'on' || v === 'yes';
25
+ }
26
+ export function opsKnowledgeKey(command, digest, criterionId) {
27
+ return createHash('sha256')
28
+ .update(`${command}\0${digest}\0${criterionId}`)
29
+ .digest('hex')
30
+ .slice(0, 24);
31
+ }
32
+ function pickEligibleEvidence(result) {
33
+ return result.evidence.find((ref) => ALLOWED_TIERS.has(ref.tier) &&
34
+ typeof ref.seq === 'number' &&
35
+ ref.seq > 0 &&
36
+ typeof ref.digest === 'string' &&
37
+ ref.digest.length > 0);
38
+ }
39
+ function candidatesFromResults(results, status) {
40
+ const out = [];
41
+ for (const result of results) {
42
+ if (result.status !== status)
43
+ continue;
44
+ if (result.source !== 'deterministic-engine')
45
+ continue;
46
+ const evidence = pickEligibleEvidence(result);
47
+ if (!evidence || evidence.seq === undefined || !evidence.digest)
48
+ continue;
49
+ const command = evidence.ref.trim();
50
+ if (!command)
51
+ continue;
52
+ out.push({
53
+ criterionId: result.criterionId,
54
+ command,
55
+ digest: evidence.digest,
56
+ seq: evidence.seq,
57
+ key: opsKnowledgeKey(command, evidence.digest, result.criterionId),
58
+ status,
59
+ });
60
+ }
61
+ return out;
62
+ }
63
+ /** Pure: PASS + deterministic engine + event-backed command/fs evidence. */
64
+ export function extractOpsKnowledgeCandidates(gate) {
65
+ if (gate.evaluation?.verdict !== 'PASS')
66
+ return [];
67
+ if ((gate.anchoring?.noteFallback ?? 0) > 0)
68
+ return [];
69
+ return candidatesFromResults(gate.results ?? [], 'pass');
70
+ }
71
+ /** Pure: fail evidence from a blocked/repair gate (for consolidate ×2). */
72
+ export function extractOpsFailureCandidates(gate) {
73
+ const verdict = gate.evaluation?.verdict;
74
+ if (verdict === 'PASS' || verdict == null)
75
+ return [];
76
+ if ((gate.anchoring?.noteFallback ?? 0) > 0)
77
+ return [];
78
+ return candidatesFromResults(gate.results ?? [], 'fail');
79
+ }
80
+ async function rememberProcedure(memory, candidate, deps) {
81
+ const id = `ops-${candidate.key}`;
82
+ try {
83
+ const existing = await memory.get(id);
84
+ if (existing && existing.status === 'active')
85
+ return 'duplicate';
86
+ await memory.remember({
87
+ id,
88
+ kind: 'procedure',
89
+ content: `${candidate.command} → pass (${candidate.criterionId})`,
90
+ importance: 0.75,
91
+ confidence: 0.9,
92
+ visibility: 'project',
93
+ tags: ['ops-knowledge', 'strict-pass', candidate.criterionId],
94
+ source: {
95
+ agent: 'ops-knowledge',
96
+ sessionId: deps.sessionId,
97
+ verificationId: String(candidate.seq),
98
+ },
99
+ metadata: {
100
+ command: candidate.command,
101
+ digest: candidate.digest,
102
+ criterionId: candidate.criterionId,
103
+ seq: candidate.seq,
104
+ opsKnowledgeKey: candidate.key,
105
+ verified: true,
106
+ writeClass: 'candidate',
107
+ },
108
+ writeClass: 'candidate',
109
+ });
110
+ return 'created';
111
+ }
112
+ catch {
113
+ return 'error';
114
+ }
115
+ }
116
+ /**
117
+ * Record ONE failure node per fingerprint; the SECOND sighting of the same
118
+ * fingerprint proposes a `constraint` candidate.
119
+ *
120
+ * The constraint is created here (not by `memory.consolidate`) because the
121
+ * fingerprint is the dedupe key: the second run finds the first node and
122
+ * writes nothing, so consolidation would never see two matching failures.
123
+ * Consolidation stays the consumer — the constraint carries
124
+ * `writeClass: 'candidate'`, and its importance/confidence clear the
125
+ * promotion bar so the same notice channel used for procedures surfaces it.
126
+ */
127
+ async function rememberFailure(memory, candidate, deps) {
128
+ const exitCode = guessExitCode(candidate.command);
129
+ const fingerprint = failureFingerprint(candidate.command, exitCode, candidate.digest);
130
+ const failureId = failureNodeId(fingerprint);
131
+ const constraintId = constraintNodeId(fingerprint);
132
+ try {
133
+ // Legacy id from slice 1.1 (pre-fingerprint) counts as a first sighting.
134
+ const prior = (await memory.get(failureId)) ?? (await memory.get(`fail-${candidate.key}`));
135
+ if (!prior || prior.status !== 'active') {
136
+ await memory.remember({
137
+ id: failureId,
138
+ kind: 'failure',
139
+ content: `${candidate.command} → fail (${candidate.criterionId})`,
140
+ importance: 0.55,
141
+ confidence: 0.9,
142
+ visibility: 'project',
143
+ tags: ['ops-knowledge', 'strict-fail', candidate.criterionId],
144
+ source: {
145
+ agent: 'ops-knowledge',
146
+ sessionId: deps.sessionId,
147
+ verificationId: String(candidate.seq),
148
+ },
149
+ metadata: {
150
+ command: candidate.command,
151
+ digest: candidate.digest,
152
+ criterionId: candidate.criterionId,
153
+ seq: candidate.seq,
154
+ opsKnowledgeKey: candidate.key,
155
+ fingerprint,
156
+ exitCode,
157
+ writeClass: 'candidate',
158
+ },
159
+ writeClass: 'candidate',
160
+ });
161
+ return { failure: 'created', constraint: 'skipped', fingerprint, constraintId };
162
+ }
163
+ }
164
+ catch {
165
+ return { failure: 'error', constraint: 'skipped', fingerprint, constraintId };
166
+ }
167
+ // Second sighting: propose the constraint (never lint, never AGENTS.md).
168
+ try {
169
+ const existing = await memory.get(constraintId);
170
+ if (existing && existing.status === 'active') {
171
+ return { failure: 'repeated', constraint: 'duplicate', fingerprint, constraintId };
172
+ }
173
+ await memory.remember({
174
+ id: constraintId,
175
+ kind: 'constraint',
176
+ content: repeatConstraintText(candidate.command, exitCode),
177
+ importance: CONSTRAINT_IMPORTANCE,
178
+ confidence: CONSTRAINT_CONFIDENCE,
179
+ visibility: 'project',
180
+ tags: ['ops-knowledge', 'strict-fail', 'repeat-failure', candidate.criterionId],
181
+ source: {
182
+ agent: 'ops-knowledge',
183
+ sessionId: deps.sessionId,
184
+ verificationId: String(candidate.seq),
185
+ },
186
+ metadata: {
187
+ command: candidate.command,
188
+ digest: candidate.digest,
189
+ criterionId: candidate.criterionId,
190
+ seq: candidate.seq,
191
+ opsKnowledgeKey: candidate.key,
192
+ fingerprint,
193
+ exitCode,
194
+ failureNodeId: failureId,
195
+ writeClass: 'candidate',
196
+ },
197
+ writeClass: 'candidate',
198
+ });
199
+ return { failure: 'repeated', constraint: 'created', fingerprint, constraintId };
200
+ }
201
+ catch {
202
+ return { failure: 'repeated', constraint: 'error', fingerprint, constraintId };
203
+ }
204
+ }
205
+ export async function promoteOpsKnowledge(gate, deps) {
206
+ const env = deps.env ?? process.env;
207
+ if (!isOpsKnowledgePromotionEnabled(env)) {
208
+ return emptyResult(false, 'flag-off');
209
+ }
210
+ const pass = extractOpsKnowledgeCandidates(gate);
211
+ const fails = extractOpsFailureCandidates(gate);
212
+ if (pass.length === 0 && fails.length === 0) {
213
+ const reason = gate.evaluation?.verdict === 'PASS' ? 'no-eligible-evidence' : 'not-pass';
214
+ return emptyResult(true, reason);
215
+ }
216
+ const memory = deps.memory ?? (await openMemory(deps.projectRoot, env));
217
+ if (!memory)
218
+ return emptyResult(true, 'memory-unavailable');
219
+ let created = 0;
220
+ let skippedDuplicate = 0;
221
+ let constraintsCreated = 0;
222
+ const proposals = [];
223
+ for (const candidate of pass) {
224
+ const outcome = await rememberProcedure(memory, candidate, { sessionId: deps.sessionId });
225
+ if (outcome === 'created') {
226
+ created += 1;
227
+ const node = await memory.get(`ops-${candidate.key}`);
228
+ if (node && meetsPromoteThreshold(node))
229
+ proposals.push(formatPromoteNotice(node));
230
+ }
231
+ else if (outcome === 'duplicate') {
232
+ skippedDuplicate += 1;
233
+ }
234
+ }
235
+ for (const candidate of fails) {
236
+ const outcome = await rememberFailure(memory, candidate, { sessionId: deps.sessionId });
237
+ if (outcome.failure === 'created')
238
+ created += 1;
239
+ else if (outcome.failure === 'repeated')
240
+ skippedDuplicate += 1;
241
+ if (outcome.constraint === 'created') {
242
+ created += 1;
243
+ constraintsCreated += 1;
244
+ const node = await memory.get(outcome.constraintId);
245
+ if (node && meetsPromoteThreshold(node))
246
+ proposals.push(formatPromoteNotice(node));
247
+ }
248
+ else if (outcome.constraint === 'duplicate') {
249
+ skippedDuplicate += 1;
250
+ }
251
+ }
252
+ return { enabled: true, created, skippedDuplicate, constraintsCreated, proposals };
253
+ }
254
+ /** Best-effort wrapper: never rejects. */
255
+ export async function promoteOpsKnowledgeSafe(gate, deps) {
256
+ try {
257
+ return await promoteOpsKnowledge(gate, deps);
258
+ }
259
+ catch {
260
+ return emptyResult(true, 'error');
261
+ }
262
+ }
263
+ function emptyResult(enabled, skippedReason) {
264
+ return {
265
+ enabled,
266
+ skippedReason,
267
+ created: 0,
268
+ skippedDuplicate: 0,
269
+ constraintsCreated: 0,
270
+ proposals: [],
271
+ };
272
+ }
273
+ async function openMemory(projectRoot, env) {
274
+ try {
275
+ const factory = await import('./serviceFactory.js');
276
+ if (!factory.isMemoryV2Enabled(env) && env.ZELARI_MEMORY !== 'force')
277
+ return null;
278
+ return await factory.getMemoryService(projectRoot, env);
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }
284
+ //# sourceMappingURL=opsKnowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opsKnowledge.js","sourceRoot":"","sources":["../../../src/cli/memory/opsKnowledge.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,20 @@ import * as path from 'node:path';
3
3
  const START = '<!-- zelari:memory-promotions:start -->';
4
4
  const END = '<!-- zelari:memory-promotions:end -->';
5
5
  const DURABLE_KINDS = new Set(['fact', 'decision', 'constraint', 'preference', 'procedure']);
6
+ export const PROMOTE_MIN_IMPORTANCE = 0.7;
7
+ export const PROMOTE_MIN_CONFIDENCE = 0.8;
8
+ /** Numeric floor, or an explicit verified/validated_by mark from ops-knowledge. */
9
+ export function meetsPromoteThreshold(node) {
10
+ if (node.metadata?.verified === true)
11
+ return true;
12
+ if (node.metadata?.validatedBy === true)
13
+ return true;
14
+ return node.importance >= PROMOTE_MIN_IMPORTANCE && node.confidence >= PROMOTE_MIN_CONFIDENCE;
15
+ }
16
+ export function formatPromoteNotice(node) {
17
+ const preview = node.content.replace(/\s+/g, ' ').trim().slice(0, 120);
18
+ return `[memory] candidato AGENTS.MD: ${node.kind} “${preview}” — /memory promote ${node.id}`;
19
+ }
6
20
  function lineFor(node) {
7
21
  const content = node.content
8
22
  .replace(/\s+/g, ' ')
@@ -20,6 +34,12 @@ export async function promoteMemoryToAgentsMd(projectRoot, node) {
20
34
  if (!DURABLE_KINDS.has(node.kind)) {
21
35
  return { added: false, path: path.join(projectRoot, 'AGENTS.md'), reason: `${node.kind} is not a durable instruction kind` };
22
36
  }
37
+ // The manual `/memory promote` path carries the SAME bar the notices assume
38
+ // (importance ≥ 0.7 AND confidence ≥ 0.8, or an explicit verified mark):
39
+ // nothing below it is worth a permanent AGENTS.md line.
40
+ if (!meetsPromoteThreshold(node)) {
41
+ return { added: false, path: path.join(projectRoot, 'AGENTS.md'), reason: 'below-threshold' };
42
+ }
23
43
  const root = await fs.realpath(projectRoot).catch(() => path.resolve(projectRoot));
24
44
  const target = path.join(root, 'AGENTS.md');
25
45
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"promotion.js","sourceRoot":"","sources":["../../../src/cli/memory/promotion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"promotion.js","sourceRoot":"","sources":["../../../src/cli/memory/promotion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Repeat-failure helpers (slice 3.2).
3
+ *
4
+ * A failure is identified by a STABLE fingerprint (command + exit code +
5
+ * output digest) so the same breakage always lands on the same memory node
6
+ * instead of growing the graph, and a second sighting of that fingerprint can
7
+ * propose a `constraint` candidate ("stesso fallimento ripetuto").
8
+ *
9
+ * Pure functions only: no memory writes, no AGENTS.md, no lint files.
10
+ */
11
+ import { createHash } from 'node:crypto';
12
+ /**
13
+ * A constraint proposed by a repeat failure must clear the same bar the
14
+ * `/memory promote` path and the AGENTS.md notices assume
15
+ * (importance >= 0.7 AND confidence >= 0.8) — below it the candidate would be
16
+ * silently un-promotable.
17
+ */
18
+ export const CONSTRAINT_IMPORTANCE = 0.72;
19
+ export const CONSTRAINT_CONFIDENCE = 0.85;
20
+ const MAX_LABEL_CHARS = 200;
21
+ /**
22
+ * Stable fingerprint for "same error twice" (slice 3.2).
23
+ *
24
+ * `digest` is the captured-output digest carried by the verification
25
+ * evidence (the engine hashes the command output). Two runs only share a
26
+ * fingerprint when command, exit code AND output are identical — normalize
27
+ * the digest here first if a future slice wants a coarser match.
28
+ */
29
+ export function failureFingerprint(command, exitCode, digest) {
30
+ return createHash('sha256')
31
+ .update(`${command}\0${exitCode}\0${digest}`)
32
+ .digest('hex')
33
+ .slice(0, 24);
34
+ }
35
+ /** Memory id of the single failure node that owns a fingerprint. */
36
+ export function failureNodeId(fingerprint) {
37
+ return `fail-${fingerprint}`;
38
+ }
39
+ /** Memory id of the constraint a repeated fingerprint promotes to. */
40
+ export function constraintNodeId(fingerprint) {
41
+ return `con-${fingerprint}`;
42
+ }
43
+ /** Evidence refs read like `npm test → exit 1`; keep the command alone. */
44
+ export function failureCommandLabel(command) {
45
+ const stripped = command.replace(/\s*(?:→|->)?\s*exit\s+-?\d+\s*$/i, '').trim();
46
+ return (stripped || command.trim()).slice(0, MAX_LABEL_CHARS);
47
+ }
48
+ /** Deterministic text of the constraint proposed when a failure repeats. */
49
+ export function repeatConstraintText(command, exitCode) {
50
+ return `Stesso fallimento ripetuto: ${failureCommandLabel(command)} exit ${exitCode}. Considera lint/SKILL/AGENTS.MD.`;
51
+ }
52
+ /** Exit code recorded in the evidence ref, defaulting to 1 when absent. */
53
+ export function guessExitCode(command) {
54
+ const match = command.match(/exit\s+(-?\d+)/i);
55
+ if (!match)
56
+ return 1;
57
+ const n = Number(match[1]);
58
+ return Number.isFinite(n) ? n : 1;
59
+ }
60
+ //# sourceMappingURL=repeatFailure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repeatFailure.js","sourceRoot":"","sources":["../../../src/cli/memory/repeatFailure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,QAAgB,EAAE,MAAc;IAClF,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,OAAO,KAAK,QAAQ,KAAK,MAAM,EAAE,CAAC;SAC5C,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,QAAQ,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,OAAO,WAAW,EAAE,CAAC;AAC9B,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChF,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AAChE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,QAAgB;IACpE,OAAO,+BAA+B,mBAAmB,CAAC,OAAO,CAAC,SAAS,QAAQ,mCAAmC,CAAC;AACzH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -1369,8 +1369,13 @@ async function runHeadlessZelariBody(opts, provider, model, providerStream, extr
1369
1369
  // --no-strict-done overlay). A blocked gate never exits 0 —
1370
1370
  // the mission "success" becomes the strict exit code and the spine
1371
1371
  // records mission-strict-blocked instead of mission-success.
1372
+ // F3 seam adapter (same as the runOneTurn.ts gate sites): the core
1373
+ // engine's emitEvidence reads the anchor as `out.seq` (object field),
1374
+ // while the headless spine resolves the seq NUMBER. A bare number here
1375
+ // leaves every mission-close EvidenceRef unanchored — the strict gate
1376
+ // can then never PASS on the mission path (green run → false exit 4).
1372
1377
  const missionGate = await evaluateStrictBuildGate('build', {
1373
- emit: (input) => spine.appendEvent(input),
1378
+ emit: async (input) => ({ seq: await spine.appendEvent(input) }),
1374
1379
  surface: 'mission',
1375
1380
  // H10-fix1: per-invocation env overlay — never process.env.
1376
1381
  env: strictEnvOverlay(opts),