You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Rolling upgrade: GitHub default-branch adoption can miss the first sync or an older replica's PATCH to main (#599 follow-up) #609
PR #607 adopts the GitHub default branch at a successful sync of a GitHub sync repo whose create omitted default_branch (#599). During a rolling upgrade from a release without this rule, two cases miss the upstream behavior. http-api.md documents both, and the PR's Codex round 1 raised both.
A sync that an older worker runs does not adopt. The flag stays set, so the next sync by an upgraded worker adopts. Until that sync, the repo is on main, and with no further trigger it stays there.
An older replica's PATCH /repo to main before that sync writes nothing that differs from the create's placeholder main. The next sync by an upgraded worker then replaces the caller's explicit main with the GitHub branch. A PATCH to any other branch is kept, because the adopt write requires the repo to still be on main.
Possible fixes
A fleet-version gate, like OPENSTORAGE_SYNC_STEAL_LEGACY: an operator assertion that no older replica remains before creates set the flag.
A reconciliation sweep that schedules a sync for flagged repos with success_count > 0. This covers case 1 only.
Deploy sequencing in the release notes: upgrade every replica before accepting GitHub sync creates.
Trigger
Act on this issue at the first report of a GitHub sync repo left on main after a rolling upgrade, or when a release that ships #607 is prepared (decide then whether the release notes need a sequencing note).
The release half of the trigger fired with v0.19.0, which ships #607. The release notes now carry both rolling-upgrade limits under "⚠ BREAKING CHANGES", added through a commit override on #607 (see the v0.19.0 release). That covers the "deploy sequencing" fix for operators.
This issue stays open for the other half: act at the first report of a GitHub sync repo left on main after a rolling upgrade. At that point, choose between the fleet-version gate and the reconciliation sweep.
Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: medium
Activity
ThomasK33 commentedon Oct 30, 2026
The release half of the trigger fired with v0.19.0, which ships #607. The release notes now carry both rolling-upgrade limits under "⚠ BREAKING CHANGES", added through a commit override on #607 (see the v0.19.0 release). That covers the "deploy sequencing" fix for operators.
This issue stays open for the other half: act at the first report of a GitHub sync repo left on
mainafter a rolling upgrade. At that point, choose between the fleet-version gate and the reconciliation sweep.Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:mediumdocs(api): say which older-replica PATCH the default-branch trigger c…
fix(sync): leave no evidence after a failed HEAD lookup or adoption w…
chore(skills): record the lane-schedule fingerprints for the evidence…
fix(sync): keep the retry until a resolved HEAD has reached the adoption
chore(skills): record the lane-schedule fingerprints for the settled …
fix(sync): retry only a failed adoption write, not what the upstream'…
chore(skills): record the lane-schedule fingerprints for the narrowed…
fix(meta): take repos first in InitSchema so a boot cannot deadlock a…
fix(meta): lock repos in SHARE ROW EXCLUSIVE mode first in InitSchema
fix(meta): bound every lock wait of InitSchema after its first lock a…
fix(meta): bound InitSchema's lock waits right after the advisory lock
test(meta): drop the elapsed-time bound from the lock-order test
fix(meta): take ACCESS EXCLUSIVE on repos first in InitSchema
test(meta): cover FOR UPDATE then a stronger lock on repos and repo_u…