docs(708): record the live route-2 reproduction against PR #761 #834
@@ -90,5 +90,32 @@ a PR, because `pull_request_target` resolves this definition from `main` — the
|
||||
executed-behaviour tests in `scripts/tests/test_pr_changed_files.py`, each verified by mutation; the
|
||||
live re-check happens on `main` right after merge.
|
||||
|
||||
**Route 2 was reproduced live 2026-08-26 (#708), and it is REFUSED.** Application code was pushed onto
|
||||
the branch of Renovate PR #761 (guarded first with a `WIP:` title prefix, confirmed `draft: true` /
|
||||
`mergeable: false`, so the hijacked head could not merge), then the branch was force-restored to its
|
||||
recorded sha and the PR verified byte-identical across title, head sha, base ref, draft, mergeable,
|
||||
state, labels, body hash, author and milestone. With `AUTHOR: renovate` and a changed set of
|
||||
`Directory.Packages.props` **and** `ErsatzTV.Core/Probe708.cs`, the classifier logged
|
||||
`Decision: state=pending — authored by the 'renovate' bot account, but changes files outside the
|
||||
dependency-manifest set`, and posted `review-verdict/h10=pending`. Before the manifest allow-list the
|
||||
same head would have been `success` on identity alone. The classify step's start marker was present,
|
||||
so this is a real classification and not the #751 silent no-op.
|
||||
|
||||
**Where the refusal reason surfaces — the log, NOT the status description.** The route-2 explanation
|
||||
lives in `reason`, which is only `echo`ed as `Decision: state=… — <reason>`. Of the three description
|
||||
branches, two are distinctive — `Exempt: <reason>` and the raced-repair sentinel `REPAIR_DESC` — and
|
||||
every *other* non-exempt head falls to the generic `Awaiting review verdict for <sha7>`. So a Route-2
|
||||
bot refusal and an ordinary awaiting-verdict head are indistinguishable from the status alone;
|
||||
confirming *which branch* the classifier took means reading the job log. #708's own text expected the
|
||||
reason in the description; it is not there.
|
||||
|
||||
**Cost observed on the same PR, on its ORIGINAL head — not a defect in this record's mechanism.**
|
||||
Re-running the gate on `8798a1d2` (the unmutated head, re-triggered by the `WIP:` title edit via
|
||||
`types: [… edited]`, and five minutes *before* the code push) repaired its exemption to `pending` via
|
||||
#751's conservative page-2 rule: that head's status history runs past `MAX_RESPONSE_ITEMS`, so *any*
|
||||
page-2 rows are assumed raced. It could not have happened on the probe head — the page-2 check sits on
|
||||
the `exempt=yes` path, which a Route-2 refusal never reaches. That is the blunt-instrument case `#763`
|
||||
already predicts, now with a live instance of it; see that issue.
|
||||
|
||||
**Separate defect found reviewing this change:** `ci.grep-q-pipefail-inversion` — a pre-existing
|
||||
SIGPIPE inversion that let a large PR skip the `PROTECTED` guard entirely. Fixed in the same PR.
|
||||
|
||||
Reference in New Issue
Block a user