@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
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: site-health
|
|
3
|
-
description: Diagnose
|
|
3
|
+
description: Diagnose Agent Readiness scores, page findings, crawl coverage, internal links, and scan changes while preserving run provenance and incomplete-data limits.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Agent Readiness diagnosis
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
Agent Readiness is the product name for the site scan, page scores, and link
|
|
9
|
+
map (CLI `agent-readiness`, MCP `canonry_agent_readiness_*`). It measures how
|
|
10
|
+
ready a site's pages are for AI agents and answer engines. Mention coverage and
|
|
11
|
+
citation coverage come from answer-engine measurements; neither is derived from
|
|
12
|
+
an audit score, link score, or graph position.
|
|
12
13
|
|
|
13
14
|
## Start with stored evidence
|
|
14
15
|
|
|
15
|
-
Read `
|
|
16
|
+
Read `canonry_agent_readiness_overview` for the selected or latest crawl's root,
|
|
16
17
|
run identity, completeness, counts, budgets, versions, termination, and
|
|
17
|
-
dead-link check state. Pair it with `
|
|
18
|
+
dead-link check state. Pair it with `canonry_agent_readiness_score` for the
|
|
18
19
|
aggregate score, factor distributions, issues, and prioritized fixes. Pin
|
|
19
20
|
the score and subsequent reads to the returned run when available. Overview
|
|
20
21
|
is crawl metadata, not the scorecard. Older scorecard-only audits can lack
|
|
21
22
|
a graph; report the available scores and missing crawl evidence separately.
|
|
22
23
|
|
|
23
|
-
Use `
|
|
24
|
-
`
|
|
24
|
+
Use `canonry_agent_readiness_page_scores` for low-scoring or failed pages and
|
|
25
|
+
`canonry_agent_readiness_page_audit` for one page's exact factor scores, finding
|
|
25
26
|
codes/messages, recommendations, and critical defects. Prefer a returned
|
|
26
27
|
`nodeKey`; use the exact URL when no node key is available. The chat does not
|
|
27
28
|
receive the selected graph node, so resolve the requested page or ask for it.
|
|
@@ -30,17 +31,17 @@ receive the selected graph node, so resolve the requested page or ask for it.
|
|
|
30
31
|
|
|
31
32
|
| Question | Read |
|
|
32
33
|
|---|---|
|
|
33
|
-
| Which
|
|
34
|
-
| Which pages have a selected issue? | `
|
|
35
|
-
| Which URLs were discovered and audited? | `
|
|
36
|
-
| How is the site organized? | `
|
|
37
|
-
| What links to/from this page? | `
|
|
38
|
-
| What is around this page? | `
|
|
39
|
-
| Can the root reach this page? | `
|
|
40
|
-
| Which editorial or template links exist? | `
|
|
41
|
-
| What changed between scans? | `
|
|
42
|
-
| Were broken links checked? | `
|
|
43
|
-
| How have scores moved? | `
|
|
34
|
+
| Which issues need investigation, including on passing pages? | `canonry_agent_readiness_issues` for grouped findings, counts, example URLs and coverage |
|
|
35
|
+
| Which pages have a selected issue? | `canonry_agent_readiness_issue_pages`; pin the list's run and follow the affected-page cursor |
|
|
36
|
+
| Which URLs were discovered and audited? | `canonry_agent_readiness_pages`; filter audit/fetch/indexability state and follow its cursor |
|
|
37
|
+
| How is the site organized? | `canonry_agent_readiness_structure` for one path level |
|
|
38
|
+
| What links to/from this page? | `canonry_agent_readiness_link_neighbors`; inbound and outbound truncation are independent |
|
|
39
|
+
| What is around this page? | `canonry_agent_readiness_subgraph`; refocus or expand only as needed |
|
|
40
|
+
| Can the root reach this page? | `canonry_agent_readiness_path` for a directed followable path |
|
|
41
|
+
| Which editorial or template links exist? | `canonry_agent_readiness_links` with supported filters |
|
|
42
|
+
| What changed between scans? | `canonry_agent_readiness_changes` for compatible complete snapshots |
|
|
43
|
+
| Were broken links checked? | `canonry_agent_readiness_dead_links` |
|
|
44
|
+
| How have scores moved? | `canonry_agent_readiness_trend`, then inspect the relevant runs and coverage |
|
|
44
45
|
|
|
45
46
|
Use semantic reads rather than requesting the full interactive graph or
|
|
46
47
|
inferring importance from visualization coordinates. Defaults for subgraphs
|
|
@@ -102,14 +103,24 @@ multiple Properties; avoid counting the same finding as independent proof
|
|
|
102
103
|
for each one.
|
|
103
104
|
|
|
104
105
|
Rank persisted critical defects and fixes using severity and affected-page
|
|
105
|
-
evidence, with business or link importance where available.
|
|
106
|
+
evidence, with business or link importance where available.
|
|
107
|
+
|
|
108
|
+
On an Advanced project, the critical defect `names-another-entity` marks a
|
|
109
|
+
page that belongs to one Property whose FAQ, title or H1 names another of the
|
|
110
|
+
plan's Properties, usually text copied between Property pages. The page audit
|
|
111
|
+
read carries up to 25 `evidence` entries: the place (`faq-question`,
|
|
112
|
+
`faq-answer`, `title`, `h1`), the FAQ question, the named Property's key and
|
|
113
|
+
name, and a short snippet. Quote those rather than the issue title, and name
|
|
114
|
+
the Property the page belongs to. The check uses the plan revision in the
|
|
115
|
+
scan's `effectiveOptions.entityPlanRevision`; a null revision means the scan
|
|
116
|
+
did not check names, not that no page names another Property. State the run,
|
|
106
117
|
scope, finding, affected page(s), and supported next step. A technical issue
|
|
107
118
|
can be a hypothesis for an AI-visibility gap, but the crawl alone cannot prove
|
|
108
119
|
why an answer engine omitted a Property. Join the corresponding answer
|
|
109
120
|
evidence before making that connection.
|
|
110
121
|
|
|
111
122
|
Read existing data first. If absent or stale, propose an explicitly bounded
|
|
112
|
-
`
|
|
123
|
+
`canonry_agent_readiness_run` when a new scan is needed. Existing authorization
|
|
113
124
|
for that run remains valid; a diagnostic question alone does not authorize
|
|
114
125
|
a crawl. Dead-link checks remain off unless requested. After an approved
|
|
115
126
|
run, follow its returned ID with `canonry_run_get`, then inspect that run's
|
|
@@ -8,8 +8,8 @@ description: Aero's persona, values, and voice — context-agnostic identity tha
|
|
|
8
8
|
You are **Aero** — an AEO analyst. You help operators understand whether AI answer engines NAME their brand (mention) and, secondarily, whether they CITE their domain, and you act decisively on what the data shows. Mention is the primary gauge; citation is the secondary signal. The two are independent — never compute one from the other.
|
|
9
9
|
|
|
10
10
|
For multi-property portfolios, keep each Property's identity and measurement
|
|
11
|
-
scope intact. For
|
|
12
|
-
limits first.
|
|
11
|
+
scope intact. For Agent Readiness, explain the stored audit findings and crawl
|
|
12
|
+
limits first. An Agent Readiness score does not measure AI visibility, and a crawl
|
|
13
13
|
finding alone does not prove why an answer engine omitted a brand.
|
|
14
14
|
|
|
15
15
|
## Values
|
|
@@ -52,6 +52,22 @@ guide plus links to host-native references. It does not replace runtime help.
|
|
|
52
52
|
compute one signal from the other.
|
|
53
53
|
- `answerMentioned: null` means not checked, not false. Missing runs and empty
|
|
54
54
|
populations mean no measurement, not zero visibility.
|
|
55
|
+
- `citationState: not-measured` (with `cited: null`) means the engine returns no
|
|
56
|
+
sources, such as a local model without web access, so whether it cites the
|
|
57
|
+
domain was never observed. It is never a miss: cited rates leave it out and
|
|
58
|
+
count it as `citationNotMeasured`, and a cited rate with nothing measured is
|
|
59
|
+
null, not 0. Mention is still measured on those answers. Other reads show the
|
|
60
|
+
same state in their own shape:
|
|
61
|
+
- visibility report: an answer's `citationUnavailableReason:
|
|
62
|
+
citation-not-measured`, or a rate's `reason: citation-not-measured`;
|
|
63
|
+
- Advanced metrics: `{state: unavailable, reason: citation_not_measured}`;
|
|
64
|
+
- research and snapshot answers: `citationMeasured: false` (research also
|
|
65
|
+
sends `citationState: null`);
|
|
66
|
+
- overview: `citationNotMeasuredQueries`, `citationNotMeasuredPairs` and
|
|
67
|
+
`citationNotMeasuredCount`;
|
|
68
|
+
- analytics: the gaps bucket `citationNotMeasured[]` and sources'
|
|
69
|
+
`citationNotMeasuredAnswers`;
|
|
70
|
+
- visibility compare: `excludedNotMeasured`.
|
|
55
71
|
- Preserve project, time window, provider, requested/served model, location,
|
|
56
72
|
sample size, and query class when comparing evidence. Use server-returned
|
|
57
73
|
metrics; do not invent a score from incompatible populations.
|
|
@@ -66,11 +82,21 @@ guide plus links to host-native references. It does not replace runtime help.
|
|
|
66
82
|
**Status:** read the stored overview and freshness first. Say when evidence is
|
|
67
83
|
missing instead of silently creating it.
|
|
68
84
|
|
|
69
|
-
**Setup:**
|
|
70
|
-
After
|
|
85
|
+
**Setup:** Agent Readiness needs no answer-engine provider; AI Visibility does.
|
|
86
|
+
After an Agent Readiness result on an install with no provider (a `NO_PROVIDER`
|
|
71
87
|
notice, or doctor's `providers.none-configured`), propose AI Visibility setup
|
|
72
88
|
as the next step. The operator adds the provider key in the dashboard or in
|
|
73
|
-
their own terminal; never ask for it in chat.
|
|
89
|
+
their own terminal; never ask for it in chat. A saved key is not a verified one:
|
|
90
|
+
with approval, `canonry settings provider test <name>` or `canonry_provider_test`
|
|
91
|
+
checks the saved connection with the provider now (usually one tiny prompt on
|
|
92
|
+
the operator's account) and reports `connected`, `failed` with the provider's
|
|
93
|
+
reason, or `not-verified`. It needs install administrator authority and
|
|
94
|
+
`settings.write`; while a connection's test is still running, another test of it
|
|
95
|
+
returns `OPERATION_IN_PROGRESS`, so wait for that result. The latest result is
|
|
96
|
+
kept as the connection's `lastTest` (`canonry settings provider-info <name>` or
|
|
97
|
+
`canonry_provider_settings_get`) until its key, endpoint, model, Vertex project,
|
|
98
|
+
region or credentials, or CDP endpoint changes, or the connection is
|
|
99
|
+
disconnected; read it before testing again.
|
|
74
100
|
Rerunning `canonry bootstrap` after a provider change reloads saved provider
|
|
75
101
|
settings on a matching running local server and reports whether they became
|
|
76
102
|
active. If the server is offline, start it to apply the saved settings. For an
|
|
@@ -84,8 +110,8 @@ Ports and database settings still need a restart.
|
|
|
84
110
|
changed separately from why it might have changed. A hypothesis is not a
|
|
85
111
|
measured cause. Propose bounded verification if stored evidence is insufficient.
|
|
86
112
|
|
|
87
|
-
**
|
|
88
|
-
affected-page counts and example URLs, then `
|
|
113
|
+
**Agent Readiness:** read `canonry_agent_readiness_issues` for stored findings,
|
|
114
|
+
affected-page counts and example URLs, then `canonry_agent_readiness_issue_pages`
|
|
89
115
|
for a selected issue's remaining pages. Pin subsequent reads to the returned
|
|
90
116
|
run. Inspect coverage and omissions: a passing score can still have findings,
|
|
91
117
|
an older scan may lack cross-page evidence, and a partial scan cannot establish
|
|
@@ -145,8 +171,12 @@ authority without exposing its token. Missing `operator` means unapproved.
|
|
|
145
171
|
machine. Telemetry reports configured preference, effective state, and any
|
|
146
172
|
environment override; inspecting status never creates an anonymous identifier.
|
|
147
173
|
After approval, `canonry_telemetry_update` changes that preference and
|
|
148
|
-
`canonry_provider_settings_update` changes an already-configured
|
|
149
|
-
model
|
|
174
|
+
`canonry_provider_settings_update` changes or resets an already-configured
|
|
175
|
+
provider's model and quota, restores its built-in endpoint, or removes an
|
|
176
|
+
optional Local key. Both require `settings.write`; neither accepts credentials.
|
|
177
|
+
A reset, restoring the endpoint and removing the Local key included, also
|
|
178
|
+
requires install administrator authority. Pass the `revision` from
|
|
179
|
+
`canonry_provider_settings_get` as `expectedRevision` to reject a stale edit.
|
|
150
180
|
Server telemetry reads and updates additionally require operator authority.
|
|
151
181
|
Ordinary audit-history reads omit internal telemetry events and their state.
|
|
152
182
|
|
|
@@ -37,21 +37,24 @@ A "cited" query means the client's domain appeared in an AI provider's grounding
|
|
|
37
37
|
|
|
38
38
|
A "not-cited" query means the AI answered without grounding on the client's domain.
|
|
39
39
|
|
|
40
|
+
A "not-measured" citation means the engine returns no sources at all (a local model with no web access), so whether it would cite the client was never observed. It is never a miss and is left out of every cited rate; report it as not measured, and read that answer's mention as usual.
|
|
41
|
+
|
|
40
42
|
## Reading Evidence Output
|
|
41
43
|
|
|
42
|
-
`cnry
|
|
44
|
+
`cnry citations visibility <project>` renders a two-glyph cell per (query × engine): citation first, mention second. Uppercase = present, lowercase = absent, `·` = citation not measured (the engine returns no sources), `–` = no snapshot. **C/c = cited** (secondary), **M/m = mentioned** (primary). The legend prints above the table; keep it when you quote the table, and never collapse the two signals into one cell. Lead your interpretation with the mention glyph.
|
|
43
45
|
|
|
44
46
|
```
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
[c][m] emergency plumber near me ← neither: competitive gap, others mentioned/cited instead
|
|
47
|
+
(cell = [citation][mention]; C=cited c=not ·=not measured, M=mentioned m=not, –=no data)
|
|
48
|
+
Query gemini local openai Cite Ment
|
|
49
|
+
AEO Agency NYC CM ·M CM 2/2 3/3 ← mentioned AND cited: branded/direct match, fully visible
|
|
50
|
+
best plumber brooklyn cM ·M cM 0/2 3/3 ← mentioned but NOT cited: named in the answer, domain not in sources (mention win, citation gap)
|
|
51
|
+
ai seo tools Cm ·m cm 1/2 0/3 ← cited but NOT mentioned: domain grounded, brand never named (citation without share of voice)
|
|
52
|
+
how to fix a leaky faucet cm ·m cm 0/2 0/3 ← neither: informational gap, no page for this topic
|
|
52
53
|
```
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
`Cite` counts the engines that cited the query out of those whose sources were checked (`·` when none were); `Ment` counts the engines that mentioned it. Above the table, `Cited in sources: X/Y engines` and `Mentioned in answers: X/Y engines` report each signal independently — a query can be one, both, or neither.
|
|
56
|
+
|
|
57
|
+
`cnry evidence <project>` is the per-query citation history instead: one line per query with its latest citation (`✓ cited`, `✗ not-cited` or `· not measured (no sources)`, plus a transition such as `(lost)`), then `Cited: X / Y` over the queries whose latest answers carried sources and `Not measured: N`. It prints no mention line; read mention from its `--format json` (each run's `mentionState` and `mentionTransition`) or from `cnry citations visibility`.
|
|
55
58
|
|
|
56
59
|
### Query Categories
|
|
57
60
|
|
|
@@ -78,7 +81,7 @@ The summary line reports each signal independently: `Mentioned: X / Y` (primary)
|
|
|
78
81
|
**Query normalization:** When new queries are added to a project mid-history, canonry automatically normalizes each time bucket to only include queries that existed before that bucket started. This prevents newly-added (typically not-yet-mentioned/uncited) queries from creating a false drop in the rate trend. The chart displays dashed vertical annotation lines at points where queries were added (e.g. "+3 q"), and each bucket's tooltip shows the query count ("q") used for that bucket's calculation.
|
|
79
82
|
|
|
80
83
|
### Gap Analysis (`--feature gaps`)
|
|
81
|
-
`GapAnalysisDto` returns mention buckets — `mentionedQueries[]`, `mentionGap[]` (a competitor is mentioned but you're not), `notMentioned[]` (nobody named) — alongside the cited buckets (`cited[]`, `gap[]`, `uncited[]`). Read the mention buckets first. Priorities:
|
|
84
|
+
`GapAnalysisDto` returns mention buckets — `mentionedQueries[]`, `mentionGap[]` (a competitor is mentioned but you're not), `notMentioned[]` (nobody named) — alongside the cited buckets (`cited[]`, `gap[]`, `uncited[]`, and `citationNotMeasured[]` for queries whose engines return no sources, which are in none of the other three). Read the mention buckets first. Priorities:
|
|
82
85
|
- **`mentionGap[]` queries** are highest priority — competitors are taking mention share (AI share-of-voice) you're not winning
|
|
83
86
|
- **`notMentioned[]` queries** may need content or may be too broad
|
|
84
87
|
- The cited `gap[]` / `uncited[]` buckets are the secondary lens on the same queries
|
|
@@ -135,7 +138,7 @@ For competitive queries, if others are mentioned/cited and the client isn't (che
|
|
|
135
138
|
- Do they have stronger schema/structured data?
|
|
136
139
|
- Are they more established in the index?
|
|
137
140
|
|
|
138
|
-
|
|
141
|
+
Take a `runId` from `cnry evidence <project> --format json` (it lists each query's runs and their citation states) and run `cnry run show <run-id> --format json`. Its snapshots carry the evidence: use `citedDomains` and `citedUrls` for citation evidence, and the answer text with Canonry's shared matcher for mention evidence. `competitorOverlap` is a legacy mixed field and must not be treated as either metric by itself.
|
|
139
142
|
|
|
140
143
|
### Step 4: Check across providers
|
|
141
144
|
Gemini, OpenAI, Claude, and Perplexity may behave differently. One citing a domain while another doesn't is normal — each has its own knowledge base and update schedule.
|