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.
Files changed (189) hide show
  1. package/PRIVACY.md +2 -2
  2. package/README.md +138 -42
  3. package/TERMS.md +2 -2
  4. package/TRADEMARKS.md +9 -5
  5. package/dist/cli.js +69 -52
  6. package/dist/cli.js.map +1 -1
  7. package/dist/{dist-CSY2_p-j.js → dist-CTBhWxn6.js} +49 -49
  8. package/dist/dist-CTBhWxn6.js.map +1 -0
  9. package/dist/{dist-FeAUNn9A.js → dist-eiewVfiS.js} +1 -1
  10. package/dist/index.d.ts +186 -94
  11. package/dist/index.js +843 -415
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp.d.ts +18 -1
  14. package/dist/mcp.js +6532 -4665
  15. package/dist/mcp.js.map +1 -1
  16. package/dist/{package-uzXzqDW6.js → package-BTOI9tde.js} +2 -2
  17. package/dist/{package-uzXzqDW6.js.map → package-BTOI9tde.js.map} +1 -1
  18. package/evals/README.md +117 -0
  19. package/evals/affected-urls.json +57 -0
  20. package/evals/ai-readiness.json +84 -0
  21. package/evals/ai-referrals.json +71 -0
  22. package/evals/ai-search-scorecard.json +70 -0
  23. package/evals/audit-page.json +57 -0
  24. package/evals/audit-urls.json +58 -0
  25. package/evals/cannibalisation.json +57 -0
  26. package/evals/community-intent.json +57 -0
  27. package/evals/compare-crawls.json +56 -0
  28. package/evals/content-optimization.json +57 -0
  29. package/evals/crawl-diff.json +58 -0
  30. package/evals/crawl-history.json +44 -0
  31. package/evals/crawl-report.json +44 -0
  32. package/evals/crawler-rules.json +44 -0
  33. package/evals/ctr-underperformers.json +57 -0
  34. package/evals/decaying-pages.json +57 -0
  35. package/evals/entity-readiness.json +57 -0
  36. package/evals/explain-crawl-issue.json +44 -0
  37. package/evals/generate-llms-txt.json +44 -0
  38. package/evals/geo-gaps.json +57 -0
  39. package/evals/index-coverage-plan.json +58 -0
  40. package/evals/index-coverage.json +70 -0
  41. package/evals/index-monitor.json +58 -0
  42. package/evals/index-watch.json +68 -0
  43. package/evals/internal-links.json +57 -0
  44. package/evals/link-recovery.json +58 -0
  45. package/evals/llms-txt-audit.json +44 -0
  46. package/evals/measure-change.json +58 -0
  47. package/evals/monthly-action-plan.json +56 -0
  48. package/evals/monthly-report.json +58 -0
  49. package/evals/narrative-report.json +58 -0
  50. package/evals/okf-build.json +44 -0
  51. package/evals/okf-validate.json +44 -0
  52. package/evals/page-opportunities.json +57 -0
  53. package/evals/performance-audit.json +57 -0
  54. package/evals/pseo-audit.json +84 -0
  55. package/evals/query-clusters.json +57 -0
  56. package/evals/quick-wins.json +86 -0
  57. package/evals/redirect-trace.json +57 -0
  58. package/evals/refresh-priorities.json +57 -0
  59. package/evals/search-performance-overview.json +86 -0
  60. package/evals/second-page.json +58 -0
  61. package/evals/segment-impact.json +57 -0
  62. package/evals/seo-fix-queue.json +85 -0
  63. package/evals/seo-geo-readiness.json +84 -0
  64. package/evals/seo-site-audit.json +85 -0
  65. package/evals/seo-to-ai-query.json +57 -0
  66. package/evals/seo.json +87 -0
  67. package/evals/setup-check.json +56 -0
  68. package/evals/site-crawl.json +44 -0
  69. package/evals/striking-distance.json +85 -0
  70. package/evals/technical-watch.json +57 -0
  71. package/evals/top-fixes.json +44 -0
  72. package/evals/traffic-anomaly.json +57 -0
  73. package/evals/update-correlation.json +57 -0
  74. package/evals/update-postmortem.json +57 -0
  75. package/package.json +5 -3
  76. package/skills/README.md +50 -61
  77. package/skills/seo/SKILL.md +88 -63
  78. package/skills/seo/agents/openai.yaml +2 -2
  79. package/dist/dist-CSY2_p-j.js.map +0 -1
  80. package/skills/affected-urls/SKILL.md +0 -39
  81. package/skills/affected-urls/agents/openai.yaml +0 -4
  82. package/skills/ai-readiness/SKILL.md +0 -34
  83. package/skills/ai-readiness/agents/openai.yaml +0 -4
  84. package/skills/ai-referrals/SKILL.md +0 -31
  85. package/skills/ai-referrals/agents/openai.yaml +0 -4
  86. package/skills/audit-page/SKILL.md +0 -50
  87. package/skills/audit-page/agents/openai.yaml +0 -4
  88. package/skills/audit-urls/SKILL.md +0 -39
  89. package/skills/audit-urls/agents/openai.yaml +0 -4
  90. package/skills/cannibalisation/SKILL.md +0 -31
  91. package/skills/cannibalisation/agents/openai.yaml +0 -4
  92. package/skills/community-intent/SKILL.md +0 -39
  93. package/skills/community-intent/agents/openai.yaml +0 -4
  94. package/skills/compare-crawls/SKILL.md +0 -40
  95. package/skills/compare-crawls/agents/openai.yaml +0 -4
  96. package/skills/content-optimization/SKILL.md +0 -31
  97. package/skills/content-optimization/agents/openai.yaml +0 -4
  98. package/skills/crawl-diff/SKILL.md +0 -51
  99. package/skills/crawl-diff/agents/openai.yaml +0 -4
  100. package/skills/crawl-history/SKILL.md +0 -37
  101. package/skills/crawl-history/agents/openai.yaml +0 -4
  102. package/skills/crawl-report/SKILL.md +0 -37
  103. package/skills/crawl-report/agents/openai.yaml +0 -4
  104. package/skills/crawler-rules/SKILL.md +0 -34
  105. package/skills/crawler-rules/agents/openai.yaml +0 -4
  106. package/skills/ctr-underperformers/SKILL.md +0 -31
  107. package/skills/ctr-underperformers/agents/openai.yaml +0 -4
  108. package/skills/decaying-pages/SKILL.md +0 -31
  109. package/skills/decaying-pages/agents/openai.yaml +0 -4
  110. package/skills/entity-readiness/SKILL.md +0 -34
  111. package/skills/entity-readiness/agents/openai.yaml +0 -4
  112. package/skills/explain-crawl-issue/SKILL.md +0 -32
  113. package/skills/explain-crawl-issue/agents/openai.yaml +0 -4
  114. package/skills/generate-llms-txt/SKILL.md +0 -37
  115. package/skills/generate-llms-txt/agents/openai.yaml +0 -4
  116. package/skills/geo-gaps/SKILL.md +0 -37
  117. package/skills/geo-gaps/agents/openai.yaml +0 -4
  118. package/skills/index-coverage/SKILL.md +0 -84
  119. package/skills/index-coverage/agents/openai.yaml +0 -4
  120. package/skills/index-coverage-plan/SKILL.md +0 -50
  121. package/skills/index-coverage-plan/agents/openai.yaml +0 -4
  122. package/skills/index-monitor/SKILL.md +0 -49
  123. package/skills/index-monitor/agents/openai.yaml +0 -4
  124. package/skills/index-watch/SKILL.md +0 -77
  125. package/skills/index-watch/agents/openai.yaml +0 -4
  126. package/skills/internal-links/SKILL.md +0 -31
  127. package/skills/internal-links/agents/openai.yaml +0 -4
  128. package/skills/link-recovery/SKILL.md +0 -51
  129. package/skills/link-recovery/agents/openai.yaml +0 -4
  130. package/skills/llms-txt-audit/SKILL.md +0 -34
  131. package/skills/llms-txt-audit/agents/openai.yaml +0 -4
  132. package/skills/measure-change/SKILL.md +0 -52
  133. package/skills/measure-change/agents/openai.yaml +0 -4
  134. package/skills/monthly-action-plan/SKILL.md +0 -50
  135. package/skills/monthly-action-plan/agents/openai.yaml +0 -4
  136. package/skills/monthly-report/SKILL.md +0 -50
  137. package/skills/monthly-report/agents/openai.yaml +0 -4
  138. package/skills/narrative-report/SKILL.md +0 -51
  139. package/skills/narrative-report/agents/openai.yaml +0 -4
  140. package/skills/okf-build/SKILL.md +0 -39
  141. package/skills/okf-build/agents/openai.yaml +0 -4
  142. package/skills/okf-validate/SKILL.md +0 -43
  143. package/skills/okf-validate/agents/openai.yaml +0 -4
  144. package/skills/page-opportunities/SKILL.md +0 -31
  145. package/skills/page-opportunities/agents/openai.yaml +0 -4
  146. package/skills/performance/SKILL.md +0 -50
  147. package/skills/performance/agents/openai.yaml +0 -4
  148. package/skills/performance-audit/SKILL.md +0 -31
  149. package/skills/performance-audit/agents/openai.yaml +0 -4
  150. package/skills/pseo-audit/SKILL.md +0 -103
  151. package/skills/pseo-audit/agents/openai.yaml +0 -4
  152. package/skills/query-clusters/SKILL.md +0 -31
  153. package/skills/query-clusters/agents/openai.yaml +0 -4
  154. package/skills/quick-wins/SKILL.md +0 -31
  155. package/skills/quick-wins/agents/openai.yaml +0 -4
  156. package/skills/redirect-trace/SKILL.md +0 -51
  157. package/skills/redirect-trace/agents/openai.yaml +0 -4
  158. package/skills/refresh-priorities/SKILL.md +0 -48
  159. package/skills/refresh-priorities/agents/openai.yaml +0 -4
  160. package/skills/search-performance-overview/SKILL.md +0 -48
  161. package/skills/search-performance-overview/agents/openai.yaml +0 -4
  162. package/skills/second-page/SKILL.md +0 -50
  163. package/skills/second-page/agents/openai.yaml +0 -4
  164. package/skills/segment-impact/SKILL.md +0 -50
  165. package/skills/segment-impact/agents/openai.yaml +0 -4
  166. package/skills/seo-fix-queue/SKILL.md +0 -50
  167. package/skills/seo-fix-queue/agents/openai.yaml +0 -4
  168. package/skills/seo-geo-readiness/SKILL.md +0 -60
  169. package/skills/seo-geo-readiness/agents/openai.yaml +0 -4
  170. package/skills/seo-site-audit/SKILL.md +0 -59
  171. package/skills/seo-site-audit/agents/openai.yaml +0 -4
  172. package/skills/seo-to-ai-query/SKILL.md +0 -31
  173. package/skills/seo-to-ai-query/agents/openai.yaml +0 -4
  174. package/skills/setup-check/SKILL.md +0 -49
  175. package/skills/setup-check/agents/openai.yaml +0 -4
  176. package/skills/site-crawl/SKILL.md +0 -39
  177. package/skills/site-crawl/agents/openai.yaml +0 -4
  178. package/skills/striking-distance/SKILL.md +0 -52
  179. package/skills/striking-distance/agents/openai.yaml +0 -4
  180. package/skills/technical-watch/SKILL.md +0 -49
  181. package/skills/technical-watch/agents/openai.yaml +0 -4
  182. package/skills/top-fixes/SKILL.md +0 -38
  183. package/skills/top-fixes/agents/openai.yaml +0 -4
  184. package/skills/traffic-anomaly/SKILL.md +0 -52
  185. package/skills/traffic-anomaly/agents/openai.yaml +0 -4
  186. package/skills/update-correlation/SKILL.md +0 -51
  187. package/skills/update-correlation/agents/openai.yaml +0 -4
  188. package/skills/update-postmortem/SKILL.md +0 -49
  189. package/skills/update-postmortem/agents/openai.yaml +0 -4
@@ -1,52 +0,0 @@
1
- ---
2
- name: striking-distance
3
- description: Find retained GSC query-page rows with average positions from 11 through 20; use it to build a bounded review queue near page-one visibility.
4
- ---
5
-
6
- # Review striking-distance rows
7
-
8
- Use `striking-distance` to find query-page combinations whose retained GSC
9
- average position falls from 11 through 20. This range can surface useful review
10
- candidates, but it is a heuristic boundary. Average position varies by search,
11
- device, country, and day, so the report does not prove that a URL consistently
12
- ranks on a literal second results page or predict how many clicks a change will
13
- produce.
14
-
15
- ## Run the report
16
-
17
- With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`, call
18
- `seo_describe_report` with `{"id":"striking-distance"}`, then call
19
- `seo_run_report` with only described parameters. Example:
20
- `{"id":"striking-distance","params":{"site":"sc-domain:example.com","days":28,"minImpressions":50,"limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}}`.
21
-
22
- The CLI has exact registry parity:
23
-
24
- ```sh
25
- seo reports describe striking-distance --json
26
- seo reports run striking-distance --params '{"site":"sc-domain:example.com","days":28,"minImpressions":50,"limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}' --json
27
- ```
28
-
29
- Add `brandTerms`, JavaScript rendering, or bounded fetch-rate controls only
30
- after inspecting the schema and when the investigation needs them.
31
-
32
- ## Interpret the output
33
-
34
- Check `range`, `rangeDays`, `dataStatus`, and `source` before the item list.
35
- `source.possiblyTruncated` and retained-row completeness limit any all-clear.
36
- Use `selection` to see what was invalid, outside the position range, branded,
37
- below thresholds, eligible, returned, or limited. `methodology` explains the
38
- priority heuristic.
39
-
40
- For each item, read the observed query, URL, clicks, impressions, CTR, average
41
- position, recommendation evidence, and optional `contentVerification`.
42
- `verification` reports requested, attempted, verified, technical, and failed
43
- counts; unverified or failed pages must keep lower confidence. Groups and
44
- templates show repeated patterns only within retained candidates.
45
-
46
- ## Act safely
47
-
48
- Audit a small number of high-impression candidates. Fix verified technical
49
- problems first; otherwise compare intent, title framing, page coverage, and
50
- internal links against observed query evidence. Do not rewrite a page solely
51
- because it sits inside the position band, and do not present the priority score
52
- as expected traffic or ranking lift.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Striking distance"
3
- short_description: "Find retained GSC query and page rows averaging positions 11 through 20"
4
- default_prompt: "Use $striking-distance to run the striking-distance report and explain its evidence and limits."
@@ -1,49 +0,0 @@
1
- ---
2
- name: technical-watch
3
- description: Coordinate crawl comparison, URL Inspection monitoring, and optional link recovery. Use it for a bounded recurring watch without claiming inventory-wide coverage.
4
- ---
5
-
6
- # Technical watch workflow
7
-
8
- This workflow watches several technical surfaces together: crawl change,
9
- sitemap-derived URL inspection, and optional recovery of historically valuable
10
- links. It is useful after releases and on a schedule. Its components have
11
- different coverage and freshness, so a successful run does not prove every URL
12
- is crawlable, indexed, unchanged, or free of issues.
13
-
14
- ## Run it
15
-
16
- Use the exact MCP discovery flow:
17
-
18
- 1. Call `seo_list_reports` with `category: "workflows"` and select `technical-watch`.
19
- 2. Call `seo_describe_report` with `id: "technical-watch"`; choose the components required.
20
- 3. Call `seo_run_report` with that id and only schema-valid parameters.
21
-
22
- CLI parity:
23
-
24
- ```sh
25
- seo reports describe technical-watch --json
26
- seo reports run technical-watch --params '{"site":"sc-domain:example.com","startUrl":"https://example.com/","sitemaps":["https://example.com/sitemap.xml"],"limit":250,"dailyLimit":200,"inspectLimit":25,"recoverLinks":true}' --json
27
- ```
28
-
29
- Provide `startUrl` for crawl comparison and `sitemaps` for index monitoring.
30
- `dailyLimit`, `inspectLimit`, `maxUrls`, and crawl `limit` are real coverage
31
- bounds. Enable `js` only when rendering is required.
32
-
33
- ## Interpret and act
34
-
35
- Inspect every workflow step and nested `crawl`, `index`, and `recovery` output
36
- independently. For crawls, compare run ids, limits, failures, warnings, and
37
- changed items. For inspection, distinguish selected, unselected-due, attempted,
38
- failed, quota-blocked, deferred, current issue, and regression states. URL
39
- Inspection is a provider snapshot; sitemap discovery is not proof of indexing.
40
- For recovery, historical clicks-at-risk are observed history, not forecast loss.
41
-
42
- Reproduce new failures, verify redirect chains and intentional controls, then
43
- fix confirmed regressions with a rollback path. Schedule another bounded run to
44
- confirm recovery. Never remove `noindex`, canonicals, robots rules, or redirects
45
- without checking intent. Partial crawls, capped sitemap inventories, quotas,
46
- and failed subqueries must stay visible in any all-clear statement.
47
-
48
- Use MCP `structuredContent` for automation and Markdown only for the human watch
49
- summary.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Technical watch workflow"
3
- short_description: "Run crawl-diff and URL Inspection monitoring together"
4
- default_prompt: "Use $technical-watch to run the technical-watch report and explain its evidence and limits."
@@ -1,38 +0,0 @@
1
- ---
2
- name: top-fixes
3
- description: Rank recurring technical crawl findings into a bounded implementation queue with visible scoring factors. Use for triage before inspecting affected URLs and rule-level evidence.
4
- ---
5
-
6
- # Prioritize technical fixes
7
-
8
- Large crawls need triage, but priority must remain explainable. This report groups issues by rule and ranks them using severity, affected-page count, estimated effort, and any available Search Console or analytics evidence. It is a deterministic queue from retained evidence, not a forecast of rankings, traffic, conversions, or revenue.
9
-
10
- ## Run it
11
-
12
- For MCP, call `seo_list_reports` with category `crawl` only when discovery is needed. Call `seo_describe_report` with `{ "id": "top-fixes" }`, then call `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "top-fixes",
17
- "params": {
18
- "reportId": "crawl_example_20260710",
19
- "category": "metadata",
20
- "limit": 5
21
- }
22
- }
23
- ```
24
-
25
- Confirm `isError` is false and read `structuredContent`. CLI parity is:
26
-
27
- ```sh
28
- seo reports describe top-fixes --json
29
- seo reports run top-fixes --params '{"reportId":"crawl_example_20260710","category":"metadata","limit":5}' --json
30
- ```
31
-
32
- Use `url` only for an intentional fresh crawl. Reusing a saved report keeps the queue tied to the same issue inventory.
33
-
34
- ## Turn priority into work
35
-
36
- Read `dataSources`, summary, warnings, and caveats before the ranked fixes. For each item inspect the rule id, affected count, sample URLs, `scoreFactors`, `whyThisRanks`, effort, fix guidance, and verification steps. Missing provider joins must stay unavailable; numeric zeros are meaningful only when the corresponding source is complete and valid.
37
-
38
- The category and result limits narrow the queue, while the original crawl may also be capped or partial. Therefore rank means "highest among retained eligible findings," not globally highest. Run `affected-urls` for the same rule and report id, inspect representative templates, and use `explain-crawl-issue` before assigning work. Confirm intentional indexability and canonical controls with the publisher. After implementation, repeat the same crawl configuration and verify the observed rule evidence rather than relying on a score change alone.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Top fixes"
3
- short_description: "Return a bounded technical fix queue from crawl evidence"
4
- default_prompt: "Use $top-fixes to run the top-fixes report and explain its evidence and limits."
@@ -1,52 +0,0 @@
1
- ---
2
- name: traffic-anomaly
3
- description: Test whether recent finalized GSC clicks or impressions differ unusually from an observed baseline; use it to confirm movement before investigating possible causes.
4
- ---
5
-
6
- # Detect unusual traffic movement
7
-
8
- Use `traffic-anomaly` when a dashboard looks different and you need a
9
- repeatable check against recent history. It compares a recent finalized GSC
10
- window with an observed baseline for clicks and impressions. Statistical
11
- unusualness helps decide whether deeper investigation is warranted. It does not
12
- identify a cause, diagnose a site defect, or prove that an external event
13
- affected the property.
14
-
15
- ## Run the report
16
-
17
- With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`. Call
18
- `seo_describe_report` with `{"id":"traffic-anomaly"}` before choosing windows.
19
- Then call `seo_run_report`, for example
20
- `{"id":"traffic-anomaly","params":{"site":"sc-domain:example.com","days":90,"recentDays":7,"refresh":false}}`.
21
-
22
- CLI parity uses the same report definition:
23
-
24
- ```sh
25
- seo reports describe traffic-anomaly --json
26
- seo reports run traffic-anomaly --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"refresh":false}' --json
27
- ```
28
-
29
- The discovery schema currently exposes broad numeric types for these window
30
- fields. Use sensible positive whole-day values even though all bounds are not
31
- expressed in JSON Schema.
32
-
33
- ## Interpret the output
34
-
35
- Read `coverage` first. Confirm the requested dates, expected and observed days,
36
- missing days, invalid rows, duplicate rows, and `status`. Partial coverage can
37
- change the baseline and must stay in the conclusion. `rows` is not a quality
38
- verdict.
39
-
40
- Each entry in `anomalies` names the metric, baseline and comparison dates,
41
- means and totals, `percentChange`, `zScore`, `significanceMethod`, `direction`,
42
- and `significant`. A null percentage from a zero baseline is different from
43
- zero change. `outside-flat-baseline` handles movement where an observed
44
- baseline has no variance; it still describes only the supplied data.
45
-
46
- ## Act safely
47
-
48
- If movement is significant and coverage is adequate, run `segment-impact` for
49
- pages and queries, then check site changes, seasonality, indexing, and tracking.
50
- If it is normal, keep monitoring rather than forcing a story. Never label the
51
- result a penalty, algorithm update, recovery, or causal diagnosis without
52
- independent evidence.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Traffic anomaly"
3
- short_description: "Detect statistically unusual recent GSC movement"
4
- default_prompt: "Use $traffic-anomaly to run the traffic-anomaly report and explain its evidence and limits."
@@ -1,51 +0,0 @@
1
- ---
2
- name: update-correlation
3
- description: Overlay finalized GSC anomaly windows with official Google ranking-update dates; use it for timing context while keeping attribution explicitly unestablished.
4
- ---
5
-
6
- # Add update timing context
7
-
8
- Use `update-correlation` only after defining the traffic window you want to
9
- examine. It combines the anomaly analysis with official ranking incident dates
10
- and known local changes. Overlap can make an update a reasonable investigation
11
- context. It cannot show that the update caused a gain or loss, even when the
12
- movement is large and no other change has been recorded.
13
-
14
- ## Run the report
15
-
16
- With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`. Call
17
- `seo_describe_report` with `{"id":"update-correlation"}`, then use
18
- `seo_run_report`, for example
19
- `{"id":"update-correlation","params":{"site":"sc-domain:example.com","days":90,"recentDays":7,"paddingDays":2,"refresh":false}}`.
20
-
21
- The same definition is available through the CLI:
22
-
23
- ```sh
24
- seo reports describe update-correlation --json
25
- seo reports run update-correlation --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"paddingDays":2,"refresh":false}' --json
26
- ```
27
-
28
- The schema currently types window and padding values as general numbers. Pass
29
- positive whole-day values and avoid excessive padding that makes overlap almost
30
- inevitable.
31
-
32
- ## Interpret the output
33
-
34
- Start with `classification`, but always keep `attribution` and `confidence` in
35
- view. The report intentionally returns attribution as `not-established` and
36
- confidence as `none`. Inspect the underlying `anomalies`, exact
37
- `overlappingUpdates`, and `confounders` before repeating the summary.
38
-
39
- Use `evidence` for observed movement and date overlap, `caveats` for window,
40
- padding, freshness, and source limits, and `source` to identify the official
41
- feed. `significant-movement-with-update-overlap` means both facts occurred in
42
- the configured window. `update-overlap-without-significant-movement` is not an
43
- impact result. `no-update-overlap` does not explain any movement that remains.
44
-
45
- ## Act safely
46
-
47
- Test saved deploys, redirects, pruning, blocking, tracking, and content changes
48
- first when they overlap. Use `segment-impact` or the postmortem workflow to map
49
- affected templates and queries. Preserve winning patterns and investigate
50
- losers with page-level evidence. Never describe temporal overlap as a penalty,
51
- reward, recovery, or confirmed algorithm effect.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Update correlation"
3
- short_description: "Compare recent GSC movement with official Google ranking update windows"
4
- default_prompt: "Use $update-correlation to run the update-correlation report and explain its evidence and limits."
@@ -1,49 +0,0 @@
1
- ---
2
- name: update-postmortem
3
- description: Compare retained winners and losers around a Google ranking update window. Use it to structure a postmortem while explicitly keeping causation unestablished.
4
- ---
5
-
6
- # Update postmortem workflow
7
-
8
- This workflow organizes performance movement around a known Google update,
9
- including template and segment evidence plus optional local change-log context.
10
- It helps identify where to investigate. Temporal overlap and exposure do not
11
- prove that the update caused any change, and retained winners and losers are not
12
- a complete property inventory when sources are capped or filtered.
13
-
14
- ## Run it
15
-
16
- Use the exact MCP discovery flow:
17
-
18
- 1. Call `seo_list_reports` with `category: "workflows"` and select `update-postmortem`.
19
- 2. Call `seo_describe_report` with `id: "update-postmortem"`; inspect the current schema.
20
- 3. Call `seo_run_report` with that id and only described parameters.
21
-
22
- CLI parity:
23
-
24
- ```sh
25
- seo reports describe update-postmortem --json
26
- seo reports run update-postmortem --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"limit":10,"includeBrand":false,"knownConfounders":["Site migration on 2026-05-12"],"includeChangeLog":true}' --json
27
- ```
28
-
29
- Record specific known confounders rather than vague suspicions. The change log
30
- is supporting context, not automatic attribution.
31
-
32
- ## Interpret and act
33
-
34
- Start with workflow step statuses, finalized date windows, source completeness,
35
- failed measurements, retained limits, and caveats. Then inspect `update`,
36
- `insights`, `templateMovement`, and `segments`. Keep positive and negative
37
- movement visible. The report's cause remains not established even when dates
38
- overlap. Compare like-for-like metrics and note brand filtering, invalid rows,
39
- duplicate aggregation, and partial provider results.
40
-
41
- Safe next steps are falsifiable: inspect representative URLs from affected
42
- segments, reproduce technical changes, compare deployed templates, validate the
43
- local change log, and measure a bounded intervention. Preserve known
44
- confounders in the handoff. Do not roll back, rewrite, merge, or delete content
45
- solely because it appears among losers. Never claim update causation, recovery
46
- probability, future traffic, or ranking impact from this workflow.
47
-
48
- Use MCP `structuredContent` as the machine contract and Markdown only for the
49
- human-readable postmortem.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Update postmortem workflow"
3
- short_description: "Analyze winners and losers around a Google ranking update window"
4
- default_prompt: "Use $update-postmortem to run the update-postmortem report and explain its evidence and limits."