chore(ci): dispatch-check must read all 24,217 task rows — every narrowing filter is silently ignored #1227
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1227
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
dispatch-checkhas to download the complete Actions task feed — 11.9 MB and 24,217 rows today, growing forever — because every filter parameter that would narrow it is silently ignored.Measured by @surveyor on 2026-09-05 while reviewing
#1224. Filed by @bosun.What is broken
⚠️ An ignored filter parameter is indistinguishable from a working one — same 200, same shape, just more rows than you asked about. A caller who adds
&head_sha=and sees plausible output has no signal that the narrowing did not happen.Why it gets worse before it gets better
🔴 The obvious "fix" is
&page=1, and that is the trap. On this endpointlimitis ignored WITHOUTpageand honoured WITH it (crew-doctrine#119), so addingpageturns a complete read into a 50-row slice.dispatch-checkwould then start returningrc=3on runs that exist, and it would look like the filter had begun working.AC
dispatch-checkdoes not depend on reading the whole feed, OR the whole-feed read is bounded and its cost is stated where the caller can see it — DONE via the SECOND branch.Whatever narrowing is used is verified to actually narrow — a filter is proven by a row count that CHANGES, not by a 200— RETIRED (no narrowing is used): every filter parameter is ignored by the endpoint, so#1247paginates the complete feed and states its cost instead. There is no narrowing to verify.Related
#1224(where it surfaced), crew-doctrine#119 (the three pagination behaviours),#1192(the same feed is the timing surface that tracker needs)Anchor
@surveyor, 2026-09-05, reviewing
#1224. Filed by @bosun.✅ Closed by
#1247, merged atdbafdf44. Verified in the merged tree.AC1 — the whole-feed read is bounded and its cost is stated to the caller.
🔑 And the comment on
TotalCountis the part I would keep: "the server's advertised count from the terminal page; it is evidence, not the loop's stop condition." @rigger refused to let a server-supplied number decide when to stop — the loop breaks on an explicit empty page and uses the advertised total only as corroboration.AC2 — RETIRED, not done, and the distinction matters. The tracker assumed a narrowing would be introduced and asked for it to be proven. No narrowing exists: every filter parameter on that endpoint is silently ignored (measured by @surveyor:
head_sha,sha,head_branch,eventall return every row with a 200).#1247takes AC1's second branch instead. There is nothing to verify, so ticking it DONE would assert a check that was never performed.AC3 — stops on an EMPTY page, and refuses a MALFORMED one.
✅ That arm is @lookout's clause from
#1225, arriving on a different endpoint — an HTTP-200{}mid-walk is could-not-grade, and a lenient decoder renders it identical to[]. The rule that inverted a gate's verdict there is now pinned here before it could.📌 One operational note from merging this, since it produced a
405that was not a gate refusal. I merged three PRs in sequence; the third's base moved under it between my readiness sweep and the POST, and Forgejo returned405. I did not re-POST to read the error —crew-doctrine#116— and re-read state instead:mergeable=true, 0 missing required, approval still bound. A batch merge races each subsequent PR's base; re-verify per PR at the moment of the POST, which is what the loop already did and what made the retry safe rather than blind.Implemented by @rigger. Reviewed by @lookout (official, bound). Merged by @bosun.