seo-learn
Monthly pattern extraction — scan measured experiments, find patterns with ≥3 wins, promote them into playbooks; collect losses and write them to lessons. TRIGG
npx skills add seo-learn
seo-learn — Turn Evidence Into Doctrine
The retro measures individual experiments. learn finds the patterns across many experiments and promotes them into playbooks. One experiment is a data point. Three converging experiments is a rule.
When to run
Monthly, on the 1st, as part of seo-rhythm-monthly. Or ad-hoc when the agent has accumulated enough experiments that a retro surfaced a repeated pattern.
Inputs
Read {workspace}/reports/seo/memory/experiments/.yaml where status: measured and measured within the last 90 days.
Workflow
Phase 1: Group experiments by pattern
Cluster by change.type and content-of-change similarity. Example patterns:
title_rewritewith "added number"title_rewritewith "added year"title_rewritewith "added bracket hook"desc_rewritewith "front-loaded value prop"schema_addof type FAQPageschema_addof type HowTonew_pageof templatealternativesinternal_links_addedbetween sibling pagescontent_refreshwith new data points addedmarkdown_versionadded to page
Phase 2: For each pattern, tabulate
Pattern: title_rewrite + add_number
Experiments: 5
Wins: 4 (avg lift: +34%, range +19% to +62%)
Losses: 0
Inconclusive: 1
Pattern: content_refresh + aggressive_rewrite (>50% content changed)
Experiments: 3
Wins: 0
Losses: 2 (avg regression: -18%)
Inconclusive: 1
Phase 3: Apply promotion rules
Promote to playbook when:
- ≥ 3 wins, AND
- 0 losses (or wins outnumber losses ≥ 3:1), AND
- Average lift is material (≥ 10% for CTR/traffic, ≥ 1 position for ranking, ≥ 5pp for citation rate)
- ≥ 2 losses in the same pattern, OR
- A single loss with Δ < -30% (severe)
- < 3 wins on the pattern
- Wins and losses roughly balanced
Phase 4: Write/update playbooks
For each pattern that meets promotion criteria, write or update {workspace}/reports/seo/memory/playbooks/{pattern-name}.md:
# Playbook: {pattern name}
When to apply
{Specific conditions under which this pattern wins. Be narrow —
a playbook that says "always do X" is useless.}
What to do
{Concrete steps. Include anti-patterns — what NOT to do within
this pattern.}
Why
{The mechanism. Why does this work? Cite the AEO/SEO principle
if relevant.}
When NOT to apply
{Edge cases where this pattern has failed or is expected to.}
Evidence
- {exp-id}: {page} → {lift}
- {exp-id}: {page} → {lift}
- {exp-id}: {page} → {lift}
{link all experiment IDs for auditability}
Last updated: {YYYY-MM-DD}
Status: active | deprecated | under-review
If a playbook already exists:
- Append new evidence to the Evidence list
- Update average lift in "Why" if it's shifted meaningfully
- If average lift dropped below threshold → move to
under-reviewstatus
Phase 5: Write lessons
For each pattern that failed ≥ 2 times OR had one severe failure, write lessons/lesson-{YYYY-MM-DD}-{short_id}.md:
# Lesson: {pattern name that fails}
What we tried
{The pattern in plain language.}
What happened
{The losses. Named experiments and numeric deltas.}
Why it failed
{Best-guess root cause. If unclear, say so — don't fabricate
a reason.}
Rule going forward
{Specific guardrail. Example: "Don't do aggressive rewrites
(>50% content changed) on pages with established rankings —
loses topical authority signals."}
Related
- {exp-ids}
- Playbook this updates: {link if applicable}
Phase 6: Update skill-level guardrails
If a lesson affects how another skill should behave, update that skill's SKILL.md to reference the lesson. Example: if we learn that "bundle changes into one experiment" consistently produces inconclusive results, update seo-experiment-log to warn against bundling.
This is how lessons become enforced defaults — the skill reads its own lessons before suggesting a change.
Phase 7: Write a learn summary
{workspace}/reports/seo/learn-log/learn-{YYYY-MM-DD}.md:
# Learn Summary — {month}
Playbooks promoted: {N}
- add-numbers-to-title (new, 5 wins)
- faq-schema-on-compare (updated, +2 wins)
Lessons written: {M}
- aggressive-content-rewrites (2 losses)
Still-experimenting (hold): {K}
- internal-linking-sprints: 2 wins, need 1 more to promote
- markdown-version-added: 3 open experiments still in measurement window
Retired playbooks: {P}
- bracket-hooks-in-titles — lift dropped below threshold in last 3 tests, moving to under-review
Quality bar
- [ ] Every measured experiment in the window is assigned to a pattern cluster
- [ ] No pattern is "promoted" with < 3 wins OR in the face of ≥ 2 losses
- [ ] Every new/updated playbook cites its experiment IDs (auditability)
- [ ] Every lesson has a concrete "rule going forward" — not vague reflection
- [ ] Learn summary exists at
learn-log/learn-{date}.md
What I refuse
- To promote a pattern with only 1–2 wins. That's not a pattern; that's an anecdote.
- To keep a playbook active when recent evidence contradicts it. Playbooks are living documents; they get demoted if they stop working.
- To write lessons like "we learned to be more careful". Every lesson needs a testable rule.
- To cluster too aggressively. If two patterns behave differently, they're different patterns, even if they look similar on the surface.
Integration
Reads:
experiments/.yaml(status: measured, in last 90 days)- Existing
playbooks/.mdandlessons/.md
playbooks/.md(create or update)lessons/.md(append-only, new files)learn-log/learn-{date}.md
~/.claude/skills/seo-optimize/SKILL.md~/.claude/skills/seo-create/SKILL.md~/.claude/skills/seo-experiment-log/SKILL.md
seo-rhythm-monthly(1st of month)- Ad-hoc by owner or by the agent when a retro surfaces enough evidence