Found with knip (exports, types, class members) and confirmed by a text
search of src, test, scripts and packages before each removal.
- Per-CLI get<Cli>NotFoundMessage() (nine of them) with their message
constants: missingCliMessage() builds that text from the registry now.
- Registry leftovers: renderCliCommand, asCliId, cliIds, isCliRunnable,
createCliResolverForTest, profileExists, and two name lists that only
repeated schema enums.
- A task-description cache in Session that was written on every chunk of
terminal output (one regex pass per line) and never read since the
subagent watcher takes descriptions from transcripts. The cache module,
its pattern and both parse methods go with it.
- Session.parentAgentId / childAgentIds: never set by anything, so the two
optional SessionState fields were never on the wire.
- Unreferenced methods on TmuxManager (pipe-pane pair, syncMouseMode),
RespawnController, StateStore.recoverFromBackup (load() already falls
back to the .bak file), TeamWatcher, SseStreamManager and the AI
checkers' getErrorVerdict.
- updateCaseEnvVars: the settings.local.json env path that envOverrides
replaced.
- Re-exports in the utils, cli-registry, routes and prompts barrels that
no importer used, and unused test helpers (MockStateStore, the mobile
throttle helpers and others).
Eight mobile tests imported the WebServer type from a path that does not
exist (../src instead of ../../src); type-only, so nothing failed.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
The helper cached servers by port, but every mobile file starts exactly one, so the cache was never shared: it is now a Set that stopAllTestServers() walks. PORTS leaves helpers/constants.ts, the nine tests set baseUrl after start(), and the README drops the port column and the pick-a-port step.
Committed without the pre-commit hook: accessibility, subagent-windows and visual-regression were not prettier-clean on master already; formatting them would bury the port lines.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The phone tier stopped at innerWidth < 430 and @media (max-width: 430px), so every current large phone landed in the tablet layout: the 430pt iPhone 14 Pro Max, 15 Plus, 15 Pro Max and 16 Plus, the 440pt iPhone 16 Pro Max and 17 Pro Max, Pixel 6 Pro, 7 Pro and OnePlus 12 Pro, the 448pt Pixel 8 Pro and 9 Pro XL, and the Galaxy Z Fold 5 cover screen at 460. On those devices the header icon row replaced the session pill, the toolbar kept the desktop Run Shell button instead of Enter and the mic, the keyboard accessory bar could never become visible because its .visible rule lives inside the phone block, and the toolbar jumped to the top of the page when the keyboard opened.
The new cutoff is 600, the line test/mobile/devices.ts already draws between large phones (430-599) and small tablets (600-767). No physical device sits between 480 and 600, but a phone zoomed out one or two steps in Safari does: a 440pt iPhone at 85% or 75% page zoom reports 518px or 587px and still needs the phone controls, which a 480 cutoff would have taken away. The phone block is max-width: 599px and the tablet block starts at min-width: 600px, so a 600px device is a tablet in CSS and in getDeviceType() alike instead of straddling the boundary the way 430pt phones did.
The number changes everywhere it is encoded: JS, CSS, comments, CLAUDE.md, the CI tests that pin the phone block, and the test:mobile helpers. Measurement history that names 430px stays as written.