map-my-site
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/strategy.json keyword_plan and clusters |
what the tree is built from |
run what-to-target-next first |
data/snapshots/<latest>/crawl.json |
existing pages, matched before planning new ones |
run rainmaker audit |
SERP verdicts from can-i-actually-rank |
page type follows what actually ranks |
unchecked nodes are written but flagged, never briefed |
config.revenue_model |
selects the spine and permutation axis |
required in rainmaker.config.yml |
Produces
data/blueprint.json via rainmaker blueprint --build, monthly cohorts via rainmaker blueprint --tree.
Refuses when
No keyword plan exists yet, or config.revenue_model is unset. Both are required to select a spine; run what-to-target-next and check rainmaker.config.yml first.
Procedure
- Run
rainmaker blueprint --build. This assembles nodes from keyword_plan and clusters, matches each against crawl.json by normalised path (setting status: live on a match), and runs collision detection deterministically in code. Do not re-derive collisions by hand, and never allow two nodes to share a head query.
- Select the spine and permutation axis for
config.revenue_model from spec/site-blueprint.md section 5: sales-led roots in solutions and comparisons, local-services roots in services and areas, ecommerce in categories and collections, and so on.
- For every candidate permutation (
[service] in [area], [product] for [industry]), check all four gates before it becomes its own URL: measured demand, three or more substance fields that genuinely differ from every sibling, a proof point specific to the permutation, and remaining capacity inside the authority budget. Use src/blueprint/permutation.ts checkPermutation, which enforces the substance comparison byte for byte; do not eyeball it. A node failing any gate becomes a section on its parent, never its own URL.
- Assign a parent to every node. A category node needs 3 or more children to exist as its own page; fewer, and the children attach directly to the grandparent.
- Enforce the depth ceiling: no tier 0, 1 or 2 node sits deeper than 3 clicks from the root.
- Generate titles (60 chars) and meta descriptions (155 chars) for the whole node set together, so duplicates are caught across the set rather than per page.
- Run
rainmaker blueprint --tree to print the tree, the collision list, the authority budget (derived from the site's own measured indexation rate, never assumed), and the monthly cohorts.
- Report how many permutations were refused and why. A blueprint that produces many nodes and refuses none is a defect: it means the gates were not actually applied.
Decision rules
- One intent, one node, one URL, enforced by
detectCollisions, not by judgment.
- No node of tier 0, 1 or 2 below depth 3.
- No permuted node without all four gates passing.
- No cohort exceeding the authority budget from
src/blueprint/budget.ts, which is itself clamped to the floor whenever the site has published at volume with a low indexed rate, so past failure never earns a bigger budget.
Output
The tree, then the cohorts, then the refusal counts:
/ home tier 0 live
├── /services/ category tier 1 planned
│ └── /services/lobby-displays/ service tier 1 live
Nodes: <n> planned, <n> live
Permutations refused: <n> (<reason breakdown>)
Collisions: <n>
Authority budget: <n> pages per month (indexed_rate <x>, published_last_90d <n>)
Cohort 1: <node ids>
Done when
Collision detection ran and is reported, every permuted node passed all four gates or was demoted to a section, no tier 0-2 node sits below depth 3, and cohorts respect the computed authority budget.
1---2name: map-my-site3description: Turn the keyword plan into the whole intended site as a tree: one intent per URL, a parent for every node, titles and metas generated as a consistent set, permutations gated against doorway-page risk, and a publish rate bounded by what the site has demonstrated it can get indexed. Use this skill whenever the user asks to: - Plan their site structure or URL architecture - Decide how to organise services, locations, or product pages - Check whether their site is scaling permutations safely - Understand how many pages they can realistically publish per month Trigger even for casual requests like "site structure", "how should we organise the site", "map my site", "should each city get its own page", "how many pages can we publish a month".4---56# map-my-site78## 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/strategy.json` keyword_plan and clusters | what the tree is built from | run `what-to-target-next` first |33| `data/snapshots/<latest>/crawl.json` | existing pages, matched before planning new ones | run `rainmaker audit` |34| SERP verdicts from `can-i-actually-rank` | page type follows what actually ranks | unchecked nodes are written but flagged, never briefed |35| `config.revenue_model` | selects the spine and permutation axis | required in `rainmaker.config.yml` |3637## Produces3839`data/blueprint.json` via `rainmaker blueprint --build`, monthly cohorts via `rainmaker blueprint --tree`.4041## Refuses when4243No keyword plan exists yet, or `config.revenue_model` is unset. Both are required to select a spine; run `what-to-target-next` and check `rainmaker.config.yml` first.4445## Procedure46471. Run `rainmaker blueprint --build`. This assembles nodes from `keyword_plan` and `clusters`, matches each against `crawl.json` by normalised path (setting `status: live` on a match), and runs collision detection deterministically in code. Do not re-derive collisions by hand, and never allow two nodes to share a head query.482. Select the spine and permutation axis for `config.revenue_model` from `spec/site-blueprint.md` section 5: `sales-led` roots in solutions and comparisons, `local-services` roots in services and areas, `ecommerce` in categories and collections, and so on.493. For every candidate permutation (`[service] in [area]`, `[product] for [industry]`), check all four gates before it becomes its own URL: measured demand, three or more substance fields that genuinely differ from every sibling, a proof point specific to the permutation, and remaining capacity inside the authority budget. Use `src/blueprint/permutation.ts checkPermutation`, which enforces the substance comparison byte for byte; do not eyeball it. A node failing any gate becomes a section on its parent, never its own URL.504. Assign a parent to every node. A category node needs 3 or more children to exist as its own page; fewer, and the children attach directly to the grandparent.515. Enforce the depth ceiling: no tier 0, 1 or 2 node sits deeper than 3 clicks from the root.526. Generate titles (60 chars) and meta descriptions (155 chars) for the whole node set together, so duplicates are caught across the set rather than per page.537. Run `rainmaker blueprint --tree` to print the tree, the collision list, the authority budget (derived from the site's own measured indexation rate, never assumed), and the monthly cohorts.548. Report how many permutations were refused and why. A blueprint that produces many nodes and refuses none is a defect: it means the gates were not actually applied.5556## Decision rules5758- One intent, one node, one URL, enforced by `detectCollisions`, not by judgment.59- No node of tier 0, 1 or 2 below depth 3.60- No permuted node without all four gates passing.61- No cohort exceeding the authority budget from `src/blueprint/budget.ts`, which is itself clamped to the floor whenever the site has published at volume with a low indexed rate, so past failure never earns a bigger budget.6263## Output6465The tree, then the cohorts, then the refusal counts:6667```68/ home tier 0 live69├── /services/ category tier 1 planned70│ └── /services/lobby-displays/ service tier 1 live7172Nodes: <n> planned, <n> live73Permutations refused: <n> (<reason breakdown>)74Collisions: <n>75Authority budget: <n> pages per month (indexed_rate <x>, published_last_90d <n>)76Cohort 1: <node ids>77```7879## Done when8081Collision detection ran and is reported, every permuted node passed all four gates or was demoted to a section, no tier 0-2 node sits below depth 3, and cohorts respect the computed authority budget.