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.
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.
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.
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.
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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.
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.
release/vX.Y.Z-PHASEbranch 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.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 tomain. Conflicts concentrate at the renamed user-visible paths (binaries, desktop id, XDG dirs, D-Bus, xbps template) while the Python import package staysvocalinux, so the resolver keeps upstream logic and re-applies the fork's renames on top, never the reverse.fix:commits and user-instruction-changingdocs:; skipfeat:, 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 -30andgit 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 staysvocalinux, 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.