@smartmemory/stratum 0.3.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 (81) hide show
  1. package/dist/cli/guard.js +91 -0
  2. package/dist/cli/guard.js.map +1 -0
  3. package/dist/cli/mcp_install.js +302 -0
  4. package/dist/cli/mcp_install.js.map +1 -0
  5. package/dist/cli/query_gate.js +316 -0
  6. package/dist/cli/query_gate.js.map +1 -0
  7. package/dist/cli/stratum.js +291 -0
  8. package/dist/cli/stratum.js.map +1 -0
  9. package/dist/connectors/background.js +531 -0
  10. package/dist/connectors/background.js.map +1 -0
  11. package/dist/connectors/base.js +12 -0
  12. package/dist/connectors/base.js.map +1 -0
  13. package/dist/connectors/claude-bg-worker.js +99 -0
  14. package/dist/connectors/claude-bg-worker.js.map +1 -0
  15. package/dist/connectors/claude.js +170 -0
  16. package/dist/connectors/claude.js.map +1 -0
  17. package/dist/connectors/codex.js +319 -0
  18. package/dist/connectors/codex.js.map +1 -0
  19. package/dist/connectors/index.js +7 -0
  20. package/dist/connectors/index.js.map +1 -0
  21. package/dist/connectors/proc_identity.js +90 -0
  22. package/dist/connectors/proc_identity.js.map +1 -0
  23. package/dist/connectors/runner.js +63 -0
  24. package/dist/connectors/runner.js.map +1 -0
  25. package/dist/contracts/events.json +65 -0
  26. package/dist/contracts/mcp-surface.json +215 -0
  27. package/dist/engine/checkpoint.js +50 -0
  28. package/dist/engine/checkpoint.js.map +1 -0
  29. package/dist/engine/engine.js +2356 -0
  30. package/dist/engine/engine.js.map +1 -0
  31. package/dist/engine/ledger.js +36 -0
  32. package/dist/engine/ledger.js.map +1 -0
  33. package/dist/engine/state.js +42 -0
  34. package/dist/engine/state.js.map +1 -0
  35. package/dist/eval/expr.js +679 -0
  36. package/dist/eval/expr.js.map +1 -0
  37. package/dist/eval/files.js +130 -0
  38. package/dist/eval/files.js.map +1 -0
  39. package/dist/guard/canonical.js +116 -0
  40. package/dist/guard/canonical.js.map +1 -0
  41. package/dist/guard/errors.js +80 -0
  42. package/dist/guard/errors.js.map +1 -0
  43. package/dist/guard/evidence.js +475 -0
  44. package/dist/guard/evidence.js.map +1 -0
  45. package/dist/guard/fingerprint.js +13 -0
  46. package/dist/guard/fingerprint.js.map +1 -0
  47. package/dist/guard/lock.js +360 -0
  48. package/dist/guard/lock.js.map +1 -0
  49. package/dist/guard/store.js +396 -0
  50. package/dist/guard/store.js.map +1 -0
  51. package/dist/guard/transition.js +477 -0
  52. package/dist/guard/transition.js.map +1 -0
  53. package/dist/ir/refs.js +69 -0
  54. package/dist/ir/refs.js.map +1 -0
  55. package/dist/ir/schema.js +123 -0
  56. package/dist/ir/schema.js.map +1 -0
  57. package/dist/ir/validate.js +595 -0
  58. package/dist/ir/validate.js.map +1 -0
  59. package/dist/judge/codex_judged.js +85 -0
  60. package/dist/judge/codex_judged.js.map +1 -0
  61. package/dist/judge/fixture_judged.js +62 -0
  62. package/dist/judge/fixture_judged.js.map +1 -0
  63. package/dist/judge/judged.js +89 -0
  64. package/dist/judge/judged.js.map +1 -0
  65. package/dist/judge/pricing.js +22 -0
  66. package/dist/judge/pricing.js.map +1 -0
  67. package/dist/mcp/contracts.js +162 -0
  68. package/dist/mcp/contracts.js.map +1 -0
  69. package/dist/mcp/main.js +7 -0
  70. package/dist/mcp/main.js.map +1 -0
  71. package/dist/mcp/server.js +370 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/migrate/check.js +164 -0
  74. package/dist/migrate/check.js.map +1 -0
  75. package/dist/parallel/certificate.js +37 -0
  76. package/dist/parallel/certificate.js.map +1 -0
  77. package/dist/parallel/evaluate.js +73 -0
  78. package/dist/parallel/evaluate.js.map +1 -0
  79. package/dist/speckit/compiler.js +162 -0
  80. package/dist/speckit/compiler.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1,370 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from "@modelcontextprotocol/sdk/types.js";
4
+ import { randomUUID } from "node:crypto";
5
+ import { readFileSync } from "node:fs";
6
+ import { stat } from "node:fs/promises";
7
+ import { cancelBackgroundRun, pollBackgroundRun, runAgent } from "../connectors/index.js";
8
+ import { CheckpointOperationError, SpecValidationError, StratumEngine } from "../engine/engine.js";
9
+ import { createEvaluator } from "../eval/expr.js";
10
+ import { validateSpec } from "../ir/validate.js";
11
+ import { evaluateJudgedViaCodex } from "../judge/codex_judged.js";
12
+ import { createFixtureJudge } from "../judge/fixture_judged.js";
13
+ import { evaluateJudged } from "../judge/judged.js";
14
+ import { compileSpeckit, SpeckitCompileError } from "../speckit/compiler.js";
15
+ import { assertEvent, assertShape, assertToolRequest, assertToolResponse, mcpSurface, validateShape } from "./contracts.js";
16
+ // Single source of truth for the MCP serverInfo version: the package manifest.
17
+ // `../../package.json` resolves to the package root in both the dev tree
18
+ // (src/mcp/) and the published tree (dist/mcp/), since npm always ships
19
+ // package.json at the package root.
20
+ const SERVER_VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
21
+ /**
22
+ * Judged-ensure backend: explicit via STRATUM_JUDGE_BACKEND, otherwise keyed
23
+ * to the environment — the OpenAI-API judge can never succeed without
24
+ * OPENAI_API_KEY, so a keyless host routes through the codex connector
25
+ * (OAuth), matching the Python judge kernel. Tests can explicitly select the
26
+ * guarded fixture backend; unknown values fail loudly.
27
+ */
28
+ export function judgeBackend(env = process.env) {
29
+ const explicit = env.STRATUM_JUDGE_BACKEND;
30
+ if (explicit === "openai" || explicit === "codex")
31
+ return explicit;
32
+ if (explicit === "fixture") {
33
+ if (env.NODE_ENV !== "test")
34
+ throw new Error('STRATUM_JUDGE_BACKEND="fixture" is only allowed when NODE_ENV="test"');
35
+ return explicit;
36
+ }
37
+ if (explicit !== undefined)
38
+ throw new Error(`STRATUM_JUDGE_BACKEND must be "openai", "codex", or "fixture", got ${JSON.stringify(explicit)}`);
39
+ return env.OPENAI_API_KEY ? "openai" : "codex";
40
+ }
41
+ function defaultEngine() {
42
+ const backend = judgeBackend();
43
+ const judge = backend === "openai"
44
+ ? (predicate, context) => evaluateJudged(predicate, context)
45
+ : backend === "codex"
46
+ ? (predicate, context) => evaluateJudgedViaCodex(predicate, context)
47
+ : createFixtureJudge();
48
+ return new StratumEngine({
49
+ ...(process.env.STRATUM_STATE_ROOT ? { stateRoot: process.env.STRATUM_STATE_ROOT } : {}),
50
+ evaluator: createEvaluator(),
51
+ judge,
52
+ });
53
+ }
54
+ export function createToolDispatcher(dependencies = {}) {
55
+ const engine = dependencies.engine ?? defaultEngine();
56
+ const agentRun = dependencies.runAgent ?? runAgent;
57
+ const agentPoll = dependencies.pollBackgroundRun ?? pollBackgroundRun;
58
+ const agentCancel = dependencies.cancelBackgroundRun ?? cancelBackgroundRun;
59
+ return {
60
+ async call(tool, request, context = {}) {
61
+ try {
62
+ await assertToolRequest(tool, request);
63
+ let response;
64
+ switch (tool) {
65
+ case "stratum_compile_speckit": {
66
+ const tasksDir = string(request, "tasks_dir");
67
+ const flowName = optionalString(request, "flow_name") ?? "tasks";
68
+ try {
69
+ if (!(await stat(tasksDir)).isDirectory()) {
70
+ response = { status: "error", error_type: "directory_not_found", message: `tasks_dir '${tasksDir}' is not a directory` };
71
+ break;
72
+ }
73
+ }
74
+ catch {
75
+ response = { status: "error", error_type: "directory_not_found", message: `tasks_dir '${tasksDir}' is not a directory` };
76
+ break;
77
+ }
78
+ try {
79
+ const compiled = await compileSpeckit(tasksDir, flowName);
80
+ response = { status: "ok", yaml: compiled.yaml, flow_name: compiled.flowName, steps: compiled.steps };
81
+ }
82
+ catch (error) {
83
+ response = speckitErrorEnvelope(error);
84
+ }
85
+ break;
86
+ }
87
+ case "stratum_validate": {
88
+ const validation = validateSpec(request.spec);
89
+ response = validation.ok ? { status: "valid" } : { status: "invalid", errors: validation.errors };
90
+ break;
91
+ }
92
+ case "stratum_plan":
93
+ response = await engine.plan(request.spec, request.input, option(request, "workspaceRoot"));
94
+ break;
95
+ case "stratum_step_done":
96
+ response = await engine.stepDone(string(request, "runId"), string(request, "stepId"), record(request, "result"), string(request, "dispatchToken"));
97
+ break;
98
+ case "stratum_commit":
99
+ response = { ...await engine.commit(string(request, "flow_id"), string(request, "label")) };
100
+ break;
101
+ case "stratum_revert":
102
+ response = await engine.revert(string(request, "flow_id"), string(request, "label"));
103
+ break;
104
+ case "stratum_resume":
105
+ response = await engine.resume(string(request, "runId"));
106
+ break;
107
+ case "stratum_audit":
108
+ response = auditResponse(await engine.audit(string(request, "runId")));
109
+ break;
110
+ case "stratum_gate_resolve":
111
+ response = await engine.gateResolve(string(request, "runId"), string(request, "stepId"), string(request, "decision"), string(request, "gateToken"));
112
+ break;
113
+ case "stratum_flow_poll":
114
+ response = flowPollResponse(await engine.flowPoll(string(request, "runId"), optionalNumber(request, "cursor")));
115
+ break;
116
+ case "stratum_flow_run_bg":
117
+ response = await engine.flowRunBg(request.spec, request.input, option(request, "workspaceRoot"));
118
+ break;
119
+ case "stratum_flow_bg_poll":
120
+ response = bgFlowPollResponse(await engine.flowBgPoll(string(request, "runId"), optionalNumber(request, "cursor")));
121
+ break;
122
+ case "stratum_flow_cancel_bg":
123
+ response = await engine.flowCancelBg(string(request, "runId"));
124
+ break;
125
+ case "stratum_agent_run": {
126
+ const model = optionalString(request, "model");
127
+ const sandboxMode = optionalString(request, "sandboxMode");
128
+ // assertToolRequest (line 72) has already validated allowedTools/disallowedTools
129
+ // element types via {"$array":"string"} in the contract — optionalArray() is safe.
130
+ // Check Array.isArray() first to distinguish "not provided" from "provided as []".
131
+ const allowedTools = Array.isArray(request.allowedTools)
132
+ ? optionalArray(request, "allowedTools")
133
+ : undefined;
134
+ const disallowedTools = Array.isArray(request.disallowedTools)
135
+ ? optionalArray(request, "disallowedTools")
136
+ : undefined;
137
+ const executed = await agentRun({
138
+ agent: string(request, "agent"),
139
+ prompt: string(request, "prompt"),
140
+ cwd: string(request, "cwd"),
141
+ // Presence-based forwarding, NOT truthiness: sandboxMode:"" must reach
142
+ // runner/background discriminant validation and be rejected there — a
143
+ // truthy check silently drops it and the run falls back to the default
144
+ // (workspace-write for claude bg), bypassing the caller's intent.
145
+ ...(model !== undefined ? { model } : {}),
146
+ ...(sandboxMode !== undefined ? { sandboxMode: sandboxMode } : {}),
147
+ ...(typeof request.background === "boolean" ? { background: request.background } : {}),
148
+ ...(allowedTools !== undefined ? { allowedTools } : {}),
149
+ ...(disallowedTools !== undefined ? { disallowedTools } : {}),
150
+ ...(context.onAgentEvent !== undefined ? { onEvent: context.onAgentEvent } : {}),
151
+ });
152
+ response = "status" in executed ? { ...executed } : { status: "complete", ...executed };
153
+ break;
154
+ }
155
+ case "stratum_agent_poll":
156
+ response = await agentPoll(string(request, "runId"));
157
+ break;
158
+ case "stratum_cancel_agent_run":
159
+ response = await agentCancel(string(request, "runId"));
160
+ break;
161
+ case "stratum_guard_register": {
162
+ const { registerGuard } = await import("../guard/transition.js");
163
+ response = await registerGuard(string(request, "resource_id"), record(request, "graph"), record(request, "edge_predicates"), string(request, "initial"), optionalArray(request, "terminal"), optionalRecord(request, "stakes"), optionalString(request, "workspace_root") ?? null);
164
+ break;
165
+ }
166
+ case "stratum_guard_transition": {
167
+ const { guardTransition } = await import("../guard/transition.js");
168
+ response = await guardTransition(string(request, "resource_id"), string(request, "from_state"), string(request, "to_state"), {
169
+ artifacts: record(request, "artifacts"), modifiedFiles: optionalArray(request, "modified_files"), idempotencyKey: optionalString(request, "idempotency_key") ?? null, resolvedBy: optionalString(request, "resolved_by") ?? "agent",
170
+ ...(dependencies.guardJudge !== undefined ? { judge: dependencies.guardJudge } : {}),
171
+ });
172
+ break;
173
+ }
174
+ case "stratum_guard_override": {
175
+ const { guardOverride } = await import("../guard/transition.js");
176
+ response = await guardOverride(string(request, "resource_id"), string(request, "from_state"), string(request, "to_state"), string(request, "override_token"), string(request, "rationale"), optionalString(request, "resolved_by") ?? "human");
177
+ break;
178
+ }
179
+ case "stratum_guard_migrate": {
180
+ const { guardMigrate } = await import("../guard/transition.js");
181
+ response = await guardMigrate(string(request, "resource_id"), record(request, "new_graph"), record(request, "new_edge_predicates"), string(request, "override_token"), string(request, "rationale"), optionalArray(request, "new_terminal"), optionalRecord(request, "new_stakes"));
182
+ break;
183
+ }
184
+ case "stratum_guard_history": {
185
+ const { guardHistory } = await import("../guard/transition.js");
186
+ response = guardHistory(string(request, "resource_id"));
187
+ break;
188
+ }
189
+ }
190
+ if ((tool === "stratum_audit" || tool === "stratum_flow_poll" || tool === "stratum_flow_bg_poll") && Array.isArray(response.events)) {
191
+ for (const event of response.events)
192
+ await assertEvent(event);
193
+ }
194
+ await assertToolResponse(tool, response);
195
+ return response;
196
+ }
197
+ catch (error) {
198
+ if (tool === "stratum_flow_run_bg" && error instanceof SpecValidationError
199
+ && error.errors.some((entry) => entry.code === "consumer_dispatch_bg_unsupported")) {
200
+ const code = "consumer_dispatch_bg_unsupported";
201
+ const data = { code, errors: error.errors };
202
+ const declaration = (await mcpSurface()).errors[code];
203
+ if (!declaration)
204
+ throw new Error(`MCP error registry is missing ${code}`);
205
+ assertShape(data, declaration.data, `errors.${code}.data`);
206
+ throw new McpError(ErrorCode.InvalidParams, error.message, data);
207
+ }
208
+ if ((tool === "stratum_commit" || tool === "stratum_revert") && error instanceof CheckpointOperationError) {
209
+ const response = checkpointErrorEnvelope(error);
210
+ await assertToolResponse(tool, response);
211
+ return response;
212
+ }
213
+ if (!tool.startsWith("stratum_guard_"))
214
+ throw error;
215
+ const response = guardErrorEnvelope(error);
216
+ await assertToolResponse(tool, response);
217
+ return response;
218
+ }
219
+ },
220
+ };
221
+ }
222
+ export async function createMcpServer(dependencies = {}) {
223
+ const dispatcher = createToolDispatcher(dependencies);
224
+ const surface = await mcpSurface();
225
+ const server = new Server({ name: "stratum-mcp", version: SERVER_VERSION }, { capabilities: { tools: {} } });
226
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
227
+ tools: Object.entries(surface.tools).map(([name, definition]) => ({
228
+ name,
229
+ description: definition.description ?? `Stratum ${name.slice("stratum_".length)}`,
230
+ inputSchema: jsonSchema(definition.request),
231
+ })),
232
+ }));
233
+ const heartbeatMs = dependencies.heartbeatMs ?? 15_000;
234
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
235
+ const progressToken = request.params._meta?.progressToken;
236
+ let progressSeq = 0;
237
+ const sendProgress = async (message) => {
238
+ if (progressToken === undefined)
239
+ return;
240
+ progressSeq += 1;
241
+ try {
242
+ await extra.sendNotification({
243
+ method: "notifications/progress",
244
+ params: { progressToken, progress: progressSeq, ...(message !== undefined ? { message } : {}) },
245
+ });
246
+ }
247
+ catch { /* transport gone — the call itself will surface the failure */ }
248
+ };
249
+ let heartbeat;
250
+ if (progressToken !== undefined) {
251
+ heartbeat = setInterval(() => {
252
+ void sendProgress();
253
+ }, heartbeatMs);
254
+ heartbeat.unref?.();
255
+ }
256
+ try {
257
+ let context;
258
+ if (request.params.name === "stratum_agent_run" && progressToken !== undefined) {
259
+ const flowId = randomUUID();
260
+ let eventSeq = 0;
261
+ context = {
262
+ onAgentEvent: async (event) => {
263
+ const message = JSON.stringify({
264
+ schema_version: "0.2.7",
265
+ flow_id: flowId,
266
+ step_id: "_agent_run",
267
+ seq: eventSeq,
268
+ ts: new Date().toISOString(),
269
+ kind: event.kind,
270
+ metadata: event.metadata,
271
+ reply_required: false,
272
+ });
273
+ eventSeq += 1;
274
+ await sendProgress(message);
275
+ },
276
+ };
277
+ }
278
+ const payload = await dispatcher.call(request.params.name, request.params.arguments ?? {}, context);
279
+ return { content: [{ type: "text", text: JSON.stringify(payload) }], structuredContent: payload };
280
+ }
281
+ finally {
282
+ if (heartbeat !== undefined)
283
+ clearInterval(heartbeat);
284
+ }
285
+ });
286
+ return server;
287
+ }
288
+ export async function serveStdio() {
289
+ const engine = defaultEngine();
290
+ await engine.rehydrateBgFlows();
291
+ const server = await createMcpServer({ engine });
292
+ await server.connect(new StdioServerTransport());
293
+ }
294
+ function auditResponse(audit) {
295
+ return { status: audit.status, runId: audit.runId, events: audit.events, steps: audit.steps, flowSpent: audit.flowSpent, ...(audit.output !== undefined ? { output: audit.output } : {}) };
296
+ }
297
+ function flowPollResponse(response) { return { ...response }; }
298
+ function bgFlowPollResponse(response) {
299
+ const gateStepId = response.bg.pendingGates[0];
300
+ return { ...response, bg: { ...response.bg, ...(gateStepId !== undefined ? { gateStepId } : {}) } };
301
+ }
302
+ function option(request, key) { const value = optionalString(request, key); return value ? { workspaceRoot: value } : {}; }
303
+ function string(request, key) { const value = request[key]; if (typeof value !== "string")
304
+ throw new Error(`${key} must be a string`); return value; }
305
+ function optionalString(request, key) { const value = request[key]; return typeof value === "string" ? value : undefined; }
306
+ function optionalNumber(request, key) { const value = request[key]; return typeof value === "number" ? value : undefined; }
307
+ function record(request, key) { const value = request[key]; if (typeof value !== "object" || value === null || Array.isArray(value))
308
+ throw new Error(`${key} must be an object`); return value; }
309
+ function optionalArray(request, key) { const value = request[key]; return Array.isArray(value) ? value : []; }
310
+ function optionalRecord(request, key) { const value = request[key]; return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {}; }
311
+ function speckitErrorEnvelope(error) {
312
+ if (error instanceof SpeckitCompileError)
313
+ return { status: "error", error_type: error.kind, message: error.message };
314
+ return { status: "error", error_type: "compile_error", message: error instanceof Error ? error.message : String(error) };
315
+ }
316
+ function guardErrorEnvelope(error) {
317
+ if (typeof error === "object" && error !== null && "errorType" in error && typeof error.errorType === "string" && "message" in error && typeof error.message === "string") {
318
+ return { status: "error", error_type: error.errorType, message: error.message };
319
+ }
320
+ if (error instanceof Error)
321
+ return { status: "error", error_type: error.name || "unexpected_error", message: error.message };
322
+ return { status: "error", error_type: "unexpected_error", message: String(error) };
323
+ }
324
+ function checkpointErrorEnvelope(error) {
325
+ return {
326
+ status: "error",
327
+ error_type: error.errorType,
328
+ message: error.message,
329
+ ...(error.available !== undefined ? { available: [...error.available] } : {}),
330
+ };
331
+ }
332
+ function jsonSchema(shape) {
333
+ validateShape(shape, "schema");
334
+ return schemaForValidated(shape);
335
+ }
336
+ export function schemaFor(shape) {
337
+ validateShape(shape, "schema");
338
+ return schemaForValidated(shape);
339
+ }
340
+ function schemaForValidated(shape) {
341
+ if (typeof shape === "string") {
342
+ if (shape === "any")
343
+ return {};
344
+ if (shape === "array")
345
+ return { type: "array" };
346
+ if (shape === "object")
347
+ return { type: "object" };
348
+ if (shape === "null")
349
+ return { type: "null" };
350
+ if (shape.includes("|"))
351
+ return { anyOf: shape.split("|").map((alternative) => schemaForValidated(alternative)) };
352
+ return { type: shape };
353
+ }
354
+ if ("$array" in shape)
355
+ return { type: "array", items: schemaForValidated(shape.$array) };
356
+ if ("$oneOf" in shape) {
357
+ return { oneOf: shape.$oneOf.map((variant) => schemaForValidated(variant)) };
358
+ }
359
+ const properties = {};
360
+ const required = [];
361
+ for (const [rawKey, child] of Object.entries(shape)) {
362
+ const optional = rawKey.endsWith("?");
363
+ const key = optional ? rawKey.slice(0, -1) : rawKey;
364
+ properties[key] = schemaForValidated(child);
365
+ if (!optional)
366
+ required.push(key);
367
+ }
368
+ return { type: "object", properties, ...(required.length ? { required } : {}), additionalProperties: false };
369
+ }
370
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ import { parseDocument } from "yaml";
2
+ // This is intentionally a usage classifier, not a transformation registry. The
3
+ // prose mirrors the v0.x -> v1 table in STRAT-TS-PORT/design.md so each report
4
+ // remains useful even when a legacy document is only partially valid.
5
+ const GUIDANCE = [
6
+ { id: "function-infer", python: "function decl mode: infer + step", v1: "task (agent from step; inline declaration)", note: "agent-dispatched", status: "supported" },
7
+ { id: "function-compute", python: "function decl mode: compute + step", v1: "task (agent-dispatched)", note: "Python compute is dispatched; do not map it to set", status: "supported" },
8
+ { id: "function-gate", python: "function decl mode: gate + step", v1: "gate construct", note: "carry routing fields", status: "supported" },
9
+ { id: "inline", python: "inline step", v1: "task", note: "", status: "supported" },
10
+ { id: "judge-fold", python: "judge deterministic/judged predicates", v1: "ensures on its single antecedent", note: "zero or multiple antecedents need a diagnostic", status: "diagnostic" },
11
+ { id: "judge-unsupported", python: "judge verified/applied_gate/budgets", v1: "UNSUPPORTED", note: "fold manually or keep on Python", status: "unsupported" },
12
+ { id: "iterate", python: "max_iterations + exit_criterion", v1: "iterate: { max, until }", note: "", status: "supported" },
13
+ { id: "score-accumulate", python: "score_expr/accumulate/accumulate_key", v1: "UNSUPPORTED", note: "", status: "unsupported" },
14
+ { id: "decompose", python: "decompose without task depends_on", v1: "task contract tasks: T[] plus fanout", note: "TaskGraph uses .tasks", status: "supported" },
15
+ { id: "decompose-dependencies", python: "TaskGraph tasks with depends_on", v1: "UNSUPPORTED", note: "v1 fanout has no cross-item dependencies", status: "unsupported" },
16
+ { id: "parallel-dispatch", python: "parallel_dispatch", v1: "fanout", note: "source/intent/concurrency/worktree-none/require/merge map by re-authoring", status: "supported" },
17
+ { id: "parallel-unsupported", python: "branch/manual/reference pre_merge/certificates/timeouts/diff/deferred", v1: "UNSUPPORTED", note: "", status: "unsupported" },
18
+ { id: "pipeline-when", python: "pipeline stages with when", v1: "fanout steps with when", note: "", status: "supported" },
19
+ { id: "pipeline-nested", python: "pipeline stages with nested fanout/join regions", v1: "UNSUPPORTED", note: "flatten the region or keep on Python", status: "unsupported" },
20
+ { id: "pipeline-exit", python: "pipeline exit_when", v1: "UNSUPPORTED", note: "not iterate.until", status: "unsupported" },
21
+ { id: "subflow", python: "flow step", v1: "subflow run", note: "non-recursive", status: "supported" },
22
+ { id: "max-rounds", python: "flow max_rounds", v1: "flow max_rounds", note: "same revise budget", status: "supported" },
23
+ { id: "missing-max-rounds", python: "revise gate without flow max_rounds", v1: "explicit max_rounds", note: "start at 3; v1 forbids unlimited revision", status: "diagnostic" },
24
+ { id: "depends-on", python: "depends_on", v1: "refs plus after", note: "retain dependencies not implied by refs", status: "supported" },
25
+ { id: "skip-if", python: "skip_if", v1: "when", note: "invert its sense", status: "supported" },
26
+ { id: "next", python: "next", v1: "DAG edges and gate routing", note: "irreducible jumps need a diagnostic", status: "diagnostic" },
27
+ { id: "on-fail", python: "on_fail", v1: "on_fail to a topologically later step", note: "backward graphs are unsupported", status: "diagnostic" },
28
+ { id: "ensure-expressions", python: "ensure/exit_criterion expressions", v1: "v1 expression grammar", note: "untranslatable expressions need a diagnostic", status: "diagnostic" },
29
+ { id: "contracts", python: "contracts/output_schema", v1: "contract language", note: "only the enumerated type subset maps", status: "diagnostic" },
30
+ { id: "flow-output", python: "route-dependent final output", v1: "output: { from, contract }", note: "requires a unique static terminal producer", status: "diagnostic" },
31
+ ];
32
+ const guidanceById = new Map(GUIDANCE.map((item) => [item.id, item]));
33
+ function record(value) {
34
+ return typeof value === "object" && value !== null && !Array.isArray(value);
35
+ }
36
+ function collectTaskDepends(value) {
37
+ if (Array.isArray(value))
38
+ return value.some((item) => record(item) && Array.isArray(item.depends_on) && item.depends_on.length > 0 || collectTaskDepends(item));
39
+ if (!record(value))
40
+ return false;
41
+ return Object.entries(value).some(([key, child]) => key !== "depends_on" && collectTaskDepends(child));
42
+ }
43
+ /** Classify a parsed Python-era IR without validating or translating it. */
44
+ export function checkLegacySpec(input) {
45
+ const found = new Map();
46
+ const add = (id, path) => {
47
+ const paths = found.get(id) ?? [];
48
+ paths.push(path);
49
+ found.set(id, paths);
50
+ };
51
+ if (!record(input)) {
52
+ return { findings: [{ id: "unreadable", python: "legacy document", v1: "none", note: "YAML root must be a mapping", status: "diagnostic", paths: ["root"] }] };
53
+ }
54
+ const version = typeof input.version === "string" || typeof input.version === "number" ? String(input.version) : undefined;
55
+ if (version !== "0.1" && version !== "0.2" && version !== "0.3")
56
+ add("unreadable", "version");
57
+ if (record(input.contracts))
58
+ add("contracts", "contracts");
59
+ const functions = record(input.functions) ? input.functions : {};
60
+ for (const [name, definition] of Object.entries(functions)) {
61
+ if (!record(definition))
62
+ continue;
63
+ const mode = definition.mode;
64
+ if (mode === "infer")
65
+ add("function-infer", `functions.${name}.mode`);
66
+ if (mode === "compute")
67
+ add("function-compute", `functions.${name}.mode`);
68
+ if (mode === "gate")
69
+ add("function-gate", `functions.${name}.mode`);
70
+ if (Array.isArray(definition.ensure))
71
+ add("ensure-expressions", `functions.${name}.ensure`);
72
+ }
73
+ const flows = record(input.flows) ? input.flows : {};
74
+ for (const [name, flow] of Object.entries(flows)) {
75
+ if (!record(flow))
76
+ continue;
77
+ const flowPath = `flows.${name}`;
78
+ if (flow.max_rounds !== undefined)
79
+ add("max-rounds", `${flowPath}.max_rounds`);
80
+ if (flow.output !== undefined)
81
+ add("flow-output", `${flowPath}.output`);
82
+ const steps = Array.isArray(flow.steps) ? flow.steps : [];
83
+ for (const [index, step] of steps.entries()) {
84
+ if (!record(step))
85
+ continue;
86
+ const stepPath = `${flowPath}.steps[${index}]`;
87
+ const type = step.type;
88
+ if (type === "inline" || step.intent !== undefined && step.function === undefined && step.flow === undefined)
89
+ add("inline", stepPath);
90
+ if (type === "flow" || step.flow !== undefined)
91
+ add("subflow", stepPath);
92
+ if (type === "decompose")
93
+ add(collectTaskDepends(step) ? "decompose-dependencies" : "decompose", stepPath);
94
+ if (type === "parallel_dispatch") {
95
+ add("parallel-dispatch", stepPath);
96
+ if (step.isolation === "branch" || step.merge === "manual" || typeof step.pre_merge_verify === "string" || step.reasoning_template !== undefined || step.task_reasoning_template !== undefined || step.task_timeout !== undefined || step.capture_diff === true || step.defer_advance === true)
97
+ add("parallel-unsupported", stepPath);
98
+ }
99
+ if (type === "pipeline") {
100
+ const stages = Array.isArray(step.stages) ? step.stages : [];
101
+ if (stages.some((stage) => record(stage) && stage.when !== undefined))
102
+ add("pipeline-when", `${stepPath}.stages`);
103
+ if (stages.some((stage) => record(stage) && stage.exit_when !== undefined))
104
+ add("pipeline-exit", `${stepPath}.stages`);
105
+ if (stages.some((stage) => record(stage) && (stage.fanout !== undefined || stage.join !== undefined)))
106
+ add("pipeline-nested", `${stepPath}.stages`);
107
+ }
108
+ if (record(step.judge)) {
109
+ const predicates = Array.isArray(step.judge.predicates) ? step.judge.predicates : [];
110
+ if (predicates.some((predicate) => record(predicate) && (predicate.type === "deterministic" || predicate.type === "judged")))
111
+ add("judge-fold", `${stepPath}.judge.predicates`);
112
+ if (step.judge.budget !== undefined || predicates.some((predicate) => record(predicate) && (predicate.type === "verified" || predicate.applied_gate !== undefined)))
113
+ add("judge-unsupported", `${stepPath}.judge`);
114
+ }
115
+ if (step.max_iterations !== undefined || step.exit_criterion !== undefined)
116
+ add("iterate", stepPath);
117
+ if (step.exit_criterion !== undefined || Array.isArray(step.ensure))
118
+ add("ensure-expressions", stepPath);
119
+ if (step.score_expr !== undefined || step.accumulate !== undefined || step.accumulate_key !== undefined)
120
+ add("score-accumulate", stepPath);
121
+ if (Array.isArray(step.depends_on) && step.depends_on.length)
122
+ add("depends-on", `${stepPath}.depends_on`);
123
+ if (step.skip_if !== undefined)
124
+ add("skip-if", `${stepPath}.skip_if`);
125
+ if (step.next !== undefined)
126
+ add("next", `${stepPath}.next`);
127
+ if (step.on_fail !== undefined)
128
+ add("on-fail", `${stepPath}.on_fail`);
129
+ if (step.output_schema !== undefined || step.output_contract !== undefined)
130
+ add("contracts", stepPath);
131
+ if (step.on_revise !== undefined && flow.max_rounds === undefined)
132
+ add("missing-max-rounds", `${stepPath}.on_revise`);
133
+ }
134
+ }
135
+ const findings = [...found.entries()].map(([id, paths]) => {
136
+ if (id === "unreadable")
137
+ return { id, python: "legacy document", v1: "none", note: "expected version 0.1, 0.2, or 0.3", status: "diagnostic", paths };
138
+ const item = guidanceById.get(id);
139
+ return { ...item, paths };
140
+ });
141
+ return { ...(version ? { version } : {}), findings };
142
+ }
143
+ /** Parse YAML only; any parse failure is a report diagnostic, never an exception. */
144
+ export function checkLegacyYaml(source) {
145
+ const document = parseDocument(source, { prettyErrors: false });
146
+ if (document.errors.length > 0) {
147
+ return { findings: [{ id: "unreadable", python: "legacy document", v1: "none", note: document.errors.map((error) => error.message).join("; "), status: "diagnostic", paths: ["root"] }] };
148
+ }
149
+ return checkLegacySpec(document.toJS());
150
+ }
151
+ export function renderCompatReport(report) {
152
+ const heading = `stratum migrate --check${report.version ? ` (v${report.version})` : ""}`;
153
+ const lines = [heading, "report-only: no YAML was emitted or translated"];
154
+ if (report.findings.length === 0)
155
+ lines.push("No mapped legacy constructs found.");
156
+ for (const finding of report.findings) {
157
+ lines.push(`- [${finding.status.toUpperCase()}] ${finding.python} -> ${finding.v1}`);
158
+ if (finding.note)
159
+ lines.push(` ${finding.note}`);
160
+ lines.push(` at: ${finding.paths.join(", ")}`);
161
+ }
162
+ return `${lines.join("\n")}\n`;
163
+ }
164
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/migrate/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Port of executor.validate_certificate.
3
+ *
4
+ * Validates required headings and, when requested, premise citations in the
5
+ * final (conclusion) section.
6
+ */
7
+ export function validateCertificate(template, result) {
8
+ const artifact = firstNonEmptyString(result.artifact, result.reasoning);
9
+ const violations = [];
10
+ const sections = template.sections ?? [];
11
+ for (const section of sections) {
12
+ const heading = `## ${section.label}`;
13
+ if (!artifact.includes(heading)) {
14
+ violations.push(`certificate missing section: ${section.label}`);
15
+ }
16
+ }
17
+ if (template.require_citations && violations.length === 0) {
18
+ if (sections.length === 0)
19
+ return violations;
20
+ const conclusion = sections[sections.length - 1];
21
+ if (!conclusion)
22
+ return violations;
23
+ const conclusionIndex = artifact.indexOf(`## ${conclusion.label}`);
24
+ if (conclusionIndex >= 0 && !/\[P\d+\]/.test(artifact.slice(conclusionIndex))) {
25
+ violations.push("certificate violation: conclusion contains no premise citations [P<n>]");
26
+ }
27
+ }
28
+ return violations;
29
+ }
30
+ function firstNonEmptyString(...values) {
31
+ for (const value of values) {
32
+ if (typeof value === "string" && value.length > 0)
33
+ return value;
34
+ }
35
+ return "";
36
+ }
37
+ //# sourceMappingURL=certificate.js.map