@riddledc/riddle-proof 0.7.108 → 0.7.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -526,8 +526,13 @@ artifact links should fail the profile:
526
526
  ```
527
527
 
528
528
  The check defaults to `a[href]`, deduplicates URLs, probes up to 100 selected
529
- URLs, and treats HTTP `2xx` / `3xx` responses as healthy. Use
530
- `allowed_statuses` or `expected_status` when a narrower status contract is
529
+ URLs, and treats HTTP `2xx` / `3xx` responses as healthy. `expected_count` and
530
+ `min_count` apply to the probed URL set after same-origin filtering, URL
531
+ deduplication, and the `max_links` limit. The run summary also reports
532
+ `discovered_count` when it differs, which helps explain cases where a page has
533
+ two DOM nodes pointing at the same artifact URL. Use `dedupe: false` when the
534
+ contract should count duplicate DOM candidates instead of unique artifact URLs.
535
+ Use `allowed_statuses` or `expected_status` when a narrower status contract is
531
536
  intentional, `min_count` for lower-bound audits, `min_bytes` when a one-byte
532
537
  range response is too weak, `allowed_content_types` for MIME checks, and
533
538
  `max_links` when the selected set is intentionally larger than 100.
package/dist/cli.cjs CHANGED
@@ -12911,8 +12911,8 @@ function profileCheckMarkdownTarget(check) {
12911
12911
  const minCount = cliFiniteNumber(evidence.min_count);
12912
12912
  const minBytes = cliFiniteNumber(evidence.min_bytes);
12913
12913
  const parts = [];
12914
- if (expectedCount !== void 0) parts.push(`links = ${expectedCount}`);
12915
- else if (minCount !== void 0) parts.push(`links >= ${minCount}`);
12914
+ if (expectedCount !== void 0) parts.push(`probed links = ${expectedCount}`);
12915
+ else if (minCount !== void 0) parts.push(`probed links >= ${minCount}`);
12916
12916
  if (minBytes !== void 0) parts.push(`bytes >= ${minBytes}`);
12917
12917
  if (selector && parts.length) return `${markdownInlineCode(selector)} ${parts.join(", ")}`;
12918
12918
  return selector ? markdownInlineCode(selector) : parts.join(", ") || void 0;
@@ -13124,6 +13124,7 @@ function profileLinkStatusSummaryMarkdown(result) {
13124
13124
  const selector = cliString(evidence.selector);
13125
13125
  const viewports = Array.isArray(evidence.viewports) ? evidence.viewports.map(cliRecord).filter((viewport) => Boolean(viewport)) : [];
13126
13126
  const totals = viewports.map((viewport) => cliFiniteNumber(viewport.total_count)).filter((count) => count !== void 0);
13127
+ const discoveredTotals = viewports.map((viewport) => cliFiniteNumber(viewport.discovered_count)).filter((count) => count !== void 0);
13127
13128
  const okTotal = viewports.reduce((sum, viewport) => sum + (cliFiniteNumber(viewport.ok_count) || 0), 0);
13128
13129
  const failedTotal = viewports.reduce((sum, viewport) => sum + (cliFiniteNumber(viewport.failed_count) || 0), 0);
13129
13130
  const truncatedTotal = viewports.filter((viewport) => viewport.truncated === true).length;
@@ -13131,8 +13132,9 @@ function profileLinkStatusSummaryMarkdown(result) {
13131
13132
  const minBytes = cliFiniteNumber(evidence.min_bytes);
13132
13133
  const allowedContentTypes = Array.isArray(evidence.allowed_content_types) ? evidence.allowed_content_types.map(cliString).filter((value) => Boolean(value)) : [];
13133
13134
  const countText = totals.length ? totals.join("/") : "unknown";
13135
+ const discoveredText = discoveredTotals.length && discoveredTotals.some((count, index) => count !== totals[index]) ? `, discovered ${discoveredTotals.join("/")}` : "";
13134
13136
  lines.push(
13135
- `- ${label}${selector ? ` ${markdownInlineCode(selector)}` : ""}: links ${countText}, ok ${okTotal}, failures ${failedTotal}${omittedTotal ? `, compacted ${omittedTotal} result row(s)` : ""}${truncatedTotal ? `, truncated viewports ${truncatedTotal}` : ""}${minBytes !== void 0 ? `, min bytes ${minBytes}` : ""}${allowedContentTypes.length ? `, content types ${allowedContentTypes.map((value) => markdownInlineCode(value)).join(", ")}` : ""}`
13137
+ `- ${label}${selector ? ` ${markdownInlineCode(selector)}` : ""}: probed links ${countText}${discoveredText}, ok ${okTotal}, failures ${failedTotal}${omittedTotal ? `, compacted ${omittedTotal} result row(s)` : ""}${truncatedTotal ? `, truncated viewports ${truncatedTotal}` : ""}${minBytes !== void 0 ? `, min bytes ${minBytes}` : ""}${allowedContentTypes.length ? `, content types ${allowedContentTypes.map((value) => markdownInlineCode(value)).join(", ")}` : ""}`
13136
13138
  );
13137
13139
  }
13138
13140
  return lines;
package/dist/cli.js CHANGED
@@ -438,8 +438,8 @@ function profileCheckMarkdownTarget(check) {
438
438
  const minCount = cliFiniteNumber(evidence.min_count);
439
439
  const minBytes = cliFiniteNumber(evidence.min_bytes);
440
440
  const parts = [];
441
- if (expectedCount !== void 0) parts.push(`links = ${expectedCount}`);
442
- else if (minCount !== void 0) parts.push(`links >= ${minCount}`);
441
+ if (expectedCount !== void 0) parts.push(`probed links = ${expectedCount}`);
442
+ else if (minCount !== void 0) parts.push(`probed links >= ${minCount}`);
443
443
  if (minBytes !== void 0) parts.push(`bytes >= ${minBytes}`);
444
444
  if (selector && parts.length) return `${markdownInlineCode(selector)} ${parts.join(", ")}`;
445
445
  return selector ? markdownInlineCode(selector) : parts.join(", ") || void 0;
@@ -651,6 +651,7 @@ function profileLinkStatusSummaryMarkdown(result) {
651
651
  const selector = cliString(evidence.selector);
652
652
  const viewports = Array.isArray(evidence.viewports) ? evidence.viewports.map(cliRecord).filter((viewport) => Boolean(viewport)) : [];
653
653
  const totals = viewports.map((viewport) => cliFiniteNumber(viewport.total_count)).filter((count) => count !== void 0);
654
+ const discoveredTotals = viewports.map((viewport) => cliFiniteNumber(viewport.discovered_count)).filter((count) => count !== void 0);
654
655
  const okTotal = viewports.reduce((sum, viewport) => sum + (cliFiniteNumber(viewport.ok_count) || 0), 0);
655
656
  const failedTotal = viewports.reduce((sum, viewport) => sum + (cliFiniteNumber(viewport.failed_count) || 0), 0);
656
657
  const truncatedTotal = viewports.filter((viewport) => viewport.truncated === true).length;
@@ -658,8 +659,9 @@ function profileLinkStatusSummaryMarkdown(result) {
658
659
  const minBytes = cliFiniteNumber(evidence.min_bytes);
659
660
  const allowedContentTypes = Array.isArray(evidence.allowed_content_types) ? evidence.allowed_content_types.map(cliString).filter((value) => Boolean(value)) : [];
660
661
  const countText = totals.length ? totals.join("/") : "unknown";
662
+ const discoveredText = discoveredTotals.length && discoveredTotals.some((count, index) => count !== totals[index]) ? `, discovered ${discoveredTotals.join("/")}` : "";
661
663
  lines.push(
662
- `- ${label}${selector ? ` ${markdownInlineCode(selector)}` : ""}: links ${countText}, ok ${okTotal}, failures ${failedTotal}${omittedTotal ? `, compacted ${omittedTotal} result row(s)` : ""}${truncatedTotal ? `, truncated viewports ${truncatedTotal}` : ""}${minBytes !== void 0 ? `, min bytes ${minBytes}` : ""}${allowedContentTypes.length ? `, content types ${allowedContentTypes.map((value) => markdownInlineCode(value)).join(", ")}` : ""}`
664
+ `- ${label}${selector ? ` ${markdownInlineCode(selector)}` : ""}: probed links ${countText}${discoveredText}, ok ${okTotal}, failures ${failedTotal}${omittedTotal ? `, compacted ${omittedTotal} result row(s)` : ""}${truncatedTotal ? `, truncated viewports ${truncatedTotal}` : ""}${minBytes !== void 0 ? `, min bytes ${minBytes}` : ""}${allowedContentTypes.length ? `, content types ${allowedContentTypes.map((value) => markdownInlineCode(value)).join(", ")}` : ""}`
663
665
  );
664
666
  }
665
667
  return lines;
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
292
292
  blocking?: boolean;
293
293
  details?: Record<string, unknown>;
294
294
  ok: boolean;
295
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
295
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
296
296
  state_path: string;
297
297
  stage: any;
298
298
  summary: string;
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
382
382
  continueWithStage?: WorkflowStage | null;
383
383
  blocking?: boolean;
384
384
  details?: Record<string, unknown>;
385
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
385
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
386
386
  state_path: string;
387
387
  stage: any;
388
388
  checkpoint: string;
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
659
659
  error?: undefined;
660
660
  } | {
661
661
  ok: boolean;
662
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
662
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
663
663
  state_path: string;
664
664
  stage: any;
665
665
  summary: string;
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
292
292
  blocking?: boolean;
293
293
  details?: Record<string, unknown>;
294
294
  ok: boolean;
295
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
295
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
296
296
  state_path: string;
297
297
  stage: any;
298
298
  summary: string;
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
382
382
  continueWithStage?: WorkflowStage | null;
383
383
  blocking?: boolean;
384
384
  details?: Record<string, unknown>;
385
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
385
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
386
386
  state_path: string;
387
387
  stage: any;
388
388
  checkpoint: string;
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
659
659
  error?: undefined;
660
660
  } | {
661
661
  ok: boolean;
662
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
662
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
663
663
  state_path: string;
664
664
  stage: any;
665
665
  summary: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.7.108",
3
+ "version": "0.7.109",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",