ADR 0085 — Main only fast-forwards to dev
- Status: Accepted
- Date: 2026-10-27
- Amends: ADR 0027 — no workflow fast-forwards dev after main changes
- Related: ADR 0066
Context
Section titled “Context”ADR 0027 added sync-dev.yml: after every push to main it fast-forwards dev to main. The release process (ADR 0066) already moves the branches the other way. Pull requests merge into dev, as #33, #34 and #35 did on 2026-10-26, and main then fast-forwards to the tested dev commit. After such a push dev already is main, so the workflow’s push to dev changes nothing.
The workflow changes dev only when main takes a commit that skipped dev, as #31 (feat/echo-desktop-refinement into main, 2026-10-24) did. On 2026-10-27 a workflow-only pull request was opened against main and the sync came up while checking what its merge would trigger; the owner asked to remove it.
ADR 0066 names this removal in its invalidation conditions: if dev stops receiving every commit main releases, its rules that a commit main holds is main’s to release, and that the highest version is dev’s newest build, must be derived again.
Decision
Section titled “Decision”sync-dev.yml, scripts/sync-dev.sh and its test are removed. Every change reaches main by fast-forwarding main to a dev commit, and pull requests target dev.
ADR 0066’s rules, derived again: every commit main holds came from dev, so dev still receives every commit main releases. A dev run that finds its commit already on main still leaves the release to main, and dev’s newest build is still the highest version, because main releases nothing dev has not built.
Rejected alternatives
Section titled “Rejected alternatives”- Keep the workflow as a safety net. It runs only to repair a commit that reached
mainwithout passing throughdev, which the process rules out. When it does run, it movesdevonto that untested commit, so the nextdevbuild starts from it unnoticed; without it, the next fast-forward ofmainfails and shows the divergence.
Consequences
Section titled “Consequences”- A push to
mainstarts one workflow fewer. - A pull request merged into
maindirectly leavesdevbehind. The next fast-forward ofmaintodevfails, anddevmust takemain’s commit first. - ADR 0027’s other branch rules stay: no force pushes, and divergence is reconciled explicitly.
Invalidation conditions
Section titled “Invalidation conditions”- If changes must land on
mainwithout passing throughdev, for example urgent fixes, restore an automatic fast-forward ofdevor make mergingmainintodevpart of that process.
Validation
Section titled “Validation”- Pull request history (
gh pr list --state merged): #33, #34 and #35 merged intodev; #31 is the most recent merge intomainthat skippeddev. scripts/sync-dev.shas removed: it pushesorigin/maintodevafter checking thatdevhas no commits outsidemain.tests/test_adr_records.pypasses with this record indexed.