From 412786e016b0f6ef84382e5a1a3f5afd2d52bd5c Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Thu, 8 Oct 2026 12:39:27 +1100 Subject: [PATCH] fix(seo): separate quality exclusions from recovery baseline --- docs/work/EXECUTE-seo-recovery.md | 21 ++++++++++++++++++++- docs/work/seo-recovery-panel.json | 9 ++++++++- shared/checkin-external.ts | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/work/EXECUTE-seo-recovery.md b/docs/work/EXECUTE-seo-recovery.md index d92832ba..71f27f52 100644 --- a/docs/work/EXECUTE-seo-recovery.md +++ b/docs/work/EXECUTE-seo-recovery.md @@ -26,6 +26,19 @@ This brief supersedes the measurement plan in [EXECUTE-seo-keyword-rework.md](EX ## Log +- 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. + Curator reasons, approved social posts, owner verification, and trust overrides were absent. + The official Repository list names `browser-use/browser-use`, not `browser-use/plugins`. + GitHub returned [the source](https://github.com/browser-use/plugins/blob/main/grok/skills/browser-use/SKILL.md) at D1's blob SHA, `0acbe30cb641795319aab5b3885dc0415266b375`. + HTML returned noindex with a self-canonical URL. The Skills sitemap omitted it. + [The quality rule](../../layers/registry/server/utils/skill-indexability.ts) requires a primary trust signal. + [Trending admission](../../layers/registry/server/utils/trending-admission.ts) preserves admission, but does not waive that rule. + Move the URL to `quality_excluded`; keep all 41 original URLs and the dated baseline evidence. + The active trending sample has 19 URLs. No replacement receives the excluded URL's history. + These reads do not establish when the URL first became noindex. + - 2026-10-05 Harlan approved experiment F for `/compare/humanize-writing-skills` at the existing 11 November gate. One comparison joins the panel, taking it from 40 to 41 URLs. Existing groups remain unchanged. The target query estimate is 30 US searches per month. This is a named experiment exception to the volume bar. @@ -208,7 +221,8 @@ After #557 is live, the counts behind each coverage bucket change meaning. Triag | Group | URLs | Treatment | Expect | | --- | ---: | --- | --- | -| `trending_sample` | 20 | None. No template change | Baseline for admitted trending pages | +| `trending_sample` | 19 | None. No template change | Baseline for admitted trending pages | +| `quality_excluded` | 1 | Quality gate excludes the page | Observe coverage separately; omit from active recovery decisions | | `d_probe` | 2 | One linked page and one unlinked page (experiment D) | The linked page is crawled within 14 days; the unlinked page is the comparison | | `demand` | 3 | High search demand, in the trending set | First to earn impressions if indexed | | `admitted_other` | 10 | Trending set only | Trending-only baseline | @@ -225,6 +239,9 @@ Baseline: the Pages report of 2026-09-30. The curated URLs sit in "Discovered, c 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. 1. Read each panel URL's coverage state with `nuxtseo search indexing urls` or `nuxtseo search inspect`. Record the rung: unknown, discovered, crawled, indexed. + 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. 2. Read Search Console crawl stats in the UI. This is the leading signal. | Signal | Baseline | @@ -306,6 +323,8 @@ Sprint 0 item 1 is the base for every experiment. Only Skills admitted from the The gate falls about 3 months after the last large removal. +Apply this table to active experiment URLs. The `quality_excluded` group cannot establish a content or domain verdict. + | Panel result | Read | Decision | | --- | --- | --- | | Experiment URLs indexed | The recovery path is open | Stay. Scale the page type that indexed. Lift the freeze step by step | diff --git a/docs/work/seo-recovery-panel.json b/docs/work/seo-recovery-panel.json index b303c7e6..90b2bcf1 100644 --- a/docs/work/seo-recovery-panel.json +++ b/docs/work/seo-recovery-panel.json @@ -30,10 +30,17 @@ "https://skilld.dev/gh/antfu/skills/nitro", "https://skilld.dev/gh/addyosmani/web-quality-skills/accessibility", "https://skilld.dev/gh/getsentry/skills/prompt-optimizer", - "https://skilld.dev/gh/browser-use/plugins/browser-use", "https://skilld.dev/gh/prisma/skills/prisma-database-setup" ] }, + "quality_excluded": { + "pr": "skilld.dev#322", + "expect": "observe coverage separately; exclude from active recovery totals and scale or kill decisions while the quality gate rejects it", + "observed_at": "2026-10-08", + "previous_group": "trending_sample", + "reason": "Production D1: trending admission retained; source resolved; seo_indexable=0, score=4, no_primary_trust_signal. No curator reason, approved social post, owner verification, official Repository entry, or trust override. HTML is noindex and the Skills sitemap omits it.", + "urls": ["https://skilld.dev/gh/browser-use/plugins/browser-use"] + }, "d_probe": { "pr": "gscdump#149", "expect": "gscdump is linked from gscdump.com and its docs; nuxtjs-seo is unlinked (nuxtseo.com#1314 dropped 2026-10-01). The linked page should be crawled within 14 days, the unlinked one is the comparison", diff --git a/shared/checkin-external.ts b/shared/checkin-external.ts index 5e9a3f3f..7dee758c 100644 --- a/shared/checkin-external.ts +++ b/shared/checkin-external.ts @@ -52,6 +52,7 @@ Report a compact "SEO recovery" section with: - 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. + - 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". On 2026-11-09 and 2026-11-16 also add the gate decision table from the brief. Give each row the panel evidence and the result: stay, cut harder, or domain verdict. The brief dates the gate 2026-11-11. Label the read as the run date. Never treat the September 2026 spam update window as readable before 2026-10-12.`,