Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions docs/runbooks/checkin.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,26 @@ On other days it adds nothing.
It reads `docs/work/EXECUTE-seo-recovery.md` and `docs/work/seo-recovery-panel.json`.
It uses the `nuxtseo` CLI for reads only. It needs `nuxtseo` on the PATH and a token from `NUXTSEO_TOKEN` or `nuxtseo login`.
If either is missing, the section is one blocked line.
Use CLI 0.5.8 or newer and its matching Skill.
Read `search watches`, `sitemaps submission`, and both exact Sitemaps with `sitemaps inspect` separately.
CLI 0.5.8 `pull` omits those reads.
The recovery brief records the exact Sitemap URLs and the dated setup evidence.

The 07:40 daily run precedes the expected Monday inspections. Label its SEO section provisional.
Read again after 09:00 Australia/Sydney, which matches Melbourne during this measurement window.
This prompt does not schedule that later read or change the daily schedule.
Run `pnpm checkin --save` after 09:00 on Monday, then follow the returned SEO prompt item.
Same-day reruns preserve the morning baseline.
Select each watch's latest Checkpoint by `checkedAt` and report its date with `dueAt`.
Separate Monday Checkpoints from older verdicts. Older or missing Checkpoints leave the weekly measurement incomplete.
A due time never proves completion. The comparison can remain on its Thursday cadence.
Report missing watches and missing Checkpoints separately from Google's unknown-to-Google verdict.
Keep active, quality-excluded, and retired groups separate. Preserve noindex and other exclusion states.

Google Sitemap inspection reads live. Bing Sitemap inspection returns a dated stored capture.
Site-level submission state does not prove an exact Sitemap is listed.
Neither listing nor watch enrollment proves Page indexing.
It never writes to NuxtSEO, gscdump, or Search Console.
Never request fresh inspections or start paid research reads during this report.
Crawl stats and the Pages report are not in any API, so Harlan supplies those screenshots.
On 2026-11-09 and 2026-11-16 the section adds the gate decision table.
47 changes: 41 additions & 6 deletions docs/work/EXECUTE-seo-recovery.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Status: open Β· 2026-10-03 Β· recovery implementation included in deployed `1ccf98ec`; gate 2026-11-11

**Next move:** Ready. Verify panel loading and sitemap submission evidence. Harlan submits any missing sitemaps. Run the first weekly measurement on 2026-10-12.
**Next move:** Run the first weekly measurement on 2026-10-12 after 09:00 Melbourne time. Check each Checkpoint date before comparison.

Done means: the gate table below has a decision for 2026-11-11, and every panel URL in [seo-recovery-panel.json](seo-recovery-panel.json) has a coverage state read on that date.

Expand All @@ -11,8 +11,8 @@ This brief supersedes the measurement plan in [EXECUTE-seo-keyword-rework.md](EX
## Ledger

- [x] Sprint 0 implementation and the fixed panel included in deployed `1ccf98ec`
- [ ] Verify Bing submission of `sitemap_index.xml` and Search Console submission of `retired.xml`
- [ ] Load the panel with `gscdump indexing watch add`
- [x] Verify Bing `sitemap_index.xml` and Google's exact retired child, `__sitemap__/retired-0.xml`, on 2026-10-08
- [x] Match all 41 panel URLs to Watched URLs on 2026-10-08
- [ ] Add a `b_linked` group of 10 Skill URLs to the panel before experiment B starts
- [ ] Add a NuxtSEO annotation on the day gscdump.com #557 goes live
- [ ] Weekly measurements 1 to 5 logged in the Log below, from 2026-10-12 to 2026-11-09
Expand All @@ -26,6 +26,18 @@ This brief supersedes the measurement plan in [EXECUTE-seo-keyword-rework.md](EX

## Log

- 2026-10-08 NuxtSEO CLI 0.5.8 read all 41 panel watches, including the writing comparison's first Checkpoint.
Its Checkpoint at `2026-10-08T08:34:39Z` reported `unknown_to_google`; its next due time was `2026-10-15T08:34:39Z`.
The other 40 watches were due on 12 October between 08:09:39 and 08:10:41 Melbourne time.
Those due times describe scheduling, not completed inspections.
Google's live exact-Sitemap read at `2026-10-08T12:45:57.177Z` listed `https://skilld.dev/__sitemap__/retired-0.xml`.
Google reported submission at `2026-09-30T16:21:54.774Z` and download at `2026-10-06T18:23:45.479Z`.
It reported 9,846 URLs, zero errors, one warning, and `isPending: false`.
Bing's stored capture at `2026-10-08T08:32:22Z` listed `https://skilld.dev/sitemap_index.xml` with status `Success`.
Bing reported submission at `2026-10-02T08:30:31.349Z` and crawling at `2026-10-06T17:32:56Z`, covering 9,853 URLs.
These provider records prove dated listing, not Page indexing. No Sitemap submission ran during these reads.
Reproduce with the read-only commands in Weekly measurement below.

- 2026-10-08 The quality gate excludes `browser-use/plugins/browser-use` from the active recovery baseline.
Production D1 retained its month-board admission from 2026-09-30, but recorded `seo_indexable=0` and `no_primary_trust_signal`.
Its score record was 4, dated 2026-10-06 03:00:35 UTC. The source resolved and the Repository was healthy.
Expand Down Expand Up @@ -236,9 +248,31 @@ Baseline: the Pages report of 2026-09-30. The curated URLs sit in "Discovered, c

## Weekly measurement

Every Monday from 2026-10-12, about 10 minutes. The first read waits for the spam update to end. Log one line per week in the Log above.
Every Monday from 2026-10-12, read after 09:00 Melbourne time, allowing about 10 minutes.
The 07:40 daily check-in precedes the expected inspections; its SEO section is provisional.
Follow the [check-in runbook](../runbooks/checkin.md#seo-recovery-measurement) for the later read. It is not separately scheduled.
The first read waits for the spam update to end. Log one line per week in the Log above.

Use NuxtSEO CLI 0.5.8 or newer with its matching Skill. Pass `--site s_08aae654 --json` on each command:

```sh
nuxtseo search watches --site s_08aae654 --json
nuxtseo sitemaps submission --site s_08aae654 --json
nuxtseo sitemaps inspect https://skilld.dev/__sitemap__/retired-0.xml --engine google --site s_08aae654 --json
nuxtseo sitemaps inspect https://skilld.dev/sitemap_index.xml --engine bing --site s_08aae654 --json
```

1. Read each panel URL's coverage state with `nuxtseo search indexing urls` or `nuxtseo search inspect`. Record the rung: unknown, discovered, crawled, indexed.
CLI 0.5.8 `pull` omits these reads. Google reads live; Bing returns a dated stored capture.
Record exact listing separately from Site-level submission state. Neither proves Page indexing.
Report unavailable evidence separately from a missing Sitemap. Do not submit or delete Sitemaps during measurement.

1. Match exact panel URLs to `search watches`. Report missing watches, extra watches, and empty Checkpoint lists separately.
Select each URL's latest Checkpoint by `checkedAt`. Retain its provider state, last crawl time, and `dueAt`.
Separate Monday Checkpoints from older verdicts, even after 09:00. Report older verdicts as last known, with dates.
A missing or older Checkpoint leaves that URL's weekly measurement incomplete. Never infer completion from `dueAt`.
Keep the comparison's Thursday cadence. Never request fresh inspections to align the panel.
Record the rung: unknown, discovered, crawled, indexed. Preserve noindex and other exclusion states separately.
Missing evidence is unavailable, not unknown to Google. Keep retained summary totals separate from panel counts.
Report `quality_excluded` separately. Exclude it from active recovery totals and experiment scale or kill decisions.
Recheck its quality eligibility each week. If eligibility changes, record the date before changing its group.
Keep its earlier observations in their original group. Never treat an intentional noindex as failed recovery.
Expand All @@ -251,7 +285,8 @@ Every Monday from 2026-10-12, about 10 minutes. The first read waits for the spa
| Share of 404, 410 and 301 responses | 21% |

3. Read impressions and clicks over 7 days, and impressions for the brand query `skilld`.
4. Read clean referring domains (`nuxtseo backlinks referring-domains`) and GitHub and Bing referral sessions.
4. Read clean referring domains from separately dated retained evidence, and GitHub and Bing referral sessions.
If backlink evidence is unavailable, say so. Do not start paid research to discover whether a result is cached.
5. Read the Pages report totals: "Crawled, currently not indexed" (baseline 51,962) and "Discovered, currently not indexed" (baseline 1,433).

Read no result before the September 2026 spam update ends, about 2026-10-08. The first read is 2026-10-12.
Expand Down
16 changes: 10 additions & 6 deletions shared/checkin-external.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,22 @@ Interpret this site evidence:
id: 'skilld.seo-recovery',
prompt: `Add the SEO recovery section only when the run date is a Monday from 2026-10-12 through 2026-11-16. Take the run date from \`observedAt\` in Australia/Sydney. On any other date add nothing and do not mention this item.
Week number: 1 on 2026-10-12, then plus 1 each Monday. Read \`docs/work/EXECUTE-seo-recovery.md\` and \`docs/work/seo-recovery-panel.json\` first. They own the experiments, the panel groups, and the gate. If either file is missing, report one blocked line naming it.
The 07:40 daily run precedes the expected Monday inspections. Before 09:00 Australia/Sydney, label this section provisional. Request a read after 09:00; do not wait or schedule another run. After 09:00, still check each Checkpoint date before using it as this week's evidence.
Setup, read only:
- Site ID \`s_08aae654\`. Run \`nuxtseo whoami --json\`. The token comes from \`NUXTSEO_TOKEN\` or the CLI login. If \`nuxtseo\` is absent or \`whoami\` fails, report one blocked line naming the missing binary or token. Propose nothing else. Never print the token.
- Read the \`nuxtseo-cli\` Skill and its \`references/indexing.md\` first. Quote counts the CLI ships. Name \`asOf\`. Never mix datasets. Never call an indexed count current.
- Use only reads: \`pull\`, \`search analytics timeseries\`, \`search analytics keywords --search skilld\`, \`search indexing summary\`, \`search indexing urls\`, and \`search inspect\`. Run \`backlinks referring-domains\` only if its evidence shows \`cache\` or \`no-provider\`, so it spends nothing.
- Never scan, resolve, dismiss, annotate, submit a sitemap, or write to NuxtSEO, gscdump, or Search Console.
- Read the \`nuxtseo-cli\` Skill and its command, protocol, and indexing references first. Require CLI 0.5.8 or newer for these reads. Follow its version and Skill checks. Pass \`--site s_08aae654 --json\` on every Site read.
- Use only reads: \`pull\`, \`search analytics timeseries\`, \`search analytics keywords --search skilld\`, \`search indexing summary\`, \`search indexing urls\`, \`search inspect\`, \`search watches\`, \`sitemaps submission\`, and \`sitemaps inspect\`. Run the last three separately; CLI 0.5.8 \`pull\` omits them. Use \`--period 7d\` for both analytics reads. Quote counts the CLI ships. Never mix datasets or call retained indexing counts current.
- Never scan, resolve, dismiss, annotate, submit or delete a sitemap, or write to NuxtSEO, gscdump, or Search Console. Never pass \`--fresh\` or \`--yes\`. Use only retained backlink evidence already available; do not start research reads to discover whether they spend quota.
Report a compact "SEO recovery" section with:
- Week number and the run date.
- Clicks and impressions for 7d against the previous 7d and against the 2026-09-30 baseline in the brief. Say which dataset each figure came from.
- The position of the brand query \`skilld\`.
- Indexing summary: \`totalUrls\`, \`indexed\`, \`asOf\`, and the capture age in days. A null \`asOf\` means the capture time is unavailable.
- For each panel group, the count of URLs at each rung: unknown, discovered, crawled, indexed. Read the panel URLs with \`search indexing urls\`. Read gscdump Watched URL checkpoints for the same URLs only if gscdump 4.6.0 or newer is installed and the panel is watched. Otherwise write "gscdump Watched URLs not available" and continue. Report Bing per-URL status only if gscdump holds Bing data for skilld. Otherwise say so.
- Clean referring domains, excluding the 20 spam network domains named in the brief.
- Indexing summary: \`totalUrls\`, \`indexed\`, \`oldestCheckAt\`, \`asOf\`, and capture age in days. Include \`verdictFreshness\` when present. A null \`asOf\` means the capture time is unavailable.
- Run \`search watches\` and match exact URLs against every panel group. Report missing watches, extra watches, and watches without Checkpoints separately. Never infer enrollment from an indexing URL list. For each matched URL, select the latest Checkpoint by \`checkedAt\`; retain its \`coverageState\`, \`googleCoverageState\`, \`lastCrawlTime\`, and the watch's \`dueAt\`.
- Group those retained verdicts by the panel groups. Report unknown, discovered, crawled, and indexed counts. Preserve other states such as noindex, redirects, and not-found separately. Missing evidence is unavailable, never unknown to Google. Keep summary totals separate from panel counts.
- Separate Checkpoints dated this Monday in Australia/Sydney from older Checkpoints. Report older verdicts as last known, with dates. Show each pending or overdue watch's \`dueAt\`. An elapsed due time never proves an inspection ran. A future due time does not make an older Checkpoint fresh. A missing or older Checkpoint leaves that URL's weekly measurement incomplete. The comparison can follow a Thursday cadence; never force a fresh inspection to align it.
- Read \`sitemaps submission\` for Site-level state and \`callerCanAct\`. Inspect \`https://skilld.dev/__sitemap__/retired-0.xml --engine google\` and \`https://skilld.dev/sitemap_index.xml --engine bing\` with \`sitemaps inspect\`. Quote each exact URL, state, capture source, capture time, and provider submission and download dates. Keep Google's live read separate from Bing's stored capture. Missing and unavailable are different results. Listing never proves Page indexing. Report each failed read's exit code and request ID. Never report a missing Sitemap from a failed read or try another transport.
- Bing per-URL indexing and clean referring domains: use separately dated retained evidence only. Sitemap listing proves neither. If unavailable, say so. Exclude the 20 spam network domains from referring-domain counts.
- Report \`quality_excluded\` separately. Exclude its URLs from active recovery totals, experiment scale or kill decisions, and content or domain verdicts. Recheck quality eligibility. Report any change with its observation date; preserve earlier observations in their original group.
- Each experiment's scale or kill rule from the brief, read as met, not met, or not yet readable. Give the evidence and the read date. Experiment B needs the \`b_linked\` group in the panel. Before that, it is not yet readable.
- State that Search Console Crawl stats and the Pages report are not in any API. Ask Harlan for two screenshots: Crawl stats, and the Pages report "Why pages aren't indexed".
Expand Down
Loading