fix(story-mode): read how current Claude Code builds deliver prompts and end turns

Found by replaying round-2 review transcripts while the reviews ran, then
surveyed across 150 local transcripts:

- A prompt typed while Claude works writes no user line in current builds,
  only a queued_command attachment where Claude took it in (602 of them
  locally, 485 of those background-task reports). It now joins the running
  turn; a report that lands mid-turn is a notice on the wire, not a new
  mission panel, and a background helper's answer joins back from it.
- Some sessions never write turn_duration (13 of 135 locally): the Stop
  hook's stop_hook_summary (never preventedContinuation in 815 seen) now
  ends the turn, timed by its own span. Before, such a session's turns
  never ended.
- A helper started as a teammate (teammate_spawned) is a background helper;
  its <teammate-message> reports (text or a JSON idle notification) join it
  by name, and the turn they start reads "readme-writer: README done".
- A <cross-session-message> names its sender; pasted text loses Claude
  Code's <pasted_content> wrapper (it showed in balloons and the picker).
- The mission panel, its balloon and its drawer follow who sent each
  prompt (you, a background job, another session), not who started the turn.
- A caption names a script by its first line that says something, not
  `set -e`, a bare `cd` or `S=/tmp/...`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer committed 2026-10-18 10:41:14 +02:00
1 parent 03cb3a5961
commit 848566828f
5 files changed
+343 -26

No files matched your search

+3
View File
@@ -29,6 +29,7 @@ export type StoryIntent =
| 'ask'
| 'compact'
| 'interrupt'
| 'notice'
| 'tool';
/** The comic panel a run of events is drawn as. */
@@ -120,6 +121,8 @@ export interface StoryEvent {
description?: string;
/** A save that ships the work: `gh pr create` (`pr`) or `git push` (`push`). */
ships?: 'pr' | 'push';
/** Who a prompt came from (a prompt added mid-turn can come from someone other than the turn's starter). */
origin?: StoryTurnOrigin;
output?: string;
outputTruncated?: boolean;
edit?: StoryEdit;