@riddledc/riddle-proof 0.8.24 → 0.8.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -225,6 +225,23 @@ The same pack also points at the local generic core suite:
225
225
  python3 packages/riddle-proof/runtime/tests/trust_boundary_regression.py
226
226
  ```
227
227
 
228
+ Use the pack runner to validate the local generic core first and generate the
229
+ small serial OpenClaw handoff from the same manifest:
230
+
231
+ ```sh
232
+ riddle-proof-loop regression-pack run \
233
+ --pack oc-flow-regression \
234
+ --local-core true \
235
+ --format markdown \
236
+ --output artifacts/riddle-proof/oc-flow-regression
237
+ ```
238
+
239
+ The command writes `regression-pack-result.json`, `summary.md`, and
240
+ `oc-handoff.md` when `--output` / `--output-dir` is set. The OC handoff prompt
241
+ is generated only as wrapper/runtime validation guidance; the browser evidence,
242
+ required cases, forbidden lifecycle markers, and version gate remain owned by
243
+ the generic pack manifest.
244
+
228
245
  Before counting live wrapper runs, use the pack's runtime gate: verify
229
246
  `riddle_proof_status` reports the loaded `@riddledc/openclaw-riddle-proof` and
230
247
  `@riddledc/riddle-proof` versions. Disk package versions alone are not enough.
@@ -1,5 +1,5 @@
1
1
  export { b as runner } from '../runner-4LJ5z0D-.cjs';
2
2
  export { l as engineHarness } from '../engine-harness-LBfqbFSe.cjs';
3
3
  export { p as proofRunCore } from '../proof-run-core-C8FDUhle.cjs';
4
- export { p as proofRunEngine } from '../proof-run-engine-DI1qBmMf.cjs';
4
+ export { p as proofRunEngine } from '../proof-run-engine-D80hVFMf.cjs';
5
5
  import '../types.cjs';
@@ -1,5 +1,5 @@
1
1
  export { b as runner } from '../runner-BdQpOkZD.js';
2
2
  export { l as engineHarness } from '../engine-harness-CMACHP6A.js';
3
3
  export { p as proofRunCore } from '../proof-run-core-C8FDUhle.js';
4
- export { p as proofRunEngine } from '../proof-run-engine-Vh9uESqh.js';
4
+ export { p as proofRunEngine } from '../proof-run-engine-By7oLsF-.js';
5
5
  import '../types.js';
@@ -1,2 +1,2 @@
1
- export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from '../proof-run-engine-DI1qBmMf.cjs';
1
+ export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from '../proof-run-engine-D80hVFMf.cjs';
2
2
  import '../proof-run-core-C8FDUhle.cjs';
@@ -1,2 +1,2 @@
1
- export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from '../proof-run-engine-Vh9uESqh.js';
1
+ export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from '../proof-run-engine-By7oLsF-.js';
2
2
  import '../proof-run-core-C8FDUhle.js';
@@ -32,7 +32,8 @@ import {
32
32
  } from "./chunk-EEIYUZXE.js";
33
33
 
34
34
  // src/cli.ts
35
- import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "fs";
35
+ import { spawnSync } from "child_process";
36
+ import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, statSync, writeFileSync } from "fs";
36
37
  import path from "path";
37
38
  var RIDDLE_PROFILE_BALANCE_PREFLIGHT_MIN_SECONDS_PER_JOB = 30;
38
39
  var KNOWN_CLI_OPTIONS = /* @__PURE__ */ new Set([
@@ -73,6 +74,7 @@ var KNOWN_CLI_OPTIONS = /* @__PURE__ */ new Set([
73
74
  "intervalMs",
74
75
  "job",
75
76
  "jobId",
77
+ "localCore",
76
78
  "maxIterations",
77
79
  "navigationTimeout",
78
80
  "output",
@@ -82,6 +84,8 @@ var KNOWN_CLI_OPTIONS = /* @__PURE__ */ new Set([
82
84
  "pollAttempts",
83
85
  "pollIntervalMs",
84
86
  "port",
87
+ "pack",
88
+ "packFile",
85
89
  "profile",
86
90
  "progressEveryMs",
87
91
  "quiet",
@@ -132,6 +136,7 @@ function usage() {
132
136
  " riddle-proof-loop run-profile --profile <file|json|-> --url <base-url> [--base-url <base-url>] [--runner riddle] [--viewport-name <name[,name...]>] [--strict true|false; default false] [--split-viewports true|false; default false] [--balance-preflight true|false; default true] [--poll-attempts n] [--output <dir>|--output-dir <dir>] [--result-format json|compact-json|summary|none; default json] [--quiet]",
133
137
  " riddle-proof-loop run-profile aggregate --profile <file|json|-> --url <base-url> [--base-url <base-url>] --input-dir <dir>|--inputs <path[,path...]> [--output <dir>|--output-dir <dir>] [--result-format json|compact-json|summary|none; default json]",
134
138
  " riddle-proof-loop run-profile recover --profile <file|json|-> --url <base-url> [--base-url <base-url>] --job <job-id> [--viewport-name <name[,name...]>] [--output <dir>|--output-dir <dir>] [--result-format json|compact-json|summary|none; default json]",
139
+ " riddle-proof-loop regression-pack run [--pack oc-flow-regression|--pack-file <file>] [--local-core true|false; default true] [--format json|markdown|compact-json; default json] [--output <dir>|--output-dir <dir>]",
135
140
  " riddle-proof-loop profile-body-assertions --artifact <file|url|-> --candidates-json <file|json|-> [--required-json <file|json|->] [--format json|body-contains]",
136
141
  " riddle-proof-loop profile-http-status-preflight --profile <file|json|-> --url <base-url> [--format json|summary]",
137
142
  " riddle-proof-loop riddle-preview-deploy <build-dir> <label> [--framework spa|static]",
@@ -210,6 +215,27 @@ function runProfileViewportNamesOption(options) {
210
215
  }
211
216
  var DEFAULT_PROFILE_UNSUBMITTED_RETRY_TIMEOUT_MS = 9e4;
212
217
  var DEFAULT_PROFILE_UNSUBMITTED_RETRIES = 2;
218
+ function cliPackageRoot() {
219
+ const entryPath = process.argv[1] ? (() => {
220
+ try {
221
+ return realpathSync(process.argv[1]);
222
+ } catch {
223
+ return process.argv[1];
224
+ }
225
+ })() : "";
226
+ const candidates = [
227
+ entryPath ? path.resolve(path.dirname(entryPath), "..") : "",
228
+ path.resolve(process.cwd(), "packages", "riddle-proof"),
229
+ process.cwd()
230
+ ].filter(Boolean);
231
+ for (const candidate of candidates) {
232
+ if (existsSync(path.join(candidate, "runtime", "tests", "trust_boundary_regression.py")) && existsSync(path.join(candidate, "examples", "regression-packs"))) {
233
+ return candidate;
234
+ }
235
+ }
236
+ return candidates[0] || process.cwd();
237
+ }
238
+ var CLI_PACKAGE_ROOT = cliPackageRoot();
213
239
  function optionNumber(options, ...keys) {
214
240
  for (const key of keys) {
215
241
  const value = optionString(options, key);
@@ -290,6 +316,292 @@ function writeRunProfileResult(result, options) {
290
316
  process.stdout.write(`${JSON.stringify(result, null, 2)}
291
317
  `);
292
318
  }
319
+ function regressionPackResultFormatOption(options) {
320
+ const format = optionString(options, "format") ?? optionString(options, "resultFormat") ?? "json";
321
+ if (format === "md" || format === "summary") return "markdown";
322
+ if (format === "json" || format === "compact-json" || format === "markdown") return format;
323
+ throw new Error("--format must be json, compact-json, or markdown.");
324
+ }
325
+ function regressionPackPathForCli(options) {
326
+ const packFile = optionString(options, "packFile");
327
+ if (packFile) return path.resolve(packFile);
328
+ const pack = optionString(options, "pack") || "oc-flow-regression";
329
+ if (existsSync(pack)) return path.resolve(pack);
330
+ const normalized = pack.endsWith(".json") ? pack : `${pack}.json`;
331
+ return path.join(CLI_PACKAGE_ROOT, "examples", "regression-packs", normalized);
332
+ }
333
+ function readRegressionPackForCli(options) {
334
+ const filePath = regressionPackPathForCli(options);
335
+ if (!existsSync(filePath)) throw new Error(`Regression pack not found: ${filePath}`);
336
+ const parsed = JSON.parse(readFileSync(filePath, "utf-8"));
337
+ if (parsed.version !== "riddle-proof.regression-pack.v1") {
338
+ throw new Error(`${filePath} is not a riddle-proof.regression-pack.v1 manifest.`);
339
+ }
340
+ return { filePath, pack: parsed };
341
+ }
342
+ function regressionPackStringArray(value) {
343
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim().length > 0) : [];
344
+ }
345
+ function regressionPackRecord(value) {
346
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
347
+ }
348
+ function regressionPackCommandForLocalCore(pack) {
349
+ const suite = regressionPackRecord(pack.local_core_suite);
350
+ return cliString(suite.command) || "python3 packages/riddle-proof/runtime/tests/trust_boundary_regression.py";
351
+ }
352
+ function regressionPackLocalCoreScriptPath() {
353
+ return path.join(CLI_PACKAGE_ROOT, "runtime", "tests", "trust_boundary_regression.py");
354
+ }
355
+ function tailLines(text, limit = 40) {
356
+ const lines = text.split(/\r?\n/).filter((line) => line.trim().length > 0);
357
+ return lines.slice(-limit);
358
+ }
359
+ function parseRegressionPackLocalCoreStdout(stdout) {
360
+ try {
361
+ return JSON.parse(stdout);
362
+ } catch {
363
+ const start = stdout.indexOf("{");
364
+ const end = stdout.lastIndexOf("}");
365
+ if (start >= 0 && end > start) {
366
+ return JSON.parse(stdout.slice(start, end + 1));
367
+ }
368
+ throw new Error("Local core suite did not emit parseable JSON.");
369
+ }
370
+ }
371
+ function regressionPackCaseNames(result) {
372
+ const results = Array.isArray(result.results) ? result.results : [];
373
+ return results.map((item) => cliString(regressionPackRecord(item).name)).filter((item) => Boolean(item));
374
+ }
375
+ function regressionPackFailedCaseNames(result) {
376
+ const failed = Array.isArray(result.failed) ? result.failed : [];
377
+ const namedFailed = failed.map((item) => cliString(regressionPackRecord(item).name)).filter((item) => Boolean(item));
378
+ if (namedFailed.length) return namedFailed;
379
+ const results = Array.isArray(result.results) ? result.results : [];
380
+ return results.map(regressionPackRecord).filter((item) => item.ok === false).map((item) => cliString(item.name)).filter((item) => Boolean(item));
381
+ }
382
+ function regressionPackMarkersSeen(result, markers) {
383
+ const encoded = JSON.stringify(result);
384
+ return markers.filter((marker) => encoded.includes(marker));
385
+ }
386
+ function runRegressionPackLocalCore(pack) {
387
+ const script = regressionPackLocalCoreScriptPath();
388
+ const suite = regressionPackRecord(pack.local_core_suite);
389
+ const requiredCases = regressionPackStringArray(suite.required_cases);
390
+ const forbiddenMarkers = regressionPackStringArray(pack.forbidden_terminal_markers);
391
+ const command = regressionPackCommandForLocalCore(pack);
392
+ const startedAt = (/* @__PURE__ */ new Date()).toISOString();
393
+ if (!existsSync(script)) {
394
+ return {
395
+ requested: true,
396
+ ok: false,
397
+ command,
398
+ started_at: startedAt,
399
+ finished_at: (/* @__PURE__ */ new Date()).toISOString(),
400
+ error: `Local core suite script not found: ${script}`,
401
+ required_cases: requiredCases,
402
+ missing_required_cases: requiredCases,
403
+ forbidden_terminal_markers_seen: []
404
+ };
405
+ }
406
+ const child = spawnSync("python3", [script], {
407
+ cwd: CLI_PACKAGE_ROOT,
408
+ encoding: "utf-8",
409
+ timeout: 12e4
410
+ });
411
+ const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
412
+ let parsed = null;
413
+ let parseError;
414
+ try {
415
+ parsed = parseRegressionPackLocalCoreStdout(child.stdout || "");
416
+ } catch (error) {
417
+ parseError = error instanceof Error ? error.message : String(error);
418
+ }
419
+ const caseNames = parsed ? regressionPackCaseNames(parsed) : [];
420
+ const missingRequiredCases = requiredCases.filter((caseId) => !caseNames.includes(caseId));
421
+ const failedCases = parsed ? regressionPackFailedCaseNames(parsed) : [];
422
+ const markersSeen = parsed ? regressionPackMarkersSeen(parsed, forbiddenMarkers) : [];
423
+ const ok = child.status === 0 && parsed?.ok === true && !missingRequiredCases.length && !failedCases.length && !markersSeen.length;
424
+ return {
425
+ requested: true,
426
+ ok,
427
+ command,
428
+ executed: {
429
+ binary: "python3",
430
+ args: [path.relative(CLI_PACKAGE_ROOT, script)],
431
+ cwd: CLI_PACKAGE_ROOT
432
+ },
433
+ exit_code: child.status,
434
+ signal: child.signal,
435
+ started_at: startedAt,
436
+ finished_at: finishedAt,
437
+ suite: cliString(parsed?.suite) || null,
438
+ case_count: typeof parsed?.case_count === "number" ? parsed.case_count : caseNames.length,
439
+ passed_case_count: caseNames.length - failedCases.length,
440
+ required_cases: requiredCases,
441
+ observed_cases: caseNames,
442
+ missing_required_cases: missingRequiredCases,
443
+ failed_cases: failedCases,
444
+ forbidden_terminal_markers_seen: markersSeen,
445
+ parse_error: parseError,
446
+ stderr_tail: tailLines(child.stderr || ""),
447
+ stdout_tail: ok ? void 0 : tailLines(child.stdout || "")
448
+ };
449
+ }
450
+ function openClawHandoffPromptForRegressionPack(pack, input) {
451
+ const minimumVersions = regressionPackRecord(pack.minimum_versions);
452
+ const runtimeGate = regressionPackRecord(pack.runtime_gate);
453
+ const liveSuite = regressionPackRecord(pack.openclaw_live_suite);
454
+ const target = regressionPackRecord(liveSuite.target);
455
+ const cases = Array.isArray(liveSuite.cases) ? liveSuite.cases.map(regressionPackRecord) : [];
456
+ const fields = regressionPackStringArray(liveSuite.result_log_fields);
457
+ const forbiddenMarkers = regressionPackStringArray(pack.forbidden_terminal_markers);
458
+ const lines = [
459
+ "Run the Riddle Proof OC flow regression pack in small serial chunks.",
460
+ "",
461
+ `First call ${cliString(runtimeGate.tool) || "riddle_proof_status"} and count only fresh loaded-runtime runs. Required loaded versions are at least:`,
462
+ ...Object.entries(minimumVersions).map(([name, version]) => `- ${name}: ${version}`),
463
+ "",
464
+ "Target/default flags:",
465
+ ...Object.entries(target).map(([key, value]) => `- ${key}: ${JSON.stringify(value)}`),
466
+ "",
467
+ "Rules:",
468
+ "- Run cases serially, not as one broad parallel batch.",
469
+ "- If loaded metadata is stale, stop and restart/reload the gateway before counting results.",
470
+ "- If any generic lifecycle marker appears, report the exact marker and artifact, then stop the counted batch.",
471
+ `- Forbidden terminal markers: ${forbiddenMarkers.join(", ") || "none"}.`,
472
+ fields.length ? `- Log fields for every counted run: ${fields.join(", ")}.` : "",
473
+ "",
474
+ "Cases:",
475
+ ...cases.map((testCase, index) => {
476
+ const expect = regressionPackRecord(testCase.expect);
477
+ return [
478
+ `${index + 1}. ${cliString(testCase.id) || "unnamed-case"}: ${cliString(testCase.intent) || "no intent"}`,
479
+ ` Expect: ${JSON.stringify(expect)}`
480
+ ].join("\n");
481
+ }),
482
+ "",
483
+ input.localCoreOk ? "Local generic core suite is green, so OC should only be validating wrapper/runtime behavior." : "Local generic core suite is not green or was not run; do not count OC failures as wrapper-only until local core is green."
484
+ ].filter((line) => line !== "");
485
+ return lines.join("\n");
486
+ }
487
+ function compactRegressionPackRunResult(result) {
488
+ const localCore = regressionPackRecord(result.local_core);
489
+ const openClaw = regressionPackRecord(result.openclaw_live_suite);
490
+ return {
491
+ version: result.version,
492
+ pack_id: result.pack_id,
493
+ ok: result.ok,
494
+ local_core: {
495
+ requested: localCore.requested,
496
+ ok: localCore.ok,
497
+ command: localCore.command,
498
+ case_count: localCore.case_count,
499
+ missing_required_cases: localCore.missing_required_cases,
500
+ failed_cases: localCore.failed_cases,
501
+ forbidden_terminal_markers_seen: localCore.forbidden_terminal_markers_seen
502
+ },
503
+ openclaw_live_case_count: openClaw.case_count,
504
+ output_dir: result.output_dir
505
+ };
506
+ }
507
+ function regressionPackRunMarkdown(result) {
508
+ const localCore = regressionPackRecord(result.local_core);
509
+ const runtimeGate = regressionPackRecord(result.runtime_gate);
510
+ const minimumVersions = regressionPackRecord(result.minimum_versions);
511
+ const openClaw = regressionPackRecord(result.openclaw_live_suite);
512
+ const lines = [
513
+ `# ${cliString(result.public_name) || cliString(result.pack_id) || "Riddle Proof Regression Pack"}`,
514
+ "",
515
+ `Status: ${result.ok ? "passed" : "failed"}`,
516
+ `Pack: ${cliString(result.pack_id) || "unknown"}`,
517
+ "",
518
+ "## Local Core",
519
+ "",
520
+ `- requested: ${localCore.requested === true}`,
521
+ `- ok: ${localCore.ok === true}`,
522
+ `- command: ${cliString(localCore.command) || "n/a"}`,
523
+ `- cases: ${localCore.case_count ?? "n/a"}`,
524
+ `- missing required: ${regressionPackStringArray(localCore.missing_required_cases).join(", ") || "none"}`,
525
+ `- failed cases: ${regressionPackStringArray(localCore.failed_cases).join(", ") || "none"}`,
526
+ `- forbidden markers seen: ${regressionPackStringArray(localCore.forbidden_terminal_markers_seen).join(", ") || "none"}`,
527
+ "",
528
+ "## Runtime Gate",
529
+ "",
530
+ `- tool: ${cliString(runtimeGate.tool) || "n/a"}`,
531
+ ...Object.entries(minimumVersions).map(([name, version]) => `- ${name}: ${version}`),
532
+ "",
533
+ "## OpenClaw Live Suite",
534
+ "",
535
+ `- case count: ${openClaw.case_count ?? "n/a"}`,
536
+ `- result log fields: ${regressionPackStringArray(openClaw.result_log_fields).join(", ") || "n/a"}`,
537
+ "",
538
+ "## OC Handoff Prompt",
539
+ "",
540
+ "```text",
541
+ cliString(result.openclaw_handoff_prompt) || "",
542
+ "```",
543
+ ""
544
+ ];
545
+ return `${lines.join("\n")}
546
+ `;
547
+ }
548
+ function writeRegressionPackOutput(outputDir, result) {
549
+ if (!outputDir) return;
550
+ mkdirSync(outputDir, { recursive: true });
551
+ writeFileSync(path.join(outputDir, "regression-pack-result.json"), `${JSON.stringify(result, null, 2)}
552
+ `);
553
+ writeFileSync(path.join(outputDir, "summary.md"), regressionPackRunMarkdown(result));
554
+ writeFileSync(path.join(outputDir, "oc-handoff.md"), `${cliString(result.openclaw_handoff_prompt) || ""}
555
+ `);
556
+ }
557
+ function runRegressionPackForCli(options) {
558
+ const { filePath, pack } = readRegressionPackForCli(options);
559
+ const localCoreRequested = optionBoolean(options, "localCore") ?? true;
560
+ const localCore = localCoreRequested ? runRegressionPackLocalCore(pack) : { requested: false, ok: true, command: regressionPackCommandForLocalCore(pack) };
561
+ const liveSuite = regressionPackRecord(pack.openclaw_live_suite);
562
+ const liveCases = Array.isArray(liveSuite.cases) ? liveSuite.cases : [];
563
+ const localCoreRecord = regressionPackRecord(localCore);
564
+ const localCoreValidated = localCoreRecord.requested === true && localCoreRecord.ok === true;
565
+ const ok = localCoreRequested ? localCoreValidated : true;
566
+ const result = {
567
+ version: "riddle-proof.regression-pack-run-result.v1",
568
+ ok,
569
+ local_core_validated: localCoreValidated,
570
+ generated_at: (/* @__PURE__ */ new Date()).toISOString(),
571
+ pack_path: filePath,
572
+ pack_id: cliString(pack.pack_id) || null,
573
+ public_name: cliString(pack.public_name) || null,
574
+ description: cliString(pack.description) || null,
575
+ minimum_versions: regressionPackRecord(pack.minimum_versions),
576
+ runtime_gate: regressionPackRecord(pack.runtime_gate),
577
+ forbidden_terminal_markers: regressionPackStringArray(pack.forbidden_terminal_markers),
578
+ local_core: localCore,
579
+ openclaw_live_suite: {
580
+ target: regressionPackRecord(liveSuite.target),
581
+ result_log_fields: regressionPackStringArray(liveSuite.result_log_fields),
582
+ case_count: liveCases.length,
583
+ case_ids: liveCases.map((item) => cliString(regressionPackRecord(item).id)).filter(Boolean)
584
+ },
585
+ openclaw_handoff_prompt: openClawHandoffPromptForRegressionPack(pack, { localCoreOk: localCoreValidated }),
586
+ output_dir: profileOutputDirOption(options) || null
587
+ };
588
+ writeRegressionPackOutput(profileOutputDirOption(options), result);
589
+ return result;
590
+ }
591
+ function writeRegressionPackRunResult(result, options) {
592
+ const format = regressionPackResultFormatOption(options);
593
+ if (format === "markdown") {
594
+ process.stdout.write(regressionPackRunMarkdown(result));
595
+ return;
596
+ }
597
+ if (format === "compact-json") {
598
+ process.stdout.write(`${JSON.stringify(compactRegressionPackRunResult(result), null, 2)}
599
+ `);
600
+ return;
601
+ }
602
+ process.stdout.write(`${JSON.stringify(result, null, 2)}
603
+ `);
604
+ }
293
605
  function previewFrameworkOption(options) {
294
606
  const framework = optionString(options, "framework") ?? "static";
295
607
  if (framework === "spa" || framework === "static") return framework;
@@ -3954,6 +4266,14 @@ async function main() {
3954
4266
  process.exitCode = profileStatusExitCode(profile, result.status);
3955
4267
  return;
3956
4268
  }
4269
+ if (command === "regression-pack") {
4270
+ const action = positional[1] || "run";
4271
+ if (action !== "run") throw new Error("Only `regression-pack run` is supported.");
4272
+ const result = runRegressionPackForCli(options);
4273
+ writeRegressionPackRunResult(result, options);
4274
+ process.exitCode = result.ok ? 0 : 1;
4275
+ return;
4276
+ }
3957
4277
  if (command === "profile-http-status-preflight") {
3958
4278
  const profile = normalizeProfileForCli(options);
3959
4279
  const result = await preflightRiddleProofProfileHttpStatusChecks(profile);
package/dist/cli/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import "../chunk-UTQJHWCQ.js";
1
+ import "../chunk-27AB2TEQ.js";
2
2
  import "../chunk-PEWAIEER.js";
3
3
  import "../chunk-TWTEUS7R.js";
4
4
  import "../chunk-2DW2LBUD.js";
package/dist/cli.cjs CHANGED
@@ -3156,6 +3156,7 @@ var init_proof_run_engine = __esm({
3156
3156
  });
3157
3157
 
3158
3158
  // src/cli.ts
3159
+ var import_node_child_process5 = require("child_process");
3159
3160
  var import_node_fs6 = require("fs");
3160
3161
  var import_node_path6 = __toESM(require("path"), 1);
3161
3162
 
@@ -16851,6 +16852,7 @@ var KNOWN_CLI_OPTIONS = /* @__PURE__ */ new Set([
16851
16852
  "intervalMs",
16852
16853
  "job",
16853
16854
  "jobId",
16855
+ "localCore",
16854
16856
  "maxIterations",
16855
16857
  "navigationTimeout",
16856
16858
  "output",
@@ -16860,6 +16862,8 @@ var KNOWN_CLI_OPTIONS = /* @__PURE__ */ new Set([
16860
16862
  "pollAttempts",
16861
16863
  "pollIntervalMs",
16862
16864
  "port",
16865
+ "pack",
16866
+ "packFile",
16863
16867
  "profile",
16864
16868
  "progressEveryMs",
16865
16869
  "quiet",
@@ -16910,6 +16914,7 @@ function usage() {
16910
16914
  " riddle-proof-loop run-profile --profile <file|json|-> --url <base-url> [--base-url <base-url>] [--runner riddle] [--viewport-name <name[,name...]>] [--strict true|false; default false] [--split-viewports true|false; default false] [--balance-preflight true|false; default true] [--poll-attempts n] [--output <dir>|--output-dir <dir>] [--result-format json|compact-json|summary|none; default json] [--quiet]",
16911
16915
  " riddle-proof-loop run-profile aggregate --profile <file|json|-> --url <base-url> [--base-url <base-url>] --input-dir <dir>|--inputs <path[,path...]> [--output <dir>|--output-dir <dir>] [--result-format json|compact-json|summary|none; default json]",
16912
16916
  " riddle-proof-loop run-profile recover --profile <file|json|-> --url <base-url> [--base-url <base-url>] --job <job-id> [--viewport-name <name[,name...]>] [--output <dir>|--output-dir <dir>] [--result-format json|compact-json|summary|none; default json]",
16917
+ " riddle-proof-loop regression-pack run [--pack oc-flow-regression|--pack-file <file>] [--local-core true|false; default true] [--format json|markdown|compact-json; default json] [--output <dir>|--output-dir <dir>]",
16913
16918
  " riddle-proof-loop profile-body-assertions --artifact <file|url|-> --candidates-json <file|json|-> [--required-json <file|json|->] [--format json|body-contains]",
16914
16919
  " riddle-proof-loop profile-http-status-preflight --profile <file|json|-> --url <base-url> [--format json|summary]",
16915
16920
  " riddle-proof-loop riddle-preview-deploy <build-dir> <label> [--framework spa|static]",
@@ -16988,6 +16993,27 @@ function runProfileViewportNamesOption(options) {
16988
16993
  }
16989
16994
  var DEFAULT_PROFILE_UNSUBMITTED_RETRY_TIMEOUT_MS = 9e4;
16990
16995
  var DEFAULT_PROFILE_UNSUBMITTED_RETRIES = 2;
16996
+ function cliPackageRoot() {
16997
+ const entryPath = process.argv[1] ? (() => {
16998
+ try {
16999
+ return (0, import_node_fs6.realpathSync)(process.argv[1]);
17000
+ } catch {
17001
+ return process.argv[1];
17002
+ }
17003
+ })() : "";
17004
+ const candidates = [
17005
+ entryPath ? import_node_path6.default.resolve(import_node_path6.default.dirname(entryPath), "..") : "",
17006
+ import_node_path6.default.resolve(process.cwd(), "packages", "riddle-proof"),
17007
+ process.cwd()
17008
+ ].filter(Boolean);
17009
+ for (const candidate of candidates) {
17010
+ if ((0, import_node_fs6.existsSync)(import_node_path6.default.join(candidate, "runtime", "tests", "trust_boundary_regression.py")) && (0, import_node_fs6.existsSync)(import_node_path6.default.join(candidate, "examples", "regression-packs"))) {
17011
+ return candidate;
17012
+ }
17013
+ }
17014
+ return candidates[0] || process.cwd();
17015
+ }
17016
+ var CLI_PACKAGE_ROOT = cliPackageRoot();
16991
17017
  function optionNumber(options, ...keys) {
16992
17018
  for (const key of keys) {
16993
17019
  const value = optionString(options, key);
@@ -17068,6 +17094,292 @@ function writeRunProfileResult(result, options) {
17068
17094
  process.stdout.write(`${JSON.stringify(result, null, 2)}
17069
17095
  `);
17070
17096
  }
17097
+ function regressionPackResultFormatOption(options) {
17098
+ const format = optionString(options, "format") ?? optionString(options, "resultFormat") ?? "json";
17099
+ if (format === "md" || format === "summary") return "markdown";
17100
+ if (format === "json" || format === "compact-json" || format === "markdown") return format;
17101
+ throw new Error("--format must be json, compact-json, or markdown.");
17102
+ }
17103
+ function regressionPackPathForCli(options) {
17104
+ const packFile = optionString(options, "packFile");
17105
+ if (packFile) return import_node_path6.default.resolve(packFile);
17106
+ const pack = optionString(options, "pack") || "oc-flow-regression";
17107
+ if ((0, import_node_fs6.existsSync)(pack)) return import_node_path6.default.resolve(pack);
17108
+ const normalized = pack.endsWith(".json") ? pack : `${pack}.json`;
17109
+ return import_node_path6.default.join(CLI_PACKAGE_ROOT, "examples", "regression-packs", normalized);
17110
+ }
17111
+ function readRegressionPackForCli(options) {
17112
+ const filePath = regressionPackPathForCli(options);
17113
+ if (!(0, import_node_fs6.existsSync)(filePath)) throw new Error(`Regression pack not found: ${filePath}`);
17114
+ const parsed = JSON.parse((0, import_node_fs6.readFileSync)(filePath, "utf-8"));
17115
+ if (parsed.version !== "riddle-proof.regression-pack.v1") {
17116
+ throw new Error(`${filePath} is not a riddle-proof.regression-pack.v1 manifest.`);
17117
+ }
17118
+ return { filePath, pack: parsed };
17119
+ }
17120
+ function regressionPackStringArray(value) {
17121
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim().length > 0) : [];
17122
+ }
17123
+ function regressionPackRecord(value) {
17124
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
17125
+ }
17126
+ function regressionPackCommandForLocalCore(pack) {
17127
+ const suite = regressionPackRecord(pack.local_core_suite);
17128
+ return cliString(suite.command) || "python3 packages/riddle-proof/runtime/tests/trust_boundary_regression.py";
17129
+ }
17130
+ function regressionPackLocalCoreScriptPath() {
17131
+ return import_node_path6.default.join(CLI_PACKAGE_ROOT, "runtime", "tests", "trust_boundary_regression.py");
17132
+ }
17133
+ function tailLines(text, limit = 40) {
17134
+ const lines = text.split(/\r?\n/).filter((line) => line.trim().length > 0);
17135
+ return lines.slice(-limit);
17136
+ }
17137
+ function parseRegressionPackLocalCoreStdout(stdout) {
17138
+ try {
17139
+ return JSON.parse(stdout);
17140
+ } catch {
17141
+ const start = stdout.indexOf("{");
17142
+ const end = stdout.lastIndexOf("}");
17143
+ if (start >= 0 && end > start) {
17144
+ return JSON.parse(stdout.slice(start, end + 1));
17145
+ }
17146
+ throw new Error("Local core suite did not emit parseable JSON.");
17147
+ }
17148
+ }
17149
+ function regressionPackCaseNames(result) {
17150
+ const results = Array.isArray(result.results) ? result.results : [];
17151
+ return results.map((item) => cliString(regressionPackRecord(item).name)).filter((item) => Boolean(item));
17152
+ }
17153
+ function regressionPackFailedCaseNames(result) {
17154
+ const failed = Array.isArray(result.failed) ? result.failed : [];
17155
+ const namedFailed = failed.map((item) => cliString(regressionPackRecord(item).name)).filter((item) => Boolean(item));
17156
+ if (namedFailed.length) return namedFailed;
17157
+ const results = Array.isArray(result.results) ? result.results : [];
17158
+ return results.map(regressionPackRecord).filter((item) => item.ok === false).map((item) => cliString(item.name)).filter((item) => Boolean(item));
17159
+ }
17160
+ function regressionPackMarkersSeen(result, markers) {
17161
+ const encoded = JSON.stringify(result);
17162
+ return markers.filter((marker) => encoded.includes(marker));
17163
+ }
17164
+ function runRegressionPackLocalCore(pack) {
17165
+ const script = regressionPackLocalCoreScriptPath();
17166
+ const suite = regressionPackRecord(pack.local_core_suite);
17167
+ const requiredCases = regressionPackStringArray(suite.required_cases);
17168
+ const forbiddenMarkers = regressionPackStringArray(pack.forbidden_terminal_markers);
17169
+ const command = regressionPackCommandForLocalCore(pack);
17170
+ const startedAt = (/* @__PURE__ */ new Date()).toISOString();
17171
+ if (!(0, import_node_fs6.existsSync)(script)) {
17172
+ return {
17173
+ requested: true,
17174
+ ok: false,
17175
+ command,
17176
+ started_at: startedAt,
17177
+ finished_at: (/* @__PURE__ */ new Date()).toISOString(),
17178
+ error: `Local core suite script not found: ${script}`,
17179
+ required_cases: requiredCases,
17180
+ missing_required_cases: requiredCases,
17181
+ forbidden_terminal_markers_seen: []
17182
+ };
17183
+ }
17184
+ const child = (0, import_node_child_process5.spawnSync)("python3", [script], {
17185
+ cwd: CLI_PACKAGE_ROOT,
17186
+ encoding: "utf-8",
17187
+ timeout: 12e4
17188
+ });
17189
+ const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
17190
+ let parsed = null;
17191
+ let parseError;
17192
+ try {
17193
+ parsed = parseRegressionPackLocalCoreStdout(child.stdout || "");
17194
+ } catch (error) {
17195
+ parseError = error instanceof Error ? error.message : String(error);
17196
+ }
17197
+ const caseNames = parsed ? regressionPackCaseNames(parsed) : [];
17198
+ const missingRequiredCases = requiredCases.filter((caseId) => !caseNames.includes(caseId));
17199
+ const failedCases = parsed ? regressionPackFailedCaseNames(parsed) : [];
17200
+ const markersSeen = parsed ? regressionPackMarkersSeen(parsed, forbiddenMarkers) : [];
17201
+ const ok = child.status === 0 && parsed?.ok === true && !missingRequiredCases.length && !failedCases.length && !markersSeen.length;
17202
+ return {
17203
+ requested: true,
17204
+ ok,
17205
+ command,
17206
+ executed: {
17207
+ binary: "python3",
17208
+ args: [import_node_path6.default.relative(CLI_PACKAGE_ROOT, script)],
17209
+ cwd: CLI_PACKAGE_ROOT
17210
+ },
17211
+ exit_code: child.status,
17212
+ signal: child.signal,
17213
+ started_at: startedAt,
17214
+ finished_at: finishedAt,
17215
+ suite: cliString(parsed?.suite) || null,
17216
+ case_count: typeof parsed?.case_count === "number" ? parsed.case_count : caseNames.length,
17217
+ passed_case_count: caseNames.length - failedCases.length,
17218
+ required_cases: requiredCases,
17219
+ observed_cases: caseNames,
17220
+ missing_required_cases: missingRequiredCases,
17221
+ failed_cases: failedCases,
17222
+ forbidden_terminal_markers_seen: markersSeen,
17223
+ parse_error: parseError,
17224
+ stderr_tail: tailLines(child.stderr || ""),
17225
+ stdout_tail: ok ? void 0 : tailLines(child.stdout || "")
17226
+ };
17227
+ }
17228
+ function openClawHandoffPromptForRegressionPack(pack, input) {
17229
+ const minimumVersions = regressionPackRecord(pack.minimum_versions);
17230
+ const runtimeGate = regressionPackRecord(pack.runtime_gate);
17231
+ const liveSuite = regressionPackRecord(pack.openclaw_live_suite);
17232
+ const target = regressionPackRecord(liveSuite.target);
17233
+ const cases = Array.isArray(liveSuite.cases) ? liveSuite.cases.map(regressionPackRecord) : [];
17234
+ const fields = regressionPackStringArray(liveSuite.result_log_fields);
17235
+ const forbiddenMarkers = regressionPackStringArray(pack.forbidden_terminal_markers);
17236
+ const lines = [
17237
+ "Run the Riddle Proof OC flow regression pack in small serial chunks.",
17238
+ "",
17239
+ `First call ${cliString(runtimeGate.tool) || "riddle_proof_status"} and count only fresh loaded-runtime runs. Required loaded versions are at least:`,
17240
+ ...Object.entries(minimumVersions).map(([name, version]) => `- ${name}: ${version}`),
17241
+ "",
17242
+ "Target/default flags:",
17243
+ ...Object.entries(target).map(([key, value]) => `- ${key}: ${JSON.stringify(value)}`),
17244
+ "",
17245
+ "Rules:",
17246
+ "- Run cases serially, not as one broad parallel batch.",
17247
+ "- If loaded metadata is stale, stop and restart/reload the gateway before counting results.",
17248
+ "- If any generic lifecycle marker appears, report the exact marker and artifact, then stop the counted batch.",
17249
+ `- Forbidden terminal markers: ${forbiddenMarkers.join(", ") || "none"}.`,
17250
+ fields.length ? `- Log fields for every counted run: ${fields.join(", ")}.` : "",
17251
+ "",
17252
+ "Cases:",
17253
+ ...cases.map((testCase, index) => {
17254
+ const expect = regressionPackRecord(testCase.expect);
17255
+ return [
17256
+ `${index + 1}. ${cliString(testCase.id) || "unnamed-case"}: ${cliString(testCase.intent) || "no intent"}`,
17257
+ ` Expect: ${JSON.stringify(expect)}`
17258
+ ].join("\n");
17259
+ }),
17260
+ "",
17261
+ input.localCoreOk ? "Local generic core suite is green, so OC should only be validating wrapper/runtime behavior." : "Local generic core suite is not green or was not run; do not count OC failures as wrapper-only until local core is green."
17262
+ ].filter((line) => line !== "");
17263
+ return lines.join("\n");
17264
+ }
17265
+ function compactRegressionPackRunResult(result) {
17266
+ const localCore = regressionPackRecord(result.local_core);
17267
+ const openClaw = regressionPackRecord(result.openclaw_live_suite);
17268
+ return {
17269
+ version: result.version,
17270
+ pack_id: result.pack_id,
17271
+ ok: result.ok,
17272
+ local_core: {
17273
+ requested: localCore.requested,
17274
+ ok: localCore.ok,
17275
+ command: localCore.command,
17276
+ case_count: localCore.case_count,
17277
+ missing_required_cases: localCore.missing_required_cases,
17278
+ failed_cases: localCore.failed_cases,
17279
+ forbidden_terminal_markers_seen: localCore.forbidden_terminal_markers_seen
17280
+ },
17281
+ openclaw_live_case_count: openClaw.case_count,
17282
+ output_dir: result.output_dir
17283
+ };
17284
+ }
17285
+ function regressionPackRunMarkdown(result) {
17286
+ const localCore = regressionPackRecord(result.local_core);
17287
+ const runtimeGate = regressionPackRecord(result.runtime_gate);
17288
+ const minimumVersions = regressionPackRecord(result.minimum_versions);
17289
+ const openClaw = regressionPackRecord(result.openclaw_live_suite);
17290
+ const lines = [
17291
+ `# ${cliString(result.public_name) || cliString(result.pack_id) || "Riddle Proof Regression Pack"}`,
17292
+ "",
17293
+ `Status: ${result.ok ? "passed" : "failed"}`,
17294
+ `Pack: ${cliString(result.pack_id) || "unknown"}`,
17295
+ "",
17296
+ "## Local Core",
17297
+ "",
17298
+ `- requested: ${localCore.requested === true}`,
17299
+ `- ok: ${localCore.ok === true}`,
17300
+ `- command: ${cliString(localCore.command) || "n/a"}`,
17301
+ `- cases: ${localCore.case_count ?? "n/a"}`,
17302
+ `- missing required: ${regressionPackStringArray(localCore.missing_required_cases).join(", ") || "none"}`,
17303
+ `- failed cases: ${regressionPackStringArray(localCore.failed_cases).join(", ") || "none"}`,
17304
+ `- forbidden markers seen: ${regressionPackStringArray(localCore.forbidden_terminal_markers_seen).join(", ") || "none"}`,
17305
+ "",
17306
+ "## Runtime Gate",
17307
+ "",
17308
+ `- tool: ${cliString(runtimeGate.tool) || "n/a"}`,
17309
+ ...Object.entries(minimumVersions).map(([name, version]) => `- ${name}: ${version}`),
17310
+ "",
17311
+ "## OpenClaw Live Suite",
17312
+ "",
17313
+ `- case count: ${openClaw.case_count ?? "n/a"}`,
17314
+ `- result log fields: ${regressionPackStringArray(openClaw.result_log_fields).join(", ") || "n/a"}`,
17315
+ "",
17316
+ "## OC Handoff Prompt",
17317
+ "",
17318
+ "```text",
17319
+ cliString(result.openclaw_handoff_prompt) || "",
17320
+ "```",
17321
+ ""
17322
+ ];
17323
+ return `${lines.join("\n")}
17324
+ `;
17325
+ }
17326
+ function writeRegressionPackOutput(outputDir, result) {
17327
+ if (!outputDir) return;
17328
+ (0, import_node_fs6.mkdirSync)(outputDir, { recursive: true });
17329
+ (0, import_node_fs6.writeFileSync)(import_node_path6.default.join(outputDir, "regression-pack-result.json"), `${JSON.stringify(result, null, 2)}
17330
+ `);
17331
+ (0, import_node_fs6.writeFileSync)(import_node_path6.default.join(outputDir, "summary.md"), regressionPackRunMarkdown(result));
17332
+ (0, import_node_fs6.writeFileSync)(import_node_path6.default.join(outputDir, "oc-handoff.md"), `${cliString(result.openclaw_handoff_prompt) || ""}
17333
+ `);
17334
+ }
17335
+ function runRegressionPackForCli(options) {
17336
+ const { filePath, pack } = readRegressionPackForCli(options);
17337
+ const localCoreRequested = optionBoolean(options, "localCore") ?? true;
17338
+ const localCore = localCoreRequested ? runRegressionPackLocalCore(pack) : { requested: false, ok: true, command: regressionPackCommandForLocalCore(pack) };
17339
+ const liveSuite = regressionPackRecord(pack.openclaw_live_suite);
17340
+ const liveCases = Array.isArray(liveSuite.cases) ? liveSuite.cases : [];
17341
+ const localCoreRecord = regressionPackRecord(localCore);
17342
+ const localCoreValidated = localCoreRecord.requested === true && localCoreRecord.ok === true;
17343
+ const ok = localCoreRequested ? localCoreValidated : true;
17344
+ const result = {
17345
+ version: "riddle-proof.regression-pack-run-result.v1",
17346
+ ok,
17347
+ local_core_validated: localCoreValidated,
17348
+ generated_at: (/* @__PURE__ */ new Date()).toISOString(),
17349
+ pack_path: filePath,
17350
+ pack_id: cliString(pack.pack_id) || null,
17351
+ public_name: cliString(pack.public_name) || null,
17352
+ description: cliString(pack.description) || null,
17353
+ minimum_versions: regressionPackRecord(pack.minimum_versions),
17354
+ runtime_gate: regressionPackRecord(pack.runtime_gate),
17355
+ forbidden_terminal_markers: regressionPackStringArray(pack.forbidden_terminal_markers),
17356
+ local_core: localCore,
17357
+ openclaw_live_suite: {
17358
+ target: regressionPackRecord(liveSuite.target),
17359
+ result_log_fields: regressionPackStringArray(liveSuite.result_log_fields),
17360
+ case_count: liveCases.length,
17361
+ case_ids: liveCases.map((item) => cliString(regressionPackRecord(item).id)).filter(Boolean)
17362
+ },
17363
+ openclaw_handoff_prompt: openClawHandoffPromptForRegressionPack(pack, { localCoreOk: localCoreValidated }),
17364
+ output_dir: profileOutputDirOption(options) || null
17365
+ };
17366
+ writeRegressionPackOutput(profileOutputDirOption(options), result);
17367
+ return result;
17368
+ }
17369
+ function writeRegressionPackRunResult(result, options) {
17370
+ const format = regressionPackResultFormatOption(options);
17371
+ if (format === "markdown") {
17372
+ process.stdout.write(regressionPackRunMarkdown(result));
17373
+ return;
17374
+ }
17375
+ if (format === "compact-json") {
17376
+ process.stdout.write(`${JSON.stringify(compactRegressionPackRunResult(result), null, 2)}
17377
+ `);
17378
+ return;
17379
+ }
17380
+ process.stdout.write(`${JSON.stringify(result, null, 2)}
17381
+ `);
17382
+ }
17071
17383
  function previewFrameworkOption(options) {
17072
17384
  const framework = optionString(options, "framework") ?? "static";
17073
17385
  if (framework === "spa" || framework === "static") return framework;
@@ -20732,6 +21044,14 @@ async function main() {
20732
21044
  process.exitCode = profileStatusExitCode(profile, result.status);
20733
21045
  return;
20734
21046
  }
21047
+ if (command === "regression-pack") {
21048
+ const action = positional[1] || "run";
21049
+ if (action !== "run") throw new Error("Only `regression-pack run` is supported.");
21050
+ const result = runRegressionPackForCli(options);
21051
+ writeRegressionPackRunResult(result, options);
21052
+ process.exitCode = result.ok ? 0 : 1;
21053
+ return;
21054
+ }
20735
21055
  if (command === "profile-http-status-preflight") {
20736
21056
  const profile = normalizeProfileForCli(options);
20737
21057
  const result = await preflightRiddleProofProfileHttpStatusChecks(profile);
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-UTQJHWCQ.js";
2
+ import "./chunk-27AB2TEQ.js";
3
3
  import "./chunk-PEWAIEER.js";
4
4
  import "./chunk-TWTEUS7R.js";
5
5
  import "./chunk-2DW2LBUD.js";
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
292
292
  blocking?: boolean;
293
293
  details?: Record<string, unknown>;
294
294
  ok: boolean;
295
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
295
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
296
296
  state_path: string;
297
297
  stage: any;
298
298
  summary: string;
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
382
382
  continueWithStage?: WorkflowStage | null;
383
383
  blocking?: boolean;
384
384
  details?: Record<string, unknown>;
385
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
385
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
386
386
  state_path: string;
387
387
  stage: any;
388
388
  checkpoint: string;
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
659
659
  error?: undefined;
660
660
  } | {
661
661
  ok: boolean;
662
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship";
662
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup";
663
663
  state_path: string;
664
664
  stage: any;
665
665
  summary: string;
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
292
292
  blocking?: boolean;
293
293
  details?: Record<string, unknown>;
294
294
  ok: boolean;
295
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
295
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
296
296
  state_path: string;
297
297
  stage: any;
298
298
  summary: string;
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
382
382
  continueWithStage?: WorkflowStage | null;
383
383
  blocking?: boolean;
384
384
  details?: Record<string, unknown>;
385
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
385
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
386
386
  state_path: string;
387
387
  stage: any;
388
388
  checkpoint: string;
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
659
659
  error?: undefined;
660
660
  } | {
661
661
  ok: boolean;
662
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship";
662
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup";
663
663
  state_path: string;
664
664
  stage: any;
665
665
  summary: string;
@@ -1,2 +1,2 @@
1
1
  import './proof-run-core-C8FDUhle.cjs';
2
- export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from './proof-run-engine-DI1qBmMf.cjs';
2
+ export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from './proof-run-engine-D80hVFMf.cjs';
@@ -1,2 +1,2 @@
1
1
  import './proof-run-core-C8FDUhle.js';
2
- export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from './proof-run-engine-Vh9uESqh.js';
2
+ export { R as RiddleProofEngine, c as createRiddleProofEngine, e as executeWorkflow } from './proof-run-engine-By7oLsF-.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.8.24",
3
+ "version": "0.8.25",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",