From 7a02e2d1ef55acd8b48cd11e7ef3a3398f84fb57 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 19:06:51 +0000 Subject: [PATCH] =?UTF-8?q?ci(lint):=20record=20the=20merge-queue=20check-?= =?UTF-8?q?set=20measurement=20=E2=80=94=20no=20coverage=20gap=20exists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Step 1 of #12211 was a measurement, and it comes back NEGATIVE: every gate step in lint.yml already runs on merge_group, so there is no tree-global ratchet missing queue coverage to wire. The two observations the card called contradictory are both true and do not conflict, because one of them was misread: - the queue DOES run the ratchets. In merge_group run 32847794799 the `Type Check · consumer gates` lane ran and failed on check:exported-any-returns, and the required `TypeScript Type Check` aggregate carried that red into the queue. That is the 12:26-13:05Z mass-dequeue, on innocent candidates, while main itself was red. - the 11:50Z landing did not pass the queue. It produced no merge_group build at all, and its PR-level required checks were green as measured ~3h before the gate that would have refused it existed. So the residual is not a trigger this file is missing; it is that a commit can reach main without a queue build, plus strict_required_status_checks_policy false on the main ruleset. Both are repository settings and maintainer-only. Comment only — no behaviour changes. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01UjM2ia8Av1v5NqfqQEQmC6 --- .github/workflows/lint.yml | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c1c420256e..69e7ed5b2b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,6 +12,45 @@ on: # the trigger alone is enough. merge_group: +# ── MEASURED 2026-08-25 (#12211) — a NEGATIVE result, recorded so it is not +# re-measured. After the stale-ledger outage the queue's check set was measured +# rather than assumed, because two observations of that day read as +# contradictory: a PR landing an inconsistent tree at 11:50Z (which looked like +# "the consumer-gates lane does not run in the queue"), and five queue entries +# dequeued 12:26-13:05Z while main was red (which looked like the opposite). +# +# Both halves were read, and there is NO merge_group coverage gap to close: +# +# - STATIC. Every gate step in this workflow runs on merge_group; the claim +# three lines above is exact. The only event-conditioned step in the file is +# `Save Turbo cache (main only)`, which stores a cache and judges nothing. +# ci.yml is the same shape — its single merge_group exclusion sits on the +# paths filter, which on a queue build widens to "everything changed" +# rather than narrowing. All six required contexts live in these two +# merge_group-triggered workflows (scripts/check-required-contexts.mjs). +# +# - DYNAMIC. 180 merge_group runs of this workflow were read across +# 09:15-18:49Z. In run 32847794799 — a real queue build — the +# `Type Check · consumer gates` lane RAN and FAILED on +# `check:exported-any-returns`, and the required `TypeScript Type Check` +# aggregate carried that red into the queue. Tree-global ratchets do kick +# there; the 12:26-13:05Z dequeues are that gate, on innocent candidates, +# while main itself was red. CI was green on those same merge groups. +# +# What the 11:50Z landing actually was: that commit produced NO merge_group +# build at all — 4 of the 29 PRs landing 09:20-12:10Z produced none — and its +# PR-level required checks were green as measured at 07:20Z, ~3h before the +# gate that would have refused it existed. The residual is therefore not a +# trigger this file is missing. It is that a commit can reach main without a +# queue build, plus `strict_required_status_checks_policy: false` on the `main` +# ruleset (measured 2026-08-18, #9642). Both are repository SETTINGS and +# maintainer-only; neither is reachable from this file. +# +# ⛔ So do not "close the gap" by adding merge_group to the advisory workflows +# (check-links.yml, docs-drift-check.yml, validate-deps.yml, the patrols). A +# non-required check on a queue build costs runners and blocks nothing, and +# check-links.yml's own header already refuses it for that reason. + # Same policy as ci.yml: superseded runs on the same PR/branch waste runners # and delay feedback; cancel them. Push runs to main group by commit ref, so an # in-flight main run is cancelled only by a newer main push.