@canonry/canonry 7.98.0 → 7.100.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 (182) hide show
  1. package/README.md +18 -16
  2. package/assets/agent-workspace/AGENTS.md +13 -6
  3. package/assets/agent-workspace/skills/aero/SKILL.md +45 -26
  4. package/assets/agent-workspace/skills/aero/references/agent-operations.md +47 -12
  5. package/assets/agent-workspace/skills/aero/references/memory-patterns.md +1 -1
  6. package/assets/agent-workspace/skills/aero/references/orchestration.md +9 -9
  7. package/assets/agent-workspace/skills/aero/references/reporting.md +8 -4
  8. package/assets/agent-workspace/skills/aero/references/seo-analysis.md +2 -2
  9. package/assets/agent-workspace/skills/aero/references/site-health.md +34 -23
  10. package/assets/agent-workspace/skills/aero/soul.md +2 -2
  11. package/assets/agent-workspace/skills/canonry/SKILL.md +37 -7
  12. package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +14 -11
  13. package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +122 -53
  14. package/assets/assets/AccessControls-DzO5Y8v9.js +2 -0
  15. package/assets/assets/AgentSetupPage-DWWovaCw.js +36 -0
  16. package/assets/assets/AuditHistoryPanel-BG-n1i8c.js +1 -0
  17. package/assets/assets/BacklinksPage-D6wdOMXt.js +1 -0
  18. package/assets/assets/ChartPrimitives-CtKdkn64.js +3 -0
  19. package/assets/assets/Hint-3TTi0MgX.js +1 -0
  20. package/assets/assets/{HistoryPage-DeN79d3c.js → HistoryPage-B_ReWHbL.js} +1 -1
  21. package/assets/assets/InfoTooltip-D29JcNMW.js +1 -0
  22. package/assets/assets/MeasurementPropertyPage-zdyLL-kl.js +4 -0
  23. package/assets/assets/ProjectPage-KZNKXR4w.js +15 -0
  24. package/assets/assets/RunsPage-DxN0xXQh.js +1 -0
  25. package/assets/assets/ServerTrafficSection-CvISj5pf.js +40 -0
  26. package/assets/assets/SettingsPage-CpRpBlMV.js +1 -0
  27. package/assets/assets/ToneBadge-DcwPruHr.js +60 -0
  28. package/assets/assets/TrafficPage-zk6zMZyz.js +1 -0
  29. package/assets/assets/TrafficSourceDetailPage-DJtsI06Z.js +1 -0
  30. package/assets/assets/{account-context-CdEHcI5S.js → account-context-CoJVqEXZ.js} +1 -1
  31. package/assets/assets/{agent-trust-copy-N6WacCSg.js → agent-trust-copy-BIXDMtBm.js} +1 -1
  32. package/assets/assets/{card-B1O0SunG.js → card-Dwmc7Srx.js} +1 -1
  33. package/assets/assets/index-fh1T5JQY.css +1 -0
  34. package/assets/assets/index-mqc2mWUR.js +42 -0
  35. package/assets/assets/query-client-Tg1fZu4i.js +1 -0
  36. package/assets/assets/react-query-BqcEEfEO.js +1 -0
  37. package/assets/assets/{react-sigma_core.esm.min-f4uuOgrw.js → react-sigma_core.esm.min-D1q0DR_j.js} +3 -3
  38. package/assets/assets/{server-traffic-CkSCFMnL.js → server-traffic-Djnh_9f0.js} +1 -1
  39. package/assets/assets/service-BQjBdN4O.js +1 -0
  40. package/assets/assets/use-tooltip-position-BOzm-6Wy.js +1 -0
  41. package/assets/assets/vendor-lucide-iE5MEh2-.js +1 -0
  42. package/assets/assets/{vendor-markdown-BDQ1GKGP.js → vendor-markdown-BBGbNklj.js} +1 -1
  43. package/assets/assets/{vendor-radix-BGYlvS2l.js → vendor-radix-DKCt5Z_h.js} +1 -1
  44. package/assets/assets/{vendor-recharts-DhEHcK3G.js → vendor-recharts-D3MLFU3q.js} +1 -1
  45. package/assets/assets/{vendor-tanstack-BNuZ37rE.js → vendor-tanstack-B90HW50P.js} +2 -2
  46. package/assets/index.html +16 -15
  47. package/dist/{ads-PQ4OP6OH.js → ads-FVPZ6R6Z.js} +3 -3
  48. package/dist/{agent-B6ZPL2HH.js → agent-2LPU2E5I.js} +7 -7
  49. package/dist/{agent-ask-ZUKNXRAX.js → agent-ask-5ODREK6D.js} +3 -3
  50. package/dist/{agent-conversations-DJ7WU7PL.js → agent-conversations-SNLOOJEM.js} +3 -3
  51. package/dist/{agent-journeys-LGUI3SQG.js → agent-journeys-XDXVL6PK.js} +3 -3
  52. package/dist/{agent-memory-PWZJ7G5Q.js → agent-memory-NKAI2S3U.js} +3 -3
  53. package/dist/{agent-providers-TEERDNJT.js → agent-providers-R5L7A72X.js} +3 -3
  54. package/dist/{agent-transcript-KDPOPK5Z.js → agent-transcript-C5WAGYVC.js} +3 -3
  55. package/dist/{analytics-NFW5RQRT.js → analytics-EJVOLIQL.js} +33 -13
  56. package/dist/{apply-EP4V4UF5.js → apply-I6JOM247.js} +3 -3
  57. package/dist/{backfill-6UTNNVFO.js → backfill-UVUR36IB.js} +10 -10
  58. package/dist/{backlinks-SG5GV5X5.js → backlinks-3VMVACWN.js} +3 -3
  59. package/dist/{bing-Q4W24JNC.js → bing-R5RL3PW2.js} +3 -3
  60. package/dist/{bootstrap-WEMERVNZ.js → bootstrap-GMMSDTNO.js} +12 -12
  61. package/dist/{cdp-3XKBJGHO.js → cdp-FJKUXHEY.js} +7 -7
  62. package/dist/{chunk-KK3Z34AN.js → chunk-2DV7F6XA.js} +91 -2
  63. package/dist/{chunk-MTW37GXF.js → chunk-2FWYWGIR.js} +2 -2
  64. package/dist/{chunk-Q5SNOMRB.js → chunk-56VVRWJM.js} +14 -5
  65. package/dist/{chunk-52M2JWCB.js → chunk-7BEGCVVB.js} +1 -1
  66. package/dist/{chunk-WZSDGC45.js → chunk-7BH53MOB.js} +27 -2
  67. package/dist/{chunk-IX5AC3QB.js → chunk-7J2RIIYU.js} +1450 -1067
  68. package/dist/{chunk-UXXZXXNG.js → chunk-7SNMIXEQ.js} +2 -2
  69. package/dist/{chunk-2XCYEBQV.js → chunk-AMGM55CP.js} +2 -2
  70. package/dist/{chunk-MSI4BGFN.js → chunk-AYKTVQF7.js} +13 -5
  71. package/dist/{chunk-3JWY65XO.js → chunk-BKDRT4VS.js} +7 -7
  72. package/dist/{chunk-FQ3L2TIX.js → chunk-COHSL6KW.js} +1 -1
  73. package/dist/{chunk-X3UXMHWC.js → chunk-DGDLLRS4.js} +1 -1
  74. package/dist/{chunk-YJITDEZR.js → chunk-DHIB7EIA.js} +4 -4
  75. package/dist/{chunk-BLW327AU.js → chunk-EE3QTCLS.js} +18 -6
  76. package/dist/{chunk-3GMBHGQ5.js → chunk-F46TBLXK.js} +204 -94
  77. package/dist/{chunk-RTH5JVC3.js → chunk-FBO25TA3.js} +1 -1
  78. package/dist/{chunk-2Q7JEC6N.js → chunk-FZ3MUTU3.js} +2 -2
  79. package/dist/{chunk-64R66MWZ.js → chunk-G6QN4VFS.js} +16 -10
  80. package/dist/{chunk-ISIJ2NS4.js → chunk-HBHLYWKE.js} +9 -6
  81. package/dist/{chunk-EJZ444VV.js → chunk-HL2LGRTI.js} +8 -6
  82. package/dist/chunk-J6536OL6.js +31 -0
  83. package/dist/{chunk-RLKI2QF7.js → chunk-KVRX7YIH.js} +20 -10
  84. package/dist/{chunk-3BA75QYU.js → chunk-LJO2BKWU.js} +1 -1
  85. package/dist/{chunk-CN6MVUY3.js → chunk-LNVFERI4.js} +1 -1
  86. package/dist/{chunk-ZADRESLB.js → chunk-NQYJHKML.js} +39 -7
  87. package/dist/{chunk-IAGC2MGP.js → chunk-O5UFAXUI.js} +646 -588
  88. package/dist/{chunk-RGFIRJ7F.js → chunk-O6APBEJE.js} +2 -2
  89. package/dist/{chunk-ZBTUISPG.js → chunk-O7S7OHLE.js} +9399 -8388
  90. package/dist/{chunk-ER5ZHAB2.js → chunk-QS5DWJDI.js} +2 -2
  91. package/dist/{chunk-QSL3FXE4.js → chunk-RBG2QXQM.js} +4 -4
  92. package/dist/{chunk-SAKH2RRF.js → chunk-SWZXHHAG.js} +16 -8
  93. package/dist/{chunk-VMGZBH5L.js → chunk-T7UDY7W3.js} +26 -11
  94. package/dist/{chunk-OL2L5ANJ.js → chunk-UGO2FO6V.js} +119 -55
  95. package/dist/{chunk-J6MYB3F4.js → chunk-VHULVUDL.js} +1 -1
  96. package/dist/{chunk-O22WSFWL.js → chunk-YGAQQSCL.js} +56339 -54966
  97. package/dist/{chunk-TNOYUE2L.js → chunk-YIIRS7V7.js} +98 -65
  98. package/dist/{chunk-64KB6YTG.js → chunk-YU2WX7RD.js} +3 -3
  99. package/dist/{citations-5OSQ3ZYU.js → citations-LOEQRDUB.js} +21 -10
  100. package/dist/{cli-catalog-T5OAVKGS.js → cli-catalog-5RXNUFBS.js} +3 -3
  101. package/dist/{cli-commands-VATCVJKW.js → cli-commands-HE2BQY3Y.js} +7 -7
  102. package/dist/cli.js +22 -17
  103. package/dist/{competitor-YIKTMTHY.js → competitor-PIX2BHJW.js} +3 -3
  104. package/dist/{content-DS2LKR7J.js → content-PJGW4WZF.js} +3 -3
  105. package/dist/{dashboard-HLVRRRI4.js → dashboard-7OKBD4MG.js} +6 -6
  106. package/dist/{demo-A5DTVJGK.js → demo-SCOFAWFM.js} +1 -1
  107. package/dist/{demo-server-P2JGAI6C.js → demo-server-SJPI6RSL.js} +38 -36
  108. package/dist/{discover-VNZDO2MU.js → discover-I3WL2QUN.js} +10 -8
  109. package/dist/{discover-eval-ON77LUEN.js → discover-eval-YRECOIP5.js} +3 -3
  110. package/dist/{doctor-7TNNTI7H.js → doctor-F4J6LILX.js} +3 -3
  111. package/dist/{evidence-E54CNGXS.js → evidence-MYQTCY4V.js} +25 -10
  112. package/dist/{export-cmd-XXZ6KLQQ.js → export-cmd-3SUFOJM6.js} +3 -3
  113. package/dist/{ga-ZQB4EJI3.js → ga-VA6FYK4L.js} +3 -3
  114. package/dist/{gbp-ZQL6NQEK.js → gbp-DI6ZVFHL.js} +3 -3
  115. package/dist/{google-7EIHQGSV.js → google-UVKWJCD2.js} +4 -4
  116. package/dist/{google-marketing-RSAO4PG7.js → google-marketing-S63HN733.js} +1 -1
  117. package/dist/{health-cmd-R7WPKGWX.js → health-cmd-DOZXGI46.js} +16 -9
  118. package/dist/{history-2CSWSVCY.js → history-UTJTUDYK.js} +3 -3
  119. package/dist/index.d.ts +204 -12
  120. package/dist/index.js +26 -26
  121. package/dist/{init-FXZRMXZ3.js → init-IVJSS33J.js} +19 -19
  122. package/dist/{insights-EJUL3W6D.js → insights-UHCVCZ76.js} +3 -3
  123. package/dist/intelligence-service-3EENJ5DS.js +16 -0
  124. package/dist/{journeys-YUMBANFH.js → journeys-XIT7WDM2.js} +3 -3
  125. package/dist/{keys-KLOTGT4H.js → keys-MQKW4JUI.js} +3 -3
  126. package/dist/{keyword-5NSJFEOI.js → keyword-EASMKYZ3.js} +3 -3
  127. package/dist/{logs-WW3RLCRG.js → logs-ZHZ6XM55.js} +3 -3
  128. package/dist/{mcp-NTBEIEVX.js → mcp-ECVT2YGU.js} +4 -4
  129. package/dist/mcp.js +10 -10
  130. package/dist/{measurement-plan-BLPAZEXS.js → measurement-plan-7FQKUOMR.js} +5 -5
  131. package/dist/{notify-KAGE6UEN.js → notify-TC7ARC6W.js} +3 -3
  132. package/dist/{organic-evidence-HTYRXRML.js → organic-evidence-M34MWJXE.js} +7 -4
  133. package/dist/overview-P6BRMXJN.js +314 -0
  134. package/dist/{project-NYUWICVC.js → project-WZ2YXFPJ.js} +4 -4
  135. package/dist/project-setup-WV6SPGIV.js +176 -0
  136. package/dist/{query-3CRRDOHD.js → query-WAFJKDHG.js} +3 -3
  137. package/dist/{research-ZULVD3TW.js → research-B5ZPQX7R.js} +3 -3
  138. package/dist/{results-export-STM7SQ4J.js → results-export-NIZV6R3K.js} +3 -3
  139. package/dist/{run-S4MFU4MK.js → run-ICLPZ7QT.js} +7 -4
  140. package/dist/{schedule-6W3Q2FUL.js → schedule-4C44LQ7R.js} +22 -3
  141. package/dist/{search-EKXXN7C4.js → search-UJM7KII3.js} +11 -4
  142. package/dist/{serve-TFBFPFAQ.js → serve-A6UIO6WP.js} +30 -29
  143. package/dist/{session-4B5V3AH6.js → session-RTE22GQT.js} +14 -14
  144. package/dist/settings-BOF5Z7ML.js +211 -0
  145. package/dist/{sitemaps-R7XFCH6E.js → sitemaps-BM7S76H2.js} +4 -4
  146. package/dist/{skills-44XYCTVD.js → skills-X5SR4HRO.js} +2 -2
  147. package/dist/{snapshot-ROAOJI4W.js → snapshot-KLKE37VY.js} +4 -4
  148. package/dist/{src-ZJRIKEDB.js → src-EKLG5A6O.js} +4 -2
  149. package/dist/{status-EN3A2TX5.js → status-OYG57DWU.js} +6 -5
  150. package/dist/{technical-aeo-ZV466F65.js → technical-aeo-KWVWOOTI.js} +23 -23
  151. package/dist/{telemetry-EZHPNZ2A.js → telemetry-KGE6FF3Y.js} +4 -4
  152. package/dist/{tools-IH4M7AAG.js → tools-4R33AZQ3.js} +11 -11
  153. package/dist/{traffic-VFLXWB3Z.js → traffic-SVMOKCSS.js} +7 -11
  154. package/dist/{trends-ZXJIX3Z3.js → trends-RGAKGX3L.js} +4 -4
  155. package/dist/{users-J2BYEWOE.js → users-47WKA2TO.js} +3 -3
  156. package/dist/{visibility-stats-AJ7NY2BP.js → visibility-stats-DTGQJPNV.js} +9 -5
  157. package/dist/{wordpress-U6MS35VE.js → wordpress-2CNUX4UE.js} +3 -3
  158. package/package.json +2 -2
  159. package/assets/assets/AgentSetupPage-h1kJhy9q.js +0 -18
  160. package/assets/assets/AuditHistoryPanel-CNUApNiJ.js +0 -1
  161. package/assets/assets/BacklinksPage-CpKmlAek.js +0 -1
  162. package/assets/assets/ChartPrimitives-CvK6CQrj.js +0 -1
  163. package/assets/assets/Hint-c4a4W87X.js +0 -1
  164. package/assets/assets/InfoTooltip-Drnst4ML.js +0 -1
  165. package/assets/assets/MeasurementPropertyPage-CcHnYn81.js +0 -4
  166. package/assets/assets/ProjectPage-Tmuqmust.js +0 -11
  167. package/assets/assets/RunsPage-BD4k3MjX.js +0 -1
  168. package/assets/assets/SettingsPage-BHy30JP5.js +0 -1
  169. package/assets/assets/SiteHealthSection-SYdtuGjq.js +0 -2
  170. package/assets/assets/ToneBadge-Cii5KNtg.js +0 -60
  171. package/assets/assets/TrafficPage-DuxtRqnc.js +0 -40
  172. package/assets/assets/TrafficSourceDetailPage-DiX1bB02.js +0 -1
  173. package/assets/assets/format-helpers-V8Pyc7cR.js +0 -3
  174. package/assets/assets/index-BAxHW-1G.css +0 -1
  175. package/assets/assets/index-BTz-B9hV.js +0 -60
  176. package/assets/assets/query-client-C1ycmW1c.js +0 -1
  177. package/assets/assets/react-query-DI7VfOND.js +0 -1
  178. package/assets/assets/service-DSgXWhNq.js +0 -1
  179. package/assets/assets/vendor-lucide-DuOM7wVi.js +0 -1
  180. package/dist/intelligence-service-TKK7O3Z5.js +0 -16
  181. package/dist/overview-GSJ4GP2T.js +0 -213
  182. package/dist/settings-VRTDPFR3.js +0 -119
@@ -1,27 +1,28 @@
1
1
  ---
2
2
  name: site-health
3
- description: Diagnose Site Health scores, page findings, crawl coverage, internal links, and scan changes while preserving run provenance and incomplete-data limits.
3
+ description: Diagnose Agent Readiness scores, page findings, crawl coverage, internal links, and scan changes while preserving run provenance and incomplete-data limits.
4
4
  ---
5
5
 
6
- # Site Health diagnosis
6
+ # Agent Readiness diagnosis
7
7
 
8
- Site Health is the product label for the `technical-aeo` audit and crawl
9
- surface. It measures technical readiness. Mention coverage and citation
10
- coverage come from answer-engine measurements; neither is derived from an
11
- audit score, link score, or graph position.
8
+ Agent Readiness is the product name for the site scan, page scores, and link
9
+ map (CLI `agent-readiness`, MCP `canonry_agent_readiness_*`). It measures how
10
+ ready a site's pages are for AI agents and answer engines. Mention coverage and
11
+ citation coverage come from answer-engine measurements; neither is derived from
12
+ an audit score, link score, or graph position.
12
13
 
13
14
  ## Start with stored evidence
14
15
 
15
- Read `canonry_site_health_overview` for the selected or latest crawl's root,
16
+ Read `canonry_agent_readiness_overview` for the selected or latest crawl's root,
16
17
  run identity, completeness, counts, budgets, versions, termination, and
17
- dead-link check state. Pair it with `canonry_technical_aeo_score` for the
18
+ dead-link check state. Pair it with `canonry_agent_readiness_score` for the
18
19
  aggregate score, factor distributions, issues, and prioritized fixes. Pin
19
20
  the score and subsequent reads to the returned run when available. Overview
20
21
  is crawl metadata, not the scorecard. Older scorecard-only audits can lack
21
22
  a graph; report the available scores and missing crawl evidence separately.
22
23
 
23
- Use `canonry_technical_aeo_pages` for low-scoring or failed pages and
24
- `canonry_site_health_page_audit` for one page's exact factor scores, finding
24
+ Use `canonry_agent_readiness_page_scores` for low-scoring or failed pages and
25
+ `canonry_agent_readiness_page_audit` for one page's exact factor scores, finding
25
26
  codes/messages, recommendations, and critical defects. Prefer a returned
26
27
  `nodeKey`; use the exact URL when no node key is available. The chat does not
27
28
  receive the selected graph node, so resolve the requested page or ask for it.
@@ -30,17 +31,17 @@ receive the selected graph node, so resolve the requested page or ask for it.
30
31
 
31
32
  | Question | Read |
32
33
  |---|---|
33
- | Which technical issues need investigation, including on passing pages? | `canonry_site_health_issues` for grouped findings, counts, example URLs and coverage |
34
- | Which pages have a selected issue? | `canonry_site_health_issue_pages`; pin the list's run and follow the affected-page cursor |
35
- | Which URLs were discovered and audited? | `canonry_technical_aeo_crawl_pages`; filter audit/fetch/indexability state and follow its cursor |
36
- | How is the site organized? | `canonry_technical_aeo_structure` for one path level |
37
- | What links to/from this page? | `canonry_technical_aeo_link_neighbors`; inbound and outbound truncation are independent |
38
- | What is around this page? | `canonry_site_health_subgraph`; refocus or expand only as needed |
39
- | Can the root reach this page? | `canonry_site_health_path` for a directed followable path |
40
- | Which editorial or template links exist? | `canonry_technical_aeo_internal_links` with supported filters |
41
- | What changed between scans? | `canonry_site_health_changes` for compatible complete snapshots |
42
- | Were broken links checked? | `canonry_technical_aeo_dead_links` |
43
- | How have scores moved? | `canonry_technical_aeo_trend`, then inspect the relevant runs and coverage |
34
+ | Which issues need investigation, including on passing pages? | `canonry_agent_readiness_issues` for grouped findings, counts, example URLs and coverage |
35
+ | Which pages have a selected issue? | `canonry_agent_readiness_issue_pages`; pin the list's run and follow the affected-page cursor |
36
+ | Which URLs were discovered and audited? | `canonry_agent_readiness_pages`; filter audit/fetch/indexability state and follow its cursor |
37
+ | How is the site organized? | `canonry_agent_readiness_structure` for one path level |
38
+ | What links to/from this page? | `canonry_agent_readiness_link_neighbors`; inbound and outbound truncation are independent |
39
+ | What is around this page? | `canonry_agent_readiness_subgraph`; refocus or expand only as needed |
40
+ | Can the root reach this page? | `canonry_agent_readiness_path` for a directed followable path |
41
+ | Which editorial or template links exist? | `canonry_agent_readiness_links` with supported filters |
42
+ | What changed between scans? | `canonry_agent_readiness_changes` for compatible complete snapshots |
43
+ | Were broken links checked? | `canonry_agent_readiness_dead_links` |
44
+ | How have scores moved? | `canonry_agent_readiness_trend`, then inspect the relevant runs and coverage |
44
45
 
45
46
  Use semantic reads rather than requesting the full interactive graph or
46
47
  inferring importance from visualization coordinates. Defaults for subgraphs
@@ -102,14 +103,24 @@ multiple Properties; avoid counting the same finding as independent proof
102
103
  for each one.
103
104
 
104
105
  Rank persisted critical defects and fixes using severity and affected-page
105
- evidence, with business or link importance where available. State the run,
106
+ evidence, with business or link importance where available.
107
+
108
+ On an Advanced project, the critical defect `names-another-entity` marks a
109
+ page that belongs to one Property whose FAQ, title or H1 names another of the
110
+ plan's Properties, usually text copied between Property pages. The page audit
111
+ read carries up to 25 `evidence` entries: the place (`faq-question`,
112
+ `faq-answer`, `title`, `h1`), the FAQ question, the named Property's key and
113
+ name, and a short snippet. Quote those rather than the issue title, and name
114
+ the Property the page belongs to. The check uses the plan revision in the
115
+ scan's `effectiveOptions.entityPlanRevision`; a null revision means the scan
116
+ did not check names, not that no page names another Property. State the run,
106
117
  scope, finding, affected page(s), and supported next step. A technical issue
107
118
  can be a hypothesis for an AI-visibility gap, but the crawl alone cannot prove
108
119
  why an answer engine omitted a Property. Join the corresponding answer
109
120
  evidence before making that connection.
110
121
 
111
122
  Read existing data first. If absent or stale, propose an explicitly bounded
112
- `canonry_technical_aeo_run` when a new audit is needed. Existing authorization
123
+ `canonry_agent_readiness_run` when a new scan is needed. Existing authorization
113
124
  for that run remains valid; a diagnostic question alone does not authorize
114
125
  a crawl. Dead-link checks remain off unless requested. After an approved
115
126
  run, follow its returned ID with `canonry_run_get`, then inspect that run's
@@ -8,8 +8,8 @@ description: Aero's persona, values, and voice — context-agnostic identity tha
8
8
  You are **Aero** — an AEO analyst. You help operators understand whether AI answer engines NAME their brand (mention) and, secondarily, whether they CITE their domain, and you act decisively on what the data shows. Mention is the primary gauge; citation is the secondary signal. The two are independent — never compute one from the other.
9
9
 
10
10
  For multi-property portfolios, keep each Property's identity and measurement
11
- scope intact. For Site Health, explain the stored audit findings and crawl
12
- limits first. A technical score does not measure AI visibility, and a crawl
11
+ scope intact. For Agent Readiness, explain the stored audit findings and crawl
12
+ limits first. An Agent Readiness score does not measure AI visibility, and a crawl
13
13
  finding alone does not prove why an answer engine omitted a brand.
14
14
 
15
15
  ## Values
@@ -52,6 +52,22 @@ guide plus links to host-native references. It does not replace runtime help.
52
52
  compute one signal from the other.
53
53
  - `answerMentioned: null` means not checked, not false. Missing runs and empty
54
54
  populations mean no measurement, not zero visibility.
55
+ - `citationState: not-measured` (with `cited: null`) means the engine returns no
56
+ sources, such as a local model without web access, so whether it cites the
57
+ domain was never observed. It is never a miss: cited rates leave it out and
58
+ count it as `citationNotMeasured`, and a cited rate with nothing measured is
59
+ null, not 0. Mention is still measured on those answers. Other reads show the
60
+ same state in their own shape:
61
+ - visibility report: an answer's `citationUnavailableReason:
62
+ citation-not-measured`, or a rate's `reason: citation-not-measured`;
63
+ - Advanced metrics: `{state: unavailable, reason: citation_not_measured}`;
64
+ - research and snapshot answers: `citationMeasured: false` (research also
65
+ sends `citationState: null`);
66
+ - overview: `citationNotMeasuredQueries`, `citationNotMeasuredPairs` and
67
+ `citationNotMeasuredCount`;
68
+ - analytics: the gaps bucket `citationNotMeasured[]` and sources'
69
+ `citationNotMeasuredAnswers`;
70
+ - visibility compare: `excludedNotMeasured`.
55
71
  - Preserve project, time window, provider, requested/served model, location,
56
72
  sample size, and query class when comparing evidence. Use server-returned
57
73
  metrics; do not invent a score from incompatible populations.
@@ -66,11 +82,21 @@ guide plus links to host-native references. It does not replace runtime help.
66
82
  **Status:** read the stored overview and freshness first. Say when evidence is
67
83
  missing instead of silently creating it.
68
84
 
69
- **Setup:** Page Health needs no answer-engine provider; AI Visibility does.
70
- After a Page Health result on an install with no provider (a `NO_PROVIDER`
85
+ **Setup:** Agent Readiness needs no answer-engine provider; AI Visibility does.
86
+ After an Agent Readiness result on an install with no provider (a `NO_PROVIDER`
71
87
  notice, or doctor's `providers.none-configured`), propose AI Visibility setup
72
88
  as the next step. The operator adds the provider key in the dashboard or in
73
- their own terminal; never ask for it in chat.
89
+ their own terminal; never ask for it in chat. A saved key is not a verified one:
90
+ with approval, `canonry settings provider test <name>` or `canonry_provider_test`
91
+ checks the saved connection with the provider now (usually one tiny prompt on
92
+ the operator's account) and reports `connected`, `failed` with the provider's
93
+ reason, or `not-verified`. It needs install administrator authority and
94
+ `settings.write`; while a connection's test is still running, another test of it
95
+ returns `OPERATION_IN_PROGRESS`, so wait for that result. The latest result is
96
+ kept as the connection's `lastTest` (`canonry settings provider-info <name>` or
97
+ `canonry_provider_settings_get`) until its key, endpoint, model, Vertex project,
98
+ region or credentials, or CDP endpoint changes, or the connection is
99
+ disconnected; read it before testing again.
74
100
  Rerunning `canonry bootstrap` after a provider change reloads saved provider
75
101
  settings on a matching running local server and reports whether they became
76
102
  active. If the server is offline, start it to apply the saved settings. For an
@@ -84,8 +110,8 @@ Ports and database settings still need a restart.
84
110
  changed separately from why it might have changed. A hypothesis is not a
85
111
  measured cause. Propose bounded verification if stored evidence is insufficient.
86
112
 
87
- **Site Health:** read `canonry_site_health_issues` for stored technical findings,
88
- affected-page counts and example URLs, then `canonry_site_health_issue_pages`
113
+ **Agent Readiness:** read `canonry_agent_readiness_issues` for stored findings,
114
+ affected-page counts and example URLs, then `canonry_agent_readiness_issue_pages`
89
115
  for a selected issue's remaining pages. Pin subsequent reads to the returned
90
116
  run. Inspect coverage and omissions: a passing score can still have findings,
91
117
  an older scan may lack cross-page evidence, and a partial scan cannot establish
@@ -145,8 +171,12 @@ authority without exposing its token. Missing `operator` means unapproved.
145
171
  machine. Telemetry reports configured preference, effective state, and any
146
172
  environment override; inspecting status never creates an anonymous identifier.
147
173
  After approval, `canonry_telemetry_update` changes that preference and
148
- `canonry_provider_settings_update` changes an already-configured provider's
149
- model/quota. Both require `settings.write`; neither accepts credentials.
174
+ `canonry_provider_settings_update` changes or resets an already-configured
175
+ provider's model and quota, restores its built-in endpoint, or removes an
176
+ optional Local key. Both require `settings.write`; neither accepts credentials.
177
+ A reset, restoring the endpoint and removing the Local key included, also
178
+ requires install administrator authority. Pass the `revision` from
179
+ `canonry_provider_settings_get` as `expectedRevision` to reject a stale edit.
150
180
  Server telemetry reads and updates additionally require operator authority.
151
181
  Ordinary audit-history reads omit internal telemetry events and their state.
152
182
 
@@ -37,21 +37,24 @@ A "cited" query means the client's domain appeared in an AI provider's grounding
37
37
 
38
38
  A "not-cited" query means the AI answered without grounding on the client's domain.
39
39
 
40
+ A "not-measured" citation means the engine returns no sources at all (a local model with no web access), so whether it would cite the client was never observed. It is never a miss and is left out of every cited rate; report it as not measured, and read that answer's mention as usual.
41
+
40
42
  ## Reading Evidence Output
41
43
 
42
- `cnry evidence` renders a two-glyph cell per (query × provider): `[C/c][M/m]` — uppercase = present, lowercase = absent, `–` = no snapshot. **C/c = cited** (secondary), **M/m = mentioned** (primary). Always print the legend before the table; never collapse the two signals into one cell. Lead your interpretation with the mention glyph.
44
+ `cnry citations visibility <project>` renders a two-glyph cell per (query × engine): citation first, mention second. Uppercase = present, lowercase = absent, `·` = citation not measured (the engine returns no sources), `–` = no snapshot. **C/c = cited** (secondary), **M/m = mentioned** (primary). The legend prints above the table; keep it when you quote the table, and never collapse the two signals into one cell. Lead your interpretation with the mention glyph.
43
45
 
44
46
  ```
45
- Legend: [C/c][M/m] C=cited c=not-cited M=mentioned m=not-mentioned –=no snapshot
46
-
47
- [C][M] AEO Agency NYC ← mentioned AND cited: branded/direct match, fully visible
48
- [c][M] best plumber brooklyn ← mentioned but NOT cited: named in the answer, domain not in sources (mention win, citation gap)
49
- [C][m] ai seo tools ← cited but NOT mentioned: domain grounded, brand never named (citation without share of voice)
50
- [c][m] how to fix a leaky faucet ← neither: informational gap, no page for this topic
51
- [c][m] emergency plumber near me ← neither: competitive gap, others mentioned/cited instead
47
+ (cell = [citation][mention]; C=cited c=not ·=not measured, M=mentioned m=not, –=no data)
48
+ Query gemini local openai Cite Ment
49
+ AEO Agency NYC CM ·M CM 2/2 3/3 ← mentioned AND cited: branded/direct match, fully visible
50
+ best plumber brooklyn cM ·M cM 0/2 3/3 ← mentioned but NOT cited: named in the answer, domain not in sources (mention win, citation gap)
51
+ ai seo tools Cm ·m cm 1/2 0/3 ← cited but NOT mentioned: domain grounded, brand never named (citation without share of voice)
52
+ how to fix a leaky faucet cm ·m cm 0/2 0/3 ← neither: informational gap, no page for this topic
52
53
  ```
53
54
 
54
- The summary line reports each signal independently: `Mentioned: X / Y` (primary) and `Cited: X / Y` (secondary) — a query can be one, both, or neither.
55
+ `Cite` counts the engines that cited the query out of those whose sources were checked (`·` when none were); `Ment` counts the engines that mentioned it. Above the table, `Cited in sources: X/Y engines` and `Mentioned in answers: X/Y engines` report each signal independently — a query can be one, both, or neither.
56
+
57
+ `cnry evidence <project>` is the per-query citation history instead: one line per query with its latest citation (`✓ cited`, `✗ not-cited` or `· not measured (no sources)`, plus a transition such as `(lost)`), then `Cited: X / Y` over the queries whose latest answers carried sources and `Not measured: N`. It prints no mention line; read mention from its `--format json` (each run's `mentionState` and `mentionTransition`) or from `cnry citations visibility`.
55
58
 
56
59
  ### Query Categories
57
60
 
@@ -78,7 +81,7 @@ The summary line reports each signal independently: `Mentioned: X / Y` (primary)
78
81
  **Query normalization:** When new queries are added to a project mid-history, canonry automatically normalizes each time bucket to only include queries that existed before that bucket started. This prevents newly-added (typically not-yet-mentioned/uncited) queries from creating a false drop in the rate trend. The chart displays dashed vertical annotation lines at points where queries were added (e.g. "+3 q"), and each bucket's tooltip shows the query count ("q") used for that bucket's calculation.
79
82
 
80
83
  ### Gap Analysis (`--feature gaps`)
81
- `GapAnalysisDto` returns mention buckets — `mentionedQueries[]`, `mentionGap[]` (a competitor is mentioned but you're not), `notMentioned[]` (nobody named) — alongside the cited buckets (`cited[]`, `gap[]`, `uncited[]`). Read the mention buckets first. Priorities:
84
+ `GapAnalysisDto` returns mention buckets — `mentionedQueries[]`, `mentionGap[]` (a competitor is mentioned but you're not), `notMentioned[]` (nobody named) — alongside the cited buckets (`cited[]`, `gap[]`, `uncited[]`, and `citationNotMeasured[]` for queries whose engines return no sources, which are in none of the other three). Read the mention buckets first. Priorities:
82
85
  - **`mentionGap[]` queries** are highest priority — competitors are taking mention share (AI share-of-voice) you're not winning
83
86
  - **`notMentioned[]` queries** may need content or may be too broad
84
87
  - The cited `gap[]` / `uncited[]` buckets are the secondary lens on the same queries
@@ -135,7 +138,7 @@ For competitive queries, if others are mentioned/cited and the client isn't (che
135
138
  - Do they have stronger schema/structured data?
136
139
  - Are they more established in the index?
137
140
 
138
- Run `cnry evidence <project> --format json`. Use `citedDomains` and grounding-source hosts for citation evidence; use answer text with Canonry's shared matcher for mention evidence. `competitorOverlap` is a legacy mixed field and must not be treated as either metric by itself.
141
+ Take a `runId` from `cnry evidence <project> --format json` (it lists each query's runs and their citation states) and run `cnry run show <run-id> --format json`. Its snapshots carry the evidence: use `citedDomains` and `citedUrls` for citation evidence, and the answer text with Canonry's shared matcher for mention evidence. `competitorOverlap` is a legacy mixed field and must not be treated as either metric by itself.
139
142
 
140
143
  ### Step 4: Check across providers
141
144
  Gemini, OpenAI, Claude, and Perplexity may behave differently. One citing a domain while another doesn't is normal — each has its own knowledge base and update schedule.