@riddledc/riddle-proof 0.7.226 → 0.8.1

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 (132) hide show
  1. package/dist/adapters/codex-exec-agent.cjs +893 -0
  2. package/dist/adapters/codex-exec-agent.d.cts +3 -0
  3. package/dist/adapters/codex-exec-agent.d.ts +3 -0
  4. package/dist/adapters/codex-exec-agent.js +13 -0
  5. package/dist/adapters/codex.cjs +893 -0
  6. package/dist/adapters/codex.d.cts +3 -0
  7. package/dist/adapters/codex.d.ts +3 -0
  8. package/dist/adapters/codex.js +13 -0
  9. package/dist/adapters/local-agent.cjs +893 -0
  10. package/dist/adapters/local-agent.d.cts +3 -0
  11. package/dist/adapters/local-agent.d.ts +3 -0
  12. package/dist/adapters/local-agent.js +13 -0
  13. package/dist/adapters/openclaw.cjs +213 -0
  14. package/dist/adapters/openclaw.d.cts +2 -0
  15. package/dist/adapters/openclaw.d.ts +2 -0
  16. package/dist/adapters/openclaw.js +17 -0
  17. package/dist/advanced/engine-harness.cjs +5701 -0
  18. package/dist/advanced/engine-harness.d.cts +2 -0
  19. package/dist/advanced/engine-harness.d.ts +2 -0
  20. package/dist/advanced/engine-harness.js +16 -0
  21. package/dist/advanced/index.cjs +6242 -0
  22. package/dist/advanced/index.d.cts +5 -0
  23. package/dist/advanced/index.d.ts +5 -0
  24. package/dist/advanced/index.js +23 -0
  25. package/dist/advanced/proof-run-core.cjs +1085 -0
  26. package/dist/advanced/proof-run-core.d.cts +1 -0
  27. package/dist/advanced/proof-run-core.d.ts +1 -0
  28. package/dist/advanced/proof-run-core.js +59 -0
  29. package/dist/advanced/proof-run-engine.cjs +2905 -0
  30. package/dist/advanced/proof-run-engine.d.cts +2 -0
  31. package/dist/advanced/proof-run-engine.d.ts +2 -0
  32. package/dist/advanced/proof-run-engine.js +10 -0
  33. package/dist/advanced/runner.cjs +833 -0
  34. package/dist/advanced/runner.d.cts +2 -0
  35. package/dist/advanced/runner.d.ts +2 -0
  36. package/dist/advanced/runner.js +12 -0
  37. package/dist/app-contract/index.cjs +24 -0
  38. package/dist/app-contract/index.d.cts +1 -0
  39. package/dist/app-contract/index.d.ts +1 -0
  40. package/dist/app-contract/index.js +2 -0
  41. package/dist/basic-gameplay.js +1 -0
  42. package/dist/checkpoint.js +1 -0
  43. package/dist/chunk-BHL4JSGM.js +1900 -0
  44. package/dist/chunk-BTN76IGW.js +115 -0
  45. package/dist/{chunk-TGHTM66Z.js → chunk-COERZX63.js} +10 -2
  46. package/dist/{chunk-QUAZAMOM.js → chunk-IWLQQ5S5.js} +12 -2
  47. package/dist/chunk-MLKGABMK.js +9 -0
  48. package/dist/chunk-OFSECTSC.js +0 -0
  49. package/dist/{chunk-GBVEQQIM.js → chunk-TJ63IE65.js} +36 -1
  50. package/dist/chunk-VZD5LH7U.js +4138 -0
  51. package/dist/cli/index.cjs +18 -0
  52. package/dist/cli/index.d.cts +2 -0
  53. package/dist/cli/index.d.ts +2 -0
  54. package/dist/cli/index.js +12 -0
  55. package/dist/cli.d.cts +1 -0
  56. package/dist/cli.d.ts +1 -0
  57. package/dist/cli.js +8 -4139
  58. package/dist/codex-exec-agent.d.cts +1 -1
  59. package/dist/codex-exec-agent.d.ts +1 -1
  60. package/dist/codex-exec-agent.js +1 -0
  61. package/dist/diagnostics.js +1 -0
  62. package/dist/engine-harness-CMACHP6A.d.ts +96 -0
  63. package/dist/engine-harness-LBfqbFSe.d.cts +96 -0
  64. package/dist/engine-harness.d.cts +2 -79
  65. package/dist/engine-harness.d.ts +2 -79
  66. package/dist/engine-harness.js +3 -2
  67. package/dist/index.d.cts +2 -2
  68. package/dist/index.d.ts +2 -2
  69. package/dist/index.js +4 -3
  70. package/dist/local-agent.d.cts +1 -1
  71. package/dist/local-agent.d.ts +1 -1
  72. package/dist/local-agent.js +1 -0
  73. package/dist/openclaw.js +8 -107
  74. package/dist/playability.js +1 -0
  75. package/dist/profile/index.cjs +9403 -0
  76. package/dist/profile/index.d.cts +2 -0
  77. package/dist/profile/index.d.ts +2 -0
  78. package/dist/profile/index.js +53 -0
  79. package/dist/profile.js +1 -0
  80. package/dist/proof-run-core-CE0jx7wL.d.cts +359 -0
  81. package/dist/proof-run-core-CE0jx7wL.d.ts +359 -0
  82. package/dist/proof-run-core.d.cts +1 -322
  83. package/dist/proof-run-core.d.ts +1 -322
  84. package/dist/proof-run-core.js +2 -1
  85. package/dist/proof-run-engine-CSSc0mNn.d.ts +764 -0
  86. package/dist/proof-run-engine-HSRpUeBi.d.cts +764 -0
  87. package/dist/proof-run-engine.d.cts +2 -757
  88. package/dist/proof-run-engine.d.ts +2 -757
  89. package/dist/proof-run-engine.js +5 -1885
  90. package/dist/proof-session.js +1 -0
  91. package/dist/result.js +1 -0
  92. package/dist/riddle-client.js +1 -0
  93. package/dist/run-card.js +1 -0
  94. package/dist/runner-4LJ5z0D-.d.cts +29 -0
  95. package/dist/runner-BdQpOkZD.d.ts +29 -0
  96. package/dist/runner.d.cts +2 -22
  97. package/dist/runner.d.ts +2 -22
  98. package/dist/runner.js +3 -2
  99. package/dist/runtime/index.cjs +528 -0
  100. package/dist/runtime/index.d.cts +1 -0
  101. package/dist/runtime/index.d.ts +1 -0
  102. package/dist/runtime/index.js +37 -0
  103. package/dist/runtime/riddle-client.cjs +528 -0
  104. package/dist/runtime/riddle-client.d.cts +1 -0
  105. package/dist/runtime/riddle-client.d.ts +1 -0
  106. package/dist/runtime/riddle-client.js +37 -0
  107. package/dist/spec/checkpoint.cjs +807 -0
  108. package/dist/spec/checkpoint.d.cts +2 -0
  109. package/dist/spec/checkpoint.d.ts +2 -0
  110. package/dist/spec/checkpoint.js +34 -0
  111. package/dist/spec/index.cjs +1510 -0
  112. package/dist/spec/index.d.cts +5 -0
  113. package/dist/spec/index.d.ts +5 -0
  114. package/dist/spec/index.js +80 -0
  115. package/dist/spec/result.cjs +259 -0
  116. package/dist/spec/result.d.cts +2 -0
  117. package/dist/spec/result.d.ts +2 -0
  118. package/dist/spec/result.js +21 -0
  119. package/dist/spec/run-card.cjs +287 -0
  120. package/dist/spec/run-card.d.cts +2 -0
  121. package/dist/spec/run-card.d.ts +2 -0
  122. package/dist/spec/run-card.js +11 -0
  123. package/dist/spec/state.cjs +541 -0
  124. package/dist/spec/state.d.cts +2 -0
  125. package/dist/spec/state.d.ts +2 -0
  126. package/dist/spec/state.js +28 -0
  127. package/dist/spec/types.cjs +18 -0
  128. package/dist/spec/types.d.cts +1 -0
  129. package/dist/spec/types.d.ts +1 -0
  130. package/dist/spec/types.js +1 -0
  131. package/dist/state.js +1 -0
  132. package/package.json +95 -2
@@ -0,0 +1,1085 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/advanced/proof-run-core.ts
31
+ var proof_run_core_exports = {};
32
+ __export(proof_run_core_exports, {
33
+ BUNDLED_RIDDLE_PROOF_DIR: () => BUNDLED_RIDDLE_PROOF_DIR,
34
+ CHECKPOINT_CONTRACT_VERSION: () => CHECKPOINT_CONTRACT_VERSION,
35
+ RIDDLE_PROOF_DIR_CANDIDATES: () => RIDDLE_PROOF_DIR_CANDIDATES,
36
+ WORKFLOW_STAGE_ORDER: () => WORKFLOW_STAGE_ORDER,
37
+ buildCheckpointContract: () => buildCheckpointContract,
38
+ buildSetupArgs: () => buildSetupArgs,
39
+ checkpointContinueStage: () => checkpointContinueStage,
40
+ clearStageDecisionRequest: () => clearStageDecisionRequest,
41
+ ensureAction: () => ensureAction,
42
+ ensureStageLoopState: () => ensureStageLoopState,
43
+ invalidateVerifyEvidence: () => invalidateVerifyEvidence,
44
+ mergeStateFromParams: () => mergeStateFromParams,
45
+ noImplementationModeFor: () => noImplementationModeFor,
46
+ previewModeFromWorkflowMode: () => previewModeFromWorkflowMode,
47
+ readState: () => readState,
48
+ recordStageAttempt: () => recordStageAttempt,
49
+ requiredBaselineLabelsForState: () => requiredBaselineLabelsForState,
50
+ resolveConfig: () => resolveConfig,
51
+ resolveRiddleProofDir: () => resolveRiddleProofDir,
52
+ setStageDecisionRequest: () => setStageDecisionRequest,
53
+ summarizeState: () => summarizeState,
54
+ validateShipGate: () => validateShipGate,
55
+ visualDeltaForState: () => visualDeltaForState,
56
+ visualDeltaRequiredForState: () => visualDeltaRequiredForState,
57
+ visualDeltaShipGateReason: () => visualDeltaShipGateReason,
58
+ workflowFile: () => workflowFile,
59
+ writeState: () => writeState
60
+ });
61
+ module.exports = __toCommonJS(proof_run_core_exports);
62
+
63
+ // src/proof-run-core.ts
64
+ var import_node_fs = require("fs");
65
+ var import_node_crypto = require("crypto");
66
+ var import_node_path = __toESM(require("path"), 1);
67
+ var import_node_url = require("url");
68
+ var import_meta = {};
69
+ var WORKFLOW_STAGE_ORDER = ["setup", "recon", "author", "implement", "verify", "ship"];
70
+ function normalizedMode(value) {
71
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
72
+ }
73
+ function previewModeFromWorkflowMode(value) {
74
+ const mode = normalizedMode(value);
75
+ return mode === "server" || mode === "static" ? mode : void 0;
76
+ }
77
+ function noImplementationModeInput(value) {
78
+ return value && typeof value === "object" ? value : {};
79
+ }
80
+ function noImplementationModeFor(params, state) {
81
+ const input = noImplementationModeInput(params);
82
+ const stateInput = noImplementationModeInput(state);
83
+ const mode = normalizedMode(input.mode ?? input.workflow_mode ?? stateInput.mode ?? stateInput.workflow_mode);
84
+ const implementationMode = normalizedMode(input.implementation_mode ?? stateInput.implementation_mode);
85
+ const requireDiff = input.require_diff ?? stateInput.require_diff;
86
+ const allowCodeChanges = input.allow_code_changes ?? stateInput.allow_code_changes;
87
+ return mode === "audit" || mode === "profile" || implementationMode === "none" || requireDiff === false || allowCodeChanges === false;
88
+ }
89
+ function canRunSetupWithoutRepo(params) {
90
+ return noImplementationModeFor(params) && Boolean((params.prod_url || "").trim());
91
+ }
92
+ var CHECKPOINT_CONTRACT_VERSION = "riddle-proof-run.checkpoint.v1";
93
+ function currentDistDir() {
94
+ const meta = typeof import_meta === "object" ? import_meta : {};
95
+ if (typeof meta.url === "string" && meta.url) {
96
+ return import_node_path.default.dirname((0, import_node_url.fileURLToPath)(meta.url));
97
+ }
98
+ if (typeof __dirname === "string") return __dirname;
99
+ return process.cwd();
100
+ }
101
+ var BUNDLED_RIDDLE_PROOF_DIR = import_node_path.default.resolve(
102
+ currentDistDir(),
103
+ "..",
104
+ "runtime"
105
+ );
106
+ var RIDDLE_PROOF_DIR_CANDIDATES = [
107
+ BUNDLED_RIDDLE_PROOF_DIR
108
+ ];
109
+ function createWorkflowStatePath() {
110
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
111
+ return `/tmp/riddle-proof-state-${stamp}-${(0, import_node_crypto.randomUUID)().slice(0, 8)}.json`;
112
+ }
113
+ function argsPathForStatePath(statePath) {
114
+ const base = import_node_path.default.basename(statePath);
115
+ if (base.startsWith("riddle-proof-state")) {
116
+ return import_node_path.default.join(import_node_path.default.dirname(statePath), base.replace("riddle-proof-state", "riddle-proof-args"));
117
+ }
118
+ return import_node_path.default.join(import_node_path.default.dirname(statePath), `${base}.args.json`);
119
+ }
120
+ function isRiddleProofSkillDir(candidate) {
121
+ return (0, import_node_fs.existsSync)(workflowFile(candidate, "setup"));
122
+ }
123
+ function resolveRiddleProofDir(config = {}) {
124
+ if (config.riddleProofDir) return config.riddleProofDir;
125
+ const candidates = [
126
+ process.env.RIDDLE_PROOF_DIR,
127
+ ...RIDDLE_PROOF_DIR_CANDIDATES
128
+ ].filter((candidate) => Boolean(candidate));
129
+ return candidates.find(isRiddleProofSkillDir) || candidates.find((candidate) => (0, import_node_fs.existsSync)(candidate)) || RIDDLE_PROOF_DIR_CANDIDATES[0];
130
+ }
131
+ function resolveConfig(config = {}, params = {}) {
132
+ const configuredStatePath = config.statePath || "";
133
+ const shouldIsolateWorkflow = !params.state_path && !configuredStatePath && (params.action === "setup" || params.action === "run");
134
+ const statePath = params.state_path || (shouldIsolateWorkflow ? createWorkflowStatePath() : configuredStatePath || "/tmp/riddle-proof-state.json");
135
+ return {
136
+ riddleProofDir: resolveRiddleProofDir(config),
137
+ statePath,
138
+ argsPath: argsPathForStatePath(statePath),
139
+ defaultReviewer: config.defaultReviewer || "davisdiehl"
140
+ };
141
+ }
142
+ function ensureAction(action) {
143
+ if (["setup", "recon", "author", "implement", "verify", "ship", "status", "sync", "run"].includes(action)) {
144
+ return action;
145
+ }
146
+ throw new Error(`Unsupported action: ${action}`);
147
+ }
148
+ function workflowFile(riddleProofDir, action) {
149
+ return import_node_path.default.join(riddleProofDir, "pipelines", `riddle-proof-${action}.lobster`);
150
+ }
151
+ function asJsonString(value) {
152
+ if (value === void 0 || value === null || value === "") return "";
153
+ if (typeof value === "string") return value;
154
+ return JSON.stringify(value);
155
+ }
156
+ function buildSetupArgs(params, config) {
157
+ if (!params.repo && !canRunSetupWithoutRepo(params)) throw new Error("repo is required for setup/run");
158
+ if (!params.change_request) throw new Error("change_request is required for setup/run");
159
+ const commitMessage = (params.commit_message || params.change_request || "").trim();
160
+ const captureScript = (params.capture_script || "").trim();
161
+ const requestedReference = params.reference || (params.prod_url ? "both" : "before");
162
+ if (!commitMessage) throw new Error("commit_message is required for setup/run");
163
+ return {
164
+ repo: params.repo,
165
+ branch: params.branch || "",
166
+ change_request: params.change_request,
167
+ commit_message: commitMessage,
168
+ prod_url: params.prod_url || "",
169
+ capture_script: captureScript,
170
+ success_criteria: params.success_criteria || "",
171
+ assertions_json: params.assertions_json || asJsonString(params.assertions),
172
+ verification_mode: params.verification_mode || "proof",
173
+ resume_session: params.resume_session || "",
174
+ target_image_url: params.target_image_url || "",
175
+ target_image_hash: params.target_image_hash || "",
176
+ viewport_matrix_json: params.viewport_matrix_json || asJsonString(params.viewport_matrix),
177
+ deterministic_setup_json: params.deterministic_setup_json || asJsonString(params.deterministic_setup),
178
+ reference: requestedReference,
179
+ base_branch: params.base_branch || "main",
180
+ before_ref: params.before_ref || "",
181
+ allow_static_preview_fallback: params.allow_static_preview_fallback ? "true" : "",
182
+ context: params.context || "",
183
+ reviewer: params.reviewer || config.defaultReviewer,
184
+ mode: previewModeFromWorkflowMode(params.mode) || "",
185
+ implementation_mode: params.implementation_mode || "",
186
+ require_diff: params.require_diff,
187
+ allow_code_changes: params.allow_code_changes,
188
+ build_command: params.build_command || "npm run build",
189
+ build_output: params.build_output || "build",
190
+ server_image: params.server_image || "node:20-slim",
191
+ server_command: params.server_command || "npm start",
192
+ server_port: String(params.server_port || 3e3),
193
+ server_path: params.server_path || "",
194
+ server_path_source: params.server_path ? "user" : "",
195
+ use_auth: params.use_auth ? "true" : "",
196
+ auth_localStorage_json: params.auth_localStorage_json || "",
197
+ auth_cookies_json: params.auth_cookies_json || "",
198
+ auth_headers_json: params.auth_headers_json || "",
199
+ color_scheme: params.color_scheme || "",
200
+ wait_for_selector: params.wait_for_selector || "",
201
+ discord_channel: params.discord_channel || "",
202
+ discord_thread_id: params.discord_thread_id || "",
203
+ discord_message_id: params.discord_message_id || "",
204
+ discord_source_url: params.discord_source_url || "",
205
+ leave_draft: params.leave_draft ? "true" : ""
206
+ };
207
+ }
208
+ function readState(statePath) {
209
+ if (!(0, import_node_fs.existsSync)(statePath)) {
210
+ return null;
211
+ }
212
+ return JSON.parse((0, import_node_fs.readFileSync)(statePath, "utf-8"));
213
+ }
214
+ function writeState(statePath, state) {
215
+ (0, import_node_fs.writeFileSync)(statePath, JSON.stringify(state, null, 2));
216
+ }
217
+ function normalizeOptionalString(value) {
218
+ return typeof value === "string" ? value.trim() : void 0;
219
+ }
220
+ function knownEnvironmentIssuesFromNotes(notes) {
221
+ const text = notes.toLowerCase();
222
+ const issues = [];
223
+ if ((text.includes("erofs") || text.includes("read-only file system")) && text.includes("node_modules") && (text.includes(".vite-temp") || text.includes("vite.config"))) {
224
+ issues.push({
225
+ code: "vite_temp_config_erofs",
226
+ source: "implementation_notes",
227
+ severity: "environment",
228
+ summary: "Focused build verification hit the known Vite temp-config EROFS issue in shared node_modules."
229
+ });
230
+ }
231
+ return issues;
232
+ }
233
+ function guardProofEvidenceGlobalAssignments(script) {
234
+ return script.replace(
235
+ /^(\s*)(globalThis|window|self)\.__riddleProofEvidence\s*=\s*([^;\n]+);\s*$/gm,
236
+ (_match, indent, root, expression) => `${indent}try { if (typeof ${root} !== "undefined" && ${root}) ${root}.__riddleProofEvidence = ${expression.trim()}; } catch {}`
237
+ );
238
+ }
239
+ function normalizeCaptureScript(value) {
240
+ const script = normalizeOptionalString(value) || "";
241
+ return script ? guardProofEvidenceGlobalAssignments(script) : "";
242
+ }
243
+ function appendProofSummaryLine(state, line) {
244
+ const text = String(line || "").trim();
245
+ if (!text) return;
246
+ const existing = typeof state.proof_summary === "string" ? state.proof_summary.trim() : "";
247
+ if (existing.includes(text)) return;
248
+ state.proof_summary = existing ? `${existing}
249
+ ${text}` : text;
250
+ }
251
+ function hasAuthoredProofPlan(state = {}) {
252
+ return Boolean((state?.proof_plan || "").trim()) && Boolean((state?.capture_script || "").trim());
253
+ }
254
+ function syncAuthoringState(state = {}) {
255
+ const reconReady = ["ready_for_proof_plan", "completed"].includes(state?.recon_status || "");
256
+ const reconBlocked = ["needs_agent_decision", "needs_supervisor_judgment"].includes(state?.recon_status || "");
257
+ const reconExhausted = state?.recon_status === "exhausted";
258
+ if (reconBlocked) {
259
+ state.author_status = "needs_recon_judgment";
260
+ } else if (reconExhausted) {
261
+ state.author_status = "recon_exhausted";
262
+ } else if (!reconReady) {
263
+ state.author_status = state.author_status || "pending_recon";
264
+ } else if (state.author_status === "ready" || state.proof_plan_status === "ready") {
265
+ state.author_status = "ready";
266
+ } else {
267
+ state.author_status = "needs_authoring";
268
+ }
269
+ if (reconBlocked) {
270
+ state.proof_plan_status = "needs_recon_judgment";
271
+ } else if (reconExhausted) {
272
+ state.proof_plan_status = "recon_exhausted";
273
+ } else if (state.author_status === "ready" || state.proof_plan_status === "ready") {
274
+ state.proof_plan_status = "ready";
275
+ } else if (reconReady) {
276
+ state.proof_plan_status = "needs_authoring";
277
+ } else {
278
+ state.proof_plan_status = state.proof_plan_status || "pending_recon";
279
+ }
280
+ state.author_request = state.author_request || {};
281
+ state.author_summary = state.author_summary || "";
282
+ return state;
283
+ }
284
+ function ensureStageLoopState(state = {}) {
285
+ if (!state || typeof state !== "object") return state;
286
+ syncAuthoringState(state);
287
+ state.explicit_stage_gate = true;
288
+ state.stage_attempts = state.stage_attempts || {};
289
+ for (const stage of WORKFLOW_STAGE_ORDER) {
290
+ const current = state.stage_attempts[stage] || {};
291
+ state.stage_attempts[stage] = {
292
+ count: Number(current.count || 0),
293
+ last_status: current.last_status || null,
294
+ last_checkpoint: current.last_checkpoint || null,
295
+ last_summary: current.last_summary || null,
296
+ last_attempted_at: current.last_attempted_at || null,
297
+ history: Array.isArray(current.history) ? current.history : []
298
+ };
299
+ }
300
+ state.stage_decision_request = state.stage_decision_request || {};
301
+ state.active_checkpoint = state.active_checkpoint || null;
302
+ state.active_checkpoint_stage = state.active_checkpoint_stage || null;
303
+ state.last_requested_advance_stage = state.last_requested_advance_stage || null;
304
+ return state;
305
+ }
306
+ function clearStageDecisionRequest(state = {}) {
307
+ ensureStageLoopState(state);
308
+ state.stage_decision_request = {};
309
+ state.active_checkpoint = null;
310
+ state.active_checkpoint_stage = null;
311
+ return state;
312
+ }
313
+ function recordStageAttempt(state, stage, entry = {}) {
314
+ ensureStageLoopState(state);
315
+ const bucket = state.stage_attempts[stage];
316
+ const attemptNumber = Number(bucket.count || 0) + 1;
317
+ const item = {
318
+ attempt: attemptNumber,
319
+ stage,
320
+ status: entry.status || "completed",
321
+ checkpoint: entry.checkpoint || null,
322
+ summary: entry.summary || null,
323
+ requested_advance_stage: entry.requestedAdvanceStage || null,
324
+ halted_for_approval: Boolean(entry.haltedForApproval),
325
+ auto_approved: Boolean(entry.autoApproved),
326
+ retryable: Boolean(entry.retryable),
327
+ checkpoint_disposition: entry.checkpointDisposition || null,
328
+ error: entry.error || null,
329
+ details: entry.details || {},
330
+ attempted_at: (/* @__PURE__ */ new Date()).toISOString()
331
+ };
332
+ bucket.count = attemptNumber;
333
+ bucket.last_status = item.status;
334
+ bucket.last_checkpoint = item.checkpoint;
335
+ bucket.last_summary = item.summary;
336
+ bucket.last_attempted_at = item.attempted_at;
337
+ bucket.history = [...bucket.history, item].slice(-25);
338
+ state.stage_attempts[stage] = bucket;
339
+ state.last_requested_advance_stage = entry.requestedAdvanceStage || state.last_requested_advance_stage || null;
340
+ return item;
341
+ }
342
+ function setStageDecisionRequest(state, request) {
343
+ ensureStageLoopState(state);
344
+ const continueWithStage = request.continueWithStage || request.recommendedAdvanceStage || null;
345
+ state.active_checkpoint = request.checkpoint;
346
+ state.active_checkpoint_stage = request.stage;
347
+ state.stage_decision_request = {
348
+ stage: request.stage,
349
+ checkpoint: request.checkpoint,
350
+ summary: request.summary,
351
+ next_actions: request.nextActions || [],
352
+ advance_options: request.advanceOptions || [],
353
+ recommended_advance_stage: request.recommendedAdvanceStage || null,
354
+ continue_from_checkpoint: Boolean(continueWithStage),
355
+ continue_with_stage: continueWithStage,
356
+ blocking: Boolean(request.blocking),
357
+ details: request.details || {},
358
+ checkpoint_contract: request.checkpointContract || null,
359
+ updated_at: (/* @__PURE__ */ new Date()).toISOString()
360
+ };
361
+ return state.stage_decision_request;
362
+ }
363
+ function checkpointContinueStage(state) {
364
+ ensureStageLoopState(state);
365
+ const stage = state?.stage_decision_request?.continue_with_stage || state?.stage_decision_request?.recommended_advance_stage || null;
366
+ return WORKFLOW_STAGE_ORDER.includes(stage) ? stage : null;
367
+ }
368
+ function invalidateVerifyEvidence(state = {}) {
369
+ if (!state || typeof state !== "object") {
370
+ return { invalidated: false };
371
+ }
372
+ const hadAfterCdn = typeof state.after_cdn === "string" && state.after_cdn.trim().length > 0;
373
+ const hadVerifyResults = Boolean(state.verify_results && Object.keys(state.verify_results).length > 0);
374
+ const hadMergeRecommendation = typeof state.merge_recommendation === "string" && state.merge_recommendation.trim().length > 0;
375
+ const hadProofSummary = typeof state.proof_summary === "string" && state.proof_summary.trim().length > 0;
376
+ const hadVerifyStatus = typeof state.verify_status === "string" && state.verify_status.trim().length > 0;
377
+ const hadVerifySummary = typeof state.verify_summary === "string" && state.verify_summary.trim().length > 0;
378
+ const hadVerifyDecisionRequest = Boolean(state.verify_decision_request && Object.keys(state.verify_decision_request).length > 0);
379
+ const hadEvidenceNotes = Array.isArray(state.evidence_notes) && state.evidence_notes.length > 0;
380
+ const hadProofAssessment = Boolean(state.proof_assessment && Object.keys(state.proof_assessment).length > 0);
381
+ const hadProofAssessmentRequest = Boolean(state.proof_assessment_request && Object.keys(state.proof_assessment_request).length > 0);
382
+ const invalidated = hadAfterCdn || hadVerifyResults || hadMergeRecommendation || hadProofSummary || hadVerifyStatus || hadVerifySummary || hadVerifyDecisionRequest || hadEvidenceNotes || hadProofAssessment || hadProofAssessmentRequest;
383
+ if (invalidated) {
384
+ state.after_cdn = "";
385
+ state.verify_results = {};
386
+ state.verify_status = "";
387
+ state.verify_summary = "";
388
+ state.verify_decision_request = {};
389
+ state.merge_recommendation = null;
390
+ state.proof_summary = "";
391
+ state.evidence_notes = [];
392
+ state.proof_assessment = {};
393
+ state.proof_assessment_source = null;
394
+ state.proof_assessment_request = {};
395
+ }
396
+ return {
397
+ invalidated,
398
+ hadAfterCdn,
399
+ hadVerifyResults,
400
+ hadMergeRecommendation,
401
+ hadProofSummary,
402
+ hadVerifyStatus,
403
+ hadVerifySummary,
404
+ hadVerifyDecisionRequest,
405
+ hadEvidenceNotes,
406
+ hadProofAssessment,
407
+ hadProofAssessmentRequest
408
+ };
409
+ }
410
+ function normalizedReference(state = {}) {
411
+ const reference = String(state?.requested_reference || state?.reference || "before").trim();
412
+ return reference || "before";
413
+ }
414
+ function normalizedProofAssessment(state = {}) {
415
+ const proofAssessment = state?.proof_assessment || {};
416
+ const source = String(proofAssessment?.source || state?.proof_assessment_source || "").trim().toLowerCase();
417
+ const decision = String(proofAssessment?.decision || "").trim();
418
+ return {
419
+ decision: decision || null,
420
+ source: source || null
421
+ };
422
+ }
423
+ var VISUAL_FIRST_MODES = /* @__PURE__ */ new Set([
424
+ "visual",
425
+ "render",
426
+ "interaction",
427
+ "ui",
428
+ "layout",
429
+ "screenshot",
430
+ "canvas",
431
+ "animation"
432
+ ]);
433
+ function objectValue(value) {
434
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
435
+ }
436
+ function normalizedVerificationMode(state = {}) {
437
+ const bundle = objectValue(state?.evidence_bundle);
438
+ const bundleMode = String(bundle.verification_mode || "").trim().toLowerCase();
439
+ if (bundleMode) return bundleMode;
440
+ return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
441
+ }
442
+ function visualDeltaRequiredForState(state = {}) {
443
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation(state)) return false;
444
+ const bundle = objectValue(state?.evidence_bundle);
445
+ const contract = objectValue(bundle.artifact_contract);
446
+ const required = objectValue(contract.required);
447
+ if (required.visual_delta === false) return false;
448
+ return required.visual_delta === true || VISUAL_FIRST_MODES.has(normalizedVerificationMode(state));
449
+ }
450
+ function visualDeltaForState(state = {}) {
451
+ const bundle = objectValue(state?.evidence_bundle);
452
+ const after = objectValue(bundle.after);
453
+ const afterDelta = objectValue(after.visual_delta);
454
+ if (Object.keys(afterDelta).length) return afterDelta;
455
+ const request = objectValue(state?.proof_assessment_request);
456
+ return objectValue(request.visual_delta);
457
+ }
458
+ function visualDeltaNotApplicableForNoImplementation(state = {}) {
459
+ const visualDelta = visualDeltaForState(state);
460
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
461
+ const reason = String(visualDelta.reason || "").toLowerCase();
462
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
463
+ }
464
+ function visualDeltaShipGateReason(state = {}) {
465
+ if (!visualDeltaRequiredForState(state)) return null;
466
+ const visualDelta = visualDeltaForState(state);
467
+ if (visualDelta.status === "measured" && visualDelta.passed === true) return null;
468
+ const status = String(visualDelta.status || "missing");
469
+ if (status === "unmeasured") {
470
+ const reason2 = String(visualDelta.reason || "").trim();
471
+ return reason2 ? `visual_delta.status=unmeasured blocks ready_to_ship for visual/UI proof: ${reason2}` : "visual_delta.status=unmeasured blocks ready_to_ship for visual/UI proof";
472
+ }
473
+ if (status === "measured" && visualDelta.passed === false) {
474
+ return "visual_delta.status=measured but visual_delta.passed=false blocks ready_to_ship for visual/UI proof";
475
+ }
476
+ const reason = String(visualDelta.reason || "").trim();
477
+ if (reason) return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof: ${reason}`;
478
+ return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof`;
479
+ }
480
+ function visualDeltaEvidenceIssueCode(state = {}, blocker = "") {
481
+ const visualDelta = visualDeltaForState(state || {});
482
+ const status = String(visualDelta.status || "").trim();
483
+ const reason = `${String(visualDelta.reason || "")}
484
+ ${blocker}`.toLowerCase();
485
+ if (status === "unmeasured") {
486
+ if (reason.includes("fetch") || reason.includes("allowlist") || reason.includes("registered domain") || reason.includes("high risk") || reason.includes("comparator")) {
487
+ return "comparator_fetch_blocked";
488
+ }
489
+ return "visual_delta_unmeasured";
490
+ }
491
+ if (status === "measured" && visualDelta.passed === false) return "semantic_proof_failed";
492
+ if (visualDeltaRequiredForState(state || {})) return "visual_delta_unmeasured";
493
+ return "semantic_proof_failed";
494
+ }
495
+ function requiredBaselineLabelsForState(state = {}) {
496
+ const reference = normalizedReference(state);
497
+ const labels = [];
498
+ if (reference === "before" || reference === "both") labels.push("before");
499
+ if (reference === "prod" || reference === "both") labels.push("prod");
500
+ return labels;
501
+ }
502
+ function validateShipGate(state = {}) {
503
+ const reference = normalizedReference(state);
504
+ const prodUrl = String(state?.prod_url || "").trim();
505
+ const beforeCdn = String(state?.before_cdn || "").trim();
506
+ const prodCdn = String(state?.prod_cdn || "").trim();
507
+ const afterCdn = String(state?.after_cdn || "").trim();
508
+ const verifyStatus = String(state?.verify_status || "").trim();
509
+ const proofAssessment = normalizedProofAssessment(state);
510
+ const verificationMode = normalizedVerificationMode(state);
511
+ const visualDelta = visualDeltaForState(state);
512
+ const visualDeltaRequired = visualDeltaRequiredForState(state);
513
+ const visualDeltaBlocker = visualDeltaShipGateReason(state);
514
+ const reasons = [];
515
+ if (!["before", "prod", "both"].includes(reference)) {
516
+ reasons.push(`reference must be before, prod, or both; got ${reference}`);
517
+ }
518
+ const requiredBaselines = requiredBaselineLabelsForState(state);
519
+ if (requiredBaselines.includes("before") && !beforeCdn) {
520
+ reasons.push("before_cdn is required before ship");
521
+ }
522
+ if (requiredBaselines.includes("prod")) {
523
+ if (!prodUrl) {
524
+ reasons.push(`prod_url is required when reference=${reference}`);
525
+ }
526
+ if (!prodCdn) {
527
+ reasons.push("prod_cdn is required before ship");
528
+ }
529
+ }
530
+ if (!afterCdn) {
531
+ reasons.push("after_cdn is required before ship");
532
+ }
533
+ if (verifyStatus !== "evidence_captured") {
534
+ reasons.push("verify_status must be evidence_captured before ship");
535
+ }
536
+ if (!["supervising_agent", "supervisor"].includes(proofAssessment.source || "")) {
537
+ reasons.push("proof_assessment.source must be supervising_agent before ship");
538
+ }
539
+ if (proofAssessment.decision !== "ready_to_ship") {
540
+ reasons.push("proof_assessment.decision must be ready_to_ship before ship");
541
+ }
542
+ if (visualDeltaBlocker) {
543
+ reasons.push(visualDeltaBlocker);
544
+ }
545
+ return {
546
+ ok: reasons.length === 0,
547
+ reasons,
548
+ required_baselines: requiredBaselines,
549
+ evidence: {
550
+ reference,
551
+ verification_mode: verificationMode || null,
552
+ prod_url: prodUrl || null,
553
+ before_cdn: beforeCdn || null,
554
+ prod_cdn: prodCdn || null,
555
+ after_cdn: afterCdn || null,
556
+ verify_status: verifyStatus || null,
557
+ proof_assessment_decision: proofAssessment.decision,
558
+ proof_assessment_source: proofAssessment.source,
559
+ visual_delta_required: visualDeltaRequired,
560
+ visual_delta_status: typeof visualDelta.status === "string" ? visualDelta.status : null,
561
+ visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null
562
+ }
563
+ };
564
+ }
565
+ var CHECKPOINT_CONTRACT_SPECS = {
566
+ setup_review: {
567
+ purpose: "Inspect prepared workspace state before moving into recon."
568
+ },
569
+ recon_supervisor_judgment: {
570
+ purpose: "Supervising agent judges the latest recon attempt and either retries recon, promotes baselines for authoring, or escalates.",
571
+ accepted_inputs: [{
572
+ name: "recon_assessment_json",
573
+ type: "json",
574
+ required: true,
575
+ description: "JSON assessment with decision, summary, baseline_understanding, continue_with_stage, escalation_target, refined_inputs, and reasons."
576
+ }],
577
+ response_schema: {
578
+ decision: ["retry_recon", "ready_for_author", "recon_stuck"],
579
+ summary: "string",
580
+ baseline_understanding: {
581
+ reference: ["before", "prod", "both", "unknown"],
582
+ target_route: "string",
583
+ before_evidence_url: "string",
584
+ visible_before_state: "string",
585
+ relevant_elements: ["string"],
586
+ requested_change: "string",
587
+ proof_focus: "string",
588
+ stop_condition: "string",
589
+ quality_risks: ["string"]
590
+ },
591
+ continue_with_stage: ["recon", "author"],
592
+ escalation_target: ["agent", "human"],
593
+ refined_inputs: {
594
+ server_path: "string",
595
+ wait_for_selector: "string",
596
+ reference: ["before", "prod", "both"]
597
+ },
598
+ reasons: ["string"],
599
+ source: "supervising_agent"
600
+ },
601
+ required_state: ["recon_assessment_request", "recon_results.attempt_history"]
602
+ },
603
+ recon_review: {
604
+ purpose: "Recon baselines were promoted and the workflow is ready for proof authoring."
605
+ },
606
+ recon_human_escalation: {
607
+ purpose: "Recon is explicitly blocked for human direction after supervising-agent escalation."
608
+ },
609
+ author_supervisor_judgment: {
610
+ purpose: "Supervising agent authors the proof packet from recon observations.",
611
+ accepted_inputs: [{
612
+ name: "author_packet_json",
613
+ type: "json",
614
+ required: true,
615
+ description: "JSON proof packet with proof_plan, capture_script, optional refined_inputs, rationale, confidence, and summary."
616
+ }],
617
+ response_schema: {
618
+ proof_plan: "string",
619
+ capture_script: "string",
620
+ baseline_understanding_used: {
621
+ reference: ["before", "prod", "both", "unknown"],
622
+ target_route: "string",
623
+ before_evidence_url: "string",
624
+ visible_before_state: "string",
625
+ relevant_elements: ["string"],
626
+ requested_change: "string",
627
+ proof_focus: "string",
628
+ stop_condition: "string",
629
+ quality_risks: ["string"]
630
+ },
631
+ refined_inputs: {
632
+ server_path: "string",
633
+ wait_for_selector: "string",
634
+ reference: ["before", "prod", "both"]
635
+ },
636
+ rationale: ["string"],
637
+ confidence: "low | medium | high",
638
+ summary: "string"
639
+ },
640
+ required_state: ["author_request", "recon_results.baselines"]
641
+ },
642
+ author_review: {
643
+ purpose: "Proof packet is ready; choose whether to inspect, re-author, implement, or verify."
644
+ },
645
+ implement_changes_missing: {
646
+ purpose: "Implementation stage did not detect material code changes.",
647
+ accepted_inputs: [{
648
+ name: "make_code_changes",
649
+ type: "external_action",
650
+ required: true,
651
+ description: "Make the actual code changes in the after worktree, then resume the implement stage."
652
+ }]
653
+ },
654
+ implement_review: {
655
+ purpose: "Implementation changes were detected and stale verify evidence, if any, was invalidated."
656
+ },
657
+ implement_required: {
658
+ purpose: "Verify cannot run until implementation changes are recorded.",
659
+ accepted_inputs: [{
660
+ name: "make_code_changes",
661
+ type: "external_action",
662
+ required: true,
663
+ description: "Make the requested code change, then advance the run to implement."
664
+ }]
665
+ },
666
+ verify_capture_retry: {
667
+ purpose: "Verify capture was incomplete; the agent loop should revise capture authoring before shipping.",
668
+ accepted_inputs: [{
669
+ name: "author_packet_json",
670
+ type: "json",
671
+ description: "Optional revised proof packet if returning to author."
672
+ }],
673
+ required_state: ["verify_decision_request"]
674
+ },
675
+ verify_supervisor_judgment: {
676
+ purpose: "Supervising agent judges whether captured evidence proves the change is ready to ship.",
677
+ accepted_inputs: [{
678
+ name: "proof_assessment_json",
679
+ type: "json",
680
+ required: true,
681
+ description: "JSON assessment with decision, summary, recommended_stage, continue_with_stage, escalation_target, and reasons."
682
+ }],
683
+ response_schema: {
684
+ decision: ["ready_to_ship", "needs_richer_proof", "revise_capture"],
685
+ summary: "string",
686
+ recommended_stage: ["ship", "author", "implement", "recon", "verify"],
687
+ continue_with_stage: ["ship", "author", "implement", "recon", "verify"],
688
+ escalation_target: ["agent", "human"],
689
+ reasons: ["string"],
690
+ source: "supervising_agent"
691
+ },
692
+ required_state: ["before_cdn or prod_cdn", "after_cdn", "proof_assessment_request"],
693
+ include_ship_gate: true
694
+ },
695
+ verify_human_escalation: {
696
+ purpose: "Proof loop is explicitly escalated to the human after supervising-agent judgment."
697
+ },
698
+ verify_agent_retry: {
699
+ purpose: "Supervising agent judged the proof insufficient and kept the workflow inside the internal loop.",
700
+ accepted_inputs: [{
701
+ name: "author_packet_json",
702
+ type: "json",
703
+ description: "Optional revised proof packet if the checkpoint resumes to author."
704
+ }]
705
+ },
706
+ verify_ship_ready: {
707
+ purpose: "Proof assessment is ready_to_ship and the next continuation should enter ship.",
708
+ include_ship_gate: true
709
+ },
710
+ verify_required: {
711
+ purpose: "Ship is blocked until verify captures usable after evidence.",
712
+ include_ship_gate: true
713
+ },
714
+ verify_supervisor_judgment_required: {
715
+ purpose: "Ship is blocked until the supervising agent judges the current evidence ready_to_ship.",
716
+ accepted_inputs: [{
717
+ name: "proof_assessment_json",
718
+ type: "json",
719
+ required: true,
720
+ description: "JSON assessment that must use decision=ready_to_ship before ship can continue."
721
+ }],
722
+ include_ship_gate: true
723
+ },
724
+ ship_gate_blocked: {
725
+ purpose: "Ship is blocked because required baseline, after evidence, or supervising-agent proof approval is missing.",
726
+ include_ship_gate: true
727
+ },
728
+ ship_review: {
729
+ purpose: "Ship completed; inspect the PR, proof comment, and CI status.",
730
+ include_ship_gate: true
731
+ }
732
+ };
733
+ function buildCheckpointContract(state, request) {
734
+ const spec = CHECKPOINT_CONTRACT_SPECS[request.checkpoint] || {
735
+ purpose: request.summary
736
+ };
737
+ const continueWithStage = request.continueWithStage || request.recommendedAdvanceStage || null;
738
+ const payload = {
739
+ version: CHECKPOINT_CONTRACT_VERSION,
740
+ checkpoint: request.checkpoint,
741
+ stage: request.stage,
742
+ purpose: spec.purpose,
743
+ summary: request.summary,
744
+ blocking: Boolean(request.blocking),
745
+ next_actions: request.nextActions || [],
746
+ advance_options: request.advanceOptions || [],
747
+ accepted_inputs: spec.accepted_inputs || [],
748
+ response_schema: spec.response_schema || null,
749
+ required_state: spec.required_state || [],
750
+ resume: {
751
+ action: "run",
752
+ state_path: request.statePath || null,
753
+ continue_from_checkpoint: Boolean(continueWithStage),
754
+ continue_with_stage: continueWithStage
755
+ }
756
+ };
757
+ if (spec.include_ship_gate) {
758
+ payload.ship_gate = validateShipGate(state);
759
+ }
760
+ return payload;
761
+ }
762
+ function mergeStateFromParams(statePath, params) {
763
+ const state = readState(statePath);
764
+ if (!state) return null;
765
+ ensureStageLoopState(state);
766
+ const stringFields = [
767
+ "change_request",
768
+ "commit_message",
769
+ "prod_url",
770
+ "capture_script",
771
+ "success_criteria",
772
+ "assertions_json",
773
+ "verification_mode",
774
+ "resume_session",
775
+ "target_image_url",
776
+ "target_image_hash",
777
+ "viewport_matrix_json",
778
+ "deterministic_setup_json",
779
+ "base_branch",
780
+ "before_ref",
781
+ "context",
782
+ "reviewer",
783
+ "build_command",
784
+ "build_output",
785
+ "server_image",
786
+ "server_command",
787
+ "server_path",
788
+ "wait_for_selector",
789
+ "discord_channel",
790
+ "discord_thread_id",
791
+ "discord_message_id",
792
+ "discord_source_url",
793
+ "auth_localStorage_json",
794
+ "auth_cookies_json",
795
+ "auth_headers_json",
796
+ "proof_plan",
797
+ "implementation_notes",
798
+ "implementation_mode"
799
+ ];
800
+ for (const field of stringFields) {
801
+ if (params[field] !== void 0) {
802
+ state[field] = normalizeOptionalString(params[field]);
803
+ }
804
+ }
805
+ if (params.server_path !== void 0) {
806
+ state.server_path_source = "tool_param";
807
+ }
808
+ if (params.implementation_notes !== void 0) {
809
+ const issues = knownEnvironmentIssuesFromNotes(state.implementation_notes || "");
810
+ if (issues.length) state.implementation_environment_issues = issues;
811
+ }
812
+ if (params.reference !== void 0) state.reference = params.reference;
813
+ if (params.mode !== void 0) {
814
+ const previewMode = previewModeFromWorkflowMode(params.mode);
815
+ if (previewMode) {
816
+ state.mode = previewMode;
817
+ } else {
818
+ state.workflow_mode = normalizeOptionalString(params.mode);
819
+ }
820
+ }
821
+ if (params.implementation_mode !== void 0) state.implementation_mode = normalizeOptionalString(params.implementation_mode);
822
+ if (params.require_diff !== void 0) state.require_diff = params.require_diff;
823
+ if (params.allow_code_changes !== void 0) state.allow_code_changes = params.allow_code_changes;
824
+ if (params.allow_static_preview_fallback !== void 0) {
825
+ state.allow_static_preview_fallback = params.allow_static_preview_fallback;
826
+ }
827
+ if (params.server_port !== void 0) state.server_port = String(params.server_port);
828
+ if (params.color_scheme !== void 0) state.color_scheme = params.color_scheme || "";
829
+ if (params.use_auth !== void 0) state.use_auth = params.use_auth ? "true" : "";
830
+ if (params.leave_draft !== void 0) state.leave_draft = params.leave_draft ? "true" : "";
831
+ if (params.advance_stage !== void 0) state.last_requested_advance_stage = params.advance_stage;
832
+ if (params.recon_assessment_json !== void 0) {
833
+ const raw = normalizeOptionalString(params.recon_assessment_json) || "";
834
+ if (!raw) {
835
+ state.recon_assessment = {};
836
+ state.recon_assessment_source = null;
837
+ } else {
838
+ const parsed = JSON.parse(raw);
839
+ state.recon_assessment = {
840
+ ...parsed,
841
+ source: (parsed?.source || "supervising_agent").toString()
842
+ };
843
+ state.recon_assessment_source = state.recon_assessment.source;
844
+ if (parsed?.baseline_understanding && typeof parsed.baseline_understanding === "object") {
845
+ state.recon_baseline_understanding = parsed.baseline_understanding;
846
+ }
847
+ const refined = parsed?.refined_inputs || {};
848
+ if (typeof refined?.server_path === "string") {
849
+ state.server_path = normalizeOptionalString(refined.server_path) || "";
850
+ state.server_path_source = "supervising_agent";
851
+ }
852
+ if (typeof refined?.wait_for_selector === "string") state.wait_for_selector = normalizeOptionalString(refined.wait_for_selector) || "";
853
+ if (typeof refined?.reference === "string" && refined.reference.trim()) state.reference = refined.reference.trim();
854
+ }
855
+ }
856
+ if (params.author_packet_json !== void 0) {
857
+ const raw = normalizeOptionalString(params.author_packet_json) || "";
858
+ if (!raw) {
859
+ state.supervisor_author_packet = null;
860
+ } else {
861
+ const parsed = JSON.parse(raw);
862
+ if (typeof parsed?.capture_script === "string") {
863
+ parsed.capture_script = normalizeCaptureScript(parsed.capture_script);
864
+ }
865
+ state.supervisor_author_packet = parsed;
866
+ if (typeof parsed?.proof_plan === "string") state.proof_plan = normalizeOptionalString(parsed.proof_plan) || "";
867
+ if (typeof parsed?.capture_script === "string") state.capture_script = normalizeCaptureScript(parsed.capture_script);
868
+ if (parsed?.baseline_understanding_used && typeof parsed.baseline_understanding_used === "object") {
869
+ state.author_baseline_understanding_used = parsed.baseline_understanding_used;
870
+ }
871
+ const refined = parsed?.refined_inputs || {};
872
+ if (typeof refined?.server_path === "string") {
873
+ state.server_path = normalizeOptionalString(refined.server_path) || "";
874
+ state.server_path_source = "supervising_agent";
875
+ }
876
+ if (typeof refined?.wait_for_selector === "string") state.wait_for_selector = normalizeOptionalString(refined.wait_for_selector) || "";
877
+ if (typeof refined?.reference === "string" && refined.reference.trim()) state.reference = refined.reference.trim();
878
+ if (typeof parsed?.confidence === "string") state.supervisor_author_confidence = normalizeOptionalString(parsed.confidence) || null;
879
+ if (parsed?.rationale !== void 0) state.supervisor_author_rationale = parsed.rationale;
880
+ if (typeof parsed?.summary === "string") state.supervisor_author_summary = normalizeOptionalString(parsed.summary) || null;
881
+ invalidateVerifyEvidence(state);
882
+ }
883
+ }
884
+ if (params.proof_assessment_json !== void 0) {
885
+ const raw = normalizeOptionalString(params.proof_assessment_json) || "";
886
+ if (!raw) {
887
+ state.proof_assessment = {};
888
+ state.proof_assessment_source = null;
889
+ } else {
890
+ const parsed = JSON.parse(raw);
891
+ const assessment = {
892
+ ...parsed,
893
+ source: (parsed?.source || "supervising_agent").toString()
894
+ };
895
+ const readyBlocker = assessment?.decision === "ready_to_ship" ? visualDeltaShipGateReason({ ...state, proof_assessment: assessment, proof_assessment_source: assessment.source }) : null;
896
+ if (readyBlocker) {
897
+ assessment.blocked_decision = assessment.decision;
898
+ assessment.decision = "revise_capture";
899
+ assessment.recommended_stage = "verify";
900
+ assessment.continue_with_stage = "verify";
901
+ assessment.evidence_collection_incomplete = true;
902
+ assessment.recovery_stage = "verify";
903
+ assessment.recovery_reason = readyBlocker;
904
+ assessment.evidence_issue_code = visualDeltaEvidenceIssueCode(state, readyBlocker);
905
+ assessment.visual_delta = visualDeltaForState(state);
906
+ assessment.suggested_repair = "Keep the same Riddle Proof run in evidence/comparison recovery: repair or retry the visual comparator/fetch path, wait for artifact readiness if applicable, or produce a measured visual_delta artifact before proof review can mark ready_to_ship.";
907
+ const blockers = Array.isArray(assessment.blockers) ? assessment.blockers : [];
908
+ assessment.blockers = [...blockers, readyBlocker];
909
+ }
910
+ state.proof_assessment = assessment;
911
+ state.proof_assessment_source = state.proof_assessment.source;
912
+ if (typeof state.proof_assessment?.decision === "string") {
913
+ state.proof_decision = state.proof_assessment.decision;
914
+ }
915
+ if (typeof parsed?.summary === "string") {
916
+ state.proof_assessment_summary = normalizeOptionalString(parsed.summary) || null;
917
+ }
918
+ if (state.proof_assessment?.decision === "ready_to_ship") {
919
+ state.merge_recommendation = "ready-to-ship";
920
+ } else if (typeof state.proof_assessment?.decision === "string" && state.proof_assessment.decision.trim()) {
921
+ state.merge_recommendation = "do-not-merge";
922
+ }
923
+ appendProofSummaryLine(state, `Supervising proof assessment: ${state.proof_assessment.decision || "unknown"}`);
924
+ if (readyBlocker) {
925
+ appendProofSummaryLine(state, `Ready-to-ship assessment routed to evidence recovery: ${readyBlocker}`);
926
+ }
927
+ if (state.proof_assessment_summary) {
928
+ appendProofSummaryLine(state, `Assessment summary: ${state.proof_assessment_summary}`);
929
+ }
930
+ const reasons = Array.isArray(parsed?.reasons) ? parsed.reasons.filter((item) => typeof item === "string" && item.trim()).slice(0, 4) : [];
931
+ if (reasons.length) {
932
+ appendProofSummaryLine(state, `Assessment reasons: ${reasons.join("; ")}`);
933
+ }
934
+ }
935
+ }
936
+ if (params.assertions_json !== void 0) {
937
+ const raw = normalizeOptionalString(params.assertions_json) || "";
938
+ if (!raw) {
939
+ state.parsed_assertions = null;
940
+ } else {
941
+ state.parsed_assertions = JSON.parse(raw);
942
+ }
943
+ }
944
+ if ((params.proof_plan !== void 0 || params.capture_script !== void 0) && hasAuthoredProofPlan(state)) {
945
+ state.author_summary = state.author_summary || "Proof authoring inputs were updated from tool params.";
946
+ }
947
+ syncAuthoringState(state);
948
+ writeState(statePath, state);
949
+ return state;
950
+ }
951
+ function summarizeState(state) {
952
+ if (!state) {
953
+ return {
954
+ stage: "missing",
955
+ summary: "No riddle-proof state file exists yet.",
956
+ state: null
957
+ };
958
+ }
959
+ ensureStageLoopState(state);
960
+ const attemptCounts = Object.fromEntries(
961
+ WORKFLOW_STAGE_ORDER.map((stage) => [stage, Number(state.stage_attempts?.[stage]?.count || 0)])
962
+ );
963
+ const selected = {
964
+ workspace_ready: Boolean(state.workspace_ready),
965
+ repo: state.repo || null,
966
+ branch: state.branch || null,
967
+ mode: state.mode || null,
968
+ workflow_mode: state.workflow_mode || null,
969
+ implementation_mode: state.implementation_mode || null,
970
+ require_diff: state.require_diff ?? null,
971
+ allow_code_changes: state.allow_code_changes ?? null,
972
+ no_implementation_mode: noImplementationModeFor(state),
973
+ reference: state.reference || null,
974
+ before_ref: state.before_ref || null,
975
+ allow_static_preview_fallback: Boolean(state.allow_static_preview_fallback),
976
+ commit_message: state.commit_message || null,
977
+ author_status: state.author_status || null,
978
+ author_summary: state.author_summary || null,
979
+ author_request: state.author_request || null,
980
+ proof_plan_status: state.proof_plan_status || null,
981
+ proof_plan: state.proof_plan || null,
982
+ proof_plan_request: state.proof_plan_request || null,
983
+ proof_profile_applied: Boolean(state.proof_profile),
984
+ proof_profile: state.proof_profile || null,
985
+ recon_status: state.recon_status || null,
986
+ recon_assessment: state.recon_assessment || null,
987
+ recon_assessment_request: state.recon_assessment_request || null,
988
+ recon_assessment_source: state.recon_assessment_source || null,
989
+ recon_decision_request: state.recon_decision_request || null,
990
+ recon_attempts_used: Array.isArray(state.recon_results?.attempt_history) ? state.recon_results.attempt_history.length : 0,
991
+ recon_attempts_max: state.recon_results?.max_attempts || null,
992
+ recon_hypothesis: state.recon_hypothesis || null,
993
+ implementation_status: state.implementation_status || null,
994
+ implementation_summary: state.implementation_summary || null,
995
+ implementation_detection_summary: state.implementation_detection_summary || null,
996
+ implementation_detection: state.implementation_detection || null,
997
+ implementation_environment_issues: state.implementation_environment_issues || [],
998
+ verify_status: state.verify_status || null,
999
+ verify_summary: state.verify_summary || null,
1000
+ verify_decision_request: state.verify_decision_request || null,
1001
+ proof_assessment: state.proof_assessment || null,
1002
+ proof_assessment_request: state.proof_assessment_request || null,
1003
+ proof_assessment_source: state.proof_assessment_source || null,
1004
+ merge_recommendation: state.merge_recommendation || null,
1005
+ before_cdn: state.before_cdn || null,
1006
+ after_cdn: state.after_cdn || null,
1007
+ prod_cdn: state.prod_cdn || null,
1008
+ pr_url: state.pr_url || null,
1009
+ pr_branch: state.target_branch || state.branch || null,
1010
+ pr_state: state.pr_state || null,
1011
+ ship_commit: state.ship_commit || null,
1012
+ ship_remote_head: state.ship_remote_head || null,
1013
+ merge_commit: state.merge_commit || null,
1014
+ merged_at: state.merged_at || null,
1015
+ ship_push: state.ship_push || null,
1016
+ ship_report: state.ship_report || null,
1017
+ cleanup_report: state.cleanup_report || null,
1018
+ proof_comment_url: state.proof_comment_url || null,
1019
+ proof_assessment_comment_url: state.proof_assessment_comment_url || null,
1020
+ marked_ready: typeof state.marked_ready === "boolean" ? state.marked_ready : null,
1021
+ left_draft: typeof state.left_draft === "boolean" ? state.left_draft : null,
1022
+ ci_status: state.ci_status || null,
1023
+ reviewer: state.reviewer || null,
1024
+ active_checkpoint: state.active_checkpoint || null,
1025
+ active_checkpoint_stage: state.active_checkpoint_stage || null,
1026
+ continue_with_stage: checkpointContinueStage(state),
1027
+ stage_decision_request: state.stage_decision_request || {},
1028
+ stage_attempt_counts: attemptCounts,
1029
+ explicit_stage_gate: Boolean(state.explicit_stage_gate),
1030
+ last_requested_advance_stage: state.last_requested_advance_stage || null,
1031
+ recon_results: state.recon_results || null,
1032
+ verify_results: state.verify_results || null,
1033
+ proof_session: state.proof_session || null,
1034
+ parent_proof_session: state.parent_proof_session || null,
1035
+ proof_session_artifact_url: state.proof_session_artifact_url || null
1036
+ };
1037
+ const parts = [
1038
+ state.workspace_ready ? "workspace ready" : "workspace not ready",
1039
+ state.mode ? `mode=${state.mode}` : null,
1040
+ state.reference ? `reference=${state.reference}` : null,
1041
+ state.author_status ? `author=${state.author_status}` : null,
1042
+ state.proof_plan_status ? `proof=${state.proof_plan_status}` : null,
1043
+ state.recon_status ? `recon=${state.recon_status}` : null,
1044
+ state.implementation_status ? `implement=${state.implementation_status}` : null,
1045
+ state.verify_status ? `verify=${state.verify_status}` : null,
1046
+ state.active_checkpoint ? `checkpoint=${state.active_checkpoint}` : null,
1047
+ state.after_cdn ? "after evidence captured" : null,
1048
+ state.pr_url ? "PR linked" : null
1049
+ ].filter(Boolean);
1050
+ return {
1051
+ stage: state.stage || (state.after_cdn ? "verified" : state.workspace_ready ? "setup" : "unknown"),
1052
+ summary: parts.length ? parts.join(", ") : "State file present.",
1053
+ state: selected
1054
+ };
1055
+ }
1056
+ // Annotate the CommonJS export names for ESM import in node:
1057
+ 0 && (module.exports = {
1058
+ BUNDLED_RIDDLE_PROOF_DIR,
1059
+ CHECKPOINT_CONTRACT_VERSION,
1060
+ RIDDLE_PROOF_DIR_CANDIDATES,
1061
+ WORKFLOW_STAGE_ORDER,
1062
+ buildCheckpointContract,
1063
+ buildSetupArgs,
1064
+ checkpointContinueStage,
1065
+ clearStageDecisionRequest,
1066
+ ensureAction,
1067
+ ensureStageLoopState,
1068
+ invalidateVerifyEvidence,
1069
+ mergeStateFromParams,
1070
+ noImplementationModeFor,
1071
+ previewModeFromWorkflowMode,
1072
+ readState,
1073
+ recordStageAttempt,
1074
+ requiredBaselineLabelsForState,
1075
+ resolveConfig,
1076
+ resolveRiddleProofDir,
1077
+ setStageDecisionRequest,
1078
+ summarizeState,
1079
+ validateShipGate,
1080
+ visualDeltaForState,
1081
+ visualDeltaRequiredForState,
1082
+ visualDeltaShipGateReason,
1083
+ workflowFile,
1084
+ writeState
1085
+ });