Skip to content

[Bug]: Claude Code's artifact live-updates watcher is listed in the Agents panel as a working agent with a model and effort #13978

Description

@Vantrongs

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/web

Steps to reproduce

  1. In a Claude thread, have Claude publish a claude.ai artifact, or create a doc through the claude.ai Docs connector. Claude Code arms a background watcher for it (live updates for artifact https://claude.ai/artifact/<id>, a monitor_ws task).
  2. Open the Agents panel.

Expected behavior

Watchers are shown as what they are, for example a "Watching artifact" row without model, effort, or a working spinner, and they are not counted as working agents. Or they are kept out of the Agents panel, as #10375 notes for other background tasks.

Actual behavior

The Agents panel lists the watcher next to real subagents, with the session's model and effort (opus-5-5 · high), a spinner and "Working", and it adds to the "1 working" counter. It is not an agent: it runs no model, uses no tokens (— tok), and can stay armed for hours. Seeing "working for 1h 34m" in the Agents panel, I took it for a stuck subagent.

Related: #10375, where foreground Bash tasks get the subagent icon although the Agents panel excludes them.

Impact

Minor bug or occasional failure

Version or commit

0.0.43-nightly.20260926.2282

Environment

Desktop app on Linux (NixOS, Wayland, niri); Claude Code 2.1.283, Opus 5.5

Logs or stack traces

Screenshots, recordings, or supporting files

No response

Workaround

No response

Activity

  1. added
    bugSomething is broken or behaving incorrectly.
    needs-triageIssue needs maintainer review and initial categorization.
    on Sep 27, 2026
  2. juliusmarminge commented on Sep 27, 2026

    @juliusmarminge
    Member

    Triage

    Triaged against main @ de251fc. Confirmed. Not a duplicate of #10375, and not fixed on current main — 0.0.43-nightly.20260926.2282 is not behind a fix.

    What’s going on

    Publishing a claude.ai artifact auto-arms a background monitor_ws task (Claude Code’s Artifact tool; a Monitor-tool websocket watch, description like live updates for artifact …). It is not a subagent. The Claude Agent SDK lists monitor_ws next to monitor_mcp as work that must not defer the turn (test_shell_and_monitor_tasks_never_defer_the_close in tests/test_query.py). It runs no model and reports no usage.

    MONITOR_TASK_TYPES in packages/contracts/src/providerRuntime.ts is monitor, monitor_mcp, local_bash, and shell. monitor_ws is missing. classifyTaskAgentKind is a denylist that treats an unknown taskType as an agent, so ingestion stamps agentKind: "agent".

    That stamp is what every surface trusts:

    • foldSubagentActivities only skips agentKind !== "agent", so the watcher joins the Agents roster. task.started marks it running, which the panel labels “Working” and counts in “N working”.
    • On task_started, the Claude adapter copies the session model and effort when the launching tool has no override. That is the opus-5-5 · high chip. With no typedUsage, the row falls back to — tok.
    • The same set drives sidebar liveness. monitor_ws goes in the agents bucket, not monitors, so the thread pill stays pulsing “Working” (with the elapsed duration) instead of the static “Monitoring” eye, and the composer banner says “1 agent working” instead of “Monitoring”.

    Not #10375

    #10375 is the opposite mismatch: a foreground local_bash task is already background and correctly kept out of the Agents panel, but the timeline still paints a Bot icon. Here a watch-loop type the denylist does not know is shown as a real agent.

    Suggested fix

    Add "monitor_ws" to MONITOR_TASK_TYPES and cover it in the classifyTaskAgentKind tests. That set is shared by the ingestion stamp, sidebar liveness, and the client fallback, so the watcher drops out of the Agents roster the same way monitor / monitor_mcp already do, and a thread whose only live work is that watcher reads as Monitoring. Do not add a special Agents-panel row; watch loops are kept off that surface on purpose.

    in_process_teammate sits beside monitor_ws in the SDK’s “does not defer stdin” list. That only means it is not turn-deferring agent work — leave it out of the monitor set unless a separate report shows it should be background.

    Rows already stored with agentKind: "agent" stay that way, and roster membership is sticky per taskId, so a thread that already ingested the watcher keeps it until a new task.started is written after the fix.

  3. added
    via-triageFiled through npx t3 triage
    and removed
    needs-triageIssue needs maintainer review and initial categorization.
    on Sep 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions