a commander opens in /chat, where you were already reading

Clicking one in the Live list navigated to /command-hq — out of the screen, into a different route with a
different layout, having lost your place in the list you were scanning.

I argued for that in the commit before this one: /chat renders the transcript without the category, cost,
watcher state or the disarm control. It loses to a simpler argument. A commander IS a chat — same harness,
same transcript, resumable by the same route — and being thrown out of the page you are reading costs more
than metadata you did not ask for. Command HQ is where you go to MANAGE a commander, which is a separate
errand from reading what it just said.

Verified rather than assumed, because a commander's cwd is not one of /chat's directory groups: the
default-group load misses, and GET /chat/sessions/:id falls through to the by-id scan, which returns all
six messages and the real cwd with it. So the detail panel resumes it with no cwd hint at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 19:30:06 +00:00
co-authored by Claude Opus 5
parent ebfa09e067
commit e1ad680475
@@ -9,7 +9,6 @@ import { useChatPwds, useClaudeSessions } from 'state/useClaudeSessions';
import type { LiveSession } from 'state/useLiveSessions';
import { useLiveSessions } from 'state/useLiveSessions';
import { useSelectedChatSession } from '../../channels';
import { commandHqSessionPath } from '../CommandHQ/command-hq-routes';
import { chatNewPath, chatSessionPath, cwdFromSplat } from './chat-routes';
import { DirPickerModal } from './DirPickerModal';
import { LiveMarker, SessionRow, shortenPath, useScrollActiveIntoView, useSessionRowActions } from './SessionRow';
@@ -368,16 +367,17 @@ const LiveView = ({ activeId, home }: { activeId?: string; home: string | null }
*/
const LiveRow = ({ session, activeId, home }: { session: LiveSession; activeId?: string; home: string | null }) => {
const transcriptId = session.claudeSessionId;
// A commander opens in Command HQ. `/chat/<id>` would render the same transcript with none of what makes
// it a commander legible — no category, no cost, no watcher state, and no way to disarm it.
const to = transcriptId
? session.isCommander
? commandHqSessionPath(transcriptId, undefined)
: chatSessionPath(transcriptId)
: undefined;
// A commander opens HERE, in /chat, like any other row.
//
// This briefly linked to Command HQ, on the argument that /chat renders the transcript without the
// category, cost, watcher state or the disarm control. That argument loses to a simpler one: sending
// somebody out of the screen they are reading, into a different route with a different layout, is a
// bigger loss than the metadata they did not ask for. A commander IS a chat — the same harness, the same
// transcript, resumable by the same route. Command HQ is where you go to MANAGE one, which is a separate
// errand from reading what it just said.
return (
<DataRow
to={to}
to={transcriptId ? chatSessionPath(transcriptId) : undefined}
title={session.title ?? 'Starting…'}
selected={!!transcriptId && transcriptId === activeId}
meta={[