Repository navigation
Measure the effect of no longer requiring pull-request rebases #2547
Description
Goal
Find out whether making pull-request rebases optional (issue #2507) reduced force-pushes, pull-request CI runner time, and rebase-fallout commits. Compare a two-week window under the new policy with the baseline that #2507 recorded for 1 to 13 October 2026.
Background
Issue #2507 stopped requiring a rebase onto develop before merge. The ADR was accepted in spec PR #2508, merged 2026-10-14 06:42 UTC. The maintainer merge tool was changed in PR #2526, merged 2026-10-14 12:18 UTC, to refresh a pull request's stale recorded base instead of asking for a rebase. The goal was to cut CI reruns, review noise, and serialized merging.
The #2507 specification planned this comparison as its task T7 and acceptance criterion AC9. It needs at least two weeks of merges under the new policy. The maintainer decided on 2026-10-15 to move it into this issue so #2507 could close once its implementation and manual verification were complete.
Issue #2507 recorded the baseline, with reproduction commands, in baseline-evidence.md. That file moves to docs/issues/closed/2507-stop-requiring-pull-request-rebases/ when #2507 is archived. The baseline has these sections:
- section 4: pull-request volume and queue;
- section 5: force-pushes per merged PR;
- section 6: CI cost of pull-request runs;
- section 7: rebase-fallout commits.
| Measure (baseline) | June 2026 | 1 to 13 October 2026 |
|---|---|---|
| Merged PRs | 67 | 67 |
| Median open PRs waiting | 0 | 8 |
| Force-pushes per merged PR | 0.39 | 1.58 |
| Merged PRs force-pushed at least once | 34% | 81% |
| Estimated PR CI runner-hours | — | 197.8 |
The early merges are already mixed. Of the 18 merges from #2526 to #2543 (2026-10-14 12:18 to 2026-10-15 16:33 UTC), nine were merged while behind develop without a rebase, and six of those relied on the merge tool's refresh. Recommended rebases are still common, though: for example, #2530, #2538, and #2430 rebased clean branches. See #2507 manual-verification-evidence.md, section "Merges Under the New Policy".
Scope
In Scope
- Measure the window from 2026-10-15 00:00 UTC to 2026-10-28 23:59 UTC (14 days) with the Stop requiring pull-request rebases and reconcile repository rulesets #2507 baseline commands, and normalize per merged PR and per day so the 13-day baseline stays comparable. This specification fixes how each measure selects its data, because the baseline sections do not all say how they selected theirs:
- force-pushes per merged PR and the share of merged PRs force-pushed at least once. The population is the pull requests merged in the window (
merged_at), with every force-push of each of them, including events before 2026-10-15: baseline section 5 selects pull requests by merge date and counts each one's whole force-push timeline. The classification below uses the same population; - estimated PR CI runner-hours per workflow, sampled as in the baseline. The runs are the
pull_requestworkflow runs created within the window, not the runs of the pull requests merged in it, so runs of pull requests still open count too. Baseline section 6 reports 899 runs for 1 to 13 October and names no date field; creation date is this specification's reading of it; - rebase-fallout commits, compared with a baseline recounted for 1 to 13 October only: section 7 of the baseline lists 23 commits "since September 2026", of which 13 have author dates from 1 to 13 October, so do not divide the whole list by 13 days or by the 67 October merges. A commit is in the window when its author date is, as in that 13-of-23 recount. The command in section 7 filters with
--since, which is the committer date, and prints author dates; - pull-request volume and the daily open-PR queue, for context, as in baseline section 4.
- force-pushes per merged PR and the share of merged PRs force-pushed at least once. The population is the pull requests merged in the window (
- Classify every force-push of those pull requests with the method of Stop requiring pull-request rebases and reconcile repository rulesets #2507 manual-verification section V4, which compares where the push put the head's base, not only where the new head sits. The
developtip of its time is the last first-parentdevelopcommit whose pull request has amerged_atbefore the push. A rewrite of a head that was already on the tip must not be counted as a rebase:- rebase: the push moved the base, that is,
git merge-base <tip> <beforeCommit>differs fromgit merge-base <tip> <afterCommit>. It is required when the pushed-away head conflicted with the tip (git merge-tree --write-tree), and recommended when it merged cleanly; - not a rebase: the push left the base unchanged. Since PR docs(agents): allow rewriting an unmerged pull request's history with safeguards #2531 merged (
merged_at2026-10-14 16:09 UTC),AGENTS.mdallows other rewrites of an unmerged pull request's history, such as splitting or reordering commits, which the baseline could not contain: baseline section 5 counts every force-push as a rebase because history rewrites were otherwise forbidden.
Report the total force-pushes per merged PR, which is the baseline's measure, and the rebase-only figure, which excludes the second class.
- rebase: the push moved the base, that is,
- Count merges made while behind
developwhose head was pushed beforedevelopreachedM^1, thedeveloptip the merge was built on, and not pushed again before the merge (the recorded-base refresh path). The cutoff isM^1, not the Git merge base, which a head always postdates. As in Stop requiring pull-request rebases and reconcile repository rulesets #2507 manual-verification section V1, the count is inferred, because the merge tool's output is not captured. - Record the comparison and a short conclusion in issue-local
post-change-evidence.md.
Out of Scope
- Changing the rebase policy, the ADR, the skills, or the merge tool. If the results argue for a change, propose it in a new issue.
- Building scripts or tooling for the measurement. Ad-hoc
ghandgitcommands are enough. Record them verbatim. - Measuring the
CI gatework of Require one always-reporting CI gate decided by a Rust tool #2525. If Require one always-reporting CI gate decided by a Rust tool #2525 changes PR workflows during the window, record which changes landed and when, so they are not mistaken for an effect of the rebase policy.
Plan
- T1: do not start before 2026-10-29; record any Require one always-reporting CI gate decided by a Rust tool #2525 workflow change in the window.
- T2: collect the measurements with the Stop requiring pull-request rebases and reconcile repository rulesets #2507 baseline commands (sections 4 to 7) plus the V1 and V4 classifications, recounting the rebase-fallout baseline for 1 to 13 October only.
- T3: compare with the baseline, normalized per merged PR and per day, and conclude; propose any policy change in a new issue.
The specification is added under docs/issues/open/ with the #2507 close-out pull request.
Activity
docs(issues): [torrust#2547] limit the rebase-fallout baseline to 1 t…
docs(issues): [torrust#2547] use the merge's target tip as the refres…
docs(issues): [torrust#2547] classify force-pushes that are not rebas…
docs(issues): [torrust#2507] attribute the delivery-sequence log line…
docs(issues): [torrust#2547] use the merge time that GitHub reports f…
docs(issues): [torrust#2547] log the edits that moved the last-update…
docs(issues): [torrust#2547] classify a force-push by whether it move…
docs(issues): [torrust#2547] label the PR torrust#2531 merge time as …
docs(issues): [torrust#2547] count and classify the force-pushes of t…
docs(issues): [torrust#2547] limit the shared population to the force…
docs(issues): [torrust#2547] state the selection rules as this specif…
docs(issues): add issue specification for #2547
docs(issues): [#2507] record the close-out verification and move the …
Merge #2550: docs(issues): [#2507] record the close-out verification …