@riddledc/riddle-proof 0.8.11 → 0.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/advanced/engine-harness.cjs +97 -12
  2. package/dist/advanced/engine-harness.js +2 -2
  3. package/dist/advanced/index.cjs +98 -12
  4. package/dist/advanced/index.d.cts +2 -2
  5. package/dist/advanced/index.d.ts +2 -2
  6. package/dist/advanced/index.js +4 -4
  7. package/dist/advanced/proof-run-core.cjs +31 -1
  8. package/dist/advanced/proof-run-core.d.cts +1 -1
  9. package/dist/advanced/proof-run-core.d.ts +1 -1
  10. package/dist/advanced/proof-run-core.js +3 -1
  11. package/dist/advanced/proof-run-engine.cjs +46 -12
  12. package/dist/advanced/proof-run-engine.d.cts +2 -2
  13. package/dist/advanced/proof-run-engine.d.ts +2 -2
  14. package/dist/advanced/proof-run-engine.js +2 -2
  15. package/dist/advanced/runner.js +2 -2
  16. package/dist/{chunk-5N5QFI2S.js → chunk-7GZY5PLT.js} +31 -1
  17. package/dist/{chunk-46DDSZJR.js → chunk-JBY2SU5U.js} +18 -12
  18. package/dist/{chunk-5N6MQCLC.js → chunk-NGX4SUQN.js} +1 -1
  19. package/dist/{chunk-BBUO7HM4.js → chunk-RTLA6CPP.js} +53 -1
  20. package/dist/{chunk-2PXL3RDB.js → chunk-SZUC4MDN.js} +1 -1
  21. package/dist/cli/index.js +3 -3
  22. package/dist/cli.cjs +97 -12
  23. package/dist/cli.js +3 -3
  24. package/dist/engine-harness.cjs +97 -12
  25. package/dist/engine-harness.js +2 -2
  26. package/dist/index.cjs +97 -12
  27. package/dist/index.js +3 -3
  28. package/dist/{proof-run-core-CE0jx7wL.d.cts → proof-run-core-C8FDUhle.d.cts} +5 -2
  29. package/dist/{proof-run-core-CE0jx7wL.d.ts → proof-run-core-C8FDUhle.d.ts} +5 -2
  30. package/dist/proof-run-core.cjs +31 -1
  31. package/dist/proof-run-core.d.cts +1 -1
  32. package/dist/proof-run-core.d.ts +1 -1
  33. package/dist/proof-run-core.js +3 -1
  34. package/dist/{proof-run-engine-BomAcXhA.d.ts → proof-run-engine-By7oLsF-.d.ts} +1 -1
  35. package/dist/{proof-run-engine-B7DCPzpK.d.cts → proof-run-engine-D80hVFMf.d.cts} +1 -1
  36. package/dist/proof-run-engine.cjs +46 -12
  37. package/dist/proof-run-engine.d.cts +2 -2
  38. package/dist/proof-run-engine.d.ts +2 -2
  39. package/dist/proof-run-engine.js +2 -2
  40. package/dist/runner.js +2 -2
  41. package/package.json +1 -1
  42. package/runtime/lib/verify.py +266 -22
  43. package/runtime/tests/recon_verify_smoke.py +291 -4
  44. package/runtime/tests/trust_boundary_regression.py +18 -0
@@ -471,6 +471,25 @@ function visualDeltaShipGateReason(state = {}) {
471
471
  if (reason) return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof: ${reason}`;
472
472
  return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof`;
473
473
  }
474
+ function proofAssessmentHardBlockersForState(state = {}) {
475
+ const request = objectValue(state?.proof_assessment_request);
476
+ const blockers = [];
477
+ const add = (value) => {
478
+ if (typeof value !== "string") return;
479
+ const trimmed = value.trim();
480
+ if (trimmed && !blockers.includes(trimmed)) blockers.push(trimmed);
481
+ };
482
+ if (Array.isArray(request.hard_blockers)) {
483
+ for (const blocker of request.hard_blockers) add(blocker);
484
+ }
485
+ add(state?.structured_interaction_capture_failure_summary);
486
+ add(state?.structured_interaction_failure_summary);
487
+ const mergeRecommendation = String(state?.merge_recommendation || "").trim();
488
+ if (mergeRecommendation === "do-not-merge" && blockers.length) {
489
+ add("merge_recommendation=do-not-merge because the proof bundle contains hard blockers.");
490
+ }
491
+ return blockers;
492
+ }
474
493
  function visualDeltaEvidenceIssueCode(state = {}, blocker = "") {
475
494
  const visualDelta = visualDeltaForState(state || {});
476
495
  const status = String(visualDelta.status || "").trim();
@@ -505,6 +524,7 @@ function validateShipGate(state = {}) {
505
524
  const visualDelta = visualDeltaForState(state);
506
525
  const visualDeltaRequired = visualDeltaRequiredForState(state);
507
526
  const visualDeltaBlocker = visualDeltaShipGateReason(state);
527
+ const hardBlockers = proofAssessmentHardBlockersForState(state);
508
528
  const reasons = [];
509
529
  if (!["before", "prod", "both"].includes(reference)) {
510
530
  reasons.push(`reference must be before, prod, or both; got ${reference}`);
@@ -536,6 +556,9 @@ function validateShipGate(state = {}) {
536
556
  if (visualDeltaBlocker) {
537
557
  reasons.push(visualDeltaBlocker);
538
558
  }
559
+ for (const blocker of hardBlockers) {
560
+ reasons.push(`proof hard blocker prevents ready_to_ship: ${blocker}`);
561
+ }
539
562
  return {
540
563
  ok: reasons.length === 0,
541
564
  reasons,
@@ -552,7 +575,8 @@ function validateShipGate(state = {}) {
552
575
  proof_assessment_source: proofAssessment.source,
553
576
  visual_delta_required: visualDeltaRequired,
554
577
  visual_delta_status: typeof visualDelta.status === "string" ? visualDelta.status : null,
555
- visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null
578
+ visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null,
579
+ hard_blockers: hardBlockers
556
580
  }
557
581
  };
558
582
  }
@@ -1038,6 +1062,10 @@ var init_proof_run_core = __esm({
1038
1062
  }],
1039
1063
  required_state: ["verify_decision_request"]
1040
1064
  },
1065
+ verify_capture_blocked: {
1066
+ purpose: "Verify capture produced conclusive failed browser evidence and should stop instead of retrying proof authoring.",
1067
+ required_state: ["verify_decision_request"]
1068
+ },
1041
1069
  verify_supervisor_judgment: {
1042
1070
  purpose: "Supervising agent judges whether captured evidence proves the change is ready to ship.",
1043
1071
  accepted_inputs: [{
@@ -1286,14 +1314,18 @@ function verifyAssessment(state) {
1286
1314
  };
1287
1315
  }
1288
1316
  if (state?.verify_status === "capture_incomplete") {
1317
+ const captureQuality = verifyDecision?.capture_quality || {};
1318
+ const terminalBlocker = captureQuality?.terminal_blocker === true || captureQuality?.blocking === true;
1319
+ const recommendedStage = terminalBlocker ? null : verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author";
1320
+ const continueWithStage = terminalBlocker ? null : verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author";
1289
1321
  return {
1290
- decision: verifyDecision?.capture_quality?.decision || "revise_capture",
1322
+ decision: captureQuality?.decision || "revise_capture",
1291
1323
  summary: verifyDecision?.summary || "Verify needs another internal capture iteration before the evidence can be judged.",
1292
- recommendedStage: verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author",
1293
- continueWithStage: verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author",
1324
+ recommendedStage,
1325
+ continueWithStage,
1294
1326
  escalationTarget: "agent",
1295
- reasons: Array.isArray(verifyDecision?.capture_quality?.reasons) ? verifyDecision.capture_quality.reasons : [],
1296
- raw: verifyDecision?.capture_quality || verifyDecision,
1327
+ reasons: Array.isArray(captureQuality?.reasons) ? captureQuality.reasons : [],
1328
+ raw: captureQuality || verifyDecision,
1297
1329
  source: "workflow_capture"
1298
1330
  };
1299
1331
  }
@@ -2513,7 +2545,9 @@ ${implementRes.stderr || ""}`;
2513
2545
  convergenceSignals
2514
2546
  };
2515
2547
  if (verifyStatus !== "evidence_captured") {
2516
- if ((verifyContinueWithStage || verifyRecommendedStage || "author") === "author") {
2548
+ const captureQuality = verifyDecisionRequest?.capture_quality || {};
2549
+ const captureTerminalBlocker = captureQuality?.terminal_blocker === true || captureQuality?.blocking === true;
2550
+ if (!captureTerminalBlocker && (verifyContinueWithStage || verifyRecommendedStage || "author") === "author") {
2517
2551
  updateState(config.statePath, (currentState) => {
2518
2552
  currentState.author_status = "needs_authoring";
2519
2553
  currentState.proof_plan_status = "needs_authoring";
@@ -2521,7 +2555,7 @@ ${implementRes.stderr || ""}`;
2521
2555
  });
2522
2556
  state = readState(config.statePath);
2523
2557
  }
2524
- const checkpointName = "verify_capture_retry";
2558
+ const checkpointName = captureTerminalBlocker ? "verify_capture_blocked" : "verify_capture_retry";
2525
2559
  const summary = stringValue(proofAssessment.summary) || "Verify ran, but the proof packet still needs internal capture-plan work before it should ship.";
2526
2560
  recordAttempt("verify", "checkpoint", summary, {
2527
2561
  autoApproved: verifyRes.autoApproved || false,
@@ -2534,11 +2568,11 @@ ${implementRes.stderr || ""}`;
2534
2568
  summary,
2535
2569
  {
2536
2570
  ok: true,
2537
- nextActions: ["inspect_after_capture", "continue_internal_loop_with_checkpoint", "return_to_recon_if_baseline_is_wrong"],
2571
+ nextActions: captureTerminalBlocker ? ["inspect_after_capture", "report_specific_browser_evidence_blocker", "start_a_new_run_after_the_product_or_script_is_fixed"] : ["inspect_after_capture", "continue_internal_loop_with_checkpoint", "return_to_recon_if_baseline_is_wrong"],
2538
2572
  advanceOptions: verifyLoopAdvanceOptions,
2539
- recommendedAdvanceStage: verifyRecommendedStage || "author",
2540
- continueWithStage: verifyContinueWithStage || "author",
2541
- blocking: false,
2573
+ recommendedAdvanceStage: captureTerminalBlocker ? null : verifyRecommendedStage || "author",
2574
+ continueWithStage: captureTerminalBlocker ? null : verifyContinueWithStage || "author",
2575
+ blocking: captureTerminalBlocker,
2542
2576
  details: verifyDetails,
2543
2577
  verifyStatus,
2544
2578
  verifySummary,
@@ -4602,6 +4636,17 @@ function proofAssessmentRequestsShip(payload) {
4602
4636
  const continueStage = String(payload.continue_with_stage || "");
4603
4637
  return decision === "ready_to_ship" || recommendedStage === "ship" || continueStage === "ship";
4604
4638
  }
4639
+ function proofAssessmentHardBlockers(state, payload) {
4640
+ const blockers = proofAssessmentHardBlockersForState(state || {});
4641
+ if (Array.isArray(payload.hard_blockers)) {
4642
+ for (const blocker of payload.hard_blockers) {
4643
+ if (typeof blocker !== "string") continue;
4644
+ const trimmed = blocker.trim();
4645
+ if (trimmed && !blockers.includes(trimmed)) blockers.push(trimmed);
4646
+ }
4647
+ }
4648
+ return blockers;
4649
+ }
4605
4650
  function proofAssessmentContinuation(result, payload) {
4606
4651
  const proof_assessment_json = jsonParam(payload);
4607
4652
  return { ...baseContinuation(result), proof_assessment_json };
@@ -5541,6 +5586,33 @@ async function routeCheckpoint(request, state, result, agent, input) {
5541
5586
  adapter_details: assessment.details || null
5542
5587
  })
5543
5588
  });
5589
+ const hardBlockers = proofAssessmentHardBlockers(context.fullRiddleState || {}, payload);
5590
+ if (proofAssessmentRequestsShip(payload) && hardBlockers.length) {
5591
+ const summary = hardBlockers[0];
5592
+ recordEvent(state, {
5593
+ kind: "agent.proof_assessment.hard_blocked",
5594
+ checkpoint,
5595
+ stage: "verify",
5596
+ summary,
5597
+ details: compactRecord({
5598
+ hard_blockers: hardBlockers,
5599
+ proof_assessment: payload,
5600
+ agent_duration_ms: durationMs
5601
+ })
5602
+ });
5603
+ return {
5604
+ blocker: {
5605
+ code: "proof_hard_blocker",
5606
+ checkpoint,
5607
+ message: "Riddle Proof cannot mark ready_to_ship while the proof bundle contains a hard blocker: " + summary,
5608
+ details: compactRecord({
5609
+ hard_blockers: hardBlockers,
5610
+ proofAssessment: payload,
5611
+ verifyDecisionRequest: context.fullRiddleState?.verify_decision_request || result.verifyDecisionRequest || result.checkpointContract?.verify_decision_request || null
5612
+ })
5613
+ }
5614
+ };
5615
+ }
5544
5616
  const visualBlocker = proofAssessmentVisualBlocker({
5545
5617
  ...context.fullRiddleState || {},
5546
5618
  verification_mode: context.fullRiddleState?.verification_mode || request.verification_mode
@@ -5598,6 +5670,19 @@ async function routeCheckpoint(request, state, result, agent, input) {
5598
5670
  }
5599
5671
  };
5600
5672
  }
5673
+ if (checkpoint === "verify_capture_blocked") {
5674
+ return {
5675
+ blocker: {
5676
+ code: "verify_capture_blocked",
5677
+ checkpoint,
5678
+ message: result.summary || "Verify captured conclusive failed browser evidence and stopped instead of retrying proof authoring.",
5679
+ details: compactRecord({
5680
+ verifyDecisionRequest: result.verifyDecisionRequest || result.checkpointContract?.verify_decision_request || null,
5681
+ checkpointContract: result.checkpointContract || null
5682
+ })
5683
+ }
5684
+ };
5685
+ }
5601
5686
  if (checkpoint === "awaiting_stage_advance") {
5602
5687
  const next = recommendedContinuation(result) || defaultAwaitingStageContinuation(result);
5603
5688
  if (next) {
@@ -2,10 +2,10 @@ import {
2
2
  createDisabledRiddleProofAgentAdapter,
3
3
  readRiddleProofRunStatus,
4
4
  runRiddleProofEngineHarness
5
- } from "./chunk-BBUO7HM4.js";
5
+ } from "./chunk-RTLA6CPP.js";
6
6
  import "./chunk-YZUVEJ5B.js";
7
7
  import "./chunk-FMOYUYH2.js";
8
- import "./chunk-5N5QFI2S.js";
8
+ import "./chunk-7GZY5PLT.js";
9
9
  import "./chunk-4FOHZ7JG.js";
10
10
  import "./chunk-VY4Y5U57.js";
11
11
  import "./chunk-MLKGABMK.js";
package/dist/index.cjs CHANGED
@@ -471,6 +471,25 @@ function visualDeltaShipGateReason(state = {}) {
471
471
  if (reason) return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof: ${reason}`;
472
472
  return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof`;
473
473
  }
474
+ function proofAssessmentHardBlockersForState(state = {}) {
475
+ const request = objectValue(state?.proof_assessment_request);
476
+ const blockers = [];
477
+ const add = (value) => {
478
+ if (typeof value !== "string") return;
479
+ const trimmed = value.trim();
480
+ if (trimmed && !blockers.includes(trimmed)) blockers.push(trimmed);
481
+ };
482
+ if (Array.isArray(request.hard_blockers)) {
483
+ for (const blocker of request.hard_blockers) add(blocker);
484
+ }
485
+ add(state?.structured_interaction_capture_failure_summary);
486
+ add(state?.structured_interaction_failure_summary);
487
+ const mergeRecommendation = String(state?.merge_recommendation || "").trim();
488
+ if (mergeRecommendation === "do-not-merge" && blockers.length) {
489
+ add("merge_recommendation=do-not-merge because the proof bundle contains hard blockers.");
490
+ }
491
+ return blockers;
492
+ }
474
493
  function visualDeltaEvidenceIssueCode(state = {}, blocker = "") {
475
494
  const visualDelta = visualDeltaForState(state || {});
476
495
  const status = String(visualDelta.status || "").trim();
@@ -505,6 +524,7 @@ function validateShipGate(state = {}) {
505
524
  const visualDelta = visualDeltaForState(state);
506
525
  const visualDeltaRequired = visualDeltaRequiredForState(state);
507
526
  const visualDeltaBlocker = visualDeltaShipGateReason(state);
527
+ const hardBlockers = proofAssessmentHardBlockersForState(state);
508
528
  const reasons = [];
509
529
  if (!["before", "prod", "both"].includes(reference)) {
510
530
  reasons.push(`reference must be before, prod, or both; got ${reference}`);
@@ -536,6 +556,9 @@ function validateShipGate(state = {}) {
536
556
  if (visualDeltaBlocker) {
537
557
  reasons.push(visualDeltaBlocker);
538
558
  }
559
+ for (const blocker of hardBlockers) {
560
+ reasons.push(`proof hard blocker prevents ready_to_ship: ${blocker}`);
561
+ }
539
562
  return {
540
563
  ok: reasons.length === 0,
541
564
  reasons,
@@ -552,7 +575,8 @@ function validateShipGate(state = {}) {
552
575
  proof_assessment_source: proofAssessment.source,
553
576
  visual_delta_required: visualDeltaRequired,
554
577
  visual_delta_status: typeof visualDelta.status === "string" ? visualDelta.status : null,
555
- visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null
578
+ visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null,
579
+ hard_blockers: hardBlockers
556
580
  }
557
581
  };
558
582
  }
@@ -1038,6 +1062,10 @@ var init_proof_run_core = __esm({
1038
1062
  }],
1039
1063
  required_state: ["verify_decision_request"]
1040
1064
  },
1065
+ verify_capture_blocked: {
1066
+ purpose: "Verify capture produced conclusive failed browser evidence and should stop instead of retrying proof authoring.",
1067
+ required_state: ["verify_decision_request"]
1068
+ },
1041
1069
  verify_supervisor_judgment: {
1042
1070
  purpose: "Supervising agent judges whether captured evidence proves the change is ready to ship.",
1043
1071
  accepted_inputs: [{
@@ -1286,14 +1314,18 @@ function verifyAssessment(state) {
1286
1314
  };
1287
1315
  }
1288
1316
  if (state?.verify_status === "capture_incomplete") {
1317
+ const captureQuality = verifyDecision?.capture_quality || {};
1318
+ const terminalBlocker = captureQuality?.terminal_blocker === true || captureQuality?.blocking === true;
1319
+ const recommendedStage = terminalBlocker ? null : verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author";
1320
+ const continueWithStage = terminalBlocker ? null : verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author";
1289
1321
  return {
1290
- decision: verifyDecision?.capture_quality?.decision || "revise_capture",
1322
+ decision: captureQuality?.decision || "revise_capture",
1291
1323
  summary: verifyDecision?.summary || "Verify needs another internal capture iteration before the evidence can be judged.",
1292
- recommendedStage: verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author",
1293
- continueWithStage: verifyDecision?.continue_with_stage || verifyDecision?.recommended_stage || "author",
1324
+ recommendedStage,
1325
+ continueWithStage,
1294
1326
  escalationTarget: "agent",
1295
- reasons: Array.isArray(verifyDecision?.capture_quality?.reasons) ? verifyDecision.capture_quality.reasons : [],
1296
- raw: verifyDecision?.capture_quality || verifyDecision,
1327
+ reasons: Array.isArray(captureQuality?.reasons) ? captureQuality.reasons : [],
1328
+ raw: captureQuality || verifyDecision,
1297
1329
  source: "workflow_capture"
1298
1330
  };
1299
1331
  }
@@ -2513,7 +2545,9 @@ ${implementRes.stderr || ""}`;
2513
2545
  convergenceSignals
2514
2546
  };
2515
2547
  if (verifyStatus !== "evidence_captured") {
2516
- if ((verifyContinueWithStage || verifyRecommendedStage || "author") === "author") {
2548
+ const captureQuality = verifyDecisionRequest?.capture_quality || {};
2549
+ const captureTerminalBlocker = captureQuality?.terminal_blocker === true || captureQuality?.blocking === true;
2550
+ if (!captureTerminalBlocker && (verifyContinueWithStage || verifyRecommendedStage || "author") === "author") {
2517
2551
  updateState(config.statePath, (currentState) => {
2518
2552
  currentState.author_status = "needs_authoring";
2519
2553
  currentState.proof_plan_status = "needs_authoring";
@@ -2521,7 +2555,7 @@ ${implementRes.stderr || ""}`;
2521
2555
  });
2522
2556
  state = readState(config.statePath);
2523
2557
  }
2524
- const checkpointName = "verify_capture_retry";
2558
+ const checkpointName = captureTerminalBlocker ? "verify_capture_blocked" : "verify_capture_retry";
2525
2559
  const summary = stringValue(proofAssessment.summary) || "Verify ran, but the proof packet still needs internal capture-plan work before it should ship.";
2526
2560
  recordAttempt("verify", "checkpoint", summary, {
2527
2561
  autoApproved: verifyRes.autoApproved || false,
@@ -2534,11 +2568,11 @@ ${implementRes.stderr || ""}`;
2534
2568
  summary,
2535
2569
  {
2536
2570
  ok: true,
2537
- nextActions: ["inspect_after_capture", "continue_internal_loop_with_checkpoint", "return_to_recon_if_baseline_is_wrong"],
2571
+ nextActions: captureTerminalBlocker ? ["inspect_after_capture", "report_specific_browser_evidence_blocker", "start_a_new_run_after_the_product_or_script_is_fixed"] : ["inspect_after_capture", "continue_internal_loop_with_checkpoint", "return_to_recon_if_baseline_is_wrong"],
2538
2572
  advanceOptions: verifyLoopAdvanceOptions,
2539
- recommendedAdvanceStage: verifyRecommendedStage || "author",
2540
- continueWithStage: verifyContinueWithStage || "author",
2541
- blocking: false,
2573
+ recommendedAdvanceStage: captureTerminalBlocker ? null : verifyRecommendedStage || "author",
2574
+ continueWithStage: captureTerminalBlocker ? null : verifyContinueWithStage || "author",
2575
+ blocking: captureTerminalBlocker,
2542
2576
  details: verifyDetails,
2543
2577
  verifyStatus,
2544
2578
  verifySummary,
@@ -5336,6 +5370,17 @@ function proofAssessmentRequestsShip(payload) {
5336
5370
  const continueStage = String(payload.continue_with_stage || "");
5337
5371
  return decision === "ready_to_ship" || recommendedStage === "ship" || continueStage === "ship";
5338
5372
  }
5373
+ function proofAssessmentHardBlockers(state, payload) {
5374
+ const blockers = proofAssessmentHardBlockersForState(state || {});
5375
+ if (Array.isArray(payload.hard_blockers)) {
5376
+ for (const blocker of payload.hard_blockers) {
5377
+ if (typeof blocker !== "string") continue;
5378
+ const trimmed = blocker.trim();
5379
+ if (trimmed && !blockers.includes(trimmed)) blockers.push(trimmed);
5380
+ }
5381
+ }
5382
+ return blockers;
5383
+ }
5339
5384
  function proofAssessmentContinuation(result, payload) {
5340
5385
  const proof_assessment_json = jsonParam(payload);
5341
5386
  return { ...baseContinuation(result), proof_assessment_json };
@@ -6275,6 +6320,33 @@ async function routeCheckpoint(request, state, result, agent, input) {
6275
6320
  adapter_details: assessment.details || null
6276
6321
  })
6277
6322
  });
6323
+ const hardBlockers = proofAssessmentHardBlockers(context.fullRiddleState || {}, payload);
6324
+ if (proofAssessmentRequestsShip(payload) && hardBlockers.length) {
6325
+ const summary = hardBlockers[0];
6326
+ recordEvent(state, {
6327
+ kind: "agent.proof_assessment.hard_blocked",
6328
+ checkpoint,
6329
+ stage: "verify",
6330
+ summary,
6331
+ details: compactRecord({
6332
+ hard_blockers: hardBlockers,
6333
+ proof_assessment: payload,
6334
+ agent_duration_ms: durationMs
6335
+ })
6336
+ });
6337
+ return {
6338
+ blocker: {
6339
+ code: "proof_hard_blocker",
6340
+ checkpoint,
6341
+ message: "Riddle Proof cannot mark ready_to_ship while the proof bundle contains a hard blocker: " + summary,
6342
+ details: compactRecord({
6343
+ hard_blockers: hardBlockers,
6344
+ proofAssessment: payload,
6345
+ verifyDecisionRequest: context.fullRiddleState?.verify_decision_request || result.verifyDecisionRequest || result.checkpointContract?.verify_decision_request || null
6346
+ })
6347
+ }
6348
+ };
6349
+ }
6278
6350
  const visualBlocker = proofAssessmentVisualBlocker({
6279
6351
  ...context.fullRiddleState || {},
6280
6352
  verification_mode: context.fullRiddleState?.verification_mode || request.verification_mode
@@ -6332,6 +6404,19 @@ async function routeCheckpoint(request, state, result, agent, input) {
6332
6404
  }
6333
6405
  };
6334
6406
  }
6407
+ if (checkpoint === "verify_capture_blocked") {
6408
+ return {
6409
+ blocker: {
6410
+ code: "verify_capture_blocked",
6411
+ checkpoint,
6412
+ message: result.summary || "Verify captured conclusive failed browser evidence and stopped instead of retrying proof authoring.",
6413
+ details: compactRecord({
6414
+ verifyDecisionRequest: result.verifyDecisionRequest || result.checkpointContract?.verify_decision_request || null,
6415
+ checkpointContract: result.checkpointContract || null
6416
+ })
6417
+ }
6418
+ };
6419
+ }
6335
6420
  if (checkpoint === "awaiting_stage_advance") {
6336
6421
  const next = recommendedContinuation(result) || defaultAwaitingStageContinuation(result);
6337
6422
  if (next) {
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runRiddleProof
3
- } from "./chunk-5N6MQCLC.js";
3
+ } from "./chunk-NGX4SUQN.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-BBUO7HM4.js";
98
+ } from "./chunk-RTLA6CPP.js";
99
99
  import {
100
100
  RIDDLE_PROOF_RUN_STATE_VERSION,
101
101
  appendRunEvent,
@@ -112,7 +112,7 @@ import {
112
112
  RIDDLE_PROOF_RUN_CARD_VERSION,
113
113
  createRiddleProofRunCard
114
114
  } from "./chunk-FMOYUYH2.js";
115
- import "./chunk-5N5QFI2S.js";
115
+ import "./chunk-7GZY5PLT.js";
116
116
  import {
117
117
  RIDDLE_PROOF_CHECKPOINT_PACKET_VERSION,
118
118
  RIDDLE_PROOF_CHECKPOINT_RESPONSE_VERSION,
@@ -94,6 +94,7 @@ interface ShipGateValidation {
94
94
  visual_delta_required: boolean;
95
95
  visual_delta_status: string | null;
96
96
  visual_delta_passed: boolean | null;
97
+ hard_blockers?: string[];
97
98
  };
98
99
  }
99
100
  declare function resolveRiddleProofDir(config?: PluginConfig): string;
@@ -220,6 +221,7 @@ declare function invalidateVerifyEvidence(state?: any): {
220
221
  declare function visualDeltaRequiredForState(state?: any): boolean;
221
222
  declare function visualDeltaForState(state?: any): Record<string, any>;
222
223
  declare function visualDeltaShipGateReason(state?: any): string | null;
224
+ declare function proofAssessmentHardBlockersForState(state?: any): string[];
223
225
  declare function requiredBaselineLabelsForState(state?: any): string[];
224
226
  declare function validateShipGate(state?: any): ShipGateValidation;
225
227
  declare function buildCheckpointContract(state: any, request: {
@@ -339,6 +341,7 @@ declare const proofRunCore_invalidateVerifyEvidence: typeof invalidateVerifyEvid
339
341
  declare const proofRunCore_mergeStateFromParams: typeof mergeStateFromParams;
340
342
  declare const proofRunCore_noImplementationModeFor: typeof noImplementationModeFor;
341
343
  declare const proofRunCore_previewModeFromWorkflowMode: typeof previewModeFromWorkflowMode;
344
+ declare const proofRunCore_proofAssessmentHardBlockersForState: typeof proofAssessmentHardBlockersForState;
342
345
  declare const proofRunCore_readState: typeof readState;
343
346
  declare const proofRunCore_recordStageAttempt: typeof recordStageAttempt;
344
347
  declare const proofRunCore_requiredBaselineLabelsForState: typeof requiredBaselineLabelsForState;
@@ -353,7 +356,7 @@ declare const proofRunCore_visualDeltaShipGateReason: typeof visualDeltaShipGate
353
356
  declare const proofRunCore_workflowFile: typeof workflowFile;
354
357
  declare const proofRunCore_writeState: typeof writeState;
355
358
  declare namespace proofRunCore {
356
- export { proofRunCore_BUNDLED_RIDDLE_PROOF_DIR as BUNDLED_RIDDLE_PROOF_DIR, proofRunCore_CHECKPOINT_CONTRACT_VERSION as CHECKPOINT_CONTRACT_VERSION, type proofRunCore_CheckpointInputContract as CheckpointInputContract, type proofRunCore_PluginConfig as PluginConfig, proofRunCore_RIDDLE_PROOF_DIR_CANDIDATES as RIDDLE_PROOF_DIR_CANDIDATES, type proofRunCore_ShipGateValidation as ShipGateValidation, proofRunCore_WORKFLOW_STAGE_ORDER as WORKFLOW_STAGE_ORDER, type proofRunCore_WorkflowAction as WorkflowAction, type proofRunCore_WorkflowParams as WorkflowParams, type proofRunCore_WorkflowStage as WorkflowStage, proofRunCore_buildCheckpointContract as buildCheckpointContract, proofRunCore_buildSetupArgs as buildSetupArgs, proofRunCore_checkpointContinueStage as checkpointContinueStage, proofRunCore_clearStageDecisionRequest as clearStageDecisionRequest, proofRunCore_ensureAction as ensureAction, proofRunCore_ensureStageLoopState as ensureStageLoopState, proofRunCore_invalidateVerifyEvidence as invalidateVerifyEvidence, proofRunCore_mergeStateFromParams as mergeStateFromParams, proofRunCore_noImplementationModeFor as noImplementationModeFor, proofRunCore_previewModeFromWorkflowMode as previewModeFromWorkflowMode, proofRunCore_readState as readState, proofRunCore_recordStageAttempt as recordStageAttempt, proofRunCore_requiredBaselineLabelsForState as requiredBaselineLabelsForState, proofRunCore_resolveConfig as resolveConfig, proofRunCore_resolveRiddleProofDir as resolveRiddleProofDir, proofRunCore_setStageDecisionRequest as setStageDecisionRequest, proofRunCore_summarizeState as summarizeState, proofRunCore_validateShipGate as validateShipGate, proofRunCore_visualDeltaForState as visualDeltaForState, proofRunCore_visualDeltaRequiredForState as visualDeltaRequiredForState, proofRunCore_visualDeltaShipGateReason as visualDeltaShipGateReason, proofRunCore_workflowFile as workflowFile, proofRunCore_writeState as writeState };
359
+ export { proofRunCore_BUNDLED_RIDDLE_PROOF_DIR as BUNDLED_RIDDLE_PROOF_DIR, proofRunCore_CHECKPOINT_CONTRACT_VERSION as CHECKPOINT_CONTRACT_VERSION, type proofRunCore_CheckpointInputContract as CheckpointInputContract, type proofRunCore_PluginConfig as PluginConfig, proofRunCore_RIDDLE_PROOF_DIR_CANDIDATES as RIDDLE_PROOF_DIR_CANDIDATES, type proofRunCore_ShipGateValidation as ShipGateValidation, proofRunCore_WORKFLOW_STAGE_ORDER as WORKFLOW_STAGE_ORDER, type proofRunCore_WorkflowAction as WorkflowAction, type proofRunCore_WorkflowParams as WorkflowParams, type proofRunCore_WorkflowStage as WorkflowStage, proofRunCore_buildCheckpointContract as buildCheckpointContract, proofRunCore_buildSetupArgs as buildSetupArgs, proofRunCore_checkpointContinueStage as checkpointContinueStage, proofRunCore_clearStageDecisionRequest as clearStageDecisionRequest, proofRunCore_ensureAction as ensureAction, proofRunCore_ensureStageLoopState as ensureStageLoopState, proofRunCore_invalidateVerifyEvidence as invalidateVerifyEvidence, proofRunCore_mergeStateFromParams as mergeStateFromParams, proofRunCore_noImplementationModeFor as noImplementationModeFor, proofRunCore_previewModeFromWorkflowMode as previewModeFromWorkflowMode, proofRunCore_proofAssessmentHardBlockersForState as proofAssessmentHardBlockersForState, proofRunCore_readState as readState, proofRunCore_recordStageAttempt as recordStageAttempt, proofRunCore_requiredBaselineLabelsForState as requiredBaselineLabelsForState, proofRunCore_resolveConfig as resolveConfig, proofRunCore_resolveRiddleProofDir as resolveRiddleProofDir, proofRunCore_setStageDecisionRequest as setStageDecisionRequest, proofRunCore_summarizeState as summarizeState, proofRunCore_validateShipGate as validateShipGate, proofRunCore_visualDeltaForState as visualDeltaForState, proofRunCore_visualDeltaRequiredForState as visualDeltaRequiredForState, proofRunCore_visualDeltaShipGateReason as visualDeltaShipGateReason, proofRunCore_workflowFile as workflowFile, proofRunCore_writeState as writeState };
357
360
  }
358
361
 
359
- export { workflowFile as A, BUNDLED_RIDDLE_PROOF_DIR as B, CHECKPOINT_CONTRACT_VERSION as C, writeState as D, type PluginConfig as P, RIDDLE_PROOF_DIR_CANDIDATES as R, type ShipGateValidation as S, type WorkflowParams as W, type WorkflowStage as a, type CheckpointInputContract as b, WORKFLOW_STAGE_ORDER as c, type WorkflowAction as d, buildCheckpointContract as e, buildSetupArgs as f, checkpointContinueStage as g, clearStageDecisionRequest as h, ensureAction as i, ensureStageLoopState as j, invalidateVerifyEvidence as k, previewModeFromWorkflowMode as l, mergeStateFromParams as m, noImplementationModeFor as n, readState as o, proofRunCore as p, recordStageAttempt as q, resolveConfig as r, requiredBaselineLabelsForState as s, resolveRiddleProofDir as t, setStageDecisionRequest as u, summarizeState as v, validateShipGate as w, visualDeltaForState as x, visualDeltaRequiredForState as y, visualDeltaShipGateReason as z };
362
+ export { visualDeltaShipGateReason as A, BUNDLED_RIDDLE_PROOF_DIR as B, CHECKPOINT_CONTRACT_VERSION as C, workflowFile as D, writeState as E, type PluginConfig as P, RIDDLE_PROOF_DIR_CANDIDATES as R, type ShipGateValidation as S, type WorkflowParams as W, type WorkflowStage as a, type CheckpointInputContract as b, WORKFLOW_STAGE_ORDER as c, type WorkflowAction as d, buildCheckpointContract as e, buildSetupArgs as f, checkpointContinueStage as g, clearStageDecisionRequest as h, ensureAction as i, ensureStageLoopState as j, invalidateVerifyEvidence as k, previewModeFromWorkflowMode as l, mergeStateFromParams as m, noImplementationModeFor as n, proofAssessmentHardBlockersForState as o, proofRunCore as p, readState as q, resolveConfig as r, recordStageAttempt as s, requiredBaselineLabelsForState as t, resolveRiddleProofDir as u, setStageDecisionRequest as v, summarizeState as w, validateShipGate as x, visualDeltaForState as y, visualDeltaRequiredForState as z };
@@ -94,6 +94,7 @@ interface ShipGateValidation {
94
94
  visual_delta_required: boolean;
95
95
  visual_delta_status: string | null;
96
96
  visual_delta_passed: boolean | null;
97
+ hard_blockers?: string[];
97
98
  };
98
99
  }
99
100
  declare function resolveRiddleProofDir(config?: PluginConfig): string;
@@ -220,6 +221,7 @@ declare function invalidateVerifyEvidence(state?: any): {
220
221
  declare function visualDeltaRequiredForState(state?: any): boolean;
221
222
  declare function visualDeltaForState(state?: any): Record<string, any>;
222
223
  declare function visualDeltaShipGateReason(state?: any): string | null;
224
+ declare function proofAssessmentHardBlockersForState(state?: any): string[];
223
225
  declare function requiredBaselineLabelsForState(state?: any): string[];
224
226
  declare function validateShipGate(state?: any): ShipGateValidation;
225
227
  declare function buildCheckpointContract(state: any, request: {
@@ -339,6 +341,7 @@ declare const proofRunCore_invalidateVerifyEvidence: typeof invalidateVerifyEvid
339
341
  declare const proofRunCore_mergeStateFromParams: typeof mergeStateFromParams;
340
342
  declare const proofRunCore_noImplementationModeFor: typeof noImplementationModeFor;
341
343
  declare const proofRunCore_previewModeFromWorkflowMode: typeof previewModeFromWorkflowMode;
344
+ declare const proofRunCore_proofAssessmentHardBlockersForState: typeof proofAssessmentHardBlockersForState;
342
345
  declare const proofRunCore_readState: typeof readState;
343
346
  declare const proofRunCore_recordStageAttempt: typeof recordStageAttempt;
344
347
  declare const proofRunCore_requiredBaselineLabelsForState: typeof requiredBaselineLabelsForState;
@@ -353,7 +356,7 @@ declare const proofRunCore_visualDeltaShipGateReason: typeof visualDeltaShipGate
353
356
  declare const proofRunCore_workflowFile: typeof workflowFile;
354
357
  declare const proofRunCore_writeState: typeof writeState;
355
358
  declare namespace proofRunCore {
356
- export { proofRunCore_BUNDLED_RIDDLE_PROOF_DIR as BUNDLED_RIDDLE_PROOF_DIR, proofRunCore_CHECKPOINT_CONTRACT_VERSION as CHECKPOINT_CONTRACT_VERSION, type proofRunCore_CheckpointInputContract as CheckpointInputContract, type proofRunCore_PluginConfig as PluginConfig, proofRunCore_RIDDLE_PROOF_DIR_CANDIDATES as RIDDLE_PROOF_DIR_CANDIDATES, type proofRunCore_ShipGateValidation as ShipGateValidation, proofRunCore_WORKFLOW_STAGE_ORDER as WORKFLOW_STAGE_ORDER, type proofRunCore_WorkflowAction as WorkflowAction, type proofRunCore_WorkflowParams as WorkflowParams, type proofRunCore_WorkflowStage as WorkflowStage, proofRunCore_buildCheckpointContract as buildCheckpointContract, proofRunCore_buildSetupArgs as buildSetupArgs, proofRunCore_checkpointContinueStage as checkpointContinueStage, proofRunCore_clearStageDecisionRequest as clearStageDecisionRequest, proofRunCore_ensureAction as ensureAction, proofRunCore_ensureStageLoopState as ensureStageLoopState, proofRunCore_invalidateVerifyEvidence as invalidateVerifyEvidence, proofRunCore_mergeStateFromParams as mergeStateFromParams, proofRunCore_noImplementationModeFor as noImplementationModeFor, proofRunCore_previewModeFromWorkflowMode as previewModeFromWorkflowMode, proofRunCore_readState as readState, proofRunCore_recordStageAttempt as recordStageAttempt, proofRunCore_requiredBaselineLabelsForState as requiredBaselineLabelsForState, proofRunCore_resolveConfig as resolveConfig, proofRunCore_resolveRiddleProofDir as resolveRiddleProofDir, proofRunCore_setStageDecisionRequest as setStageDecisionRequest, proofRunCore_summarizeState as summarizeState, proofRunCore_validateShipGate as validateShipGate, proofRunCore_visualDeltaForState as visualDeltaForState, proofRunCore_visualDeltaRequiredForState as visualDeltaRequiredForState, proofRunCore_visualDeltaShipGateReason as visualDeltaShipGateReason, proofRunCore_workflowFile as workflowFile, proofRunCore_writeState as writeState };
359
+ export { proofRunCore_BUNDLED_RIDDLE_PROOF_DIR as BUNDLED_RIDDLE_PROOF_DIR, proofRunCore_CHECKPOINT_CONTRACT_VERSION as CHECKPOINT_CONTRACT_VERSION, type proofRunCore_CheckpointInputContract as CheckpointInputContract, type proofRunCore_PluginConfig as PluginConfig, proofRunCore_RIDDLE_PROOF_DIR_CANDIDATES as RIDDLE_PROOF_DIR_CANDIDATES, type proofRunCore_ShipGateValidation as ShipGateValidation, proofRunCore_WORKFLOW_STAGE_ORDER as WORKFLOW_STAGE_ORDER, type proofRunCore_WorkflowAction as WorkflowAction, type proofRunCore_WorkflowParams as WorkflowParams, type proofRunCore_WorkflowStage as WorkflowStage, proofRunCore_buildCheckpointContract as buildCheckpointContract, proofRunCore_buildSetupArgs as buildSetupArgs, proofRunCore_checkpointContinueStage as checkpointContinueStage, proofRunCore_clearStageDecisionRequest as clearStageDecisionRequest, proofRunCore_ensureAction as ensureAction, proofRunCore_ensureStageLoopState as ensureStageLoopState, proofRunCore_invalidateVerifyEvidence as invalidateVerifyEvidence, proofRunCore_mergeStateFromParams as mergeStateFromParams, proofRunCore_noImplementationModeFor as noImplementationModeFor, proofRunCore_previewModeFromWorkflowMode as previewModeFromWorkflowMode, proofRunCore_proofAssessmentHardBlockersForState as proofAssessmentHardBlockersForState, proofRunCore_readState as readState, proofRunCore_recordStageAttempt as recordStageAttempt, proofRunCore_requiredBaselineLabelsForState as requiredBaselineLabelsForState, proofRunCore_resolveConfig as resolveConfig, proofRunCore_resolveRiddleProofDir as resolveRiddleProofDir, proofRunCore_setStageDecisionRequest as setStageDecisionRequest, proofRunCore_summarizeState as summarizeState, proofRunCore_validateShipGate as validateShipGate, proofRunCore_visualDeltaForState as visualDeltaForState, proofRunCore_visualDeltaRequiredForState as visualDeltaRequiredForState, proofRunCore_visualDeltaShipGateReason as visualDeltaShipGateReason, proofRunCore_workflowFile as workflowFile, proofRunCore_writeState as writeState };
357
360
  }
358
361
 
359
- export { workflowFile as A, BUNDLED_RIDDLE_PROOF_DIR as B, CHECKPOINT_CONTRACT_VERSION as C, writeState as D, type PluginConfig as P, RIDDLE_PROOF_DIR_CANDIDATES as R, type ShipGateValidation as S, type WorkflowParams as W, type WorkflowStage as a, type CheckpointInputContract as b, WORKFLOW_STAGE_ORDER as c, type WorkflowAction as d, buildCheckpointContract as e, buildSetupArgs as f, checkpointContinueStage as g, clearStageDecisionRequest as h, ensureAction as i, ensureStageLoopState as j, invalidateVerifyEvidence as k, previewModeFromWorkflowMode as l, mergeStateFromParams as m, noImplementationModeFor as n, readState as o, proofRunCore as p, recordStageAttempt as q, resolveConfig as r, requiredBaselineLabelsForState as s, resolveRiddleProofDir as t, setStageDecisionRequest as u, summarizeState as v, validateShipGate as w, visualDeltaForState as x, visualDeltaRequiredForState as y, visualDeltaShipGateReason as z };
362
+ export { visualDeltaShipGateReason as A, BUNDLED_RIDDLE_PROOF_DIR as B, CHECKPOINT_CONTRACT_VERSION as C, workflowFile as D, writeState as E, type PluginConfig as P, RIDDLE_PROOF_DIR_CANDIDATES as R, type ShipGateValidation as S, type WorkflowParams as W, type WorkflowStage as a, type CheckpointInputContract as b, WORKFLOW_STAGE_ORDER as c, type WorkflowAction as d, buildCheckpointContract as e, buildSetupArgs as f, checkpointContinueStage as g, clearStageDecisionRequest as h, ensureAction as i, ensureStageLoopState as j, invalidateVerifyEvidence as k, previewModeFromWorkflowMode as l, mergeStateFromParams as m, noImplementationModeFor as n, proofAssessmentHardBlockersForState as o, proofRunCore as p, readState as q, resolveConfig as r, recordStageAttempt as s, requiredBaselineLabelsForState as t, resolveRiddleProofDir as u, setStageDecisionRequest as v, summarizeState as w, validateShipGate as x, visualDeltaForState as y, visualDeltaRequiredForState as z };
@@ -44,6 +44,7 @@ __export(proof_run_core_exports, {
44
44
  mergeStateFromParams: () => mergeStateFromParams,
45
45
  noImplementationModeFor: () => noImplementationModeFor,
46
46
  previewModeFromWorkflowMode: () => previewModeFromWorkflowMode,
47
+ proofAssessmentHardBlockersForState: () => proofAssessmentHardBlockersForState,
47
48
  readState: () => readState,
48
49
  recordStageAttempt: () => recordStageAttempt,
49
50
  requiredBaselineLabelsForState: () => requiredBaselineLabelsForState,
@@ -525,6 +526,25 @@ function visualDeltaShipGateReason(state = {}) {
525
526
  if (reason) return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof: ${reason}`;
526
527
  return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof`;
527
528
  }
529
+ function proofAssessmentHardBlockersForState(state = {}) {
530
+ const request = objectValue(state?.proof_assessment_request);
531
+ const blockers = [];
532
+ const add = (value) => {
533
+ if (typeof value !== "string") return;
534
+ const trimmed = value.trim();
535
+ if (trimmed && !blockers.includes(trimmed)) blockers.push(trimmed);
536
+ };
537
+ if (Array.isArray(request.hard_blockers)) {
538
+ for (const blocker of request.hard_blockers) add(blocker);
539
+ }
540
+ add(state?.structured_interaction_capture_failure_summary);
541
+ add(state?.structured_interaction_failure_summary);
542
+ const mergeRecommendation = String(state?.merge_recommendation || "").trim();
543
+ if (mergeRecommendation === "do-not-merge" && blockers.length) {
544
+ add("merge_recommendation=do-not-merge because the proof bundle contains hard blockers.");
545
+ }
546
+ return blockers;
547
+ }
528
548
  function visualDeltaEvidenceIssueCode(state = {}, blocker = "") {
529
549
  const visualDelta = visualDeltaForState(state || {});
530
550
  const status = String(visualDelta.status || "").trim();
@@ -559,6 +579,7 @@ function validateShipGate(state = {}) {
559
579
  const visualDelta = visualDeltaForState(state);
560
580
  const visualDeltaRequired = visualDeltaRequiredForState(state);
561
581
  const visualDeltaBlocker = visualDeltaShipGateReason(state);
582
+ const hardBlockers = proofAssessmentHardBlockersForState(state);
562
583
  const reasons = [];
563
584
  if (!["before", "prod", "both"].includes(reference)) {
564
585
  reasons.push(`reference must be before, prod, or both; got ${reference}`);
@@ -590,6 +611,9 @@ function validateShipGate(state = {}) {
590
611
  if (visualDeltaBlocker) {
591
612
  reasons.push(visualDeltaBlocker);
592
613
  }
614
+ for (const blocker of hardBlockers) {
615
+ reasons.push(`proof hard blocker prevents ready_to_ship: ${blocker}`);
616
+ }
593
617
  return {
594
618
  ok: reasons.length === 0,
595
619
  reasons,
@@ -606,7 +630,8 @@ function validateShipGate(state = {}) {
606
630
  proof_assessment_source: proofAssessment.source,
607
631
  visual_delta_required: visualDeltaRequired,
608
632
  visual_delta_status: typeof visualDelta.status === "string" ? visualDelta.status : null,
609
- visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null
633
+ visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null,
634
+ hard_blockers: hardBlockers
610
635
  }
611
636
  };
612
637
  }
@@ -720,6 +745,10 @@ var CHECKPOINT_CONTRACT_SPECS = {
720
745
  }],
721
746
  required_state: ["verify_decision_request"]
722
747
  },
748
+ verify_capture_blocked: {
749
+ purpose: "Verify capture produced conclusive failed browser evidence and should stop instead of retrying proof authoring.",
750
+ required_state: ["verify_decision_request"]
751
+ },
723
752
  verify_supervisor_judgment: {
724
753
  purpose: "Supervising agent judges whether captured evidence proves the change is ready to ship.",
725
754
  accepted_inputs: [{
@@ -1136,6 +1165,7 @@ function summarizeState(state) {
1136
1165
  mergeStateFromParams,
1137
1166
  noImplementationModeFor,
1138
1167
  previewModeFromWorkflowMode,
1168
+ proofAssessmentHardBlockersForState,
1139
1169
  readState,
1140
1170
  recordStageAttempt,
1141
1171
  requiredBaselineLabelsForState,
@@ -1 +1 @@
1
- export { B as BUNDLED_RIDDLE_PROOF_DIR, C as CHECKPOINT_CONTRACT_VERSION, b as CheckpointInputContract, P as PluginConfig, R as RIDDLE_PROOF_DIR_CANDIDATES, S as ShipGateValidation, c as WORKFLOW_STAGE_ORDER, d as WorkflowAction, W as WorkflowParams, a as WorkflowStage, e as buildCheckpointContract, f as buildSetupArgs, g as checkpointContinueStage, h as clearStageDecisionRequest, i as ensureAction, j as ensureStageLoopState, k as invalidateVerifyEvidence, m as mergeStateFromParams, n as noImplementationModeFor, l as previewModeFromWorkflowMode, o as readState, q as recordStageAttempt, s as requiredBaselineLabelsForState, r as resolveConfig, t as resolveRiddleProofDir, u as setStageDecisionRequest, v as summarizeState, w as validateShipGate, x as visualDeltaForState, y as visualDeltaRequiredForState, z as visualDeltaShipGateReason, A as workflowFile, D as writeState } from './proof-run-core-CE0jx7wL.cjs';
1
+ export { B as BUNDLED_RIDDLE_PROOF_DIR, C as CHECKPOINT_CONTRACT_VERSION, b as CheckpointInputContract, P as PluginConfig, R as RIDDLE_PROOF_DIR_CANDIDATES, S as ShipGateValidation, c as WORKFLOW_STAGE_ORDER, d as WorkflowAction, W as WorkflowParams, a as WorkflowStage, e as buildCheckpointContract, f as buildSetupArgs, g as checkpointContinueStage, h as clearStageDecisionRequest, i as ensureAction, j as ensureStageLoopState, k as invalidateVerifyEvidence, m as mergeStateFromParams, n as noImplementationModeFor, l as previewModeFromWorkflowMode, o as proofAssessmentHardBlockersForState, q as readState, s as recordStageAttempt, t as requiredBaselineLabelsForState, r as resolveConfig, u as resolveRiddleProofDir, v as setStageDecisionRequest, w as summarizeState, x as validateShipGate, y as visualDeltaForState, z as visualDeltaRequiredForState, A as visualDeltaShipGateReason, D as workflowFile, E as writeState } from './proof-run-core-C8FDUhle.cjs';
@@ -1 +1 @@
1
- export { B as BUNDLED_RIDDLE_PROOF_DIR, C as CHECKPOINT_CONTRACT_VERSION, b as CheckpointInputContract, P as PluginConfig, R as RIDDLE_PROOF_DIR_CANDIDATES, S as ShipGateValidation, c as WORKFLOW_STAGE_ORDER, d as WorkflowAction, W as WorkflowParams, a as WorkflowStage, e as buildCheckpointContract, f as buildSetupArgs, g as checkpointContinueStage, h as clearStageDecisionRequest, i as ensureAction, j as ensureStageLoopState, k as invalidateVerifyEvidence, m as mergeStateFromParams, n as noImplementationModeFor, l as previewModeFromWorkflowMode, o as readState, q as recordStageAttempt, s as requiredBaselineLabelsForState, r as resolveConfig, t as resolveRiddleProofDir, u as setStageDecisionRequest, v as summarizeState, w as validateShipGate, x as visualDeltaForState, y as visualDeltaRequiredForState, z as visualDeltaShipGateReason, A as workflowFile, D as writeState } from './proof-run-core-CE0jx7wL.js';
1
+ export { B as BUNDLED_RIDDLE_PROOF_DIR, C as CHECKPOINT_CONTRACT_VERSION, b as CheckpointInputContract, P as PluginConfig, R as RIDDLE_PROOF_DIR_CANDIDATES, S as ShipGateValidation, c as WORKFLOW_STAGE_ORDER, d as WorkflowAction, W as WorkflowParams, a as WorkflowStage, e as buildCheckpointContract, f as buildSetupArgs, g as checkpointContinueStage, h as clearStageDecisionRequest, i as ensureAction, j as ensureStageLoopState, k as invalidateVerifyEvidence, m as mergeStateFromParams, n as noImplementationModeFor, l as previewModeFromWorkflowMode, o as proofAssessmentHardBlockersForState, q as readState, s as recordStageAttempt, t as requiredBaselineLabelsForState, r as resolveConfig, u as resolveRiddleProofDir, v as setStageDecisionRequest, w as summarizeState, x as validateShipGate, y as visualDeltaForState, z as visualDeltaRequiredForState, A as visualDeltaShipGateReason, D as workflowFile, E as writeState } from './proof-run-core-C8FDUhle.js';
@@ -13,6 +13,7 @@ import {
13
13
  mergeStateFromParams,
14
14
  noImplementationModeFor,
15
15
  previewModeFromWorkflowMode,
16
+ proofAssessmentHardBlockersForState,
16
17
  readState,
17
18
  recordStageAttempt,
18
19
  requiredBaselineLabelsForState,
@@ -26,7 +27,7 @@ import {
26
27
  visualDeltaShipGateReason,
27
28
  workflowFile,
28
29
  writeState
29
- } from "./chunk-5N5QFI2S.js";
30
+ } from "./chunk-7GZY5PLT.js";
30
31
  import "./chunk-MLKGABMK.js";
31
32
  export {
32
33
  BUNDLED_RIDDLE_PROOF_DIR,
@@ -43,6 +44,7 @@ export {
43
44
  mergeStateFromParams,
44
45
  noImplementationModeFor,
45
46
  previewModeFromWorkflowMode,
47
+ proofAssessmentHardBlockersForState,
46
48
  readState,
47
49
  recordStageAttempt,
48
50
  requiredBaselineLabelsForState,
@@ -1,4 +1,4 @@
1
- import { W as WorkflowParams, r as resolveConfig, P as PluginConfig, a as WorkflowStage } from './proof-run-core-CE0jx7wL.js';
1
+ import { W as WorkflowParams, r as resolveConfig, P as PluginConfig, a as WorkflowStage } from './proof-run-core-C8FDUhle.js';
2
2
 
3
3
  declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, resolvedConfig?: ReturnType<typeof resolveConfig>): Promise<{
4
4
  ok: boolean;
@@ -1,4 +1,4 @@
1
- import { W as WorkflowParams, r as resolveConfig, P as PluginConfig, a as WorkflowStage } from './proof-run-core-CE0jx7wL.cjs';
1
+ import { W as WorkflowParams, r as resolveConfig, P as PluginConfig, a as WorkflowStage } from './proof-run-core-C8FDUhle.cjs';
2
2
 
3
3
  declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, resolvedConfig?: ReturnType<typeof resolveConfig>): Promise<{
4
4
  ok: boolean;