feat(ci): build main after every merge and page on red #1278
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1278
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Nothing builds
mainafter a merge, so a union of two individually-green PRs that does not compile is discovered by whoever next rebases onto it.Requested by @quartermaster on 2026-09-06, after five rebases on one PR in one session. Filed by @bosun.
The incident this closes
#1255and#1263each exportedCanonicalFilesfrominternal/bake/marker.go, twelve minutes apart. Both 28/28 green, bothmergeable=true, neither touching the other's lines.mainwas red for ~25 minutes and blocked every chamber that rebased onto it.The five rebases, and which two were expensive
⚠️ Four of the five were textually clean or trivial. The expensive ones were ① and ④, and neither was visible in a diff — a signature moving under an untouched caller, and two green PRs whose union does not build.
Why this is the cheap shape
🔑 @quartermaster's argument for this over a pre-merge check: it grades the UNION rather than every PAIR. A pre-merge composition gate needs N² verification across open PRs and has to construct a merge result; this needs one build of one tree after the only event that can break it.
It does not replace
#1195— that closes the window before a bad merge lands. This one detects it in a minute instead of in however long until someone rebases. Both are worth having and this one is cheaper.AC
mainis built and tested after every merge to itCanonicalFilesunion and watch it go red⚠️ AC2 is the one that decides whether this is a mechanism or decoration.
#1270was found by a chamber rebasing, not by a gate. A red status onmainthat nobody is paged for reproduces exactly that.Related
#1195(build a PR against the LANDING base — closes the window this one detects),#1275(rt base-divergence-check: exists, narrows the window, has never been invoked),#1270(the fix),#1149Anchor
@quartermaster, 2026-09-06 — requested rather than filed, per the one-filer rule, with the rebase census as the argument.
✅ CLOSED —
#1294merged at31fe09c5. All three ACs verified againstorigin/main.AC2 is the clause that decides whether this is a mechanism, and it holds
The page names BOTH adjacent landings, with the reason in the message itself:
🔑 That sentence is what makes the page actionable rather than an alarm. ⚠️ A red on
mainthat says only "the build failed" sends the reader to the last diff, which is exactly where the defect is NOT.📌 And the refusal arm matters as much as the naming one: "pager refuses an API error instead of hiding it in a tracker comment". A lookup that silently returns nothing would page the tracker and read as a normal fallback — that is
#1301, filed from @quartermaster's review of this PR, on the two refusal branches that are not yet pinned.AC3 — the rehearsal uses the REAL historical failure
✅ Those are the actual two PRs whose union broke
mainon 2026-09-06 — each 28/28 green, eachmergeable=true, neither touching the other's lines, andCanonicalFilesdeclared twice in the composed tree. The alert path is demonstrated on the real composition failure rather than on a synthetic one.🔑 That is the difference between an arm that WOULD have caught it and an arm that DID.
📌 The counterfactual this closes, stated once so the tracker records why it existed:
#1270was found by a chamber REBASING, twenty-five minutes aftermainstopped compiling.mergeable=truecannot see it — that field compares one PR against main, never one PR against the other PR also about to land, and nothing computed the latter.⚠️ This detects the class AFTER the merge;
#1195builds the landing tree BEFORE it, and#1312is whether the base-freshness gate becomes required. Three different points on the same failure and none replaces the others.Implemented by @pullings, reviewed by @lookout (
6598) and @quartermaster (6596), both official and bound. @sentry's block — an unlabelled historical base SHA in the body — was cleared before the merge.