@riddledc/riddle-proof 0.5.56 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2773,6 +2773,8 @@ var init_proof_run_engine = __esm({
2773
2773
  // src/index.ts
2774
2774
  var index_exports = {};
2775
2775
  __export(index_exports, {
2776
+ BASIC_GAMEPLAY_ACTION_TYPES: () => BASIC_GAMEPLAY_ACTION_TYPES,
2777
+ BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES: () => BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES,
2776
2778
  DEFAULT_DIAGNOSTIC_ARRAY_LIMIT: () => DEFAULT_DIAGNOSTIC_ARRAY_LIMIT,
2777
2779
  DEFAULT_DIAGNOSTIC_HISTORY_LIMIT: () => DEFAULT_DIAGNOSTIC_HISTORY_LIMIT,
2778
2780
  DEFAULT_DIAGNOSTIC_STRING_LIMIT: () => DEFAULT_DIAGNOSTIC_STRING_LIMIT,
@@ -2797,8 +2799,12 @@ __export(index_exports, {
2797
2799
  applyPrLifecycleState: () => applyPrLifecycleState,
2798
2800
  applyTerminalMetadata: () => applyTerminalMetadata,
2799
2801
  assessBasicGameplayEvidence: () => assessBasicGameplayEvidence,
2802
+ assessBasicGameplayProgressionCheck: () => assessBasicGameplayProgressionCheck,
2803
+ assessBasicGameplayProgressionChecks: () => assessBasicGameplayProgressionChecks,
2800
2804
  assessBasicGameplayRoute: () => assessBasicGameplayRoute,
2801
2805
  assessPlayabilityEvidence: () => assessPlayabilityEvidence,
2806
+ attachBasicGameplayArtifactScreenshotHashes: () => attachBasicGameplayArtifactScreenshotHashes,
2807
+ augmentBasicGameplayAssessmentWithProgressionChecks: () => augmentBasicGameplayAssessmentWithProgressionChecks,
2802
2808
  authorPacketPayloadFromCheckpointResponse: () => authorPacketPayloadFromCheckpointResponse,
2803
2809
  buildAuthorCheckpointPacket: () => buildAuthorCheckpointPacket,
2804
2810
  buildCheckpointPacketForEngineResult: () => buildCheckpointPacketForEngineResult,
@@ -2807,8 +2813,10 @@ __export(index_exports, {
2807
2813
  buildVisualProofSession: () => buildVisualProofSession,
2808
2814
  checkpointResponseIdentity: () => checkpointResponseIdentity,
2809
2815
  checkpointSummaryFromState: () => checkpointSummaryFromState,
2816
+ compactBasicGameplayText: () => compactBasicGameplayText,
2810
2817
  compactRecord: () => compactRecord,
2811
2818
  compareVisualProofSessionFingerprint: () => compareVisualProofSessionFingerprint,
2819
+ createBasicGameplayCatchRecords: () => createBasicGameplayCatchRecords,
2812
2820
  createBasicGameplayCatchSummary: () => createBasicGameplayCatchSummary,
2813
2821
  createCaptureDiagnostic: () => createCaptureDiagnostic,
2814
2822
  createCheckpointResponseTemplate: () => createCheckpointResponseTemplate,
@@ -2843,6 +2851,7 @@ __export(index_exports, {
2843
2851
  readRiddleProofRunStatus: () => readRiddleProofRunStatus,
2844
2852
  recordValue: () => recordValue,
2845
2853
  redactForProofDiagnostics: () => redactForProofDiagnostics,
2854
+ resolveBasicGameplayProgressionCheckWithArtifactScreenshots: () => resolveBasicGameplayProgressionCheckWithArtifactScreenshots,
2846
2855
  resolveRiddleApiKey: () => resolveRiddleApiKey,
2847
2856
  riddleRequestJson: () => riddleRequestJson,
2848
2857
  runCodexExecAgentDoctor: () => runCodexExecAgentDoctor,
@@ -2851,6 +2860,7 @@ __export(index_exports, {
2851
2860
  runRiddleProofEngineHarness: () => runRiddleProofEngineHarness,
2852
2861
  runRiddleScript: () => runRiddleScript,
2853
2862
  runRiddleServerPreview: () => runRiddleServerPreview,
2863
+ sanitizeBasicGameplayJsonString: () => sanitizeBasicGameplayJsonString,
2854
2864
  setRunStatus: () => setRunStatus,
2855
2865
  statePathsForRunState: () => statePathsForRunState,
2856
2866
  summarizeCaptureArtifacts: () => summarizeCaptureArtifacts,
@@ -7623,6 +7633,34 @@ function parseJson(value) {
7623
7633
  var RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION = "riddle-proof.basic-gameplay.v1";
7624
7634
  var RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION = "riddle-proof.basic-gameplay.assessment.v1";
7625
7635
  var RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION = "riddle-proof.basic-gameplay.catch.v1";
7636
+ var BASIC_GAMEPLAY_ACTION_TYPES = [
7637
+ "wait",
7638
+ "key",
7639
+ "key-down",
7640
+ "key-up",
7641
+ "hold-key",
7642
+ "repeat",
7643
+ "click",
7644
+ "click-by-text",
7645
+ "wait-for-text",
7646
+ "window-call",
7647
+ "evaluate"
7648
+ ];
7649
+ var BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES = [
7650
+ "selector_count_increases",
7651
+ "selector_count_at_least",
7652
+ "selector_absent",
7653
+ "selector_text_matches",
7654
+ "number_increases",
7655
+ "number_decreases",
7656
+ "number_unchanged",
7657
+ "number_stays_equal",
7658
+ "number_equals",
7659
+ "canvas_hash_changes",
7660
+ "screenshot_hash_changes",
7661
+ "visual_hash_changes",
7662
+ "state_changes"
7663
+ ];
7626
7664
  var BASIC_GAMEPLAY_CONTAINER_KEYS = [
7627
7665
  "basic_gameplay",
7628
7666
  "basicGameplay",
@@ -7631,6 +7669,19 @@ var BASIC_GAMEPLAY_CONTAINER_KEYS = [
7631
7669
  "gameplay_proof",
7632
7670
  "gameplayProof"
7633
7671
  ];
7672
+ var ARTIFACT_VISUAL_CHANGE_CHECKS = /* @__PURE__ */ new Set([
7673
+ "canvas_hash_changes",
7674
+ "screenshot_hash_changes",
7675
+ "state_changes",
7676
+ "visual_hash_changes"
7677
+ ]);
7678
+ var PHASE_SCREENSHOT_SUFFIXES = {
7679
+ initial: "before",
7680
+ after_action: "after",
7681
+ after_continue: "after-continue",
7682
+ after_restart: "after-restart",
7683
+ revisit: "revisit"
7684
+ };
7634
7685
  function assessBasicGameplayEvidence(evidence, options = {}) {
7635
7686
  const run = extractBasicGameplayEvidence(evidence);
7636
7687
  if (!run) {
@@ -7646,12 +7697,16 @@ function assessBasicGameplayEvidence(evidence, options = {}) {
7646
7697
  route_results: []
7647
7698
  };
7648
7699
  }
7649
- const routeResults = (run.results || []).map((route) => assessBasicGameplayRoute(route, options));
7700
+ const routeResults = (run.results || []).map((route) => augmentRouteAssessmentWithProgressionChecks(
7701
+ assessBasicGameplayRoute(route, options),
7702
+ route
7703
+ ));
7650
7704
  const failingRoutes = routeResults.filter((result) => !result.ok).map((result) => ({
7651
7705
  name: result.name,
7652
7706
  path: result.path,
7653
7707
  failures: result.failures,
7654
- warnings: result.warnings
7708
+ warnings: result.warnings,
7709
+ suite_failures: result.suite_failures
7655
7710
  }));
7656
7711
  return {
7657
7712
  version: RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION,
@@ -7732,6 +7787,255 @@ function assessBasicGameplayRoute(route, options = {}) {
7732
7787
  }
7733
7788
  };
7734
7789
  }
7790
+ function sanitizeBasicGameplayJsonString(value) {
7791
+ const text = String(value ?? "");
7792
+ let output = "";
7793
+ for (let index = 0; index < text.length; index += 1) {
7794
+ const code = text.charCodeAt(index);
7795
+ if (code >= 55296 && code <= 56319) {
7796
+ const next = text.charCodeAt(index + 1);
7797
+ if (next >= 56320 && next <= 57343) {
7798
+ output += text[index] + text[index + 1];
7799
+ index += 1;
7800
+ }
7801
+ continue;
7802
+ }
7803
+ if (code >= 56320 && code <= 57343) continue;
7804
+ output += text[index];
7805
+ }
7806
+ return output;
7807
+ }
7808
+ function compactBasicGameplayText(value, max = 160) {
7809
+ const compacted = sanitizeBasicGameplayJsonString(value).replace(/\s+/g, " ").trim();
7810
+ return Array.from(compacted).slice(0, max).join("");
7811
+ }
7812
+ function assessBasicGameplayProgressionCheck(check) {
7813
+ const before = metricValue(check.before);
7814
+ const after = metricValue(check.after);
7815
+ const type = String(check.type || "");
7816
+ const hasExplicitResult = typeof check.ok === "boolean";
7817
+ let ok = hasExplicitResult ? check.ok === true : true;
7818
+ let reason = check.reason ?? null;
7819
+ if (type === "selector_count_increases") {
7820
+ ok = numberValue2(after?.count) > numberValue2(before?.count);
7821
+ reason = ok ? null : "selector_count_did_not_increase";
7822
+ } else if (type === "selector_count_at_least") {
7823
+ if (numericValue3(check.min) === null && hasExplicitResult) return resolveBasicGameplayProgressionCheckWithArtifactScreenshots({ ...check, ok, reason });
7824
+ ok = numberValue2(after?.count) >= numberValue2(check.min);
7825
+ reason = ok ? null : "selector_count_below_min";
7826
+ } else if (type === "selector_absent") {
7827
+ ok = !after?.present || numberValue2(after?.count) === 0;
7828
+ reason = ok ? null : "selector_still_present";
7829
+ } else if (type === "selector_text_matches") {
7830
+ if (!check.pattern && hasExplicitResult) return resolveBasicGameplayProgressionCheckWithArtifactScreenshots({ ...check, ok, reason });
7831
+ ok = textMatches(after?.text, check.pattern, check.flags);
7832
+ reason = ok ? null : "selector_text_did_not_match";
7833
+ } else if (type === "number_increases") {
7834
+ ok = numericValue3(before?.number) !== null && numericValue3(after?.number) !== null && numberValue2(after?.number) > numberValue2(before?.number);
7835
+ reason = ok ? null : "number_did_not_increase";
7836
+ } else if (type === "number_decreases") {
7837
+ ok = numericValue3(before?.number) !== null && numericValue3(after?.number) !== null && numberValue2(after?.number) < numberValue2(before?.number);
7838
+ reason = ok ? null : "number_did_not_decrease";
7839
+ } else if (type === "number_unchanged" || type === "number_stays_equal") {
7840
+ ok = numericValue3(before?.number) !== null && numericValue3(after?.number) !== null && numberValue2(after?.number) === numberValue2(before?.number);
7841
+ reason = ok ? null : "number_changed";
7842
+ } else if (type === "number_equals") {
7843
+ const expected = numericValue3(check.expected ?? check.value);
7844
+ if (expected === null && hasExplicitResult) return resolveBasicGameplayProgressionCheckWithArtifactScreenshots({ ...check, ok, reason });
7845
+ ok = numericValue3(after?.number) !== null && expected !== null && numberValue2(after?.number) === expected;
7846
+ reason = ok ? null : "number_did_not_equal_expected";
7847
+ } else if (type === "canvas_hash_changes") {
7848
+ ok = hashChanged(before, after, ["first_canvas_hash", "first_canvas_visual_sample_hash", "visual_sample_hash"]);
7849
+ reason = ok ? null : "canvas_or_visual_sample_hash_did_not_change";
7850
+ } else if (type === "screenshot_hash_changes") {
7851
+ ok = hashChanged(before, after, ["screenshot_hash", "visual_sample_hash", "artifact_screenshot_hash"]);
7852
+ reason = ok ? null : "screenshot_hash_did_not_change";
7853
+ } else if (type === "visual_hash_changes") {
7854
+ ok = hashChanged(before, after, ["visual_sample_hash", "screenshot_hash", "artifact_screenshot_hash"]);
7855
+ reason = ok ? null : "visual_hash_did_not_change";
7856
+ } else if (type === "state_changes") {
7857
+ ok = hashChanged(before, after, [
7858
+ "dom_signature_hash",
7859
+ "body_text_hash",
7860
+ "screenshot_hash",
7861
+ "visual_sample_hash",
7862
+ "artifact_screenshot_hash",
7863
+ "first_canvas_hash",
7864
+ "first_canvas_visual_sample_hash"
7865
+ ]);
7866
+ reason = ok ? null : "state_hash_did_not_change";
7867
+ }
7868
+ const assessed = {
7869
+ ...check,
7870
+ ok,
7871
+ reason
7872
+ };
7873
+ return resolveBasicGameplayProgressionCheckWithArtifactScreenshots(assessed);
7874
+ }
7875
+ function assessBasicGameplayProgressionChecks(route) {
7876
+ return progressionChecksForRoute(route).map((check) => assessBasicGameplayProgressionCheck(check));
7877
+ }
7878
+ function augmentBasicGameplayAssessmentWithProgressionChecks(assessment, evidence) {
7879
+ const run = extractBasicGameplayEvidence(evidence);
7880
+ if (!run?.results?.length) return assessment;
7881
+ const routeResults = assessment.route_results.map(
7882
+ (result, index) => augmentRouteAssessmentWithProgressionChecks(result, run.results?.[index] || {})
7883
+ );
7884
+ const failingRoutes = routeResults.filter((result) => !result.ok).map((result) => ({
7885
+ name: result.name,
7886
+ path: result.path,
7887
+ failures: result.failures,
7888
+ warnings: result.warnings,
7889
+ suite_failures: result.suite_failures
7890
+ }));
7891
+ return {
7892
+ ...assessment,
7893
+ passed: failingRoutes.length === 0,
7894
+ passing_routes: routeResults.filter((result) => result.ok).length,
7895
+ failing_routes: failingRoutes,
7896
+ failure_counts: countCodes(routeResults.flatMap((result) => result.failures)),
7897
+ warning_counts: countCodes(routeResults.flatMap((result) => result.warnings)),
7898
+ route_results: routeResults
7899
+ };
7900
+ }
7901
+ function resolveBasicGameplayProgressionCheckWithArtifactScreenshots(check) {
7902
+ if (check.ok !== false) return check;
7903
+ if (!ARTIFACT_VISUAL_CHANGE_CHECKS.has(String(check.type || ""))) return check;
7904
+ const beforeHash = stringValue4(metricValue(check.before)?.artifact_screenshot_hash);
7905
+ const afterHash = stringValue4(metricValue(check.after)?.artifact_screenshot_hash);
7906
+ if (!beforeHash || !afterHash || beforeHash === afterHash) return check;
7907
+ return {
7908
+ ...check,
7909
+ ok: true,
7910
+ reason: null,
7911
+ artifact_resolution: {
7912
+ source: "riddle_screenshot_artifacts",
7913
+ before_hash: beforeHash,
7914
+ after_hash: afterHash
7915
+ }
7916
+ };
7917
+ }
7918
+ function attachBasicGameplayArtifactScreenshotHashes(evidence, routesOrOptions = {}, maybeArtifacts = []) {
7919
+ const routes = Array.isArray(routesOrOptions) ? routesOrOptions : routesOrOptions.routes || [];
7920
+ const artifacts = Array.isArray(routesOrOptions) ? maybeArtifacts : routesOrOptions.artifacts || [];
7921
+ if (!evidence?.results?.length || !artifacts.length) return evidence;
7922
+ const artifactsByName = screenshotArtifactIndex(artifacts);
7923
+ if (!artifactsByName.size) return evidence;
7924
+ for (const [index, routeEvidence] of evidence.results.entries()) {
7925
+ const routeContract = routes[index] || {};
7926
+ for (const phase of Object.keys(PHASE_SCREENSHOT_SUFFIXES)) {
7927
+ attachPhaseArtifactHash(routeEvidence, routeContract, phase, artifactsByName);
7928
+ }
7929
+ const checks = progressionChecksForRoute(routeEvidence);
7930
+ const resolvedChecks = checks.map((check) => {
7931
+ const fromPhase = check.from_phase || "initial";
7932
+ const toPhase = check.to_phase || "after_action";
7933
+ if (check.before) attachPhaseArtifactHash({ ...routeEvidence, [fromPhase]: check.before }, routeContract, fromPhase, artifactsByName);
7934
+ if (check.after) attachPhaseArtifactHash({ ...routeEvidence, [toPhase]: check.after }, routeContract, toPhase, artifactsByName);
7935
+ return resolveBasicGameplayProgressionCheckWithArtifactScreenshots(check);
7936
+ });
7937
+ if (routeEvidence.progression_checks) routeEvidence.progression_checks = resolvedChecks;
7938
+ else if (routeEvidence.progressionChecks) routeEvidence.progressionChecks = resolvedChecks;
7939
+ routeEvidence.progression_failure_count = resolvedChecks.filter((check) => check.ok === false).length;
7940
+ }
7941
+ return evidence;
7942
+ }
7943
+ function createBasicGameplayCatchRecords(assessment, evidence) {
7944
+ const run = extractBasicGameplayEvidence(evidence);
7945
+ if (!run?.results?.length) return [];
7946
+ const catches = [];
7947
+ for (const route of run.results) {
7948
+ if (numberValue2(route.page_error_count) > 0) {
7949
+ catches.push({
7950
+ site: run.site || null,
7951
+ route: route.name,
7952
+ path: route.path,
7953
+ code: "fatal_page_error",
7954
+ label: "page runtime error",
7955
+ type: "page_error",
7956
+ selector: null,
7957
+ reason: stringValue4(route.first_page_error) || "page_error",
7958
+ page_errors: listValue2(route.page_errors),
7959
+ summary: `${route.name || route.path || "Route"}: page runtime error (${stringValue4(route.first_page_error) || "page_error"})`
7960
+ });
7961
+ }
7962
+ if (numberValue2(route.console_error_count) > 0) {
7963
+ catches.push({
7964
+ site: run.site || null,
7965
+ route: route.name,
7966
+ path: route.path,
7967
+ code: "critical_console_error",
7968
+ label: "console error",
7969
+ type: "console_error",
7970
+ selector: null,
7971
+ reason: stringValue4(route.first_console_error) || "console_error",
7972
+ console_errors: listValue2(route.console_errors),
7973
+ summary: `${route.name || route.path || "Route"}: console error (${stringValue4(route.first_console_error) || "console_error"})`
7974
+ });
7975
+ }
7976
+ for (const [group, phase] of [
7977
+ ["action_results", "after_action"],
7978
+ ["continued_action_results", "after_continue"],
7979
+ ["restart_action_results", "after_restart"]
7980
+ ]) {
7981
+ for (const actionResult of listValue2(route[group])) {
7982
+ if (!actionResult || actionResult.ok !== false) continue;
7983
+ const action = stringValue4(actionResult.action) || group;
7984
+ const reason = stringValue4(actionResult.reason) || "action_failed";
7985
+ catches.push({
7986
+ site: run.site || null,
7987
+ route: route.name,
7988
+ path: route.path,
7989
+ code: "action_failed",
7990
+ label: action,
7991
+ type: action,
7992
+ selector: stringValue4(actionResult.selector),
7993
+ reason,
7994
+ phase,
7995
+ action_result: actionResult,
7996
+ summary: `${route.name || route.path || "Route"}: ${action} failed (${reason})`
7997
+ });
7998
+ }
7999
+ }
8000
+ for (const check of assessBasicGameplayProgressionChecks(route).filter((item) => item.ok === false)) {
8001
+ catches.push({
8002
+ site: run.site || null,
8003
+ route: route.name,
8004
+ path: route.path,
8005
+ code: "progression_assertion_failed",
8006
+ label: check.label,
8007
+ type: String(check.type || ""),
8008
+ selector: check.selector || null,
8009
+ state_path: check.state_path || null,
8010
+ state_call: check.state_call || null,
8011
+ property_path: check.property_path || null,
8012
+ reason: check.reason || "progression_assertion_failed",
8013
+ from_phase: check.from_phase,
8014
+ to_phase: check.to_phase,
8015
+ before: compactCatchMetric(check.before),
8016
+ after: compactCatchMetric(check.after),
8017
+ summary: `${route.name || route.path || "Route"}: ${check.label || check.type || "progression check"} failed (${check.reason || "progression_assertion_failed"})`
8018
+ });
8019
+ }
8020
+ }
8021
+ if (!catches.length && assessment.failing_routes.length) {
8022
+ for (const route of assessment.failing_routes) {
8023
+ for (const code of route.failures || []) {
8024
+ catches.push({
8025
+ site: run.site || null,
8026
+ route: route.name,
8027
+ path: route.path,
8028
+ code,
8029
+ label: code,
8030
+ type: code,
8031
+ reason: code,
8032
+ summary: `${route.name || route.path || "Route"}: ${code}`
8033
+ });
8034
+ }
8035
+ }
8036
+ }
8037
+ return catches;
8038
+ }
7735
8039
  function createBasicGameplayCatchSummary(input, options = {}) {
7736
8040
  const before = summarizeAssessment(assessBasicGameplayEvidence(input.before, options));
7737
8041
  const after = input.after === void 0 ? void 0 : summarizeAssessment(assessBasicGameplayEvidence(input.after, options));
@@ -7847,6 +8151,122 @@ function changed(before, after) {
7847
8151
  function canvasHashes(canvases) {
7848
8152
  return (canvases || []).map((canvas) => canvas.hash).filter(Boolean).join("|");
7849
8153
  }
8154
+ function augmentRouteAssessmentWithProgressionChecks(result, route) {
8155
+ const progressionFailures = assessBasicGameplayProgressionChecks(route).filter((check) => check.ok === false);
8156
+ if (!progressionFailures.length) return result;
8157
+ const failures = result.failures.includes("progression_assertion_failed") ? result.failures : [...result.failures, "progression_assertion_failed"];
8158
+ return {
8159
+ ...result,
8160
+ ok: false,
8161
+ failures,
8162
+ suite_failures: [
8163
+ ...result.suite_failures || [],
8164
+ ...progressionFailures.map((check) => ({
8165
+ code: "progression_assertion_failed",
8166
+ label: check.label,
8167
+ reason: check.reason,
8168
+ selector: check.selector || null,
8169
+ state_path: check.state_path || null,
8170
+ state_call: check.state_call || null,
8171
+ property_path: check.property_path || null
8172
+ }))
8173
+ ]
8174
+ };
8175
+ }
8176
+ function progressionChecksForRoute(route) {
8177
+ return listValue2(route.progression_checks || route.progressionChecks).filter((item) => Boolean(recordValue3(item)));
8178
+ }
8179
+ function metricValue(value) {
8180
+ return recordValue3(value);
8181
+ }
8182
+ function textMatches(text, pattern, flags) {
8183
+ if (!pattern) return Boolean(text);
8184
+ try {
8185
+ return new RegExp(String(pattern), typeof flags === "string" ? flags : "i").test(String(text ?? ""));
8186
+ } catch {
8187
+ return false;
8188
+ }
8189
+ }
8190
+ function hashChanged(before, after, keys) {
8191
+ if (!before || !after) return false;
8192
+ return keys.some((key) => {
8193
+ const beforeValue = stringValue4(before[key]);
8194
+ const afterValue = stringValue4(after[key]);
8195
+ return Boolean(beforeValue && afterValue && beforeValue !== afterValue);
8196
+ });
8197
+ }
8198
+ function screenshotArtifactIndex(artifacts) {
8199
+ const index = /* @__PURE__ */ new Map();
8200
+ for (const artifact of artifacts || []) {
8201
+ const hash = stringValue4(artifact.sha256 || artifact.hash);
8202
+ if (!hash) continue;
8203
+ if (String(artifact.kind || "").toLowerCase() !== "screenshot" && !/\.png($|\?)/i.test(`${artifact.name || ""} ${artifact.path || ""} ${artifact.url || ""}`)) continue;
8204
+ const filename = artifactBasename(artifact.path || artifact.name || artifact.url);
8205
+ if (!filename) continue;
8206
+ index.set(filename.toLowerCase(), {
8207
+ ...artifact,
8208
+ sha256: hash
8209
+ });
8210
+ }
8211
+ return index;
8212
+ }
8213
+ function attachPhaseArtifactHash(routeEvidence, routeContract, phase, artifactsByName) {
8214
+ const suffix = PHASE_SCREENSHOT_SUFFIXES[phase];
8215
+ if (!suffix) return null;
8216
+ const metric = metricValue(routeEvidence[phase]);
8217
+ if (!metric) return null;
8218
+ const filename = `${routeArtifactSlug(routeEvidence, routeContract)}-${suffix}.png`.toLowerCase();
8219
+ const artifact = artifactsByName.get(filename);
8220
+ if (!artifact?.sha256) return null;
8221
+ metric.artifact_screenshot_hash = artifact.sha256;
8222
+ metric.artifact_screenshot = {
8223
+ name: artifact.name || artifactBasename(artifact.path || filename),
8224
+ path: artifact.path,
8225
+ url: artifact.url,
8226
+ kind: artifact.kind,
8227
+ sha256: artifact.sha256
8228
+ };
8229
+ return artifact.sha256;
8230
+ }
8231
+ function routeArtifactSlug(routeEvidence, routeContract) {
8232
+ return slug(routeContract.name || routeEvidence.name || routeContract.path || routeEvidence.path || "route");
8233
+ }
8234
+ function artifactBasename(value) {
8235
+ const raw = stringValue4(value);
8236
+ if (!raw) return "";
8237
+ try {
8238
+ const url = new URL(raw);
8239
+ return url.pathname.split("/").filter(Boolean).pop() || "";
8240
+ } catch {
8241
+ return raw.split(/[\\/]/).filter(Boolean).pop() || raw;
8242
+ }
8243
+ }
8244
+ function compactCatchMetric(metric) {
8245
+ const value = metricValue(metric);
8246
+ if (!value) return null;
8247
+ return {
8248
+ phase: value.phase,
8249
+ text: value.text,
8250
+ number: value.number,
8251
+ count: value.count,
8252
+ present: value.present,
8253
+ state_path: value.state_path,
8254
+ state_call: value.state_call,
8255
+ property_path: value.property_path,
8256
+ screenshot_hash: value.screenshot_hash,
8257
+ visual_sample_hash: value.visual_sample_hash,
8258
+ viewport_screenshot_hash: value.viewport_screenshot_hash,
8259
+ artifact_screenshot_hash: value.artifact_screenshot_hash,
8260
+ dom_signature_hash: value.dom_signature_hash,
8261
+ body_text_hash: value.body_text_hash,
8262
+ first_canvas_hash: value.first_canvas_hash,
8263
+ first_canvas_visual_sample_hash: value.first_canvas_visual_sample_hash,
8264
+ visible_canvas_count: value.visible_canvas_count
8265
+ };
8266
+ }
8267
+ function slug(value) {
8268
+ return String(value || "artifact").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 96) || "artifact";
8269
+ }
7850
8270
  function countCodes(codes) {
7851
8271
  const counts = {};
7852
8272
  for (const code of codes) counts[code] = (counts[code] || 0) + 1;
@@ -7870,6 +8290,9 @@ function numericValue3(value) {
7870
8290
  }
7871
8291
  return null;
7872
8292
  }
8293
+ function stringValue4(value) {
8294
+ return typeof value === "string" && value.length ? value : null;
8295
+ }
7873
8296
  function recordValue3(value) {
7874
8297
  return value && typeof value === "object" && !Array.isArray(value) ? value : null;
7875
8298
  }
@@ -8120,6 +8543,8 @@ function createRiddleApiClient(config = {}) {
8120
8543
  }
8121
8544
  // Annotate the CommonJS export names for ESM import in node:
8122
8545
  0 && (module.exports = {
8546
+ BASIC_GAMEPLAY_ACTION_TYPES,
8547
+ BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES,
8123
8548
  DEFAULT_DIAGNOSTIC_ARRAY_LIMIT,
8124
8549
  DEFAULT_DIAGNOSTIC_HISTORY_LIMIT,
8125
8550
  DEFAULT_DIAGNOSTIC_STRING_LIMIT,
@@ -8144,8 +8569,12 @@ function createRiddleApiClient(config = {}) {
8144
8569
  applyPrLifecycleState,
8145
8570
  applyTerminalMetadata,
8146
8571
  assessBasicGameplayEvidence,
8572
+ assessBasicGameplayProgressionCheck,
8573
+ assessBasicGameplayProgressionChecks,
8147
8574
  assessBasicGameplayRoute,
8148
8575
  assessPlayabilityEvidence,
8576
+ attachBasicGameplayArtifactScreenshotHashes,
8577
+ augmentBasicGameplayAssessmentWithProgressionChecks,
8149
8578
  authorPacketPayloadFromCheckpointResponse,
8150
8579
  buildAuthorCheckpointPacket,
8151
8580
  buildCheckpointPacketForEngineResult,
@@ -8154,8 +8583,10 @@ function createRiddleApiClient(config = {}) {
8154
8583
  buildVisualProofSession,
8155
8584
  checkpointResponseIdentity,
8156
8585
  checkpointSummaryFromState,
8586
+ compactBasicGameplayText,
8157
8587
  compactRecord,
8158
8588
  compareVisualProofSessionFingerprint,
8589
+ createBasicGameplayCatchRecords,
8159
8590
  createBasicGameplayCatchSummary,
8160
8591
  createCaptureDiagnostic,
8161
8592
  createCheckpointResponseTemplate,
@@ -8190,6 +8621,7 @@ function createRiddleApiClient(config = {}) {
8190
8621
  readRiddleProofRunStatus,
8191
8622
  recordValue,
8192
8623
  redactForProofDiagnostics,
8624
+ resolveBasicGameplayProgressionCheckWithArtifactScreenshots,
8193
8625
  resolveRiddleApiKey,
8194
8626
  riddleRequestJson,
8195
8627
  runCodexExecAgentDoctor,
@@ -8198,6 +8630,7 @@ function createRiddleApiClient(config = {}) {
8198
8630
  runRiddleProofEngineHarness,
8199
8631
  runRiddleScript,
8200
8632
  runRiddleServerPreview,
8633
+ sanitizeBasicGameplayJsonString,
8201
8634
  setRunStatus,
8202
8635
  statePathsForRunState,
8203
8636
  summarizeCaptureArtifacts,
package/dist/index.d.cts CHANGED
@@ -9,5 +9,5 @@ export { CodexExecAgentConfig, CodexJsonRequest, CodexJsonResult, CodexJsonRunne
9
9
  export { CreateCaptureDiagnosticInput, DEFAULT_DIAGNOSTIC_ARRAY_LIMIT, DEFAULT_DIAGNOSTIC_HISTORY_LIMIT, DEFAULT_DIAGNOSTIC_STRING_LIMIT, RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION, RiddleProofArtifactSummary, RiddleProofCaptureArtifactSummary, RiddleProofCaptureDiagnostic, RiddleProofDiagnosticRedactionOptions, appendCaptureDiagnostic, createCaptureDiagnostic, redactForProofDiagnostics, summarizeCaptureArtifacts } from './diagnostics.cjs';
10
10
  export { BuildVisualProofSessionInput, RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION, RIDDLE_PROOF_VISUAL_SESSION_VERSION, VisualProofSessionMismatch, buildVisualProofSession, compareVisualProofSessionFingerprint, parseVisualProofSession, visualSessionFingerprint, visualSessionFingerprintBasis } from './proof-session.cjs';
11
11
  export { AssessPlayabilityOptions, RIDDLE_PROOF_PLAYABILITY_ASSESSMENT_VERSION, RIDDLE_PROOF_PLAYABILITY_VERSION, RiddleProofPlayabilityAssessment, RiddleProofPlayabilityEvidence, assessPlayabilityEvidence, extractPlayabilityEvidence, isRiddleProofPlayabilityMode } from './playability.cjs';
12
- export { AssessBasicGameplayOptions, BasicGameplayActionResult, BasicGameplayAssessmentSummary, BasicGameplayCanvasState, BasicGameplayChangeSummary, BasicGameplayFailureCode, BasicGameplayFixReference, BasicGameplayMobileEvidence, BasicGameplayProofArtifact, BasicGameplaySnapshot, BasicGameplayWarningCode, CreateBasicGameplayCatchSummaryInput, RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION, RiddleProofBasicGameplayAssessment, RiddleProofBasicGameplayCatchSummary, RiddleProofBasicGameplayEvidence, RiddleProofBasicGameplayRouteAssessment, RiddleProofBasicGameplayRouteEvidence, assessBasicGameplayEvidence, assessBasicGameplayRoute, createBasicGameplayCatchSummary, extractBasicGameplayEvidence } from './basic-gameplay.cjs';
12
+ export { AssessBasicGameplayOptions, AttachBasicGameplayArtifactOptions, BASIC_GAMEPLAY_ACTION_TYPES, BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES, BasicGameplayActionResult, BasicGameplayActionType, BasicGameplayArtifactResolution, BasicGameplayAssessmentSummary, BasicGameplayCanvasState, BasicGameplayCatchRecord, BasicGameplayChangeSummary, BasicGameplayFailureCode, BasicGameplayFixReference, BasicGameplayMetric, BasicGameplayMobileEvidence, BasicGameplayProgressCheckType, BasicGameplayProgressionCheck, BasicGameplayProofArtifact, BasicGameplayRouteReference, BasicGameplaySnapshot, BasicGameplaySuiteFailure, BasicGameplayWarningCode, CreateBasicGameplayCatchSummaryInput, RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION, RiddleProofBasicGameplayAssessment, RiddleProofBasicGameplayCatchSummary, RiddleProofBasicGameplayEvidence, RiddleProofBasicGameplayRouteAssessment, RiddleProofBasicGameplayRouteEvidence, assessBasicGameplayEvidence, assessBasicGameplayProgressionCheck, assessBasicGameplayProgressionChecks, assessBasicGameplayRoute, attachBasicGameplayArtifactScreenshotHashes, augmentBasicGameplayAssessmentWithProgressionChecks, compactBasicGameplayText, createBasicGameplayCatchRecords, createBasicGameplayCatchSummary, extractBasicGameplayEvidence, resolveBasicGameplayProgressionCheckWithArtifactScreenshots, sanitizeBasicGameplayJsonString } from './basic-gameplay.cjs';
13
13
  export { DEFAULT_RIDDLE_API_BASE_URL, DEFAULT_RIDDLE_API_KEY_FILE, RiddleApiError, RiddleClientConfig, RiddleFetch, RiddlePollJobResult, RiddlePreviewDeployResult, RiddleRunScriptInput, RiddleServerPreviewInput, RiddleServerPreviewResult, createRiddleApiClient, deployRiddleStaticPreview, isTerminalRiddleJobStatus, parseRiddleViewport, pollRiddleJob, resolveRiddleApiKey, riddleRequestJson, runRiddleScript, runRiddleServerPreview } from './riddle-client.cjs';
package/dist/index.d.ts CHANGED
@@ -9,5 +9,5 @@ export { CodexExecAgentConfig, CodexJsonRequest, CodexJsonResult, CodexJsonRunne
9
9
  export { CreateCaptureDiagnosticInput, DEFAULT_DIAGNOSTIC_ARRAY_LIMIT, DEFAULT_DIAGNOSTIC_HISTORY_LIMIT, DEFAULT_DIAGNOSTIC_STRING_LIMIT, RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION, RiddleProofArtifactSummary, RiddleProofCaptureArtifactSummary, RiddleProofCaptureDiagnostic, RiddleProofDiagnosticRedactionOptions, appendCaptureDiagnostic, createCaptureDiagnostic, redactForProofDiagnostics, summarizeCaptureArtifacts } from './diagnostics.js';
10
10
  export { BuildVisualProofSessionInput, RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION, RIDDLE_PROOF_VISUAL_SESSION_VERSION, VisualProofSessionMismatch, buildVisualProofSession, compareVisualProofSessionFingerprint, parseVisualProofSession, visualSessionFingerprint, visualSessionFingerprintBasis } from './proof-session.js';
11
11
  export { AssessPlayabilityOptions, RIDDLE_PROOF_PLAYABILITY_ASSESSMENT_VERSION, RIDDLE_PROOF_PLAYABILITY_VERSION, RiddleProofPlayabilityAssessment, RiddleProofPlayabilityEvidence, assessPlayabilityEvidence, extractPlayabilityEvidence, isRiddleProofPlayabilityMode } from './playability.js';
12
- export { AssessBasicGameplayOptions, BasicGameplayActionResult, BasicGameplayAssessmentSummary, BasicGameplayCanvasState, BasicGameplayChangeSummary, BasicGameplayFailureCode, BasicGameplayFixReference, BasicGameplayMobileEvidence, BasicGameplayProofArtifact, BasicGameplaySnapshot, BasicGameplayWarningCode, CreateBasicGameplayCatchSummaryInput, RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION, RiddleProofBasicGameplayAssessment, RiddleProofBasicGameplayCatchSummary, RiddleProofBasicGameplayEvidence, RiddleProofBasicGameplayRouteAssessment, RiddleProofBasicGameplayRouteEvidence, assessBasicGameplayEvidence, assessBasicGameplayRoute, createBasicGameplayCatchSummary, extractBasicGameplayEvidence } from './basic-gameplay.js';
12
+ export { AssessBasicGameplayOptions, AttachBasicGameplayArtifactOptions, BASIC_GAMEPLAY_ACTION_TYPES, BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES, BasicGameplayActionResult, BasicGameplayActionType, BasicGameplayArtifactResolution, BasicGameplayAssessmentSummary, BasicGameplayCanvasState, BasicGameplayCatchRecord, BasicGameplayChangeSummary, BasicGameplayFailureCode, BasicGameplayFixReference, BasicGameplayMetric, BasicGameplayMobileEvidence, BasicGameplayProgressCheckType, BasicGameplayProgressionCheck, BasicGameplayProofArtifact, BasicGameplayRouteReference, BasicGameplaySnapshot, BasicGameplaySuiteFailure, BasicGameplayWarningCode, CreateBasicGameplayCatchSummaryInput, RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION, RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION, RiddleProofBasicGameplayAssessment, RiddleProofBasicGameplayCatchSummary, RiddleProofBasicGameplayEvidence, RiddleProofBasicGameplayRouteAssessment, RiddleProofBasicGameplayRouteEvidence, assessBasicGameplayEvidence, assessBasicGameplayProgressionCheck, assessBasicGameplayProgressionChecks, assessBasicGameplayRoute, attachBasicGameplayArtifactScreenshotHashes, augmentBasicGameplayAssessmentWithProgressionChecks, compactBasicGameplayText, createBasicGameplayCatchRecords, createBasicGameplayCatchSummary, extractBasicGameplayEvidence, resolveBasicGameplayProgressionCheckWithArtifactScreenshots, sanitizeBasicGameplayJsonString } from './basic-gameplay.js';
13
13
  export { DEFAULT_RIDDLE_API_BASE_URL, DEFAULT_RIDDLE_API_KEY_FILE, RiddleApiError, RiddleClientConfig, RiddleFetch, RiddlePollJobResult, RiddlePreviewDeployResult, RiddleRunScriptInput, RiddleServerPreviewInput, RiddleServerPreviewResult, createRiddleApiClient, deployRiddleStaticPreview, isTerminalRiddleJobStatus, parseRiddleViewport, pollRiddleJob, resolveRiddleApiKey, riddleRequestJson, runRiddleScript, runRiddleServerPreview } from './riddle-client.js';
package/dist/index.js CHANGED
@@ -19,14 +19,24 @@ import {
19
19
  visualSessionFingerprintBasis
20
20
  } from "./chunk-ODORKNSO.js";
21
21
  import {
22
+ BASIC_GAMEPLAY_ACTION_TYPES,
23
+ BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES,
22
24
  RIDDLE_PROOF_BASIC_GAMEPLAY_ASSESSMENT_VERSION,
23
25
  RIDDLE_PROOF_BASIC_GAMEPLAY_CATCH_VERSION,
24
26
  RIDDLE_PROOF_BASIC_GAMEPLAY_VERSION,
25
27
  assessBasicGameplayEvidence,
28
+ assessBasicGameplayProgressionCheck,
29
+ assessBasicGameplayProgressionChecks,
26
30
  assessBasicGameplayRoute,
31
+ attachBasicGameplayArtifactScreenshotHashes,
32
+ augmentBasicGameplayAssessmentWithProgressionChecks,
33
+ compactBasicGameplayText,
34
+ createBasicGameplayCatchRecords,
27
35
  createBasicGameplayCatchSummary,
28
- extractBasicGameplayEvidence
29
- } from "./chunk-53DJMNQ6.js";
36
+ extractBasicGameplayEvidence,
37
+ resolveBasicGameplayProgressionCheckWithArtifactScreenshots,
38
+ sanitizeBasicGameplayJsonString
39
+ } from "./chunk-AAIASO2C.js";
30
40
  import {
31
41
  DEFAULT_RIDDLE_API_BASE_URL,
32
42
  DEFAULT_RIDDLE_API_KEY_FILE,
@@ -106,6 +116,8 @@ import {
106
116
  recordValue
107
117
  } from "./chunk-DUFDZJOF.js";
108
118
  export {
119
+ BASIC_GAMEPLAY_ACTION_TYPES,
120
+ BASIC_GAMEPLAY_PROGRESS_CHECK_TYPES,
109
121
  DEFAULT_DIAGNOSTIC_ARRAY_LIMIT,
110
122
  DEFAULT_DIAGNOSTIC_HISTORY_LIMIT,
111
123
  DEFAULT_DIAGNOSTIC_STRING_LIMIT,
@@ -130,8 +142,12 @@ export {
130
142
  applyPrLifecycleState,
131
143
  applyTerminalMetadata,
132
144
  assessBasicGameplayEvidence,
145
+ assessBasicGameplayProgressionCheck,
146
+ assessBasicGameplayProgressionChecks,
133
147
  assessBasicGameplayRoute,
134
148
  assessPlayabilityEvidence,
149
+ attachBasicGameplayArtifactScreenshotHashes,
150
+ augmentBasicGameplayAssessmentWithProgressionChecks,
135
151
  authorPacketPayloadFromCheckpointResponse,
136
152
  buildAuthorCheckpointPacket,
137
153
  buildCheckpointPacketForEngineResult,
@@ -140,8 +156,10 @@ export {
140
156
  buildVisualProofSession,
141
157
  checkpointResponseIdentity,
142
158
  checkpointSummaryFromState,
159
+ compactBasicGameplayText,
143
160
  compactRecord,
144
161
  compareVisualProofSessionFingerprint,
162
+ createBasicGameplayCatchRecords,
145
163
  createBasicGameplayCatchSummary,
146
164
  createCaptureDiagnostic,
147
165
  createCheckpointResponseTemplate,
@@ -176,6 +194,7 @@ export {
176
194
  readRiddleProofRunStatus,
177
195
  recordValue,
178
196
  redactForProofDiagnostics,
197
+ resolveBasicGameplayProgressionCheckWithArtifactScreenshots,
179
198
  resolveRiddleApiKey,
180
199
  riddleRequestJson,
181
200
  runCodexExecAgentDoctor,
@@ -184,6 +203,7 @@ export {
184
203
  runRiddleProofEngineHarness,
185
204
  runRiddleScript,
186
205
  runRiddleServerPreview,
206
+ sanitizeBasicGameplayJsonString,
187
207
  setRunStatus,
188
208
  statePathsForRunState,
189
209
  summarizeCaptureArtifacts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.5.56",
3
+ "version": "0.6.0",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",