@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.
- package/README.md +18 -16
- package/assets/agent-workspace/AGENTS.md +13 -6
- package/assets/agent-workspace/skills/aero/SKILL.md +45 -26
- package/assets/agent-workspace/skills/aero/references/agent-operations.md +47 -12
- package/assets/agent-workspace/skills/aero/references/memory-patterns.md +1 -1
- package/assets/agent-workspace/skills/aero/references/orchestration.md +9 -9
- package/assets/agent-workspace/skills/aero/references/reporting.md +8 -4
- package/assets/agent-workspace/skills/aero/references/seo-analysis.md +2 -2
- package/assets/agent-workspace/skills/aero/references/site-health.md +34 -23
- package/assets/agent-workspace/skills/aero/soul.md +2 -2
- package/assets/agent-workspace/skills/canonry/SKILL.md +37 -7
- package/assets/agent-workspace/skills/canonry/references/aeo-analysis.md +14 -11
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +122 -53
- package/assets/assets/AccessControls-DzO5Y8v9.js +2 -0
- package/assets/assets/AgentSetupPage-DWWovaCw.js +36 -0
- package/assets/assets/AuditHistoryPanel-BG-n1i8c.js +1 -0
- package/assets/assets/BacklinksPage-D6wdOMXt.js +1 -0
- package/assets/assets/ChartPrimitives-CtKdkn64.js +3 -0
- package/assets/assets/Hint-3TTi0MgX.js +1 -0
- package/assets/assets/{HistoryPage-DeN79d3c.js → HistoryPage-B_ReWHbL.js} +1 -1
- package/assets/assets/InfoTooltip-D29JcNMW.js +1 -0
- package/assets/assets/MeasurementPropertyPage-zdyLL-kl.js +4 -0
- package/assets/assets/ProjectPage-KZNKXR4w.js +15 -0
- package/assets/assets/RunsPage-DxN0xXQh.js +1 -0
- package/assets/assets/ServerTrafficSection-CvISj5pf.js +40 -0
- package/assets/assets/SettingsPage-CpRpBlMV.js +1 -0
- package/assets/assets/ToneBadge-DcwPruHr.js +60 -0
- package/assets/assets/TrafficPage-zk6zMZyz.js +1 -0
- package/assets/assets/TrafficSourceDetailPage-DJtsI06Z.js +1 -0
- package/assets/assets/{account-context-CdEHcI5S.js → account-context-CoJVqEXZ.js} +1 -1
- package/assets/assets/{agent-trust-copy-N6WacCSg.js → agent-trust-copy-BIXDMtBm.js} +1 -1
- package/assets/assets/{card-B1O0SunG.js → card-Dwmc7Srx.js} +1 -1
- package/assets/assets/index-fh1T5JQY.css +1 -0
- package/assets/assets/index-mqc2mWUR.js +42 -0
- package/assets/assets/query-client-Tg1fZu4i.js +1 -0
- package/assets/assets/react-query-BqcEEfEO.js +1 -0
- package/assets/assets/{react-sigma_core.esm.min-f4uuOgrw.js → react-sigma_core.esm.min-D1q0DR_j.js} +3 -3
- package/assets/assets/{server-traffic-CkSCFMnL.js → server-traffic-Djnh_9f0.js} +1 -1
- package/assets/assets/service-BQjBdN4O.js +1 -0
- package/assets/assets/use-tooltip-position-BOzm-6Wy.js +1 -0
- package/assets/assets/vendor-lucide-iE5MEh2-.js +1 -0
- package/assets/assets/{vendor-markdown-BDQ1GKGP.js → vendor-markdown-BBGbNklj.js} +1 -1
- package/assets/assets/{vendor-radix-BGYlvS2l.js → vendor-radix-DKCt5Z_h.js} +1 -1
- package/assets/assets/{vendor-recharts-DhEHcK3G.js → vendor-recharts-D3MLFU3q.js} +1 -1
- package/assets/assets/{vendor-tanstack-BNuZ37rE.js → vendor-tanstack-B90HW50P.js} +2 -2
- package/assets/index.html +16 -15
- package/dist/{ads-PQ4OP6OH.js → ads-FVPZ6R6Z.js} +3 -3
- package/dist/{agent-B6ZPL2HH.js → agent-2LPU2E5I.js} +7 -7
- package/dist/{agent-ask-ZUKNXRAX.js → agent-ask-5ODREK6D.js} +3 -3
- package/dist/{agent-conversations-DJ7WU7PL.js → agent-conversations-SNLOOJEM.js} +3 -3
- package/dist/{agent-journeys-LGUI3SQG.js → agent-journeys-XDXVL6PK.js} +3 -3
- package/dist/{agent-memory-PWZJ7G5Q.js → agent-memory-NKAI2S3U.js} +3 -3
- package/dist/{agent-providers-TEERDNJT.js → agent-providers-R5L7A72X.js} +3 -3
- package/dist/{agent-transcript-KDPOPK5Z.js → agent-transcript-C5WAGYVC.js} +3 -3
- package/dist/{analytics-NFW5RQRT.js → analytics-EJVOLIQL.js} +33 -13
- package/dist/{apply-EP4V4UF5.js → apply-I6JOM247.js} +3 -3
- package/dist/{backfill-6UTNNVFO.js → backfill-UVUR36IB.js} +10 -10
- package/dist/{backlinks-SG5GV5X5.js → backlinks-3VMVACWN.js} +3 -3
- package/dist/{bing-Q4W24JNC.js → bing-R5RL3PW2.js} +3 -3
- package/dist/{bootstrap-WEMERVNZ.js → bootstrap-GMMSDTNO.js} +12 -12
- package/dist/{cdp-3XKBJGHO.js → cdp-FJKUXHEY.js} +7 -7
- package/dist/{chunk-KK3Z34AN.js → chunk-2DV7F6XA.js} +91 -2
- package/dist/{chunk-MTW37GXF.js → chunk-2FWYWGIR.js} +2 -2
- package/dist/{chunk-Q5SNOMRB.js → chunk-56VVRWJM.js} +14 -5
- package/dist/{chunk-52M2JWCB.js → chunk-7BEGCVVB.js} +1 -1
- package/dist/{chunk-WZSDGC45.js → chunk-7BH53MOB.js} +27 -2
- package/dist/{chunk-IX5AC3QB.js → chunk-7J2RIIYU.js} +1450 -1067
- package/dist/{chunk-UXXZXXNG.js → chunk-7SNMIXEQ.js} +2 -2
- package/dist/{chunk-2XCYEBQV.js → chunk-AMGM55CP.js} +2 -2
- package/dist/{chunk-MSI4BGFN.js → chunk-AYKTVQF7.js} +13 -5
- package/dist/{chunk-3JWY65XO.js → chunk-BKDRT4VS.js} +7 -7
- package/dist/{chunk-FQ3L2TIX.js → chunk-COHSL6KW.js} +1 -1
- package/dist/{chunk-X3UXMHWC.js → chunk-DGDLLRS4.js} +1 -1
- package/dist/{chunk-YJITDEZR.js → chunk-DHIB7EIA.js} +4 -4
- package/dist/{chunk-BLW327AU.js → chunk-EE3QTCLS.js} +18 -6
- package/dist/{chunk-3GMBHGQ5.js → chunk-F46TBLXK.js} +204 -94
- package/dist/{chunk-RTH5JVC3.js → chunk-FBO25TA3.js} +1 -1
- package/dist/{chunk-2Q7JEC6N.js → chunk-FZ3MUTU3.js} +2 -2
- package/dist/{chunk-64R66MWZ.js → chunk-G6QN4VFS.js} +16 -10
- package/dist/{chunk-ISIJ2NS4.js → chunk-HBHLYWKE.js} +9 -6
- package/dist/{chunk-EJZ444VV.js → chunk-HL2LGRTI.js} +8 -6
- package/dist/chunk-J6536OL6.js +31 -0
- package/dist/{chunk-RLKI2QF7.js → chunk-KVRX7YIH.js} +20 -10
- package/dist/{chunk-3BA75QYU.js → chunk-LJO2BKWU.js} +1 -1
- package/dist/{chunk-CN6MVUY3.js → chunk-LNVFERI4.js} +1 -1
- package/dist/{chunk-ZADRESLB.js → chunk-NQYJHKML.js} +39 -7
- package/dist/{chunk-IAGC2MGP.js → chunk-O5UFAXUI.js} +646 -588
- package/dist/{chunk-RGFIRJ7F.js → chunk-O6APBEJE.js} +2 -2
- package/dist/{chunk-ZBTUISPG.js → chunk-O7S7OHLE.js} +9399 -8388
- package/dist/{chunk-ER5ZHAB2.js → chunk-QS5DWJDI.js} +2 -2
- package/dist/{chunk-QSL3FXE4.js → chunk-RBG2QXQM.js} +4 -4
- package/dist/{chunk-SAKH2RRF.js → chunk-SWZXHHAG.js} +16 -8
- package/dist/{chunk-VMGZBH5L.js → chunk-T7UDY7W3.js} +26 -11
- package/dist/{chunk-OL2L5ANJ.js → chunk-UGO2FO6V.js} +119 -55
- package/dist/{chunk-J6MYB3F4.js → chunk-VHULVUDL.js} +1 -1
- package/dist/{chunk-O22WSFWL.js → chunk-YGAQQSCL.js} +56339 -54966
- package/dist/{chunk-TNOYUE2L.js → chunk-YIIRS7V7.js} +98 -65
- package/dist/{chunk-64KB6YTG.js → chunk-YU2WX7RD.js} +3 -3
- package/dist/{citations-5OSQ3ZYU.js → citations-LOEQRDUB.js} +21 -10
- package/dist/{cli-catalog-T5OAVKGS.js → cli-catalog-5RXNUFBS.js} +3 -3
- package/dist/{cli-commands-VATCVJKW.js → cli-commands-HE2BQY3Y.js} +7 -7
- package/dist/cli.js +22 -17
- package/dist/{competitor-YIKTMTHY.js → competitor-PIX2BHJW.js} +3 -3
- package/dist/{content-DS2LKR7J.js → content-PJGW4WZF.js} +3 -3
- package/dist/{dashboard-HLVRRRI4.js → dashboard-7OKBD4MG.js} +6 -6
- package/dist/{demo-A5DTVJGK.js → demo-SCOFAWFM.js} +1 -1
- package/dist/{demo-server-P2JGAI6C.js → demo-server-SJPI6RSL.js} +38 -36
- package/dist/{discover-VNZDO2MU.js → discover-I3WL2QUN.js} +10 -8
- package/dist/{discover-eval-ON77LUEN.js → discover-eval-YRECOIP5.js} +3 -3
- package/dist/{doctor-7TNNTI7H.js → doctor-F4J6LILX.js} +3 -3
- package/dist/{evidence-E54CNGXS.js → evidence-MYQTCY4V.js} +25 -10
- package/dist/{export-cmd-XXZ6KLQQ.js → export-cmd-3SUFOJM6.js} +3 -3
- package/dist/{ga-ZQB4EJI3.js → ga-VA6FYK4L.js} +3 -3
- package/dist/{gbp-ZQL6NQEK.js → gbp-DI6ZVFHL.js} +3 -3
- package/dist/{google-7EIHQGSV.js → google-UVKWJCD2.js} +4 -4
- package/dist/{google-marketing-RSAO4PG7.js → google-marketing-S63HN733.js} +1 -1
- package/dist/{health-cmd-R7WPKGWX.js → health-cmd-DOZXGI46.js} +16 -9
- package/dist/{history-2CSWSVCY.js → history-UTJTUDYK.js} +3 -3
- package/dist/index.d.ts +204 -12
- package/dist/index.js +26 -26
- package/dist/{init-FXZRMXZ3.js → init-IVJSS33J.js} +19 -19
- package/dist/{insights-EJUL3W6D.js → insights-UHCVCZ76.js} +3 -3
- package/dist/intelligence-service-3EENJ5DS.js +16 -0
- package/dist/{journeys-YUMBANFH.js → journeys-XIT7WDM2.js} +3 -3
- package/dist/{keys-KLOTGT4H.js → keys-MQKW4JUI.js} +3 -3
- package/dist/{keyword-5NSJFEOI.js → keyword-EASMKYZ3.js} +3 -3
- package/dist/{logs-WW3RLCRG.js → logs-ZHZ6XM55.js} +3 -3
- package/dist/{mcp-NTBEIEVX.js → mcp-ECVT2YGU.js} +4 -4
- package/dist/mcp.js +10 -10
- package/dist/{measurement-plan-BLPAZEXS.js → measurement-plan-7FQKUOMR.js} +5 -5
- package/dist/{notify-KAGE6UEN.js → notify-TC7ARC6W.js} +3 -3
- package/dist/{organic-evidence-HTYRXRML.js → organic-evidence-M34MWJXE.js} +7 -4
- package/dist/overview-P6BRMXJN.js +314 -0
- package/dist/{project-NYUWICVC.js → project-WZ2YXFPJ.js} +4 -4
- package/dist/project-setup-WV6SPGIV.js +176 -0
- package/dist/{query-3CRRDOHD.js → query-WAFJKDHG.js} +3 -3
- package/dist/{research-ZULVD3TW.js → research-B5ZPQX7R.js} +3 -3
- package/dist/{results-export-STM7SQ4J.js → results-export-NIZV6R3K.js} +3 -3
- package/dist/{run-S4MFU4MK.js → run-ICLPZ7QT.js} +7 -4
- package/dist/{schedule-6W3Q2FUL.js → schedule-4C44LQ7R.js} +22 -3
- package/dist/{search-EKXXN7C4.js → search-UJM7KII3.js} +11 -4
- package/dist/{serve-TFBFPFAQ.js → serve-A6UIO6WP.js} +30 -29
- package/dist/{session-4B5V3AH6.js → session-RTE22GQT.js} +14 -14
- package/dist/settings-BOF5Z7ML.js +211 -0
- package/dist/{sitemaps-R7XFCH6E.js → sitemaps-BM7S76H2.js} +4 -4
- package/dist/{skills-44XYCTVD.js → skills-X5SR4HRO.js} +2 -2
- package/dist/{snapshot-ROAOJI4W.js → snapshot-KLKE37VY.js} +4 -4
- package/dist/{src-ZJRIKEDB.js → src-EKLG5A6O.js} +4 -2
- package/dist/{status-EN3A2TX5.js → status-OYG57DWU.js} +6 -5
- package/dist/{technical-aeo-ZV466F65.js → technical-aeo-KWVWOOTI.js} +23 -23
- package/dist/{telemetry-EZHPNZ2A.js → telemetry-KGE6FF3Y.js} +4 -4
- package/dist/{tools-IH4M7AAG.js → tools-4R33AZQ3.js} +11 -11
- package/dist/{traffic-VFLXWB3Z.js → traffic-SVMOKCSS.js} +7 -11
- package/dist/{trends-ZXJIX3Z3.js → trends-RGAKGX3L.js} +4 -4
- package/dist/{users-J2BYEWOE.js → users-47WKA2TO.js} +3 -3
- package/dist/{visibility-stats-AJ7NY2BP.js → visibility-stats-DTGQJPNV.js} +9 -5
- package/dist/{wordpress-U6MS35VE.js → wordpress-2CNUX4UE.js} +3 -3
- package/package.json +2 -2
- package/assets/assets/AgentSetupPage-h1kJhy9q.js +0 -18
- package/assets/assets/AuditHistoryPanel-CNUApNiJ.js +0 -1
- package/assets/assets/BacklinksPage-CpKmlAek.js +0 -1
- package/assets/assets/ChartPrimitives-CvK6CQrj.js +0 -1
- package/assets/assets/Hint-c4a4W87X.js +0 -1
- package/assets/assets/InfoTooltip-Drnst4ML.js +0 -1
- package/assets/assets/MeasurementPropertyPage-CcHnYn81.js +0 -4
- package/assets/assets/ProjectPage-Tmuqmust.js +0 -11
- package/assets/assets/RunsPage-BD4k3MjX.js +0 -1
- package/assets/assets/SettingsPage-BHy30JP5.js +0 -1
- package/assets/assets/SiteHealthSection-SYdtuGjq.js +0 -2
- package/assets/assets/ToneBadge-Cii5KNtg.js +0 -60
- package/assets/assets/TrafficPage-DuxtRqnc.js +0 -40
- package/assets/assets/TrafficSourceDetailPage-DiX1bB02.js +0 -1
- package/assets/assets/format-helpers-V8Pyc7cR.js +0 -3
- package/assets/assets/index-BAxHW-1G.css +0 -1
- package/assets/assets/index-BTz-B9hV.js +0 -60
- package/assets/assets/query-client-C1ycmW1c.js +0 -1
- package/assets/assets/react-query-DI7VfOND.js +0 -1
- package/assets/assets/service-DSgXWhNq.js +0 -1
- package/assets/assets/vendor-lucide-DuOM7wVi.js +0 -1
- package/dist/intelligence-service-TKK7O3Z5.js +0 -16
- package/dist/overview-GSJ4GP2T.js +0 -213
- 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
|
-
|
|
51
|
+
<a id="site-health"></a>
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
### Agent Readiness
|
|
54
54
|
|
|
55
|
-
|
|
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
|
|
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
|
|
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
|
|
177
|
-
5. Propose a bounded
|
|
178
|
-
6. When the run is `completed` or `partial`, read `cnry
|
|
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
|
|
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
|
|
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
|
|
224
|
-
cnry
|
|
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
|
|
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
|
-
|
|
|
298
|
-
|
|
|
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>` |
|
|
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
|
-
###
|
|
34
|
+
### Agent Readiness
|
|
36
35
|
|
|
37
36
|
```bash
|
|
38
|
-
#
|
|
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
|
|
65
|
-
4. If structural issues suspected,
|
|
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
|
|
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
|
|
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
|
-
|
|
21
|
-
proposing
|
|
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`
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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: `
|
|
63
|
-
|
|
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
|
-
- **
|
|
84
|
-
crawl coverage, internal links, or page findings.
|
|
85
|
-
separate signal from measured mentions and citations. Use the latest
|
|
86
|
-
|
|
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
|
|
89
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
209
|
-
- Don't run sweeps, probes, syncs,
|
|
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
|
|
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.
|
|
12
|
-
>
|
|
13
|
-
>
|
|
14
|
-
>
|
|
15
|
-
>
|
|
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:**
|
|
79
|
-
After
|
|
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
|
-
**
|
|
97
|
-
affected-page counts and example URLs, then `
|
|
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
|
|
158
|
-
model
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|