Found while cleaning up after sprint #524/PR #526. The forward-merge automation
(.github/workflows/forward-merge-release.yml) merges release/X.x into main and pushes the
result directly — but it never builds or tests the merge result before pushing. A merge with no
textual conflict is treated as fully successful even when the two branches independently changed
the same function's signature (or any other change that's line-disjoint but semantically
incompatible).
What happened: PR #526 (this repo, release/1.x) added a test calling
sync_admin_credentials(&client, &app, transmission_access) — matching that function's
3-parameter signature on release/1.x at the time. Independently, main already had a
4-parameter version of the same function (a base_url_override parameter from an unrelated,
already-merged feature that was never backported to release/1.x). When PR #526 merged and the
forward-merge cascade ran, git merge combined both changes with no conflict (they touched
different lines), but the result didn't compile: the test call site was now missing the new
4th argument, main was left unbuildable, and the "Forward-merge release branches" workflow run
reported success.
Impact: main was uncompilable for ~12 minutes until manually caught locally and fixed via
PR #527. Nothing in CI caught it — main's own CI workflow never triggered a fresh run against
the forward-merge commit (the push may not match its trigger conditions, or it's debounced/
skipped somehow — worth checking .github/workflows/ci.yml's on.push config too).
Fix pattern: add a build/test step to the forward-merge cascade before pushing to each
target — e.g. cargo build --workspace --tests (or the project's actual CI test command) run
against the merged worktree, right after the git merge --no-edit step and before
push_branch. If the build fails, treat it the same as a conflict: abort the merge, halt the
cascade, and surface actionable instructions (this repo's build failure, not a git conflict, so
the message should say so explicitly and suggest git merge locally + fixing the build before
pushing). Separately, worth confirming why main's CI didn't run post-merge as a backstop --
if it's supposed to and didn't, that's a second gap.
Found while cleaning up after sprint #524/PR #526. The forward-merge automation
(
.github/workflows/forward-merge-release.yml) mergesrelease/X.xintomainand pushes theresult directly — but it never builds or tests the merge result before pushing. A merge with no
textual conflict is treated as fully successful even when the two branches independently changed
the same function's signature (or any other change that's line-disjoint but semantically
incompatible).
What happened: PR #526 (this repo,
release/1.x) added a test callingsync_admin_credentials(&client, &app, transmission_access)— matching that function's3-parameter signature on
release/1.xat the time. Independently,mainalready had a4-parameter version of the same function (a
base_url_overrideparameter from an unrelated,already-merged feature that was never backported to
release/1.x). When PR #526 merged and theforward-merge cascade ran,
git mergecombined both changes with no conflict (they toucheddifferent lines), but the result didn't compile: the test call site was now missing the new
4th argument,
mainwas left unbuildable, and the "Forward-merge release branches" workflow runreported
success.Impact:
mainwas uncompilable for ~12 minutes until manually caught locally and fixed viaPR #527. Nothing in CI caught it —
main's own CI workflow never triggered a fresh run againstthe forward-merge commit (the push may not match its trigger conditions, or it's debounced/
skipped somehow — worth checking
.github/workflows/ci.yml'son.pushconfig too).Fix pattern: add a build/test step to the forward-merge cascade before pushing to each
target — e.g.
cargo build --workspace --tests(or the project's actual CI test command) runagainst the merged worktree, right after the
git merge --no-editstep and beforepush_branch. If the build fails, treat it the same as a conflict: abort the merge, halt thecascade, and surface actionable instructions (this repo's build failure, not a git conflict, so
the message should say so explicitly and suggest
git mergelocally + fixing the build beforepushing). Separately, worth confirming why
main's CI didn't run post-merge as a backstop --if it's supposed to and didn't, that's a second gap.