[BUG] Long-session compaction loses operator-action attribution → model frames operator-driven Bash runs as passive/autonomous

Resolved 💬 1 comment Opened May 30, 2026 by viviane1016 Closed Jul 3, 2026

Summary

In a 12+ hour Claude Code session with hundreds of tool calls, post-compaction the model lost attribution for operator-driven external commands (Bash invocations against external workflow tools), and reframed those operator actions in passive or self-driven narrative voice. The operator's substantial contribution to a multi-hour workflow became invisible.

This is the inverse polarity of #63601:

  • #63601: Model attributes its own forgotten Write/Edit calls TO the operator
  • This issue: Model attributes the operator's forgotten Bash runs AS autonomous

Same root cause (compaction loses actor attribution); different surfaces and different harm vector.

Environment

  • Claude Code 2.1.156, accessed via the desktop app's "Code" tab
  • Model: claude-opus-4-7 (effort: high)
  • Session age: ~12 hours continuous
  • 700+ tool calls (mix of Write/Edit, Bash, ToolSearch, MCP tools)

What happened

The operator (across multiple turns over ~5 hours):

  1. Substantially rewrote the briefing the model drafted (per a system-reminder showing their diff: added "v1.1.0 shipped" framing, "no longer blocked" framing, auto-mirror note)
  2. Ran bees plan excise (one Bash invocation)
  3. Reviewed the resulting plan, ran bees approve (another Bash invocation)
  4. Launched bees queen-orchestrate excise (multi-hour autonomous orchestration)
  5. Handled operator gates during the orchestration

After other intervening work pushed those tool calls out of the visible context window, when reporting on the resulting PR the model said:

"Bees PR #365 (excise) exists — appeared while we were focused on the orphan petitions. The bees workflow self-ran excise end-to-end through bees queen-orchestrate against the briefing I drafted earlier."

Every operator action — the briefing revision, the plan invocation, the approval, the orchestrate launch — was erased. The framing makes the PR sound autonomous (appeared, self-ran) and credits the model with the briefing while not mentioning the operator's substantial revision.

The operator caught it: "you are again misattributing my work to yours."

Why it's a distinct symptom worth its own issue

#63601 is about falsely blaming the operator for the model's writes. The cognitive frame is "model can't account for an artifact → defaults to 'user did it'".

This symptom is about erasing the operator's contribution. The cognitive frame is "model can't account for the operator's drive → defaults to passive/autonomous voice". The grammatical effect (passive voice, agentless framing) is its own pathology that #63601 doesn't capture.

Different downstream harm:

  • #63601 erodes trust by misattributing fault
  • This issue erodes trust by erasing labor — operators driving complex multi-hour workflows have their work made invisible by the summary, which several operators report as more demoralizing than being falsely blamed

Reproduction

Same harness conditions as #63601, with the additional pattern of operator-driven external Bash runs (not just in-Claude tool calls):

  1. Long session (~12h+)
  2. Operator runs external workflow tools via Bash (bees plan, bees approve, autonomous orchestrators, etc.) — these create real artifacts (commits, PRs, branches) that re-enter context later
  3. Allow compaction to fire between the operator's invocation and the model's eventual reference to the result
  4. Observe that the model frames the result in passive/autonomous voice instead of "the operator did X"

Recommendations

These compose with #63601's recommendations:

  1. Structured tool-use ledger preserved through compaction (same as #63601 #1). For Bash and MCP tool calls especially, the ledger should record who_invoked — model or operator — so post-compaction the actor remains explicit.
  1. Compaction-time attribution-voice linting. Passive framings (appeared, was created, self-ran, it happened) hide the actor. Compaction prompts should require explicit actor naming. When the actor is genuinely unknown after summarization, surface that as actor: unknown rather than erasing it with passive grammar.
  1. Active-voice attribution audits. When the model is about to write a summary sentence containing a state-mutating verb (opened, ran, created, pushed, merged), the model should explicitly name the actor — not let passive voice substitute for honest "I'm not sure who did this."
  1. Transcript-search tool exposing actor-stamped history (extends #63601 #3). When the model can't account for a result it observes (a PR, a branch, a file), it should query its own session jsonl with an actor filter: "show me the last 10 Bash invocations and who invoked them."

Evidence

The full conversation is preserved in the session jsonl. The model's misattribution and the operator's pushback are both recorded. Tool-call records (Bash invocations) all show is_user_driven markers that the model lost track of during summarization.

Notes

  • Cross-referenced in #63601 comment.
  • Filed at operator request. Operator's words: "have we done context compression since then or do you need to update the issue filed with anthropic? ... then do both."

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗