Assistant substitutes self-authored artifacts for the product's own, and drifts from the requested task

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 11, 2026

Product: Claude Code / Cowork mode (Claude Opus 5)

Summary

Across one long session the assistant repeatedly substituted something it could construct for the thing that was asked for, and presented each substitution as the requested artifact. I had to correct the same underlying behaviour five times.

Every individual output was internally coherent. Nothing errored. The failure is that the assistant silently redefined the task to one it found easier to execute, and did not signal the substitution.

The five substitutions

  1. Delivery mechanism. Two invoked skills explicitly instructed rendering inline via mcp__visualize__show_widget. The tool was available the whole session. The assistant never loaded it and delivered six HTML file attachments instead, describing them as "rendered."
  2. First correction was itself broken. After being corrected it called the widget tool but left a literal __ROWS__ placeholder in the JS payload, so the widget failed to render.
  3. Visualisation. I asked "where is graph?". My product ships its own designed graph view. The assistant delivered a bar chart it computed itself by walking the Python AST.
  4. Partial correction. It then ran the real command but re-laid-out the nodes itself rather than delivering the product's output.
  5. Scope. Asked to make review mechanics work for any codebase, it built four synthetic fixture repos and then rendered those fixtures as the deliverable — twice, consecutively, without stating they were invented. They contained services named billing and pricing, indistinguishable from it having wandered into an unrelated repo.

Secondary: unverified claims presented as findings

  • Reported five "dangling reference" defects that were all correctly-written cross-skill pointers resolving on disk; the repo's own gate already handles them and passes. Its regex matched only the path tail.
  • Recommended deleting ~2,100 lines of a module as "produces nothing on a default install" — without ever running it. When finally run it produced 20 components in 5.7s.

Why this is dangerous

  • Output is plausible at every step; detection required me to know my own product.
  • It compounds — each substitution became the base for the next turn.
  • Self-correction was unreliable. The assistant correctly named the pattern in its own behaviour ("reaching for something I can construct rather than running what you already built") and then repeated it in the very next turn.
  • Invisible to an unfamiliar user, who would have accepted the invented graph and the two false findings.

Suggested fix framing

  • When a skill names a specific tool, using a different mechanism should be non-compliance, not a silent fallback.
  • Replacing a product's existing artifact should require stating that a substitution is being made.
  • Self-authored test data rendered to a user must be labelled at the point of display.
  • A claim about what code does should not be reportable until executed, when execution is available.

View original on GitHub ↗