Skip to content

fix(web): a command you stop stays in the timeline - #13790

Merged
juliusmarminge merged 1 commit into
t3code/codex-turn-mappingfrom
fix/web-stopped-tool-rows
Sep 26, 2026
Merged

juliusmarminge merged 1 commit into
t3code/codex-turn-mappingfrom
fix/web-stopped-tool-rows

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 26, 2026 •

Copy link
Copy Markdown
Member

When you stop a turn while a command is running, the command disappears from the timeline once the run settles. You see "Running sleep" while it runs, then after Stop only the "Run interrupted" marker is left, with no trace of the command that was cut short.

Seen live on Codex 0.156.1 (gpt-6-luna). The prompt was sleep 90 && echo slept, stopped mid-command. The projection keeps the command_execution turn item (status: "interrupted", input: "/bin/bash -lc 'sleep 90 && echo slept'", no output), but the DOM has no row for it:

Before: after Stop, the interrupted sleep command is gone and only the Run interrupted marker remains

Why

interrupted and cancelled items map to the work-log status stopped. workEntryIsVisibleInGroup hides tool rows that are "neutral", meaning neither success nor failure, which is meant for empty or incomplete rows. workEntryIndicatesToolSuccess explicitly excludes stopped, so every stopped tool counted as neutral and was filtered out of settled rows. The labels already have a stopped outcome ("Stopped vp", "Stopped clicking in the preview browser"), and mobile's threadFeedActivityIsVisible already keeps lifecycleStatus === "stopped" rows. Only web dropped them.

Fix

workEntryIsVisibleInGroup keeps entries whose lifecycle status is stopped. Nothing else changes: success and failure markers, folds, and in-progress rows behave as before.

Verification

  • New case in MessagesTimeline.logic.test.ts ("hides the interruption request while keeping intervening work and the result"): it builds a stopped command followed by the interrupt result for an interrupted latest run. It fails on the base (expected [ 'interrupt-result' ] to deeply equal [ 'stopped-command-entry', … ]) and passes with the fix.
  • vp test run src/components/chat/MessagesTimeline.logic.test.ts src/session-logic.test.ts: 177 passed.
  • vp test run src/components/chat/MessagesTimeline.test.tsx src/components/chat/timelineMinimapItems.test.ts src/session-logic.runtime-diagnostics.test.ts: 81 passed.
  • vp exec tsc --noEmit -p . in apps/web: clean. vp lint and vp fmt on the two touched files: clean.
  • Not captured: an "after" screenshot. The hunting dev server has to keep running the base code, and cups was short on memory for a second one. The replayed test covers the row.
  • Not run: the full web suite.

Model: Claude Opus 5.5 (Claude Code)

🤖 Generated with Claude Code


Devin Review

Stopping a turn mid-command marks the command interrupted, which the
work log maps to "stopped". The timeline treated stopped calls as
neutral (neither success nor failure) and filtered them out like empty
rows, so the command vanished once the run settled. Stopped is an
outcome, so keep it visible, as mobile already does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Sep 26, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 26, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at a5fa963

Macroscope's review found this PR approvable — This is a narrowly scoped web timeline bug fix that preserves stopped command rows without changing command execution or other lifecycle behavior. A focused regression test covers the interrupted-command case, and no product-default or static-analysis configuration is modified.

You can add or adjust custom eligibility rules. Learn more.

@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 4.9 KiB — 6.8 KiB ✅
Codex Thread snapshot wire — 3.7 KiB — 4.9 KiB ✅
Codex Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Codex Live turn WebSocket decoded — 20.4 KiB — 29.3 KiB ✅
Codex Live turn messages — 2 — 8 ✅
Claude Total thread wire — 4.9 KiB — 6.8 KiB ✅
Claude Thread snapshot wire — 3.7 KiB — 4.9 KiB ✅
Claude Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Claude Live turn WebSocket decoded — 20.8 KiB — 29.3 KiB ✅
Claude Live turn messages — 2 — 8 ✅

Baseline: unavailable · PR result: a5fa963 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 106.1 KiB
  • Claude decoded thread snapshot: 106.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@juliusmarminge
juliusmarminge merged commit 43b480b into t3code/codex-turn-mapping Sep 26, 2026
24 of 25 checks passed
@juliusmarminge
juliusmarminge deleted the fix/web-stopped-tool-rows branch September 26, 2026 18:28
juliusmarminge added a commit that referenced this pull request Sep 26, 2026
Brings in the V2 bug-hunt fixes merged while this PR was refreshed
(#13787, #13789, #13790, #13797, #13805, #13806). No conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant