Context
Operator direction at session-3 boot (2026-06-11 night shift): finish the v13 release. Board triage (see triage comment on #12696) shows the release-note epic at 24/25 subs closed and zero open PRs — but no board item tracked the actual cut mechanics. Merged PR #12697 defined them in its Post-Merge Validation checklist; this ticket executes the agent-executable subset tonight and hands the operator a verified runbook for the human-gated rest.
The Problem
The release note (resources/content/release-notes/v13.0.0.md) carries a stale evidence snapshot by design — its own text says "to be refreshed once at final cut": live counts (1,260 merged PRs / 1,664 closed issues), local-mirror counts (1,228 / 1,587), a 2,933-line appendix snapshot, and the maintainer contribution table all date from a prior pass and have drifted.
Additionally, the #12697 checklist names appendix generation, SEO regeneration, and the publishedAt/isDraft flip without stating which steps are manual vs automated. Leaving that ambiguity unresolved until cut time risks either skipped steps or double work at the worst moment.
The Architectural Reality
V-B-A'd against the release substrate tonight (2026-06-11):
buildScripts/release/publish.mjs — operator-run; pre-flight expects package.json version manually bumped (currently 12.1.0) and the flat note at resources/content/release-notes/v13.0.0.md (exists). It then auto-runs prepare.mjs, npm run build-all, the squash-to-main commit-tree plumbing, gh release create --target dev (frontmatter/title stripped from the body), the KB upload, and the post-release full sync + ticket archive.
buildScripts/release/prepare.mjs — regenerates apps/portal/sitemap.xml + apps/portal/llms.txt (plus portal datePublished, NeuralLink.md version, .npmignore sync). The checklist's "regenerate SEO surfaces" is therefore automated inside the publish flow — no manual step.
ai/services/github-workflow/sync/ReleaseNotesSyncer.mjs (~L255-266) — the post-release sync writes the canonical chunked note from the GitHub release with frontmatter {tagName, name, publishedAt, isPrerelease, isDraft} derived from API truth. The checklist's "flip publishedAt/isDraft" therefore self-resolves post-publish. The flat v13 file (currently no frontmatter) is the authoring surface only.
buildScripts/release/analyzeClosedSinceRelease.mjs — the rerunnable appendix generator (#12699), scanning the recursive local content mirror.
The Fix
- Refresh the evidence snapshot in
resources/content/release-notes/v13.0.0.md (the "Full Changelog Appendix Snapshot" section + maintainer contribution table): re-run the live GraphQL count probes and the local appendix generator, update the documented numbers, preserve the live/local split and freshness-boundary wording.
- Run
node buildScripts/release/analyzeClosedSinceRelease.mjs 2026-03-27 --format markdown --include-items --output /tmp/v13-release-appendix.md against the current mirror; record fresh totals + line count in the note. Generated output stays uncommitted (per #12697).
- Post the operator cut-runbook as a comment on #12696: bump
package.json → 13.0.0 → run node buildScripts/release/publish.mjs from dev → post-publish verification list (synced chunked note frontmatter, npm cascade, KB upload, archive commit). The runbook maps every #12697 Post-Merge Validation item to manual-operator / automated-where / covered-by-this-PR.
Acceptance Criteria
Out of Scope
- The publish itself (version bump,
publish.mjs run, npm cascade) — human-gated release-line execution.
- Release-note prose/narrative changes — operator-polished surface; this ticket touches only evidence numbers.
- #10321 (release-workflow skill) — post-ship per epic OQ3; the runbook comment becomes raw material for it.
- Resolving #12450 / #12830 — they stay on the board as the remaining release-relevant Memory Core bugs.
Avoided Traps
- Hand-authoring frontmatter on the flat note — rejected:
publish.mjs strips it for the release body, and ReleaseNotesSyncer writes canonical frontmatter from the GitHub release post-publish; hand-added values would only create drift.
- Committing the generated appendix — rejected: #12697 deliberately kept generated outputs out of the repo; the note documents the regeneration command instead.
- Forcing
sync_all mirror parity tonight — rejected: the note deliberately documents the live/local split; blurring the freshness boundary outside the release-cut step contradicts that documented contract.
Decision Record impact
none (release-process execution; content shape aligned-with ADR 0004 chunked content architecture, unchanged).
Related
Parent: #12696 (v13 release epic). Source checklist: merged PR #12697. Board siblings kept: #12450, #12830, #12748 (operator risk-call). De-boarded tonight with rationale: triage comment on #12696.
Release classification: ON the board — release-cut mechanics; the cut cannot execute without it.
Origin: session-3 continuation of Memory Core session 00ab373d-0219-4093-948b-f9d30ecd4c7b (session-2 sunset handover MESSAGE:baf2657f-4b3f-436f-accd-4ab3407f30eb).
Retrieval Hint: query_raw_memories("v13 release cut prep evidence refresh appendix runbook"); substrate anchors: buildScripts/release/publish.mjs, ReleaseNotesSyncer frontmatter behavior.
Live latest-open sweep: checked latest 20 open issues at 2026-06-10T23:0xZ; no equivalent found. A2A in-flight claim sweep (list_messages all, 30): no [lane-claim]/[lane-intent] overlapping release-cut scope in the herd window.
Context
Operator direction at session-3 boot (2026-06-11 night shift): finish the v13 release. Board triage (see triage comment on #12696) shows the release-note epic at 24/25 subs closed and zero open PRs — but no board item tracked the actual cut mechanics. Merged PR #12697 defined them in its Post-Merge Validation checklist; this ticket executes the agent-executable subset tonight and hands the operator a verified runbook for the human-gated rest.
The Problem
The release note (
resources/content/release-notes/v13.0.0.md) carries a stale evidence snapshot by design — its own text says "to be refreshed once at final cut": live counts (1,260 merged PRs / 1,664 closed issues), local-mirror counts (1,228 / 1,587), a 2,933-line appendix snapshot, and the maintainer contribution table all date from a prior pass and have drifted.Additionally, the #12697 checklist names appendix generation, SEO regeneration, and the
publishedAt/isDraftflip without stating which steps are manual vs automated. Leaving that ambiguity unresolved until cut time risks either skipped steps or double work at the worst moment.The Architectural Reality
V-B-A'd against the release substrate tonight (2026-06-11):
buildScripts/release/publish.mjs— operator-run; pre-flight expectspackage.jsonversion manually bumped (currently12.1.0) and the flat note atresources/content/release-notes/v13.0.0.md(exists). It then auto-runsprepare.mjs,npm run build-all, the squash-to-main commit-tree plumbing,gh release create --target dev(frontmatter/title stripped from the body), the KB upload, and the post-release full sync + ticket archive.buildScripts/release/prepare.mjs— regeneratesapps/portal/sitemap.xml+apps/portal/llms.txt(plus portaldatePublished,NeuralLink.mdversion,.npmignoresync). The checklist's "regenerate SEO surfaces" is therefore automated inside the publish flow — no manual step.ai/services/github-workflow/sync/ReleaseNotesSyncer.mjs(~L255-266) — the post-release sync writes the canonical chunked note from the GitHub release with frontmatter{tagName, name, publishedAt, isPrerelease, isDraft}derived from API truth. The checklist's "flip publishedAt/isDraft" therefore self-resolves post-publish. The flat v13 file (currently no frontmatter) is the authoring surface only.buildScripts/release/analyzeClosedSinceRelease.mjs— the rerunnable appendix generator (#12699), scanning the recursive local content mirror.The Fix
resources/content/release-notes/v13.0.0.md(the "Full Changelog Appendix Snapshot" section + maintainer contribution table): re-run the live GraphQL count probes and the local appendix generator, update the documented numbers, preserve the live/local split and freshness-boundary wording.node buildScripts/release/analyzeClosedSinceRelease.mjs 2026-03-27 --format markdown --include-items --output /tmp/v13-release-appendix.mdagainst the current mirror; record fresh totals + line count in the note. Generated output stays uncommitted (per #12697).package.json→13.0.0→ runnode buildScripts/release/publish.mjsfromdev→ post-publish verification list (synced chunked note frontmatter, npm cascade, KB upload, archive commit). The runbook maps every #12697 Post-Merge Validation item to manual-operator / automated-where / covered-by-this-PR.Acceptance Criteria
Out of Scope
publish.mjsrun, npm cascade) — human-gated release-line execution.Avoided Traps
publish.mjsstrips it for the release body, andReleaseNotesSyncerwrites canonical frontmatter from the GitHub release post-publish; hand-added values would only create drift.sync_allmirror parity tonight — rejected: the note deliberately documents the live/local split; blurring the freshness boundary outside the release-cut step contradicts that documented contract.Decision Record impact
none (release-process execution; content shape aligned-with ADR 0004 chunked content architecture, unchanged).
Related
Parent: #12696 (v13 release epic). Source checklist: merged PR #12697. Board siblings kept: #12450, #12830, #12748 (operator risk-call). De-boarded tonight with rationale: triage comment on #12696.
Release classification: ON the board — release-cut mechanics; the cut cannot execute without it.
Origin: session-3 continuation of Memory Core session
00ab373d-0219-4093-948b-f9d30ecd4c7b(session-2 sunset handoverMESSAGE:baf2657f-4b3f-436f-accd-4ab3407f30eb). Retrieval Hint:query_raw_memories("v13 release cut prep evidence refresh appendix runbook"); substrate anchors:buildScripts/release/publish.mjs,ReleaseNotesSyncerfrontmatter behavior.Live latest-open sweep: checked latest 20 open issues at 2026-06-10T23:0xZ; no equivalent found. A2A in-flight claim sweep (
list_messages all, 30): no[lane-claim]/[lane-intent]overlapping release-cut scope in the herd window.