Dev Diary #21
Extracted two coupled tools out of dotfiles into standalone repos and unified their state under a single TICKETS_DIR.
May 21, 2026

The dotfiles repo had two things tangled together that shouldn't have been: lane orchestration for worktrees, and a ticket TUI. Both started as scripts under `scripts/` and grew until they had their own CLAUDE.md files inside a repo that was supposed to be about shell config. So I spent the day cutting them out.
`wt-lanes` came out first. Moved `bin/wt`, `bin/wt-gc`, `bin/ralph-bootstrap`, and the state-write hooks into a standalone repo, tagged v0.1.0. The dotfiles side now just symlinks against whatever's installed. The agent-board tmux script was the trickiest part — it had been labeling lanes by inspecting the cockpit window title, which broke the moment a nested lane spawned its own children. Switched it to read from a sentinel file the `wt` script writes on entry. Cleaner, but I'm not thrilled that the sentinel is plain text in `/tmp` — if two lanes race on cleanup the state column flickers.
`tix` came out second and was the bigger surgery. It had a bundled sync module that knew about a specific external ticket system, which is exactly the kind of coupling that kills a tool's reusability. Ripped it out and replaced with a `TIX_PRELOAD_HOOK` env var — point it at a script, the script populates the local tree before the TUI opens, tix doesn't care what you ran. Published to PyPI as v0.1.0 with badges, a CHANGELOG, and a schema doc.
Then the part I actually wanted: `$TICKETS_DIR`. Every project gets a tree under `~/.claude/tickets/