seo 0.1.0 → 0.2.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/PRIVACY.md +2 -2
- package/README.md +133 -40
- package/TERMS.md +2 -2
- package/TRADEMARKS.md +9 -5
- package/dist/cli.js +68 -52
- package/dist/cli.js.map +1 -1
- package/dist/{dist-CSY2_p-j.js → dist-6bK_8r5M.js} +49 -49
- package/dist/dist-6bK_8r5M.js.map +1 -0
- package/dist/{dist-FeAUNn9A.js → dist-vRmqfhR4.js} +1 -1
- package/dist/index.d.ts +186 -94
- package/dist/index.js +843 -415
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +18 -1
- package/dist/mcp.js +6532 -4665
- package/dist/mcp.js.map +1 -1
- package/dist/{package-uzXzqDW6.js → package-7aT8_Xp0.js} +2 -2
- package/dist/{package-uzXzqDW6.js.map → package-7aT8_Xp0.js.map} +1 -1
- package/evals/README.md +117 -0
- package/evals/affected-urls.json +57 -0
- package/evals/ai-readiness.json +84 -0
- package/evals/ai-referrals.json +71 -0
- package/evals/ai-search-scorecard.json +70 -0
- package/evals/audit-page.json +57 -0
- package/evals/audit-urls.json +58 -0
- package/evals/cannibalisation.json +57 -0
- package/evals/community-intent.json +57 -0
- package/evals/compare-crawls.json +56 -0
- package/evals/content-optimization.json +57 -0
- package/evals/crawl-diff.json +58 -0
- package/evals/crawl-history.json +44 -0
- package/evals/crawl-report.json +44 -0
- package/evals/crawler-rules.json +44 -0
- package/evals/ctr-underperformers.json +57 -0
- package/evals/decaying-pages.json +57 -0
- package/evals/entity-readiness.json +57 -0
- package/evals/explain-crawl-issue.json +44 -0
- package/evals/generate-llms-txt.json +44 -0
- package/evals/geo-gaps.json +57 -0
- package/evals/index-coverage-plan.json +58 -0
- package/evals/index-coverage.json +70 -0
- package/evals/index-monitor.json +58 -0
- package/evals/index-watch.json +68 -0
- package/evals/internal-links.json +57 -0
- package/evals/link-recovery.json +58 -0
- package/evals/llms-txt-audit.json +44 -0
- package/evals/measure-change.json +58 -0
- package/evals/monthly-action-plan.json +56 -0
- package/evals/monthly-report.json +58 -0
- package/evals/narrative-report.json +58 -0
- package/evals/okf-build.json +44 -0
- package/evals/okf-validate.json +44 -0
- package/evals/page-opportunities.json +57 -0
- package/evals/performance-audit.json +57 -0
- package/evals/pseo-audit.json +84 -0
- package/evals/query-clusters.json +57 -0
- package/evals/quick-wins.json +86 -0
- package/evals/redirect-trace.json +57 -0
- package/evals/refresh-priorities.json +57 -0
- package/evals/search-performance-overview.json +86 -0
- package/evals/second-page.json +58 -0
- package/evals/segment-impact.json +57 -0
- package/evals/seo-fix-queue.json +85 -0
- package/evals/seo-geo-readiness.json +84 -0
- package/evals/seo-site-audit.json +85 -0
- package/evals/seo-to-ai-query.json +57 -0
- package/evals/seo.json +87 -0
- package/evals/setup-check.json +56 -0
- package/evals/site-crawl.json +44 -0
- package/evals/striking-distance.json +85 -0
- package/evals/technical-watch.json +57 -0
- package/evals/top-fixes.json +44 -0
- package/evals/traffic-anomaly.json +57 -0
- package/evals/update-correlation.json +57 -0
- package/evals/update-postmortem.json +57 -0
- package/package.json +5 -3
- package/skills/README.md +46 -59
- package/skills/seo/SKILL.md +88 -63
- package/skills/seo/agents/openai.yaml +2 -2
- package/dist/dist-CSY2_p-j.js.map +0 -1
- package/skills/affected-urls/SKILL.md +0 -39
- package/skills/affected-urls/agents/openai.yaml +0 -4
- package/skills/ai-readiness/SKILL.md +0 -34
- package/skills/ai-readiness/agents/openai.yaml +0 -4
- package/skills/ai-referrals/SKILL.md +0 -31
- package/skills/ai-referrals/agents/openai.yaml +0 -4
- package/skills/audit-page/SKILL.md +0 -50
- package/skills/audit-page/agents/openai.yaml +0 -4
- package/skills/audit-urls/SKILL.md +0 -39
- package/skills/audit-urls/agents/openai.yaml +0 -4
- package/skills/cannibalisation/SKILL.md +0 -31
- package/skills/cannibalisation/agents/openai.yaml +0 -4
- package/skills/community-intent/SKILL.md +0 -39
- package/skills/community-intent/agents/openai.yaml +0 -4
- package/skills/compare-crawls/SKILL.md +0 -40
- package/skills/compare-crawls/agents/openai.yaml +0 -4
- package/skills/content-optimization/SKILL.md +0 -31
- package/skills/content-optimization/agents/openai.yaml +0 -4
- package/skills/crawl-diff/SKILL.md +0 -51
- package/skills/crawl-diff/agents/openai.yaml +0 -4
- package/skills/crawl-history/SKILL.md +0 -37
- package/skills/crawl-history/agents/openai.yaml +0 -4
- package/skills/crawl-report/SKILL.md +0 -37
- package/skills/crawl-report/agents/openai.yaml +0 -4
- package/skills/crawler-rules/SKILL.md +0 -34
- package/skills/crawler-rules/agents/openai.yaml +0 -4
- package/skills/ctr-underperformers/SKILL.md +0 -31
- package/skills/ctr-underperformers/agents/openai.yaml +0 -4
- package/skills/decaying-pages/SKILL.md +0 -31
- package/skills/decaying-pages/agents/openai.yaml +0 -4
- package/skills/entity-readiness/SKILL.md +0 -34
- package/skills/entity-readiness/agents/openai.yaml +0 -4
- package/skills/explain-crawl-issue/SKILL.md +0 -32
- package/skills/explain-crawl-issue/agents/openai.yaml +0 -4
- package/skills/generate-llms-txt/SKILL.md +0 -37
- package/skills/generate-llms-txt/agents/openai.yaml +0 -4
- package/skills/geo-gaps/SKILL.md +0 -37
- package/skills/geo-gaps/agents/openai.yaml +0 -4
- package/skills/index-coverage/SKILL.md +0 -84
- package/skills/index-coverage/agents/openai.yaml +0 -4
- package/skills/index-coverage-plan/SKILL.md +0 -50
- package/skills/index-coverage-plan/agents/openai.yaml +0 -4
- package/skills/index-monitor/SKILL.md +0 -49
- package/skills/index-monitor/agents/openai.yaml +0 -4
- package/skills/index-watch/SKILL.md +0 -77
- package/skills/index-watch/agents/openai.yaml +0 -4
- package/skills/internal-links/SKILL.md +0 -31
- package/skills/internal-links/agents/openai.yaml +0 -4
- package/skills/link-recovery/SKILL.md +0 -51
- package/skills/link-recovery/agents/openai.yaml +0 -4
- package/skills/llms-txt-audit/SKILL.md +0 -34
- package/skills/llms-txt-audit/agents/openai.yaml +0 -4
- package/skills/measure-change/SKILL.md +0 -52
- package/skills/measure-change/agents/openai.yaml +0 -4
- package/skills/monthly-action-plan/SKILL.md +0 -50
- package/skills/monthly-action-plan/agents/openai.yaml +0 -4
- package/skills/monthly-report/SKILL.md +0 -50
- package/skills/monthly-report/agents/openai.yaml +0 -4
- package/skills/narrative-report/SKILL.md +0 -51
- package/skills/narrative-report/agents/openai.yaml +0 -4
- package/skills/okf-build/SKILL.md +0 -39
- package/skills/okf-build/agents/openai.yaml +0 -4
- package/skills/okf-validate/SKILL.md +0 -43
- package/skills/okf-validate/agents/openai.yaml +0 -4
- package/skills/page-opportunities/SKILL.md +0 -31
- package/skills/page-opportunities/agents/openai.yaml +0 -4
- package/skills/performance/SKILL.md +0 -50
- package/skills/performance/agents/openai.yaml +0 -4
- package/skills/performance-audit/SKILL.md +0 -31
- package/skills/performance-audit/agents/openai.yaml +0 -4
- package/skills/pseo-audit/SKILL.md +0 -103
- package/skills/pseo-audit/agents/openai.yaml +0 -4
- package/skills/query-clusters/SKILL.md +0 -31
- package/skills/query-clusters/agents/openai.yaml +0 -4
- package/skills/quick-wins/SKILL.md +0 -31
- package/skills/quick-wins/agents/openai.yaml +0 -4
- package/skills/redirect-trace/SKILL.md +0 -51
- package/skills/redirect-trace/agents/openai.yaml +0 -4
- package/skills/refresh-priorities/SKILL.md +0 -48
- package/skills/refresh-priorities/agents/openai.yaml +0 -4
- package/skills/search-performance-overview/SKILL.md +0 -48
- package/skills/search-performance-overview/agents/openai.yaml +0 -4
- package/skills/second-page/SKILL.md +0 -50
- package/skills/second-page/agents/openai.yaml +0 -4
- package/skills/segment-impact/SKILL.md +0 -50
- package/skills/segment-impact/agents/openai.yaml +0 -4
- package/skills/seo-fix-queue/SKILL.md +0 -50
- package/skills/seo-fix-queue/agents/openai.yaml +0 -4
- package/skills/seo-geo-readiness/SKILL.md +0 -60
- package/skills/seo-geo-readiness/agents/openai.yaml +0 -4
- package/skills/seo-site-audit/SKILL.md +0 -59
- package/skills/seo-site-audit/agents/openai.yaml +0 -4
- package/skills/seo-to-ai-query/SKILL.md +0 -31
- package/skills/seo-to-ai-query/agents/openai.yaml +0 -4
- package/skills/setup-check/SKILL.md +0 -49
- package/skills/setup-check/agents/openai.yaml +0 -4
- package/skills/site-crawl/SKILL.md +0 -39
- package/skills/site-crawl/agents/openai.yaml +0 -4
- package/skills/striking-distance/SKILL.md +0 -52
- package/skills/striking-distance/agents/openai.yaml +0 -4
- package/skills/technical-watch/SKILL.md +0 -49
- package/skills/technical-watch/agents/openai.yaml +0 -4
- package/skills/top-fixes/SKILL.md +0 -38
- package/skills/top-fixes/agents/openai.yaml +0 -4
- package/skills/traffic-anomaly/SKILL.md +0 -52
- package/skills/traffic-anomaly/agents/openai.yaml +0 -4
- package/skills/update-correlation/SKILL.md +0 -51
- package/skills/update-correlation/agents/openai.yaml +0 -4
- package/skills/update-postmortem/SKILL.md +0 -49
- package/skills/update-postmortem/agents/openai.yaml +0 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "generate-llms-txt",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "I want to give AI agents a clean map of our useful public pages. Can you draft an llms.txt from our site?",
|
|
7
|
+
"expected_output": "Should use report id generate-llms-txt to create an editable llms.txt draft from selected public pages in a current crawl. Should follow the discovery flow: seo_describe_report with id generate-llms-txt, then seo_run_report from a saved crawl by reportId or site. Should read content, includedUrls, estimatedTokens, and sections, then check the generated titles and descriptions against the source pages, then the source crawl date, cap, failures, and caveats. Should present it as a draft for human review, not a finished file.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id generate-llms-txt to draft the file from a current crawl",
|
|
10
|
+
"Reads content, includedUrls, estimatedTokens, and sections",
|
|
11
|
+
"Checks generated titles and descriptions against the source pages",
|
|
12
|
+
"Reads the source crawl date, cap, failures, and caveats",
|
|
13
|
+
"Presents the output as a draft for human review, not a finished file"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Generate an llms.txt from saved crawl crawl_example_20260710, cap it at 40 urls and a 2000 token budget, and exclude anything under /tag/.",
|
|
20
|
+
"expected_output": "Should run report id generate-llms-txt with reportId crawl_example_20260710, maxUrls 40, tokenBudget 2000, and exclude set to the /tag/ pattern, via seo reports run generate-llms-txt or seo_run_report. Should read content, includedUrls, estimatedTokens, and sections, and note that reaching maxUrls or the token budget is possible truncation, not a complete inventory. Should route to report id llms-txt-audit to validate the links after the file is published.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id generate-llms-txt with reportId crawl_example_20260710",
|
|
23
|
+
"Sets maxUrls 40, tokenBudget 2000, and the /tag/ exclude pattern",
|
|
24
|
+
"Reads content, includedUrls, estimatedTokens, and sections",
|
|
25
|
+
"States reaching maxUrls or the token budget is possible truncation, not complete",
|
|
26
|
+
"Routes to report id llms-txt-audit to validate the published file"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "Once we publish this llms.txt, we'll rank better and get cited in AI answers, right? That's the point of it.",
|
|
33
|
+
"expected_output": "Should refuse to promise ranking, indexing, or citation benefit from publishing llms.txt. Should explain that a valid draft does not prove search or AI benefit, selection, indexing, or citations, and that the crawler cannot determine publisher intent. Should keep the file as a human-reviewed navigation aid and recommend human review, then validating the published file with report id llms-txt-audit, rather than claiming an outcome.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to promise ranking, indexing, or citation gains from llms.txt",
|
|
36
|
+
"States a valid draft does not prove search or AI benefit, selection, or citations",
|
|
37
|
+
"Notes the crawler cannot determine publisher intent",
|
|
38
|
+
"Keeps the file as a human-reviewed navigation aid",
|
|
39
|
+
"Recommends validating the published file with report id llms-txt-audit"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "geo-gaps",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Is anything in our setup quietly blocking our pages from Google's AI search stuff? Want the technical restrictions and which pages they hit.",
|
|
7
|
+
"expected_output": "Should use report id geo-gaps to find crawl, index, and snippet settings that could restrict pages in Google AI search features, and the pages where they appear. Should follow the discovery flow: seo_describe_report with id geo-gaps, then seo_run_report from a saved crawl by reportId or site, with a bounded limit. Should read dataStatus, source.partialReasons, and selection evaluated, matched, returned, and truncated counts first, then per-URL issues separated from searchEligibility, then the access states where null means unknown.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id geo-gaps for the technical restrictions and affected pages",
|
|
10
|
+
"Reads dataStatus, source.partialReasons, and the selection counts first",
|
|
11
|
+
"Keeps per-URL issues separate from searchEligibility",
|
|
12
|
+
"Treats a null access state as unknown, not allowed",
|
|
13
|
+
"Passes a bounded limit rather than unbounded input"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run geo-gaps on saved crawl crawl_example_20260710, limit 25, and show me the pages with hard access restrictions.",
|
|
20
|
+
"expected_output": "Should run report id geo-gaps with reportId crawl_example_20260710 and limit 25, via seo reports run geo-gaps or seo_run_report. Should read dataStatus, source.partialReasons, and the evaluated, matched, returned, and truncated counts, then per-URL issues separated from searchEligibility, then access states. Should treat null access states as unknown rather than allowed and note semantic HTML and structured data do not override a hard access restriction. Should offer report id affected-urls to list URLs for a specific rule.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id geo-gaps with reportId crawl_example_20260710 and limit 25",
|
|
23
|
+
"Reads dataStatus, source.partialReasons, and the selection counts before rows",
|
|
24
|
+
"Keeps per-URL issues separate from searchEligibility",
|
|
25
|
+
"States semantic HTML and structured data do not override a hard access restriction",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "The gap list came back empty, so every page is eligible and visible in Google AI search. And those noindex tags it skipped, flag them as defects to remove.",
|
|
33
|
+
"expected_output": "Should refuse both moves. Should explain that an empty gap list does not prove indexing, visibility, selection, or complete coverage, and that noindex, robots, canonicals, or snippet limits should be confirmed as intent before being treated as defects. Should keep the noindex directives as intentional controls until intent or contradictory evidence makes them defects, and should check dataStatus and source.partialReasons before calling the list clean.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to read an empty gap list as proof of visibility or eligibility",
|
|
36
|
+
"States an empty list does not prove indexing, selection, or complete coverage",
|
|
37
|
+
"Treats noindex, robots, canonicals, and snippet limits as intentional controls",
|
|
38
|
+
"Confirms intent before treating a control as a defect",
|
|
39
|
+
"Checks dataStatus and source.partialReasons before calling the list clean"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "Some URLs show a null access state. Count those as allowed and move on.",
|
|
46
|
+
"expected_output": "Should refuse to count null access states as allowed. Should explain that a null access state means unknown, not allowed, and keep unknown and allowed states distinct. Should read source.partialReasons and the evaluated versus matched counts to see why the state is unknown, and recommend re-checking the exact URL and directive rather than assuming access.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to count null access states as allowed",
|
|
49
|
+
"States a null access state means unknown, not allowed",
|
|
50
|
+
"Keeps unknown and allowed states distinct",
|
|
51
|
+
"Reads source.partialReasons to understand why the state is unknown",
|
|
52
|
+
"Recommends re-checking the exact URL and directive before assuming access"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "index-coverage-plan",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Our site is huge. How should we spread URL Inspection checks so we don't blow the quota?",
|
|
7
|
+
"expected_output": "Should route to report id index-coverage-plan, which chooses which sitemap URLs and Search Console properties should use limited URL Inspection checks. Should follow the discovery flow: seo_list_reports with category monitoring, seo_describe_report with id index-coverage-plan, then seo_run_report with site and sitemaps. Should read the summary sitemapUrls, urlCount, property count, daily capacity, and estimated versus target cycle days first, then the properties allocations and sample URLs, then suggestions and every warning. Should treat the output as a plan, not a result.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id index-coverage-plan for the quota sampling plan",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Provides site and sitemaps as required by the schema",
|
|
12
|
+
"Reads summary urlCount, daily capacity, and estimated versus target cycle days first",
|
|
13
|
+
"Reads the properties allocations and every warning",
|
|
14
|
+
"Treats the output as a plan, not a coverage result"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: build a plan for sc-domain:example.com from the sitemap https://example.com/sitemap.xml with a daily limit of 200 and a target 30 day cycle.",
|
|
21
|
+
"expected_output": "Should run report id index-coverage-plan with site sc-domain:example.com, sitemaps set to the sitemap URL, dailyLimit 200, and targetCycleDays 30, via seo reports run index-coverage-plan or seo_run_report. Should keep params within the schema bounds, where dailyLimit allows up to 2000 and targetCycleDays up to 365. Should use the plan to set a realistic recurring limit for report id index-monitor next.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id index-coverage-plan with dailyLimit 200 and targetCycleDays 30",
|
|
24
|
+
"Provides site and the sitemap as required",
|
|
25
|
+
"Keeps dailyLimit and targetCycleDays within the schema bounds",
|
|
26
|
+
"Uses the plan to set a realistic limit for report id index-monitor",
|
|
27
|
+
"Uses only parameters defined in the index-coverage-plan schema"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "So after the 30 day cycle every URL in the plan will be indexed, correct?",
|
|
34
|
+
"expected_output": "Should refuse. Estimated cycle time is arithmetic over discovered URLs and capacity, not a promise Google will process or index them. This plan does not report an index coverage percentage or an all-clear. Should explain the plan only schedules checks and recommend collecting evidence with report id index-monitor and reviewing changes with report id index-watch.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to promise every URL will be indexed after the cycle",
|
|
37
|
+
"States estimated cycle time is arithmetic over URLs and capacity, not a promise",
|
|
38
|
+
"States the plan does not report a coverage percentage or an all-clear",
|
|
39
|
+
"Explains the plan only schedules checks",
|
|
40
|
+
"Recommends collecting evidence with report id index-monitor"
|
|
41
|
+
],
|
|
42
|
+
"files": []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 4,
|
|
46
|
+
"prompt": "One sitemap failed to fetch but just give me the plan as complete coverage.",
|
|
47
|
+
"expected_output": "Should not present the plan as complete. Sitemap fetch failures or maxUrls truncation make the plan incomplete. Should read every warning and keep the incomplete plan distinct from a complete one. Should recommend fixing the sitemap fetch or noting the truncation before relying on the allocations.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Refuses to present the plan as complete coverage",
|
|
50
|
+
"States sitemap fetch failures or maxUrls truncation make the plan incomplete",
|
|
51
|
+
"Reads every warning in the output",
|
|
52
|
+
"Keeps the incomplete plan distinct from a complete one",
|
|
53
|
+
"Recommends resolving the fetch failure before relying on the plan"
|
|
54
|
+
],
|
|
55
|
+
"files": []
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "index-coverage",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "I want to know which of our pages aren't getting picked up by Google.",
|
|
7
|
+
"expected_output": "Should route to report id index-coverage, which compares crawlable pages with pages that had Search Console visibility and builds a representative review queue for URL Inspection. Should note it is a signal and review step, not proof of indexing, and that it needs a saved crawl for the site. Should follow the discovery flow: seo_list_reports with category monitoring, seo_describe_report with id index-coverage, then seo_run_report. Should read sources completeness, rowLimit, rowLimitReached, date range, and invalid rows first, then the groups. Should plan to confirm exact verdicts with URL Inspection via report id index-watch.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id index-coverage for the coverage signal review",
|
|
10
|
+
"States the report is a signal and review step, not proof of indexing",
|
|
11
|
+
"Notes it requires a saved crawl for the site",
|
|
12
|
+
"Reads sources completeness, rowLimit, rowLimitReached, and invalid rows first",
|
|
13
|
+
"Reads retainedSearchVisibility and crawlableWithoutRetainedSearchVisibility",
|
|
14
|
+
"Plans to confirm exact verdicts with report id index-watch"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: run index-coverage for sc-domain:example.com against the sitemap https://example.com/sitemap.xml over 90 days, rowLimit 50000, 50 items per section.",
|
|
21
|
+
"expected_output": "Should run report id index-coverage with site sc-domain:example.com, sitemaps set to the sitemap URL, days 90, rowLimit 50000, and itemsPerSection 50, via seo reports run index-coverage or seo_run_report. Should keep params within the schema bounds, where rowLimit allows up to 250000 and itemsPerSection up to 1000. Should read rowLimitReached to see whether the Search Console source was capped before reading the groups.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id index-coverage with days 90 and rowLimit 50000",
|
|
24
|
+
"Sets itemsPerSection 50 and the sitemap as requested",
|
|
25
|
+
"Keeps rowLimit and itemsPerSection within the schema bounds",
|
|
26
|
+
"Reads rowLimitReached to see if the source was capped",
|
|
27
|
+
"Uses only parameters defined in the index-coverage schema"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "These 40 URLs have no Search Console rows, so they are not indexed. Mark them unindexed.",
|
|
34
|
+
"expected_output": "Should refuse. A missing Search Analytics row is not proof a page is unindexed, and a page is not unindexed because no row appeared. The crawlableWithoutRetainedSearchVisibility group is a review signal, not a verdict. Should recommend collecting the exact URL Inspection verdicts with report id index-watch before marking any URL unindexed.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to mark the URLs unindexed from missing rows",
|
|
37
|
+
"States a missing Search Analytics row is not proof a page is unindexed",
|
|
38
|
+
"Treats crawlableWithoutRetainedSearchVisibility as a review signal, not a verdict",
|
|
39
|
+
"Recommends collecting exact verdicts with report id index-watch",
|
|
40
|
+
"Keeps the crawl-versus-Search-Console signal distinct from an index verdict"
|
|
41
|
+
],
|
|
42
|
+
"files": []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 4,
|
|
46
|
+
"prompt": "These pages had impressions in the period, so they are definitely indexed and fine.",
|
|
47
|
+
"expected_output": "Should refuse. A page is not indexed because it had Search Analytics visibility, and retainedSearchVisibility is evidence of past visibility, not a current index verdict. Should keep the visibility signal distinct from proof of indexing and recommend confirming with URL Inspection via report id index-watch for any page that needs a verdict.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Refuses to conclude the pages are indexed from past visibility",
|
|
50
|
+
"States a page is not indexed because it had Search Analytics visibility",
|
|
51
|
+
"Treats retainedSearchVisibility as evidence, not a current index verdict",
|
|
52
|
+
"Recommends confirming with URL Inspection via report id index-watch"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": 5,
|
|
58
|
+
"prompt": "Just give me our index coverage as a single percentage of the whole site, even though rowLimitReached came back true.",
|
|
59
|
+
"expected_output": "Should refuse to produce a whole-site coverage percentage. Do not turn a limited or incomplete source into a whole-site coverage percentage. Should read rowLimit, rowLimitReached, and invalid rows and keep limited and incomplete states distinct from complete ones. Should explain a capped source cannot support a whole-site percentage and recommend the representative review queue instead.",
|
|
60
|
+
"assertions": [
|
|
61
|
+
"Refuses to produce a whole-site coverage percentage",
|
|
62
|
+
"States a limited or incomplete source cannot become a whole-site percentage",
|
|
63
|
+
"Reads rowLimit, rowLimitReached, and invalid rows",
|
|
64
|
+
"Keeps limited and incomplete states distinct from complete ones",
|
|
65
|
+
"Recommends the representative review queue instead of a percentage"
|
|
66
|
+
],
|
|
67
|
+
"files": []
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "index-monitor",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Start tracking whether Google is indexing our key pages so we can spot changes.",
|
|
7
|
+
"expected_output": "Should route to report id index-monitor, which checks selected sitemap URLs with Google URL Inspection and saves the results locally for later comparison. Should follow the discovery flow: seo_list_reports with category monitoring, seo_describe_report with id index-monitor, then seo_run_report with site and sitemaps. Should read dataStatus and the source sitemap and inventory limits, discovered and invalid URLs, and truncation first, then the inventory states, then properties allocation, then items with inspectionStatus, indexStatus, regressions, recoveries, and errors. Should plan to review changes over time with report id index-watch.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id index-monitor to collect and save URL Inspection snapshots",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Provides site and sitemaps as required by the schema",
|
|
12
|
+
"Reads dataStatus, inventory limits, invalid URLs, and truncation first",
|
|
13
|
+
"Reads items inspectionStatus and indexStatus with regressions and recoveries",
|
|
14
|
+
"Plans to review changes with report id index-watch"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: run index-monitor for sc-domain:example.com from https://example.com/sitemap.xml, inspect at most 50 URLs, daily limit 100.",
|
|
21
|
+
"expected_output": "Should run report id index-monitor with site sc-domain:example.com, sitemaps set to the sitemap URL, inspectLimit 50, and dailyLimit 100, via seo reports run index-monitor or seo_run_report. Should keep params within the schema bounds, where inspectLimit allows up to 100 and dailyLimit up to 2000. Should note the run saves snapshots for later comparison and that only selected URLs get a new inspection result.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id index-monitor with inspectLimit 50 and dailyLimit 100",
|
|
24
|
+
"Provides site and the sitemap as required",
|
|
25
|
+
"Keeps inspectLimit and dailyLimit within the schema bounds",
|
|
26
|
+
"Notes the run saves snapshots for later comparison",
|
|
27
|
+
"Uses only parameters defined in the index-monitor schema"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "Several checks came back quota-blocked and a few failed. Log those pages as index problems.",
|
|
34
|
+
"expected_output": "Should refuse. Failed, deferred, or quota-blocked checks are operational outcomes, not SEO defects. Should keep those states distinct from index problems and recommend retrying the failed checks per retryAt rather than recording the pages as defects.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to log quota-blocked and failed checks as index problems",
|
|
37
|
+
"States failed, deferred, or quota-blocked checks are operational outcomes",
|
|
38
|
+
"Keeps operational outcomes distinct from SEO defects",
|
|
39
|
+
"Recommends retrying failed checks per retryAt",
|
|
40
|
+
"Does not treat an operational skip as a page defect"
|
|
41
|
+
],
|
|
42
|
+
"files": []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 4,
|
|
46
|
+
"prompt": "The selected batch all came back indexed, so the whole site is indexed and future pages will be too.",
|
|
47
|
+
"expected_output": "Should refuse. A complete selected batch does not prove inventory-wide indexing or future inclusion, and a due URL that was not selected has no new inspection result. Should keep the bounded selected batch distinct from the full inventory and avoid projecting the result onto unselected or future pages.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Refuses to conclude the whole site is indexed from the batch",
|
|
50
|
+
"States a complete selected batch does not prove inventory-wide indexing",
|
|
51
|
+
"States a due URL that was not selected has no new inspection result",
|
|
52
|
+
"Refuses to promise future pages will be indexed",
|
|
53
|
+
"Keeps the bounded selected batch distinct from the full inventory"
|
|
54
|
+
],
|
|
55
|
+
"files": []
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "index-watch",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Did the index status of our monitored pages change since last time?",
|
|
7
|
+
"expected_output": "Should route to report id index-watch, which compares current Google index evidence with saved snapshots to find regressions and recoveries. Should note it needs a URL list and earlier snapshots. Should follow the discovery flow: seo_list_reports with category monitoring, seo_describe_report with id index-watch, then seo_run_report with site and urls. Should read source.possiblyTruncated, dataStatus, warnings, and sitemap inventory states first, then currentIssues, regressions, recoveries, failed, quotaBlocked, and deferred separately, then indexStatus, issueCodes, and typed changes.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id index-watch to compare against saved snapshots",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Notes it needs a URL list and earlier snapshots",
|
|
12
|
+
"Reads source.possiblyTruncated, dataStatus, and warnings first",
|
|
13
|
+
"Reads currentIssues, regressions, recoveries, failed, quotaBlocked, and deferred separately",
|
|
14
|
+
"Reads indexStatus and issueCodes for each change"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: run index-watch for sc-domain:example.com on https://example.com/a, https://example.com/b, and https://example.com/c in English with a daily limit of 100.",
|
|
21
|
+
"expected_output": "Should run report id index-watch with site sc-domain:example.com, urls set to the three URLs, languageCode en, and dailyLimit 100, via seo reports run index-watch or seo_run_report. Should keep params within the schema bounds, where urls allows up to 100 entries and dailyLimit up to 2000. Should keep failed, quotaBlocked, and deferred distinct from regressions when reading the result.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id index-watch with the three URLs and dailyLimit 100",
|
|
24
|
+
"Sets languageCode as requested",
|
|
25
|
+
"Keeps urls and dailyLimit within the schema bounds",
|
|
26
|
+
"Keeps failed, quotaBlocked, and deferred distinct from regressions",
|
|
27
|
+
"Uses only parameters defined in the index-watch schema"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "This URL came back NEUTRAL with a different canonical, so it is broken. Flag it as a defect.",
|
|
34
|
+
"expected_output": "Should refuse. A NEUTRAL verdict or canonical difference may be intentional, not a defect. Should keep it as an observation and recommend auditing the live page, the sitemap, and the exact inspection evidence before treating it as a regression or defect.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to flag the NEUTRAL verdict as a defect",
|
|
37
|
+
"States a NEUTRAL verdict or canonical difference may be intentional",
|
|
38
|
+
"Keeps the verdict as an observation rather than a defect",
|
|
39
|
+
"Recommends auditing the live page, sitemap, and exact inspection evidence"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "URL Inspection says indexed, so the page is ranking right now and the whole site is healthy.",
|
|
46
|
+
"expected_output": "Should refuse. URL Inspection is Google's indexed snapshot for one URL, not a live crawl or current search appearance. Should not infer inventory-wide health from the bounded selected sample. Should keep the single-URL indexed snapshot distinct from live ranking and from whole-site health.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to claim the page is ranking right now from an indexed verdict",
|
|
49
|
+
"States URL Inspection is an indexed snapshot, not a live crawl or search appearance",
|
|
50
|
+
"Refuses to infer whole-site health from the bounded sample",
|
|
51
|
+
"Keeps the single-URL snapshot distinct from live ranking"
|
|
52
|
+
],
|
|
53
|
+
"files": []
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": 5,
|
|
57
|
+
"prompt": "Our local quota ledger still shows budget, so ignore the provider 429 and treat those checks as Google-side failures we can retry immediately.",
|
|
58
|
+
"expected_output": "Should refuse to override the 429. A provider 429 is authoritative over the local quota ledger. Should keep quotaBlocked distinct from a page defect, respect the 429 rather than retrying immediately, and follow the retry timing the provider gives.",
|
|
59
|
+
"assertions": [
|
|
60
|
+
"Refuses to ignore the provider 429 based on the local ledger",
|
|
61
|
+
"States a provider 429 is authoritative over the local quota ledger",
|
|
62
|
+
"Keeps quotaBlocked distinct from a page defect",
|
|
63
|
+
"Does not recommend an immediate retry against the 429"
|
|
64
|
+
],
|
|
65
|
+
"files": []
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "internal-links",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Find pages on our site that should link to this new article.",
|
|
7
|
+
"expected_output": "Should use report id internal-links to find relevant pages that could add a useful internal link to a target URL. Should follow the discovery flow: seo_list_reports with category opportunities, seo_describe_report with id internal-links, then seo_run_report with the required site and targetUrl. Should read dataStatus, target verification, aliases, canonical, and technical signals first, then source completeness and selection attempted, checked, failed, unchecked, and exclusions. Should clarify query overlap does not prove a link belongs.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id internal-links for the source-page candidates",
|
|
10
|
+
"Notes the report requires both site and targetUrl",
|
|
11
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
12
|
+
"Reads dataStatus, target verification, aliases, canonical, and technical signals first",
|
|
13
|
+
"States query overlap does not prove a link belongs"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run internal links for site sc-domain:example.com and targetUrl https://example.com/new-guide, top 20 candidates, check 100 of them.",
|
|
20
|
+
"expected_output": "Should run report id internal-links with site sc-domain:example.com, targetUrl https://example.com/new-guide, limit 20, and checkLimit 100. Should read source completeness and selection attempted, checked, failed, unchecked, and exclusions, then per-item exact versus lexical matches and linkEvidence. Should use only parameters defined in the schema.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id internal-links with site and targetUrl",
|
|
23
|
+
"Sets limit 20 and checkLimit 100 as requested",
|
|
24
|
+
"Reads selection attempted, checked, failed, unchecked, and exclusions",
|
|
25
|
+
"Reads per-item exact versus lexical matches and linkEvidence",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "Great, add all these internal links automatically. They will boost our rankings.",
|
|
33
|
+
"expected_output": "Should decline to add links automatically and should not promise a ranking gain. Should state the report should be avoided when links are to be added automatically, that query overlap does not prove a link belongs or that adding one improves rankings, and that priority is a heuristic, not estimated impact. Should recommend reading the source passage, adding one contextual link only if the target is genuinely useful, and re-crawling to confirm it.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Declines to add the links automatically",
|
|
36
|
+
"States query overlap does not prove a link belongs or that adding one improves rankings",
|
|
37
|
+
"States priority is a heuristic, not estimated impact",
|
|
38
|
+
"Recommends reading the source passage before adding a link",
|
|
39
|
+
"Recommends re-crawling to confirm any added link"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "We set checkLimit to 20 and only a couple of candidates came back, so there are no internal link opportunities for this page.",
|
|
46
|
+
"expected_output": "Should refuse to read the small result as proven absence. Should state a low checkLimit can leave plausible candidates unchecked, so absence is not proven, and read selection attempted, checked, failed, and unchecked to see how many were actually inspected. Should recommend raising checkLimit or inspecting the unchecked candidates before concluding there are no opportunities.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to read the small result as proven absence",
|
|
49
|
+
"States a low checkLimit can leave plausible candidates unchecked, so absence is not proven",
|
|
50
|
+
"Reads selection attempted, checked, failed, and unchecked",
|
|
51
|
+
"Recommends raising checkLimit or inspecting the unchecked candidates",
|
|
52
|
+
"Keeps unchecked and checked states distinct"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "link-recovery",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "We did a migration and I'm worried we broke some pages that used to get traffic.",
|
|
7
|
+
"expected_output": "Should route to report id link-recovery, which finds URLs that previously earned search clicks but now fail, redirect poorly, or block indexing. Should note it needs Search Console page history and is not a backlink report. Should follow the discovery flow: seo_list_reports with category monitoring, seo_describe_report with id link-recovery, then seo_run_report with site. Should read range and summary.checked with severity totals first, then per-item original and final URL, GSC metrics, issue lists, and redirect trace, then chain status, final-page indexability, canonicals, and warnings.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id link-recovery for the broken search-value URL review",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Notes it needs Search Console page history and is not a backlink report",
|
|
12
|
+
"Reads range and summary.checked with severity totals first",
|
|
13
|
+
"Reads per-item original and final URL, GSC metrics, and redirect trace",
|
|
14
|
+
"Reads chain status, final-page indexability, and canonicals"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: run link-recovery for sc-domain:example.com over 180 days, top 30, at least 50 clicks in the window.",
|
|
21
|
+
"expected_output": "Should run report id link-recovery with site sc-domain:example.com, days 180, limit 30, and minClicks 50, via seo reports run link-recovery or seo_run_report. Should use only parameters defined in the schema. Should note limit constrains coverage, so the queue is a bounded subset rather than every affected URL.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id link-recovery with days 180 and limit 30",
|
|
24
|
+
"Sets minClicks 50 as requested",
|
|
25
|
+
"Uses only parameters defined in the link-recovery schema",
|
|
26
|
+
"Notes limit constrains coverage rather than covering every URL",
|
|
27
|
+
"Reads severity totals before the per-item detail"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "Total the clicksAtRisk across the queue. That is the traffic we will get back once we redirect all of these.",
|
|
34
|
+
"expected_output": "Should refuse. clicksAtRisk and impressionsAtRisk describe the checked period, not a forecast of loss or recovery. Prior visibility orders the queue but does not prove fixing a URL restores traffic. Should recommend confirming the page should still exist and adding one direct 301 to the closest equivalent destination before re-tracing, rather than totalling clicksAtRisk into a recovery figure.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to total clicksAtRisk into a recovery figure",
|
|
37
|
+
"States clicksAtRisk and impressionsAtRisk describe the checked period, not a forecast",
|
|
38
|
+
"States prior visibility does not prove fixing a URL restores traffic",
|
|
39
|
+
"Recommends confirming the page should exist before adding a 301",
|
|
40
|
+
"Recommends re-tracing after the redirect to confirm"
|
|
41
|
+
],
|
|
42
|
+
"files": []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 4,
|
|
46
|
+
"prompt": "The tool could not check some of the URLs, so count those as fine, and while you are at it show me who links to them.",
|
|
47
|
+
"expected_output": "Should not count the unchecked URLs as fine and should decline the backlink request. Failed checks or selection limits constrain coverage, so they are not an all-clear. link-recovery is not a backlink report. Should recommend re-running or tracing a single chain with report id redirect-trace rather than treating a failed check as clean.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Refuses to count failed or unchecked URLs as fine",
|
|
50
|
+
"States failed checks or selection limits constrain coverage",
|
|
51
|
+
"States link-recovery is not a backlink report",
|
|
52
|
+
"Points to report id redirect-trace to trace a single chain",
|
|
53
|
+
"Keeps a failed check distinct from an all-clear"
|
|
54
|
+
],
|
|
55
|
+
"files": []
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "llms-txt-audit",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "We published an llms.txt a while back. Can you check it's actually valid and the links still work?",
|
|
7
|
+
"expected_output": "Should use report id llms-txt-audit to check whether llms.txt exists, whether its links work, and how well it reflects useful public pages. Should follow the discovery flow: seo_describe_report with id llms-txt-audit, then seo_run_report by url or site. Should read exists, the resolved file URL, response status, headline, and issues first, then recommendedPages, then the source crawl date, cap, partial state, failed requests, and caveats. Should return file, link, and page coverage findings without visibility claims.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id llms-txt-audit to verify the published file",
|
|
10
|
+
"Reads exists, resolved file URL, response status, headline, and issues first",
|
|
11
|
+
"Reads recommendedPages and then the source crawl caveats",
|
|
12
|
+
"Returns file, link, and coverage findings without visibility claims",
|
|
13
|
+
"Reads the source crawl cap and partial state before concluding"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Audit the llms.txt for https://example.com and tell me which recommended pages are missing from it.",
|
|
20
|
+
"expected_output": "Should run report id llms-txt-audit with url https://example.com, or site, via seo reports run llms-txt-audit or seo_run_report. Should read exists, resolved file URL, response status, headline, and issues, then recommendedPages to see the useful pages not covered, then the source crawl date, cap, partial state, and failed requests. Should note that a short recommendation list from a capped crawl is not sitewide evidence, and route to report id generate-llms-txt to draft a fresh file.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id llms-txt-audit with url https://example.com or site",
|
|
23
|
+
"Reads exists, response status, and issues before recommendedPages",
|
|
24
|
+
"Uses recommendedPages to identify useful pages missing from the file",
|
|
25
|
+
"States a short recommendation list from a capped crawl is not sitewide evidence",
|
|
26
|
+
"Routes to report id generate-llms-txt to draft a fresh file"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "The audit says we have no llms.txt. Flag that as a technical SEO defect that's hurting our Google rankings, and note that adding one will boost traffic.",
|
|
33
|
+
"expected_output": "Should refuse both claims. Should explain that llms.txt presence is not a ranking signal and its absence is not a technical defect, and that adding the file does not improve indexing, rankings, traffic, AI selection, or citations. Should keep the missing file as an observation rather than a defect, and, if the user wants one, route to report id generate-llms-txt to draft it for human review.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to flag a missing llms.txt as a technical SEO defect",
|
|
36
|
+
"States llms.txt presence is not a ranking signal and absence is not a defect",
|
|
37
|
+
"States adding the file does not improve indexing, rankings, traffic, or citations",
|
|
38
|
+
"Keeps the missing file as an observation, not a defect",
|
|
39
|
+
"Routes to report id generate-llms-txt if the user wants to draft one"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "measure-change",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "We changed our blog title tags on May 1. Did it do anything?",
|
|
7
|
+
"expected_output": "Should route to report id measure-change, which compares equal Search Console periods before and after a known change. Should follow the discovery flow: seo_list_reports with category experiments, seo_describe_report with id measure-change, then seo_run_report with changedAt and a scope and target. Should read dataStatus, window, source, warnings, and caveats first, then window.effectiveDays versus requestedDays and afterWindowTruncated, then GSC before and after metrics. Should require equal comparable finalized windows before reading a directional verdict.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id measure-change for the before-and-after comparison",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Sets changedAt with a scope and target for the change",
|
|
12
|
+
"Reads dataStatus, window, source, warnings, and caveats first",
|
|
13
|
+
"Reads window.effectiveDays versus requestedDays and afterWindowTruncated",
|
|
14
|
+
"Requires equal comparable finalized windows before a directional verdict"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: run measure-change for sc-domain:example.com, page scope, target https://example.com/blog, changed 2026-05-01, 28 days before and after, with the homepage as a control page.",
|
|
21
|
+
"expected_output": "Should run report id measure-change with site sc-domain:example.com, scope page, target https://example.com/blog, changedAt 2026-05-01, beforeDays 28, afterDays 28, controlScope page, and controlTarget set to the homepage, via seo reports run measure-change or seo_run_report. Should keep beforeDays and afterDays within the schema bounds up to 548 and read the control adjusted deltas alongside the raw before and after metrics.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id measure-change with scope page and changedAt 2026-05-01",
|
|
24
|
+
"Sets beforeDays 28 and afterDays 28 as requested",
|
|
25
|
+
"Sets controlScope page and controlTarget for the control",
|
|
26
|
+
"Keeps beforeDays and afterDays within the schema bounds",
|
|
27
|
+
"Uses only parameters defined in the measure-change schema"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "The after window is up 12 percent, so the change caused it. Multiply by 12 for the annual gain.",
|
|
34
|
+
"expected_output": "Should refuse both. Timing does not prove the recorded change caused the movement, and the delta must not be annualized or forecast. Should check afterWindowTruncated and window.effectiveDays before trusting the direction, and recommend report id segment-impact to see where the movement sits rather than attributing it to the change or projecting an annual figure.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to state the change caused the movement from timing",
|
|
37
|
+
"Refuses to annualize or forecast the delta",
|
|
38
|
+
"Checks afterWindowTruncated and window.effectiveDays before trusting the direction",
|
|
39
|
+
"Recommends report id segment-impact to see where movement sits",
|
|
40
|
+
"Does not present an annual gain figure"
|
|
41
|
+
],
|
|
42
|
+
"files": []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 4,
|
|
46
|
+
"prompt": "It says not-enough-data and clickPct is null. Call that a flat result and an infinite gain.",
|
|
47
|
+
"expected_output": "Should refuse both readings. not-enough-data is never positive, negative, or flat, and clickPct null means the before value was zero, not an infinite gain. Should recommend using equal whole-day before and after windows with at least 7 finalized days each before reading any directional verdict.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Refuses to read not-enough-data as a flat result",
|
|
50
|
+
"States not-enough-data is never positive, negative, or flat",
|
|
51
|
+
"States clickPct null means the before value was zero, not an infinite gain",
|
|
52
|
+
"Recommends equal whole-day windows with at least 7 finalized days each",
|
|
53
|
+
"Does not present an infinite or flat verdict"
|
|
54
|
+
],
|
|
55
|
+
"files": []
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|