Skip to content

fix(planning): keep the Notes send toast across a state push - #11853

Merged
kyle-sexton merged 5 commits into
mainfrom
work-resolve-issue/issue-11843-41275815373-1
Nov 1, 2026
Merged

kyle-sexton merged 5 commits into
mainfrom
work-resolve-issue/issue-11843-41275815373-1

Conversation

@melodic-automation-lanes

Copy link
Copy Markdown
Contributor

Closes #11843

Summary

Opened by the work-resolve-issue lane. The run's own summary:

The interview page's Notes panel rebuilt #noteToast empty whenever a state push re-ran renderFly() while the note box lacked focus, so the send toast ("Queued, Claude is busy") vanished before it could be read. The toast text is now held in state (S.noteToast, plus S.noteQueued for the busy suffix), the same pattern the main toast uses with S.toast and renderToast(), and renderNotes() writes it back on every rebuild. The busy suffix is recomputed through queued() at render time, so it drops once the wake is handled. The held text is cleared on a failed send and when the panel switches away from Notes (showFly), and a send that finishes after the panel closed holds nothing. A new phase-13 journey check reads the toast again after a confirmed server state frame.

Not verified

  • The planning surface journey suite (bash plugins/planning/surface/surface-journey.test.sh, which needs playwright-cli and a running interview server) was not run: this lane runs no interpreter or test runner. That includes the new phase-13 check and the existing check at ui_journey.js:719. Both are
  • Tidy, pass 1: I reverted my own edit that built the new /api/wait URL from the existing base helper, because tidy-diff's hard rules forbid changing a test. Left as a proposal: plugins/planning/surface/tests/ui_journey.js:721 could use base + "api/wait?..." in place of reading location.origin again
  • Tidy, pass 5 (/ai-slop:audit fix on the changelog fragment): only the judgment rubric was applied, and it found nothing. The lane allows no plugin script run, so detect.sh, digest-guard.sh and the findings-file steps did not run.
  • Tidy ran before the review fixes, so the review-fix lines in index.html (noteToastText, the say() guard, the else branch) and the changelog edit were not tidied.
  • The new phase-13 check proves the toast survives the next state frame. Nothing checks the busy suffix dropping once the wake is handled: no journey check reads the toast after the shell handles the second note.

Fix

  • plugins/planning/surface/index.html: add noteToast and noteQueued to the S state object; add noteToastText(), which rebuilds the toast text and adds the queued() suffix only while the wake is still in flight; renderNotes() writes that text into #noteToast; sendNote() stores its messages through a sa
  • plugins/planning/surface/tests/ui_journey.js: phase 13 adds the check 'the Notes send toast outlasts the next state push'. It records window.__io.applied, delivers the second note through /api/wait so the server pushes a state frame, waits until a new frame is applied, then expects #noteToast to sti
  • plugins/planning/surface/surface-checks.sh: CHECKS[journey] goes from 235 to 236, so the SKIP tally counts the new journey check.
  • .changes/planning/work-resolve-issue-issue-11843-5b1e9c3d.md: new patch changelog fragment under Fixed. It was written by hand because new-changelog-fragment refuses on a detached HEAD.

Verification

The runner ran each check from the base copy against b7d85c7:

  • scripts/check-changelog-fragments.sh --check: passed

The run reports:

  • /home/runner/work/claude-code-plugins/claude-code-plugins/.lane/checks/bin/check-changelog-fragments: all 32 fragments valid, after the final edits
  • /home/runner/work/claude-code-plugins/claude-code-plugins/.lane/checks/bin/check-affected: 12 passed, 6 skipped (no changed .py, typos not installed, three validate-plugins sub-checks that run code from the checked tree, no changed skill), after the final edits
  • Grep for line citations into plugins/planning/surface/index.html (surface/index.html:<n> or #L<n>): none found, so the added lines move no cited line
  • Fresh-context review subagent over the whole diff: no high-severity bug. It confirmed every panel switch goes through showFly, the toast text is escaped (esc() and textContent), the new check is deterministic (a frame comes when /api/wait registers a waiter and again when the second note is delivere
  • The lane run: https://github.com/melodic-software/claude-code-plugins/actions/runs/41275815373

Left out: the items under Not verified.

Related

#11843

Lane-Activity: work-resolve-issue/resolve-issue
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

claude-security-review reviewed 56c5a3f16990bf85ab9878e34678238e36f8dd18: read 2 of 2 changed file(s); 0 finding(s), 0 as inline comments.

Security review (incremental, since 4071cfa)

I found no security issues in the changes since the last review.

What I read: all of .claude-lane/incremental.diff (both files) and the PR context.

  • plugins/planning/surface/index.html
    • showFly() now clears S.noteQueued as well as S.noteToast whenever the panel moves away from Notes.
    • The say() helper in sendNote() now drops the queued list as well as the message when Notes is closed.
    • Both edits only reset client-side UI state. The toast text still reaches the page through textContent. No new HTML sink, network call or storage key is added.
  • plugins/planning/surface/tests/ui_journey.js: adds a Playwright journey check (page.$eval, a click inside page.evaluate, a text read) that runs against the local test server. It handles no credentials and takes no untrusted input.

What this change doesn't touch:

  • No trusted-path file, trust control, workflow, plugin manifest or instruction surface. The diff deletes or softens no instruction.
  • Spend: none. The test suite gets one more check, and nothing here can create a charge.

critical-findings: 0

@melodic-automation-lanes

melodic-automation-lanes Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor Author

Unattended merge: native auto-merge leaves this pull request unarmed at head 56c5a3f16990bf85ab9878e34678238e36f8dd18. The lanes clear this reason on their own; the next scheduled run judges it again.

pr-merge's gate refuses its verifier verdict (verify:missing)

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on b7d85c70bb6ffbbeae30fac35171a30a02e40a3d; the summary is in this lane's pull request comment.

claude-lane: claude-review

Comment thread plugins/planning/surface/index.html Resolved
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

claude-review reviewed 56c5a3f16990bf85ab9878e34678238e36f8dd18: read 2 of 2 changed file(s); 0 finding(s), 0 as inline comments.

Incremental review: no findings. This covers only what changed since 4071cfa in plugins/planning/surface/index.html and plugins/planning/surface/tests/ui_journey.js.

What changed

  • showFly() (index.html:1884): switching away from Notes now clears both S.noteToast and S.noteQueued.
  • The say() guard in sendNote() (index.html:2302): if a send finishes after the panel has closed, it now drops the queued seqs as well as the message.

Before this change, noteToastText() (index.html:1826) could still add the queued() busy suffix when S.noteToast was empty. Reopening Notes while the earlier wake was still in flight then showed the busy note with no message in front of it. With both fields cleared together, renderNotes() now rebuilds #noteToast empty in that case.

Paths checked

  • Every way of closing or switching away from Notes goes through showFly: the close button (index.html:2558), the tabs and loose links (index.html:2555), and the keyboard tab roving (index.html:2607). openPanel also calls showFly, so the new clearing applies on every route.

New journey check (ui_journey.js:731-735)

  • It checks that the panel actually closed and that #workLine still shows a wake in flight before it reads the toast. If either precondition fails, the check fails with a message saying which one, instead of passing on a state that proves nothing.
  • document.querySelector('[data-panel="notes"]').click() opens Notes in all cases. It uses showFly if it hits the #tabs button or openPanel if it hits the rail button. S.fly is null after the close, so openPanel opens the panel rather than toggling it shut.
  • Without the fix, this check would fail because the toast would read the busy suffix alone.

Not verified: I did not run the journey suite; this lane has no shell. The PR author also says they did not run it, so the new check is unverified.

No closing-issue criterion is affected by this increment beyond what was reviewed at 4071cfa. No plugin manifests changed. No spend or cost impact.

@melodic-automation-lanes

melodic-automation-lanes Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor Author

The pr-unblock lane stopped address-feedback on this pull request: the pull request has an unresolved review thread the lane does not take (a reviewer it does not act on, a review of an older head, or a thread it already answered), so no lane resolves it and a session builder takes it. The lane labels it needs-session for a session builder, who makes the change this lane cannot, and the run ends in a failing pr-unblock/address-feedback status on the head the lane gated.

When a retry on this head can change the outcome, the lane runs one on its own, up to its per-head cap, and edits this comment if it stops again; a run that does not stop clears the status. When no retry can (a review thread the lane does not take or settle, or a failing check after the retries are spent), a person resolves the threads or gets the checks green, then dispatches the workflow below: that run finds the cause gone and clears the status. On a pull request the lanes App opened, the dispatchers start that run once per stop; on any other, a person does. A new commit to the branch starts clean.

To run it again on this head now, dispatch the pr-unblock workflow:

gh workflow run pr-unblock.yml -R melodic-software/claude-code-plugins -f pr-number=11853 -f activity=address-feedback

@melodic-automation-lanes

Copy link
Copy Markdown
Contributor Author

A lane run on this pull request's head failed because the token broker refused it as workflow-modified: .github/workflows/pr-run-activity-write.yml changed on main after the run's event, and a rerun keeps the old file. pr-merge pushes an empty commit so the next pr-unblock run uses main's files. It does this once per version of that file, so if a run fails the same way again, a person looks at it. The push starts no run itself: the conflict-resolution run starts at the next push to main or half-hourly pr-unblock-dispatch tick, or when a listed person runs it by hand, and an address-feedback run can start after both review lanes review the new head, if an unresolved thread is left for it.

The token broker refused a lane run on the previous head as workflow-modified (.github/workflows/pr-run-activity-write.yml). This commit changes no file.
@melodic-automation-lanes melodic-automation-lanes Bot added the needs-session A pr-unblock stop a session builder takes: a change the lane cannot make. Not an owner stop. label Nov 1, 2026
Lane-Activity: pr-unblock/resolve-conflicts

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

claude-review: 1 inline finding(s) on ec08ddd319722b7fd944dfe87eddaf1fc46700de; the summary is in this lane's pull request comment.

claude-lane: claude-review

Comment thread plugins/planning/surface/index.html Resolved
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor Author

The unattended merge path armed native auto-merge at head ec08ddd319722b7fd944dfe87eddaf1fc46700de.

Lane-Activity: pr-unblock/address-feedback
Lane-Thread: PRRT_kwDOTCGFQM6yYBsx
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor Author

pr-unblock / address-feedback finished round 1 of max 4 on 4071cfa.

@kyle-sexton kyle-sexton removed the needs-session A pr-unblock stop a session builder takes: a change the lane cannot make. Not an owner stop. label Nov 1, 2026
Lane-Activity: pr-unblock/address-feedback
Lane-Thread: PRRT_kwDOTCGFQM6yXweM
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor Author

pr-unblock / address-feedback finished round 2 of max 4 on 56c5a3f.

@kyle-sexton
kyle-sexton added this pull request to the merge queue Nov 1, 2026
@melodic-automation-lanes

Copy link
Copy Markdown
Contributor Author

The unattended merge path armed native auto-merge at head 56c5a3f16990bf85ab9878e34678238e36f8dd18.

Merged via the queue into main with commit 0317d38 Nov 1, 2026
48 checks passed
@kyle-sexton
kyle-sexton deleted the work-resolve-issue/issue-11843-41275815373-1 branch November 1, 2026 09:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(planning): keep the Notes send toast across a state push

1 participant