cct = TUI: turn-transition render omission — content recorded in .jsonl but absent from scrollback (2 incidents across 2 versions)

Open 💬 3 comments Opened May 30, 2026 by rtgilbert

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

Related (same cluster, different specific defect): #63462 (phantom Human lines — inverse direction), #60802 (/resume wrong-session render — different trigger). These cases together suggest a class of scrollback-vs-storage divergence anomalies; the present report adds reproducible cluster-instance-at-turn-transition evidence with version-bump stability.

One-paragraph summary

Claude Code's terminal-rendering layer drops content at certain turn transitions: the user's prompt and the hook-injected turn-anchor are absent from the rendered scrollback, and in one observed instance the agent's response body is also absent. The .jsonl session transcript records all omitted content correctly, demonstrating that the failure is in the display path, not the input or model path. Two reproducible instances are documented in detail; both occurred in Konsole on Kubuntu 24.04 LTS, one at CCC 2.1.144 and one at 2.1.145 (the version bump did not resolve the defect). The two instances differ in failure scope (partial vs full-turn omission), and that scope difference correlates with a shift in the agent response's stop_reason (end_turn vs tool_use), which is suggested as a bisection target.

Environment (common substrate across both incidents)

  • Claude Code TUI (cct): 2.1.144 (1st captured incident) and 2.1.145 (2nd captured incident) — defect persists across the version bump
  • Terminal: Konsole 23.08.5 (Qt 5.15.13, KDE Frameworks 5.115.0)
  • OS: Kubuntu 24.04.3 LTS (KDE Plasma 5.27)
  • Hooks active (UserPromptSubmit): bash /home/rhys/homelab/scripts/turn_tag_inject.sh (global; injects MM/DD @ HH:MM:SS turn-anchor as agent reply prefix)
  • Hooks active (UserPromptSubmit, project-scoped, present 4th-instance only): /home/rhys/homelab/scripts/userpromptsubmit_diag.sh (captures prompt to log)
  • Hooks active (SessionStart): /home/rhys/homelab/hub/tools/turn_count_inject.sh (global)

Two captured incidents

Incident A — 2026-05-27 (4th cluster instance, partial-turn omission)

  • Session: c008eb0f-a293-4663-837f-45625f0604c5, hub project
  • Turn transition: 2026-05-27 20:14:04 UTC (16:14:04 local)
  • CCC version: 2.1.144

Storage layer (.jsonl) — records correctly:

  • User prompt (timestamp 2026-05-27T20:14:04.583Z):

"RESUME_inbox-tending.md needs to be closed. It's an orphaned path metamorphosis from inbox-backlog. You''l need to do the recreation."

  • Agent response (timestamp 2026-05-27T20:14:37.718Z, stop_reason: end_turn, pure text):

```
05/27 @ 16:14:04

Acknowledged. Checking what RESUME artifacts exist for the inbox-backlog → inbox-tending chain, then reconstructing for closure.
```

Display layer (rendered scrollback) — verified via screenshot + Konsole Paste-Selection (X PRIMARY selection):

  • User prompt: absent
  • Agent turn-anchor (05/27 @ 16:14:04): absent
  • Blank-line separator: absent
  • Agent response body: present and correct

The selectable buffer goes directly from the previous response (- Consolidation: #119 triage / #118 practice writing / #117 lower-priority propagation) → blank line → Acknowledged. Checking... with no trace of the omitted prompt + turn-anchor.

Incident B — 2026-05-29 (5th cluster instance, full-turn omission)

  • Session: f2336af3-0903-4b7d-ba87-b6eb0eddbe1f, hlmain project
  • Turn transition: 2026-05-29 19:33:43 UTC (15:33:43 local)
  • CCC version: 2.1.145

Storage layer (.jsonl) — records correctly:

  • User prompt (timestamp 2026-05-29T19:33:43.657Z, uuid f837582a-8896-4527-9258-265f914bff89):

"I think you may be creating an unnecessarily fine distinction. If I want information about the project I go to provenance. Provenance points me to the *various* sources that influenced the project/build. Why would it be \"friction\" to have more than one form of information pointed to?"

  • Agent response (timestamp 2026-05-29T19:33:59.466Z, uuid 07dfa0f5-8c13-473c-a7e4-c4d3ffce7732, stop_reason: tool_use, text prefix to Edit tool calls):

```
05/29 @ 15:33:43

Concede — that distinction was artificial. Provenance as comprehensive audit trail (the AMD pattern's "data lineage" function alongside structural decisions, forks, etc.) includes origin attribution naturally. Pointer-shaped entries belong in provenance by design; calling them friction was wrong.

(a) is the right path. Authoring prov-010 (criteria origins) and prov-011 (Option-3 fork) now.
```

Display layer (rendered scrollback) — verified via Konsole Paste-Selection (Dialog-omission-capture.md) + 8 screenshots:

  • User prompt: absent
  • Agent turn-anchor (05/29 @ 15:33:43): absent
  • Blank-line separator: absent
  • Agent response body: absent

The buffer goes directly from the previous turn's response (ending the "hop friction" discussion at 15:29:10) → blank line → the next user prompt at 15:45:46 (which itself flagged the glitch). The entire 15:33:43 turn is missing from rendered scrollback.

The reporter confirmed storage integrity by asking the post-omission agent to retrieve the dropped content; agent retrieved it verbatim, proving input reached the model and produced the response despite the rendering failure.

Scope-escalation comparison and stop_reason correlation

| Aspect | Incident A (2026-05-27) | Incident B (2026-05-29) |
|---|---|---|
| User prompt rendered | No | No |
| Agent turn-anchor rendered | No | No |
| Agent response body rendered | Yes (correct) | No (also omitted) |
| Failure scope | prompt + turn-anchor | full turn |
| Agent response stop_reason | end_turn (pure text) | tool_use (text prefix to tool calls) |
| CCC version | 2.1.144 | 2.1.145 |

Key diagnostic observation: the failure-scope escalation (response body also omitted in Incident B) correlates with a shift in the agent response shape from pure-text-end_turn to text-prefix-to-tool_use. If cct's render path handles text + tool_use response packets differently from text + end_turn, that interaction is a plausible failure-trigger candidate worth checking.

Diagnostic features of dropped content (cross-incident)

| Feature | Incident A | Incident B |
|---|---|---|
| Dropped prompt length | ~30 words, 2 sentences | ~50 words, 4 sentences |
| Markdown emphasis in prompt | No | Yes (*various*) |
| Scare quotes in prompt | No | Yes ("friction") |
| Interrogative form | No | Yes (terminal ?) |
| Substantive corrective | Directive | Yes (corrective rhetorical question) |
| Dropped response length | ~25 words | ~75 words, 2 paragraphs |
| Response stop_reason | end_turn | tool_use |

Both prompts are substantive content (neither a single-word reply, pure directive, nor short acknowledgement); a sample of two is not enough to characterize the trigger condition further. Reproducibility-mapping across other turn shapes (single-word replies, pure directives, tool-output continuations, etc.) has not yet been attempted.

Steps to Reproduce

This bug was observed during ordinary work, not produced by a deterministic sequence — we do not have a step-by-step reproducer. What we have is two captured incidents whose storage-vs-display asymmetry is verifiable from the .jsonl transcripts (per the per-incident sections above) plus a list of conditions correlated with the captures and conditions not yet tested. The body of this report contains the detailed evidence; if Anthropic engineering needs additional captures (ANSI raw output via script-wrapped session, hook-disabled A/B testing, terminal-portability tests against xterm/alacritty/gnome-terminal/kitty, reproducibility-mapping across more turn transitions), the reporter can produce them on request.

Both captured incidents are persistent in their respective scrollbacks — re-opening the affected region in either session shows the same omission, not a transient flicker. The defect survived the CCC 2.1.144 → 2.1.145 version bump and was observed in two different cct projects, ruling out per-project hook configuration as the cause.

Broader reproducibility (rate per turn transition, sensitivity to terminal choice, sensitivity to hook presence) is not yet characterized.

Evidence attached

| Evidence | Incident | Location |
|---|---|---|
| Screenshot of broken render | A | Screenshot_20260527_174843.png |
| PDF capture (additional) | A | 20260527_dialog_omission.pdf |
| Buffer capture (Konsole Paste-Selection) | B | Second-incident-2026-05-29/Dialog-omission-capture.md |
| Screenshots (8 captures, 16:15–16:18 local) | B | Second-incident-2026-05-29/Screenshot_20260529_1615*.png...161842.png |
| Agent-side storage-integrity confirmation | B | Captured in the same Dialog-omission-capture.md — turns at 15:45:46 + 15:46:46 retrieving the omitted prompt + response verbatim from session memory |

<img width="3120" height="1050" alt="Image" src="https://github.com/user-attachments/assets/c9fcc1aa-fdac-4d8e-8d92-99ed805d4137" />
20260527_dialog_omission.pdf

<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/5a573111-7d01-465c-a447-f8498379138a" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/edf788f1-3372-4e5a-b2ae-61324efe83c2" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/afe216fd-001d-4365-8c85-2406be4e6be7" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/e0cc611d-2a31-438e-93be-c95e920feb1b" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/8cd49b63-6b3a-4350-a0c6-5693ff6353ef" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/cbdf5c79-fb26-4b1c-858f-4dd2740e776e" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/7f54df20-c246-46b2-a853-2a529cac4504" />
<img width="1440" height="900" alt="Image" src="https://github.com/user-attachments/assets/c79c5119-1bde-4b72-ad2d-fad3833a22e4" />
Dialog-omission-capture.md

.jsonl excerpts (verbatim from session transcripts)

Incident A:

// at 2026-05-27T20:14:04.583Z — user prompt (string content)
{
  "type": "user",
  "message": {
    "role": "user",
    "content": "RESUME_inbox-tending.md needs to be closed.  It's an orphaned path metamorphosis from inbox-backlog.  You''l need to do the recreation."
  },
  "timestamp": "2026-05-27T20:14:04.583Z"
}

// at 2026-05-27T20:14:37.718Z — assistant response (pure text, end_turn)
{
  "type": "assistant",
  "message": {
    "role": "assistant",
    "content": [{
      "type": "text",
      "text": "05/27 @ 16:14:04\n\nAcknowledged. Checking what RESUME artifacts exist for the inbox-backlog → inbox-tending chain, then reconstructing for closure."
    }]
  },
  "timestamp": "2026-05-27T20:14:37.718Z"
}

Incident B:

// at 2026-05-29T19:33:43.657Z — user prompt (string content)
{
  "type": "user",
  "uuid": "f837582a-8896-4527-9258-265f914bff89",
  "parentUuid": "62116f56-68ed-46f4-b5c2-9414ffa3b763",
  "message": {
    "role": "user",
    "content": "I think you may be creating an unnecessarily fine distinction.  If I want information about the project I go to provenance.  Provenance points me to the *various* sources that influenced the project/build.  Why would it be \"friction\" to have more than one form of information pointed to?"
  },
  "timestamp": "2026-05-29T19:33:43.657Z",
  "sessionId": "f2336af3-0903-4b7d-ba87-b6eb0eddbe1f",
  "version": "2.1.145",
  "cwd": "/home/rhys/homelab/projects/active/homelab_main",
  "gitBranch": "main"
}

// at 2026-05-29T19:33:59.466Z — assistant response (text prefix to tool_use)
{
  "type": "assistant",
  "uuid": "07dfa0f5-8c13-473c-a7e4-c4d3ffce7732",
  "message": {
    "role": "assistant",
    "content": [{
      "type": "text",
      "text": "05/29 @ 15:33:43\n\nConcede — that distinction was artificial. Provenance as comprehensive audit trail (the AMD pattern's \"data lineage\" function alongside structural decisions, forks, etc.) includes origin attribution naturally. Pointer-shaped entries belong in provenance by design; calling them friction was wrong.\n\n(a) is the right path. Authoring prov-010 (criteria origins) and prov-011 (Option-3 fork) now."
    }],
    "stop_reason": "tool_use"
  },
  "timestamp": "2026-05-29T19:33:59.466Z",
  "sessionId": "f2336af3-0903-4b7d-ba87-b6eb0eddbe1f"
}

Cluster context (5 instances, varying-resolution evidence)

The two incidents above are the high-evidence members of a wider display-vs-storage anomaly cluster the reporter has been tracking. The earlier 3 are user-observed at lower diagnostic resolution; they are listed for pattern context, not load-bearing claim.

| Date | Instance | Note | Reference |
|---|---|---|---|
| 2026-05-23 | 1st | Recap block appeared in user-prompt slot, omitting the prompt from scrollback. User-prompt-slot rendering failure. | hub-support project memory: project_cct_recap_in_prompt_slot.md |
| 2026-05-25 (approx.) | 2nd | Status-line turn counter observed stuck at 1 — "documented behavior conflicts with surface presentation." | hub-support project memory: project_ccc_statusline_counter_stuck.md |
| (date unspecified) | 3rd | Effort-cache display value ≠ actual cached value. | Cluster summary reference |
| 2026-05-27 | 4th (Incident A above) | Partial-turn omission (prompt + turn-anchor); response body rendered. Storage vs display asymmetry verified at transcript level. | bug-reports/anthropic_bug_report_cct_render_omission_20260527.md (per-incident draft) |
| 2026-05-29 | 5th (Incident B above) | Full-turn omission (prompt + turn-anchor + response body). Defect persists across CCC version bump (2.1.144 → 2.1.145). | bug-reports/Second-incident-2026-05-29/anthropic_bug_report_cct_render_omission_20260529.md (per-incident draft) |

Cluster signature: "documented behavior conflicts with surface presentation" — storage/protocol layer behaves correctly; display layer rendering selectively fails. Across the cluster, the affected surface varies (prompt slot, status line, effort cache, turn body), but the underlying gap is the same: state available in the system is not faithfully reflected in what the user sees.

Suggested investigation paths

  1. text + tool_use rendering path — the response-body omission in Incident B correlates with a shift from end_turn (pure text) to tool_use (text prefix to tool calls). If the render path treats text + tool_use response packets differently from text + end_turn, that interaction is a plausible failure trigger. Worth bisecting.
  2. Failure-scope variation — Incident A omitted prompt + turn-anchor; Incident B omitted the full turn. Is this one failure mode with variable scope (driven by post-prompt response shape), or two distinct failure modes that happen to co-occur in the same code path?
  3. CCC version stability — defect survives 2.1.144 → 2.1.145. Either both versions carry the defect, or the defect originates outside the CCC code path (terminal, environment, hook-output-stream interaction).
  4. Hook output interaction — both incidents had the global turn_tag_inject.sh UserPromptSubmit hook active, which emits a turn-anchor string appended to the user prompt before submission. Worth testing whether disabling the hook eliminates the omission; if yes, the interaction between hook output and the prompt-render path is implicated. (Incident A had an additional project-scoped diag-capture hook; Incident B did not — and the failure was more severe in Incident B, weakening any "more hooks = more failure" story but not ruling out hook-presence as a trigger.)
  5. Konsole-specific check — reproducibility under other terminals (xterm, alacritty, gnome-terminal, kitty) would localize whether the failure is in cct's escape-sequence emission or in Konsole's handling of it. Reporter has not tested other terminals; can produce captures on request.

Reporter context

Hub-coordinated diagnostic work across a multi-project homelab structure with cross-project agent memory and hook architecture. The cluster has been visible across multiple project-memory entries; Incidents A and B are the first two to produce structural evidence (storage/display asymmetry verifiable at the transcript level) that earlier user-reported instances lacked. Two separate cct projects (hub and hlmain) and two separate CCC versions (2.1.144 and 2.1.145) cover the defect, ruling out single-project hook configuration as the cause.

The reporter can produce additional diagnostic capture on request: ANSI raw output via script-wrapped session, reproducibility-mapping across more turn transitions, hook-disable A/B testing, terminal-portability tests.

Error Messages/Logs

None — the rendering anomaly is silent. No error path entered, no log line emitted, no fallback placeholder rendered. The silent failure is itself a diagnostic feature: no error-handling code is executing, suggesting the defect is in the normal render-emission code path rather than in error recovery.

Claude Model

Opus 4.7

Is this a regression?

I don't know — defect observed at CCC 2.1.145. The original #64007 cluster's earlier patterns date back several CCC versions, but this specific permission-gate trigger has not been characterized at earlier versions.

Last Working Version

Unknown.

Claude Code Version

2.1.145

Platform

Anthropic API

Operating System

Ubuntu/Debian Linux

Terminal/Shell

Other — Konsole 23.08.5 (not in template dropdown).

Additional Information

Environment specifics

  • Terminal: Konsole 23.08.5 (Qt 5.15.13, KDE Frameworks 5.115.0)
  • OS: Kubuntu 24.04.3 LTS (KDE Plasma 5.27)
  • Hooks active (UserPromptSubmit): turn_tag_inject.sh (global; injects MM/DD @ HH:MM:SS turn-anchor as agent reply prefix). Hook activity in jsonl as attachment / hook_success records.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗