a deleted commander stays deleted, and the header shows its name

two things that should have been settled already.

commanders/46 came back as an empty directory after a clean delete. not a
surviving loop — nothing from 46 was running. resolveChatCwd did
`mkdirSync(dir, {recursive:true})` on every commander turn, so one
in-flight turn from the conversation that outlived the row recreated it.
an empty directory is worse than none: a commander with no CLAUDE.md that
knows nothing about itself, showing up in the file browser as something
that still exists.

the directory is created by POST /command-hq/commanders before any turn
spawns, so a missing one means deleted. no mkdir here — fall back to the
home and say so, the same degradation the missing-row branch already
reports.

and the detail header showed the harness's own summary title, which it
makes from the first prompt: "You have been named "Voice Memos". Look in
`/home/…`", on a commander whose name was correct everywhere else. the list
route already prefers row.name. this now does too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
2026-08-25 07:21:11 +00:00
co-authored by Claude Opus 5
parent f16aa87d8b
commit 22a9d58d5c
2 changed files with 28 additions and 4 deletions
@@ -676,7 +676,14 @@ function ResumedCommander({ sessionId, resume }: { sessionId: string; resume: Re
<div className="flex h-full flex-col">
<MetaBar
sessionId={sessionId}
title={resume.title ?? undefined}
/*
The commander's NAME, not the transcript's title.
The harness titles its own summary record from the first prompt, so this header read "You have
been named "Voice Memos". Look in `/home/…`" — the opening brief, verbatim — on a commander whose
name was right everywhere else. The list route already prefers `row.name`; this did not.
*/
title={commander?.name ?? resume.title ?? undefined}
isConnected={chat.isConnected}
isGenerating={chat.isGenerating}
onDisconnect={chat.disconnectSession}