mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
* feat(ci): Mergify merge queue for release branches + manual-train fallback runbook (WS3.4/WS3.2) D5 final decision (owner, 2026-07-13, post vendor research): Mergify OSS plan — free/unlimited for the public repo, with the two features the volume demands (85-100 active authors/month, 300+ PRs/week peaks, ONE merger): batching + automatic bisection of red batches (log2(N) vs N revalidations). Proven at larger scale by NixOS/nixpkgs. - .mergify.yml: queue for base ~= release/vX.Y.Z (the wildcard GitHub's native queue cannot do); entry ONLY via the owner-applied 'queue' label AFTER the pre-merge star gate (the label IS the approval — Mergify executes, never decides); merge_conditions '#check-failure=0' + '#check-pending=0' respect the path-filtered fast-gates; squash keeps one-commit-per-PR history; label auto-removed after merge. Freeze/cross-session guardrails documented in-file. - docs/ops/MERGE_TRAIN.md (WS3.2): the manual merge-train codified as the FALLBACK runbook (batch -> validate once -> bisect halves on red) + the tiering rationale (per-PR fast-gates, per-tip continuous release-green, per-release full matrix — nothing validated less, just per batch not per PR). - 'queue' label created in the repo. Config validated (YAML parse); Mergify's own config check runs on this PR. * fix(ci): mergify queue must not fail open — require the always-on Merge-integrity check as affirmative success
56 lines
2.7 KiB
YAML
56 lines
2.7 KiB
YAML
# Mergify merge queue — WS3.4/D5 of the v3.8.49 quality/velocity master plan.
|
|
#
|
|
# WHY: ~85-100 active PR authors/month and 300+ PRs/week peaks, all merged by ONE
|
|
# identity. The manual merge-train validated batches by hand; this queue automates
|
|
# it with batching + automatic batch bisection (a red batch of N costs ~log2(N)
|
|
# revalidations instead of N). Mergify Open Source plan: free, unlimited, public repo.
|
|
#
|
|
# GOVERNANCE (non-negotiable, mirrors CLAUDE.md Hard Rules #21/#22 + the owner's
|
|
# pre-merge ⭐ gate):
|
|
# • A PR enters the queue ONLY via the `queue` label — applied by the owner (or a
|
|
# session acting for the owner) AFTER the pre-merge ⭐ report/decision. The label
|
|
# IS the merge approval; Mergify only executes it.
|
|
# • During a release-freeze (open issue labeled `release-freeze`), do NOT label PRs
|
|
# targeting the frozen branch — the freeze is a human-honored coordination signal
|
|
# the queue cannot see. Retarget to the active release/vX+1 first (Hard Rule #21).
|
|
# • Never label a PR another session is actively working (Hard Rule #22b).
|
|
# • Fallback path if Mergify misbehaves or the OSS plan changes: the manual
|
|
# merge-train runbook (docs/ops/MERGE_TRAIN.md) — remove labels, proceed by hand.
|
|
|
|
queue_rules:
|
|
- name: release
|
|
# Any current or future release branch — the reason GitHub's native queue was
|
|
# rejected (no wildcard support on personal-account repos).
|
|
queue_conditions:
|
|
- base~=^release/v\d+\.\d+\.\d+$
|
|
- label=queue
|
|
- -draft
|
|
- -conflict
|
|
# "Everything that ran is green, nothing still running, AND the always-on
|
|
# anchor check succeeded" — robust to the path-filtered fast-gates (docs-only
|
|
# PRs skip code jobs; matrix shard names vary) while never fail-open: a PR with
|
|
# zero checks cannot vacuously merge, because `Merge integrity` runs on EVERY
|
|
# non-draft PR (quality.yml) and must be an affirmative success. Review approval
|
|
# is intentionally NOT a condition here: the owner-applied `queue` label IS the
|
|
# approval in this repo's single-maintainer model (see governance header).
|
|
merge_conditions:
|
|
- "#check-failure=0"
|
|
- "#check-pending=0"
|
|
- "#check-success>=1"
|
|
- check-success=Merge integrity (changelog + generated skills)
|
|
# Batching: validate up to 10 queued PRs together (the manual train's sweet spot);
|
|
# don't hold a lone PR hostage waiting for siblings.
|
|
batch_size: 10
|
|
batch_max_wait_time: 5 min
|
|
# Squash keeps the one-commit-per-PR history the CHANGELOG reconciliation expects.
|
|
merge_method: squash
|
|
|
|
pull_request_rules:
|
|
- name: clean up the queue label after merge
|
|
conditions:
|
|
- merged
|
|
actions:
|
|
label:
|
|
remove:
|
|
- queue
|