Skip to content

feat(seo-hermit): new SEO/site-health domain plugin (PROP-014)#503

Open
gtapps wants to merge 2 commits into
mainfrom
feat/seo-hermit
Open

feat(seo-hermit): new SEO/site-health domain plugin (PROP-014)#503
gtapps wants to merge 2 commits into
mainfrom
feat/seo-hermit

Conversation

@gtapps

@gtapps gtapps commented Jul 3, 2026

Copy link
Copy Markdown
Owner

Summary

New domain plugin seo-hermit (PROP-014): a weekly-cadence watcher over Google Search Console, broken links, and Core Web Vitals, whose defensible slice is the judgment layer — correlating a regression with a specific site-repo commit and drafting the mechanical fix. Read-only toward Google; write-only toward the operator's own repo, behind an approval gate.

This overrides the domain-hermit freeze at explicit operator request (recorded in the proposal and commit). Scoped to the smallest honest version so the downside of the override is bounded.

Changes

  • Scaffold — manifest triad (plugin.json / hermit-meta.json / root marketplace.json), CLAUDE.md, README.md, docs/knowledge-schema.md, settings.json, CLAUDE-APPEND.md, MIT LICENSE, .gitignore, and .github/workflows/test-seo.yml (Bun-only CI, cloned from test-fitness.yml). Requires core claude-code-hermit ≥1.2.14.
  • scripts/site-api.ts — zero-dependency Bun client (stdlib + node:crypto only). Service-account JWT-bearer auth; subcommands check / search-analytics / sitemap / link-check / psi / inspect / ledger. Credentials are read from .env, never argv, never printed.
  • skills/hatch — 9-step idempotent setup: live GSC verification round-trip, .env collected via the Read tool only (never the service-account JSON — it holds a private key), CLAUDE-APPEND inject, weekly-routine registration.
  • skills/site-health-check — weekly routine: pull Search Console deltas, link-check the sitemap, sample CWV, inspect a rotating budget of URLs, diff against state/site-health-ledger.json, report only what changed. A quiet week is one line.
  • skills/site-regression-triage (read-only commit correlation) and skills/site-draft-fix (approval-gated, closed fix list, never pushes, never touches a protected branch).
  • Tests — 37 unit tests (site-api + ledger) and 28 skill-structure checks.

Deliberate corrections vs the proposal

  • The Search Console API has no bulk Index Coverage endpoint — replaced with budgeted per-URL urlInspection (rotated via a ledger cursor, ~2,000/day/property quota).
  • The rolling ledger lives in state/ (not compiled/, which auto-archives).
  • The weekly routine invokes the skill directly (core weekly-review pattern), not a drop-once prompt_file.

Test plan

  • cd plugins/seo-hermit && bash tests/run-all.sh → 37 unit + 28 structure checks pass.
  • bunx tsc from repo root → clean (strict).
  • plugin-validator → 12/12; native claude plugin validate . passes.
  • Ledger diff engine verified end-to-end through the real CLI: baseline run → −20% search-regression detection on the next run → broken-link lifecycle → inspect-cursor advance.

Notes

  • Single-domain per install by design (one SEO_HERMIT_SITE_URL / sitemap / ledger), matching the one-hermit-per-product model. A "several sites you own" variant (a sites array keyed ledgers) is a possible follow-up; multi-tenant is explicitly out of scope.
  • Deferred (not a blocker): the ledger's index map never prunes URLs that drop out of the sitemap — a minor leak on high-churn sites that needs a behavior change (plumbing the sitemap set into diffLedger), so it was left out of the cleanup pass.
  • Version stays 0.0.1; this does not ship to operators until /release seo-hermit.

gtapps added 2 commits July 3, 2026 01:52
Weekly watcher over Search Console, broken links, and Core Web Vitals with a
regression-to-commit judgment layer. Ships hatch (live GSC verify), the
site-health-check routine plus a mechanical ledger diff engine, and the
site-regression-triage / site-draft-fix skills. Zero-dep Bun client
(scripts/site-api.ts) with node:crypto JWT-bearer GSC auth. Read-only toward
Google, approval-gated toward the operator's own repo.

Overrides the domain-hermit freeze at explicit operator request; corrects
PROP-014's non-existent bulk Index Coverage API to budgeted per-URL inspection.

Claude-Session: https://claude.ai/code/session_014tRmc6NhfXWu1sB6jtUMFW
Three review fixes to the weekly diff engine, all cases where the report
lied to the operator rather than crashed:

- Broken links outside this run's link-check budget/set are no longer
  falsely reported as "resolved" — only URLs actually re-checked this run
  can clear. Prevents a persistent broken link from being silently cleared
  when the sitemap grows or reorders past the budget window.
- CWV and index verdict transitions are classified by direction (shared
  CWV_RANK ordinal / PASS-in vs PASS-out) instead of equality-to-best, so
  a poor→needs-improvement recovery is an improvement, not a regression.
  Directionless index flips (FAIL→NEUTRAL) go to notes and keep the week
  non-quiet rather than being swallowed.
- Link checker retries GET on 403/400 as well as 405/501, so HEAD-hostile
  CDNs/WAFs don't surface pages that serve fine on GET as broken links.

Adds regression tests for each.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant