v1.9.9: Final 1.x Patch - Drift Cleanup + Dependency Batch + Perfmatters Fix
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 equalset(skills/*) - {seo}. No duplicates.test_orchestrator_subagents_list_matches_disk- orchestrator's bulleted Subagents list must equalset(agents/seo-*.md). No duplicates.test_skill_metadata_versions_match_plugin_json- everyskills/*/SKILL.mdandextensions/*/skills/*/SKILL.mdmetadata.versionmust equalplugin.jsonversion, withseo-content-briefallowlisted at1.0.0. Scoped to YAML frontmatter only.test_marketplace_metadata_and_author_parity- marketplace.jsonmetadata.descriptionincludes both counts and they matchplugin.json; plugin entryauthorparitiesplugin.jsonauthor forname,email, ANDurl.
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-oauthlib1.4.0 drops Python 3.9 support. This repo'spyproject.tomlrequires Python>=3.10already, so no impact for the declared support matrix. External consumers still on 3.9 should pingoogle-auth-oauthlib<1.4.0themselves. -
Orchestrator Sub-Skills list was renumbered (added
seo-content-brief, removedseo-firecrawlfrom the numbered list - Firecrawl is now in a new "Optional Extensions" subsection because it lives inextensions/, notskills/). 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 fullaudit-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 | bashVerify
python3 -m pytest tests/ -v
# Expected: 39 passed (13 manifest + 15 sync_flow + 11 lazy detection)Full changelog: v1.9.8...v1.9.9