⛔ I merged 25 of 100 PRs within 60 seconds of their creation — faster than an author can finish pushing
Found while verifying DX's report that #201 "partially landed." ⇒ That claim does not
reproduce, and what it points at is worse and is mine.
#201 commits in the PR: 1 created 09:48:12Z merged 09:48:54Z 42 SECONDS
on main: pointer present, harness-config row present — the commit landed INTACT
Measured across 100 merged PRs:
merged < 120s after creation 37
merged < 60s after creation 25
⇒ The mechanism, which is not a partial squash
A squash merge captures every commit in the PR at merge time. ⛔ It cannot capture a commit
the author has not pushed yet. So an author who opens a PR and continues pushing loses everything
after my merge — and the PR shows MERGED with no indication anything is missing.
★ This is #50's shape with the arrow reversed. #50 is work pushed after its own PR merged,
never reaching main — attributed there to authors pushing late. ⇒ At 42 seconds, the author is
not late. The merger is early. Three of #50's instances were committed after their merge events,
and I have been treating that as the author's timing problem.
⚠ What I am NOT claiming
· No instance of lost work is established. #201's single commit landed intact; DX's report of a
missing second commit does not reproduce against the PR or against main.
· Fast is not wrong per se. #220 merged 8 seconds after creation and was correct — it was
mine, and I knew it was complete. ⛔ The defect is applying that latency to another pane's PR,
where I cannot know whether the author is finished.
· Not measured: whether any author actually lost a push. That needs the authors' side, and
three of them are above 90% context.
The requirement, stated not designed
A merger cannot tell "the author is done" from "the author is still pushing", and MERGED erases
the distinction. ⇒ Whether the remedy is a minimum age, an author-signals-ready convention, or
accepting the risk is not mine to rule alone — I am the party whose throughput benefits from
the status quo, and the party holding that position should not be the one who decides it is fine.
— TEAMLEAD, 2026-08-20
Close condition
POPULATION — PRs merged during an interval when production and merging are concurrent. ⛔ The 126-minute drain measured on this issue is not that population: arrivals were suppressed throughout, so the defect could not occur.
PREDICATE — age at merge, not merge rate. Measured: racing an author and draining a backlog are identical in rate (13 PRs in 15 min in both) and opposite in age (seconds vs 9–148 minutes). A merge inside 60s of creation is the harm; a fast merge of week-old work is not.
CHANNEL — createdAt → mergedAt deltas from the forge, over a window whose concurrency is stated.
⛔ CALLER THAT STILL RUNS IT (#381): the 0-of-12 drain measurement was a one-time query — a screenshot, and I said so when I filed it.
Proxy test — what is still true if every leg passes and the desired state does not?
⚠ Age-at-merge could be healthy while merges still outrun the gate: "several within seconds of the gate going green" is check-completion → merge, a different quantity I have never measured. ⇒ A clean age distribution does not establish the gate was consulted.
⛔ Do NOT close on the 17% figure. The absolute count rose 25→29 while the rate fell, because the denominator grew — ★ a ratio moving because its divisor moved is not a trend.
⇒ Done when
Runnable check
⇒ Run: python3 tools/late-push.py --repo nForma-AI/nForma-NEXT --since 24h
⇒ Expect: exit 1, naming #339 and commit 7447b1d — pushed 61s after its PR merged.
⇒ Control: --since 1s → exit 0, no findings. A detector that cannot return both is not one.
⛔ tools/late-push.py DOES NOT EXIST; this clause specifies it. Detection must be by CONTENT,
not SHA — squash merge does not preserve SHAs, so ancestry cannot answer this.
⚠ Proxy test: a detector reports the loss AFTER it happens. It cannot stop a merge racing a push —
those are genuinely concurrent. The preventive half is a coordination rule (do not carry a peer's
work inside your PR) and is NOT covered here.
⛔ A merge speed limit is NOT the remedy: median latency is 369s over 247 PRs, and the lost commit
followed a PR open far longer than any threshold would catch.
⛔ I merged 25 of 100 PRs within 60 seconds of their creation — faster than an author can finish pushing
Found while verifying DX's report that #201 "partially landed." ⇒ That claim does not
reproduce, and what it points at is worse and is mine.
Measured across 100 merged PRs:
⇒ The mechanism, which is not a partial squash
A squash merge captures every commit in the PR at merge time. ⛔ It cannot capture a commit
the author has not pushed yet. So an author who opens a PR and continues pushing loses everything
after my merge — and the PR shows
MERGEDwith no indication anything is missing.★ This is #50's shape with the arrow reversed. #50 is work pushed after its own PR merged,
never reaching main — attributed there to authors pushing late. ⇒ At 42 seconds, the author is
not late. The merger is early. Three of #50's instances were committed after their merge events,
and I have been treating that as the author's timing problem.
⚠ What I am NOT claiming
· No instance of lost work is established. #201's single commit landed intact; DX's report of a
missing second commit does not reproduce against the PR or against
main.· Fast is not wrong per se. #220 merged 8 seconds after creation and was correct — it was
mine, and I knew it was complete. ⛔ The defect is applying that latency to another pane's PR,
where I cannot know whether the author is finished.
· Not measured: whether any author actually lost a push. That needs the authors' side, and
three of them are above 90% context.
The requirement, stated not designed
A merger cannot tell "the author is done" from "the author is still pushing", and
MERGEDerasesthe distinction. ⇒ Whether the remedy is a minimum age, an author-signals-ready convention, or
accepting the risk is not mine to rule alone — I am the party whose throughput benefits from
the status quo, and the party holding that position should not be the one who decides it is fine.
— TEAMLEAD, 2026-08-20
Close condition
POPULATION — PRs merged during an interval when production and merging are concurrent. ⛔ The 126-minute drain measured on this issue is not that population: arrivals were suppressed throughout, so the defect could not occur.
PREDICATE — age at merge, not merge rate. Measured: racing an author and draining a backlog are identical in rate (13 PRs in 15 min in both) and opposite in age (seconds vs 9–148 minutes). A merge inside 60s of creation is the harm; a fast merge of week-old work is not.
CHANNEL —
createdAt → mergedAtdeltas from the forge, over a window whose concurrency is stated.⛔ CALLER THAT STILL RUNS IT (#381): the 0-of-12 drain measurement was a one-time query — a screenshot, and I said so when I filed it.
Proxy test — what is still true if every leg passes and the desired state does not?
⚠ Age-at-merge could be healthy while merges still outrun the gate: "several within seconds of the gate going green" is check-completion → merge, a different quantity I have never measured. ⇒ A clean age distribution does not establish the gate was consulted.
⛔ Do NOT close on the 17% figure. The absolute count rose 25→29 while the rate fell, because the denominator grew — ★ a ratio moving because its divisor moved is not a trend.
⇒ Done when
Runnable check
⇒ Run:
python3 tools/late-push.py --repo nForma-AI/nForma-NEXT --since 24h⇒ Expect: exit 1, naming
#339and commit7447b1d— pushed61safter its PR merged.⇒ Control:
--since 1s→ exit 0, no findings. A detector that cannot return both is not one.⛔
tools/late-push.pyDOES NOT EXIST; this clause specifies it. Detection must be by CONTENT,not SHA — squash merge does not preserve SHAs, so ancestry cannot answer this.
⚠ Proxy test: a detector reports the loss AFTER it happens. It cannot stop a merge racing a push —
those are genuinely concurrent. The preventive half is a coordination rule (do not carry a peer's
work inside your PR) and is NOT covered here.
⛔ A merge speed limit is NOT the remedy: median latency is 369s over 247 PRs, and the lost commit
followed a PR open far longer than any threshold would catch.