seo 0.1.0 → 0.2.1
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 +138 -42
- package/TERMS.md +2 -2
- package/TRADEMARKS.md +9 -5
- package/dist/cli.js +69 -52
- package/dist/cli.js.map +1 -1
- package/dist/{dist-CSY2_p-j.js → dist-CTBhWxn6.js} +49 -49
- package/dist/dist-CTBhWxn6.js.map +1 -0
- package/dist/{dist-FeAUNn9A.js → dist-eiewVfiS.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-BTOI9tde.js} +2 -2
- package/dist/{package-uzXzqDW6.js.map → package-BTOI9tde.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 +50 -61
- 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,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "community-intent",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "What are people searching that shows they want reviews, comparisons, or real experiences?",
|
|
7
|
+
"expected_output": "Should use report id community-intent to find Search Console queries that explicitly ask for reviews, comparisons, recommendations, or real experience. Should follow the discovery flow: seo_list_reports with category ai-search, seo_describe_report with id community-intent, then seo_run_report with the required site. Should read dataStatus, source.completeness, warnings, and caveats first. Should clarify the intent labels are low-confidence English language heuristics based on explicit query wording, not verified intent.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id community-intent for review and comparison query wording",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Reads dataStatus, source.completeness, warnings, and caveats first",
|
|
12
|
+
"States intent labels are low-confidence English language heuristics, not verified intent",
|
|
13
|
+
"Grounds the labels in explicit query wording rather than guessed intent"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run community intent for sc-domain:example.com over 180 days, top 50 queries, at least 50 impressions, and exclude brand terms.",
|
|
20
|
+
"expected_output": "Should run report id community-intent with site sc-domain:example.com, days 180, limit 50, minImpressions 50, and includeBrand false. Should read selection.classifiedRows for every match and selection.returnedRows for the limited set, then per-item intent, signals, and matchedTerms. Should note limit bounds the returned set while classifiedRows shows all matches, and use only parameters defined in the schema.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id community-intent with days 180, limit 50, and minImpressions 50",
|
|
23
|
+
"Sets includeBrand false to exclude brand terms",
|
|
24
|
+
"Reads selection.classifiedRows for all matches and selection.returnedRows for the limited set",
|
|
25
|
+
"Reads per-item intent, signals, and matchedTerms",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "For each of these community queries, tell me which page ranks and confirm the searcher's real intent.",
|
|
33
|
+
"expected_output": "Should decline to name the ranking URL or confirm verified intent from this report. Should state the classifier does not inspect the live SERP or identify the ranking URL, and that intent labels are low-confidence English language heuristics, not verified intent. Should recommend retrieving GSC query and page rows to find the ranking URL and check its content against the observed query language. Should route to page-opportunities to review one ranking URL and content-optimization to turn intent into a brief.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Declines to name the ranking URL from this report",
|
|
36
|
+
"States the classifier does not inspect the live SERP or identify the ranking URL",
|
|
37
|
+
"States intent labels are low-confidence heuristics, not verified intent",
|
|
38
|
+
"Recommends retrieving GSC query and page rows to find the ranking URL",
|
|
39
|
+
"Routes to report id page-opportunities or report id content-optimization"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "No community-intent rows came back for our product category, so there is no review demand there.",
|
|
46
|
+
"expected_output": "Should refuse to read the empty result as absence of demand. Should state a capped or partial zero is inconclusive, not absence of demand, and check dataStatus, source.completeness, warnings, and caveats. Should keep filtered, capped, partial, and complete states distinct and recommend widening the window with days, lowering minImpressions, or raising maxRows before concluding there is no review demand.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to treat the empty result as absence of demand",
|
|
49
|
+
"States a capped or partial zero is inconclusive, not absence of demand",
|
|
50
|
+
"Checks dataStatus, source.completeness, warnings, and caveats",
|
|
51
|
+
"Keeps filtered, capped, partial, and complete states distinct",
|
|
52
|
+
"Recommends widening the window or lowering minImpressions before concluding"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "compare-crawls",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "We pushed a big migration last week. Can you tell me what actually changed on the site technically since before it went out?",
|
|
7
|
+
"expected_output": "Should use report id compare-crawls to produce a before-and-after view of added, removed, fixed, and new findings from two saved crawl snapshots. Should follow the discovery flow: seo_describe_report with id compare-crawls, then seo_run_report with the before and after snapshot ids. Should read comparability.status and its matching flags first, then the preserved config, requestScope, and caps for each side, then top-level completeness and truncated reason codes, then summary, pageChanges, and issueChanges. Should offer report id crawl-history to find the snapshot ids.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id compare-crawls for the before-and-after view",
|
|
10
|
+
"Reads comparability.status and its matching flags before any delta",
|
|
11
|
+
"Reads preserved config, requestScope, and caps for both snapshots",
|
|
12
|
+
"Reads summary, pageChanges, and issueChanges after the completeness checks",
|
|
13
|
+
"Offers report id crawl-history to locate the two snapshot ids"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Compare saved crawls with before crawl_example_20260601 and after crawl_example_20260710 and confirm the canonical fix landed.",
|
|
20
|
+
"expected_output": "Should run report id compare-crawls with before crawl_example_20260601 and after crawl_example_20260710, via seo reports run compare-crawls or seo_run_report. Should check comparability.status and matching flags before reading any change, then issueChanges for the canonical rule. Should note source row caps limit joined GSC or GA4 evidence even when the document crawl completed, and that verification is re-running the same definition and request scope after deployment.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id compare-crawls with the before and after snapshot ids as given",
|
|
23
|
+
"Checks comparability.status and matching flags before reading any change",
|
|
24
|
+
"Reads issueChanges to confirm the canonical rule delta",
|
|
25
|
+
"Notes source row caps limit joined GSC or GA4 evidence even when the crawl completed",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "A page shows up in the before crawl but not the after crawl, and issues dropped after the release. So the release removed the page and fixed those issues, correct?",
|
|
33
|
+
"expected_output": "Should refuse both causal conclusions. Should explain that an absent page from a capped, skipped, failed, or differently scoped crawl is not proven removed, and that a change between snapshots is not proof the release caused it. Should check comparability.status, the caps, and the scope on both sides before drawing any conclusion, and should recommend re-running the same definition and request scope to confirm the delta rather than asserting cause.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to treat an absent page as proven removed",
|
|
36
|
+
"States absence can come from a capped, skipped, failed, or differently scoped crawl",
|
|
37
|
+
"Refuses to treat the change as proof the release caused it",
|
|
38
|
+
"Checks comparability.status, caps, and scope on both sides first",
|
|
39
|
+
"Recommends re-running the same definition and scope to confirm the delta"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "The two crawls I picked used different page limits and start URLs, but just diff them and give me the numbers anyway.",
|
|
46
|
+
"expected_output": "Should warn that materially different scope or settings make the comparison unreliable and that report id compare-crawls should be avoided when the two crawls used different scope. Should read comparability.status and its matching flags and surface that the snapshots are not comparable rather than presenting the raw delta as a real change. Should recommend re-running both sides with the same definition and request scope before comparing.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Warns that different scope or settings make the diff unreliable",
|
|
49
|
+
"Reads comparability.status and its matching flags to show the crawls are not comparable",
|
|
50
|
+
"Does not present the raw delta as a confirmed change",
|
|
51
|
+
"Recommends re-running both sides with the same definition and request scope"
|
|
52
|
+
],
|
|
53
|
+
"files": []
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "content-optimization",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Help me improve this blog post using what people actually search for.",
|
|
7
|
+
"expected_output": "Should use report id content-optimization to turn a page and its Search Console queries into a practical brief for improving relevance and coverage. Should follow the discovery flow: seo_list_reports with category ai-search, seo_describe_report with id content-optimization, then seo_run_report with the required site and url. Should read sourceReport dataStatus, selection, benchmark.possiblyTruncated, and verification.status first, then treat summary.score and primaryIntent as heuristics.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id content-optimization for the page brief",
|
|
10
|
+
"Notes the report requires both site and url",
|
|
11
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
12
|
+
"Reads sourceReport dataStatus, selection, benchmark.possiblyTruncated, and verification.status first",
|
|
13
|
+
"Treats summary.score and primaryIntent as heuristics"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run the content brief for site sc-domain:example.com and url https://example.com/guide over 90 days, verify the live content, top 25 queries.",
|
|
20
|
+
"expected_output": "Should run report id content-optimization with site sc-domain:example.com, url https://example.com/guide, days 90, verifyContent true, and limit 25. Should read verification.status before treating any live-content observation as verified, and read topActions separating technical-check and unverified items from verified observations. Should then read intentMix and the source query metrics, and use only parameters defined in the schema.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id content-optimization with site and url and days 90",
|
|
23
|
+
"Sets verifyContent true and limit 25 as requested",
|
|
24
|
+
"Reads verification.status before treating live-content observations as verified",
|
|
25
|
+
"Separates technical-check and unverified topActions from verified observations",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "Give me the estimated click lift from this brief and just drop every suggested query phrase into the copy to lock it in.",
|
|
33
|
+
"expected_output": "Should refuse to present estimatedClickLift as a forecast and should decline to force the query wording into the copy. Should state estimatedClickLift and score are prioritisation heuristics, not forecasts or quality grades, that query wording is not a content mandate, and that adding suggested wording is not guaranteed traffic. Should recommend fetching the page after the edit and confirming the missing answer block or clearer framing is present.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to present estimatedClickLift as a forecast",
|
|
36
|
+
"States estimatedClickLift and score are prioritisation heuristics, not forecasts or quality grades",
|
|
37
|
+
"States query wording is not a content mandate",
|
|
38
|
+
"States adding suggested wording is not guaranteed traffic",
|
|
39
|
+
"Recommends fetching the page after the edit to confirm the change"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "I ran it without content verification, but topActions says add a comparison section, so the page is definitely missing one.",
|
|
46
|
+
"expected_output": "Should not treat an unverified topAction as a confirmed live-page gap. Should read verification.status and note that without verifyContent the brief has query evidence but no verified content observation, so unverified and technical-check actions are not confirmed against the live page. Should keep verified and unverified states distinct and recommend running with verifyContent true or fetching the page before concluding the section is missing.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to treat the unverified topAction as a confirmed live-page gap",
|
|
49
|
+
"Reads verification.status to classify the action",
|
|
50
|
+
"States unverified and technical-check actions are not confirmed against the live page",
|
|
51
|
+
"Keeps verified and unverified states distinct",
|
|
52
|
+
"Recommends setting verifyContent true or fetching the page before concluding"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "crawl-diff",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "We just shipped a big deploy. Did anything technical break on the site?",
|
|
7
|
+
"expected_output": "Should route to report id crawl-diff, which crawls the site and compares it with the previous matching run. Should follow the discovery flow: seo_list_reports with category monitoring, seo_describe_report with id crawl-diff, then seo_run_report with a startUrl. Should read run versus previousRun first, treating a missing previous run as a baseline, then the start URL, limit, counts, timestamps, rendering, and warnings for both runs, then the summary counts traced into items before, after, and changes. Should treat recommendations as review actions.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id crawl-diff for the post-deploy technical check",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Reads run versus previousRun and treats a missing previous run as a baseline",
|
|
12
|
+
"Reads counts, rendering, and warnings for both runs",
|
|
13
|
+
"Reads the summary counts traced into before, after, and changes",
|
|
14
|
+
"Treats recommendations as review actions rather than confirmed defects"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "Agent task: run crawl-diff starting at https://example.com with a 500 page limit and JavaScript rendering.",
|
|
21
|
+
"expected_output": "Should run report id crawl-diff with startUrl https://example.com, limit 500, and js true, via seo reports run crawl-diff or seo_run_report. Should use only startUrl, site, limit, refresh, and js from the schema. Should note that a first run with no previousRun is a baseline, not a change set, and that comparability depends on running with a comparable scope next time.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Runs report id crawl-diff with startUrl, limit 500, and js true",
|
|
24
|
+
"Uses only parameters defined in the crawl-diff schema",
|
|
25
|
+
"States a first run with no previousRun is a baseline, not a change set",
|
|
26
|
+
"Notes comparability depends on a comparable scope on the next run",
|
|
27
|
+
"Reads the fresh run and previousRun before the changes"
|
|
28
|
+
],
|
|
29
|
+
"files": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"prompt": "Twelve URLs are gone from the diff, so we deleted 12 pages, and the crawl is clean now so our rankings are safe.",
|
|
34
|
+
"expected_output": "Should refuse both claims. A removed URL may be outside the current discovered set or limit rather than deleted. A bounded diff is not an inventory-wide audit and does not show ranking impact. Should recommend repeating the crawl with comparable scope and confirming the changed items before concluding pages were deleted or that rankings are unaffected.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"Refuses to treat a removed URL as a deleted page",
|
|
37
|
+
"States a removed URL may be outside the current discovered set or limit",
|
|
38
|
+
"States a bounded diff is not an inventory-wide audit",
|
|
39
|
+
"Refuses to claim the diff shows ranking impact",
|
|
40
|
+
"Recommends repeating the crawl with comparable scope to confirm"
|
|
41
|
+
],
|
|
42
|
+
"files": []
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": 4,
|
|
46
|
+
"prompt": "Those issues do not appear in this run, so they are fixed, even though the log shows some fetches failed.",
|
|
47
|
+
"expected_output": "Should not treat the absence as resolved when fetches failed. A fetch or extraction failure cannot support a resolved issue. Should read the warnings and rendering for both runs and keep a failed fetch distinct from a resolved finding. Should recommend re-running with comparable scope and confirming the changed item before calling the issues fixed.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Refuses to call the issues fixed when fetches failed",
|
|
50
|
+
"States a fetch or extraction failure cannot support a resolved issue",
|
|
51
|
+
"Reads the warnings and rendering for both runs",
|
|
52
|
+
"Keeps a failed fetch distinct from a resolved finding",
|
|
53
|
+
"Recommends re-running with comparable scope to confirm the fix"
|
|
54
|
+
],
|
|
55
|
+
"files": []
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "crawl-history",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "I ran a few crawls of our site over the last month and lost track of them. Which ones do I have saved?",
|
|
7
|
+
"expected_output": "Should use report id crawl-history to list the local crawl snapshots so the user can choose one by site and date. Should follow the discovery flow: seo_describe_report with id crawl-history, then seo_run_report, optionally scoped by site and a bounded limit. Should read each snapshot id, site, start URL, creation time, and status, then total pages and issue count, then the configuration hash and storage version. Should present the list as orientation metadata for choosing a snapshot, not as findings.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id crawl-history to list saved crawl snapshots",
|
|
10
|
+
"Optionally scopes by site and passes a bounded limit",
|
|
11
|
+
"Reads each snapshot id, site, start URL, creation time, and status",
|
|
12
|
+
"Reads total pages and issue count as orientation, not findings",
|
|
13
|
+
"Presents the list for choosing a snapshot rather than analysing it"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "List the last 5 saved crawls for sc-domain:example.com so I can grab the newest snapshot id.",
|
|
20
|
+
"expected_output": "Should run report id crawl-history with site sc-domain:example.com and limit 5, via seo reports run crawl-history or seo_run_report. Should read each snapshot id, site, start URL, creation time, and status to identify the newest one, then hand the chosen id to report id crawl-report for inspection. Should note that a saved list can expose stale data, so the loaded snapshot's caveats still need checking before analysis.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id crawl-history with site sc-domain:example.com and limit 5",
|
|
23
|
+
"Reads snapshot id, site, start URL, creation time, and status to pick the newest",
|
|
24
|
+
"Hands the chosen id to report id crawl-report for inspection",
|
|
25
|
+
"Notes a saved list can expose stale data",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "The newest crawl has way fewer pages than the one before it. That means our site shrank, right? And the higher issue count means it's in worse shape.",
|
|
33
|
+
"expected_output": "Should refuse both readings. Should explain that a smaller page count could reflect a scope change, cap, or failure rather than a real site change, and that the counts are orientation metadata, not severity or completeness. Should recommend loading each snapshot with report id crawl-report and comparing scope and caveats, or using report id compare-crawls with matched scope, before concluding anything about site size or health.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to read a smaller page count as the site shrinking",
|
|
36
|
+
"States a smaller count can reflect a scope change, cap, or failure",
|
|
37
|
+
"States the counts are orientation metadata, not severity or completeness",
|
|
38
|
+
"Recommends loading snapshots with report id crawl-report to compare scope and caveats",
|
|
39
|
+
"Suggests report id compare-crawls with matched scope for a real before-and-after"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "crawl-report",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Open the crawl I saved earlier and show me the summary before I dig into anything.",
|
|
7
|
+
"expected_output": "Should use report id crawl-report to load a saved crawl by id, or the latest local crawl for a site, and return its summary. Should follow the discovery flow: seo_describe_report with id crawl-report, then seo_run_report with the id or site. Should read id, source URL and site, generatedAt, definition id, config hash, status, and requestEvidenceStatus first, then summary counts and pageLimitReached, then data sources, warnings, and caveats. Should keep page and issue detail opt-in through includePages and includeIssues.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id crawl-report to load the saved crawl",
|
|
10
|
+
"Reads generatedAt, status, and requestEvidenceStatus before the summary",
|
|
11
|
+
"Reads summary counts and pageLimitReached next",
|
|
12
|
+
"Keeps page and issue detail opt-in via includePages and includeIssues",
|
|
13
|
+
"Reads data sources, warnings, and caveats before analysis"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Load crawl_example_20260710 with includeIssues true so I can see the technical findings.",
|
|
20
|
+
"expected_output": "Should run report id crawl-report with id crawl_example_20260710 and includeIssues true, via seo reports run crawl-report or seo_run_report. Should confirm status and requestEvidenceStatus, then read summary counts and pageLimitReached, then the issues once includeIssues is set. Should note that loading a report is a local storage read, not a fresh check, and that pageLimitReached true means the crawl was capped.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id crawl-report with id crawl_example_20260710 and includeIssues true",
|
|
23
|
+
"Confirms status and requestEvidenceStatus before reading detail",
|
|
24
|
+
"Reads summary counts and pageLimitReached before the issues",
|
|
25
|
+
"States loading a report is a local storage read, not a fresh check",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "This saved crawl passed with no critical issues, so that's the current state of the live site. We're good, right?",
|
|
33
|
+
"expected_output": "Should refuse to treat a saved crawl as the current live state. Should explain that a report can be internally valid yet stale, capped, or partial and cannot prove the current live state, and that loading it is a local storage read rather than a fresh check. Should check generatedAt, pageLimitReached, and caveats, and recommend running a new crawl with the same configuration and keeping both ids to confirm the current state.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to treat the saved crawl as the current live state",
|
|
36
|
+
"States a valid report can still be stale, capped, or partial",
|
|
37
|
+
"States loading a report is a local storage read, not a fresh check",
|
|
38
|
+
"Checks generatedAt, pageLimitReached, and caveats",
|
|
39
|
+
"Recommends a new crawl with the same configuration to confirm current state"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "crawler-rules",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "What technical checks can this tool actually run on a crawl? I want to see what's available before I ask for anything specific.",
|
|
7
|
+
"expected_output": "Should use report id crawler-rules to return the catalog of available technical check IDs and the evidence each rule looks for. Should follow the discovery flow: seo_describe_report with id crawler-rules, then seo_run_report, optionally scoped by category. Should read each rule id, title, and category, then default severity as triage metadata, then guidance metadata. Should present the list as a catalog of available checks, not as findings on any specific site.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id crawler-rules to list the available checks",
|
|
10
|
+
"Reads each rule id, title, and category",
|
|
11
|
+
"Treats default severity as generic triage metadata, not actual priority",
|
|
12
|
+
"Presents the catalog as available checks, not findings on a site",
|
|
13
|
+
"Does not imply any listed rule was triggered by a crawl"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Show me only the indexability rules so I can pick the right rule id for an affected-urls run.",
|
|
20
|
+
"expected_output": "Should run report id crawler-rules with category indexability, one of the allowed enum values, via seo reports run crawler-rules or seo_run_report. Should read each rule id, title, and category, then read the guidance metadata to choose the correct id, then pass that exact id to report id affected-urls or report id explain-crawl-issue against a real crawl. Should note that listing a rule does not mean any page triggered it.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id crawler-rules with category indexability from the allowed enum",
|
|
23
|
+
"Reads each rule id, title, and category to pick the right one",
|
|
24
|
+
"Passes the chosen id to report id affected-urls or report id explain-crawl-issue",
|
|
25
|
+
"States listing a rule does not mean any page triggered it",
|
|
26
|
+
"Uses only the category enum values defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "This rule is marked high severity in the catalog, so it must be the most urgent thing on our site and a Google requirement. Add it to the top of the list.",
|
|
33
|
+
"expected_output": "Should refuse both claims. Should explain that default severity is generic triage metadata, not actual priority for this site, and that listing a rule does not make the convention a search-engine requirement. Should note that similarly named rules may not share source semantics. Should recommend confirming the rule against real evidence with report id affected-urls and ranking real findings with report id top-fixes before deciding urgency.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to treat default severity as this site's actual priority",
|
|
36
|
+
"States listing a rule does not make the convention a search-engine requirement",
|
|
37
|
+
"Notes similarly named rules may not share source semantics",
|
|
38
|
+
"Recommends confirming the rule with report id affected-urls against real evidence",
|
|
39
|
+
"Recommends report id top-fixes to rank real findings before deciding urgency"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "ctr-underperformers",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Which queries get lots of impressions but hardly any clicks?",
|
|
7
|
+
"expected_output": "Should use report id ctr-underperformers to find high-impression queries whose click-through rate trails comparable queries at similar positions. Should follow the discovery flow: seo_list_reports with category opportunities, seo_describe_report with id ctr-underperformers, then seo_run_report with the required site. Should read dataStatus, range, source.completeness, possiblyTruncated, and validation counts first. Should clarify these are title or snippet review candidates, not a promised click uplift.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id ctr-underperformers for the CTR comparison queue",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Reads dataStatus, range, source.completeness, possiblyTruncated, and validation counts first",
|
|
12
|
+
"Frames the rows as title or snippet review candidates",
|
|
13
|
+
"States the report does not promise a click uplift"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run CTR underperformers for sc-domain:example.com, at least 500 impressions, top 30, exclude brand.",
|
|
20
|
+
"expected_output": "Should run report id ctr-underperformers with site sc-domain:example.com, minImpressions 500, limit 30, and includeBrand false. Should read selection before the queue, then per-item query, URL, impressions, position, observed CTR, target CTR, and benchmark source, then the estimated shortfall. Should use only parameters defined in the schema and not invent a days parameter, since the report does not accept one.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id ctr-underperformers with minImpressions 500 and limit 30",
|
|
23
|
+
"Sets includeBrand false to exclude brand terms",
|
|
24
|
+
"Reads per-item observed CTR, target CTR, and benchmark source",
|
|
25
|
+
"Reads selection before the queue and the estimated shortfall",
|
|
26
|
+
"Uses only parameters defined in the schema and does not invent a days parameter"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "Add up the estimated shortfall across these rows to get the clicks we will gain once we rewrite the titles.",
|
|
33
|
+
"expected_output": "Should refuse to total the shortfall as promised clicks. Should state the shortfall is directional prioritisation math, not a traffic forecast, and that page-one average position hides day, device, geography, and result-feature variation, so a title change does not promise clicks. Should recommend inspecting the current SERP and displayed title link, then comparing a complete later period after testing framing.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to total the shortfall into promised clicks",
|
|
36
|
+
"States the shortfall is directional prioritisation math, not a traffic forecast",
|
|
37
|
+
"Notes page-one average position hides day, device, geography, and result-feature variation",
|
|
38
|
+
"Recommends inspecting the current SERP and displayed title link",
|
|
39
|
+
"Recommends comparing a complete later period after testing framing"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "No underperformers came back, so all our titles are already optimal.",
|
|
46
|
+
"expected_output": "Should refuse to read the empty result as an all-clear. Should state a partial empty result is not an all-clear and check source.completeness, possiblyTruncated, and the validation counts. Should note the comparison groups may have too little data to benchmark, and recommend lowering minImpressions or widening the input before concluding the titles are optimal.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to read the empty result as an all-clear",
|
|
49
|
+
"States a partial empty result is not an all-clear",
|
|
50
|
+
"Checks source.completeness, possiblyTruncated, and validation counts",
|
|
51
|
+
"Notes the comparison groups may have too little data to benchmark",
|
|
52
|
+
"Recommends lowering minImpressions or widening the input before concluding"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "decaying-pages",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Which of our pages are losing search traffic?",
|
|
7
|
+
"expected_output": "Should use report id decaying-pages to find pages and queries with meaningful click declines across comparable Search Console periods. Should follow the discovery flow: seo_list_reports with category opportunities, seo_describe_report with id decaying-pages, then seo_run_report with the required site. Should read dataStatus, ranges, and source.completeness first, then the current and previous fetched rows, caps, truncation, and invalid rows in selection. Should clarify a diagnosis such as lost_position or lost_ctr labels correlated movement, not a cause.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id decaying-pages for the click-decline investigation list",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Reads dataStatus, ranges, and source.completeness first",
|
|
12
|
+
"Reads current and previous fetched rows, caps, truncation, and invalid rows in selection",
|
|
13
|
+
"States lost_position or lost_ctr labels correlated movement, not a cause"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run the decay report for sc-domain:example.com year over year, at least a 30 percent drop, at least 100 previous clicks, top 25 pages.",
|
|
20
|
+
"expected_output": "Should run report id decaying-pages with site sc-domain:example.com, comparison year-over-year, minDropPct 30, minPreviousClicks 100, and limit 25. Should read summary.observedRetainedQueryClickLoss versus the returned subset, then per-item clicks, impressions, CTR, position, and signals. Should use only parameters defined in the schema.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id decaying-pages with comparison year-over-year",
|
|
23
|
+
"Sets minDropPct 30, minPreviousClicks 100, and limit 25 as requested",
|
|
24
|
+
"Reads summary.observedRetainedQueryClickLoss versus the returned subset",
|
|
25
|
+
"Reads per-item clicks, impressions, CTR, position, and signals",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "The lost_ctr label means the old content caused the decline, so add up all the drops for our total lost traffic.",
|
|
33
|
+
"expected_output": "Should refuse both moves. Should state a diagnosis such as lost_ctr or lost_position labels correlated movement, not a cause, and that capped rows must not be summed into a property-wide loss. Should note missing retained rows are not zero traffic. Should recommend checking deployments, live indexability, and SERP composition for the affected URLs before editing.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to read lost_ctr as an established cause",
|
|
36
|
+
"States the diagnosis labels correlated movement, not a cause",
|
|
37
|
+
"States capped rows must not be summed into a property-wide loss",
|
|
38
|
+
"Notes missing retained rows are not zero traffic",
|
|
39
|
+
"Recommends checking deployments, live indexability, and SERP composition before editing"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "This month is not finished yet, but compare it against last month anyway and call the difference a decline.",
|
|
46
|
+
"expected_output": "Should decline to treat an incomplete newer period as comparable. Should state the report should be avoided when the newer period is incomplete or not comparable, and read dataStatus, ranges, and source.completeness to confirm the windows are comparable. Should note missing retained rows are not zero traffic, and recommend waiting for final data or choosing a comparable window before concluding a decline.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Declines to compare against an incomplete newer period",
|
|
49
|
+
"States the report should be avoided when the newer period is incomplete or not comparable",
|
|
50
|
+
"Reads dataStatus, ranges, and source.completeness to confirm comparability",
|
|
51
|
+
"Notes missing retained rows are not zero traffic",
|
|
52
|
+
"Recommends waiting for final data or choosing a comparable window"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "entity-readiness",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Does our site make it clear who we are and who writes our articles? Want to check the author and organization signals.",
|
|
7
|
+
"expected_output": "Should use report id entity-readiness to review names, authors, dates, structured data, and profile links across crawled pages and return page-level observations that need human review. Should follow the discovery flow: seo_describe_report with id entity-readiness, then seo_run_report from a saved crawl by reportId or site. Should read dataStatus, evaluatedPages versus crawlPages, and caveats first, then entities.schemaTypes, then sameAs, sameAsByType, and socialProfiles, then authors. Should treat the checks as informational observations, not pass or fail requirements.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id entity-readiness for the author and organization signals",
|
|
10
|
+
"Works from a saved crawl by reportId or site",
|
|
11
|
+
"Reads dataStatus, evaluatedPages versus crawlPages, and caveats first",
|
|
12
|
+
"Reads schemaTypes, then sameAs, sameAsByType, socialProfiles, then authors",
|
|
13
|
+
"Treats the checks as informational observations, not pass or fail requirements"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Run entity-readiness on saved crawl crawl_example_20260710 and point me at pages missing author markup.",
|
|
20
|
+
"expected_output": "Should run report id entity-readiness with reportId crawl_example_20260710, via seo reports run entity-readiness or seo_run_report. Should read dataStatus, evaluatedPages versus crawlPages, and caveats, then entities.schemaTypes, sameAs, sameAsByType, socialProfiles, and authors to find the examples with missing or inconsistent author evidence. Should note that skipped or non-indexable pages are not evidence of absence and that the examples need human confirmation against the publisher.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id entity-readiness with reportId crawl_example_20260710",
|
|
23
|
+
"Reads dataStatus and evaluatedPages versus crawlPages before the examples",
|
|
24
|
+
"Reads the authors and sameAs evidence to surface missing author markup",
|
|
25
|
+
"States skipped or non-indexable pages are not evidence of absence",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "Our JSON-LD lists the organization and authors, so this gets us into Google's Knowledge Graph and lifts our rankings. Confirm that.",
|
|
33
|
+
"expected_output": "Should refuse to translate entity markup into Knowledge Graph inclusion or ranking gains. Should explain that these signals do not prove Knowledge Graph inclusion, ownership, expertise, rankings, or citations, and that the checks are informational observations rather than requirements. Should recommend confirming names, URLs, authorship, and dates with the publisher and re-crawling the same scope, instead of claiming an outcome.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to claim Knowledge Graph inclusion from entity markup",
|
|
36
|
+
"Refuses to claim a ranking lift from the signals",
|
|
37
|
+
"States the signals do not prove ownership, expertise, rankings, or citations",
|
|
38
|
+
"Treats the checks as observations, not requirements",
|
|
39
|
+
"Recommends confirming names, URLs, authorship, and dates with the publisher"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 4,
|
|
45
|
+
"prompt": "Only a handful of pages got evaluated because the crawl was small. Treat the rest as having no author signals at all.",
|
|
46
|
+
"expected_output": "Should refuse to read unevaluated pages as having no author signals. Should compare evaluatedPages versus crawlPages and read dataStatus and caveats, and explain that skipped or non-indexable pages are not evidence of absence. Should keep evaluated, skipped, and unavailable states distinct and recommend widening the crawl scope before concluding anything about the pages that were not evaluated.",
|
|
47
|
+
"assertions": [
|
|
48
|
+
"Refuses to treat unevaluated pages as having no author signals",
|
|
49
|
+
"Compares evaluatedPages versus crawlPages and reads dataStatus",
|
|
50
|
+
"States skipped or non-indexable pages are not evidence of absence",
|
|
51
|
+
"Keeps evaluated, skipped, and unavailable states distinct",
|
|
52
|
+
"Recommends widening the crawl scope before concluding on unevaluated pages"
|
|
53
|
+
],
|
|
54
|
+
"files": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "explain-crawl-issue",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "The crawl returned a rule called canonical-mismatch and I have no idea what it means or whether I should care. Can you explain it?",
|
|
7
|
+
"expected_output": "Should use report id explain-crawl-issue to return a plain-English explanation of one crawler rule with fix and verification steps. Should follow the discovery flow: seo_describe_report with id explain-crawl-issue, then seo_run_report with the ruleId. Should read category, default severity, and why it matters first, then the fix steps and ignored impact, then the verification method and agent hints. Should describe the checked condition without claiming a search-engine penalty or a guaranteed ranking effect.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id explain-crawl-issue to explain the rule",
|
|
10
|
+
"Passes the ruleId for the rule in question",
|
|
11
|
+
"Reads category, default severity, and why it matters first",
|
|
12
|
+
"Reads fix steps and ignored impact, then verification and agent hints",
|
|
13
|
+
"Describes the checked condition without claiming a penalty or ranking effect"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Explain ruleId title-too-long and tell me how to verify the fix once we change the titles.",
|
|
20
|
+
"expected_output": "Should run report id explain-crawl-issue with ruleId title-too-long, via seo reports run explain-crawl-issue or seo_run_report. Should read category, default severity, and why it matters, then the fix steps and ignored impact, then the verification method. Should note that the rule definition alone does not prove any page triggered it, and should pair the definition with report id affected-urls from the same saved crawl to confirm the per-URL evidence.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Runs report id explain-crawl-issue with ruleId title-too-long",
|
|
23
|
+
"Reads why it matters, fix steps, ignored impact, and the verification method",
|
|
24
|
+
"States the rule definition alone does not prove any page triggered it",
|
|
25
|
+
"Pairs the definition with report id affected-urls from the same saved crawl",
|
|
26
|
+
"Uses only parameters defined in the report schema"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": 3,
|
|
32
|
+
"prompt": "So this rule is a Google penalty, and if we don't fix it our rankings drop. That's what it means, yes?",
|
|
33
|
+
"expected_output": "Should refuse to frame the rule as a penalty or a guaranteed ranking drop. Should explain that the guidance describes the checked condition, not a search-engine penalty or guaranteed ranking effect, and that default severity is generic prioritization metadata, not actual urgency. Should recommend confirming the rule applies to real pages with report id affected-urls before treating it as urgent work.",
|
|
34
|
+
"assertions": [
|
|
35
|
+
"Refuses to call the rule a search-engine penalty",
|
|
36
|
+
"Refuses to claim a guaranteed ranking drop from not fixing it",
|
|
37
|
+
"States the guidance describes the checked condition only",
|
|
38
|
+
"States default severity is generic prioritization metadata, not actual urgency",
|
|
39
|
+
"Recommends confirming with report id affected-urls before treating it as urgent"
|
|
40
|
+
],
|
|
41
|
+
"files": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|