Repository navigation
Bench: a closed card says a tap doesn't count and loses its buttons - #151
Merged
Merged
Conversation
A phone that lost its socket across a delete keeps showing the card, the relay refuses a tap on it and the phone's code ignores the refusal, so the tap vanishes with nothing said. An untouched re-drop or a card no longer asked now stays, as a kept one does: its first line says a tap doesn't count, its seeds come off and a tap on it gets one reply. Publish (b) no longer calls the relay, so nothing there can fail a tick. The edit, its lookup and any failure are the old posts' tick's, on the same budgets, and on the board under "Old cards". Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every card retired in a thread added a kept_at entry, including untouched ones main deleted and left no entry for. An older card still open in that thread then stopped taking replies that name only the root, for good, with nothing said. A retired post in a thread now reads what is on it once it is edited, and adds the entry only if there is something besides its seeds and its own closing edit, as main did. It costs one lookup more, on the old posts' one a tick, and only for a post in a thread. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Retired posts now stay on the relay with their bench:card marker. With state lost and the same Drop asked again, publish (c) adopted one as the live card: a seedless post saying a tap doesn't count, whose tap would then be read as the answer. An orphan edited closed now goes to kept like any orphan with something on it, and a new card goes up. One lookup per orphan, after lost state only. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing failed with `held` taken out of publish (b)'s guard: a re-worded drop waits in the inbox before it gets there, so only a card whose format moved reaches it. Without the guard that card is retired for good with a tap on it unread. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Close-out receipts are the largest group of dead pills: 92 on 4 Nov. A close-out now makes its card an old post: first line, Closed note, seeds off, and for 24 h one reply to a tap. It stays item.card, so the kit's findCard is unaffected, and its edit no longer fails a tick. Receipts already in state catch up one at a time behind live work, unwatched, in about 4 minutes. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The real relay refuses a reply whose root doesn't match the thread, but the fake one doesn't check, so every Bench test still passed with the root taken out of showing(). A tap on a receipt in a thread would have failed its one reply for the whole window, with CI green. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Publish (a2b) moved the card's hash on and owed the edit even in a channel that isn't ready. The old posts' tick skips those, so past 24 h the entry went with no try and no alarm, and the hash had already moved, so the receipt kept its live text for good. The hash now stays behind until the channel is ready, so the close-out is picked up then, however long that takes. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A later close-out on a receipt still in `replaced` changed only what it shows and kept the first one's clock. An edit failing once near the end of those 24 h was let go before its retry, and the hash had moved on, so the phone kept the older report with nothing said after that. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A format bump changes every receipt's hash, so publish (a2b) made each one a watched old post in one tick. That filled WATCH_MAX with posts closed days ago, put a false alarm on the board and pushed real old posts out of the read. Only a real close-out is watched now. When just the format or stamp moved the receipt is edited again unwatched, as the backfill does. Claude-Account: russelledeming@gmail.com Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Factory-Task: bench/old-receipts
Built-by: claude-code/claude-opus-5-5
Claude-Account: russelledeming@gmail.com
Undo: revert the merge. Older builds ignore the new
receiptsTodokey in state.json. Receipts already edited keep their first line and missing seeds.Stacked on the cards PR (
fix/bench-old-cards): merge that first. It is the same work split to keep each PR under the lane's ~600 lines. When both ride one train, one launch check covers both.Needs a desktop launch check, because it touches
desktop/. The code it changes is Bench service code, which does not run in a debug build, so the launch check only shows the app still starts. The first real test is the installed app after the update.What changes
#125 named these as the largest group of dead pills. There were 55 on 1 Nov and there are 92 on 4 Nov, about 20 more a day.
item.card, so the kit'sfindCardis unaffected, and the answer it closed with is no new tap.lastError, which stops the kit's approvals. It now goes on the board under "Old cards".CARD_FORMATbump edits every receipt again, unwatched, as the catch-up does, so it can't fillWATCH_MAXor raise a false alarm.Two visible side effects. A receipt's edit now follows the tick's other work, so the board may update first. Its Outcome shows when the close-out came in, not the tick that edited it, which is the same minute unless the budget delayed the edit.
The
#782search evidence is infix/bench-old-cards. Its row "Back to you: Release refreshed lead..." is one of these receipts,daa8272a0b23, with 4 seeds.How to verify on the phone
Each step takes under a minute.
For the session doing the launch check: after the update,
receiptsTodoin~/.dreamforge/bench/state.jsonshould fall to[]in about 4 minutes, withlastErrornull and no "Old cards" on the board.Budgets
Sizes are from
state.jsonon 4 Nov 2026: 92 receipts with 279 seeds. The limits are those infix/bench-old-cards: 4 writes and 1 lookup a tick,WATCH_MAX100.CARD_FORMATbump: 1 edit and 1 lookup per receipt, all owed at once. The 1 lookup a tick sets the pace, about 2 s a receipt, so 103 receipts take about 4 minutes and the 24 h holds about 43,000.WATCH_MAX: about 20 close-outs a day sit inside the 100. Ten times that passes it, and the board then says the oldest go unread and what to do. Old receipts don't count, before or after a format bump, as they aren't watched.Known limits
fix/bench-old-cards).What was exercised, and how
All of this ran on this Windows machine. The real app, Block's relay and Block's phone were not run. The relay in the Rust tests is the harness's fake one.
Rebased on 9 Nov 2026 onto the cards PR, itself on main at
5e1fce0cb. The only conflict was two additions landing side by side inbench/replaced.rs, and both stayed. After the second review's fixes, also on 9 Nov, I re-ran the Bench tests, the wholecargo test --lib,cargo fmt --check, clippy,check-file-sizesandgit merge-treeat this head. The other results below are from before those fixes.cargo test --lib bench::gave 229 passed, 0 failed, 2 ignored at this head, which is the cards PR's 220 and this one's 9. The wholecargo test --libat this head gave 3527 passed, 0 failed, 16 ignored. Themesh-llmand compiled-flags lanes were not run; Linux CI covers them.cargo fmt --checkexits 0.cargo clippy -p buzz-desktop --lib --testsexits 0 with nothing undersrc/bench.check-file-sizesexits 0, withmod.rsat 1500 of 1500, so its next line needs a move.pnpm testgave 7201 + 193 passed, 0 failed. The parser already handles this text from fix(bench): a replaced card says so, and a tap on it is told it didn't count #125 (a replaced receipt lays its Outcome out as its own card).findCardreadsitem.card, which this keeps, andkind, which a receipt already fails.git merge-treeis clean against main at849bd8bbb.Review
An independent review covered both branches on 9 Nov 2026 and found four things here. None needs a decision.
a_close_out_in_a_channel_not_ready_keeps_its_edit).a_later_close_out_gets_its_own_window).a_format_bump_watches_no_old_receipt).a_tap_on_a_receipt_in_a_thread_is_told_under_its_root).Size: 481 changed lines, 133 of code and 348 of tests.
🤖 Generated with Claude Code