Context
@tobiu flagged (2026-06-08) that the SEO generator assigns a flat 0.9 priority to all release notes. Surfaced now because #12728's recursive glob (merged) makes the generator collect all release-note files (vs 1 before), so a sitemap regen emits the whole catalog at 0.9.
V-B-A:
buildScripts/docs/seo/generate.mjs getPriority(): if (id.startsWith('/news/releases/')) return 0.9; — flat, no recency.
- Release-note distribution (
find resources/content/release-notes -name '*.md'): 167 total — v8: 72, v9: 27, v10: 35, v11: 30, v12: 2, v13: 1. So ~99 (59%) are ancient v8/v9 patch notes.
- Curated evergreen tier (the
PRIORITIES map): MCP guides 1.0; blog / key benefits / landing 0.9; most guides 0.7–0.8. The other /news/* is already below evergreen (pulls 0.6, tickets 0.5, discussions 0.4). Release notes are the lone value-inversion.
package.json version = 12.1.0 (v13 is in-progress, not yet cut) — relevant to the recency anchor (below).
- Live latest-open sweep (2026-06-08): no equivalent ticket.
The Problem
Flat-0.9-for-all-release-notes does two harms once the recursive glob regenerates the sitemap:
- Value inversion — a 5-year-old
v8.1.2 patch note at 0.9 is priority-equal to the blog posts and above the building-blocks guides (0.8). Backwards.
- Signal dilution — flooding the
0.9 tier (currently ~25 curated routes) with 167 release notes makes <priority> useless as the crawl-budget hint it exists to be; crawlers spread budget thin instead of refreshing landing / guides / current-release first.
The Architectural Reality
- Owning surface:
buildScripts/docs/seo/generate.mjs getPriority() (the central priority resolver, ~line 139).
collectReleaseRoutes() already semver-sorts + parses version per release — recency data is in hand.
- Recency anchor:
package.json is 12.1.0 (lags the in-progress v13), so a naive "delta from package.json major" mis-anchors. Anchor on the max release-note major (currently 13) OR a static per-major map (operator-tunable).
- Scope: only
/news/releases/ — the other /news/* (tickets/pulls/discussions) are already sensibly below evergreen.
The Fix
Replace the flat return 0.9 for /news/releases/ in getPriority with a recency-tiered value. Operator-confirmed mapping (@tobiu):
| Releases |
Priority |
Note |
| v13.x (in-progress current) |
0.9 |
the release everyone searches |
| v12.x (current published) |
0.9 |
only 2 releases — no tier flood |
| v11.x |
0.7 |
last full generation |
| v10.x |
0.6 |
extended (confirm) |
| v9.x |
0.5 |
extended — = DEFAULT → omitted from sitemap |
| v8.x |
0.4 |
extended — ancient patch notes |
(v13/v12 = 0.9 and v11 = 0.7 are operator-specified; v10–v8 extended for a smooth decay below the evergreen 0.7+ tier — confirm in review.)
Implementation — two viable shapes (settle in PR):
- (a) delta from the max release-note major (self-maintaining):
δ0/δ1 = 0.9, δ2 = 0.7, δ3 = 0.6, δ4 = 0.5, δ5+ = 0.4.
- (b) static per-major map (explicit, operator-tunable per release).
Either reads the version already parsed by collectReleaseRoutes. Do NOT anchor on package.json major (it lags the in-progress release).
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
getPriority('/news/releases/…') |
@tobiu directive + sitemap crawl-budget semantics |
recency-tiered (current/recent 0.9, decaying to 0.4 for ancient) |
DEFAULT_PRIORITY 0.5 if version unparseable |
inline JSDoc |
unit test asserts the tier per major |
evergreen PRIORITIES map |
existing curated map |
UNCHANGED — now genuinely outranks old release notes |
n/a |
n/a |
sitemap diff: old releases < 0.7 |
Decision Record impact
none — heuristic tuning of an existing build-script resolver; no ADR.
Acceptance Criteria
Out of Scope
- The other
/news/* priorities (tickets/pulls/discussions) — already sensibly below evergreen.
- The curated
PRIORITIES evergreen map — unchanged.
- The #12728 recursive glob + the #12749 mutable-link guard (sibling
generate.mjs work).
Related
- #12728 — recursive glob; surfaced all 167 releases into the sitemap, exposing the flat-
0.9.
- #12749 — sibling
generate.mjs work (the /blob/main mutable-link guard).
- #12696 — v13 release epic (timely for the v13 sitemap regen; not release-blocking).
Origin Session ID: 728442d6-a2a0-4481-a631-a3112ce6d703
Retrieval Hint: "release-note SEO sitemap priority recency tier flat 0.9 getPriority generate.mjs #12728"
Authored by Claude Opus 4.8 (neo-opus-vega, Claude Code).
Context
@tobiu flagged (2026-06-08) that the SEO generator assigns a flat
0.9priority to all release notes. Surfaced now because #12728's recursive glob (merged) makes the generator collect all release-note files (vs 1 before), so a sitemap regen emits the whole catalog at0.9.V-B-A:
buildScripts/docs/seo/generate.mjsgetPriority():if (id.startsWith('/news/releases/')) return 0.9;— flat, no recency.find resources/content/release-notes -name '*.md'): 167 total — v8: 72, v9: 27, v10: 35, v11: 30, v12: 2, v13: 1. So ~99 (59%) are ancient v8/v9 patch notes.PRIORITIESmap): MCP guides1.0; blog / key benefits / landing0.9; most guides0.7–0.8. The other/news/*is already below evergreen (pulls0.6, tickets0.5, discussions0.4). Release notes are the lone value-inversion.package.jsonversion = 12.1.0 (v13 is in-progress, not yet cut) — relevant to the recency anchor (below).The Problem
Flat-
0.9-for-all-release-notes does two harms once the recursive glob regenerates the sitemap:v8.1.2patch note at0.9is priority-equal to the blog posts and above the building-blocks guides (0.8). Backwards.0.9tier (currently ~25 curated routes) with 167 release notes makes<priority>useless as the crawl-budget hint it exists to be; crawlers spread budget thin instead of refreshing landing / guides / current-release first.The Architectural Reality
buildScripts/docs/seo/generate.mjsgetPriority()(the central priority resolver, ~line 139).collectReleaseRoutes()already semver-sorts + parsesversionper release — recency data is in hand.package.jsonis12.1.0(lags the in-progress v13), so a naive "delta frompackage.jsonmajor" mis-anchors. Anchor on the max release-note major (currently 13) OR a static per-major map (operator-tunable)./news/releases/— the other/news/*(tickets/pulls/discussions) are already sensibly below evergreen.The Fix
Replace the flat
return 0.9for/news/releases/ingetPrioritywith a recency-tiered value. Operator-confirmed mapping (@tobiu):= DEFAULT→ omitted from sitemap(v13/v12 =
0.9and v11 =0.7are operator-specified; v10–v8 extended for a smooth decay below the evergreen0.7+tier — confirm in review.)Implementation — two viable shapes (settle in PR):
δ0/δ1 = 0.9, δ2 = 0.7, δ3 = 0.6, δ4 = 0.5, δ5+ = 0.4.Either reads the
versionalready parsed bycollectReleaseRoutes. Do NOT anchor onpackage.jsonmajor (it lags the in-progress release).Contract Ledger Matrix
getPriority('/news/releases/…')0.9, decaying to0.4for ancient)DEFAULT_PRIORITY0.5if version unparseablePRIORITIESmap< 0.7Decision Record impact
none — heuristic tuning of an existing build-script resolver; no ADR.
Acceptance Criteria
getPrioritygives/news/releases/a recency-tiered priority (not flat0.9): v13/v12 →0.9, v11 →0.7, older decaying to0.4.0.7–1.0) — no value-inversion.package.jsonmajor (it lags the in-progress v13); anchor on max-release-note-major or a static map.0.9, v8 =0.4)./news/*(tickets/pulls/discussions) or the curatedPRIORITIESmap.Out of Scope
/news/*priorities (tickets/pulls/discussions) — already sensibly below evergreen.PRIORITIESevergreen map — unchanged.generate.mjswork).Related
0.9.generate.mjswork (the/blob/mainmutable-link guard).Origin Session ID: 728442d6-a2a0-4481-a631-a3112ce6d703 Retrieval Hint: "release-note SEO sitemap priority recency tier flat 0.9 getPriority generate.mjs #12728"
Authored by Claude Opus 4.8 (neo-opus-vega, Claude Code).