@riddledc/riddle-proof 0.7.224 → 0.7.226

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.
@@ -463,6 +463,24 @@ function visualDeltaFromState(fullState) {
463
463
  const proofAssessmentRequest = recordValue(fullState.proof_assessment_request);
464
464
  return recordValue(proofAssessmentRequest?.visual_delta) || null;
465
465
  }
466
+ function normalizedText(value) {
467
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
468
+ }
469
+ function noImplementationModeForCheckpoint(request, fullState) {
470
+ const requestRecord = recordValue(request) || {};
471
+ const mode = normalizedText(
472
+ requestRecord.mode || requestRecord.workflow_mode || fullState.mode || fullState.workflow_mode
473
+ );
474
+ const implementationMode = normalizedText(requestRecord.implementation_mode || fullState.implementation_mode);
475
+ const requireDiff = requestRecord.require_diff ?? fullState.require_diff;
476
+ const allowCodeChanges = requestRecord.allow_code_changes ?? fullState.allow_code_changes;
477
+ return mode === "audit" || mode === "profile" || implementationMode === "none" || requireDiff === false || allowCodeChanges === false;
478
+ }
479
+ function visualDeltaNotApplicableForNoImplementation(visualDelta) {
480
+ if (String(visualDelta?.status || "").trim() !== "not_applicable") return false;
481
+ const reason = String(visualDelta?.reason || "").toLowerCase();
482
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
483
+ }
466
484
  function verificationModeRequiresVisualDelta(value) {
467
485
  const mode = String(value || "proof").trim().toLowerCase();
468
486
  return [
@@ -500,7 +518,9 @@ function buildProofAssessmentCheckpointPacket(input) {
500
518
  const requiredSignals = recordValue(recordValue(artifactContract)?.required);
501
519
  const visualDelta = visualDeltaFromState(fullState);
502
520
  const verificationMode = nonEmptyString(bundle?.verification_mode) || nonEmptyString(fullState.verification_mode) || nonEmptyString(input.request.verification_mode) || "proof";
503
- const visualDeltaRequired = requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
521
+ const noImplementationMode = noImplementationModeForCheckpoint(input.request, fullState);
522
+ const noImplementationVisualDelta = visualDeltaNotApplicableForNoImplementation(visualDelta);
523
+ const visualDeltaRequired = !noImplementationMode && !noImplementationVisualDelta && requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
504
524
  const evidenceIssueCode = visualDeltaIssueCode(visualDelta, visualDeltaRequired);
505
525
  const summary = nonEmptyString(input.engineResult.summary) || nonEmptyString(fullState.verify_summary) || "Verify captured evidence and needs a supervising proof assessment.";
506
526
  const recoveryHint = evidenceIssueCode ? "Required visual_delta evidence is incomplete. Keep this same run in verify/evidence recovery with decision=revise_capture and continue_with_stage=verify unless the evidence proves an implementation or recon problem." : "Assess whether the current artifacts prove the requested change, then choose the next stage.";
@@ -533,7 +553,7 @@ function buildProofAssessmentCheckpointPacket(input) {
533
553
  prod_cdn: fullState.prod_cdn || null,
534
554
  after_cdn: fullState.after_cdn || null,
535
555
  visual_delta_required: visualDeltaRequired,
536
- visual_delta_ready: visualDelta?.status === "measured" && visualDelta?.passed === true,
556
+ visual_delta_ready: !visualDeltaRequired || visualDelta?.status === "measured" && visualDelta?.passed === true,
537
557
  visual_delta: jsonCloneRecord(visualDelta),
538
558
  evidence_issue_code: evidenceIssueCode,
539
559
  proof_assessment_request: jsonCloneRecord(proofAssessmentRequest),
@@ -13,7 +13,7 @@ import {
13
13
  normalizeCheckpointResponse,
14
14
  proofContractFromAuthorCheckpointResponse,
15
15
  statePathsForRunState
16
- } from "./chunk-ABQQLRTS.js";
16
+ } from "./chunk-2CFVREFI.js";
17
17
  import "./chunk-VY4Y5U57.js";
18
18
  export {
19
19
  RIDDLE_PROOF_CHECKPOINT_PACKET_VERSION,
@@ -409,6 +409,24 @@ function visualDeltaFromState(fullState) {
409
409
  const proofAssessmentRequest = recordValue(fullState.proof_assessment_request);
410
410
  return recordValue(proofAssessmentRequest?.visual_delta) || null;
411
411
  }
412
+ function normalizedText(value) {
413
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
414
+ }
415
+ function noImplementationModeForCheckpoint(request, fullState) {
416
+ const requestRecord = recordValue(request) || {};
417
+ const mode = normalizedText(
418
+ requestRecord.mode || requestRecord.workflow_mode || fullState.mode || fullState.workflow_mode
419
+ );
420
+ const implementationMode = normalizedText(requestRecord.implementation_mode || fullState.implementation_mode);
421
+ const requireDiff = requestRecord.require_diff ?? fullState.require_diff;
422
+ const allowCodeChanges = requestRecord.allow_code_changes ?? fullState.allow_code_changes;
423
+ return mode === "audit" || mode === "profile" || implementationMode === "none" || requireDiff === false || allowCodeChanges === false;
424
+ }
425
+ function visualDeltaNotApplicableForNoImplementation(visualDelta) {
426
+ if (String(visualDelta?.status || "").trim() !== "not_applicable") return false;
427
+ const reason = String(visualDelta?.reason || "").toLowerCase();
428
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
429
+ }
412
430
  function verificationModeRequiresVisualDelta(value) {
413
431
  const mode = String(value || "proof").trim().toLowerCase();
414
432
  return [
@@ -446,7 +464,9 @@ function buildProofAssessmentCheckpointPacket(input) {
446
464
  const requiredSignals = recordValue(recordValue(artifactContract)?.required);
447
465
  const visualDelta = visualDeltaFromState(fullState);
448
466
  const verificationMode = nonEmptyString(bundle?.verification_mode) || nonEmptyString(fullState.verification_mode) || nonEmptyString(input.request.verification_mode) || "proof";
449
- const visualDeltaRequired = requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
467
+ const noImplementationMode = noImplementationModeForCheckpoint(input.request, fullState);
468
+ const noImplementationVisualDelta = visualDeltaNotApplicableForNoImplementation(visualDelta);
469
+ const visualDeltaRequired = !noImplementationMode && !noImplementationVisualDelta && requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
450
470
  const evidenceIssueCode = visualDeltaIssueCode(visualDelta, visualDeltaRequired);
451
471
  const summary = nonEmptyString(input.engineResult.summary) || nonEmptyString(fullState.verify_summary) || "Verify captured evidence and needs a supervising proof assessment.";
452
472
  const recoveryHint = evidenceIssueCode ? "Required visual_delta evidence is incomplete. Keep this same run in verify/evidence recovery with decision=revise_capture and continue_with_stage=verify unless the evidence proves an implementation or recon problem." : "Assess whether the current artifacts prove the requested change, then choose the next stage.";
@@ -479,7 +499,7 @@ function buildProofAssessmentCheckpointPacket(input) {
479
499
  prod_cdn: fullState.prod_cdn || null,
480
500
  after_cdn: fullState.after_cdn || null,
481
501
  visual_delta_required: visualDeltaRequired,
482
- visual_delta_ready: visualDelta?.status === "measured" && visualDelta?.passed === true,
502
+ visual_delta_ready: !visualDeltaRequired || visualDelta?.status === "measured" && visualDelta?.passed === true,
483
503
  visual_delta: jsonCloneRecord(visualDelta),
484
504
  evidence_issue_code: evidenceIssueCode,
485
505
  proof_assessment_request: jsonCloneRecord(proofAssessmentRequest),
@@ -377,6 +377,7 @@ function normalizedVerificationMode(state = {}) {
377
377
  return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
378
378
  }
379
379
  function visualDeltaRequiredForState(state = {}) {
380
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation(state)) return false;
380
381
  const bundle = objectValue(state?.evidence_bundle);
381
382
  const contract = objectValue(bundle.artifact_contract);
382
383
  const required = objectValue(contract.required);
@@ -391,6 +392,12 @@ function visualDeltaForState(state = {}) {
391
392
  const request = objectValue(state?.proof_assessment_request);
392
393
  return objectValue(request.visual_delta);
393
394
  }
395
+ function visualDeltaNotApplicableForNoImplementation(state = {}) {
396
+ const visualDelta = visualDeltaForState(state);
397
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
398
+ const reason = String(visualDelta.reason || "").toLowerCase();
399
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
400
+ }
394
401
  function visualDeltaShipGateReason(state = {}) {
395
402
  if (!visualDeltaRequiredForState(state)) return null;
396
403
  const visualDelta = visualDeltaForState(state);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createRiddleProofRunCard
3
- } from "./chunk-ZHEFYLII.js";
3
+ } from "./chunk-Y2KTBACQ.js";
4
4
  import {
5
5
  compactRecord,
6
6
  isTerminalStatus,
@@ -5,16 +5,16 @@ import {
5
5
  createRunStatusSnapshot,
6
6
  normalizeRunParams,
7
7
  setRunStatus
8
- } from "./chunk-UYB7ABWU.js";
8
+ } from "./chunk-OHJQRDST.js";
9
9
  import {
10
10
  createRiddleProofRunCard
11
- } from "./chunk-ZHEFYLII.js";
11
+ } from "./chunk-Y2KTBACQ.js";
12
12
  import {
13
13
  noImplementationModeFor,
14
14
  visualDeltaForState,
15
15
  visualDeltaRequiredForState,
16
16
  visualDeltaShipGateReason
17
- } from "./chunk-WWYZBWKZ.js";
17
+ } from "./chunk-GBVEQQIM.js";
18
18
  import {
19
19
  authorPacketPayloadFromCheckpointResponse,
20
20
  buildCheckpointPacketForEngineResult,
@@ -24,7 +24,7 @@ import {
24
24
  normalizeCheckpointResponse,
25
25
  proofContractFromAuthorCheckpointResponse,
26
26
  statePathsForRunState
27
- } from "./chunk-ABQQLRTS.js";
27
+ } from "./chunk-2CFVREFI.js";
28
28
  import {
29
29
  applyTerminalMetadata,
30
30
  compactRecord,
@@ -235,6 +235,16 @@ function baseContinuation(result) {
235
235
  continue_from_checkpoint: true
236
236
  };
237
237
  }
238
+ function carryRequestControlFlags(params, request) {
239
+ if (!noImplementationModeFor(request)) return params;
240
+ return compactRecord({
241
+ ...params,
242
+ mode: request.mode,
243
+ implementation_mode: request.implementation_mode || "none",
244
+ require_diff: request.require_diff ?? false,
245
+ allow_code_changes: request.allow_code_changes ?? false
246
+ });
247
+ }
238
248
  function initialRunParams(request, input, state) {
239
249
  return compactRecord({
240
250
  action: "run",
@@ -1389,7 +1399,10 @@ async function runRiddleProofEngineHarness(input) {
1389
1399
  message
1390
1400
  });
1391
1401
  }
1392
- let nextParams = input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state);
1402
+ let nextParams = carryRequestControlFlags(
1403
+ input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state),
1404
+ request
1405
+ );
1393
1406
  let lastResult = null;
1394
1407
  const stageIterations = {};
1395
1408
  for (let index = 0; index < maxIterations; index += 1) {
@@ -1502,7 +1515,7 @@ async function runRiddleProofEngineHarness(input) {
1502
1515
  message: "The harness route returned no next step."
1503
1516
  });
1504
1517
  }
1505
- nextParams = routed.next;
1518
+ nextParams = carryRequestControlFlags(routed.next, request);
1506
1519
  }
1507
1520
  return blockerResult(state, lastResult, {
1508
1521
  code: "max_iterations_reached",
@@ -3,10 +3,10 @@ import {
3
3
  appendStageHeartbeat,
4
4
  createRunState,
5
5
  setRunStatus
6
- } from "./chunk-UYB7ABWU.js";
6
+ } from "./chunk-OHJQRDST.js";
7
7
  import {
8
8
  noImplementationModeFor
9
- } from "./chunk-WWYZBWKZ.js";
9
+ } from "./chunk-GBVEQQIM.js";
10
10
  import {
11
11
  createRunResult
12
12
  } from "./chunk-VY4Y5U57.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  statePathsForRunState
3
- } from "./chunk-ABQQLRTS.js";
3
+ } from "./chunk-2CFVREFI.js";
4
4
  import {
5
5
  compactRecord,
6
6
  isTerminalStatus,
package/dist/cli.cjs CHANGED
@@ -385,6 +385,7 @@ function normalizedVerificationMode(state = {}) {
385
385
  return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
386
386
  }
387
387
  function visualDeltaRequiredForState(state = {}) {
388
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation2(state)) return false;
388
389
  const bundle = objectValue(state?.evidence_bundle);
389
390
  const contract = objectValue(bundle.artifact_contract);
390
391
  const required = objectValue(contract.required);
@@ -399,6 +400,12 @@ function visualDeltaForState(state = {}) {
399
400
  const request = objectValue(state?.proof_assessment_request);
400
401
  return objectValue(request.visual_delta);
401
402
  }
403
+ function visualDeltaNotApplicableForNoImplementation2(state = {}) {
404
+ const visualDelta = visualDeltaForState(state);
405
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
406
+ const reason = String(visualDelta.reason || "").toLowerCase();
407
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
408
+ }
402
409
  function visualDeltaShipGateReason(state = {}) {
403
410
  if (!visualDeltaRequiredForState(state)) return null;
404
411
  const visualDelta = visualDeltaForState(state);
@@ -1654,6 +1661,10 @@ async function executeWorkflow(params, pluginConfig, resolvedConfig) {
1654
1661
  const timer = beginRuntimeStep(config.statePath, action, step, stepWorkflowFile);
1655
1662
  let output;
1656
1663
  try {
1664
+ if (step === "setup") {
1665
+ (0, import_node_fs2.mkdirSync)(import_node_path2.default.dirname(config.argsPath), { recursive: true });
1666
+ (0, import_node_fs2.writeFileSync)(config.argsPath, JSON.stringify(args, null, 2));
1667
+ }
1657
1668
  output = JSON.parse(
1658
1669
  (0, import_node_child_process.execFileSync)(lobsterCommand, [...lobsterPrefix, "run", "--file", stepWorkflowFile, "--args-json", JSON.stringify(args)], {
1659
1670
  encoding: "utf-8",
@@ -3530,6 +3541,24 @@ function visualDeltaFromState(fullState) {
3530
3541
  const proofAssessmentRequest = recordValue(fullState.proof_assessment_request);
3531
3542
  return recordValue(proofAssessmentRequest?.visual_delta) || null;
3532
3543
  }
3544
+ function normalizedText(value) {
3545
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
3546
+ }
3547
+ function noImplementationModeForCheckpoint(request, fullState) {
3548
+ const requestRecord = recordValue(request) || {};
3549
+ const mode = normalizedText(
3550
+ requestRecord.mode || requestRecord.workflow_mode || fullState.mode || fullState.workflow_mode
3551
+ );
3552
+ const implementationMode = normalizedText(requestRecord.implementation_mode || fullState.implementation_mode);
3553
+ const requireDiff = requestRecord.require_diff ?? fullState.require_diff;
3554
+ const allowCodeChanges = requestRecord.allow_code_changes ?? fullState.allow_code_changes;
3555
+ return mode === "audit" || mode === "profile" || implementationMode === "none" || requireDiff === false || allowCodeChanges === false;
3556
+ }
3557
+ function visualDeltaNotApplicableForNoImplementation(visualDelta) {
3558
+ if (String(visualDelta?.status || "").trim() !== "not_applicable") return false;
3559
+ const reason = String(visualDelta?.reason || "").toLowerCase();
3560
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
3561
+ }
3533
3562
  function verificationModeRequiresVisualDelta(value) {
3534
3563
  const mode = String(value || "proof").trim().toLowerCase();
3535
3564
  return [
@@ -3567,7 +3596,9 @@ function buildProofAssessmentCheckpointPacket(input) {
3567
3596
  const requiredSignals = recordValue(recordValue(artifactContract)?.required);
3568
3597
  const visualDelta = visualDeltaFromState(fullState);
3569
3598
  const verificationMode = nonEmptyString(bundle?.verification_mode) || nonEmptyString(fullState.verification_mode) || nonEmptyString(input.request.verification_mode) || "proof";
3570
- const visualDeltaRequired = requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
3599
+ const noImplementationMode = noImplementationModeForCheckpoint(input.request, fullState);
3600
+ const noImplementationVisualDelta = visualDeltaNotApplicableForNoImplementation(visualDelta);
3601
+ const visualDeltaRequired = !noImplementationMode && !noImplementationVisualDelta && requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
3571
3602
  const evidenceIssueCode2 = visualDeltaIssueCode(visualDelta, visualDeltaRequired);
3572
3603
  const summary = nonEmptyString(input.engineResult.summary) || nonEmptyString(fullState.verify_summary) || "Verify captured evidence and needs a supervising proof assessment.";
3573
3604
  const recoveryHint = evidenceIssueCode2 ? "Required visual_delta evidence is incomplete. Keep this same run in verify/evidence recovery with decision=revise_capture and continue_with_stage=verify unless the evidence proves an implementation or recon problem." : "Assess whether the current artifacts prove the requested change, then choose the next stage.";
@@ -3600,7 +3631,7 @@ function buildProofAssessmentCheckpointPacket(input) {
3600
3631
  prod_cdn: fullState.prod_cdn || null,
3601
3632
  after_cdn: fullState.after_cdn || null,
3602
3633
  visual_delta_required: visualDeltaRequired,
3603
- visual_delta_ready: visualDelta?.status === "measured" && visualDelta?.passed === true,
3634
+ visual_delta_ready: !visualDeltaRequired || visualDelta?.status === "measured" && visualDelta?.passed === true,
3604
3635
  visual_delta: jsonCloneRecord(visualDelta),
3605
3636
  evidence_issue_code: evidenceIssueCode2,
3606
3637
  proof_assessment_request: jsonCloneRecord(proofAssessmentRequest),
@@ -4438,6 +4469,16 @@ function baseContinuation(result) {
4438
4469
  continue_from_checkpoint: true
4439
4470
  };
4440
4471
  }
4472
+ function carryRequestControlFlags(params, request) {
4473
+ if (!noImplementationModeFor(request)) return params;
4474
+ return compactRecord({
4475
+ ...params,
4476
+ mode: request.mode,
4477
+ implementation_mode: request.implementation_mode || "none",
4478
+ require_diff: request.require_diff ?? false,
4479
+ allow_code_changes: request.allow_code_changes ?? false
4480
+ });
4481
+ }
4441
4482
  function initialRunParams(request, input, state) {
4442
4483
  return compactRecord({
4443
4484
  action: "run",
@@ -5592,7 +5633,10 @@ async function runRiddleProofEngineHarness(input) {
5592
5633
  message
5593
5634
  });
5594
5635
  }
5595
- let nextParams = input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state);
5636
+ let nextParams = carryRequestControlFlags(
5637
+ input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state),
5638
+ request
5639
+ );
5596
5640
  let lastResult = null;
5597
5641
  const stageIterations = {};
5598
5642
  for (let index = 0; index < maxIterations; index += 1) {
@@ -5705,7 +5749,7 @@ async function runRiddleProofEngineHarness(input) {
5705
5749
  message: "The harness route returned no next step."
5706
5750
  });
5707
5751
  }
5708
- nextParams = routed.next;
5752
+ nextParams = carryRequestControlFlags(routed.next, request);
5709
5753
  }
5710
5754
  return blockerResult(state, lastResult, {
5711
5755
  code: "max_iterations_reached",
package/dist/cli.js CHANGED
@@ -23,13 +23,13 @@ import {
23
23
  createDisabledRiddleProofAgentAdapter,
24
24
  readRiddleProofRunStatus,
25
25
  runRiddleProofEngineHarness
26
- } from "./chunk-VJLHXZAA.js";
27
- import "./chunk-UYB7ABWU.js";
28
- import "./chunk-ZHEFYLII.js";
29
- import "./chunk-WWYZBWKZ.js";
26
+ } from "./chunk-QUAZAMOM.js";
27
+ import "./chunk-OHJQRDST.js";
28
+ import "./chunk-Y2KTBACQ.js";
29
+ import "./chunk-GBVEQQIM.js";
30
30
  import {
31
31
  createCheckpointResponseTemplate
32
- } from "./chunk-ABQQLRTS.js";
32
+ } from "./chunk-2CFVREFI.js";
33
33
  import "./chunk-JFQXAJH2.js";
34
34
  import {
35
35
  createCodexExecAgentAdapter,
@@ -385,6 +385,7 @@ function normalizedVerificationMode(state = {}) {
385
385
  return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
386
386
  }
387
387
  function visualDeltaRequiredForState(state = {}) {
388
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation2(state)) return false;
388
389
  const bundle = objectValue(state?.evidence_bundle);
389
390
  const contract = objectValue(bundle.artifact_contract);
390
391
  const required = objectValue(contract.required);
@@ -399,6 +400,12 @@ function visualDeltaForState(state = {}) {
399
400
  const request = objectValue(state?.proof_assessment_request);
400
401
  return objectValue(request.visual_delta);
401
402
  }
403
+ function visualDeltaNotApplicableForNoImplementation2(state = {}) {
404
+ const visualDelta = visualDeltaForState(state);
405
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
406
+ const reason = String(visualDelta.reason || "").toLowerCase();
407
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
408
+ }
402
409
  function visualDeltaShipGateReason(state = {}) {
403
410
  if (!visualDeltaRequiredForState(state)) return null;
404
411
  const visualDelta = visualDeltaForState(state);
@@ -1654,6 +1661,10 @@ async function executeWorkflow(params, pluginConfig, resolvedConfig) {
1654
1661
  const timer = beginRuntimeStep(config.statePath, action, step, stepWorkflowFile);
1655
1662
  let output;
1656
1663
  try {
1664
+ if (step === "setup") {
1665
+ (0, import_node_fs2.mkdirSync)(import_node_path2.default.dirname(config.argsPath), { recursive: true });
1666
+ (0, import_node_fs2.writeFileSync)(config.argsPath, JSON.stringify(args, null, 2));
1667
+ }
1657
1668
  output = JSON.parse(
1658
1669
  (0, import_node_child_process.execFileSync)(lobsterCommand, [...lobsterPrefix, "run", "--file", stepWorkflowFile, "--args-json", JSON.stringify(args)], {
1659
1670
  encoding: "utf-8",
@@ -3533,6 +3544,24 @@ function visualDeltaFromState(fullState) {
3533
3544
  const proofAssessmentRequest = recordValue(fullState.proof_assessment_request);
3534
3545
  return recordValue(proofAssessmentRequest?.visual_delta) || null;
3535
3546
  }
3547
+ function normalizedText(value) {
3548
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
3549
+ }
3550
+ function noImplementationModeForCheckpoint(request, fullState) {
3551
+ const requestRecord = recordValue(request) || {};
3552
+ const mode = normalizedText(
3553
+ requestRecord.mode || requestRecord.workflow_mode || fullState.mode || fullState.workflow_mode
3554
+ );
3555
+ const implementationMode = normalizedText(requestRecord.implementation_mode || fullState.implementation_mode);
3556
+ const requireDiff = requestRecord.require_diff ?? fullState.require_diff;
3557
+ const allowCodeChanges = requestRecord.allow_code_changes ?? fullState.allow_code_changes;
3558
+ return mode === "audit" || mode === "profile" || implementationMode === "none" || requireDiff === false || allowCodeChanges === false;
3559
+ }
3560
+ function visualDeltaNotApplicableForNoImplementation(visualDelta) {
3561
+ if (String(visualDelta?.status || "").trim() !== "not_applicable") return false;
3562
+ const reason = String(visualDelta?.reason || "").toLowerCase();
3563
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
3564
+ }
3536
3565
  function verificationModeRequiresVisualDelta(value) {
3537
3566
  const mode = String(value || "proof").trim().toLowerCase();
3538
3567
  return [
@@ -3570,7 +3599,9 @@ function buildProofAssessmentCheckpointPacket(input) {
3570
3599
  const requiredSignals = recordValue(recordValue(artifactContract)?.required);
3571
3600
  const visualDelta = visualDeltaFromState(fullState);
3572
3601
  const verificationMode = nonEmptyString(bundle?.verification_mode) || nonEmptyString(fullState.verification_mode) || nonEmptyString(input.request.verification_mode) || "proof";
3573
- const visualDeltaRequired = requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
3602
+ const noImplementationMode = noImplementationModeForCheckpoint(input.request, fullState);
3603
+ const noImplementationVisualDelta = visualDeltaNotApplicableForNoImplementation(visualDelta);
3604
+ const visualDeltaRequired = !noImplementationMode && !noImplementationVisualDelta && requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
3574
3605
  const evidenceIssueCode2 = visualDeltaIssueCode(visualDelta, visualDeltaRequired);
3575
3606
  const summary = nonEmptyString(input.engineResult.summary) || nonEmptyString(fullState.verify_summary) || "Verify captured evidence and needs a supervising proof assessment.";
3576
3607
  const recoveryHint = evidenceIssueCode2 ? "Required visual_delta evidence is incomplete. Keep this same run in verify/evidence recovery with decision=revise_capture and continue_with_stage=verify unless the evidence proves an implementation or recon problem." : "Assess whether the current artifacts prove the requested change, then choose the next stage.";
@@ -3603,7 +3634,7 @@ function buildProofAssessmentCheckpointPacket(input) {
3603
3634
  prod_cdn: fullState.prod_cdn || null,
3604
3635
  after_cdn: fullState.after_cdn || null,
3605
3636
  visual_delta_required: visualDeltaRequired,
3606
- visual_delta_ready: visualDelta?.status === "measured" && visualDelta?.passed === true,
3637
+ visual_delta_ready: !visualDeltaRequired || visualDelta?.status === "measured" && visualDelta?.passed === true,
3607
3638
  visual_delta: jsonCloneRecord(visualDelta),
3608
3639
  evidence_issue_code: evidenceIssueCode2,
3609
3640
  proof_assessment_request: jsonCloneRecord(proofAssessmentRequest),
@@ -4367,6 +4398,16 @@ function baseContinuation(result) {
4367
4398
  continue_from_checkpoint: true
4368
4399
  };
4369
4400
  }
4401
+ function carryRequestControlFlags(params, request) {
4402
+ if (!noImplementationModeFor(request)) return params;
4403
+ return compactRecord({
4404
+ ...params,
4405
+ mode: request.mode,
4406
+ implementation_mode: request.implementation_mode || "none",
4407
+ require_diff: request.require_diff ?? false,
4408
+ allow_code_changes: request.allow_code_changes ?? false
4409
+ });
4410
+ }
4370
4411
  function initialRunParams(request, input, state) {
4371
4412
  return compactRecord({
4372
4413
  action: "run",
@@ -5521,7 +5562,10 @@ async function runRiddleProofEngineHarness(input) {
5521
5562
  message
5522
5563
  });
5523
5564
  }
5524
- let nextParams = input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state);
5565
+ let nextParams = carryRequestControlFlags(
5566
+ input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state),
5567
+ request
5568
+ );
5525
5569
  let lastResult = null;
5526
5570
  const stageIterations = {};
5527
5571
  for (let index = 0; index < maxIterations; index += 1) {
@@ -5634,7 +5678,7 @@ async function runRiddleProofEngineHarness(input) {
5634
5678
  message: "The harness route returned no next step."
5635
5679
  });
5636
5680
  }
5637
- nextParams = routed.next;
5681
+ nextParams = carryRequestControlFlags(routed.next, request);
5638
5682
  }
5639
5683
  return blockerResult(state, lastResult, {
5640
5684
  code: "max_iterations_reached",
@@ -2,11 +2,11 @@ import {
2
2
  createDisabledRiddleProofAgentAdapter,
3
3
  readRiddleProofRunStatus,
4
4
  runRiddleProofEngineHarness
5
- } from "./chunk-VJLHXZAA.js";
6
- import "./chunk-UYB7ABWU.js";
7
- import "./chunk-ZHEFYLII.js";
8
- import "./chunk-WWYZBWKZ.js";
9
- import "./chunk-ABQQLRTS.js";
5
+ } from "./chunk-QUAZAMOM.js";
6
+ import "./chunk-OHJQRDST.js";
7
+ import "./chunk-Y2KTBACQ.js";
8
+ import "./chunk-GBVEQQIM.js";
9
+ import "./chunk-2CFVREFI.js";
10
10
  import "./chunk-VY4Y5U57.js";
11
11
  export {
12
12
  createDisabledRiddleProofAgentAdapter,
package/dist/index.cjs CHANGED
@@ -385,6 +385,7 @@ function normalizedVerificationMode(state = {}) {
385
385
  return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
386
386
  }
387
387
  function visualDeltaRequiredForState(state = {}) {
388
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation2(state)) return false;
388
389
  const bundle = objectValue(state?.evidence_bundle);
389
390
  const contract = objectValue(bundle.artifact_contract);
390
391
  const required = objectValue(contract.required);
@@ -399,6 +400,12 @@ function visualDeltaForState(state = {}) {
399
400
  const request = objectValue(state?.proof_assessment_request);
400
401
  return objectValue(request.visual_delta);
401
402
  }
403
+ function visualDeltaNotApplicableForNoImplementation2(state = {}) {
404
+ const visualDelta = visualDeltaForState(state);
405
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
406
+ const reason = String(visualDelta.reason || "").toLowerCase();
407
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
408
+ }
402
409
  function visualDeltaShipGateReason(state = {}) {
403
410
  if (!visualDeltaRequiredForState(state)) return null;
404
411
  const visualDelta = visualDeltaForState(state);
@@ -1654,6 +1661,10 @@ async function executeWorkflow(params, pluginConfig, resolvedConfig) {
1654
1661
  const timer = beginRuntimeStep(config.statePath, action, step, stepWorkflowFile);
1655
1662
  let output;
1656
1663
  try {
1664
+ if (step === "setup") {
1665
+ (0, import_node_fs2.mkdirSync)(import_node_path2.default.dirname(config.argsPath), { recursive: true });
1666
+ (0, import_node_fs2.writeFileSync)(config.argsPath, JSON.stringify(args, null, 2));
1667
+ }
1657
1668
  output = JSON.parse(
1658
1669
  (0, import_node_child_process.execFileSync)(lobsterCommand, [...lobsterPrefix, "run", "--file", stepWorkflowFile, "--args-json", JSON.stringify(args)], {
1659
1670
  encoding: "utf-8",
@@ -3647,6 +3658,24 @@ function visualDeltaFromState(fullState) {
3647
3658
  const proofAssessmentRequest = recordValue(fullState.proof_assessment_request);
3648
3659
  return recordValue(proofAssessmentRequest?.visual_delta) || null;
3649
3660
  }
3661
+ function normalizedText(value) {
3662
+ return typeof value === "string" ? value.trim().toLowerCase() : "";
3663
+ }
3664
+ function noImplementationModeForCheckpoint(request, fullState) {
3665
+ const requestRecord = recordValue(request) || {};
3666
+ const mode = normalizedText(
3667
+ requestRecord.mode || requestRecord.workflow_mode || fullState.mode || fullState.workflow_mode
3668
+ );
3669
+ const implementationMode = normalizedText(requestRecord.implementation_mode || fullState.implementation_mode);
3670
+ const requireDiff = requestRecord.require_diff ?? fullState.require_diff;
3671
+ const allowCodeChanges = requestRecord.allow_code_changes ?? fullState.allow_code_changes;
3672
+ return mode === "audit" || mode === "profile" || implementationMode === "none" || requireDiff === false || allowCodeChanges === false;
3673
+ }
3674
+ function visualDeltaNotApplicableForNoImplementation(visualDelta) {
3675
+ if (String(visualDelta?.status || "").trim() !== "not_applicable") return false;
3676
+ const reason = String(visualDelta?.reason || "").toLowerCase();
3677
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
3678
+ }
3650
3679
  function verificationModeRequiresVisualDelta(value) {
3651
3680
  const mode = String(value || "proof").trim().toLowerCase();
3652
3681
  return [
@@ -3684,7 +3713,9 @@ function buildProofAssessmentCheckpointPacket(input) {
3684
3713
  const requiredSignals = recordValue(recordValue(artifactContract)?.required);
3685
3714
  const visualDelta = visualDeltaFromState(fullState);
3686
3715
  const verificationMode = nonEmptyString(bundle?.verification_mode) || nonEmptyString(fullState.verification_mode) || nonEmptyString(input.request.verification_mode) || "proof";
3687
- const visualDeltaRequired = requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
3716
+ const noImplementationMode = noImplementationModeForCheckpoint(input.request, fullState);
3717
+ const noImplementationVisualDelta = visualDeltaNotApplicableForNoImplementation(visualDelta);
3718
+ const visualDeltaRequired = !noImplementationMode && !noImplementationVisualDelta && requiredSignals?.visual_delta !== false && (requiredSignals?.visual_delta === true || verificationModeRequiresVisualDelta(verificationMode));
3688
3719
  const evidenceIssueCode2 = visualDeltaIssueCode(visualDelta, visualDeltaRequired);
3689
3720
  const summary = nonEmptyString(input.engineResult.summary) || nonEmptyString(fullState.verify_summary) || "Verify captured evidence and needs a supervising proof assessment.";
3690
3721
  const recoveryHint = evidenceIssueCode2 ? "Required visual_delta evidence is incomplete. Keep this same run in verify/evidence recovery with decision=revise_capture and continue_with_stage=verify unless the evidence proves an implementation or recon problem." : "Assess whether the current artifacts prove the requested change, then choose the next stage.";
@@ -3717,7 +3748,7 @@ function buildProofAssessmentCheckpointPacket(input) {
3717
3748
  prod_cdn: fullState.prod_cdn || null,
3718
3749
  after_cdn: fullState.after_cdn || null,
3719
3750
  visual_delta_required: visualDeltaRequired,
3720
- visual_delta_ready: visualDelta?.status === "measured" && visualDelta?.passed === true,
3751
+ visual_delta_ready: !visualDeltaRequired || visualDelta?.status === "measured" && visualDelta?.passed === true,
3721
3752
  visual_delta: jsonCloneRecord(visualDelta),
3722
3753
  evidence_issue_code: evidenceIssueCode2,
3723
3754
  proof_assessment_request: jsonCloneRecord(proofAssessmentRequest),
@@ -5101,6 +5132,16 @@ function baseContinuation(result) {
5101
5132
  continue_from_checkpoint: true
5102
5133
  };
5103
5134
  }
5135
+ function carryRequestControlFlags(params, request) {
5136
+ if (!noImplementationModeFor(request)) return params;
5137
+ return compactRecord({
5138
+ ...params,
5139
+ mode: request.mode,
5140
+ implementation_mode: request.implementation_mode || "none",
5141
+ require_diff: request.require_diff ?? false,
5142
+ allow_code_changes: request.allow_code_changes ?? false
5143
+ });
5144
+ }
5104
5145
  function initialRunParams(request, input, state) {
5105
5146
  return compactRecord({
5106
5147
  action: "run",
@@ -6255,7 +6296,10 @@ async function runRiddleProofEngineHarness(input) {
6255
6296
  message
6256
6297
  });
6257
6298
  }
6258
- let nextParams = input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state);
6299
+ let nextParams = carryRequestControlFlags(
6300
+ input.resume_params || checkpointContinuation.next || initialRunParams(request, input, state),
6301
+ request
6302
+ );
6259
6303
  let lastResult = null;
6260
6304
  const stageIterations = {};
6261
6305
  for (let index = 0; index < maxIterations; index += 1) {
@@ -6368,7 +6412,7 @@ async function runRiddleProofEngineHarness(input) {
6368
6412
  message: "The harness route returned no next step."
6369
6413
  });
6370
6414
  }
6371
- nextParams = routed.next;
6415
+ nextParams = carryRequestControlFlags(routed.next, request);
6372
6416
  }
6373
6417
  return blockerResult(state, lastResult, {
6374
6418
  code: "max_iterations_reached",
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runRiddleProof
3
- } from "./chunk-MA6ZR5XY.js";
3
+ } from "./chunk-TGHTM66Z.js";
4
4
  import "./chunk-6F4PWJZI.js";
5
5
  import {
6
6
  RIDDLE_PROOF_PLAYABILITY_ASSESSMENT_VERSION,
@@ -95,7 +95,7 @@ import {
95
95
  createDisabledRiddleProofAgentAdapter,
96
96
  readRiddleProofRunStatus,
97
97
  runRiddleProofEngineHarness
98
- } from "./chunk-VJLHXZAA.js";
98
+ } from "./chunk-QUAZAMOM.js";
99
99
  import {
100
100
  RIDDLE_PROOF_RUN_STATE_VERSION,
101
101
  appendRunEvent,
@@ -107,12 +107,12 @@ import {
107
107
  normalizePrLifecycleState,
108
108
  normalizeRunParams,
109
109
  setRunStatus
110
- } from "./chunk-UYB7ABWU.js";
110
+ } from "./chunk-OHJQRDST.js";
111
111
  import {
112
112
  RIDDLE_PROOF_RUN_CARD_VERSION,
113
113
  createRiddleProofRunCard
114
- } from "./chunk-ZHEFYLII.js";
115
- import "./chunk-WWYZBWKZ.js";
114
+ } from "./chunk-Y2KTBACQ.js";
115
+ import "./chunk-GBVEQQIM.js";
116
116
  import {
117
117
  RIDDLE_PROOF_CHECKPOINT_PACKET_VERSION,
118
118
  RIDDLE_PROOF_CHECKPOINT_RESPONSE_VERSION,
@@ -128,7 +128,7 @@ import {
128
128
  normalizeCheckpointResponse,
129
129
  proofContractFromAuthorCheckpointResponse,
130
130
  statePathsForRunState
131
- } from "./chunk-ABQQLRTS.js";
131
+ } from "./chunk-2CFVREFI.js";
132
132
  import "./chunk-JFQXAJH2.js";
133
133
  import {
134
134
  createCodexExecAgentAdapter,
package/dist/openclaw.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  normalizeIntegrationContext,
3
3
  normalizeRunParams
4
- } from "./chunk-UYB7ABWU.js";
5
- import "./chunk-ZHEFYLII.js";
6
- import "./chunk-ABQQLRTS.js";
4
+ } from "./chunk-OHJQRDST.js";
5
+ import "./chunk-Y2KTBACQ.js";
6
+ import "./chunk-2CFVREFI.js";
7
7
  import {
8
8
  compactRecord
9
9
  } from "./chunk-VY4Y5U57.js";
@@ -438,6 +438,7 @@ function normalizedVerificationMode(state = {}) {
438
438
  return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
439
439
  }
440
440
  function visualDeltaRequiredForState(state = {}) {
441
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation(state)) return false;
441
442
  const bundle = objectValue(state?.evidence_bundle);
442
443
  const contract = objectValue(bundle.artifact_contract);
443
444
  const required = objectValue(contract.required);
@@ -452,6 +453,12 @@ function visualDeltaForState(state = {}) {
452
453
  const request = objectValue(state?.proof_assessment_request);
453
454
  return objectValue(request.visual_delta);
454
455
  }
456
+ function visualDeltaNotApplicableForNoImplementation(state = {}) {
457
+ const visualDelta = visualDeltaForState(state);
458
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
459
+ const reason = String(visualDelta.reason || "").toLowerCase();
460
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
461
+ }
455
462
  function visualDeltaShipGateReason(state = {}) {
456
463
  if (!visualDeltaRequiredForState(state)) return null;
457
464
  const visualDelta = visualDeltaForState(state);
@@ -26,7 +26,7 @@ import {
26
26
  visualDeltaShipGateReason,
27
27
  workflowFile,
28
28
  writeState
29
- } from "./chunk-WWYZBWKZ.js";
29
+ } from "./chunk-GBVEQQIM.js";
30
30
  export {
31
31
  BUNDLED_RIDDLE_PROOF_DIR,
32
32
  CHECKPOINT_CONTRACT_VERSION,
@@ -418,6 +418,7 @@ function normalizedVerificationMode(state = {}) {
418
418
  return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
419
419
  }
420
420
  function visualDeltaRequiredForState(state = {}) {
421
+ if (noImplementationModeFor(state) || visualDeltaNotApplicableForNoImplementation(state)) return false;
421
422
  const bundle = objectValue(state?.evidence_bundle);
422
423
  const contract = objectValue(bundle.artifact_contract);
423
424
  const required = objectValue(contract.required);
@@ -432,6 +433,12 @@ function visualDeltaForState(state = {}) {
432
433
  const request = objectValue(state?.proof_assessment_request);
433
434
  return objectValue(request.visual_delta);
434
435
  }
436
+ function visualDeltaNotApplicableForNoImplementation(state = {}) {
437
+ const visualDelta = visualDeltaForState(state);
438
+ if (String(visualDelta.status || "").trim() !== "not_applicable") return false;
439
+ const reason = String(visualDelta.reason || "").toLowerCase();
440
+ return reason.includes("audit/no-diff") || reason.includes("does not require a before/after implementation delta");
441
+ }
435
442
  function visualDeltaShipGateReason(state = {}) {
436
443
  if (!visualDeltaRequiredForState(state)) return null;
437
444
  const visualDelta = visualDeltaForState(state);
@@ -1652,6 +1659,10 @@ async function executeWorkflow(params, pluginConfig, resolvedConfig) {
1652
1659
  const timer = beginRuntimeStep(config.statePath, action, step, stepWorkflowFile);
1653
1660
  let output;
1654
1661
  try {
1662
+ if (step === "setup") {
1663
+ (0, import_node_fs2.mkdirSync)(import_node_path2.default.dirname(config.argsPath), { recursive: true });
1664
+ (0, import_node_fs2.writeFileSync)(config.argsPath, JSON.stringify(args, null, 2));
1665
+ }
1655
1666
  output = JSON.parse(
1656
1667
  (0, import_node_child_process.execFileSync)(lobsterCommand, [...lobsterPrefix, "run", "--file", stepWorkflowFile, "--args-json", JSON.stringify(args)], {
1657
1668
  encoding: "utf-8",
@@ -15,11 +15,11 @@ import {
15
15
  validateShipGate,
16
16
  workflowFile,
17
17
  writeState
18
- } from "./chunk-WWYZBWKZ.js";
18
+ } from "./chunk-GBVEQQIM.js";
19
19
 
20
20
  // src/proof-run-engine.ts
21
21
  import { execFileSync } from "child_process";
22
- import { existsSync, mkdirSync } from "fs";
22
+ import { existsSync, mkdirSync, writeFileSync } from "fs";
23
23
  import path from "path";
24
24
  function snapshotFor(statePath) {
25
25
  return summarizeState(readState(statePath));
@@ -647,6 +647,10 @@ async function executeWorkflow(params, pluginConfig, resolvedConfig) {
647
647
  const timer = beginRuntimeStep(config.statePath, action, step, stepWorkflowFile);
648
648
  let output;
649
649
  try {
650
+ if (step === "setup") {
651
+ mkdirSync(path.dirname(config.argsPath), { recursive: true });
652
+ writeFileSync(config.argsPath, JSON.stringify(args, null, 2));
653
+ }
650
654
  output = JSON.parse(
651
655
  execFileSync(lobsterCommand, [...lobsterPrefix, "run", "--file", stepWorkflowFile, "--args-json", JSON.stringify(args)], {
652
656
  encoding: "utf-8",
package/dist/run-card.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  RIDDLE_PROOF_RUN_CARD_VERSION,
3
3
  createRiddleProofRunCard
4
- } from "./chunk-ZHEFYLII.js";
5
- import "./chunk-ABQQLRTS.js";
4
+ } from "./chunk-Y2KTBACQ.js";
5
+ import "./chunk-2CFVREFI.js";
6
6
  import "./chunk-VY4Y5U57.js";
7
7
  export {
8
8
  RIDDLE_PROOF_RUN_CARD_VERSION,
package/dist/runner.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  runRiddleProof
3
- } from "./chunk-MA6ZR5XY.js";
4
- import "./chunk-UYB7ABWU.js";
5
- import "./chunk-ZHEFYLII.js";
6
- import "./chunk-WWYZBWKZ.js";
7
- import "./chunk-ABQQLRTS.js";
3
+ } from "./chunk-TGHTM66Z.js";
4
+ import "./chunk-OHJQRDST.js";
5
+ import "./chunk-Y2KTBACQ.js";
6
+ import "./chunk-GBVEQQIM.js";
7
+ import "./chunk-2CFVREFI.js";
8
8
  import "./chunk-VY4Y5U57.js";
9
9
  export {
10
10
  runRiddleProof
package/dist/state.js CHANGED
@@ -9,9 +9,9 @@ import {
9
9
  normalizePrLifecycleState,
10
10
  normalizeRunParams,
11
11
  setRunStatus
12
- } from "./chunk-UYB7ABWU.js";
13
- import "./chunk-ZHEFYLII.js";
14
- import "./chunk-ABQQLRTS.js";
12
+ } from "./chunk-OHJQRDST.js";
13
+ import "./chunk-Y2KTBACQ.js";
14
+ import "./chunk-2CFVREFI.js";
15
15
  import "./chunk-VY4Y5U57.js";
16
16
  export {
17
17
  RIDDLE_PROOF_RUN_STATE_VERSION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.7.224",
3
+ "version": "0.7.226",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",
@@ -557,6 +557,50 @@ def extract_proof_evidence(payload):
557
557
  return evidence
558
558
 
559
559
 
560
+ def proof_evidence_records(value):
561
+ if isinstance(value, dict):
562
+ return [value]
563
+ if isinstance(value, list):
564
+ records = []
565
+ for item in value:
566
+ records.extend(proof_evidence_records(item))
567
+ return records
568
+ return []
569
+
570
+
571
+ def static_audit_evidence_support(value):
572
+ for record in proof_evidence_records(value):
573
+ explicit_static = (
574
+ record.get('interactionNotRequired') is True
575
+ or record.get('interactionExpected') is False
576
+ or record.get('zeroInteractiveElementsExpected') is True
577
+ or record.get('staticPageExpected') is True
578
+ )
579
+ ready = record.get('proofReady') is True or record.get('staticAuditReady') is True
580
+ failed = any(record.get(key) is False for key in (
581
+ 'proofReady',
582
+ 'staticAuditReady',
583
+ 'routeMatches',
584
+ 'titleMatches',
585
+ 'headingMatches',
586
+ 'markerMatches',
587
+ 'normalizedCopyVisible',
588
+ 'noConsoleErrors',
589
+ 'noPageErrors',
590
+ ))
591
+ if explicit_static and ready and not failed:
592
+ return {
593
+ 'ready': True,
594
+ 'interaction_not_required': True,
595
+ 'source': str(record.get('version') or record.get('mode') or 'proof_evidence'),
596
+ }
597
+ return {
598
+ 'ready': False,
599
+ 'interaction_not_required': False,
600
+ 'source': '',
601
+ }
602
+
603
+
560
604
  PLAYABILITY_EVIDENCE_VERSION = 'riddle-proof.playability.v1'
561
605
  PLAYABILITY_ASSESSMENT_VERSION = 'riddle-proof.playability.assessment.v1'
562
606
  PLAYABILITY_CONTAINER_KEYS = (
@@ -2012,6 +2056,8 @@ def evaluate_capture_quality(payload, expected_path, verification_mode='proof'):
2012
2056
  payload = enrich_capture_payload(payload)
2013
2057
  mode = normalized_verification_mode(verification_mode)
2014
2058
  supporting = collect_supporting_artifacts(payload)
2059
+ proof_evidence = extract_proof_evidence(payload)
2060
+ static_audit_support = static_audit_evidence_support(proof_evidence)
2015
2061
  structured_ready = bool(supporting.get('has_structured_payload'))
2016
2062
  playability_ready = mode in PLAYABILITY_MODES and bool(supporting.get('playability_ready'))
2017
2063
  screenshot_required = screenshot_required_for_mode(mode)
@@ -2023,6 +2069,8 @@ def evaluate_capture_quality(payload, expected_path, verification_mode='proof'):
2023
2069
  'structured_evidence_present': structured_ready,
2024
2070
  'proof_evidence_present': bool(supporting.get('proof_evidence_present')),
2025
2071
  'playability_ready': playability_ready,
2072
+ 'static_audit_ready': bool(static_audit_support.get('ready')),
2073
+ 'static_audit_support_source': static_audit_support.get('source', ''),
2026
2074
  'canvas_capture_ready': False,
2027
2075
  'large_canvas_area': 0,
2028
2076
  'min_canvas_area': MIN_CANVAS_AREA,
@@ -2110,13 +2158,15 @@ def evaluate_capture_quality(payload, expected_path, verification_mode='proof'):
2110
2158
 
2111
2159
  should_enforce_visual_readiness = screenshot_required or (details['has_screenshot'] and not structured_ready)
2112
2160
  canvas_ready = bool(details.get('canvas_capture_ready'))
2113
- body_text_ready = details['body_text_length'] >= MIN_BODY_TEXT_LENGTH or canvas_ready or playability_ready
2114
- interactive_ready = details['interactive_elements'] >= MIN_INTERACTIVE_ELEMENTS or canvas_ready or playability_ready
2115
- semantic_ready = (not has_enriched_page_state(page_state)) or details['semantic_anchor_count'] >= 1 or canvas_ready or playability_ready
2161
+ static_audit_ready = bool(static_audit_support.get('ready'))
2162
+ body_text_ready = details['body_text_length'] >= MIN_BODY_TEXT_LENGTH or canvas_ready or playability_ready or static_audit_ready
2163
+ interactive_ready = details['interactive_elements'] >= MIN_INTERACTIVE_ELEMENTS or canvas_ready or playability_ready or static_audit_ready
2164
+ semantic_ready = (not has_enriched_page_state(page_state)) or details['semantic_anchor_count'] >= 1 or canvas_ready or playability_ready or static_audit_ready
2116
2165
  details['body_text_ready'] = body_text_ready
2117
2166
  details['interactive_ready'] = interactive_ready
2118
2167
  details['semantic_ready'] = semantic_ready
2119
2168
  details['canvas_or_playability_override'] = bool(should_enforce_visual_readiness and (canvas_ready or playability_ready))
2169
+ details['static_audit_readiness_override'] = bool(should_enforce_visual_readiness and static_audit_ready)
2120
2170
 
2121
2171
  if should_enforce_visual_readiness and not body_text_ready:
2122
2172
  reasons.append(f'blank/near-blank page (text length: {details["body_text_length"]})')
@@ -17,7 +17,7 @@ args:
17
17
  default: ""
18
18
  capture_script:
19
19
  default: ""
20
- description: "Optional during setup. Add it before recon/verify once the proof target is clear."
20
+ description: "Optional Playwright JavaScript for proof capture. Add it before recon/verify once the proof target is clear; put natural-language instructions in change_request, context, success_criteria, or proof_plan."
21
21
  success_criteria:
22
22
  default: ""
23
23
  description: "Plain-English definition of what counts as fixed"
@@ -101,48 +101,52 @@ steps:
101
101
  command: |
102
102
  python3 << 'PYEOF'
103
103
  import json, os
104
- raw_server_path = """${server_path}""".strip()
105
- args = {
106
- 'mode': """${mode}""".strip() or 'server',
107
- 'reference': """${reference}""".strip() or 'both',
108
- 'repo': """${repo}""".strip(),
109
- 'branch': """${branch}""".strip(),
110
- 'change_request': """${change_request}""".strip(),
111
- 'commit_message': """${commit_message}""".strip(),
112
- 'prod_url': """${prod_url}""".strip(),
113
- 'capture_script': """${capture_script}""".strip(),
114
- 'success_criteria': """${success_criteria}""".strip(),
115
- 'assertions_json': """${assertions_json}""".strip(),
116
- 'verification_mode': """${verification_mode}""".strip() or 'proof',
117
- 'context': """${context}""".strip(),
118
- 'reviewer': """${reviewer}""".strip() or 'davisdiehl',
119
- 'base_branch': """${base_branch}""".strip() or 'main',
120
- 'before_ref': """${before_ref}""".strip(),
121
- 'allow_static_preview_fallback': """${allow_static_preview_fallback}""".strip(),
122
- 'implementation_mode': """${implementation_mode}""".strip(),
123
- 'require_diff': """${require_diff}""".strip(),
124
- 'allow_code_changes': """${allow_code_changes}""".strip(),
125
- 'build_command': """${build_command}""".strip() or 'npm run build',
126
- 'build_output': """${build_output}""".strip() or 'build',
127
- 'server_image': """${server_image}""".strip() or 'node:20-slim',
128
- 'server_command': """${server_command}""".strip() or 'npm start',
129
- 'server_port': """${server_port}""".strip() or '3000',
130
- 'server_path': raw_server_path,
131
- 'server_path_source': 'user' if raw_server_path else '',
132
- 'use_auth': """${use_auth}""".strip(),
133
- 'auth_localStorage_json': """${auth_localStorage_json}""".strip(),
134
- 'auth_cookies_json': """${auth_cookies_json}""".strip(),
135
- 'auth_headers_json': """${auth_headers_json}""".strip(),
136
- 'color_scheme': """${color_scheme}""".strip(),
137
- 'wait_for_selector': """${wait_for_selector}""".strip(),
138
- 'discord_channel': """${discord_channel}""".strip(),
139
- 'discord_thread_id': """${discord_thread_id}""".strip(),
140
- 'discord_message_id': """${discord_message_id}""".strip(),
141
- 'discord_source_url': """${discord_source_url}""".strip(),
142
- }
143
104
  args_file = os.environ.get('RIDDLE_PROOF_ARGS_FILE', '/tmp/riddle-proof-args.json')
144
- with open(args_file, 'w') as f:
145
- json.dump(args, f, indent=2)
105
+ if os.environ.get('RIDDLE_PROOF_ARGS_FILE') and os.path.exists(args_file):
106
+ with open(args_file) as f:
107
+ json.load(f)
108
+ else:
109
+ raw_server_path = '''${server_path}'''.strip()
110
+ args = {
111
+ 'mode': '''${mode}'''.strip() or 'server',
112
+ 'reference': '''${reference}'''.strip() or 'both',
113
+ 'repo': '''${repo}'''.strip(),
114
+ 'branch': '''${branch}'''.strip(),
115
+ 'change_request': '''${change_request}'''.strip(),
116
+ 'commit_message': '''${commit_message}'''.strip(),
117
+ 'prod_url': '''${prod_url}'''.strip(),
118
+ 'capture_script': '''${capture_script}'''.strip(),
119
+ 'success_criteria': '''${success_criteria}'''.strip(),
120
+ 'assertions_json': '''${assertions_json}'''.strip(),
121
+ 'verification_mode': '''${verification_mode}'''.strip() or 'proof',
122
+ 'context': '''${context}'''.strip(),
123
+ 'reviewer': '''${reviewer}'''.strip() or 'davisdiehl',
124
+ 'base_branch': '''${base_branch}'''.strip() or 'main',
125
+ 'before_ref': '''${before_ref}'''.strip(),
126
+ 'allow_static_preview_fallback': '''${allow_static_preview_fallback}'''.strip(),
127
+ 'implementation_mode': '''${implementation_mode}'''.strip(),
128
+ 'require_diff': '''${require_diff}'''.strip(),
129
+ 'allow_code_changes': '''${allow_code_changes}'''.strip(),
130
+ 'build_command': '''${build_command}'''.strip() or 'npm run build',
131
+ 'build_output': '''${build_output}'''.strip() or 'build',
132
+ 'server_image': '''${server_image}'''.strip() or 'node:20-slim',
133
+ 'server_command': '''${server_command}'''.strip() or 'npm start',
134
+ 'server_port': '''${server_port}'''.strip() or '3000',
135
+ 'server_path': raw_server_path,
136
+ 'server_path_source': 'user' if raw_server_path else '',
137
+ 'use_auth': '''${use_auth}'''.strip(),
138
+ 'auth_localStorage_json': '''${auth_localStorage_json}'''.strip(),
139
+ 'auth_cookies_json': '''${auth_cookies_json}'''.strip(),
140
+ 'auth_headers_json': '''${auth_headers_json}'''.strip(),
141
+ 'color_scheme': '''${color_scheme}'''.strip(),
142
+ 'wait_for_selector': '''${wait_for_selector}'''.strip(),
143
+ 'discord_channel': '''${discord_channel}'''.strip(),
144
+ 'discord_thread_id': '''${discord_thread_id}'''.strip(),
145
+ 'discord_message_id': '''${discord_message_id}'''.strip(),
146
+ 'discord_source_url': '''${discord_source_url}'''.strip(),
147
+ }
148
+ with open(args_file, 'w') as f:
149
+ json.dump(args, f, indent=2)
146
150
  PYEOF
147
151
  RP="${RIDDLE_PROOF_DIR:-/root/.openclaw/extensions/openclaw-riddle-proof/node_modules/@riddledc/riddle-proof/runtime}"
148
152
  python3 "${RP}/lib/preflight.py"
@@ -562,6 +562,47 @@ def run_verify_quality_ignores_proof_telemetry_console_text():
562
562
  assert missing_query_quality['valid'] is False
563
563
  assert 'wrong route' in missing_query_quality['reason']
564
564
 
565
+ static_audit_payload = {
566
+ 'bodyTextLength': 61,
567
+ 'visibleTextSample': 'Riddle static preview smoke Static preview marker is visible.',
568
+ 'interactiveElements': 0,
569
+ 'visibleInteractiveElements': 0,
570
+ 'pathname': '/s/ps_b7b5f0dc/',
571
+ 'title': 'Riddle Preview Smoke',
572
+ 'headings': ['Riddle static preview smoke'],
573
+ 'buttons': [],
574
+ 'links': [],
575
+ 'canvasCount': 0,
576
+ 'largeVisibleElements': [{'tag': 'h1', 'text': 'Riddle static preview smoke', 'area': 17208}],
577
+ }
578
+ static_audit_evidence = {
579
+ 'version': 'riddle-proof.static-smoke.v4',
580
+ 'proofReady': True,
581
+ 'staticAuditReady': True,
582
+ 'interactionExpected': False,
583
+ 'interactionNotRequired': True,
584
+ 'zeroInteractiveElementsExpected': True,
585
+ 'routeMatches': True,
586
+ 'titleMatches': True,
587
+ 'headingMatches': True,
588
+ 'markerMatches': True,
589
+ 'normalizedCopyVisible': True,
590
+ 'noConsoleErrors': True,
591
+ 'noPageErrors': True,
592
+ }
593
+ static_audit_quality = namespace['evaluate_capture_quality']({
594
+ 'ok': True,
595
+ 'screenshots': [{'name': 'after-proof.png', 'url': 'https://cdn.example.com/static-after.png'}],
596
+ 'outputs': [{'name': 'after-proof.png', 'url': 'https://cdn.example.com/static-after.png'}],
597
+ 'console': [
598
+ 'RIDDLE_PROOF_STATE:' + json.dumps(static_audit_payload),
599
+ 'RIDDLE_PROOF_EVIDENCE:' + json.dumps(static_audit_evidence),
600
+ ],
601
+ }, '/s/ps_b7b5f0dc/', 'visual')
602
+ assert static_audit_quality['valid'] is True, static_audit_quality
603
+ assert static_audit_quality['details']['interactive_ready'] is True
604
+ assert static_audit_quality['details']['static_audit_readiness_override'] is True
605
+
565
606
  strong_delta = namespace['extract_visual_delta']({
566
607
  'ok': True,
567
608
  'result': {