September 5, 2026 · Patch
Sessions spent inside a coding agent or any other interactive tool are now named after the tool. If a session that was nothing but pi ended up titled "Working On Update", this is the fix.
Launch the pi agent and work inside it. The shell sees a history of pi, pi update, cle, clear, pi — and the session was titled "Working On Update", then left there. It named neither the tool nor the work. The same happened for claude, aider, codex, for REPLs like python, node and psql, and for ollama.
Two independent halves, both in SessionTopicAnalyzer.
First, the headline. The analyzer classifies each command's first token into an activity class. pi has no entry in that map, so every command voted generic — and the generic class's headline verb is the literal fallback "Working On".
Second, the subject. Noun extraction skipped only a command's own grammar, via a table of subcommand words keyed per verb (git, npm, kubectl and friends). There is no entry for pi, so the first argument of pi update was taken as the thing the session is about: "Update".
Underneath both: the commands such a tool runs on your behalf happen inside its own process and never reach the shell hooks. The launch line is all the analyzer will ever see, so the tool's own name is the best description of the session that exists.
pi, claude, codex, aider, opencode, gemini, copilot, cursor, goose, amp, ollama, llm, python/python3/ipython, node, deno, bun, irb, psql, mysql, sqlite3, redis-cli, mongosh, tmux, htop/top/btop/btm, lazygit, nvtop. Anything else is title-cased from the command name, so foo update reads "Foo".ollama run|pull|show and llm -m. Those are kept verbatim rather than title-cased, because llama3 and health_check stop being searchable otherwise.brew install jq still reads "Installing Jq", and git status / git log / git diff still read "Reviewing".Dictionary.max(by:), which has no defined order among equal counts, so an evenly mixed session could be titled differently on two identical runs.pi, pi update, pi → Pi Agentclaude --continue → Claude Codeollama run llama3 → Ollama · llama3aider src/main.py → Aider · mainpython3 scripts/health_check.py → Python · health_checkfoo update (a tool with no display name) → Foo321 tests in 26 suites pass, up from 313. Eight new cases in SessionTopicAnalyzerTests cover the exact reported history, a Claude Code session, the Ollama model subject, an unrecognized tool, a path subject, a Python script, and regression guards for the git and brew headlines. Analysis stays pure, off the main actor, and well under 5 ms.