b282fa2f52ffcf66854f69ee2e6edc8789c3fac3
Three faults, all of them mine from the batch work or older than it. Deleting one Claude Code session called `list` first -- a full read of every transcript on the machine, about 3.7 seconds against the gigabyte in this VM -- purely to turn an id into a path. A batch of ten spent most of a minute re-reading the same files. `context_of` already resolved an id with a targeted glob; `delete` now does the same and takes 78ms, measured against the same corpus. That glob is why ids are now checked. Both places interpolate the id into `$HOME/.claude/projects/*/"$1".jsonl`, which is an argument rather than script text, so no shell can be talked into running anything -- but a `/` or a `..` still walks the glob out of the directory, and `delete` removes what it lands on. Hex and dashes only, refused rather than escaped, in both places rather than the dangerous one alone. Listing was the only expensive call in the app still on the 5 second default read timeout, against work that takes about four seconds before the tunnel adds anything -- so it timed out against a server that was answering perfectly well. A timeout is for a server that has stopped, so it is now set clear of the work rather than just above it. And `BusyItem` made a row inert by consuming pointer events, which took the drag with the tap: a list could not be scrolled while anything in it was busy. Deciding what a gesture is above the components that already decide it is the wrong place to stand, so the card disables its own click instead and the scroll is left alone.
Languages
Rust
54%
Kotlin
43.6%
Shell
2.4%