Context
The v13 release window exposed a sync_all performance concern: the GitHub Workflow sync appeared to fetch the full release history repeatedly instead of taking the cached-release warm path. The operator's best reconstruction after a machine restart was that cached releases may have been read as undefined rather than as cached tag metadata.
PR #12693 (fix(sync): hydrate cached release tags (#12692)) has now merged, so the remaining release-readiness task is not to speculate about the old logs. It is to run a current post-merge validation on dev and prove whether the warm-cache path now avoids repeated full release pagination.
Live latest-open sweep: checked the latest 60 open issues on 2026-06-08 via GitHub API title/metadata scan; no focused open ticket for sync_all release-cache warm-path validation was found. Targeted live searches for sync_all release cache, cached releases undefined, and title-only/list-issue friction found no equivalent focused open issue. Local archive/source sweeps found older sync_all branch/tool-description issues and Discussion #12694 references to this pending validation, but no dedicated validation ticket.
KB non-synthesis sweep: query_documents('GitHub Workflow sync_all releases cached undefined') pointed at learn/agentos/GitHubWorkflow.md and ai/services/github-workflow/sync/ReleaseNotesSyncer.mjs, confirming this is GitHub Workflow sync substrate rather than Memory Core or release-note prose authoring.
The Problem
The release sync path is a shared operational dependency during v13 closeout. If the warm-cache path is still broken, every agent or operator run of sync_all pays unnecessary GitHub GraphQL pagination over the complete release history. In this release cycle, that means a large release-note/history surface and slow feedback every time the board/content mirror needs to refresh.
The merged fix changes the likely failure mode, but without a post-merge validation run we still do not know whether the active dev path:
- reconstructs cached releases with
tagName populated from metadata keys;
- recognizes that
latestRelease.tagName and publishedAt match the cached latest release;
- exits before the full
FETCH_RELEASES pagination path;
- preserves
ReleaseNotesSyncer.sortedReleases for closed-item bucketing; and
- saves metadata in a shape that makes the next run warm again.
The Architectural Reality
ai/services/github-workflow/sync/ReleaseNotesSyncer.mjs owns release fetching and release-note sync.
fetchAndCacheReleases(metadata) builds cachedReleaseArray from metadata.releases via Object.entries(...), injecting each metadata key as tagName before the latest-release fast-path comparison.
- The fast path compares GitHub's latest release against the latest cached release by
tagName and publishedAt; if both match, it sets releases and sortedReleases and returns without full release pagination.
- If the fast path misses, the method falls back to full
FETCH_RELEASES pagination up to issueSync.maxReleases (2000 in current config), because the closed-item bucketing reference must span full release history.
ai/services/github-workflow/SyncService.mjs later saves newMetadata.releases = ReleaseNotesSyncer.releases and releasesLastFetched, which is the persistent cache used by the next sync.
The Fix
Run a post-merge validation on dev that proves the release-cache warm path with current source and current metadata.
Expected validation shape:
- Start from clean, current
dev.
- Confirm
.sync-metadata.json already has release metadata in the current post-#12693 shape or intentionally run one cold sync to populate it.
- Run
sync_all once to establish the warm cache state if needed.
- Run
sync_all a second time and capture logs/timing.
- Verify the second run logs the latest-release fast-path and does not emit the full release-history pagination line.
- If the second run still performs full pagination, file or implement the narrow fix against
ReleaseNotesSyncer/metadata serialization with regression coverage.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
sync_all release warm path |
ReleaseNotesSyncer.fetchAndCacheReleases() |
Use cached release metadata to exit after the latest-release check when no newer release exists |
Full release-history pagination only when latest release differs, cache is missing, or latest-release check fails |
Issue comment / PR body |
Two consecutive sync_all runs on clean dev; second run log shows warm-path no-op |
| Release metadata shape |
.sync-metadata.json + SyncService.runFullSync() |
Persist releases with enough metadata for the next run to reconstruct tagName and publishedAt |
Cold fetch repopulates metadata when missing/corrupt |
Issue comment |
Metadata shape summarized without dumping unrelated issue data |
| Closed-item bucketing |
ReleaseNotesSyncer.sortedReleases consumers in issue/PR/discussion syncers |
Keep full-history bucketing reference available even when release notes are floored |
If history cap is hit, warn and keep existing safety behavior |
Issue comment / tests if fix needed |
Warm-path run still provides sortedReleases and does not collapse bucketing |
Decision Record impact
none. This validates and, only if necessary, repairs GitHub Workflow sync behavior. It does not change provider architecture, release-note narrative policy, or AiConfig ownership.
Acceptance Criteria
Out of Scope
- Rewriting release-note sync architecture.
- Changing the full-history bucketing requirement.
- Running
sync_all from a feature branch.
- Editing v13 release-note prose.
- Addressing MCP tool-schema staleness; that is covered by the runtime-freshness lane.
Avoided Traps
- Treating PR
#12693 as sufficient without a warm-run validation.
- Optimizing away the full-history bucketing reference; that would risk mis-bucketing older closed issues/PRs/discussions.
- Running
sync_all from the current feature branch and polluting an implementation PR with metadata churn.
- Filing this as a release-notes narrative task. The issue is the GitHub Workflow sync substrate.
Related
Parent: #12696
Related: #12693, #12692, #12694
Origin Session ID: e8f07ef9-ef7e-4815-8ff4-7abe13720621
Retrieval Hint: "sync_all cached release warm path ReleaseNotesSyncer metadata tagName undefined full release history pagination"
Context
The v13 release window exposed a
sync_allperformance concern: the GitHub Workflow sync appeared to fetch the full release history repeatedly instead of taking the cached-release warm path. The operator's best reconstruction after a machine restart was that cached releases may have been read asundefinedrather than as cached tag metadata.PR #12693 (
fix(sync): hydrate cached release tags (#12692)) has now merged, so the remaining release-readiness task is not to speculate about the old logs. It is to run a current post-merge validation ondevand prove whether the warm-cache path now avoids repeated full release pagination.Live latest-open sweep: checked the latest 60 open issues on 2026-06-08 via GitHub API title/metadata scan; no focused open ticket for
sync_allrelease-cache warm-path validation was found. Targeted live searches forsync_all release cache,cached releases undefined, and title-only/list-issue friction found no equivalent focused open issue. Local archive/source sweeps found oldersync_allbranch/tool-description issues and Discussion#12694references to this pending validation, but no dedicated validation ticket.KB non-synthesis sweep:
query_documents('GitHub Workflow sync_all releases cached undefined')pointed atlearn/agentos/GitHubWorkflow.mdandai/services/github-workflow/sync/ReleaseNotesSyncer.mjs, confirming this is GitHub Workflow sync substrate rather than Memory Core or release-note prose authoring.The Problem
The release sync path is a shared operational dependency during v13 closeout. If the warm-cache path is still broken, every agent or operator run of
sync_allpays unnecessary GitHub GraphQL pagination over the complete release history. In this release cycle, that means a large release-note/history surface and slow feedback every time the board/content mirror needs to refresh.The merged fix changes the likely failure mode, but without a post-merge validation run we still do not know whether the active
devpath:tagNamepopulated from metadata keys;latestRelease.tagNameandpublishedAtmatch the cached latest release;FETCH_RELEASESpagination path;ReleaseNotesSyncer.sortedReleasesfor closed-item bucketing; andThe Architectural Reality
ai/services/github-workflow/sync/ReleaseNotesSyncer.mjsowns release fetching and release-note sync.fetchAndCacheReleases(metadata)buildscachedReleaseArrayfrommetadata.releasesviaObject.entries(...), injecting each metadata key astagNamebefore the latest-release fast-path comparison.tagNameandpublishedAt; if both match, it setsreleasesandsortedReleasesand returns without full release pagination.FETCH_RELEASESpagination up toissueSync.maxReleases(2000in current config), because the closed-item bucketing reference must span full release history.ai/services/github-workflow/SyncService.mjslater savesnewMetadata.releases = ReleaseNotesSyncer.releasesandreleasesLastFetched, which is the persistent cache used by the next sync.The Fix
Run a post-merge validation on
devthat proves the release-cache warm path with current source and current metadata.Expected validation shape:
dev..sync-metadata.jsonalready has release metadata in the current post-#12693 shape or intentionally run one cold sync to populate it.sync_allonce to establish the warm cache state if needed.sync_alla second time and capture logs/timing.ReleaseNotesSyncer/metadata serialization with regression coverage.Contract Ledger Matrix
sync_allrelease warm pathReleaseNotesSyncer.fetchAndCacheReleases()sync_allruns on cleandev; second run log shows warm-path no-op.sync-metadata.json+SyncService.runFullSync()tagNameandpublishedAtReleaseNotesSyncer.sortedReleasesconsumers in issue/PR/discussion syncerssortedReleasesand does not collapse bucketingDecision Record impact
none. This validates and, only if necessary, repairs GitHub Workflow sync behavior. It does not change provider architecture, release-note narrative policy, or AiConfig ownership.
Acceptance Criteria
dev, two consecutivesync_allruns are executed or an equivalent lower-risk script harness proves the sameReleaseNotesSyncerpath.tagNameandpublishedAtfor the fast-path comparison.#12693fully resolved the operator-observedundefined/full-fetch regression or whether another fix was required.Out of Scope
sync_allfrom a feature branch.Avoided Traps
#12693as sufficient without a warm-run validation.sync_allfrom the current feature branch and polluting an implementation PR with metadata churn.Related
Parent: #12696 Related: #12693, #12692,
#12694Origin Session ID: e8f07ef9-ef7e-4815-8ff4-7abe13720621 Retrieval Hint: "sync_all cached release warm path ReleaseNotesSyncer metadata tagName undefined full release history pagination"