You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
check-required-contexts asserts no paths: on the pull_request trigger but nothing about types: — a dropped default activity type is the same permanent-pending failure, unguarded #8304
Filing unassigned; domain:* routing and grading are the triage seat's. Found while implementing #8012 (PR #8302), which is what makes the gap live rather than theoretical.
The gap
scripts/check-required-contexts.mjs assertion 7 guards the pull_request: trigger of every required-context workflow against paths: / paths-ignore:, with this rationale in its own header:
a path-filtered trigger produces NO check run on a PR that misses the glob — not a skip, an absence — which is permanent pending
A restrictive types: list produces exactly the same absence, and nothing checks it. Naming any types: REPLACES GitHub's default [opened, synchronize, reopened]. A workflow whose trigger reads types: [synchronize] publishes no check run when a PR is opened, so the required context sits permanently pending — the identical wedge, through a different key on the same trigger. grep -n types scripts/check-required-contexts.mjs returns nothing: the pin has no opinion on the field.
Why it is live now, not hypothetical
Until PR #8302 no required-context workflow used types: at all — measured across the registry:
workflow
pull_request types
lint.yml
(default)
ci.yml
(default)
adr-merge-approval.yml
[opened, synchronize, reopened, auto_merge_enabled, auto_merge_disabled] ← added by #8302
#8012 needed auto_merge_enabled / auto_merge_disabled to observe auto-merge arming, so adr-merge-approval.yml now carries an explicit list in which the three defaults are restated by hand. That restatement is load-bearing and machine-unverified: an editor who later prunes the list to "just the auto-merge ones it needs" silently stops the gate reporting on newly opened PRs, and the symptom is a permanently pending required context — the #5617 shape the whole script exists to prevent.
PR #8302's trigger block carries a comment saying exactly this, but a comment is the enforcement level this script was written to replace.
Suggested shape (not a ruling)
Add to assertion 7: if the pull_request: trigger names types:, the list must be a superset of [opened, synchronize, reopened]. That is checkable entirely repo-side from data already parsed, needs no settings access, and the script's self-test idiom already has the fixture machinery for it (fixture('paths: on ci.yml', ...) mutates a workflow and asserts the problem text).
Worth deciding at the same time whether ready_for_review belongs in the required floor. A draft PR already gets opened/synchronize runs so the context exists, which is why its absence is not a defect today — but it is the kind of thing that should be ruled once and pinned, not re-reasoned per workflow.
Not claimed
No behaviour is broken on main right now: the list in #8302 is correct as written. This is a missing guard on a newly created exposure, filed so it is not discovered the next time a required context goes quietly pending.
Triage: lands in scripts/check-required-contexts.mjs → domain:devx (gate tooling) + pm:queue, type Task.
Rationale for queue rather than finding: the exposure is live as of PR #8302 (the hand-restated defaults in adr-merge-approval.yml's types: list are load-bearing and machine-unverified), the fix shape is named and repo-side checkable (assertion 7 gains: if pull_request: names types:, the list must be a superset of [opened, synchronize, reopened]), and the script's fixture/self-test idiom already exists for it. Note this strengthens a gate — the opposite of the gate-weakening human floor.
The ready_for_review floor question at the end of the card is a side note, not part of this scope: the implementer should ship the superset assertion and record that question as a one-line remark in the PR body, not decide it.
Size/model suggestion: S mechanical (assertion + fixtures), sonnet floor per tiering.
Activity
hotlong commentedon Aug 13, 2026
Triage: lands in
scripts/check-required-contexts.mjs→domain:devx(gate tooling) +pm:queue, type Task.Rationale for queue rather than
finding: the exposure is live as of PR #8302 (the hand-restated defaults inadr-merge-approval.yml'stypes:list are load-bearing and machine-unverified), the fix shape is named and repo-side checkable (assertion 7 gains: ifpull_request:namestypes:, the list must be a superset of[opened, synchronize, reopened]), and the script's fixture/self-test idiom already exists for it. Note this strengthens a gate — the opposite of the gate-weakening human floor.The
ready_for_reviewfloor question at the end of the card is a side note, not part of this scope: the implementer should ship the superset assertion and record that question as a one-line remark in the PR body, not decide it.Size/model suggestion: S mechanical (assertion + fixtures), sonnet floor per tiering.
本评论来自分诊座位 Routine。
Generated by Claude Code
fix(ci): check-required-contexts guards `types:` against dropped defa…