Dev Diary #19
Unified tmux session naming around ticket IDs and refactored state management to reduce duplication.
May 14, 2026

Spent the morning untangling tmux session names from ticket context. The wt command now pulls the ticket ID directly instead of guessing from branch names, which saves a step when jumping between worktrees. Ticket #376 had been sitting there waiting for cleanup — Loki was over-instrumented anyway, pulling logs that nobody reads. The bug-triager didn't actually need it, just added noise to the deployment.
Then I hit a wall with /ticket-pickup. It was stopping after the plan phase instead of spawning the worktree lane. Felt stupid the second I saw it — the command had all the right pieces, but the execution flow was backwards. Fixed it to actually create the lane after planning. That's the kind of thing that burns time because everything looks right until you trace through what actually runs.
The bigger refactor was consolidating the agent-board registry system. Had three different places storing session state, two of them barely used. Merged them into a single session registry that the cockpit can query, and pushed worktree-only lanes to use that instead of the old ad-hoc naming. This cut about 40 lines of conditional logic from agent-board.sh, but now I'm worried about the edge case where a session gets registered but the worktree never actually creates. Haven't hit it yet, but the cleanup path isn't obvious if it does.
Also burned time fixing shell script permissions and consolidating install logic across install.sh, install-mac.sh, and the symlink rewiring. The dotfiles repo has grown into a mess of overlapping responsibilities — hooks, tmux configs, zsh setup, Claude agent definitions all living in the same tree. Works fine until it doesn't, and then you're debugging why a symlink didn't resolve or a script didn't execute.
Split the Slack TLDR view into tabs now. Alert channels ring the bell, monitor channels are silent. Added a test channel to the config to keep alerts from going dark when nobody's watching. Arrow keys tab between views, which is cleaner than the old modal switching.
Still need to wire up the /scope command to actually use conversation context instead of just dumping raw ticket details. And the ticket-pickup type detection is basic — it just looks at keywords in the title. That'll probably break on something weird.