Claude SEO v2.2.6: Security and Hosted Install
Claude SEO v2.2.6 is a security and hosted-install patch release.
Security
commoncrawl_graph.pyno longer writes outside its cache directory: the--release
value was interpolated raw into the cache filename, so--release ../../../../tmp/x
escaped the cache directory and_save_cachewrote there. Malformed releases are now
rejected at the CLI and path containment is asserted.domain_history.pyno longer follows an unvalidated WHOIS referral. The IANA
refer:host is resolved and validated throughurl_safetyand dialled at the
pinned address; an unusable referral degrades to IANA's own answer.url_safety.is_safe_ipnow refuses the RFC 6598 shared address space
(100.64.0.0/10), where Alibaba Cloud serves instance metadata, and judges
IPv4-mapped IPv6 literals by their embedded address. This also refuses Tailscale
addresses; see SECURITY.md.- WeasyPrint floor raised to 70.0 (PYSEC-2026-3940) and requests to 2.34.2
(CVE-2026-25645).pip-auditpasses. - SECURITY.md describes only reporting channels that exist: private vulnerability
reporting is enabled and the unreachable email fallback is gone.
Added
- The plugin installs from the claude.ai-hosted marketplace. Hosted sync rejects any
plugin with a top-levelbin/directory, so the launcher moved to
scripts/claude-seoand every skill, agent, and doc calls it as
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run <script.py>. Manual installs copy the
launcher to~/.claude/skills/seo/scripts/claude-seoand rewrite that token to the
absolute path. A layout test keepsbin/from coming back. Fixes #298 and #199. - CI runs the full suite on Windows and macOS, audits
requirements.txtwith
pip-audit, and no longer swallows a failed dependency install in the v2 audit. CLAUDE_SEO_CONFIG_DIRoverrides the config and ledger location, so the ledger tests
run against an isolated file.BANANA_HOMEdoes the same for the Banana ledger.preload_check.py --fail-under Nturns the score into an opt-in gate.- Regression coverage for the backlink report validator, the schema-hook UTF-8 output,
CRLF checkouts, PSI null category scores, ledger concurrency, the hosted plugin layout,
and every ledger kind accepted byseo_updates.py.
Changed
- Dependency floors raised by Dependabot: google-auth 2.56.2, courlan 1.4.0,
playwright 1.62.0, numpy 2.2.6 (a major bump from 1.26; matplotlib moves to 3.9.0,
the first line that supports numpy 2). seo-technicaltreats dynamic rendering as a workaround to flag, not a target state,
and recommends SSR, SSG, or CSR with a preferred-framework list.- The
seo-backlinksskill andfree-backlink-sources.mdno longer contradict each
other on Common-Crawl-only reports: no numeric score is produced, and
validate_backlink_report.pyfails a report that carries one. - The Repository Topology section of CLAUDE.md describes the two single-remote
checkouts and the cherry-pick promotion flow actually in use. - The three
test_sync_flow.pytests that call the live GitHub API run only when
CLAUDE_SEO_NETWORK_TESTS=1; both CI test jobs set it withGH_TOKEN.
Fixed
- The DataForSEO and Banana cost ledgers lost concurrent writes and could reset spend
history after a truncated write. One exclusive lock now spans each read-modify-write,
writes are atomic, Windows falls back tomsvcrt, and a corrupt ledger fails closed. pagespeed_check.pyraisedTypeErrorwhen a Lighthouse category returned a null
score; the category is now skipped and the page is kept.preload_check.pyexited 1 on every successful run that scored below 75. A completed
analysis exits 0. (#281)consistency_check.pyreported every FLOW-locked prompt as a hash mismatch on CRLF
checkouts; it folds CRLF before hashing.seo_updates.py --kind documentationwas rejected by argparse while the ledger used
that kind; the CLI and the schema now share one list.- Optional Google, Bing, and rendering dependencies missing at import time no longer
abort the whole pytest session (pytest.importorskipin the affected modules). - The schema-hook tests decode the hook's UTF-8 output explicitly instead of through the
locale codec, which is cp1252 on Windows.
Contributors
- Tobi | Nordalux
- Agrici Daniel
- dependabot[bot]
- Sergio
- Adam Burgess
- Nikolai V.
- nicokeim1308
- hwcgav
- Claude
Install
curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/v2.2.6/install.sh | bashFull review behind this release: docs/REVIEW-full-2026-09-10.md (46 PRs and 17 issues tested at their exact heads).