Cherry-pick policy for upstream fixes #13

Closed
opened 2026-11-05 16:14:18 +00:00 by xavierk · 1 comment
Owner

Part of #1

Question

What is the cherry-pick policy for upstream Vocalinux fixes: cadence, freeze points, and conflict handling? Decide the smallest rule that keeps the fork current without destabilizing releases.

Part of #1 ## Question What is the cherry-pick policy for upstream Vocalinux fixes: cadence, freeze points, and conflict handling? Decide the smallest rule that keeps the fork current without destabilizing releases.
xavierk added the wayfinder:grilling label 2026-11-05 16:14:18 +00:00
xavierk self-assigned this 2026-11-05 16:22:31 +00:00
Author
Owner

Resolution (decision)

Policy: sync-point cherry-picks with a release freeze — hand-port each upstream fix as its own fork PR, no wholesale merges, no continuous tracking.

  1. Cadence — sync points, not continuous. Pull upstream fixes at each Voculinux release-prep cycle and on demand for a critical fix (crash, data loss, security). Do not track upstream main commit-by-commit. This is the smallest rule that keeps the fork current: upstream fix velocity is steady (recent history shows overlay, evdev, clipboard and snap fixes landing week to week), but every auto-ported change would re-run the full release checklist for no user-visible gain.
  2. Freeze — intake stops when the release branch opens. Once a release/vX.Y.Z-PHASE branch exists, no new cherry-picks land except release-blockers, each explicitly justified on the release-prep PR. Tagging happens only after merge, so the freeze protects exactly the window the release process already defines.
  3. Conflict handling — one fix, one fork PR, dual reference. Each port is a hand cherry-pick (git cherry-pick -x) resolved in a linked worktree branch, opened as a fork PR with both numbers in the title — the established pattern in this history, e.g. fix(overlay): detect Wayland by GType ... (#1030) (#1035). The PR runs the standard gates (just test, just lint, just typecheck) before squash-merge; the agent never merges the PR itself and never commits to main. Conflicts concentrate at the renamed user-visible paths (binaries, desktop id, XDG dirs, D-Bus, xbps template) while the Python import package stays vocalinux, so the resolver keeps upstream logic and re-applies the fork's renames on top, never the reverse.
  4. What qualifies. Port fix: commits and user-instruction-changing docs:; skip feat:, dependency bumps, and CI-only churn unless a security advisory names them. Features are re-decided per release, not auto-ported — the fork's Destination (Wayland-primary, CUDA-on-2050, xbps, rename) already diverges from upstream's roadmap. Anything in map Out of scope (musl, upstream void-packages submission, niri/DMS forks) is dropped at triage, not conflict-resolved.

Provenance: decided by agent under the user's explicit delegation for this run ("act as orchestrator and decision maker ... continue till all wayfinder tickets are closed"), from repo evidence — not stated by the human.

Evidence read: map Destination/Notes/Out of scope on Voculinux port; docs/RELEASE_PROCESS.md (release-branch → PR → tag-after-merge, Sec. Step 6–7); AGENTS.md (worktrees under /tmp, PR + squash + CI gate, never commit to main); git log --oneline -30 and git log --format=%H %s %b -8 (dual-number cherry-pick titles (#1030) (#1035), (#1028) (#1036)); git remote -v (origin = https://github.com/VocaHQ/vocalinux, i.e. upstream is the checkout's own remote); closed Void xbps packaging route (tag-driven CI) and Rename mechanics (import stays vocalinux, user-visible names renamed — the conflict surface). No GLOSSARY.md or docs/adr/ exists in this checkout, so no terminology/ADR update was required.

Consequences for later tickets: Signed xbps repository release pipeline inherits the freeze (repodata is signed from frozen tags only; a mid-freeze port restarts QA) and the per-fix PR rule (each port is independently revertible before the tag). Portal first-run prompt UX under niri is unaffected. No new fog was surfaced; no tickets created.

## Resolution (decision) **Policy: sync-point cherry-picks with a release freeze — hand-port each upstream fix as its own fork PR, no wholesale merges, no continuous tracking.** 1. **Cadence — sync points, not continuous.** Pull upstream fixes at each Voculinux release-prep cycle and on demand for a critical fix (crash, data loss, security). Do not track upstream main commit-by-commit. This is the smallest rule that keeps the fork current: upstream fix velocity is steady (recent history shows overlay, evdev, clipboard and snap fixes landing week to week), but every auto-ported change would re-run the full release checklist for no user-visible gain. 2. **Freeze — intake stops when the release branch opens.** Once a `release/vX.Y.Z-PHASE` branch exists, no new cherry-picks land except release-blockers, each explicitly justified on the release-prep PR. Tagging happens only after merge, so the freeze protects exactly the window the release process already defines. 3. **Conflict handling — one fix, one fork PR, dual reference.** Each port is a hand cherry-pick (`git cherry-pick -x`) resolved in a linked worktree branch, opened as a fork PR with both numbers in the title — the established pattern in this history, e.g. `fix(overlay): detect Wayland by GType ... (#1030) (#1035)`. The PR runs the standard gates (`just test`, `just lint`, `just typecheck`) before squash-merge; the agent never merges the PR itself and never commits to `main`. Conflicts concentrate at the renamed user-visible paths (binaries, desktop id, XDG dirs, D-Bus, xbps template) while the Python import package stays `vocalinux`, so the resolver keeps upstream logic and re-applies the fork's renames on top, never the reverse. 4. **What qualifies.** Port `fix:` commits and user-instruction-changing `docs:`; skip `feat:`, dependency bumps, and CI-only churn unless a security advisory names them. Features are re-decided per release, not auto-ported — the fork's Destination (Wayland-primary, CUDA-on-2050, xbps, rename) already diverges from upstream's roadmap. Anything in map Out of scope (musl, upstream void-packages submission, niri/DMS forks) is dropped at triage, not conflict-resolved. **Provenance:** decided by agent under the user's explicit delegation for this run ("act as orchestrator and decision maker ... continue till all wayfinder tickets are closed"), from repo evidence — not stated by the human. **Evidence read:** map Destination/Notes/Out of scope on [Voculinux port](https://git.bongbetic.com/xavierk/voculinux/issues/1); `docs/RELEASE_PROCESS.md` (release-branch → PR → tag-after-merge, Sec. Step 6–7); `AGENTS.md` (worktrees under /tmp, PR + squash + CI gate, never commit to main); `git log --oneline -30` and `git log --format=%H %s %b -8` (dual-number cherry-pick titles `(#1030) (#1035)`, `(#1028) (#1036)`); `git remote -v` (`origin` = `https://github.com/VocaHQ/vocalinux`, i.e. upstream is the checkout's own remote); closed [Void xbps packaging route](https://git.bongbetic.com/xavierk/voculinux/issues/4) (tag-driven CI) and [Rename mechanics](https://git.bongbetic.com/xavierk/voculinux/issues/8) (import stays `vocalinux`, user-visible names renamed — the conflict surface). No GLOSSARY.md or docs/adr/ exists in this checkout, so no terminology/ADR update was required. **Consequences for later tickets:** [Signed xbps repository release pipeline](https://git.bongbetic.com/xavierk/voculinux/issues/14) inherits the freeze (repodata is signed from frozen tags only; a mid-freeze port restarts QA) and the per-fix PR rule (each port is independently revertible before the tag). [Portal first-run prompt UX under niri](https://git.bongbetic.com/xavierk/voculinux/issues/15) is unaffected. No new fog was surfaced; no tickets created.
Sign in to join this conversation.