Uh oh!
There was an error while loading. Please reload this page.
fix(kanban): "no ClosedEvent" is not a hand-close (backend#1411) - #134
Merged
Conversation
Bugbot on .github#127, High. The closer lookup's --jq collapsed FIVE distinct answers into the single token NONE, and NONE now means Done, which kanban-archive hides the next day: ClosedEvent present, closer null -> NONE genuinely hand-closed no ClosedEvent at all -> NONE the timeline said nothing timelineItems.nodes null -> NONE ditto issue null -> NONE nothing was read repository null -> NONE nothing was read Only the first is evidence of a hand-close. The rest are absence of evidence, and just one of them needs to happen once -- a close-event race, a null read -- for shipped work to be terminalized and archived. Command failure was already separated out as ERROR (Bugbot's earlier finding on .github#126); this is the same mistake one level in, in the success path. The filter now answers three ways instead of two, so "the timeline had no ClosedEvent" is its own token: jq: if $e == null then "NOEVENT|" else <typename>|<baseRef> end Both shells already fail closed on an unrecognised token, so NOEVENT lands in exactly the right place without touching either decision: router: not in the PullRequest|Commit|NONE allowlist -> UNREADABLE -> no change reconcile: no NONE / PullRequest / Commit arm matches -> SKIP, no Done asserted That is the allowlist doing its job, so the only behaviour change is that a no-evidence read no longer masquerades as a hand-close. Also fixes two log lines that would now lie: reconcile called NOEVENT a failed lookup when the read succeeded and simply found nothing, and the router's warning said "could not read" for a case where it read fine. NOEVENT gets its own message; the router's says "could not confirm". Verified by extracting both decision blocks and running every token through them under bash -e: jq filter 9 response shapes, incl. last-event-wins -> correct token each router PR/develop|staging|main -> On dev|FR on staging|Prod Commit -> On dev, NONE -> Done NOEVENT, ERROR, empty -> Status unchanged + warning reconcile NONE -> Done, PR/Commit -> stage derived NOEVENT, ERROR -> SKIP, no Done actionlint clean on both files Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
LukasWodka
commented
Aug 3, 2026
ContributorAuthor
bugbot run |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 35ef161. Configure here.
saadqbal
approved these changes
Aug 3, 2026
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Bugbot found this on #127 (High), after the promotion's head advanced to
f7a50e8. It is real, and it is the same mistake as its earlier finding on #126 — one level further in, on the success path this time.Five answers, one token
The closer lookup's
--jqcollapsed five distinct situations intoNONE, andNONEnow meansDone, whichkanban-archivehides the next day. Verified by running the old filter against each response shape:closer: null— genuinely hand-closedNONE|nodes: [])NONE|nodes: nullNONE|issue: nullNONE|repository: nullNONE|Only the first is evidence of a hand-close. The rest are absence of evidence, and any one of them happening once — a close-event race, a null read — terminalizes shipped work and then archives it.
Command failure was already separated out as
ERRORby #128. This is the identical hazard inside the responses that succeed.The filter answers three ways now
Neither decision needed changing. Both shells already fail closed on an unrecognised token, so
NOEVENTlands where it belongs on its own:kanban-closure-routerPullRequest|Commit|NONEallowlist →UNREADABLE→ Status unchangedkanban-reconcileNONE/PullRequest/Commitarm matches →SKIP, noDoneassertedThat is the allowlist doing the job it was written for. The only behaviour change is that a no-evidence read stops masquerading as a hand-close.
Two log lines that would now lie
reconcilecalledNOEVENTa failed lookup when the read succeeded and simply found nothing; the router's warning said "could not read the closer" for a case where it read fine.NOEVENTgets its own message, and the router's now says "could not confirm".Verified by running it, not by reading it
Extracted both decision blocks verbatim from the workflows and pushed every token through them under
bash -e:PR→develop/staging/main→On dev/FR on staging/Prod;Commit→On dev;NONE→Done;NOEVENT/ERROR/empty → unchanged + warningNONE→Done;PR/Commit→ stage derived;NOEVENT/ERROR→SKIPTouches only the two kanban workflows, so it does not overlap #132 (
repo-inventory.yml).🤖 Generated with Claude Code
Note
Medium Risk
Changes only CI workflow shell/jq logic for kanban status routing, but wrong classification still affects which issues get Done/archived versus left unchanged.
Overview
Fixes a fail-wrong path in kanban issue-close routing: the GraphQL closer
--jqfilter used to emitNONEfor both a real hand-close (ClosedEventwithcloser: null) and several “no evidence” shapes (empty timeline, null nodes, missing issue/repo). WithNONEnow mapping to Done (and Done archiving), those ambiguous reads could wrongly terminalize and hide shipped work.Both
kanban-closure-routerandkanban-reconcilenow returnNOEVENT|when there is noClosedEventon the timeline; only a present event with a null closer staysNONE.NOEVENTis treated as unreadable in the router (status unchanged + warning) and explicitly skipped in reconcile (no Done move). Router warning text is tightened from “could not read” to “could not confirm” the closer.Reviewed by Cursor Bugbot for commit 35ef161. Bugbot is set up for automated code reviews on this repo. Configure here.