Rework the listing and say what a fork is about to do - #6
Open
wilbeibi wants to merge 2 commits into
Open
Conversation
isInjectedUserText matched only a whole-message envelope: one known tag block, or the project-doc preamble followed by <INSTRUCTIONS>. Codex composes them. A <recommended_plugins> catalog, then "# AGENTS.md instructions" and its block, arrive as one user turn — and the preamble heading does not always carry the " instructions for <path>" spelling the old rule required. Nothing matched, so the machinery rendered as conversation: every read of such a session opened with it, and every cross-agent fork seeded the next agent with the user's global AGENTS.md. Strip envelopes one at a time and call the turn injected only when nothing a person wrote is left. That is stricter than the old rule in the right direction: matching on prefix alone, it would have discarded real prose that happened to follow a preamble.
wilbeibi
force-pushed
the
listing-and-fork-ux
branch
3 times, most recently
from
July 25, 2026 19:17
9d1e1c8 to
3159e07
Compare
The listing is where someone lands when the question is "where was I", and it answered with a rank that had to be combined with an agent name by hand, plus a 36-column session id nobody types. The id squeezed titles to 22 characters, truncating the only column that identifies a session. Show the handle instead — claude/3, the string that re-selects the row — and a relative age while "how long ago" is still the question, giving TITLE everything left over. Providers whose agent never named a session fall back to the directory name, which made every row in a cwd-scoped listing read identically; those rows now show the session's opening message, which is what tells them apart. The id stays in --json, where the scripts that want it live. A bare listing now spans every agent. More than one agent works in a directory — that is the premise of the tool — and a listing scoped to whichever agent happened to be newest hid half the answer. Ranks stay per-agent, so a handle means the same thing in either listing. Fork acts on an inferred source, and it is the one command that spends money on the guess: with --into, the wrong session seeds a launch. It now names the session on stderr before launching, early enough to interrupt while a large transcript is still being read. Same-agent --into is allowed with --last or --since-compact. Seeding an agent from its own session is a reseed rather than a resume: it sheds a spent context and keeps the work, which is what someone wants after finishing a task instead of losing one. The trims are rejected on a native fork, so their presence cannot be a mistyped one; bare same-agent --into is still refused, and now names both exits.
wilbeibi
force-pushed
the
listing-and-fork-ux
branch
from
July 25, 2026 19:17
3159e07 to
69cf9c3
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
catchup --listanswers "where was I" with a rank you must combine with an agent name yourself, plus a 36-column session id nobody types. The id costs the title column half its width:It also lists only whichever agent owns the newest session, in a tool whose premise is that several agents work here. And where an agent never named a session, the title falls back to the directory basename, so every row in a cwd-scoped listing reads the same:
proj,proj,proj.Two more of the same shape:
fork --into codexinfers its source and says nothing. A bad guess on a read costs a rerun; on--intoit seeds a launch with the wrong transcript.catchup claude --since-compact | catchup fork --into claude --from -worked, but nobody types that.Change
The handle is the string that re-selects the row. Ages go relative under a week, plain date beyond. Directory-name titles show the session's opening message instead. Ids move to
--json, where the scripts that want them live.A bare listing spans every agent; ranks stay per-agent, so
claude/2means the same session in either listing.Fork announces its source before launching:
catchup: forking claude → codex (14m ago: fix the WAL blindness).Same-agent
--intois allowed with--last/--since-compact— a reseed, not a resume. Those flags are already rejected on a native fork, so they cannot appear on one someone meant to type. Bare same-agent--intois still refused, now naming both exits.Judgment calls
Inference stays.
catchup fork --into codexis the command you want as muscle memory when an agent has just died, and a bare read already means newest-across-cwd. The guess was never wrong, only silent.No model validation.
--modelpasses through untouched. A name catalog would need a release per provider rename, and--model opusis not even wrong. Effort is per-agent config, not a handoff concern.Notes
The first commit is separate work. Codex stacks context envelopes — a
<recommended_plugins>catalog, then# AGENTS.md instructionsand its block — in one user turn, andisInjectedUserTextmatched only a lone envelope. That machinery rendered as conversation, and seeded every cross-agent fork with the user's global AGENTS.md.An earlier draft of the second commit added a post-read fork hint and a
-qrank note. Both were speculative and both cost permanent output; deleted, with a dead error branch and a truncation helper. 84 lines.Claude sessions opening with a slash command still list as
<command-name>/model</command-name>…. Different provider, and the person did type it: its own change.