Skip to content

Rework the listing and say what a fork is about to do - #6

Open
wilbeibi wants to merge 2 commits into
mainfrom
listing-and-fork-ux
Open

Rework the listing and say what a fork is about to do#6
wilbeibi wants to merge 2 commits into
mainfrom
listing-and-fork-ux

Conversation

@wilbeibi

@wilbeibi wilbeibi commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Problem

catchup --list answers "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:

#   UPDATED          TITLE                  SESSION
1   2026-07-25 11:29 Improve fork-into mod… 8e40936d-4428-40bf-9c0f-2548267fff55
2   2026-07-25 08:36 Update Joi and Mini c… 891e193b-9784-4eb2-a8ee-c73810fb1824

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 codex infers its source and says nothing. A bad guess on a read costs a rerun; on --into it seeds a launch with the wrong transcript.
  • Finishing a task leaves a spent context. Restarting the same agent clean was refused and pointed at the native fork, which keeps the state you are trying to shed. catchup claude --since-compact | catchup fork --into claude --from - worked, but nobody types that.

Change

SESSION   UPDATED    TITLE
claude/1  just now   Improve fork-into model selection UX
claude/2  3h ago     Update Joi and Mini catchup binary and skill
codex/1   3d ago     先给结论:如果我事先不知道 CatchUp,只根据"在不同 Coding A…
claude/3  4d ago     Design multi-agent debate feature for coding assistants

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/2 means the same session in either listing.

Fork announces its source before launching: catchup: forking claude → codex (14m ago: fix the WAL blindness).

Same-agent --into is 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 --into is still refused, now naming both exits.

Judgment calls

Inference stays. catchup fork --into codex is 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. --model passes through untouched. A name catalog would need a release per provider rename, and --model opus is 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 instructions and its block — in one user turn, and isInjectedUserText matched 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 -q rank 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.

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
wilbeibi force-pushed the listing-and-fork-ux branch 3 times, most recently from 9d1e1c8 to 3159e07 Compare July 25, 2026 19:17
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
wilbeibi force-pushed the listing-and-fork-ux branch from 3159e07 to 69cf9c3 Compare July 25, 2026 19:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant