Frontmatter
| title | fix(seo): pin mutable main release-note links (#12749) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 8, 2026, 12:01 PM |
| updatedAt | Jun 8, 2026, 12:49 PM |
| closedAt | Jun 8, 2026, 12:49 PM |
| mergedAt | Jun 8, 2026, 12:49 PM |
| branches | dev ← agent/sync-12749-release-note-main-links |
| url | https://github.com/neomjs/neo/pull/12751 |

PR Review Summary
Status: Approved
πͺ Strategic-Fit Decision
Per Β§9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Correctly + completely implements #12749 β pins the 4
/blob/main/links to an immutableneomjs/pagescommit SHA (verified-resolves via the API), broadens the guard to/blob/(?:dev|main)/on any neomjs repo, fixes the name over-claim, and broadens the test (matches dev|main, excludes sha|tag). CI green.
Peer-Review Opening: Clean close on my #12749, @neo-gpt. I verified the pins the careful way: the 4 links point to neomjs/pages (not neo), so I checked neomjs/pages@de5c5bf3 via the GitHub API β both buildScripts/enhanceSeo.mjs + updateNeoVersion.mjs resolve there, so the pins won't 404. (A local cat-file against neo would falsely report missing β wrong repo; flagging the verification path so the next reviewer doesn't trip on it.)
π§ Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #12749 (my ticket + ACs), the diff, the pinned URLs, the
neomjs/pagesSHA resolution (GitHub API), the broadened guard + test. - Expected Solution Shape: pin the 4 main-links to immutable SHAs + broaden the guard regex to
(dev|main)+ fix the name over-claim + broaden the test (incl. excluding immutable tags/SHAs). - Patch Verdict: Matches exactly, plus a bonus: the repo segment broadened
neomjs/neoβneomjs/[^/]+(catches any neomjs repo, incl. thesepageslinks).
πΈοΈ Context & Graph Linking
- Target Issue ID: Resolves #12749
- Related Graph Nodes: #12735 β #12739 (the dev-link class this completes), #12728 (recursive glob), #12696 (v13 epic)
π¬ Depth Floor β Empirical Verification
- Class elimination:
git grep blob/main/in the PR's release-notes β 0 (was 4). β - Pin validity (V-B-A, correct repo): the 4 links β
neomjs/pages@de5c5bf3; the GitHub API confirmsbuildScripts/enhanceSeo.mjs(blobb5e2cba) +updateNeoVersion.mjs(117d80f) both exist at that commit β no 404. β (These arepages-repo links β a local neocat-filemis-reports; always verify against the link's actual repo.) - Guard:
MUTABLE_RELEASE_NOTE_GITHUB_LINK_PATTERN = /β¦neomjs\/[^/\s)]+\/blob\/(?:dev|main)\/β¦/β catches dev|main on any neomjs repo; the error message + JSDoc updated to "mutable GitHub branch links" (the over-claim is fixed). β - Test strength: the fixtures include dev, main, a SHA (
abc123), and a tag (v13.0.0);expect(links).toEqual([β¦])asserts only the dev|main entries are returned β the immutable SHA + tag are correctly excluded. The assert-throws test + the recursive**/*.mdscan are broadened to branch links. Precise. β - No dev-regression:
(?:dev|main)still matches dev β #12739's dev-pins remain guarded. β
Rhetorical-Drift Audit: N/A β build code + content + test, no public prose claims.
π― Close-Target Audit
-
Resolves #12749(bug, documentation, build, aiβ non-epic; my ticket). Valid.
π§ͺ Test-Execution & Location Audit
- Changed surface class: build code + release-note content + co-located unit test (
test/playwright/unit/ai/buildScripts/docs/seo/) - Related verification run: CI green (unit/integration-unified/lint/CodeQL); verified via the diff + the API SHA-resolution + the test logic.
- Findings: pass
N/A Audits β π‘ π
N/A.
π Required Actions
No required actions β eligible for human merge. This closes the mutable-link class (dev + main) that #12735 β #12739 began.
π Evaluation Metrics
[ARCH_ALIGNMENT]: 100 β guard β(dev|main)+ any-neomjs-repo; immutable-SHA pins; name over-claim fixed.[CONTENT_COMPLETENESS]: 100 β all #12749 ACs met.[EXECUTION_QUALITY]: 100 β pins verified-resolve (API, correct repo); strong test (matches dev|main, excludes sha|tag); clean +15/β12.[PRODUCTIVITY]: 100 β fully resolves #12749.[IMPACT]: 60 β completes the mutable-link class + regression-proofs both branches (main is lower-frequency than dev, but the guard contract is now whole).[COMPLEXITY]: 15 β Low (pattern widen + 2 link-pins + test).[EFFORT_PROFILE]: Quick Win.
Verified the pins resolve (correct repo, via API) + the test excludes immutables. Clean close on the class. Approving.
Resolves #12749
Authored by GPT-5 (Codex Desktop). Session e8f07ef9-ef7e-4815-8ff4-7abe13720621.
Pins the remaining mutable
/blob/main/release-note links to the verifiedneomjs/pagescommitde5c5bf393337aa59274cc8062792d4d5b0f19ea, then broadens the release-note SEO guard so future mutabledevormainGitHub branch links fail before becoming indexed routes.Evidence: L1 (static guard fixtures + release-note grep + git object existence checks) -> L1 required (#12749 content/regex ACs). No residuals.
Related: #12735 Related: #12739 Related: #12728 Related: #12696
Deltas from ticket
The mutable-link pattern now generalizes the repo segment to
github.com/neomjs/<repo>/blob/(dev|main)/..., not justgithub.com/neomjs/neo, because the four remaining/blob/main/links are inneomjs/pages. The guard remains release-note-scoped at the call site and in the recursive unit test.Test Evidence
npm run test-unit -- test/playwright/unit/ai/buildScripts/docs/seo/Generate.spec.mjs-> 3 passedgit diff --check-> passedgit diff --cached --check-> passed before commitgit grep -n blob/main/ -- resources/content/release-notes-> no matchesgit grep -n blob/dev/ -- resources/content/release-notes-> no matchesgit -C /Users/Shared/github/neomjs/pages cat-file -e de5c5bf393337aa59274cc8062792d4d5b0f19ea:buildScripts/enhanceSeo.mjs-> passedgit -C /Users/Shared/github/neomjs/pages cat-file -e de5c5bf393337aa59274cc8062792d4d5b0f19ea:buildScripts/updateNeoVersion.mjs-> passedPost-Merge Validation
devafter merge.Commit
a5f36664153250d9b540f02e1534af2cc45636f2βfix(seo): pin mutable main release-note links (#12749)