@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
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  <p align="center">
15
15
  <strong>The agent-first AEO operating platform.</strong><br/>
16
- Track mentions and citations across ChatGPT, Claude, Gemini, Meta Muse, and more. Join them with Search Console, GA4, ads, AI crawler traffic, site audits, and SEO data. Then let your agent create content, publish fixes, manage ChatGPT ads, get pages indexed, and measure what changed.<br/>
16
+ Track mentions and citations across ChatGPT, Claude, Gemini, Meta Muse, and more. Join them with Search Console, GA4, ads, AI crawler traffic, Agent Readiness site audits, and SEO data. Then let your agent create content, publish fixes, manage ChatGPT ads, get pages indexed, and measure what changed.<br/>
17
17
  <sub>Open source · Self-hosted · Bring your own keys</sub>
18
18
  </p>
19
19
 
@@ -48,11 +48,13 @@ See what AI agents actually do on your site, from your server logs: which pages
48
48
 
49
49
  <a href="skills/canonry/references/server-side-traffic.md"><picture><source media="(max-width: 600px)" srcset="https://raw.githubusercontent.com/Canonry/canonry/main/docs/images/readme/traffic-mobile.png" /><img src="https://raw.githubusercontent.com/Canonry/canonry/main/docs/images/readme/traffic.png" alt="Server traffic for the last 24 hours: 105 AI crawler visits, 35 AI user fetches, and 46 AI referral sessions, with an hourly chart, with sample data" width="100%" /></picture></a>
50
50
 
51
- ### Site Health
51
+ <a id="site-health"></a>
52
52
 
53
- Crawl your site, score each page for AI readiness, and map the internal links between pages. Each finding lists the pages it affects. [Docs →](skills/canonry/references/canonry-cli.md#site-health-technical-aeo-compatibility)
53
+ ### Agent Readiness
54
54
 
55
- <a href="skills/canonry/references/canonry-cli.md#site-health-technical-aeo-compatibility"><picture><source media="(max-width: 600px)" srcset="https://raw.githubusercontent.com/Canonry/canonry/main/docs/images/readme/site-health-mobile.png" /><img src="https://raw.githubusercontent.com/Canonry/canonry/main/docs/images/readme/site-health.png" alt="Site map of 205 crawled pages and the links between them, beside a list of site sections, with sample data" width="100%" /></picture></a>
55
+ A site audit for AI agents. Crawl your site and score how well agents and answer engines can reach, read, and cite each page: AI crawler access, `llms.txt`, structured data, extractable content, and more. Each finding lists the pages it affects, and a map shows the internal links between pages. [Docs →](skills/canonry/references/canonry-cli.md#agent-readiness) · [Audit engine →](https://github.com/Canonry/agent-readiness)
56
+
57
+ <a href="skills/canonry/references/canonry-cli.md#agent-readiness"><picture><source media="(max-width: 600px)" srcset="https://raw.githubusercontent.com/Canonry/canonry/main/docs/images/readme/site-health-mobile.png" /><img src="https://raw.githubusercontent.com/Canonry/canonry/main/docs/images/readme/site-health.png" alt="Site map of 205 crawled pages and the links between them, beside a list of site sections, with sample data" width="100%" /></picture></a>
56
58
 
57
59
  <a id="seo-data"></a>
58
60
 
@@ -86,7 +88,7 @@ Let your agent run ChatGPT Ads: sync campaigns and daily results, create and edi
86
88
 
87
89
  **An example job for your connected agent:**
88
90
 
89
- > Find where competitors get cited and we don't. Use search data and the site audit to prepare a pull request or WordPress draft for review. After it ships, rerun checks and report what changed.
91
+ > Find where competitors get cited and we don't. Use search data and the Agent Readiness audit scan to prepare a pull request or WordPress draft for review. After it ships, rerun checks and report what changed.
90
92
 
91
93
  ## How it works
92
94
 
@@ -171,11 +173,11 @@ Use the official Canonry docs:
171
173
  Pick one path and stay on it. Use connected Canonry tools (plugin or MCP) only if you have them and I have not pointed you at a specific install. A connected tool runs in its own process and never sees `CANONRY_CONFIG_DIR`, `CANONRY_PORT`, or anything else you export in a shell, so it always acts on my default install. If I named a config directory, a port, or a sandbox, that is the shell path: use `cnry` and tell me which path you chose. Never mix the two in one run, and never create a duplicate project. The `cnry` and `canonry` commands are interchangeable.
172
174
 
173
175
  1. Ask for my public domain, country, and language. Do not create or scan anything yet. Country and language are only applied when a project is created, so if you reuse an existing project, report its country and language instead of changing them.
174
- 2. Shell path only: confirm `cnry` is on PATH, then run `cnry --version`. If Canonry is missing, propose `npm install -g @canonry/canonry` and wait for approval. Then run `cnry doctor --format json`, which is the command that says whether config, database, and server are in place. `cnry --version` does not read config and succeeds on a completely unconfigured install, so it cannot answer this. If config is missing, run `cnry bootstrap` yourself: it is not interactive, takes about a second, and is safe to rerun. Do not hand it to me and wait. The interactive command is `cnry init`, which is optional provider and OAuth setup that Page Health does not need. Bootstrap prints an API key, so do not repeat its output back to me, and never ask me to paste passwords, API keys, OAuth credentials, or command output.
176
+ 2. Shell path only: confirm `cnry` is on PATH, then run `cnry --version`. If Canonry is missing, propose `npm install -g @canonry/canonry` and wait for approval. Then run `cnry doctor --format json`, which is the command that says whether config, database, and server are in place. `cnry --version` does not read config and succeeds on a completely unconfigured install, so it cannot answer this. If config is missing, run `cnry bootstrap` yourself: it is not interactive, takes about a second, and is safe to rerun. Do not hand it to me and wait. The interactive command is `cnry init`, which is optional provider and OAuth setup that Agent Readiness does not need. Bootstrap prints an API key, so do not repeat its output back to me, and never ask me to paste passwords, API keys, OAuth credentials, or command output.
175
177
  3. Confirm the API is reachable. `cnry doctor --format json` reports it, and any project read exits non-zero with `CONNECTION_ERROR` when it is not. If it is unreachable, propose `cnry start` and wait for approval. Use `cnry start`, which is the background daemon, and not `cnry serve`, which runs in the foreground and will block you until I stop it, even though some error messages suggest it. Stop anything you started with `cnry stop`.
176
- 4. List projects with the connected project tool or `cnry project list --format json`, and reuse one whose domain matches. Confirm the proposed name is not already assigned to a different domain. To find out whether a project has already been scanned, run `cnry technical-aeo score <project> --format json` with no `--run-id`, which reports the latest run. Read the `hasData` field, not the score: this command exits 0 and reports `aggregateScore: 0` for a project that has never been scanned, so reading the score alone would have you tell me my site scored zero. If `hasData` is true and `runStatus` is `completed` or `partial`, read that scan instead of starting a new one. If no project matches, show the exact create operation and wait for approval.
177
- 5. Propose a bounded Site Health scan: `--max-pages 100` for a first look, plus whether dead-link checking is on (it is off unless you pass `--check-dead-links`). Show the connected operation or the exact `cnry technical-aeo run <project> --max-pages 100 --wait --format json` command with the project name filled in, and wait for separate approval before scanning. `--wait` polls for up to 15 minutes and returns only the run id and status. If the status it returns is still `queued` or `running`, the scan has not finished: do not rerun it or report results, poll `cnry technical-aeo progress <project> --run-id <run-id> --format json` until it is terminal. If `--wait` outruns your own tool timeout first, recover the run id with `cnry technical-aeo score <project> --format json` and poll the same way.
178
- 6. When the run is `completed` or `partial`, read `cnry technical-aeo crawl <project> --run-id <run-id> --format json` first. It is the only one of these commands that carries `termination` and `complete`; the score and pages commands do not. Then read `cnry technical-aeo score <project> --run-id <run-id> --format json` and `cnry technical-aeo pages <project> --run-id <run-id> --sort score-asc --limit 10 --format jsonl`. Tell me the termination reason in plain words and whether the scan covered the whole site or stopped at a page, link, depth, or time limit. A `partial` run scored the pages it reached and not my site, so never present it as a full-site result. If it stopped early, the fix depends on the reason, so say which: a page or depth limit needs a larger budget, a time limit needs a smaller scan (a lower `--max-pages` or `--max-depth`). If the run failed or was cancelled, inspect the run error and stop.
178
+ 4. List projects with the connected project tool or `cnry project list --format json`, and reuse one whose domain matches. Confirm the proposed name is not already assigned to a different domain. To find out whether a project has already been scanned, run `cnry agent-readiness score <project> --format json` with no `--run-id`, which reports the latest run. Read the `hasData` field, not the score: this command exits 0 and reports `aggregateScore: 0` for a project that has never been scanned, so reading the score alone would have you tell me my site scored zero. If `hasData` is true and `runStatus` is `completed` or `partial`, read that scan instead of starting a new one. If no project matches, show the exact create operation and wait for approval.
179
+ 5. Propose a bounded Agent Readiness audit scan: `--max-pages 100` for a first look, plus whether dead-link checking is on (it is off unless you pass `--check-dead-links`). Show the connected operation or the exact `cnry agent-readiness run <project> --max-pages 100 --wait --format json` command with the project name filled in, and wait for separate approval before scanning. `--wait` polls for up to 15 minutes and returns only the run id and status. If the status it returns is still `queued` or `running`, the scan has not finished: do not rerun it or report results, poll `cnry agent-readiness progress <project> --run-id <run-id> --format json` until it is terminal. If `--wait` outruns your own tool timeout first, recover the run id with `cnry runs <project> --kind site-audit --limit 1 --format json`, which returns the newest scan whatever its status, and poll the same way.
180
+ 6. When the run is `completed` or `partial`, read `cnry agent-readiness overview <project> --run-id <run-id> --format json` first. It is the only one of these commands that carries `termination` and `complete`; the score and page-scores commands do not. Then read `cnry agent-readiness score <project> --run-id <run-id> --format json` and `cnry agent-readiness page-scores <project> --run-id <run-id> --sort score-asc --limit 10 --format jsonl`. Tell me the termination reason in plain words and whether the scan covered the whole site or stopped at a page, link, depth, or time limit. A `partial` run scored the pages it reached and not my site, so never present it as a full-site result. If it stopped early, the fix depends on the reason, so say which: a page or depth limit needs a larger budget, a time limit needs a smaller scan (a lower `--max-pages` or `--max-depth`). If the run failed or was cancelled, inspect the run error and stop.
179
181
  7. Summarize only completed evidence, then propose AI Visibility setup. Ask before you add queries, connect providers, start a provider-backed or quota-consuming run, edit files, or publish.
180
182
  ```
181
183
 
@@ -205,7 +207,7 @@ cnry bootstrap
205
207
  cnry serve
206
208
  ```
207
209
 
208
- Then open [http://127.0.0.1:4100/setup](http://127.0.0.1:4100/setup) and follow the setup to scan your site. The crawl saves a Page Health baseline. AI Visibility is optional and has a separate setup.
210
+ Then open [http://127.0.0.1:4100/setup](http://127.0.0.1:4100/setup) and follow the setup to scan your site. The crawl saves an Agent Readiness baseline. AI Visibility is optional and has a separate setup.
209
211
 
210
212
  <details>
211
213
  <summary>Scan and read results from the terminal</summary>
@@ -214,17 +216,17 @@ Keep `cnry serve` active. In a second terminal, create a project and start a bou
214
216
 
215
217
  ```bash
216
218
  cnry project create my-site --domain example.com --country US --language en
217
- cnry technical-aeo run my-site --max-pages 100 --wait --format json
219
+ cnry agent-readiness run my-site --max-pages 100 --wait --format json
218
220
  ```
219
221
 
220
222
  Read the run ID and status from the output. If the status is `completed` or `partial`, read evidence from that run:
221
223
 
222
224
  ```bash
223
- cnry technical-aeo score my-site --run-id <run-id> --format json
224
- cnry technical-aeo pages my-site --run-id <run-id> --sort score-asc --limit 10 --format jsonl
225
+ cnry agent-readiness score my-site --run-id <run-id> --format json
226
+ cnry agent-readiness page-scores my-site --run-id <run-id> --sort score-asc --limit 10 --format jsonl
225
227
  ```
226
228
 
227
- `--wait` polls for up to 15 minutes. If the scan remains active, use `cnry technical-aeo progress <project> --run-id <id> --format json`.
229
+ `--wait` polls for up to 15 minutes. If the scan remains active, use `cnry agent-readiness progress <project> --run-id <id> --format json`.
228
230
  If the scan fails or is cancelled, read the error with `cnry run show <run-id> --format json`.
229
231
 
230
232
  </details>
@@ -294,8 +296,8 @@ For a configured portfolio destination, select one `--market <key>` or `--proper
294
296
 
295
297
  | Problem | Next step |
296
298
  |---|---|
297
- | Site scan is still active | Read exact counters with `cnry technical-aeo progress <project> --run-id <id> --format json`. |
298
- | Site scan failed | Read the error with `cnry run show <run-id> --format json`. Read the last phase and counters with the progress command. |
299
+ | Agent Readiness audit scan is still active | Read exact counters with `cnry agent-readiness progress <project> --run-id <id> --format json`. |
300
+ | Agent Readiness audit scan failed | Read the error with `cnry run show <run-id> --format json`. Read the last phase and counters with the progress command. |
299
301
  | No visibility results | Inspect existing work with `cnry runs <project> --format json`, then `cnry run show <run-id> --format json`. This does not start another paid run. |
300
302
  | `npm install` fails on `node-gyp` | Install build tools for `better-sqlite3` ([guide](https://github.com/WiseLibs/better-sqlite3/blob/master/docs/troubleshooting.md)). |
301
303
 
@@ -26,16 +26,22 @@ If the server isn't running, start it with `canonry serve`.
26
26
  | `canonry run <project>` | Trigger a visibility sweep across all configured providers |
27
27
  | `canonry run <project> --provider gemini` | Single-provider sweep |
28
28
  | `canonry status <project>` | Current project status and latest run summary |
29
- | `canonry evidence <project>` | Raw citation evidence from sweeps |
29
+ | `canonry evidence <project>` | Per-query citation evidence; its JSON carries each query's history across sweeps |
30
30
  | `canonry insights <project>` | AI-generated insights and findings |
31
31
  | `canonry health <project>` | Health snapshot with visibility scores |
32
- | `canonry timeline <project>` | Per-query citation history over time |
33
32
  | `canonry export <project>` | Full project data export |
34
33
 
35
- ### Auditing
34
+ ### Agent Readiness
36
35
 
37
36
  ```bash
38
- # Run an agent readiness audit on a URL
37
+ # Scan the project's site: a bounded first look, waiting for the result
38
+ canonry agent-readiness run <project> --max-pages 100 --wait --format json
39
+ # Read the latest scan: the summary first, then the score, issues and one page's evidence
40
+ canonry agent-readiness overview <project> --format json
41
+ canonry agent-readiness score <project> --format json
42
+ canonry agent-readiness issues <project> --format json
43
+ canonry agent-readiness page-audit <project> --url <url> --format json
44
+ # Check one page without a project, with the standalone audit
39
45
  npx @canonry/agent-readiness@8 <url> --format json
40
46
  ```
41
47
 
@@ -61,8 +67,8 @@ npx @canonry/agent-readiness@8 <url> --format json
61
67
 
62
68
  1. Identify affected queries from insights
63
69
  2. Pull evidence: `canonry evidence <project> --format json`
64
- 3. Check timeline for trends: `canonry timeline <project> --format json`
65
- 4. If structural issues suspected, run audit: `npx @canonry/agent-readiness@8 <url> --format json`
70
+ 3. Check each query's history across sweeps: the `runs` in that evidence
71
+ 4. If structural issues are suspected, read the latest Agent Readiness audit scan: `canonry agent-readiness overview <project> --format json`
66
72
  5. Compile findings with evidence and recommended actions
67
73
 
68
74
  ## Quota Awareness
@@ -79,6 +85,7 @@ Provider APIs have rate limits. Follow these guidelines:
79
85
  Reference skills are available in `skills/` for domain-specific guidance:
80
86
 
81
87
  - `skills/canonry/` -- Canonry operator playbook
88
+ - `skills/aero/` -- Aero analyst playbook
82
89
 
83
90
  ## Error Handling
84
91
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: aero
3
- description: "Diagnose AEO regressions and interpret Canonry AI visibility, SEO data, Advanced multi-property portfolios, and Site Health evidence. Use when prioritizing keyword or organic ranking opportunities, explaining mention or citation changes, comparing Properties or markets, diagnosing page findings, preparing reports, or analyzing a completed `cnry` sweep or site audit. Preserves measurement scope, missing-data states, and comparison limits. Use the canonry skill for setup and operations."
3
+ description: "Diagnose AEO regressions and interpret Canonry AI visibility, SEO data, Advanced multi-property portfolios, and Agent Readiness evidence. Use when prioritizing keyword or organic ranking opportunities, explaining mention or citation changes, comparing Properties or markets, diagnosing page findings, preparing reports, or analyzing a completed `cnry` sweep or Agent Readiness audit scan. Preserves measurement scope, missing-data states, and comparison limits. Use the canonry skill for setup and operations."
4
4
  metadata:
5
5
  homepage: https://canonry.ai
6
6
  repository: https://github.com/AINYC/aero
@@ -8,7 +8,7 @@ metadata:
8
8
 
9
9
  # Aero Orchestration Skill
10
10
 
11
- Use Canonry's stored evidence to explain AI visibility, SEO opportunities, and site readiness. In
11
+ Use Canonry's stored evidence to explain AI visibility, SEO opportunities, and Agent Readiness. In
12
12
  built-in Aero, use `aero_list_toolkits` and `aero_load_toolkit` to load relevant
13
13
  tools, then call the available `canonry_*` tools directly. Project-scoped
14
14
  tools use the session's project; they do not accept a different project from
@@ -17,8 +17,8 @@ json`. CLI examples in the references are for hosts with a shell; built-in
17
17
  Aero should use the corresponding exposed tool, not invent shell access.
18
18
 
19
19
  Canonry is the source of truth for runs, measurement plans, Property evidence,
20
- Site Health audits, integrations, and history. Read stored page audits before
21
- proposing fresh `agent-readiness` work. New crawls and provider work require approval
20
+ Agent Readiness audit scans, integrations, and history. Read stored page audits before
21
+ proposing a new Agent Readiness audit scan. New crawls and provider work require approval
22
22
  covering that work; an existing explicit authorization remains valid.
23
23
 
24
24
  ## Choose the evidence scope
@@ -30,12 +30,27 @@ covering that work; an existing explicit authorization remains valid.
30
30
  Priorities are recommendations, not computed scores or traffic forecasts.
31
31
  Aero cannot edit SEO profiles or start paid SEO refreshes.
32
32
  - **Establish the portfolio type before answering; never infer it.**
33
- `canonry_project_overview` returns no plan, Target, or Property data, so its
34
- silence is not evidence of a Simple project. When the system prompt carries
35
- a "Project shape:" line, it already states the type and plan revision; do
36
- not call `canonry_measurement_plan_get` to confirm it. Without that line,
37
- call `canonry_measurement_plan_get` before stating that a project has no
38
- Properties, no Advanced plan, or cannot break out per-Property performance.
33
+ `canonry_project_overview` states it in `mentionCoverage.selection.mode`
34
+ and `whatChanged.mode`: `advanced` when the project has a published
35
+ Advanced plan, `simple` otherwise. It carries no plan revision, structure
36
+ or Target data; its only Property data is the Properties and markets behind
37
+ each lost query in `whatChanged`. An older server returns neither field,
38
+ and that silence is not evidence of a Simple project. When the system
39
+ prompt carries a "Project shape:" line, it already states the type and plan
40
+ revision; do not call `canonry_measurement_plan_get` to confirm it. Without
41
+ that line, call `canonry_measurement_plan_get` before stating that a
42
+ project has no Properties, no Advanced plan, or cannot break out
43
+ per-Property performance.
44
+ - **What changed in the latest check (both types):** quote the overview's
45
+ `whatChanged`, the counts the dashboard's What changed card shows, rather
46
+ than recounting answers. `lostMentions` and `lostCitations` each count the
47
+ queries that lost that signal (`queryCount`; `queries` lists at most 25,
48
+ with `truncated: true` when there are more) and stay separate. Read
49
+ `comparison` first. When its `state` is `unavailable`, nothing was
50
+ compared, so a 0 is unknown, not stable: say why from its `reason`.
51
+ `not-measured` there means the project has no completed check yet; it says
52
+ nothing about any answer's citation. `no-previous-check` means the latest
53
+ check is the first.
39
54
  The plan is structure only, with no metrics, and can be very large: never
40
55
  analyze, list, or rank Properties from it. For "which Property is
41
56
  best/worst", use `canonry_measurement_portfolio_summary`, then
@@ -59,8 +74,11 @@ covering that work; an existing explicit authorization remains valid.
59
74
  `queryClass` and `runId: latest`. Report its selected answer count and
60
75
  population. These conditioned reads provide counts, not competitive share
61
76
  of voice. Per-Property named-instead lists sample weak Properties.
62
- - What changed: `canonry_measurement_changes` once per class, with its
63
- `distribution` and `withinNoise`.
77
+ - What changed: the overview's `whatChanged` for the latest check, as the
78
+ dashboard card shows it (each lost query with its Properties and
79
+ markets). For movement per Property, `canonry_measurement_changes` once
80
+ per class, with its `distribution` and `withinNoise`; the noise rule
81
+ below applies before calling a Property's movement a loss.
64
82
  - Which metros have the biggest gaps: the compact portfolio summary's
65
83
  `weakestMarkets`, ranked from actual full metro aggregates with its own
66
84
  `population` and `queryClass`. Quote each row's mention and citation rates
@@ -80,13 +98,13 @@ covering that work; an existing explicit authorization remains valid.
80
98
  Rows tied at the weakest rate are listed by name, not rank: give
81
99
  `tiedAtWeakest.count` and call the rows examples. Compact reads omit
82
100
  `.byMetro`; request raw detail only when those tie counts are needed.
83
- - **Site Health:** read `references/site-health.md` before diagnosing scores,
84
- crawl coverage, internal links, or page findings. Technical readiness is a
85
- separate signal from measured mentions and citations. Use the latest audit
86
- run selected by the tool. `runSelection` explains same-date ambiguity and
101
+ - **Agent Readiness:** read `references/site-health.md` before diagnosing scores,
102
+ crawl coverage, internal links, or page findings. Agent Readiness is a
103
+ separate signal from measured mentions and citations. Use the latest scan
104
+ selected by the tool. `runSelection` explains same-date ambiguity and
87
105
  prefers complete scans, then the largest page sample, on the latest date.
88
- For a dated question, pass `date: YYYY-MM-DD` to the crawl or crawl-pages
89
- read. An empty read for an assumed year does not prove a historical scan is
106
+ For a dated question, pass `date: YYYY-MM-DD` to
107
+ `canonry_agent_readiness_overview` or `canonry_agent_readiness_pages`. An empty read for an assumed year does not prove a historical scan is
90
108
  missing. When the user omitted the year, use
91
109
  `availableScanDates.matchingMonthDayDates` from the dated no-data result to
92
110
  resolve it, then request the exact returned `YYYY-MM-DD`. If several years
@@ -144,14 +162,14 @@ covering that work; an existing explicit authorization remains valid.
144
162
  reasons; do not average Property percentages or sum overlapping markets.
145
163
  - When a native turn supplies current-view context, use `aero_inspect_view`
146
164
  first for view-relative claims. It resolves the selected Property, market,
147
- class, dates, run, or Site Health page against stored evidence. Context is
165
+ class, dates, run, or Agent Readiness page against stored evidence. Context is
148
166
  a selection, not permission. Explicit user scope takes precedence; without
149
167
  context, resolve names/URLs or ask which Property/page before scoped claims.
150
168
  - Link the returned evidence beside findings. State measurement time separately
151
169
  from retrieval time, each class's numerator/denominator, missing-data reasons,
152
170
  and comparison limits. Keep observations separate from hypotheses and propose
153
171
  a concrete check for each hypothesis. Never turn an unavailable comparison
154
- into a trend or infer a cause from a technical score alone.
172
+ into a trend or infer a cause from an Agent Readiness score alone.
155
173
  - Read `references/agent-operations.md` for shared vocabulary, evidence,
156
174
  comparison, and authority rules. Its MCP onboarding instructions apply to
157
175
  external hosts; built-in Aero loads its authorized toolkits and has skill-doc
@@ -159,7 +177,7 @@ covering that work; an existing explicit authorization remains valid.
159
177
 
160
178
  Persist only *user-scoped* context (operator preferences, communication style) in your platform's native memory. Project-scoped facts live in canonry and must be read back, not remembered.
161
179
 
162
- **Two signals, not one.** Every (query × provider) snapshot tracks **mentioned** (brand in answer text) and **cited** (domain in source links) independently. Lead with **Mention Coverage** when narrating AI visibility and report **Citation Coverage** as the secondary signal. Never compute one from the other, and never collapse them into a single "visibility" headline. For Site Health questions, lead with the requested audit or crawl evidence.
180
+ **Two signals, not one.** Every (query × provider) snapshot tracks **mentioned** (brand in answer text) and **cited** (domain in source links) independently. Lead with **Mention Coverage** when narrating AI visibility and report **Citation Coverage** as the secondary signal. Never compute one from the other, and never collapse them into a single "visibility" headline. For Agent Readiness questions, lead with the requested audit or crawl evidence.
163
181
 
164
182
  When a project has GA4 connected, traffic is a first-class signal alongside
165
183
  mentions and citations. Use `cnry ga traffic` and `cnry ga attribution --trend`
@@ -200,16 +218,17 @@ Mention is the primary gauge (see "Two signals, not one" above); citation is the
200
218
  1. **Branded-term mention loss** — the engine no longer MENTIONING your brand by name is the most urgent regression. Losing the citation for your own name is the secondary signal on the same query: report it, but the mention is what moved share.
201
219
  2. **Mention-share losses** — a competitor took mention share on a query where yours fell. Rank by share swing first, then by any lost citation on the same query.
202
220
  3. **Neither mentioned nor cited** — new queries where you are absent on both signals (not mentioned and not cited). Mention gap leads; the missing citation is the trailing clause.
203
- 4. **Indexing issues**, only when indexing or Site Health evidence read in this turn shows them. Pages not indexed can't be cited, and a weak/unindexed page also starves the engine of reasons to mention you; it feeds both signals.
221
+ 4. **Indexing issues**, only when indexing or Agent Readiness evidence read in this turn shows them. Pages not indexed can't be cited, and a weak/unindexed page also starves the engine of reasons to mention you; it feeds both signals.
204
222
  5. **Content optimization**, only when page or answer evidence read in this turn points to it. Improve mention rate first (give the answer a reason to name you), then cited rate on partially-covered queries.
205
223
 
206
224
  ### What NOT to Do
207
225
  - Don't promise fixes will appear in the next sweep (AEO changes take weeks/months)
208
- - Ground AI visibility recommendations in mention and citation evidence. Ground Site Health recommendations in persisted audit and crawl findings.
209
- - Don't run sweeps, probes, syncs, audits, discovery sessions, or any other write or quota-consuming operation without explicit user approval
226
+ - Ground AI visibility recommendations in mention and citation evidence. Ground Agent Readiness recommendations in persisted audit and crawl findings.
227
+ - Don't run sweeps, probes, syncs, Agent Readiness audit scans, discovery sessions, or any other write or quota-consuming operation without explicit user approval
210
228
  - Don't edit client's code without showing diffs and getting approval
211
229
  - Don't conflate "not mentioned" with "page doesn't exist" — and don't conflate "not cited" with "not mentioned" either; check first. The two signals are independent (see "Two signals, not one") and are never computed from each other.
212
230
  - Don't coerce `answerMentioned` null → false. Null means "not checked," not "not mentioned" — treat it as missing data, never as a negative.
231
+ - Don't read `citationState: not-measured` as not cited. The engine returns no sources (a local model), so its citations were never observed; cited rates already leave it out. Never call it a citation gap or a lost citation. Other reads carry the same state in their own shape: `citationUnavailableReason: citation-not-measured` (visibility report), `{state: unavailable, reason: citation_not_measured}` (Advanced metrics), `citationMeasured: false` (research, snapshot), the `citationNotMeasured*` counts (overview, analytics), the gaps bucket `citationNotMeasured[]`, and `excludedNotMeasured` (compare). `references/agent-operations.md` lists them.
213
232
 
214
233
  ### When to use `--probe` runs
215
234
  When a verification would help, propose the exact probe and get explicit
@@ -232,7 +251,7 @@ A real (non-probe) sweep is appropriate when the user explicitly asks to refresh
232
251
 
233
252
  ### How to Communicate
234
253
  - Data first: show the numbers before the interpretation
235
- - For AI visibility, lead with the mention transition, then the citation change. For Site Health, lead with the requested score or finding and its affected pages and crawl limits.
254
+ - For AI visibility, lead with the mention transition, then the citation change. For Agent Readiness, lead with the requested score or finding and its affected pages and crawl limits.
236
255
  - Action-oriented: every observation ends with a recommended next step
237
256
  - Rest each recommended priority on a measured fact: the Property or metro
238
257
  and the answer counts behind it. A cause is a hypothesis: label it, and
@@ -259,7 +278,7 @@ Detailed playbooks live alongside this file. Read them on demand when the task m
259
278
  |---|---|
260
279
  | `references/seo-analysis.md` | Prioritizing keyword or organic ranking opportunities from saved SEO data |
261
280
  | `references/portfolio-analysis.md` | Interpreting Simple or Advanced portfolios, ranking Properties or markets, or comparing measurement runs |
262
- | `references/site-health.md` | Diagnosing site/page scores, crawl completeness, internal links, or changes between scans |
281
+ | `references/site-health.md` | Diagnosing Agent Readiness site/page scores, crawl completeness, internal links, or changes between scans |
263
282
  | `references/agent-operations.md` | Checking shared scope, evidence, comparison, or permission rules; generated from the canonical operations guide |
264
283
  | `references/orchestration.md` | Planning a multi-step or recurring workflow (baseline, weekly review, content-gap analysis) |
265
284
  | `references/regression-playbook.md` | A query lost a mention (primary) or a citation (secondary) and you need to triage and respond |
@@ -8,11 +8,16 @@ description: Shared Canonry vocabulary, evidence scope, comparison rules, and au
8
8
  > **Built-in Aero:** your available `canonry_*` tools are already loaded, and
9
9
  > you read this guide through `read_skill_doc` (slug `agent-operations`). Your
10
10
  > catalog does not include `canonry_help` or `canonry_load_toolkit`; the
11
- > connection and navigation steps below are for external MCP hosts. Your
12
- > project-scoped tools use the current session's project. Dashboard selections
13
- > are not passed to chat: resolve the requested Property, market, filters, or
14
- > page before making a scoped claim. The `portfolio-analysis` and `site-health`
15
- > skill docs cover those investigations for Simple and Advanced portfolios.
11
+ > connection and navigation steps below are for external MCP hosts. It also
12
+ > leaves out the provider connection actions the guide names
13
+ > (`canonry_provider_test`, `canonry_provider_settings_update` and
14
+ > `canonry_providers_reload`): they spend on or change the operator's
15
+ > install-wide provider accounts, so the operator runs them from the dashboard
16
+ > or CLI. Your project-scoped tools use the current session's project.
17
+ > Dashboard selections are not passed to chat: resolve the requested Property,
18
+ > market, filters, or page before making a scoped claim. The
19
+ > `portfolio-analysis` and `site-health` skill docs cover those investigations
20
+ > for Simple and Advanced portfolios.
16
21
 
17
22
  # Canonry Operations Guide v1
18
23
 
@@ -61,6 +66,22 @@ guide plus links to host-native references. It does not replace runtime help.
61
66
  compute one signal from the other.
62
67
  - `answerMentioned: null` means not checked, not false. Missing runs and empty
63
68
  populations mean no measurement, not zero visibility.
69
+ - `citationState: not-measured` (with `cited: null`) means the engine returns no
70
+ sources, such as a local model without web access, so whether it cites the
71
+ domain was never observed. It is never a miss: cited rates leave it out and
72
+ count it as `citationNotMeasured`, and a cited rate with nothing measured is
73
+ null, not 0. Mention is still measured on those answers. Other reads show the
74
+ same state in their own shape:
75
+ - visibility report: an answer's `citationUnavailableReason:
76
+ citation-not-measured`, or a rate's `reason: citation-not-measured`;
77
+ - Advanced metrics: `{state: unavailable, reason: citation_not_measured}`;
78
+ - research and snapshot answers: `citationMeasured: false` (research also
79
+ sends `citationState: null`);
80
+ - overview: `citationNotMeasuredQueries`, `citationNotMeasuredPairs` and
81
+ `citationNotMeasuredCount`;
82
+ - analytics: the gaps bucket `citationNotMeasured[]` and sources'
83
+ `citationNotMeasuredAnswers`;
84
+ - visibility compare: `excludedNotMeasured`.
64
85
  - Preserve project, time window, provider, requested/served model, location,
65
86
  sample size, and query class when comparing evidence. Use server-returned
66
87
  metrics; do not invent a score from incompatible populations.
@@ -75,11 +96,21 @@ guide plus links to host-native references. It does not replace runtime help.
75
96
  **Status:** read the stored overview and freshness first. Say when evidence is
76
97
  missing instead of silently creating it.
77
98
 
78
- **Setup:** Page Health needs no answer-engine provider; AI Visibility does.
79
- After a Page Health result on an install with no provider (a `NO_PROVIDER`
99
+ **Setup:** Agent Readiness needs no answer-engine provider; AI Visibility does.
100
+ After an Agent Readiness result on an install with no provider (a `NO_PROVIDER`
80
101
  notice, or doctor's `providers.none-configured`), propose AI Visibility setup
81
102
  as the next step. The operator adds the provider key in the dashboard or in
82
- their own terminal; never ask for it in chat.
103
+ their own terminal; never ask for it in chat. A saved key is not a verified one:
104
+ with approval, `canonry settings provider test <name>` or `canonry_provider_test`
105
+ checks the saved connection with the provider now (usually one tiny prompt on
106
+ the operator's account) and reports `connected`, `failed` with the provider's
107
+ reason, or `not-verified`. It needs install administrator authority and
108
+ `settings.write`; while a connection's test is still running, another test of it
109
+ returns `OPERATION_IN_PROGRESS`, so wait for that result. The latest result is
110
+ kept as the connection's `lastTest` (`canonry settings provider-info <name>` or
111
+ `canonry_provider_settings_get`) until its key, endpoint, model, Vertex project,
112
+ region or credentials, or CDP endpoint changes, or the connection is
113
+ disconnected; read it before testing again.
83
114
  Rerunning `canonry bootstrap` after a provider change reloads saved provider
84
115
  settings on a matching running local server and reports whether they became
85
116
  active. If the server is offline, start it to apply the saved settings. For an
@@ -93,8 +124,8 @@ Ports and database settings still need a restart.
93
124
  changed separately from why it might have changed. A hypothesis is not a
94
125
  measured cause. Propose bounded verification if stored evidence is insufficient.
95
126
 
96
- **Site Health:** read `canonry_site_health_issues` for stored technical findings,
97
- affected-page counts and example URLs, then `canonry_site_health_issue_pages`
127
+ **Agent Readiness:** read `canonry_agent_readiness_issues` for stored findings,
128
+ affected-page counts and example URLs, then `canonry_agent_readiness_issue_pages`
98
129
  for a selected issue's remaining pages. Pin subsequent reads to the returned
99
130
  run. Inspect coverage and omissions: a passing score can still have findings,
100
131
  an older scan may lack cross-page evidence, and a partial scan cannot establish
@@ -154,8 +185,12 @@ authority without exposing its token. Missing `operator` means unapproved.
154
185
  machine. Telemetry reports configured preference, effective state, and any
155
186
  environment override; inspecting status never creates an anonymous identifier.
156
187
  After approval, `canonry_telemetry_update` changes that preference and
157
- `canonry_provider_settings_update` changes an already-configured provider's
158
- model/quota. Both require `settings.write`; neither accepts credentials.
188
+ `canonry_provider_settings_update` changes or resets an already-configured
189
+ provider's model and quota, restores its built-in endpoint, or removes an
190
+ optional Local key. Both require `settings.write`; neither accepts credentials.
191
+ A reset, restoring the endpoint and removing the Local key included, also
192
+ requires install administrator authority. Pass the `revision` from
193
+ `canonry_provider_settings_get` as `expectedRevision` to reject a stale edit.
159
194
  Server telemetry reads and updates additionally require operator authority.
160
195
  Ordinary audit-history reads omit internal telemetry events and their state.
161
196
 
@@ -27,7 +27,7 @@ cnry health <project> --format json
27
27
  cnry timeline <project> --since <YYYY-MM-DD> --format json
28
28
  cnry insights <project> --format json
29
29
  cnry evidence <project> --format json
30
- cnry audit <project> --format json
30
+ cnry agent-readiness score <project> --format json
31
31
  ```
32
32
 
33
33
  If the data you need isn't reachable with a single read tool or CLI call, that's a bug in canonry's API surface — file it rather than working around it in memory.
@@ -7,20 +7,20 @@ description: Workflow recipes — baseline, regression response, weekly review,
7
7
 
8
8
  Use these recipes with the current measurement scope. For Advanced
9
9
  portfolios, read `portfolio-analysis.md` and use the Property/market tools
10
- instead of substituting project-level metrics. For crawl or audit work, read
10
+ instead of substituting project-level metrics. For Agent Readiness work, read
11
11
  `site-health.md`. Built-in Aero uses the corresponding exposed `canonry_*`
12
12
  tools; CLI examples below assume an external host with a shell.
13
13
 
14
- **Read the mention signal first in every workflow.** Compute and compare **mention rate + mention share** before cited rate. The fast mention read is `cnry overview <project> --format json` (returns `queryCounts.mentionRate`, `scores.mention`, `scores.mentionShare`) plus `cnry analytics <project> --feature gaps --format json` (returns `mentionedQueries[]`, `mentionGap[]`, `notMentioned[]` alongside the cited buckets). Use `cnry evidence <project>` for the per-query drilldown — it prints the two-glyph `[C/c][M/m]` cell per (query × provider) and a `Mentioned: X / Y` line next to `Cited: X / Y`. Mention and citation are independent — never derive one from the other. Treat `answerMentioned = null` as "not checked," never as not-mentioned.
14
+ **Read the mention signal first in every workflow.** Compute and compare **mention rate + mention share** before cited rate. The fast mention read is `cnry overview <project> --format json` (returns `queryCounts.mentionRate`, `scores.mention`, `scores.mentionShare`) plus `cnry analytics <project> --feature gaps --format json` (returns `mentionedQueries[]`, `mentionGap[]`, `notMentioned[]` alongside the cited buckets, plus `citationNotMeasured[]` for queries whose engines return no sources). Use `cnry citations visibility <project>` for the per-query drilldown — it prints a two-glyph `[C/c/·][M/m]` cell per (query × engine), where `·` means the engine returns no sources, so the citation was not measured (never a miss). `cnry evidence <project>` lists each query's latest citation (`✓ cited`, `✗ not-cited`, `· not measured`) and `Cited: X / Y` over the queries whose answers carried sources. Mention and citation are independent — never derive one from the other. Treat `answerMentioned = null` as "not checked," never as not-mentioned.
15
15
 
16
16
  ## Workflow 1: New Client Baseline
17
17
 
18
18
  Trigger: First sweep completes for a new project
19
19
 
20
20
  Steps:
21
- 1. `cnry overview <project> --format json` → mention read first: `queryCounts.mentionRate`, `scores.mention`, `scores.mentionShare`. Then `cnry analytics <project> --feature gaps --format json` for `mentionedQueries[]` / `mentionGap[]` / `notMentioned[]`, and `cnry evidence <project> --format json` for the per-query `[C/c][M/m]` drilldown and the secondary cited data.
21
+ 1. `cnry overview <project> --format json` → mention read first: `queryCounts.mentionRate`, `scores.mention`, `scores.mentionShare`. Then `cnry analytics <project> --feature gaps --format json` for `mentionedQueries[]` / `mentionGap[]` / `notMentioned[]`, and `cnry citations visibility <project> --format json` for the per-query × engine drilldown (each engine's `mentioned` and `citationState`, where `not-measured` is never a miss) and the secondary cited data.
22
22
  2. Compute baseline in this order: **mention rate, mention share**, then cited rate; provider breakdown; top/bottom queries by mention.
23
- 3. With explicit operator approval for the crawl and persisted run, `cnry technical-aeo run <project> --wait`, then `cnry technical-aeo score <project> --format json` for site readiness. Use `cnry site-health overview <project> --format json` only to add crawl metadata (root, completeness, budgets, and termination); it never replaces the score. The crawl discovers the in-scope URL inventory from the root, sitemaps, and internal links. Without `--max-pages` the scan uses the project's saved page budget (`cnry project update <project> --site-audit-max-pages <n|full>`), else the full site (up to 50,000 pages); the edge budget is unset by default and the crawl engine derives it from the page count, so `--max-edges` sets a ceiling rather than lifting one. Use `--max-pages`, `--max-edges`, or `--max-depth` to tighten them. `--wait` stops polling after 15 minutes while a larger scan keeps running; follow it with `cnry technical-aeo progress <project> --run-id <id>`. Dead-link checks remain off unless `--check-dead-links` is explicit. For architecture investigation, use bounded Site Health subgraph/path/changes reads rather than attempting to load the visualization graph. Treat `countAccuracy: "lower-bound"` subgraph counts as minimums, and qualify an incomplete path's unreachable/truncated result with `complete: false` plus `termination`; neither is a site-wide conclusion. Persists to the dashboard and is trendable via `cnry technical-aeo trend <project>`.
23
+ 3. With explicit operator approval for the crawl and persisted run, `cnry agent-readiness run <project> --wait`, then `cnry agent-readiness score <project> --format json` for the Agent Readiness score. Use `cnry agent-readiness overview <project> --format json` only to add crawl metadata (root, completeness, budgets, and termination); it never replaces the score. The crawl discovers the in-scope URL inventory from the root, sitemaps, and internal links. Without `--max-pages` the scan uses the project's saved page budget (`cnry project update <project> --site-audit-max-pages <n|full>`), else the full site (up to 50,000 pages); the edge budget is unset by default and the crawl engine derives it from the page count, so `--max-edges` sets a ceiling rather than lifting one. Use `--max-pages`, `--max-edges`, or `--max-depth` to tighten them. `--wait` stops polling after 15 minutes while a larger scan keeps running; follow it with `cnry agent-readiness progress <project> --run-id <id>`. Dead-link checks remain off unless `--check-dead-links` is explicit. For architecture investigation, use bounded Agent Readiness subgraph/path/changes reads rather than attempting to load the visualization graph. Treat `countAccuracy: "lower-bound"` subgraph counts as minimums, and qualify an incomplete path's unreachable/truncated result with `complete: false` plus `termination`; neither is a site-wide conclusion. Persists to the dashboard and is trendable via `cnry agent-readiness trend <project>`.
24
24
  4. Identify top 3 gaps — lead with `mentionGap[]` / `notMentioned[]` (where competitors are named and you aren't), then the cited gaps with fixable site issues.
25
25
  5. Generate onboarding report with baseline + action plan
26
26
  6. Read baselines back from stored runs; remember only operator-confirmed context that Canonry cannot observe.
@@ -30,11 +30,11 @@ Steps:
30
30
  Trigger: Comparison shows decline or webhook fires regression.detected
31
31
 
32
32
  Steps:
33
- 1. `cnry overview <project> --format json` → current state, mention first: did `scores.mention` / `scores.mentionShare` move? Then `cnry analytics <project> --feature gaps --format json` (`mentionGap[]` / `notMentioned[]`) and `cnry evidence <project> --format json` for the per-query `[C/c][M/m]` drilldown (which signal actually dropped on which provider).
33
+ 1. `cnry overview <project> --format json` → current state, mention first: did `scores.mention` / `scores.mentionShare` move? Its `whatChanged` already lists what the latest check lost: `lostMentions` first, then `lostCitations`, each query once with the engines and locations (and for Advanced the Properties and markets) that lost it. These are the dashboard's What changed counts, so start from them instead of recounting. Check `comparison` first: when it is `unavailable`, nothing was compared and a 0 is unknown. When `truncated` is true, `queries` lists only the first 25 of `queryCount`. Then `cnry analytics <project> --feature gaps --format json` (`mentionGap[]` / `notMentioned[]`) and `cnry citations visibility <project> --format json` for the per-query × engine drilldown (which signal actually dropped on which provider; a `not-measured` citation never dropped).
34
34
  2. `cnry history <project>` → trend for affected query
35
35
  3. Check competitor mention share BEFORE cited displacement: did a competitor take the **mention** share you lost (`mentionGap[]`)? Only then ask whether a competitor gained the **citation** you lost.
36
36
  4. Check indexing: `cnry google coverage <project>` → is the page still indexed? (a deindexed/thin page starves both signals)
37
- 5. Read the page's persisted audit with `canonry_site_health_page_audit`. Propose a bounded new audit only if the stored evidence cannot answer the question.
37
+ 5. Read the page's persisted audit with `canonry_agent_readiness_page_audit`. Propose a bounded new audit only if the stored evidence cannot answer the question.
38
38
  6. Diagnose cause: indexing issue / content issue / competitive displacement (mention-share loss first, citation loss second)
39
39
  7. Recommend fix with evidence — lead with what restores the mention
40
40
  8. If content fix: generate diff (schema, llms.txt, or content changes)
@@ -55,9 +55,9 @@ Then `cnry runs get <id>` to inspect the snapshot. The probe's snapshot won't di
55
55
  Trigger: Scheduled (weekly, or on-demand)
56
56
 
57
57
  Steps:
58
- 1. `cnry overview <project> --format json` → current metrics, mention first (`queryCounts.mentionRate`, `scores.mention`, `scores.mentionShare`); `cnry analytics <project> --feature gaps --format json` for the mention gaps; `cnry evidence <project> --format json` for the per-query `[C/c][M/m]` drilldown
58
+ 1. `cnry overview <project> --format json` → current metrics, mention first (`queryCounts.mentionRate`, `scores.mention`, `scores.mentionShare`); `cnry analytics <project> --feature gaps --format json` for the mention gaps; `cnry citations visibility <project> --format json` for the per-query × engine drilldown (`not-measured` citations stay out of gained/lost)
59
59
  2. Compare compatible stored periods/runs using the reporting or portfolio playbook — mention rate + mention share first, cited rate second
60
- 3. Compute deltas: mentions gained/lost/stable (primary), then citations gained/lost/stable (secondary)
60
+ 3. Compute deltas: mentions gained/lost/stable (primary), then citations gained/lost/stable (secondary). The latest check's losses are the overview's `whatChanged.lostMentions` and `lostCitations` (check `comparison` and `truncated`); compare stored runs only for gains and for sweeps before it.
61
61
  4. Flag any new regressions not yet addressed (lead with lost mentions)
62
62
  5. Check competitor movement — mention share swing first, then cited-domain displacement
63
63
  6. Generate summary with key changes + recommended next steps
@@ -67,7 +67,7 @@ Steps:
67
67
  Trigger: User asks "why aren't we mentioned/cited for X?" or multiple not-mentioned / uncited queries detected
68
68
 
69
69
  Steps:
70
- 1. `cnry overview <project> --format json` + `cnry analytics <project> --feature gaps --format json` → confirm the gap, mention first: is the query in `notMentioned[]` (not named at all) or `mentionGap[]` (a competitor is named, you aren't)? Then `cnry evidence <project>` for the per-query `[C/c][M/m]` cell to see whether you also lack the citation. Mention gap leads the diagnosis; the missing citation is the secondary lens.
70
+ 1. `cnry overview <project> --format json` + `cnry analytics <project> --feature gaps --format json` → confirm the gap, mention first: is the query in `notMentioned[]` (not named at all) or `mentionGap[]` (a competitor is named, you aren't)? Then `cnry citations visibility <project>` for the per-query `[C/c/·][M/m]` cell to see whether you also lack the citation (`·` means the engine returns no sources: not measured, not a gap). Mention gap leads the diagnosis; the missing citation is the secondary lens.
71
71
  2. Check if a relevant page exists on the domain
72
72
  3. If no page: recommend content creation (topic, target queries) — give the engine a reason to name you
73
73
  4. If page exists, inspect its persisted page audit and answer evidence. Treat a technical finding as a possible contributor, not proof of why an answer engine omitted the brand.
@@ -13,7 +13,7 @@ For a calendar-month comparison of a Property, group or market, call
13
13
  use `canonry_measurement_changes` for compatible stored-run comparisons of
14
14
  changed Properties. Do not substitute a project-wide month comparison for
15
15
  Property-scoped data.
16
- For Site Health reports, read `site-health.md` and keep crawl and audit
16
+ For Agent Readiness reports, read `site-health.md` and keep crawl and audit
17
17
  provenance separate from answer-visibility periods.
18
18
 
19
19
  For project-wide month-over-month AEO claims, use `canonry_visibility_compare`
@@ -56,6 +56,10 @@ Two consequences for any report:
56
56
 
57
57
  A sweep crippled by a provider outage captures fewer questions and looks identical to a collapse in visibility. Before narrating any drop, check whether the latest run is `partial` and what its capture count was against the project's basket size. Report a capture failure as a capture failure.
58
58
 
59
+ ## A cited rate can be not measured
60
+
61
+ An engine that returns no sources (a local model) has no cited rate: the API sends `null`, and `visibility-compare` counts those answers as `excludedNotMeasured`. Where a template below asks for a cited rate as `<X>%`, write "not measured" for that engine, never `0%`, and leave it out of cited deltas. Its mention rate is still measured and reported.
62
+
59
63
  ## Build summaries from stored evidence
60
64
 
61
65
  For keyword and organic ranking recommendations, read `seo-analysis.md`.
@@ -94,8 +98,8 @@ and requires explicit approval; preparing a summary does not authorize it.
94
98
  ## Summary
95
99
  - Mention rate: <X>% (Δ<+/-Y>% from last week) ← primary KPI
96
100
  - Mention share (non-brand): <X>% (Δ<+/-Y>% from last week) ← share-of-voice vs competitors; NEVER pooled with branded
97
- - Cited rate: <X>% (Δ<+/-Y>% from last week) ← secondary signal
98
- - Regressions: <N> new, <N> resolved (lead with lost mentions; note lost citations second)
101
+ - Cited rate: <X>% (Δ<+/-Y>% from last week) ← secondary signal; "not measured" when null, never 0%
102
+ - Regressions: <N> new, <N> resolved (lead with lost mentions; note lost citations second) ← latest check: the overview's whatChanged.lostMentions / lostCitations queryCount; comparison unavailable = not compared, never 0
99
103
  - Gains: <N> new mentions / <N> new citations
100
104
  - Providers monitored: <N>
101
105
 
@@ -143,7 +147,7 @@ and requires explicit approval; preparing a summary does not authorize it.
143
147
  ## Provider Breakdown
144
148
  | Provider | Mention Rate | Mention Trend | Cited Rate | Cited Trend |
145
149
  |----------|--------------|---------------|-----------|-------------|
146
- | <provider> | <X>% | ↑/↓/→ | <X>% | ↑/↓/→ |
150
+ | <provider> | <X>% | ↑/↓/→ | <X>% or not measured | ↑/↓/→ |
147
151
 
148
152
  ## Fixes Deployed
149
153
  | Date | Fix | Status | Impact |
@@ -121,8 +121,8 @@ Use this order of judgment:
121
121
  | Competitor with stronger domain estimates | Investigate the difference within comparable scope | Per-target evidence. Totals do not establish keyword gaps. |
122
122
  | Missing, stale, partial, or incompatible evidence | Validate the evidence first | The exact missing dataset, profile, or comparable refresh |
123
123
 
124
- Inspect stored page or Site Health evidence before prescribing title, content, indexability, or internal-link changes.
125
- Read `site-health` through `read_skill_doc` for its interpretation rules.
124
+ Inspect stored page or Agent Readiness evidence before prescribing title, content, indexability, or internal-link changes.
125
+ Read the Agent Readiness skill doc (slug `site-health`) through `read_skill_doc` for its interpretation rules.
126
126
  A rank alone cannot identify a technical or content cause.
127
127
  If supporting evidence is absent, recommend a specific inspection instead of asserting a defect.
128
128