@smartmemory/stratum 0.4.5 → 0.5.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/flow.js +61 -0
- package/dist/cli/flow.js.map +1 -0
- package/dist/cli/learn.js +9 -16
- package/dist/cli/learn.js.map +1 -1
- package/dist/cli/query_gate.js +7 -2
- package/dist/cli/query_gate.js.map +1 -1
- package/dist/cli/stratum.js +3 -1
- package/dist/cli/stratum.js.map +1 -1
- package/dist/connectors/background.js +2 -2
- package/dist/connectors/background.js.map +1 -1
- package/dist/connectors/claude.js +2 -0
- package/dist/connectors/claude.js.map +1 -1
- package/dist/connectors/codex.js +4 -0
- package/dist/connectors/codex.js.map +1 -1
- package/dist/connectors/foreground_registry.js +589 -0
- package/dist/connectors/foreground_registry.js.map +1 -0
- package/dist/connectors/index.js +1 -0
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/proc_identity.js +28 -0
- package/dist/connectors/proc_identity.js.map +1 -1
- package/dist/connectors/runner.js +2 -0
- package/dist/connectors/runner.js.map +1 -1
- package/dist/contracts/events.json +27 -1
- package/dist/contracts/mcp-surface.json +176 -6
- package/dist/engine/checkpoint.js +1 -1
- package/dist/engine/checkpoint.js.map +1 -1
- package/dist/engine/engine.js +860 -195
- package/dist/engine/engine.js.map +1 -1
- package/dist/engine/flow_cancel.js +158 -0
- package/dist/engine/flow_cancel.js.map +1 -0
- package/dist/engine/run_lock.js +628 -0
- package/dist/engine/run_lock.js.map +1 -0
- package/dist/engine/state.js +43 -2
- package/dist/engine/state.js.map +1 -1
- package/dist/ir/refs.js +12 -0
- package/dist/ir/refs.js.map +1 -1
- package/dist/ir/schema.js +9 -0
- package/dist/ir/schema.js.map +1 -1
- package/dist/ir/validate.js +243 -29
- package/dist/ir/validate.js.map +1 -1
- package/dist/learn/smartmemory_egress.js +3 -1
- package/dist/learn/smartmemory_egress.js.map +1 -1
- package/dist/mcp/server.js +193 -4
- package/dist/mcp/server.js.map +1 -1
- package/package.json +3 -2
package/dist/engine/state.js
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
const RUN_ID_PATTERN = /^[a-zA-Z0-9-]+$/;
|
|
5
|
+
/** One definition of what a run id may be. `StateStore.path` used to inline this regex, and
|
|
6
|
+
* the run lock, the break-lock and the driver lease each build a path from a run id outside
|
|
7
|
+
* it — a fourth copy of the pattern is how one of them ends up admitting a separator (R4-7).
|
|
8
|
+
* Every lock and lease operation calls this BEFORE constructing any path. */
|
|
9
|
+
export function assertRunId(runId) {
|
|
10
|
+
if (typeof runId !== "string" || !RUN_ID_PATTERN.test(runId))
|
|
11
|
+
throw new Error("invalid run id");
|
|
12
|
+
}
|
|
13
|
+
/** Burn every outstanding issuance at the cancel. `cancelRequested` is a CHECKPOINT_FIELD
|
|
14
|
+
* (ts/src/engine/checkpoint.ts), so a later revert could restore `cancelRequested: false`;
|
|
15
|
+
* a burned token is the durable half of the guarantee, because the dispatch fencing and the
|
|
16
|
+
* gate-token check reject a stale issuance regardless of the flag. Pure and synchronous.
|
|
17
|
+
*
|
|
18
|
+
* Returns the audit evidence recorded on the `flow_cancelled` event: the ids of steps whose
|
|
19
|
+
* dispatch/gate token was deleted, and the count of fanout items whose token was deleted. */
|
|
20
|
+
export function burnIssuances(run) {
|
|
21
|
+
const steps = [];
|
|
22
|
+
let items = 0;
|
|
23
|
+
const walk = (states) => {
|
|
24
|
+
for (const [id, state] of Object.entries(states)) {
|
|
25
|
+
if ((state.status === "ready" || state.status === "running") && state.dispatchToken !== undefined) {
|
|
26
|
+
delete state.dispatchToken;
|
|
27
|
+
steps.push(id);
|
|
28
|
+
}
|
|
29
|
+
if (state.status === "waiting_gate" && state.gateToken !== undefined) {
|
|
30
|
+
delete state.gateToken;
|
|
31
|
+
steps.push(id);
|
|
32
|
+
}
|
|
33
|
+
for (const item of state.fanout?.items ?? []) {
|
|
34
|
+
if ((item.status === "ready" || item.status === "running") && item.dispatchToken !== undefined) {
|
|
35
|
+
delete item.dispatchToken;
|
|
36
|
+
items += 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (state.sub)
|
|
40
|
+
walk(state.sub.steps);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
walk(run.steps);
|
|
44
|
+
return { steps, items };
|
|
45
|
+
}
|
|
4
46
|
let temporarySequence = 0;
|
|
5
47
|
export class StateStore {
|
|
6
48
|
root;
|
|
@@ -33,8 +75,7 @@ export class StateStore {
|
|
|
33
75
|
return names.filter((name) => name.endsWith(".json")).sort().map((name) => name.slice(0, -".json".length));
|
|
34
76
|
}
|
|
35
77
|
path(runId) {
|
|
36
|
-
|
|
37
|
-
throw new Error("invalid run id");
|
|
78
|
+
assertRunId(runId);
|
|
38
79
|
return join(this.root, `${runId}.json`);
|
|
39
80
|
}
|
|
40
81
|
}
|
package/dist/engine/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/engine/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/engine/state.ts"],"names":[],"mappings":"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"}
|
package/dist/ir/refs.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export const STEP_ID_PATTERN = /^[a-z][a-z0-9_-]*$/;
|
|
2
2
|
export const PATH_FIELD_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
3
|
+
// A step reference is ALWAYS `<id>.output` followed by end-of-source, `.` or `[`, so only
|
|
4
|
+
// that exact first segment is reserved (R2-6): `${wave.outputValue}` and `${wave.outputs}`
|
|
5
|
+
// stay carry references, `${wave.output.tasks}` does not.
|
|
6
|
+
const STEP_OUTPUT_SEGMENT = /^\.output(?:$|\.|\[)/;
|
|
3
7
|
function parsePath(source) {
|
|
4
8
|
if (source.length === 0)
|
|
5
9
|
return [];
|
|
@@ -36,6 +40,14 @@ export function parseReference(source) {
|
|
|
36
40
|
const path = parsePath(source.slice("input".length));
|
|
37
41
|
return path && path.length > 0 ? { kind: "input", path } : undefined;
|
|
38
42
|
}
|
|
43
|
+
// A carry variable is a bare flow-value name with an optional path. Same charset as
|
|
44
|
+
// STEP_ID_PATTERN (R3-2). Declined only when the remainder is exactly the reserved
|
|
45
|
+
// `.output` segment, which is claimed by the step-reference branch below.
|
|
46
|
+
const carry = /^([a-z][a-z0-9_-]*)(.*)$/.exec(source);
|
|
47
|
+
if (carry?.[1] !== undefined && !STEP_OUTPUT_SEGMENT.test(carry[2] ?? "")) {
|
|
48
|
+
const path = parsePath(carry[2] ?? "");
|
|
49
|
+
return path === undefined ? undefined : { kind: "carry", name: carry[1], path };
|
|
50
|
+
}
|
|
39
51
|
const match = /^([a-z][a-z0-9_-]*)\.output(.*)$/.exec(source);
|
|
40
52
|
if (!match?.[1])
|
|
41
53
|
return undefined;
|
package/dist/ir/refs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/ir/refs.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/ir/refs.ts"],"names":[],"mappings":"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"}
|
package/dist/ir/schema.js
CHANGED
|
@@ -110,6 +110,14 @@ const rejectReservedFields = (value, ctx) => {
|
|
|
110
110
|
};
|
|
111
111
|
export const ContractSchema = z.custom((value) => typeof value === "object" && value !== null && !Array.isArray(value), "contract must be an object").superRefine(rejectReservedFields).pipe(z.record(ContractFieldNameSchema, z.string()));
|
|
112
112
|
export const ContractsSchema = z.record(z.string().regex(PATH_FIELD_PATTERN), ContractSchema);
|
|
113
|
+
// Carry names use StepIdSchema (STEP_ID_PATTERN), not PATH_FIELD_PATTERN (R3-2): the
|
|
114
|
+
// step-reference regex only claims lowercase step-id-shaped names, so a carry name must
|
|
115
|
+
// share that charset for the `${name.output}` reservation (CARRY_PATH_RESERVED) to be total.
|
|
116
|
+
export const CarryVariableSchema = z.object({
|
|
117
|
+
initial: z.string().min(1),
|
|
118
|
+
on_revise: z.record(StepIdSchema, z.string().min(1)).optional(),
|
|
119
|
+
}).strict();
|
|
120
|
+
export const CarrySchema = z.custom((value) => typeof value === "object" && value !== null && !Array.isArray(value), "carry must be an object").superRefine(rejectReservedFields).pipe(z.record(StepIdSchema, CarryVariableSchema));
|
|
113
121
|
export const FlowOutputSchema = z.object({
|
|
114
122
|
from: z.string(),
|
|
115
123
|
contract: z.string(),
|
|
@@ -119,6 +127,7 @@ export const FlowSchema = z.object({
|
|
|
119
127
|
output: FlowOutputSchema,
|
|
120
128
|
budget: BudgetSchema.optional(),
|
|
121
129
|
max_rounds: z.number().int().positive().optional(),
|
|
130
|
+
carry: CarrySchema.optional(),
|
|
122
131
|
steps: z.array(StepSchema),
|
|
123
132
|
}).strict();
|
|
124
133
|
export const FlowMapSchema = z.object({ entry: z.string() }).catchall(FlowSchema);
|
package/dist/ir/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/ir/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/ir/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/ir/validate.js
CHANGED
|
@@ -218,17 +218,23 @@ function leaves(value, path) {
|
|
|
218
218
|
return Object.entries(value).flatMap(([key, item]) => leaves(item, [...path, key]));
|
|
219
219
|
return [];
|
|
220
220
|
}
|
|
221
|
-
function referencesInStep(step, base) {
|
|
221
|
+
export function referencesInStep(step, base) {
|
|
222
222
|
const result = [];
|
|
223
|
-
const add = (value, path, fanoutStage = false) => {
|
|
224
|
-
result.push(...leaves(value, path).map((leaf) => ({ ...leaf, fanoutStage })));
|
|
223
|
+
const add = (value, path, fanoutStage = false, expression = false) => {
|
|
224
|
+
result.push(...leaves(value, path).map((leaf) => ({ ...leaf, fanoutStage, expression })));
|
|
225
225
|
};
|
|
226
226
|
if (step.do !== undefined)
|
|
227
227
|
add(step.do, [...base, "do"]);
|
|
228
228
|
if (step.when !== undefined)
|
|
229
|
-
add(step.when, [...base, "when"]);
|
|
229
|
+
add(step.when, [...base, "when"], false, true);
|
|
230
230
|
if (step.set !== undefined)
|
|
231
|
-
add(step.set, [...base, "set"]);
|
|
231
|
+
add(step.set, [...base, "set"], false, true);
|
|
232
|
+
if (step.iterate?.until !== undefined)
|
|
233
|
+
add(step.iterate.until, [...base, "iterate", "until"], false, true);
|
|
234
|
+
step.ensure?.forEach((predicate, index) => {
|
|
235
|
+
if ("expr" in predicate)
|
|
236
|
+
add(predicate.expr, [...base, "ensure", index, "expr"], false, true);
|
|
237
|
+
});
|
|
232
238
|
if (step.run !== undefined && step.with !== undefined)
|
|
233
239
|
add(step.with, [...base, "with"]);
|
|
234
240
|
if (step.evaluate?.in !== undefined)
|
|
@@ -238,7 +244,11 @@ function referencesInStep(step, base) {
|
|
|
238
244
|
step.fanout.steps.forEach((stage, index) => {
|
|
239
245
|
add(stage.do, [...base, "fanout", "steps", index, "do"], true);
|
|
240
246
|
if (stage.when !== undefined)
|
|
241
|
-
add(stage.when, [...base, "fanout", "steps", index, "when"], true);
|
|
247
|
+
add(stage.when, [...base, "fanout", "steps", index, "when"], true, true);
|
|
248
|
+
stage.ensure?.forEach((predicate, ensureIndex) => {
|
|
249
|
+
if ("expr" in predicate)
|
|
250
|
+
add(predicate.expr, [...base, "fanout", "steps", index, "ensure", ensureIndex, "expr"], true, true);
|
|
251
|
+
});
|
|
242
252
|
});
|
|
243
253
|
}
|
|
244
254
|
return result;
|
|
@@ -290,6 +300,29 @@ function reaches(adjacency, from, target) {
|
|
|
290
300
|
}
|
|
291
301
|
return false;
|
|
292
302
|
}
|
|
303
|
+
/** Mirrors engine.resetFrom's descendant closure (engine.ts:2226-2244): dependency
|
|
304
|
+
* edges PLUS on_fail / gate approve+kill routes. Exported as the parity-test seam;
|
|
305
|
+
* the engine keeps its own walk over live StepState, so the two must be pinned
|
|
306
|
+
* against each other (T-S01-14). */
|
|
307
|
+
export function resetClosure(flow, target) {
|
|
308
|
+
const descendants = new Set([target]);
|
|
309
|
+
let grew = true;
|
|
310
|
+
while (grew) {
|
|
311
|
+
grew = false;
|
|
312
|
+
for (const step of flow.steps) {
|
|
313
|
+
if (descendants.has(step.id))
|
|
314
|
+
continue;
|
|
315
|
+
const viaDependency = [...dependencyIds(step)].some((dependency) => descendants.has(dependency));
|
|
316
|
+
const viaRoute = flow.steps.some((router) => descendants.has(router.id)
|
|
317
|
+
&& (router.on_fail === step.id || router.gate?.on_approve === step.id || router.gate?.on_kill === step.id));
|
|
318
|
+
if (viaDependency || viaRoute) {
|
|
319
|
+
descendants.add(step.id);
|
|
320
|
+
grew = true;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return descendants;
|
|
325
|
+
}
|
|
293
326
|
function flowEntries(spec) {
|
|
294
327
|
return Object.entries(spec.flows).filter(([name]) => name !== "entry");
|
|
295
328
|
}
|
|
@@ -368,6 +401,10 @@ export function validateSpec(input) {
|
|
|
368
401
|
return { ok: false, errors: [{ code: "CONTRACT_UNKNOWN_REF", path: `flows.${flowName}.steps[${index}].out`, message: "unknown output contract" }] };
|
|
369
402
|
}
|
|
370
403
|
const adjacency = new Map();
|
|
404
|
+
// Dependency-only forward graph: `after` plus step-output refs, NO routing edges.
|
|
405
|
+
// Only these edges guarantee execution, which is what carry ordering needs (R1-4).
|
|
406
|
+
const dependencyEdges = new Map();
|
|
407
|
+
const carryUses = [];
|
|
371
408
|
const add = (edge) => {
|
|
372
409
|
if (!ids.has(edge.from))
|
|
373
410
|
return { code: "ROUTING_UNKNOWN_TARGET", path: edge.path, message: `unknown step ${edge.from}` };
|
|
@@ -375,6 +412,43 @@ export function validateSpec(input) {
|
|
|
375
412
|
return { code: "ROUTING_UNKNOWN_TARGET", path: edge.path, message: `unknown step ${edge.to}` };
|
|
376
413
|
return addEdge(adjacency, edge);
|
|
377
414
|
};
|
|
415
|
+
/** Every type rule an ordinary `${}` reference obeys, shared by the per-step loop
|
|
416
|
+
* and the carry pass (R1-3). Returns undefined when the reference is well typed.
|
|
417
|
+
* Edge creation stays at the call site — carry creates no edges. */
|
|
418
|
+
const referenceTypeError = (reference, path) => {
|
|
419
|
+
if (reference.kind === "input" && !containsPathInFields(inputFields, reference.path, parsed)) {
|
|
420
|
+
return { code: "REF_UNKNOWN_PATH", path, message: "unknown input path" };
|
|
421
|
+
}
|
|
422
|
+
if (reference.kind !== "step")
|
|
423
|
+
return undefined;
|
|
424
|
+
const source = ids.get(reference.stepId);
|
|
425
|
+
// A step id that is a declared carry name can only be the reserved `${name.output…}`
|
|
426
|
+
// spelling (CARRY_NAME_CONFLICT already forbids a real collision) — R1-8. This arm is
|
|
427
|
+
// total only because carry names share the step-id charset (R3-2): every legal carry
|
|
428
|
+
// name is a legal step id, so the step regex always claims the reserved spelling.
|
|
429
|
+
if (!source && Object.hasOwn(flow.carry ?? {}, reference.stepId)) {
|
|
430
|
+
return { code: "CARRY_PATH_RESERVED", path, message: `carry paths may not begin with "output"; ${reference.stepId}.output reads as a step reference` };
|
|
431
|
+
}
|
|
432
|
+
if (!source)
|
|
433
|
+
return { code: "REF_UNKNOWN_STEP", path, message: `unknown step ${reference.stepId}` };
|
|
434
|
+
if (source.step.fanout !== undefined && !source.step.fanout.steps.at(-1)?.out) {
|
|
435
|
+
return { code: "FANOUT_OUTPUT_REQUIRES_FINAL_OUT", path: `flows.${flowName}.steps[${source.index}].fanout.steps[${source.step.fanout.steps.length - 1}].out`, message: "fanout output requires final stage out" };
|
|
436
|
+
}
|
|
437
|
+
const sourceContract = contractForStep(source.step, flows);
|
|
438
|
+
if (!sourceContract)
|
|
439
|
+
return { code: "REF_OUTPUT_CONTRACT_REQUIRED", path, message: "referenced output requires an out contract" };
|
|
440
|
+
if (source.step.fanout !== undefined) {
|
|
441
|
+
const [head, ...rest] = reference.path;
|
|
442
|
+
if (reference.path.length > 0 && (typeof head !== "number" || !containsPathInContract(sourceContract, rest, parsed))) {
|
|
443
|
+
return { code: "REF_UNKNOWN_PATH", path, message: "fanout output is an array — index it before accessing fields" };
|
|
444
|
+
}
|
|
445
|
+
return undefined;
|
|
446
|
+
}
|
|
447
|
+
if (!containsPathInContract(sourceContract, reference.path, parsed)) {
|
|
448
|
+
return { code: "REF_UNKNOWN_PATH", path, message: "unknown output path" };
|
|
449
|
+
}
|
|
450
|
+
return undefined;
|
|
451
|
+
};
|
|
378
452
|
for (const [index, step] of flow.steps.entries()) {
|
|
379
453
|
const base = ["flows", flowName, "steps", index];
|
|
380
454
|
for (const [afterIndex, source] of (step.after ?? []).entries()) {
|
|
@@ -387,6 +461,12 @@ export function validateSpec(input) {
|
|
|
387
461
|
if (error)
|
|
388
462
|
return { ok: false, errors: [error] };
|
|
389
463
|
}
|
|
464
|
+
if (step.fanout !== undefined) {
|
|
465
|
+
const overRefs = extractReferences(step.fanout.over);
|
|
466
|
+
if (!overRefs || overRefs.length !== 1 || !overRefs[0].fullValue) {
|
|
467
|
+
return { ok: false, errors: [{ code: "FANOUT_OVER_SINGLE_REF", path: formatPath([...base, "fanout", "over"]), message: "fanout over must be one full reference" }] };
|
|
468
|
+
}
|
|
469
|
+
}
|
|
390
470
|
for (const leaf of referencesInStep(step, base)) {
|
|
391
471
|
const extracted = extractReferences(leaf.value);
|
|
392
472
|
if (!extracted)
|
|
@@ -396,31 +476,20 @@ export function validateSpec(input) {
|
|
|
396
476
|
if ((reference.kind === "item" || reference.kind === "prev") && !leaf.fanoutStage) {
|
|
397
477
|
return { ok: false, errors: [{ code: "REF_INVALID_SCOPE", path: leaf.path, message: `${reference.kind} is only available in fanout stages` }] };
|
|
398
478
|
}
|
|
399
|
-
if (reference.kind === "
|
|
400
|
-
|
|
479
|
+
if (reference.kind === "carry") {
|
|
480
|
+
// Carry is resolved by `resolve()` during template rendering. It is NOT a
|
|
481
|
+
// binding in the `expr` language, whose identifier set is closed at
|
|
482
|
+
// eval/expr.ts:5,22 to result|input|item|prev — so it is illegal on any
|
|
483
|
+
// expression-language field (R1-5).
|
|
484
|
+
if (leaf.expression) {
|
|
485
|
+
return { ok: false, errors: [{ code: "CARRY_REF_IN_EXPRESSION", path: leaf.path, message: "carry references are not available in expressions" }] };
|
|
486
|
+
}
|
|
487
|
+
carryUses.push({ name: reference.name, stepId: step.id, path: leaf.path });
|
|
401
488
|
}
|
|
489
|
+
const typeError = referenceTypeError(reference, leaf.path);
|
|
490
|
+
if (typeError)
|
|
491
|
+
return { ok: false, errors: [typeError] };
|
|
402
492
|
if (reference.kind === "step") {
|
|
403
|
-
const source = ids.get(reference.stepId);
|
|
404
|
-
if (!source)
|
|
405
|
-
return { ok: false, errors: [{ code: "REF_UNKNOWN_STEP", path: leaf.path, message: `unknown step ${reference.stepId}` }] };
|
|
406
|
-
if (source.step.fanout !== undefined && !source.step.fanout.steps.at(-1)?.out) {
|
|
407
|
-
return { ok: false, errors: [{ code: "FANOUT_OUTPUT_REQUIRES_FINAL_OUT", path: `flows.${flowName}.steps[${source.index}].fanout.steps[${source.step.fanout.steps.length - 1}].out`, message: "fanout output requires final stage out" }] };
|
|
408
|
-
}
|
|
409
|
-
const sourceContract = contractForStep(source.step, flows);
|
|
410
|
-
if (!sourceContract)
|
|
411
|
-
return { ok: false, errors: [{ code: "REF_OUTPUT_CONTRACT_REQUIRED", path: leaf.path, message: "referenced output requires an out contract" }] };
|
|
412
|
-
if (source.step.fanout !== undefined) {
|
|
413
|
-
// A fanout's output is the ARRAY of per-item final-stage outputs:
|
|
414
|
-
// `${fan.output}` is the array itself, `${fan.output[0].field}`
|
|
415
|
-
// indexes an element — a bare field path is a type error.
|
|
416
|
-
const [head, ...rest] = reference.path;
|
|
417
|
-
if (reference.path.length > 0 && (typeof head !== "number" || !containsPathInContract(sourceContract, rest, parsed))) {
|
|
418
|
-
return { ok: false, errors: [{ code: "REF_UNKNOWN_PATH", path: leaf.path, message: "fanout output is an array — index it before accessing fields" }] };
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
else if (!containsPathInContract(sourceContract, reference.path, parsed)) {
|
|
422
|
-
return { ok: false, errors: [{ code: "REF_UNKNOWN_PATH", path: leaf.path, message: "unknown output path" }] };
|
|
423
|
-
}
|
|
424
493
|
for (const refEdge of referenceEdges(step.id, [extractedReference])) {
|
|
425
494
|
const error = add({ ...refEdge, path: leaf.path });
|
|
426
495
|
if (error)
|
|
@@ -491,6 +560,151 @@ export function validateSpec(input) {
|
|
|
491
560
|
}] };
|
|
492
561
|
}
|
|
493
562
|
}
|
|
563
|
+
for (const step of flow.steps) {
|
|
564
|
+
for (const dependency of dependencyIds(step)) {
|
|
565
|
+
if (!dependencyEdges.has(dependency))
|
|
566
|
+
dependencyEdges.set(dependency, new Set());
|
|
567
|
+
dependencyEdges.get(dependency).add(step.id);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
const reachesByDependency = (from, target) => {
|
|
571
|
+
const queue = [from];
|
|
572
|
+
const seen = new Set(queue);
|
|
573
|
+
while (queue.length > 0) {
|
|
574
|
+
const current = queue.shift();
|
|
575
|
+
if (current === target)
|
|
576
|
+
return true;
|
|
577
|
+
for (const next of dependencyEdges.get(current) ?? [])
|
|
578
|
+
if (!seen.has(next)) {
|
|
579
|
+
seen.add(next);
|
|
580
|
+
queue.push(next);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
return false;
|
|
584
|
+
};
|
|
585
|
+
// --- STRAT-LOOP-CARRY ---------------------------------------------------
|
|
586
|
+
// Carry is root-only (D5) and adds NO dependency edge, so ordering and reset
|
|
587
|
+
// coverage are both proved statically here rather than discovered at runtime.
|
|
588
|
+
const carry = flow.carry ?? {};
|
|
589
|
+
const carryNames = new Set(Object.keys(carry)); // never `name in carry` — R1-11
|
|
590
|
+
const carryPath = `flows.${flowName}.carry`;
|
|
591
|
+
// Same construction the consumer-worktree rule uses at validate.ts:456-462; built once
|
|
592
|
+
// here because the carry pass needs it too (R2-2).
|
|
593
|
+
const routedTargets = new Set();
|
|
594
|
+
for (const candidate of flow.steps) {
|
|
595
|
+
if (candidate.on_fail !== undefined)
|
|
596
|
+
routedTargets.add(candidate.on_fail);
|
|
597
|
+
if (candidate.gate?.on_approve)
|
|
598
|
+
routedTargets.add(candidate.gate.on_approve);
|
|
599
|
+
if (candidate.gate?.on_kill)
|
|
600
|
+
routedTargets.add(candidate.gate.on_kill);
|
|
601
|
+
}
|
|
602
|
+
if (flow.carry !== undefined && flowName !== spec.flows.entry) {
|
|
603
|
+
return { ok: false, errors: [{ code: "CARRY_ROOT_ONLY", path: carryPath, message: "carry may only be declared on the entry flow" }] };
|
|
604
|
+
}
|
|
605
|
+
// Exactly one full-value ${} reference of kind step|input (D2). Shape only — typing is a
|
|
606
|
+
// separate step so the carry-specific rules can be reported before the generic ones (F1).
|
|
607
|
+
const carryShape = (value, path) => {
|
|
608
|
+
const extracted = extractReferences(value);
|
|
609
|
+
if (!extracted || extracted.length !== 1 || !extracted[0].fullValue) {
|
|
610
|
+
return { code: "CARRY_REF_INVALID", path, message: "carry value must be one full reference" };
|
|
611
|
+
}
|
|
612
|
+
const reference = extracted[0].reference;
|
|
613
|
+
if (reference.kind !== "step" && reference.kind !== "input") {
|
|
614
|
+
return { code: "CARRY_REF_INVALID", path, message: "carry value must reference a step output or a flow input" };
|
|
615
|
+
}
|
|
616
|
+
return reference;
|
|
617
|
+
};
|
|
618
|
+
// Shape plus the same type rules an ordinary reference obeys (R1-3).
|
|
619
|
+
const carryReference = (value, path) => {
|
|
620
|
+
const reference = carryShape(value, path);
|
|
621
|
+
if ("code" in reference)
|
|
622
|
+
return reference;
|
|
623
|
+
return referenceTypeError(reference, path) ?? reference;
|
|
624
|
+
};
|
|
625
|
+
const carrySources = new Map(); // name -> initial source step id
|
|
626
|
+
for (const [name, declaration] of Object.entries(carry)) {
|
|
627
|
+
if (name === "item" || name === "prev" || name === "input" || ids.has(name)) {
|
|
628
|
+
return { ok: false, errors: [{ code: "CARRY_NAME_CONFLICT", path: `${carryPath}.${name}`, message: "carry name is reserved or collides with a step id" }] };
|
|
629
|
+
}
|
|
630
|
+
const initialPath = `${carryPath}.${name}.initial`;
|
|
631
|
+
const initial = carryShape(declaration.initial, initialPath);
|
|
632
|
+
if ("code" in initial)
|
|
633
|
+
return { ok: false, errors: [initial] };
|
|
634
|
+
if (initial.kind === "step" && ids.has(initial.stepId)) {
|
|
635
|
+
// The initial source must be UNCONDITIONAL. Three ways a step can fail to run:
|
|
636
|
+
// - a `when` can skip it (engine advanceScopeLoop);
|
|
637
|
+
// - a gate step never produces an output;
|
|
638
|
+
// - a ROUTING target is inactive until routed (engine.isActivated, engine.ts:2217-2221)
|
|
639
|
+
// and can be skipped outright (unreachableOnFailTarget, :2210-2215) — and a skipped
|
|
640
|
+
// dependency satisfies its edge (dependenciesDone, :2287-2293), so ordering alone
|
|
641
|
+
// would not save it. R2-2.
|
|
642
|
+
const source = ids.get(initial.stepId).step;
|
|
643
|
+
if (source.when !== undefined || source.gate !== undefined || routedTargets.has(initial.stepId)) {
|
|
644
|
+
return { ok: false, errors: [{ code: "CARRY_INITIAL_SOURCE_CONDITIONAL", path: initialPath, message: "carry initial source must be an unconditional, non-gate, non-routed step" }] };
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// Typing runs LAST: an unknown step, a missing out contract or a bad path are all
|
|
648
|
+
// reported here, after the carry-specific conditional-source rule has had its say.
|
|
649
|
+
const typeError = referenceTypeError(initial, initialPath);
|
|
650
|
+
if (typeError)
|
|
651
|
+
return { ok: false, errors: [typeError] };
|
|
652
|
+
carrySources.set(name, initial.kind === "step" ? initial.stepId : undefined);
|
|
653
|
+
}
|
|
654
|
+
// Reference-side rules. carryUses was collected by the per-step loop (S01-6).
|
|
655
|
+
for (const use of carryUses) {
|
|
656
|
+
if (!carryNames.has(use.name)) {
|
|
657
|
+
return { ok: false, errors: [{ code: "REF_UNKNOWN_CARRY", path: use.path, message: `unknown carry variable ${use.name}` }] };
|
|
658
|
+
}
|
|
659
|
+
const source = carrySources.get(use.name);
|
|
660
|
+
if (source === undefined)
|
|
661
|
+
continue; // input-sourced: available from step zero
|
|
662
|
+
if (source === use.stepId || !reachesByDependency(source, use.stepId)) {
|
|
663
|
+
return { ok: false, errors: [{ code: "CARRY_REF_BEFORE_INITIAL", path: use.path, message: `carry ${use.name} is not guaranteed materialised before ${use.stepId}` }] };
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
// on_revise coverage (R1-1). A gate that rewrites a variable must also reset every
|
|
667
|
+
// consumer of it, and must itself run after every consumer, or a step would keep a
|
|
668
|
+
// rendering derived from a list that has just changed.
|
|
669
|
+
for (const [name, declaration] of Object.entries(carry)) {
|
|
670
|
+
const consumers = carryUses.filter((use) => use.name === name).map((use) => use.stepId);
|
|
671
|
+
for (const [gateId, expression] of Object.entries(declaration.on_revise ?? {})) {
|
|
672
|
+
const gatePath = `${carryPath}.${name}.on_revise.${gateId}`;
|
|
673
|
+
const gateStep = ids.get(gateId)?.step;
|
|
674
|
+
if (gateStep?.gate === undefined) {
|
|
675
|
+
return { ok: false, errors: [{ code: "CARRY_UNKNOWN_GATE", path: gatePath, message: "on_revise key must be a gate step in this flow" }] };
|
|
676
|
+
}
|
|
677
|
+
const revise = carryReference(expression, gatePath);
|
|
678
|
+
if ("code" in revise)
|
|
679
|
+
return { ok: false, errors: [revise] };
|
|
680
|
+
const target = gateStep.gate.on_revise;
|
|
681
|
+
if (target === null) {
|
|
682
|
+
return { ok: false, errors: [{ code: "CARRY_REVISE_TARGET_NULL", path: gatePath, message: "a gate that rewrites carry must have a revise target" }] };
|
|
683
|
+
}
|
|
684
|
+
// The target must be a real, non-self step BEFORE the closure is computed: running
|
|
685
|
+
// resetClosure over an invalid target yields a closure that misses every consumer,
|
|
686
|
+
// and CARRY_REVISE_MISSES_CONSUMER would mask the routing defect (F2). Same codes
|
|
687
|
+
// and path the later reviseGates pass uses.
|
|
688
|
+
const gateReviseIndex = ids.get(gateId).index;
|
|
689
|
+
const gateRevisePath = `flows.${flowName}.steps[${gateReviseIndex}].gate.on_revise`;
|
|
690
|
+
if (!ids.has(target)) {
|
|
691
|
+
return { ok: false, errors: [{ code: "ROUTING_UNKNOWN_TARGET", path: gateRevisePath, message: "unknown revise target" }] };
|
|
692
|
+
}
|
|
693
|
+
if (target === gateId) {
|
|
694
|
+
return { ok: false, errors: [{ code: "ROUTING_SELF_TARGET", path: gateRevisePath, message: "routing edge targets itself" }] };
|
|
695
|
+
}
|
|
696
|
+
const closure = resetClosure(flow, target);
|
|
697
|
+
for (const consumer of consumers) {
|
|
698
|
+
if (!closure.has(consumer)) {
|
|
699
|
+
return { ok: false, errors: [{ code: "CARRY_REVISE_MISSES_CONSUMER", path: gatePath, message: `revise target ${target} does not reset ${consumer}, which reads ${name}` }] };
|
|
700
|
+
}
|
|
701
|
+
if (consumer !== gateId && !reachesByDependency(consumer, gateId)) {
|
|
702
|
+
return { ok: false, errors: [{ code: "CARRY_REVISE_GATE_NOT_AFTER_CONSUMER", path: gatePath, message: `gate ${gateId} is not ordered after ${consumer}, which reads ${name}` }] };
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
// --- end STRAT-LOOP-CARRY -----------------------------------------------
|
|
494
708
|
const reviseGates = flow.steps.flatMap((step, index) => step.gate?.on_revise ? [{ step, index, target: step.gate.on_revise }] : []);
|
|
495
709
|
if (reviseGates.length > 0 && flow.max_rounds === undefined) {
|
|
496
710
|
const revise = reviseGates[0];
|