fix(board): verify the Status field actually moved to Done after a done-move (#178) - #200
Merged
Conversation
…n on parentless follow-ups The post-merge ritual moved an item with `move --status done` and reported success on the item-edit's exit code alone. On iomanage #73 that mutation silently didn't persist: the issue was closed but the Projects Status field stayed at Backlog. A closed issue stuck at a non-Done status is a reliable tell of a dropped board mutation. AC1: runMove now RE-READS the item after the status mutation and confirms the Status field equals the requested key. A concrete mismatch is retried once, then fails loudly (non-zero exit + clear error) rather than reporting a move that never took. An unreadable re-read (item-list index lag, #114) can be neither confirmed nor disproved, so it warns and proceeds unverified instead of manufacturing a false failure. Extracted as verifyStatusMoved. AC3: create.mjs warns loudly when a non-top-level ticket (anything but epic/program) is created without a --parent — the parentless-follow-up smell (#185, #192 were filed orphan). Warning-only path with the exact reparent command; returns a `parentless` flag for callers. AC2: board.test.mjs simulates a move whose re-read still shows the old status and asserts the verification fails non-zero (and retried once). Plus an unreadable-lag case, and AC3 warn/no-warn coverage. Existing move + escalate tests updated to stateful boards so a re-read reflects the mutation. Closes #178 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…he --parent flag Reviewer catch: the AC3 warning keyed off whether --parent was passed this call, so a resumed create of an already-reparented follow-up would false-warn. Now query the issue's real parent (getIssueNode) before warning — matching how every other step in runCreate reconciles against actual state. Only the eligible non-top-level, no-flag case pays the extra read; epics/programs skip it entirely. Added coverage for the resumed-already-parented case. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This was referenced Jul 22, 2026
2 tasks
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.
Closes #178
Problem
On iomanage #73 the post-merge ritual reported "board → Done" but the Projects Status field stayed at Backlog while the issue itself was closed. The
move --status donemutation silently didn't persist, and success was reported on theitem-editexit code alone. A closed issue stuck at a non-Done status is a reliable tell of a dropped board mutation.Fix
AC1 — verify-after-move (
plugin/scripts/board/move.mjs)runMovenow RE-READS the item after the status mutation (newverifyStatusMoved) and confirms the Status field equals the requested key:AC3 — parentless follow-up warning (
plugin/scripts/board/create.mjs)runCreatewarns when a non-top-level ticket (anything but epic/program) is left genuinely orphaned — reconciled against the issue's actual parent viagetIssueNode(not just this call's--parentflag, so a resumed create of an already-reparented follow-up doesn't false-warn). Warning-only path per the ticket; the hint names the exactboard reparentcommand. Real: follow-ups #185/#192 were filed parentless during the autopilot run.Acceptance criteria
done(esp. when the issue is closed).Verification (honest)
pnpm verifygreen locally: 42 files, 371 tests passing.forge:reviewerandforge:securityrun via subagents — security clean (zero critical/high); a reviewer Major on the AC3 warning firing off the flag rather than actual parent state was fixed in commit d8fc4e4 (reconcile againstgetIssueNode, added a resumed-already-parented test).gh pr checks; not watched.🤖 Generated with Claude Code