Skip to content

v1.9.9: Final 1.x Patch - Drift Cleanup + Dependency Batch + Perfmatters Fix

Choose a tag to compare

@AgriciDaniel AgriciDaniel released this 11 May 10:20

Final 1.x patch release. v2 is in design as a separate scope; v1.9.9 leaves the v1.x branch in a clean, dependency-current, well-documented state.

Independently reviewed across 5 rounds of Codex GPT-5.5 xhigh before each PR push.

What's in v1.9.9

PR Scope Closes
#93 Orchestrator + marketplace + AGENTS.md drift cleanup + 4 new CI assertions (9 -> 13) #92
#94 5-package Dependabot floor bumps batched + isolated-venv smoke-tested #76 #77 #78 #79 #80
#95 Perfmatters / EWWW / generic JS lazy-loader detection in parse_html.py + consumer wiring #41
#96 Atomic version bump (33 files: 5 top-level + 24 in-tree skills + 3 extensions + install scripts) -

Highlights

CI guard now covers 13 assertions

Closes the silent-ship surfaces the v1.9.8 guard missed:

  • test_orchestrator_sub_skills_list_matches_disk - orchestrator's numbered Sub-Skills list must equal set(skills/*) - {seo}. No duplicates.
  • test_orchestrator_subagents_list_matches_disk - orchestrator's bulleted Subagents list must equal set(agents/seo-*.md). No duplicates.
  • test_skill_metadata_versions_match_plugin_json - every skills/*/SKILL.md and extensions/*/skills/*/SKILL.md metadata.version must equal plugin.json version, with seo-content-brief allowlisted at 1.0.0. Scoped to YAML frontmatter only.
  • test_marketplace_metadata_and_author_parity - marketplace.json metadata.description includes both counts and they match plugin.json; plugin entry author parities plugin.json author for name, email, AND url.

Image audit now detects JS lazy-loaders

Issue #41 reported sites optimized with Perfmatters being audited as "not lazy-loaded" because the audit only checked the loading="lazy" HTML attribute. JS lazy-loaders intentionally strip that attribute and replace src with placeholders. scripts/parse_html.py now emits a lazy_method field on every image with one of 5 values:

lazy_method Signal Common stack
native loading="lazy" HTML attribute Modern browsers, plain HTML
perfmatters data-perfmatters-src / -srcset OR class perfmatters-lazy WordPress + Perfmatters
ewww data-ewww-src / data-eio OR class lazyload-eio WordPress + EWWW Image Optimizer
js-generic data-src / data-lazy-src / data-original / data-srcset OR class lazyload/lazyloaded/lazy lazysizes, vanilla-lazyload, jQuery
none Neither attribute nor class signal Page is not lazy-loading this image

Dependency floor bumps

Package Before After
playwright 1.56.0 1.59.0
weasyprint 61.0 68.1
openpyxl 3.1.0 3.1.5
google-api-python-client 2.100.0 2.196.0
google-auth-oauthlib 1.0.0 1.4.0

All upper bounds preserved. Smoke-tested in an isolated venv against the actual API surface.

Migration notes

  • google-auth-oauthlib 1.4.0 drops Python 3.9 support. This repo's pyproject.toml requires Python >=3.10 already, so no impact for the declared support matrix. External consumers still on 3.9 should pin google-auth-oauthlib<1.4.0 themselves.

  • Orchestrator Sub-Skills list was renumbered (added seo-content-brief, removed seo-firecrawl from the numbered list - Firecrawl is now in a new "Optional Extensions" subsection because it lives in extensions/, not skills/). No downstream consumer in this repo references sub-skills by index.

Deferred to v2

v1.9.9 explicitly scopes out items that need a fresh design conversation:

  • #11 SPA / CSR audit support
  • #51 Subagent research persistence
  • #61 google_report.py --type full audit-schema handling
  • #89 uv adoption
  • #53 seo-notebooklm skill
  • #46 path resolution + macOS SSL

Install

# Plugin install (recommended)
/plugin install claude-seo@agricidaniel-seo

# Manual install (now correctly resolves v1.9.9)
curl -fsSL https://github.com/AgriciDaniel/claude-seo/raw/main/install.sh | bash

Verify

python3 -m pytest tests/ -v
# Expected: 39 passed (13 manifest + 15 sync_flow + 11 lazy detection)

Full changelog: v1.9.8...v1.9.9