revive-old-pages
Context load
Run rainmaker context --check first. It prints what exists, what is stale, and exits 1 if anything this skill requires is missing.
Then read, in this order:
context/business.md in full. If absent, stop: "No business context. Run rainmaker audit, then the know-my-buyer skill."
context/voice.md if this skill writes prose. If absent, stop and say so.
context/glossary.md if this skill names products, features or competitors.
data/strategy.json if this skill reads or writes strategy.
- Only the
data/ files listed in this skill's Consumes table. Never crawl or call an API the core already covers.
If strategy.json.context_hash does not match the current hash of context/business.md, say exactly:
"Business context was edited after the strategy was written. Re-run know-my-buyer, or run rainmaker context --sync to accept the prose as authoritative."
Then stop.
If context/business.md carries confidence: stub, continue, and stamp every output with: "Built on a stub context. Nothing in it came from a buyer. Run know-my-buyer to replace it."
Consumes
| File |
Why |
If missing |
data/snapshots/<latest>/gsc.json (2+ snapshots) |
position and impression history |
"Need at least two Search Console snapshots. Run rainmaker fetch --source gsc again after 28 days." |
data/snapshots/<latest>/crawl.json |
word count, links, canonical status |
run rainmaker audit |
data/ledger.jsonl |
what was already shipped and its verification window |
run rainmaker ledger --rebuild |
data/blueprint.json |
cluster completeness, to prioritise refreshing under-covered clusters |
optional |
Produces
Classification report; keyword_plan[].slot (shared owner with what-to-target-next).
Refuses when
Fewer than two GSC snapshots exist. A single snapshot has no movement to classify against.
Procedure
- Classify every URL with GSC history into exactly one of:
- refresh: position declined 3 or more places, impressions still above 100, tier 0 to 2, over 600 words.
- rewrite: impressions fell 50 percent or more across two windows, cluster still
validated.
- consolidate: competes with another URL on a query, per the shared overlap detector, holding the smaller impression share.
- kill: tier 3 or 4, zero clicks across two consecutive windows, no inbound links from tier 0 to 2, no proof cited on the page.
- Join to
ledger.jsonl: exclude any page shipped inside its own verification window from src/ledger/types.ts VERIFICATION_WINDOWS. Judging a fix before its window closes manufactures noise, and this is the same rule the ledger itself enforces on shipped to verified.
- Rank by the score of the corresponding cluster.
- For every
kill, state the proposed redirect target. A kill without a redirect target is a broken link, not a cleanup.
- Prefer refreshing a cluster below 80 percent completeness (per
map-my-site) over starting a new one, when both are viable options for the same effort budget.
Decision rules
- Every URL gets exactly one classification. A page that could plausibly be two things is resolved, not left ambiguous.
- Never classify a page still inside its verification window; report it separately as "pending", matching the ledger's own
pendingVerification.
- A
kill always names its redirect target.
Output
## Content decay report
refresh (<n>):
<url>: position <before> to <after>, <impressions> impressions
rewrite (<n>):
<url>: impressions down <n>%, cluster status <validated|hypothesis>
consolidate (<n>):
<url>: competes with <url>, keep the larger impression share
kill (<n>):
<url>: 0 clicks over 2 windows, redirect to <target>
pending verification (<n>, excluded from the above):
<url>: shipped <date>, window closes <date>
Done when
Every URL with history has exactly one classification or sits in "pending", every kill names a redirect target, and nothing inside its own verification window was judged.
1---2name: revive-old-pages3description: Classify every URL with search history into refresh, rewrite, consolidate or kill, excluding anything still inside its own shipped verification window so a fix is never judged before it has had time to work. Use this skill whenever the user asks to: - Find content decay, or which pages are dying - Decide whether to refresh, rewrite or delete old content - Clean up an old blog or content library Trigger even for casual requests like "what should I update", "content decay check", "which posts are dying", "should we refresh or rewrite this", "clean up our old blog posts".4---56# revive-old-pages78## Context load910Run `rainmaker context --check` first. It prints what exists, what is stale, and exits 1 if anything this skill requires is missing.1112Then read, in this order:13141. `context/business.md` in full. If absent, stop: "No business context. Run `rainmaker audit`, then the `know-my-buyer` skill."152. `context/voice.md` if this skill writes prose. If absent, stop and say so.163. `context/glossary.md` if this skill names products, features or competitors.174. `data/strategy.json` if this skill reads or writes strategy.185. Only the `data/` files listed in this skill's Consumes table. Never crawl or call an API the core already covers.1920If `strategy.json.context_hash` does not match the current hash of `context/business.md`, say exactly:2122"Business context was edited after the strategy was written. Re-run `know-my-buyer`, or run `rainmaker context --sync` to accept the prose as authoritative."2324Then stop.2526If `context/business.md` carries `confidence: stub`, continue, and stamp every output with: "Built on a stub context. Nothing in it came from a buyer. Run `know-my-buyer` to replace it."2728## Consumes2930| File | Why | If missing |31|---|---|---|32| `data/snapshots/<latest>/gsc.json` (2+ snapshots) | position and impression history | "Need at least two Search Console snapshots. Run `rainmaker fetch --source gsc` again after 28 days." |33| `data/snapshots/<latest>/crawl.json` | word count, links, canonical status | run `rainmaker audit` |34| `data/ledger.jsonl` | what was already shipped and its verification window | run `rainmaker ledger --rebuild` |35| `data/blueprint.json` | cluster completeness, to prioritise refreshing under-covered clusters | optional |3637## Produces3839Classification report; `keyword_plan[].slot` (shared owner with `what-to-target-next`).4041## Refuses when4243Fewer than two GSC snapshots exist. A single snapshot has no movement to classify against.4445## Procedure46471. Classify every URL with GSC history into exactly one of:48 - **refresh**: position declined 3 or more places, impressions still above 100, tier 0 to 2, over 600 words.49 - **rewrite**: impressions fell 50 percent or more across two windows, cluster still `validated`.50 - **consolidate**: competes with another URL on a query, per the shared overlap detector, holding the smaller impression share.51 - **kill**: tier 3 or 4, zero clicks across two consecutive windows, no inbound links from tier 0 to 2, no proof cited on the page.522. Join to `ledger.jsonl`: exclude any page shipped inside its own verification window from `src/ledger/types.ts VERIFICATION_WINDOWS`. Judging a fix before its window closes manufactures noise, and this is the same rule the ledger itself enforces on `shipped` to `verified`.533. Rank by the score of the corresponding cluster.544. For every `kill`, state the proposed redirect target. A kill without a redirect target is a broken link, not a cleanup.555. Prefer refreshing a cluster below 80 percent completeness (per `map-my-site`) over starting a new one, when both are viable options for the same effort budget.5657## Decision rules5859- Every URL gets exactly one classification. A page that could plausibly be two things is resolved, not left ambiguous.60- Never classify a page still inside its verification window; report it separately as "pending", matching the ledger's own `pendingVerification`.61- A `kill` always names its redirect target.6263## Output6465```66## Content decay report6768refresh (<n>):69 <url>: position <before> to <after>, <impressions> impressions7071rewrite (<n>):72 <url>: impressions down <n>%, cluster status <validated|hypothesis>7374consolidate (<n>):75 <url>: competes with <url>, keep the larger impression share7677kill (<n>):78 <url>: 0 clicks over 2 windows, redirect to <target>7980pending verification (<n>, excluded from the above):81 <url>: shipped <date>, window closes <date>82```8384## Done when8586Every URL with history has exactly one classification or sits in "pending", every kill names a redirect target, and nothing inside its own verification window was judged.