what-to-target-next
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.mdin full. If absent, stop: "No business context. Runrainmaker audit, then theknow-my-buyerskill."context/voice.mdif this skill writes prose. If absent, stop and say so.context/glossary.mdif this skill names products, features or competitors.data/strategy.jsonif 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/strategy.json clusters, with SERP verdicts from can-i-actually-rank |
what to slot | run pick-my-battles then can-i-actually-rank first |
data/snapshots/<latest>/gsc.json |
positions and impressions per candidate | continue at reduced confidence |
data/snapshots/<latest>/crawl.json |
which URLs already exist, for slot classification | run rainmaker audit |
data/blueprint.json |
the site's own authority budget, if a blueprint exists | continue without a cap, and say so |
Produces
keyword_plan (owner). slot is shared with revive-old-pages.
Refuses when
A candidate has no SERP verdict at all (unchecked). Only QUALIFY and CONDITIONAL candidates from can-i-actually-rank may enter the plan; an unchecked or KILLed candidate is excluded, not silently downgraded.
Procedure
- For every cluster, take GSC queries whose text overlaps the head or support queries, plus any striking-distance queries from
find-my-quick-winsmapped to that cluster. - Assign a slot:
refreshwhen a tier-appropriate URL exists and ranks 4 to 20.consolidatewhen 2 or more URLs compete on the query, per the same overlap rulefind-my-quick-winsandrevive-old-pagesuse.newwhen no URL exists.killwhen a URL exists, ranks beyond 50, has zero clicks in two consecutive windows, and its tier is 3 or 4.
priority_scorecomes fromsrc/analyze/scoring.tsvia the CLI; never invent it here.- Cap the plan at the site's authority budget from
data/blueprint.jsonif one exists. A plan nobody can execute is not a plan. - State how many candidates were dropped for exceeding the cap, and the score of the highest dropped item, so the cutoff is visible rather than silent.
Decision rules
- Only QUALIFY and CONDITIONAL verdicts enter the plan.
- Never assign
priority_scoreby judgment; it is always the score the CLI computed. - A
killslot always proposes a redirect target, matchingrevive-old-pages's rule that a kill without a redirect is a broken link.
Output
## Keyword plan
<query>: cluster <id>, slot <new|refresh|consolidate|kill>, score <x>
target: <url or "none">
Capped at <n> slots (authority budget). Dropped <n>, highest dropped score <x>.
Done when
Every slot has a cluster id, a slot type and a CLI-sourced priority score, the plan respects the authority budget when one exists, and every kill slot names a redirect target.