cbrowser 18.82.2 → 19.0.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.
Files changed (53) hide show
  1. package/README.md +42 -3
  2. package/dist/analysis/accessibility-empathy.d.ts +43 -0
  3. package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
  4. package/dist/analysis/accessibility-empathy.js +65 -0
  5. package/dist/analysis/accessibility-empathy.js.map +1 -1
  6. package/dist/analysis/agent-ready-audit.d.ts +44 -1
  7. package/dist/analysis/agent-ready-audit.d.ts.map +1 -1
  8. package/dist/analysis/agent-ready-audit.js +100 -40
  9. package/dist/analysis/agent-ready-audit.js.map +1 -1
  10. package/dist/analysis/bug-hunter.d.ts +11 -1
  11. package/dist/analysis/bug-hunter.d.ts.map +1 -1
  12. package/dist/analysis/bug-hunter.js +44 -6
  13. package/dist/analysis/bug-hunter.js.map +1 -1
  14. package/dist/analysis/competitive-benchmark.d.ts +49 -1
  15. package/dist/analysis/competitive-benchmark.d.ts.map +1 -1
  16. package/dist/analysis/competitive-benchmark.js +138 -14
  17. package/dist/analysis/competitive-benchmark.js.map +1 -1
  18. package/dist/browser.d.ts.map +1 -1
  19. package/dist/browser.js +5 -2
  20. package/dist/browser.js.map +1 -1
  21. package/dist/cli.js +5 -5
  22. package/dist/cli.js.map +1 -1
  23. package/dist/mcp-tools/base/analysis-tools.d.ts.map +1 -1
  24. package/dist/mcp-tools/base/analysis-tools.js +7 -1
  25. package/dist/mcp-tools/base/analysis-tools.js.map +1 -1
  26. package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
  27. package/dist/mcp-tools/base/audit-tools.js +10 -0
  28. package/dist/mcp-tools/base/audit-tools.js.map +1 -1
  29. package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
  30. package/dist/mcp-tools/base/visual-testing-tools.js +29 -1
  31. package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
  32. package/dist/remediation/patch-generator.js +2 -2
  33. package/dist/remediation/patch-generator.js.map +1 -1
  34. package/dist/types.d.ts +80 -5
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/types.js.map +1 -1
  37. package/dist/visual/attention-quality.d.ts +32 -0
  38. package/dist/visual/attention-quality.d.ts.map +1 -1
  39. package/dist/visual/attention-quality.js +41 -1
  40. package/dist/visual/attention-quality.js.map +1 -1
  41. package/dist/visual/freeze-animations.d.ts +71 -0
  42. package/dist/visual/freeze-animations.d.ts.map +1 -0
  43. package/dist/visual/freeze-animations.js +111 -0
  44. package/dist/visual/freeze-animations.js.map +1 -0
  45. package/dist/visual/llm-relevance.d.ts +6 -0
  46. package/dist/visual/llm-relevance.d.ts.map +1 -1
  47. package/dist/visual/llm-relevance.js +42 -1
  48. package/dist/visual/llm-relevance.js.map +1 -1
  49. package/dist/visual/persona-context.d.ts +18 -0
  50. package/dist/visual/persona-context.d.ts.map +1 -1
  51. package/dist/visual/persona-context.js +6 -0
  52. package/dist/visual/persona-context.js.map +1 -1
  53. package/package.json +1 -1
@@ -29,7 +29,10 @@ export async function huntBugs(browser, url, options = {}) {
29
29
  // Check for broken images
30
30
  document.querySelectorAll("img").forEach((img, i) => {
31
31
  if (!img.complete || img.naturalWidth === 0) {
32
- const hasAlt = !!img.getAttribute("alt");
32
+ // getAttribute returns null when ABSENT and "" when alt="" is present,
33
+ // and both are falsy — so `!!` conflates a WCAG failure with a valid
34
+ // declaration that the image is decorative. Compare against null.
35
+ const hasAlt = img.getAttribute("alt") !== null;
33
36
  issues.push({
34
37
  type: "missing-image",
35
38
  description: `Broken image: ${img.src || img.alt || "unknown"}`,
@@ -39,15 +42,36 @@ export async function huntBugs(browser, url, options = {}) {
39
42
  : "Fix the image source URL and add an alt attribute for accessibility",
40
43
  });
41
44
  }
42
- // Check images without alt text
43
- if (!img.getAttribute("alt") && img.complete && img.naturalWidth > 0) {
45
+ // alt ABSENT and alt="" are different defects, and `!img.getAttribute("alt")`
46
+ // treated them as one: null and "" are both falsy.
47
+ //
48
+ // A missing alt is an unambiguous WCAG 1.1.1 failure. An empty alt is a
49
+ // VALID declaration that the image is decorative — possibly wrong, but
50
+ // already a decision someone made. Grading the second as high severity and
51
+ // prescribing "add alt attribute" prescribes a fix that is already applied,
52
+ // and contradicted empathy_audit, which grades the same six images as minor
53
+ // and asks the reader to VERIFY the decorative intent. (2026-08-06)
54
+ const altAttr = img.getAttribute("alt");
55
+ const rendered = img.complete && img.naturalWidth > 0;
56
+ // Matches empathy_audit's threshold so the two tools agree on which images
57
+ // are too small to be worth asking about.
58
+ const isTiny = img.width < 20 || img.height < 20;
59
+ if (altAttr === null && rendered) {
44
60
  issues.push({
45
61
  type: "a11y-violation",
46
- description: `Image missing alt attribute: ${img.src?.slice(-50) || "unknown"}`,
62
+ description: `Image has no alt attribute: ${img.src?.slice(-50) || "unknown"}`,
47
63
  selector: `img:nth-of-type(${i + 1})`,
48
64
  recommendation: "Add alt=\"descriptive text\" for screen readers, or alt=\"\" if decorative",
49
65
  });
50
66
  }
67
+ else if (altAttr === "" && rendered && !isTiny) {
68
+ issues.push({
69
+ type: "a11y-verify",
70
+ description: `Image (${Math.round(img.width)}x${Math.round(img.height)}px) declares alt="" (decorative): ${img.src?.slice(-50) || "unknown"}`,
71
+ selector: `img:nth-of-type(${i + 1})`,
72
+ recommendation: "Verify this image is purely decorative. If it conveys meaning, replace alt=\"\" with descriptive text",
73
+ });
74
+ }
51
75
  });
52
76
  // Check for empty links
53
77
  document.querySelectorAll("a").forEach((a, i) => {
@@ -277,6 +301,12 @@ export async function huntBugs(browser, url, options = {}) {
277
301
  else if (issue.type === "a11y-violation") {
278
302
  severity = "high";
279
303
  }
304
+ else if (issue.type === "a11y-verify") {
305
+ // A prompt to confirm an existing decision, not a violation. Grading it
306
+ // high is what made hunt_bugs contradict empathy_audit on the same six
307
+ // images — one calling it critical, the other minor.
308
+ severity = "low";
309
+ }
280
310
  bugs.push({
281
311
  type: issue.type,
282
312
  severity,
@@ -341,8 +371,16 @@ export async function huntBugs(browser, url, options = {}) {
341
371
  if (!img.complete || img.naturalWidth === 0) {
342
372
  issues.push({ type: "missing-image", description: `Broken image: ${img.src || "unknown"}`, selector: `img:nth-of-type(${i + 1})` });
343
373
  }
344
- if (!img.getAttribute("alt") && img.complete && img.naturalWidth > 0) {
345
- issues.push({ type: "a11y-violation", description: "Image missing alt attribute", selector: `img:nth-of-type(${i + 1})`, recommendation: "Add alt attribute" });
374
+ // Same null-vs-empty distinction as the first-page check above. This
375
+ // condensed copy is why the class needed sweeping rather than the one
376
+ // reported line fixing.
377
+ const altAttr = img.getAttribute("alt");
378
+ const rendered = img.complete && img.naturalWidth > 0;
379
+ if (altAttr === null && rendered) {
380
+ issues.push({ type: "a11y-violation", description: "Image has no alt attribute", selector: `img:nth-of-type(${i + 1})`, recommendation: "Add alt=\"descriptive text\", or alt=\"\" if decorative" });
381
+ }
382
+ else if (altAttr === "" && rendered && img.width >= 20 && img.height >= 20) {
383
+ issues.push({ type: "a11y-verify", description: `Image (${Math.round(img.width)}x${Math.round(img.height)}px) declares alt="" (decorative)`, selector: `img:nth-of-type(${i + 1})`, recommendation: "Verify this image is purely decorative" });
346
384
  }
347
385
  });
348
386
  document.querySelectorAll("a").forEach((a, i) => {
@@ -1 +1 @@
1
- {"version":3,"file":"bug-hunter.js","sourceRoot":"","sources":["../../src/analysis/bug-hunter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bug-hunter.js","sourceRoot":"","sources":["../../src/analysis/bug-hunter.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import type { CompetitiveBenchmarkResult, CompetitiveBenchmarkOptions } from "..
7
7
  export declare function formatCompetitiveBenchmarkReport(result: CompetitiveBenchmarkResult): string;
8
8
  export declare function generateCompetitiveBenchmarkHtmlReport(result: CompetitiveBenchmarkResult): string;
9
9
  export declare function runCompetitiveBenchmark(options: CompetitiveBenchmarkOptions): Promise<CompetitiveBenchmarkResult>;
10
- import type { AIBenchmarkResult, AIBenchmarkOptions } from "../types.js";
10
+ import type { AIBenchmarkResult, AIBenchmarkSiteResult, AIBenchmarkOptions } from "../types.js";
11
11
  /**
12
12
  * Run AI readiness benchmark across multiple competitor sites.
13
13
  *
@@ -21,4 +21,52 @@ import type { AIBenchmarkResult, AIBenchmarkOptions } from "../types.js";
21
21
  * @since 17.0.0
22
22
  */
23
23
  export declare function runAIReadinessBenchmark(options: AIBenchmarkOptions): Promise<AIBenchmarkResult>;
24
+ /**
25
+ * Qualify a strength that the site's own top issues contradict.
26
+ *
27
+ * `/pricing` shipped `strengths: ["Stable selectors that won't break"]` beside
28
+ * `topIssues: ["Element lacks stable selectors (score: 0/10)"]`. Both are
29
+ * arithmetically correct -- the first is an AXIS score at 92, the second is an
30
+ * ELEMENT scoring 0 -- and they are not publishable together unreconciled.
31
+ *
32
+ * Qualified rather than suppressed. Stability 92 is real and useful; deleting
33
+ * the strength would lose it to hide an inconsistency that is actually
34
+ * information. The exception count is what a reader needs, and it is what the
35
+ * old output withheld.
36
+ */
37
+ export declare function reconcileStrengths(strengths: string[], issueCategories: string[], breakdown: {
38
+ findability: number;
39
+ stability: number;
40
+ agentPerceivability: number;
41
+ semantics: number;
42
+ }): string[];
43
+ /**
44
+ * Drop a plain strength when the superlative for the same axis is already
45
+ * present. "Most stable selectors" and "Stable selectors that won't break" are
46
+ * one claim written twice, and the list shipped both.
47
+ */
48
+ export declare function dedupeAdvantagesByAxis(advantages: string[]): string[];
49
+ /**
50
+ * A site worth holding up as an example for THIS issue, or nothing.
51
+ *
52
+ * Three conditions, and the tool previously enforced none of them:
53
+ *
54
+ * 1. It must not share the issue. Checked against the full issue surface above,
55
+ * not just `weaknesses`.
56
+ * 2. It must actually score BETTER than the site being advised. The old code
57
+ * took the first array match, so cbrowser.ai/pricing (83) was told that
58
+ * cbrowser.ai/docs/home (80) "handles this better" -- advice to copy a page
59
+ * that is worse.
60
+ * 3. Among those that qualify, the best one, not the first one encountered.
61
+ *
62
+ * Returns undefined rather than degrading to a rank-based guess. ai_benchmark is
63
+ * a competitive-intelligence tool whose output is aimed at customers comparing
64
+ * themselves to rivals; telling one to copy a competitor with the same flaw is
65
+ * the failure most likely to be screenshotted. No reference is strictly better
66
+ * than a wrong one.
67
+ */
68
+ export declare function pickBetterReference(candidates: AIBenchmarkSiteResult[], subject: {
69
+ siteName: string;
70
+ score: number | null;
71
+ }, issue: string): AIBenchmarkSiteResult | undefined;
24
72
  //# sourceMappingURL=competitive-benchmark.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"competitive-benchmark.d.ts","sourceRoot":"","sources":["../../src/analysis/competitive-benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAO5B,MAAM,aAAa,CAAC;AA03BrB,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAoH3F;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CA0OjG;AAMD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAiHrC;AAMD,OAAO,KAAK,EACV,iBAAiB,EAIjB,kBAAkB,EAInB,MAAM,aAAa,CAAC;AAoIrB;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CA4I5B"}
1
+ {"version":3,"file":"competitive-benchmark.d.ts","sourceRoot":"","sources":["../../src/analysis/competitive-benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EACV,0BAA0B,EAC1B,2BAA2B,EAO5B,MAAM,aAAa,CAAC;AA03BrB,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAoH3F;AAED,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CA0OjG;AAMD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAiHrC;AAMD,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EAGrB,kBAAkB,EAInB,MAAM,aAAa,CAAC;AAoIrB;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAkJ5B;AAoGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EAAE,EACnB,eAAe,EAAE,MAAM,EAAE,EACzB,SAAS,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpG,MAAM,EAAE,CAYV;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAarE;AAiBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACnD,KAAK,EAAE,MAAM,GACZ,qBAAqB,GAAG,SAAS,CAOnC"}
@@ -1324,7 +1324,7 @@ export async function runAIReadinessBenchmark(options) {
1324
1324
  if (audit.score.stability >= 80) {
1325
1325
  strengths.push("Stable selectors that won't break");
1326
1326
  }
1327
- if (audit.score.accessibility >= 80) {
1327
+ if (audit.score.agentPerceivability >= 80) {
1328
1328
  strengths.push("Good ARIA labels for identification");
1329
1329
  }
1330
1330
  if (audit.score.semantics >= 80) {
@@ -1338,14 +1338,19 @@ export async function runAIReadinessBenchmark(options) {
1338
1338
  if (audit.score.stability < 60) {
1339
1339
  weaknesses.push("Dynamic selectors break automation");
1340
1340
  }
1341
- if (audit.score.accessibility < 60) {
1341
+ if (audit.score.agentPerceivability < 60) {
1342
1342
  weaknesses.push("Missing labels for element identification");
1343
1343
  }
1344
1344
  if (audit.score.semantics < 60) {
1345
1345
  weaknesses.push("Poor semantic structure");
1346
1346
  }
1347
1347
  // Add issue-based weaknesses
1348
- const issueDescriptions = audit.issues.slice(0, 3).map((issue) => issue.description);
1348
+ const topThree = audit.issues.slice(0, 3);
1349
+ const issueDescriptions = topThree.map((issue) => issue.description);
1350
+ // Carried alongside the descriptions because reconciliation needs the
1351
+ // CATEGORY, and mapping to description strings threw it away — which is
1352
+ // why a strength and its contradiction could not be matched up.
1353
+ const issueCategories = topThree.map((issue) => String(issue.category));
1349
1354
  return {
1350
1355
  url,
1351
1356
  siteName,
@@ -1353,7 +1358,10 @@ export async function runAIReadinessBenchmark(options) {
1353
1358
  score: audit.score.overall,
1354
1359
  scoreBreakdown: audit.score,
1355
1360
  topIssues: issueDescriptions,
1356
- strengths: strengths.length > 0 ? strengths : ["No major strengths detected"],
1361
+ topIssueCategories: issueCategories,
1362
+ strengths: strengths.length > 0
1363
+ ? reconcileStrengths(strengths, issueCategories, audit.score)
1364
+ : ["No major strengths detected"],
1357
1365
  weaknesses: weaknesses.length > 0 ? weaknesses : issueDescriptions,
1358
1366
  duration: audit.duration,
1359
1367
  auditStatus: "complete",
@@ -1403,7 +1411,7 @@ function generateAIComparison(results) {
1403
1411
  const byScore = [...successfulResults].sort((a, b) => b.score - a.score);
1404
1412
  const byFindability = [...successfulResults].sort((a, b) => b.scoreBreakdown.findability - a.scoreBreakdown.findability);
1405
1413
  const byStability = [...successfulResults].sort((a, b) => b.scoreBreakdown.stability - a.scoreBreakdown.stability);
1406
- const byAccessibility = [...successfulResults].sort((a, b) => b.scoreBreakdown.accessibility - a.scoreBreakdown.accessibility);
1414
+ const byAgentPerceivability = [...successfulResults].sort((a, b) => b.scoreBreakdown.agentPerceivability - a.scoreBreakdown.agentPerceivability);
1407
1415
  const bySemantics = [...successfulResults].sort((a, b) => b.scoreBreakdown.semantics - a.scoreBreakdown.semantics);
1408
1416
  // Find common issues
1409
1417
  const issueCounts = new Map();
@@ -1429,7 +1437,7 @@ function generateAIComparison(results) {
1429
1437
  if (result.siteName === byStability[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
1430
1438
  advantages.push("Most stable selectors");
1431
1439
  }
1432
- if (result.siteName === byAccessibility[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
1440
+ if (result.siteName === byAgentPerceivability[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
1433
1441
  advantages.push("Best ARIA/accessibility labels");
1434
1442
  }
1435
1443
  if (result.siteName === bySemantics[0]?.siteName && result.siteName !== byScore[0]?.siteName) {
@@ -1437,18 +1445,129 @@ function generateAIComparison(results) {
1437
1445
  }
1438
1446
  // Add strength-based advantages
1439
1447
  advantages.push(...result.strengths.filter(s => s !== "No major strengths detected"));
1440
- siteAdvantages[result.siteName] = advantages;
1448
+ siteAdvantages[result.siteName] = dedupeAdvantagesByAxis(advantages);
1441
1449
  }
1442
1450
  return {
1443
1451
  bestOverall: byScore[0]?.siteName || "N/A",
1444
1452
  bestFindability: byFindability[0]?.siteName || "N/A",
1445
1453
  bestStability: byStability[0]?.siteName || "N/A",
1446
- bestAccessibility: byAccessibility[0]?.siteName || "N/A",
1454
+ bestAgentPerceivability: byAgentPerceivability[0]?.siteName || "N/A",
1447
1455
  bestSemantics: bySemantics[0]?.siteName || "N/A",
1448
1456
  commonIssues,
1449
1457
  siteAdvantages,
1450
1458
  };
1451
1459
  }
1460
+ /**
1461
+ * Which scoring axis a strength phrase is a claim about.
1462
+ *
1463
+ * The phrases are generated from axis thresholds a few lines below, so this map
1464
+ * is their inverse. Kept beside them deliberately: a new strength added without
1465
+ * an entry here is silently exempt from reconciliation, which is how a claim and
1466
+ * its contradiction came to ship side by side.
1467
+ */
1468
+ const STRENGTH_AXIS = {
1469
+ "Easy for agents to locate elements": "findability",
1470
+ "Stable selectors that won't break": "stability",
1471
+ "Good ARIA labels for identification": "agentPerceivability",
1472
+ "Clear semantic HTML structure": "semantics",
1473
+ };
1474
+ /** Superlatives and plain strengths make the same claim at different scopes. */
1475
+ const ADVANTAGE_AXIS = {
1476
+ "Best element findability": "findability",
1477
+ "Most stable selectors": "stability",
1478
+ "Best ARIA/accessibility labels": "agentPerceivability",
1479
+ "Best semantic structure": "semantics",
1480
+ };
1481
+ /**
1482
+ * Qualify a strength that the site's own top issues contradict.
1483
+ *
1484
+ * `/pricing` shipped `strengths: ["Stable selectors that won't break"]` beside
1485
+ * `topIssues: ["Element lacks stable selectors (score: 0/10)"]`. Both are
1486
+ * arithmetically correct -- the first is an AXIS score at 92, the second is an
1487
+ * ELEMENT scoring 0 -- and they are not publishable together unreconciled.
1488
+ *
1489
+ * Qualified rather than suppressed. Stability 92 is real and useful; deleting
1490
+ * the strength would lose it to hide an inconsistency that is actually
1491
+ * information. The exception count is what a reader needs, and it is what the
1492
+ * old output withheld.
1493
+ */
1494
+ export function reconcileStrengths(strengths, issueCategories, breakdown) {
1495
+ return strengths.map((strength) => {
1496
+ const axis = STRENGTH_AXIS[strength];
1497
+ if (!axis)
1498
+ return strength;
1499
+ // The deprecated "accessibility" category is out of the type but can still
1500
+ // arrive at runtime from an older caller across a JSON boundary.
1501
+ const exceptions = issueCategories.filter((c) => c === axis
1502
+ || (axis === "agentPerceivability" && c === "accessibility")).length;
1503
+ if (exceptions === 0)
1504
+ return strength;
1505
+ const score = breakdown[axis];
1506
+ return `${strength} overall (${axis} ${score}), with ${exceptions} element(s) excepted`;
1507
+ });
1508
+ }
1509
+ /**
1510
+ * Drop a plain strength when the superlative for the same axis is already
1511
+ * present. "Most stable selectors" and "Stable selectors that won't break" are
1512
+ * one claim written twice, and the list shipped both.
1513
+ */
1514
+ export function dedupeAdvantagesByAxis(advantages) {
1515
+ const superlativeAxes = new Set(advantages.map((a) => ADVANTAGE_AXIS[a]).filter(Boolean));
1516
+ const seen = new Set();
1517
+ return advantages.filter((a) => {
1518
+ if (seen.has(a))
1519
+ return false;
1520
+ seen.add(a);
1521
+ // A qualified strength keeps its exception count, so match on the stem.
1522
+ const stem = a.split(" overall (")[0];
1523
+ const axis = STRENGTH_AXIS[stem];
1524
+ if (axis && superlativeAxes.has(axis))
1525
+ return false;
1526
+ return true;
1527
+ });
1528
+ }
1529
+ /**
1530
+ * Everything a site is known to be bad at.
1531
+ *
1532
+ * `weaknesses` alone is not that set. It is `weaknesses.length > 0 ? weaknesses
1533
+ * : issueDescriptions` -- so a site with a low AXIS score gets only its axis
1534
+ * weaknesses, and its element-level issues never appear there at all. That is
1535
+ * the gap the reference check fell through: cbrowser.ai/pricing carried a sticky
1536
+ * -element issue in `topIssues` and not in `weaknesses`, so a check reading only
1537
+ * `weaknesses` concluded it was clean and recommended it as the example to
1538
+ * follow -- for the identical issue.
1539
+ */
1540
+ function issueSurface(r) {
1541
+ return new Set([...(r.weaknesses ?? []), ...(r.topIssues ?? [])]);
1542
+ }
1543
+ /**
1544
+ * A site worth holding up as an example for THIS issue, or nothing.
1545
+ *
1546
+ * Three conditions, and the tool previously enforced none of them:
1547
+ *
1548
+ * 1. It must not share the issue. Checked against the full issue surface above,
1549
+ * not just `weaknesses`.
1550
+ * 2. It must actually score BETTER than the site being advised. The old code
1551
+ * took the first array match, so cbrowser.ai/pricing (83) was told that
1552
+ * cbrowser.ai/docs/home (80) "handles this better" -- advice to copy a page
1553
+ * that is worse.
1554
+ * 3. Among those that qualify, the best one, not the first one encountered.
1555
+ *
1556
+ * Returns undefined rather than degrading to a rank-based guess. ai_benchmark is
1557
+ * a competitive-intelligence tool whose output is aimed at customers comparing
1558
+ * themselves to rivals; telling one to copy a competitor with the same flaw is
1559
+ * the failure most likely to be screenshotted. No reference is strictly better
1560
+ * than a wrong one.
1561
+ */
1562
+ export function pickBetterReference(candidates, subject, issue) {
1563
+ if (subject.score === null)
1564
+ return undefined;
1565
+ return candidates
1566
+ .filter((r) => r.siteName !== subject.siteName)
1567
+ .filter((r) => r.score !== null && r.score > subject.score)
1568
+ .filter((r) => !issueSurface(r).has(issue))
1569
+ .sort((a, b) => (b.score ?? 0) - (a.score ?? 0))[0];
1570
+ }
1452
1571
  /**
1453
1572
  * Generate prioritized recommendations for each site
1454
1573
  */
@@ -1479,14 +1598,15 @@ function generateAIRecommendations(results, ranking) {
1479
1598
  }
1480
1599
  // Add weakness-based recommendations
1481
1600
  for (const weakness of result.weaknesses) {
1482
- const betterSite = successfulResults.find((r) => r.siteName !== result.siteName &&
1483
- !r.weaknesses.includes(weakness));
1601
+ const betterSite = pickBetterReference(successfulResults, { siteName: result.siteName, score: result.score }, weakness);
1484
1602
  recommendations.push({
1485
1603
  site: result.siteName,
1486
1604
  priority: priority++,
1487
1605
  improvement: weakness,
1606
+ // Named with its score, so the claim is checkable in the same line
1607
+ // rather than asserted. Omitted entirely when nothing qualifies.
1488
1608
  competitorReference: betterSite
1489
- ? `${betterSite.siteName} handles this better`
1609
+ ? `${betterSite.siteName} (${betterSite.score}) does not have this issue`
1490
1610
  : undefined,
1491
1611
  });
1492
1612
  }
@@ -1504,8 +1624,8 @@ function generateAIRecommendations(results, ranking) {
1504
1624
  fix: "Use data-testid attributes and semantic selectors",
1505
1625
  },
1506
1626
  {
1507
- name: "accessibility",
1508
- score: result.scoreBreakdown.accessibility,
1627
+ name: "agentPerceivability",
1628
+ score: result.scoreBreakdown.agentPerceivability,
1509
1629
  fix: "Ensure all form inputs have associated labels",
1510
1630
  },
1511
1631
  {
@@ -1522,13 +1642,17 @@ function generateAIRecommendations(results, ranking) {
1522
1642
  switch (cat.name) {
1523
1643
  case "findability": return r.scoreBreakdown.findability;
1524
1644
  case "stability": return r.scoreBreakdown.stability;
1525
- case "accessibility": return r.scoreBreakdown.accessibility;
1645
+ case "agentPerceivability": return r.scoreBreakdown.agentPerceivability;
1526
1646
  case "semantics": return r.scoreBreakdown.semantics;
1527
1647
  default: return 0;
1528
1648
  }
1529
1649
  };
1650
+ // Must beat the site being advised. Sorting alone still names a
1651
+ // reference when every site is bad at this category, which is advice
1652
+ // to copy someone equally weak.
1530
1653
  const bestInCat = successfulResults
1531
1654
  .filter((r) => r.siteName !== result.siteName)
1655
+ .filter((r) => getScore(r) > cat.score)
1532
1656
  .sort((a, b) => getScore(b) - getScore(a))[0];
1533
1657
  recommendations.push({
1534
1658
  site: result.siteName,