@riddledc/riddle-proof 0.8.56 → 0.8.58

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.
@@ -1,3 +1,7 @@
1
+ import {
2
+ summarizeRiddleProofPublicState
3
+ } from "./chunk-KG64Y5MC.js";
4
+
1
5
  // src/pr-comment.ts
2
6
  var RIDDLE_PROOF_PR_COMMENT_MARKER = "<!-- riddle-proof:pr-comment:v1 -->";
3
7
  function asRecord(value) {
@@ -15,6 +19,13 @@ function numberValue(value) {
15
19
  function booleanValue(value) {
16
20
  return typeof value === "boolean" ? value : void 0;
17
21
  }
22
+ function firstStringValue(...values) {
23
+ for (const value of values) {
24
+ const text = stringValue(value);
25
+ if (text) return text;
26
+ }
27
+ return void 0;
28
+ }
18
29
  function artifactKind(name, url) {
19
30
  const target = `${name} ${url}`.toLowerCase();
20
31
  if (/\.(png|jpe?g|gif|webp|avif|svg)(\?|#|$)/.test(target)) return "image";
@@ -91,20 +102,60 @@ function selectPrimaryImage(artifacts) {
91
102
  const images = artifacts.filter((artifact) => artifact.kind === "image");
92
103
  return images.find((artifact) => /after|proof|screenshot/i.test(artifact.name)) || images[0];
93
104
  }
105
+ function firstRecordValue(...values) {
106
+ for (const value of values) {
107
+ const record = asRecord(value);
108
+ if (Object.keys(record).length) return record;
109
+ }
110
+ return void 0;
111
+ }
112
+ function checkpointSummaryFrom(...values) {
113
+ const record = firstRecordValue(...values);
114
+ if (!record) return void 0;
115
+ const summary = {
116
+ pending: booleanValue(record.pending),
117
+ response_count: numberValue(record.response_count),
118
+ rejected_response_count: numberValue(record.rejected_response_count),
119
+ ignored_response_count: numberValue(record.ignored_response_count),
120
+ duplicate_response_count: numberValue(record.duplicate_response_count),
121
+ latest_decision: stringValue(record.latest_decision),
122
+ latest_packet_id: stringValue(record.latest_packet_id),
123
+ latest_resume_token: stringValue(record.latest_resume_token)
124
+ };
125
+ return Object.values(summary).some((value) => typeof value !== "undefined") ? summary : void 0;
126
+ }
94
127
  function summarizeRiddleProofPrComment(input) {
95
128
  const runResponse = asRecord(input.runResponse);
96
129
  const result = asRecord(input.result);
97
130
  const proofResult = asRecord(runResponse.proofResult);
98
131
  const preview = asRecord(runResponse.preview);
132
+ const resultRunCard = asRecord(result.run_card);
133
+ const stopCondition = asRecord(resultRunCard.stop_condition);
134
+ const resultDetails = asRecord(result.details);
135
+ const resultRaw = asRecord(result.raw);
136
+ const rawDetails = asRecord(resultRaw.details);
99
137
  const artifacts = collectArtifacts(runResponse);
100
138
  const pages = pageSummaries(result);
101
139
  const checkSource = { ...result };
102
140
  delete checkSource.ok;
103
141
  const nestedChecks = summarizeExplicitChecks(checkSource);
104
142
  const ok = booleanValue(result.ok) ?? booleanValue(runResponse.ok) ?? null;
143
+ const checkpointSummary = checkpointSummaryFrom(
144
+ result.checkpoint_summary,
145
+ stopCondition.checkpoint_summary,
146
+ resultDetails.checkpoint_summary,
147
+ rawDetails.checkpoint_summary,
148
+ proofResult.checkpoint_summary
149
+ );
150
+ const publicState = summarizeRiddleProofPublicState({
151
+ ...result,
152
+ status: firstStringValue(result.status, stopCondition.status),
153
+ checkpoint_summary: checkpointSummary || result.checkpoint_summary
154
+ });
105
155
  return {
106
156
  ok,
107
157
  status: stringValue(proofResult.status),
158
+ result_status: publicState.status,
108
159
  job_id: stringValue(proofResult.job_id),
109
160
  duration_ms: numberValue(proofResult.duration_ms),
110
161
  proof_url: stringValue(runResponse.proofUrl),
@@ -112,6 +163,13 @@ function summarizeRiddleProofPrComment(input) {
112
163
  preview_url: stringValue(preview.preview_url) || stringValue(preview.url),
113
164
  preview_publish_recovered: booleanValue(preview.publish_recovered),
114
165
  preview_publish_error: stringValue(preview.publish_error),
166
+ ship_held: publicState.ship_held,
167
+ shipping_disabled: publicState.shipping_disabled,
168
+ ship_authorized: publicState.ship_authorized,
169
+ proof_decision: firstStringValue(result.proof_decision, stopCondition.proof_decision, resultRaw.proof_decision),
170
+ merge_recommendation: firstStringValue(result.merge_recommendation, stopCondition.merge_recommendation, resultRaw.merge_recommendation),
171
+ checkpoint_summary: checkpointSummary,
172
+ public_state: publicState,
115
173
  passed_checks: nestedChecks.passed,
116
174
  failed_checks: nestedChecks.failed,
117
175
  pages,
@@ -130,9 +188,16 @@ function markdownLink(label, url) {
130
188
  return `[${label.replace(/\]/g, "\\]")}](${url})`;
131
189
  }
132
190
  function resultLabel(summary) {
133
- if (summary.ok === true) return "passed";
191
+ if (summary.public_state?.result_label) return summary.public_state.result_label;
192
+ if (summary.ok === true) {
193
+ if (summary.result_status === "shipped") return "shipped";
194
+ if (summary.result_status === "completed") return "completed";
195
+ if (summary.ship_held === true) return "proof passed; ship held";
196
+ if (summary.ship_authorized === true) return "passed; ship authorized";
197
+ return "passed";
198
+ }
134
199
  if (summary.ok === false) return "failed";
135
- return summary.status || "recorded";
200
+ return summary.result_status || summary.status || "recorded";
136
201
  }
137
202
  function artifactRank(artifact) {
138
203
  const name = artifact.name.toLowerCase();
@@ -144,6 +209,25 @@ function artifactRank(artifact) {
144
209
  if (artifact.kind === "image") return 20;
145
210
  return 30;
146
211
  }
212
+ function formatBool(value) {
213
+ return typeof value === "boolean" ? String(value) : "unknown";
214
+ }
215
+ function hasShipControl(summary) {
216
+ return typeof summary.ship_held === "boolean" || typeof summary.shipping_disabled === "boolean" || typeof summary.ship_authorized === "boolean";
217
+ }
218
+ function checkpointSummaryLine(summary) {
219
+ const accepted = summary.response_count ?? 0;
220
+ const rejected = summary.rejected_response_count ?? 0;
221
+ const ignored = summary.ignored_response_count ?? 0;
222
+ const parts = [`${accepted} accepted`, `${rejected} rejected`, `${ignored} ignored`];
223
+ if ((summary.duplicate_response_count ?? 0) > 0) parts.push(`${summary.duplicate_response_count} duplicate`);
224
+ const state = summary.pending === true ? "pending" : summary.pending === false ? "complete" : "";
225
+ return [
226
+ parts.join(" / "),
227
+ state,
228
+ summary.latest_decision ? `latest decision \`${summary.latest_decision}\`` : ""
229
+ ].filter(Boolean).join("; ");
230
+ }
147
231
  function buildRiddleProofPrCommentMarkdown(input) {
148
232
  const summary = summarizeRiddleProofPrComment(input);
149
233
  const title = input.title?.trim() || "Riddle Proof Evidence";
@@ -155,9 +239,16 @@ function buildRiddleProofPrCommentMarkdown(input) {
155
239
  ];
156
240
  if (input.goal?.trim()) lines.push(`**Goal:** ${input.goal.trim()}`);
157
241
  if (input.successCriteria?.trim()) lines.push(`**Success criteria:** ${input.successCriteria.trim()}`);
242
+ if (summary.result_status) lines.push(`**Evidence status:** ${summary.result_status}`);
158
243
  if (summary.status) lines.push(`**Riddle job status:** ${summary.status}`);
159
244
  if (summary.job_id) lines.push(`**Riddle job:** \`${summary.job_id}\``);
160
245
  if (summary.duration_ms) lines.push(`**Duration:** ${formatDuration(summary.duration_ms)}`);
246
+ if (hasShipControl(summary)) {
247
+ lines.push(`**Ship control:** held=${formatBool(summary.ship_held)}, shipping_disabled=${formatBool(summary.shipping_disabled)}, authorized=${formatBool(summary.ship_authorized)}`);
248
+ }
249
+ if (summary.proof_decision) lines.push(`**Proof decision:** \`${summary.proof_decision}\``);
250
+ if (summary.merge_recommendation) lines.push(`**Merge recommendation:** ${summary.merge_recommendation}`);
251
+ if (summary.checkpoint_summary) lines.push(`**Checkpoints:** ${checkpointSummaryLine(summary.checkpoint_summary)}`);
161
252
  if (summary.proof_url) lines.push(`**Proof URL:** ${markdownLink(summary.proof_url, summary.proof_url)}`);
162
253
  if (summary.preview_id || summary.preview_url) {
163
254
  const previewLabel = summary.preview_id ? `\`${summary.preview_id}\`` : "preview";
@@ -0,0 +1,155 @@
1
+ // src/public-state.ts
2
+ function asRecord(value) {
3
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
4
+ }
5
+ function stringValue(value) {
6
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
7
+ }
8
+ function booleanValue(value) {
9
+ return typeof value === "boolean" ? value : void 0;
10
+ }
11
+ function numberValue(value) {
12
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
13
+ }
14
+ function firstStringValue(...values) {
15
+ for (const value of values) {
16
+ const text = stringValue(value);
17
+ if (text) return text;
18
+ }
19
+ return void 0;
20
+ }
21
+ function firstBooleanValue(...values) {
22
+ for (const value of values) {
23
+ const bool = booleanValue(value);
24
+ if (typeof bool === "boolean") return bool;
25
+ }
26
+ return void 0;
27
+ }
28
+ function firstRecordValue(...values) {
29
+ for (const value of values) {
30
+ const record = asRecord(value);
31
+ if (Object.keys(record).length) return record;
32
+ }
33
+ return void 0;
34
+ }
35
+ function countValue(value) {
36
+ const number = numberValue(value);
37
+ return typeof number === "number" && number > 0 ? Math.trunc(number) : 0;
38
+ }
39
+ function checkpointSummaryFrom(...values) {
40
+ const record = firstRecordValue(...values);
41
+ if (!record) return void 0;
42
+ const accepted = countValue(record.response_count);
43
+ const rejected = countValue(record.rejected_response_count);
44
+ const ignored = countValue(record.ignored_response_count);
45
+ const duplicate = countValue(record.duplicate_response_count);
46
+ const summary = {
47
+ pending: booleanValue(record.pending),
48
+ accepted_response_count: accepted,
49
+ rejected_response_count: rejected,
50
+ ignored_response_count: ignored,
51
+ duplicate_response_count: duplicate,
52
+ latest_decision: stringValue(record.latest_decision),
53
+ audit_disclosure_required: rejected > 0 || ignored > 0 || duplicate > 0
54
+ };
55
+ return Object.values(summary).some((value) => typeof value !== "undefined") ? summary : void 0;
56
+ }
57
+ function uniqueStrings(values) {
58
+ return [...new Set(values.filter(Boolean))];
59
+ }
60
+ function summarizeRiddleProofPublicState(input) {
61
+ const record = asRecord(input);
62
+ const runCard = asRecord(record.run_card);
63
+ const stopCondition = asRecord(runCard.stop_condition);
64
+ const raw = asRecord(record.raw);
65
+ const request = asRecord(record.request);
66
+ const requestMetadata = asRecord(record.request_metadata);
67
+ const prState = asRecord(record.pr_state);
68
+ const handoff = asRecord(record.pr_handoff_policy);
69
+ const handoffState = stringValue(handoff.state);
70
+ const status = firstStringValue(record.status, stopCondition.status);
71
+ const ok = booleanValue(record.ok) ?? null;
72
+ const shipMode = firstStringValue(request.ship_mode, requestMetadata.ship_mode, record.ship_mode, handoff.ship_mode);
73
+ const explicitShippingDisabled = firstBooleanValue(
74
+ record.shipping_disabled,
75
+ stopCondition.shipping_disabled,
76
+ raw.shipping_disabled,
77
+ handoff.shipping_disabled
78
+ );
79
+ const shippingDisabled = explicitShippingDisabled === true || shipMode === "none" || handoffState === "proof_complete_ship_disabled";
80
+ const explicitShipAuthorized = firstBooleanValue(
81
+ record.ship_authorized,
82
+ stopCondition.ship_authorized,
83
+ raw.ship_authorized
84
+ );
85
+ const authorizationEvidence = Boolean(
86
+ status === "shipped" || record.marked_ready === true || stringValue(prState.status) === "merged" || record.merge_commit || record.merged_at
87
+ );
88
+ const shipAuthorizedBeforeHold = explicitShipAuthorized ?? authorizationEvidence;
89
+ const explicitShipHeld = firstBooleanValue(record.ship_held, stopCondition.ship_held, raw.ship_held);
90
+ const inferredHeld = status === "ready_to_ship" && shippingDisabled && !shipAuthorizedBeforeHold;
91
+ const shipHeld = explicitShipHeld === true || inferredHeld;
92
+ const shipAuthorized = shipHeld ? false : shipAuthorizedBeforeHold === true;
93
+ const proofComplete = Boolean(
94
+ status === "ready_to_ship" || status === "shipped" || status === "completed" || status === "passed" || ok === true || handoff.proof_complete === true
95
+ );
96
+ const checkpointSummary = checkpointSummaryFrom(
97
+ record.checkpoint_summary,
98
+ stopCondition.checkpoint_summary,
99
+ asRecord(record.details).checkpoint_summary,
100
+ asRecord(raw.details).checkpoint_summary
101
+ );
102
+ const blockedOrWaiting = status === "blocked" || status === "failed" || status === "awaiting_checkpoint" || handoffState === "proof_blocked" || handoffState === "proof_review_required" || handoffState === "proof_failed" || handoffState === "proof_checkpoint_required";
103
+ const proofPassed = Boolean(proofComplete && !blockedOrWaiting);
104
+ const explicitMergeReady = firstBooleanValue(record.merge_ready, stopCondition.merge_ready, raw.merge_ready, handoff.merge_ready);
105
+ const normalPrAllowed = firstBooleanValue(record.normal_pr_allowed, raw.normal_pr_allowed, handoff.normal_pr_allowed);
106
+ const baseHandoffAllowed = !blockedOrWaiting && !shipHeld && !shippingDisabled;
107
+ const mergeReady = baseHandoffAllowed && normalPrAllowed !== false && (explicitMergeReady ?? shipAuthorized);
108
+ const syncAllowed = mergeReady;
109
+ let policyState = "unknown";
110
+ if (status === "awaiting_checkpoint" || handoffState === "proof_checkpoint_required") policyState = "awaiting_checkpoint";
111
+ else if (status === "failed" || handoffState === "proof_failed") policyState = "proof_failed";
112
+ else if (status === "blocked" || handoffState === "proof_blocked" || handoffState === "proof_review_required") policyState = "proof_blocked";
113
+ else if (handoffState === "proof_complete_ship_disabled") policyState = "proof_complete_ship_disabled";
114
+ else if (proofComplete && shipHeld && !shipAuthorized) policyState = "proof_passed_ship_held";
115
+ else if (proofComplete && shippingDisabled && !shipAuthorized) policyState = "proof_complete_ship_disabled";
116
+ else if (shipAuthorized) policyState = "ship_authorized";
117
+ else if (proofPassed) policyState = "proof_passed";
118
+ else if (status === "running") policyState = "proof_in_progress";
119
+ const requiredDisclosures = [];
120
+ if (shipHeld) requiredDisclosures.push("ship_held");
121
+ if (shippingDisabled) requiredDisclosures.push("shipping_disabled");
122
+ if (checkpointSummary?.audit_disclosure_required) requiredDisclosures.push("checkpoint_audit_counters");
123
+ if (status === "awaiting_checkpoint" || handoffState === "proof_checkpoint_required") requiredDisclosures.push("checkpoint_required");
124
+ const prohibitedClaims = [];
125
+ if (!shipAuthorized || shipHeld || shippingDisabled) prohibitedClaims.push("ship_authorized", "shipped");
126
+ if (!mergeReady) prohibitedClaims.push("merge_ready");
127
+ if (!syncAllowed) prohibitedClaims.push("sync_allowed");
128
+ if (blockedOrWaiting) {
129
+ prohibitedClaims.push("proof_passed", "ready_to_ship");
130
+ }
131
+ if (checkpointSummary?.audit_disclosure_required) {
132
+ prohibitedClaims.push("all_checkpoint_responses_accepted");
133
+ }
134
+ const resultLabel = policyState === "awaiting_checkpoint" ? "checkpoint required" : policyState === "proof_blocked" ? "blocked" : policyState === "proof_failed" ? "failed" : policyState === "proof_complete_ship_disabled" ? "proof complete; shipping disabled" : policyState === "proof_passed_ship_held" ? "proof passed; ship held" : policyState === "ship_authorized" ? status === "shipped" ? "shipped" : "ship authorized" : policyState === "proof_passed" ? "passed" : policyState === "proof_in_progress" ? "running" : status || "recorded";
135
+ return {
136
+ status,
137
+ ok,
138
+ policy_state: policyState,
139
+ result_label: resultLabel,
140
+ proof_complete: proofComplete,
141
+ proof_passed: proofPassed,
142
+ ship_held: shipHeld,
143
+ shipping_disabled: shippingDisabled,
144
+ ship_authorized: shipAuthorized,
145
+ merge_ready: mergeReady,
146
+ sync_allowed: syncAllowed,
147
+ checkpoint_summary: checkpointSummary,
148
+ required_disclosures: uniqueStrings(requiredDisclosures),
149
+ prohibited_claims: uniqueStrings(prohibitedClaims)
150
+ };
151
+ }
152
+
153
+ export {
154
+ summarizeRiddleProofPublicState
155
+ };
@@ -7,7 +7,7 @@ import {
7
7
  RIDDLE_PROOF_PR_COMMENT_MARKER,
8
8
  buildRiddleProofPrCommentMarkdown,
9
9
  summarizeRiddleProofPrComment
10
- } from "./chunk-6KYXX4OE.js";
10
+ } from "./chunk-62XLYPMS.js";
11
11
  import {
12
12
  RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION,
13
13
  applyRiddleProofProfileArtifactCompleteness,
package/dist/cli/index.js CHANGED
@@ -1,7 +1,8 @@
1
- import "../chunk-54DIEDR3.js";
1
+ import "../chunk-ONOPGCID.js";
2
2
  import "../chunk-DI2XNGEZ.js";
3
- import "../chunk-6KYXX4OE.js";
3
+ import "../chunk-62XLYPMS.js";
4
4
  import "../chunk-EX7TO4I5.js";
5
+ import "../chunk-KG64Y5MC.js";
5
6
  import "../chunk-GHBNDHG7.js";
6
7
  import "../chunk-UZIX7M7D.js";
7
8
  import "../chunk-KNPCWWF3.js";