Fix self-healing reporting for micro PRs and add a maintainer auto-merge override - #3419
Merged
Conversation
The Slack notification and the run summary both read `has_targets` to decide whether the run produced anything. That output answers a narrower question: whether Sonnet needs to be invoked. It is set from the count of "full" complexity PRs only. Micro-edits are handled by the Router itself, which opens the doc PR and records the URL in router-results.json. A run whose targets are all micro therefore ends with has_targets=false, and was reported as an empty run. On 2026-08-28 that produced a Slack message saying "Router (Haiku) found no documentation targets" minutes after the Router had opened #3418. Both reporting steps now count micro PRs alongside Sonnet's, the way the Notion logging step already did. `has_targets` keeps its current meaning and is only consulted to explain why Sonnet did not run.
The eligibility checks judge form: which files, how many lines, what shape. Form is a proxy, and a change can violate a criterion and still be right. #3418 is the first case: it adds a heading, which check-no-headings refuses outright, and it was reviewed and found correct. There was no way to act on that. Adding `automerge: eligible` by hand does not survive: the `labeled` event re-runs the workflow, the checks fail again on the same criterion, and the label is removed minutes later. `automerge: approved by piwi` records that a human read the PR and vouched for it. The eligibility workflow stops re-judging a PR that carries it, and the cron merges it alongside the gate-approved ones. It overrides form only. The 24-hour quarantine, the required checks and the absence period still apply, and `flag: don't merge` and `flag: merge pending release` still block through check-labels. Merges made on the override are marked as such in the recap, so an override is never presented as a clean pass through the gate.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Collaborator
Author
|
LGTM, merging it 🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two fixes to the self-healing pipeline, both surfaced by the run of 2026-08-28.
The Slack notification and the run summary read
has_targetsto decide whether the run produced anything. That output answers a narrower question: whether Sonnet needs to be invoked, since it is computed from the count of "full" complexity PRs only. Micro-edits are handled by the Haiku Router itself, which opens the doc PR and records its URL in router-results.json, so a run whose targets are all micro ends withhas_targets=falseand was reported as an empty run. That is how the 2026-08-28 run announced "Router (Haiku) found no documentation targets" a few seconds after the Router had opened #3418. Both reporting steps now count the micro PRs alongside Sonnet's, the way the Notion logging step already did.has_targetskeeps its current meaning and is only consulted to explain why Sonnet did not run.The second change adds
automerge: approved by piwi, a maintainer override for the auto-merge eligibility gate. The mechanical checks judge form, and form is a proxy: a change can violate a criterion and still be correct. #3418 is the first case, since it adds a heading and check-no-headings refuses that outright. There was no way to act on that, because addingautomerge: eligibleby hand does not survive: thelabeledevent re-runs the eligibility workflow, the checks fail again on the same criterion, and the label is removed minutes later. The new label records that a human read the PR and vouched for it, the eligibility workflow stops re-judging a PR that carries it, and the cron merges it alongside the gate-approved ones.The override applies to form only. The 24-hour quarantine, the required CI checks and the absence period still apply, and
flag: don't mergeandflag: merge pending releasestill block the merge through the check-labels check. PRs merged on the override are marked as such in the Slack recap so an override is never presented as a clean pass through the gate. The label itself has already been created on the repository. check-no-headings is left unchanged for now.