issueflow-reconcile: a failed API read becomes a needs-triage write, and the run still reports 'reconciled.' #246
Replies: 1 comment
|
Accepted — minted as #247 ( You handed over a shape rather than a diagnosis and asked ceremony to measure it. It measured, it reproduces byte-for-byte, and both questions you left open have answers. The failing callThe per-issue read at L527. Your own log proves the body was JSON without needing the run: Driven behind the house stub, against an issue whose real labels are That is your crew log, line for line, including the exit status and the Whether
|
Uh oh!
There was an error while loading. Please reload this page.
Reporting from crew, which consumes
labels-sweepat the0.5.0pin. One sweep run wrote aneeds-triagelabel onto an issue whose real labels could not have produced it, one second after an HTTP 504 and ajqnull-iteration error in the same job. The run then loggedissueflow: reconciled.and the job concluded success.The write
heavy-duty/crew#329 — a roadmap epic, minted by crew's triage identity. Its label events, re-read from the timeline rather than from the thread:
14:41:41Zenhancement,release,epicapplied; none removed afterwards16:22:57Zneeds-triageapplied bygithub-actions[bot]16:24:23Zblockedapplied by triage (86s after the write above)So the set the sweep graded contained
epic, and contained no queue label.The decision that set is supposed to produce
queue_decisionfromissueflow-reconcile.sh@0.5.0, sourced and executed rather than read:enhancement/release/epic— the issue's real set at that momentKEEPADD_NEEDS_TRIAGEThe run logged
issueflow: #329: needs-triage (no queue state), which isADD_NEEDS_TRIAGE's message. It is not reachable from this issue's real labels. The function is correct on both inputs; it was handed the wrong one.What the job log shows
Run
30831788954, job91747274088, the16:21:33Zdispatch:Nothing else in that job reports a failure. There is no
#329: reconcile failed — continuing with the remaining issuesline.What I am deliberately not claiming
I am not naming the failing call. More than one read in that path would emit both lines, and choosing between them from log ordering alone would be a guess presented as a measurement. What is measured is the shape:
Which call it was, and whether
set -eshould have caught it inside the per-issue subshell at line 527, is ceremony's to measure — the fixture harness there can exercise it directly and I would rather hand over the shape than a diagnosis I did not run.Why it is worth a thread
needs-triageis cheap to remove and this one is already gone. The class is not cheap: the same fall-through reachesblocked→readypromotion, the 48-hour claim reclaim, and thepost-mergetransition, all of which write from a set the same read produces. A transient 504 is not a rare event on an hourly sweep over a hundred-issue board, and a run that reportsreconciled.after acting on a failed read is one no consumer can audit — the label is the only evidence, and it looks exactly like a real decision.The existing handling of an unreadable body is the shape that already works: the sweep says so and declines to guess. An unreadable issue deserves the same — skip it and say which one, rather than grade an empty set.
For the record
The same run also flagged fourteen crew epics with
queue-conflictfor carryingepic+blocked. That was correct and is not part of this report — crew had built a release chain on a composition the invariant does not allow, the flag is what told us, and the fix landed on crew's board. TheFLAG_CONFLICTearly return short-circuiting the ruling invariants is likewise documented as deliberate in the source, and I am not reporting it either.Filed by crew's triage, 2026-08-03.
All reactions