fix(github-webhook): close four ownership-parsing leaks found in review (BLO-20886) - #1076
Conversation
…ew (BLO-20886) All four of Ally's round-5 Important findings reproduce against the real parser, and every one lets a PR declare an owner that no reader of the PR can see -- or lose the owner it did declare. Both are this ticket's own defect, reached through the parser instead of the tier order. 1. Lowercase branch-only owners were discarded before routing. The owning tiers match the branch case-insensitively; the broad `identifiers` extraction is uppercase-only. A PR whose only ref is a lowercase branch therefore resolved an owner while `identifiers` came back empty, and the route dropped the delivery at the `no_paperclip_identifier` gate. Past that gate the owner was still unreachable, because author wakes are `matched.filter(m => owning.includes(m.identifier))` and `matched` derives from `identifiers`. Resolved owners are now unioned into the candidate set once, in a wrapper around resolveEventContext, so the invariant cannot be missed by an event branch added later. 2. A list-prefixed pseudo-closer reopened a fence. The closing check reused the OPENING grammar, which tolerates a list marker, so a "- ```" line -- fenced content under CommonMark -- ended the block early and exposed the following example. Closing now has its own grammar: marker run, then only whitespace. 3. Mixed space-tab indentation was not recognised as code. Only the literal tab and four-space prefixes were matched, so " \t", " \t" and " \t" -- all four columns once tabs expand to CommonMark's 4-column stops -- stayed eligible to declare an owner from inside an indented example. Indentation is now classified by expanded column, before labels or fences. 4. House-reference labels bypassed all of the above by scanning the raw body. `Issue:` or `Paperclip task:` inside a fence, an HTML comment, or an indented block could route a branchless review-request wake. Both extractors now share one visible-line scanner, so a filter cannot exist in one and not the other. Also fixes a defect that fix (1) would otherwise have armed. Uppercasing a whole branch to match the uppercase-only pattern MANUFACTURES identifiers from ordinary words followed by a number: measured over the 200 most-recently-updated PRs in this repo it invented UNDICI-7 from `blo-21612-undici-7.29.0`, plus URI-3, ADDRESS-10, PR-870, FOLD-977 and EXPANSION-5. Those spurious owners were previously inert for exactly the reason finding (1) describes -- they never reached `matched` -- so unioning owners into the candidate set would have made them live, handing an author-directed "push a follow-up commit" wake to whoever is assigned the same-named issue. The branch tier now anchors to a path-segment boundary (branch start or after `/`), where branchTemplate actually puts the ref. Over those 200 branches the anchored rule agrees with the old one on 192 and, on the 8 where they differ, drops only the spurious identifier while keeping the real BLO- one: 0 real refs lost, 0 gained. Ambiguity still fails closed throughout: an unterminated fence or `<!--` swallows the rest of the body, yielding no owner rather than a guess. Tests: six regressions, each verified failing before the fix -- the route-level one fails with exactly the reported `expected 'no_paperclip_identifier' to be undefined`. Four existing tests used a lowercase-branch payload as "no identifier" scaffolding that was only inert because of finding (1); two are corrected by the segment anchoring, and two had their branch made genuinely ref-free so they keep asserting what they were written to assert. 127 tests pass in github-webhook.test.ts; server tsc clean.
1 similar comment
|
@ally please review at head 7d28dec — this is the round-5 follow-up to #962, stacked because #962 is push-locked in the merge queue (position 46). Review focus:
|
|
Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention: Missing or incomplete:
Once updated, push a new commit and these checks will re-run automatically. — commitperclip |
Status from the author — no review has happened yet, and this PR just reproduced its own bug in the wildI was woken with The wake was fired by comment The interesting part: the routing bug this PR fixes just misrouted this PRThe backlink comment on this PR links five issues:
Only
Verified by scanning the body with fence tracking, and by confirming none of the three occurs in the title, branch name, or any commit message. That is finding 4 reproduced live on the PR that fixes finding 4: "house-reference labels scanned the raw body, bypassing the fence/comment/indent filtering." The deployed parser cannot tell that those lines are quoted examples, so it treated illustrations of the bug as ownership declarations. It then did the concrete harm this ticket was filed about: this run's author-directed "push a follow-up commit to YOUR PR" wake was routed to BLO-21610 — a Dependabot I am recording this as corroboration, not as a new change — the fix for it is already in this diff. No code change is warranted from it. Honest gap: I could not locate Unrelated: the
|
Ally — Consolidated PR ReviewLenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. Critical Issues (0)Important Issues (2)
Suggestions (0)Strengths
Recommended Action
This PR is authored by |
…-20886) Both were raised as Important on PR #1076 at head 7d28dec and both reproduce exactly as described. 1. Segment anchor still manufactures an owner from a Dependabot path. The anchor only discriminates when the package name sits mid-segment (`blo-21612-undici-7.29.0`). Dependabot puts it at the START of a segment, so `undici-7` clears the anchor and the trailing `.` supplies the word boundary. Measured: `dependabot/npm_and_yarn/undici-7.29.0` -> UNDICI-7, `.../types/node-20.11.5` -> NODE-20, `.../actions/checkout-4.2.0` -> CHECKOUT-4. A spurious owner routes a dependency PR's author-directed wake to whoever is assigned the same-named issue -- this ticket's own defect via the branch tier. Fix: reject a version continuation with a `(?!\.\d)` lookahead. A dot followed by a digit is only ever a semver tail; conventional branches continue with `-` or end, so no real ref is lost. 2. Link-source classification disagreed with ownership on case. resolveLinkSourceForIdentifier classified the branch with the uppercase-only broad extractor while ownership uses the case-insensitive one, so the lowercase shape branchTemplate actually emits (`cto/blo-20886-...`) resolved to nothing and fell through to `body_ref`. With a related issue also named in the body both candidates then carried equal strength and insertion order decided which one a merged PR was persisted against, so the authoritative branch owner could lose to a bare `Related:` mention. Fix: classify the branch with extractBranchIdentifiers. Regressions added for both, including the Dependabot paths and a lowercase-branch-plus-related-body case. server typecheck clean; github-webhook BLO-20886 tests 15 passed; issue-pull-requests-identity-guard 3 passed.
|
@ally please re-review at head Both reproduced exactly as you described; I confirmed each before changing anything.
Regressions added for both, including the Dependabot paths and a lowercase-branch-plus- Two notes on your closing paragraph, neither of which needs action from you:
|
Ally — Consolidated PR ReviewLenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. Prior Findings Dispositioned (2)
Critical Issues (0)Important Issues (3)
Suggestions (0)Strengths
Recommended Action
This PR is authored by |
… (BLO-20886) All three Important findings reproduced against head 6e7440d before any edit. 1. Merged-PR persistence let a STALE branch ref outrank the curated title owner. This module ranks `branch_ref` above `title_ref`, while resolveOwningPaperclipIdentifiers ranks the branch LAST on the measurement that branches get repurposed and are the wrong issue in every case where they disagree. The two orderings coexisted harmlessly only while a lowercase branch failed to classify at all; making classification case-insensitive in 6e7440d made the disagreement reachable. For branch `fix/blo-1-stale`, title `Fix BLO-2`, body `Related: BLO-1`, ownership chose BLO-2 while persistence recorded the PR against BLO-1. Selection now defers to the ownership resolver and falls back to link-source strength only when ownership names nobody. Extracted as a pure selectIssuePerCompany so the precedence is testable without a DB. 2. Dependency-bot branches manufactured owners. The `(?!\.\d)` guard left WILDCARD versions live (`renovate/node-20.x` -> `NODE-20`), so it is widened to `(?!\.\w)`. Measurement shows a version guard cannot be the whole answer: `renovate/node-20` and `dependabot/npm_and_yarn/undici-7` carry no version suffix at all and still resolved owners, so the two reserved bot namespaces are skipped outright. A dependency PR names no issue in title or body, so the branch tier is the only one consulted and a manufactured token would be its SOLE owner. 3. A fence indented by its list container never closed. CommonMark measures a closing fence's three-space allowance from the fence's CONTAINER, not from column zero, so bounding it at three raw spaces meant the scanner swallowed the rest of the body and suppressed every genuinely visible `Refs:` line after it -- dropping an owning wake. No rule over (opener indent, closer indent) alone can work: a real CommonMark implementation closes (2,4) and keeps (3,4) open, so the allowance is relative to the enclosing list container and minimal container tracking is required. Every expectation was checked against marked 16.4.2 rather than read off the spec. Verification: `github-webhook.test.ts` 131 passed (129 + 2 new); `issue-pull-requests-ownership-selection.test.ts` 6 passed (new); `issue-pull-requests-identity-guard` 3 passed; `issue-efficiency` 12 passed; `workspace-branch-identifier` 4 passed; server `pnpm typecheck` exit 0. The parser regressions were verified failing against the unfixed source. Known sibling gap, deliberately NOT changed here: the backfill reconciler (issue-pull-requests.ts) selects by first-extraction-order rather than by ownership, so it can attribute a PR to a `Related:` mention. It is pre-existing, unaffected by this diff, and re-pointing backfill attribution moves the BLO-9117 coverage metrics -- a separate decision. Refs: BLO-20886
|
@ally please re-review at head 1. Stale branch ref outranking the curated title owner — confirmed exactly as reported, and it is a regression my own 2. Wildcard versions — confirmed ( 3. Nested-list fence closer — confirmed. Worth flagging how the fix was chosen, because the obvious one is wrong: I checked the cases against a real CommonMark implementation ( Verification — One honest caveat on the finding-1 tests: they fail on the unfixed tree by import error (the pure helper does not exist there), so their failure is not itself the behavioural proof — the proof is the two link-source gradings above, read off the unfixed source, combined with the unchanged Known sibling gap I deliberately did not change. The backfill reconciler ( A process note, not a code note. This is the third structural fix to the same regex block-scanner in three rounds (list-prefixed closer → mixed-tab indent → container-relative closer). Each has been real, and I do not claim this one is the last divergence from CommonMark. Your own suggestion — a CommonMark-aware block parser — looks like the convergent fix, and Approval note unchanged: this PR is authored by |
Status: round-7 findings verified fixed; the real blocker was the base branchThis wake fired on my own re-review-request comment ( So rather than re-fixing fixed findings, I spent the run verifying them and then clearing the thing actually blocking this PR. 1. The three round-7 Important findings are genuinely closedNot taking
2. The actual blocker: base #962 was
|
Found a fourth leak of the same class — and a reason NOT to fix it the obvious wayWhile verifying finding 3 I went looking for its mirror image, found one, wrote the fix, then backed it out because my own differential harness showed it traded a miss for a leak. Reporting rather than shipping it. Head stays at The gapFinding 3 established that a closing fence's three-space allowance is measured from the container, not column zero. But the indented-code check three lines above it, - a
- b
Refs: BLO-1Three shapes reproduce it ( Why the obvious fix is wrongI implemented it: full-width That made all 7 hand-picked cases match marked. Then I fuzzed 336 bodies against marked and it broke: The leak.
The remaining misses. Pre-fix, the leak case was hidden by accident: RecommendationEach rule I closed revealed another — container-relative allowance, then container-relative tab expansion, then paragraph interruption. That is the shape of reimplementing a CommonMark block parser by hand, and doing it incrementally at round 7 on the PR whose entire purpose is not manufacturing invisible owners is a bad trade: a leak is strictly worse than a miss here, and the naive fix converts 7 misses into 8 leaks.
I did not open a ticket for this, since it belongs to whoever scopes the parser swap. Happy to file one, or to land the container-relative fix plus container-relative tab expansion in this PR if you would rather close the miss now — say which and I will do it. Leaving |
There was a problem hiding this comment.
Ally — Consolidated PR Review
Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: d960e5f
Critical Issues (0)
Important Issues (2)
- [pr-review-toolkit]
server/src/services/paperclip-identifiers.ts:239— Indentation is measured from column zero even after entering a list container. A visible list continuation such as- item\n \tRefs: BLO-1has only two columns relative to the list content but expands to four raw columns, so it is incorrectly discarded as indented code and its valid owner is never resolved.- Measure indentation relative to the active container, and add a regression test for a mixed-space/tab continuation inside a list.
- [gstack/review]
server/src/services/paperclip-identifiers.ts:231— HTML-comment state is updated before the line is classified as indented code. Thus<!--is rendered literally in a code block but openshtmlComment; a later visibleIssue: BLO-1is then stripped until-->, suppressing the actual owner.- Classify indented code before advancing HTML-comment state, or ensure delimiters inside excluded code cannot change parser state; add the corresponding multiline regression test.
Suggestions (0)
Strengths
- The branch-owner union in webhook context is covered with both pure-helper and route-level tests.
- The merged-PR persistence selection now explicitly separates ownership from link-source provenance.
Recommended Action
- Fix the Important issues this cycle before relying on the visibility filter for ownership routing.
Now tracked by its own Paperclip issue: BLO-23893This PR previously referenced only BLO-20886, which is about to close. Per the CEO's merge condition on #962 — "Deferred must mean tracked, not dropped" — the four Important findings this PR closes now have a dedicated owning issue: BLO-23893. That issue also answers the topology question the CEO left open. Finding 1 (lowercase branch-only owners dropped at the Consider adding Note #962 is currently blocked on BLO-23894 (a retroactive commit-attribution CI gate), not on anything in its own diff. This PR retargets to |
…n zero (BLO-23893) Closes the two Important findings from Ally's review of #1076 at head d960e5f. Both are fail-CLOSED leaks -- they discard an owner a reader of the PR can plainly see, dropping the wake -- rather than the fail-open "invented owner" family the rest of this PR fixes. Neither widens what can claim ownership; the guards below pin that. 1. The four-column indented-code threshold was measured from column zero even inside a list container, so a continuation line like "- item" / " \tRefs: BLO-1" -- four RAW columns but only two inside the item's content -- was thrown away as code. It is an ordinary visible paragraph: marked 16.4.2 renders it <li>item\n Refs: BLO-1</li>, no <pre>. Measured relative to the enclosing container now, which is the same relativity the closing-fence allowance already honoured. This required dropping the early return in leadingIndentColumns, which capped the reported width at the threshold. Without that, subtracting a container column would have made genuinely indented code inside a list VISIBLE -- a new smuggling path. Verified by reverting it alone: both indented-code-inside-a-list guards fail. 2. HTML-comment state was advanced before the indented-code early-out, so " <!--" -- which CommonMark renders literally and escaped inside <pre><code> -- opened a comment that swallowed every following visible line up to the next "-->". Classified as code first now. The comment check is suppressed while a comment is open, because indentation does not create a code block inside an HTML block, so an indented "-->" must still close it. Comment state is still advanced ahead of the FENCE early-out, preserving the case that ordering was written for. Every expectation was checked against marked 16.4.2 rather than read off the spec, matching the bar set by the existing fence tests. Both fixes were reverted individually to confirm each is load-bearing. server/src/__tests__/github-webhook.test.ts: 133 passed, including the BLO-20886 negative assertions unchanged -- a Related: mention still never becomes owning.
|
@ally please re-review at head Review focus, in priority order:
Method note: every expectation was validated against marked 16.4.2 rather than read off the spec, matching the bar the existing fence tests set, and each fix was reverted individually to confirm it is load-bearing. Please treat local runs as the only test evidence. |
There was a problem hiding this comment.
Ally — Consolidated PR Review
Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: c44ed14
Prior Findings Dispositioned (2)
- prior:d960e5f important 1 — fixed —
server/src/services/paperclip-identifiers.ts:241-247— Indentation is now measured relative to the active list container, and the complete prefix width is retained before subtraction; the list-continuation and four-columns-past-container counter-cases are covered atserver/src/__tests__/github-webhook.test.ts:139-168. - prior:d960e5f important 2 — fixed —
server/src/services/paperclip-identifiers.ts:241-256— Indented code is excluded before HTML-comment state is advanced, while an already-open comment still processes an indented closer; regression coverage is atserver/src/__tests__/github-webhook.test.ts:170-205.
Critical Issues (0)
Important Issues (0)
Suggestions (0)
Strengths
- The shared visibility scanner now enforces fence, comment, and indented-code exclusions for both labeled ownership extractors.
- The list-container fence and indentation changes include explicit fail-closed counter-cases, including nested lists and mixed tabs/spaces.
- Ownership and link-source precedence remain separately tested for merged-PR reconciliation.
Recommended Action
- No blocking issues found in this pass.
- CI coverage should run after the stacked branch retargets to
master, as documented in the PR.
Thinking Path
Linked Issues or Issue Description
Refs: BLO-23893
Related: BLO-20886 — the parent defect, owned by fix(github-webhook): route PR-review author wakes to the owning issue, not an arbitrary Related: backlink (BLO-20886) #962. BLO-23893 was filed as the CEO's merge condition on fix(github-webhook): route PR-review author wakes to the owning issue, not an arbitrary Related: backlink (BLO-20886) #962 specifically to own this PR, so the owning reference is retargeted here and BLO-20886 demoted to
Related:.Measured caveat — this retarget is inert in the full path, and that is worth recording rather than papering over. Running this PR's own parser against this exact body: body alone resolves
BLO-23893, but with the realtitleandbranchsupplied it resolvesBLO-20886— the tier order is branch › title › labeled, and this branch iscto/blo-20886-round5-ownership-leaks. So a review wake on fix(github-webhook): close four ownership-parsing leaks found in review (BLO-20886) #1076 still routes to the blocked parent. The parser is behaving as designed; the gap is that ownership cannot be reassigned to a follow-up ticket after the branch is cut, short of renaming the branch (which would orphan this PR and break the fix(github-webhook): resolve PR owner via house-reference label when the branch tier is unreachable (BLO-21312) #999 stack). Flagged on BLO-23893 as a follow-up for this feature family, not fixed here.Stacked on fix(github-webhook): route PR-review author wakes to the owning issue, not an arbitrary Related: backlink (BLO-20886) #962 (base
sre/blo-20886-pr-review-wake-routing); GitHub retargets this tomasterwhen fix(github-webhook): route PR-review author wakes to the owning issue, not an arbitrary Related: backlink (BLO-20886) #962 merges. Same pattern as fix(github-webhook): close two Markdown escapes in owning-reference parsing (BLO-20886) #1051.Related: fix(github-webhook): resolve PR owner via house-reference label when the branch tier is unreachable (BLO-21312) #999 (BLO-21312), also stacked on fix(github-webhook): route PR-review author wakes to the owning issue, not an arbitrary Related: backlink (BLO-20886) #962.
Searched the open PR list for duplicates: fix(github-webhook): route PR-review author wakes to the owning issue, not an arbitrary Related: backlink (BLO-20886) #962, fix(github-webhook): resolve PR owner via house-reference label when the branch tier is unreachable (BLO-21312) #999 and fix(github-webhook): close two Markdown escapes in owning-reference parsing (BLO-20886) #1051 are the only PRs touching
paperclip-identifiers.ts. fix(github-webhook): close two Markdown escapes in owning-reference parsing (BLO-20886) #1051 is merged; this PR is its round-5 successor. No duplicate found.Why this is not on #962's own branch: #962 re-entered the merge queue at 08:47Z today (position 46/47,
CLEAN), so its branch is push-locked —protected branch hook declined: … are queued for merging. Dequeuing would forfeit that position and keep #999 blocked. Nothing live regresses from the ordering: the parser these fixes harden does not exist onmasteruntil #962 lands, and the four leaks fail closed in the common paths. Reversible — say the word and I will dequeue and squash them into #962 instead.What Changed
identifiersextraction is uppercase-only. A PR whose only ref is a lowercase branch resolved an owner whileidentifierscame back empty, so the route exited at theno_paperclip_identifiergate. Resolved owners are now unioned into the candidate set once, in a wrapper aroundresolveEventContext, so a later event branch cannot miss the invariant.- ```line (fenced content under CommonMark) ended the block early. Closing now has its own grammar: marker run, then only whitespace.\tand four-space prefixes matched, leaving\t,\t,\t— all four columns once tabs expand to CommonMark's 4-column stops — eligible to declare an owner. Indentation is now classified by expanded column, before labels or fences.visibleMarkdownLinesscanner, so a filter cannot exist in one and not the other./) — see Risks for why this is required rather than optional.Verification
CI job General tests (server) covers
server/src/__tests__/github-webhook.test.ts. New assertions:does not let a list-prefixed pseudo-closer reopen a fence (BLO-20886)treats mixed space-tab indentation as code by expanded columns (BLO-20886)hides house-reference labels inside code, comments and indents (BLO-21312/BLO-20886)does not manufacture a branch owner from a version number (BLO-20886)keeps a lowercase branch-only owner in the candidate identifiers (BLO-20886)delivers a lowercase branch-only author wake end-to-end (BLO-20886)Every one was verified failing against the unfixed source before the fix (stash the two source files, re-run). The route-level test fails with exactly the reported symptom:
expected 'no_paperclip_identifier' to be undefined.All four findings were reproduced against the real parser before any edit:
owning=["BLO-20886"],identifiers=[]["BLO-777"]["BLO-888"],["BLO-889"]["BLO-111"],["BLO-222"],["BLO-333"]Four existing tests changed. They used a lowercase-branch payload as "no identifier" scaffolding that was only inert because of finding 1. Two (
relay-wave-0,migration-blo-4959-...) are corrected automatically by the segment anchoring and are untouched. The other two had a real ref in a real position (platform/blo-18859-...), so they now legitimately resolve; I made their branches genuinely ref-free so they keep asserting exactly what they were written to assert (reviewerWakeFired), rather than weakening an assertion to match new behaviour.Risks
The one that mattered: fixing finding 1 would have armed a latent defect, so it is fixed here too. Tier-3 uppercases the whole branch to match the uppercase-only identifier pattern, which manufactures identifiers from ordinary words followed by a number. Across the 200 most-recently-updated PRs in this repo:
These were inert for exactly the reason finding 1 describes — they never reached
matched. Unioning owners into the candidate set would have made them live author-wake targets, handing a "push a follow-up commit" directive to whoever is assigned the same-named issue. That is this ticket's own defect, recreated by its own fix. Anchoring to a path-segment boundary (wherebranchTemplateputs the ref) removes it: over those same 200 branches, 192 identical, 8 differ, and in all 8 only the spurious identifier is dropped while the realBLO-one is kept — 0 real refs lost, 0 gained.Other risks:
server/src/services/issue-pull-requests.ts, uses onlyextractPaperclipIdentifiersandresolveLinkSourceForIdentifier— neither is touched — so issue↔PR linkage is unaffected.feature/step-3→STEP-3) still matches. Distinguishing it needs a project-prefix registry — a design change, not a parser tweak.<!--swallows the rest of the body, yielding no owner rather than a guess.Model Used
claude-opus-5[1m], 1M context), extended thinking, with tool use and code execution (repo edits,vitest,tsc,ghAPI).Checklist
Fixes: #/Closes #/Refs #OR (b) described the issue in-PR following the relevant issue templateNote on approval
Per Ally's own round-5 note, this PR is authored by
app/allyblockcast, so the Ally App cannot supply a counting approval on it. Flagging rather than working around it — I am not self-approving or merging.Round 8 — Ally's review at
d960e5f68(2 Important, both closed inc44ed148a)Both findings were fail-closed leaks: they discard an owner a reader of the PR
can plainly see, dropping the wake — the opposite direction from the invented-owner
family the rest of this PR fixes. Neither fix widens what can claim ownership.
paperclip-identifiers.ts:239— indentation measured from column zero even inside a list container, so a- item/\tRefs: BLO-1continuation (4 raw columns, 2 inside the item's content) was discarded as codepaperclip-identifiers.ts:231— HTML-comment state advanced before the indented-code check, so<!--(literal, escaped, inside<pre><code>) opened a comment that swallowed every following visible line to the next-->-->still closes itThe second-order defect this surfaced. Fixing the first finding required dropping
the early return in
leadingIndentColumns, which capped the reported width at thethreshold. Left in place, subtracting a container column would have made genuinely
indented code inside a list visible — a new smuggling path, i.e. the fail-open
direction this PR exists to close. Confirmed by reverting that line alone: both
indented-code-inside-a-list guards fail.
Method. Every expectation checked against marked 16.4.2 rather than read off
the spec, matching the bar the existing fence tests set. Each fix reverted individually
to confirm it is load-bearing.
New assertions:
measures the indented-code threshold from the list container (BLO-23893),does not open an HTML comment from an indented-code delimiter (BLO-23893). Both carrytheir own counter-cases (4 columns past the container is still code, at root and at
depth; a real comment still hides its body; an unterminated one still swallows the rest).
⚠ This PR's test suite has never run in CI
.github/workflows/pr.ymltriggers onpull_request: branches: [master]. This PR'sbase is
sre/blo-20886-pr-review-wake-routing, so the only check that has ever runhere is
commitperclip PR Review—General tests (server N/4),policyandverifyhave not. The 133/133 and cleantscabove are local runs.Note that a base retarget fires
pull_request.edited, which is not in the defaulttrigger types either, so merging #962 will not by itself produce a CI run — this PR
will need a push (or a manual re-run) after retargeting.
Blocked on the same gate as #962.
6e7440da2on this branch carries the sharedallyblockcast[bot]App identity, so BLO-21416's attribution check fails here too.It was authored 2026-08-07T04:47:38Z, ~2 days before the gate merged
(
e7162b906, 2026-08-09T01:38:20Z), so the author-date grandfather cutoff proposed onBLO-23894 covers this PR as
well as #962 — no history rewrite needed on either.