fix(story-mode): what the captions blurred for a reader who skims (review round 11)

From an engineering manager skimming titles and captions:
- "but a check after that fails" under "Mission complete!" where the
  prompt said that step may fail now adds ", as you said it might".
- Saves no prompt of the turn asked for (a project rule, or Claude's own
  idea) were indistinguishable from requested ones: the turn's first such
  save carries a small line, "a save your prompt here did not ask for".
  "save its log with tee" no longer counts as asking to save the work.
- The first save on a branch Claude created says which: "saves the work
  on a new branch (feat/csvstat)".
- "Claude changes 3 files" hid an edit to your CLAUDE.md: a panel that
  wrote some files and patched others says both ("Claude writes
  README.md and .gitignore and changes CLAUDE.md."); a file created and
  then edited in the same panel is written.
- A turn with a problem left and work still out read "Done for now";
  the catch now wins the title.
- A helper's report that is only a path reads "reports back with the
  file it wrote: README.md."

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer committed 2026-10-18 17:44:06 +02:00
1 parent 175017f604
commit d3c55e04a3
18 files changed
+345 -40

No files matched your search

+20 -15
View File
@@ -2505,16 +2505,20 @@ Object.assign(CodemanApp.prototype, {
// A call that came back with an error brought no opinion: say so, never that one was given.
const unanswered = asked.length > 0 && asked.every((i) => page.events[i].ok === false);
const ask = unanswered ? 'tries to ask' : 'asks';
rt.capNote.hidden = !p.secondOpinion;
rt.capNote.textContent = !p.secondOpinion
? ''
: `${
before
? `after ${unanswered ? 'trying to ask' : 'asking'}`
: trailing
? `then ${ask}`
: `along the way, ${ask}`
} a stronger AI model for a second opinion${unanswered ? ' (no answer came)' : ''}`;
const notes = [
p.unaskedSave ? 'a save your prompt here did not ask for' : '',
p.secondOpinion
? `${
before
? `after ${unanswered ? 'trying to ask' : 'asking'}`
: trailing
? `then ${ask}`
: `along the way, ${ask}`
} a stronger AI model for a second opinion${unanswered ? ' (no answer came)' : ''}`
: '',
].filter(Boolean);
rt.capNote.hidden = !notes.length;
rt.capNote.textContent = notes.join('; ');
}
rt.el.classList.toggle('is-live', !!p.live);
// Named by its place only: the caption inside is read as the panel's content, once.
@@ -2537,11 +2541,12 @@ Object.assign(CodemanApp.prototype, {
? 'To be continued…'
: page.noneWorked
? 'Not done'
: page.helpersRunning || page.finishedLater || page.events.some((e) => e.running && !e.helper)
? // Work was still out when the turn ended (and maybe still is): not a clean finish.
'Done for now'
: page.openNote === 'catch'
? 'Done, with a catch'
: page.openNote === 'catch'
? // A problem left beats work still out: it is what the reader must not miss.
'Done, with a catch'
: page.helpersRunning || page.finishedLater || page.events.some((e) => e.running && !e.helper)
? // Work was still out when the turn ended (and maybe still is): not a clean finish.
'Done for now'
: page.openNote
? 'Done, with a note'
: page.asks