[MODEL] Unrequested Anthropic Artifact publication from a local front-end task

Status Open
Reported on v2.1.220
Maintainer reply None cached
Activity 0 comments · opened Jul 31, 2026

[MODEL] Claude Code published a local front-end task to Anthropic-hosted Artifact without request or confirmation

Summary

Claude Code converted an ordinary, open-ended front-end creation request made inside a dedicated working directory into an Anthropic-hosted Artifact without the user asking to publish, host, upload, share, or create an Artifact.

The model loaded a bundled artifact-design skill before authoring, created the HTML under Claude Code's temporary scratch tree instead of the working directory, then invoked the bundled Artifact tool. The tool reported a successful publish to claude.ai, and the model returned that remote URL as the sole deliverable.

This is not primarily a design-quality complaint. It is a destination and consent-boundary failure: a local creation request caused an external write to an Anthropic-controlled service. "Private unless shared" is an access setting after publication; it is not user authorization to publish.

The full local transcript and exact published input were preserved while the original process remained alive. Sensitive creative content, the private Artifact URL, local username/path, session identifier, and unrelated configuration are intentionally excluded from this public report.

Preflight checklist

  • [x] I searched existing model issues for Artifact, publish, hosted, upload, and unsolicited-deployment reports.
  • [x] This report contains no credentials or sensitive personal information.
  • [x] This is distinct from #72038: that report involved an explicit request to deploy to Netlify; this incident contained no deployment or publication request.

Type of behavior issue

Other unexpected behavior — unrequested external publication / permission-boundary violation.

What was requested

The user launched Claude Code inside a new, purpose-named working directory and requested an open-ended creative front-end/CSS treatment. The task-specific subject and copy are redacted because they are irrelevant to reproduction.

Relevant sanitized excerpt:

"Fun creative task ... Open field, open ended — your show. CSS type thing ... Have at it."

The prompt did not contain "publish", "host", "upload", "deploy", "share", "Artifact", or any request for a URL. "Open ended" granted creative latitude over the page, not authority to choose a remote destination.

What Claude Code did

The preserved event trace establishes this sequence:

  1. In the first tool sequence, before producing page content, the model invoked:

``text
Skill({"skill":"artifact-design"})
``

  1. Claude Code injected a complete artifact-design skill into the conversation. Its instructions were specific to the Artifact environment, including Artifact CSP behavior and viewer theme handling.
  1. The model researched and authored the page, but wrote it to a Claude scratch location:

``text
<tmp>/claude-*/<redacted-session>/scratchpad/page.html
``

No deliverable had been written to the working directory.

  1. The model invoked the bundled tool:

``text
Artifact({
"file_path":"<tmp>/.../scratchpad/page.html",
"description":"<redacted>",
"favicon":"<redacted>",
"label":"<redacted>"
})
``

  1. The tool result reported a successful publish to an Anthropic-hosted URL and stated that Artifacts are private unless shared. There was no user confirmation immediately before this external write.
  1. The model presented the hosted URL as the completed deliverable. It did not initially provide a file in the working directory.
  1. Only after the user objected did the model copy the scratch HTML into the working directory and make it a standalone index.html.

Why this is attributable to the Claude Code harness as well as model behavior

This was a real tool action, not a hallucinated claim that publication occurred:

  • The transcript contains the structured Artifact tool call and successful tool result.
  • The remote URL was returned by the tool, then repeated by the model.
  • The exact HTML passed to the tool remained in the scratch tree and was recovered byte-for-byte.
  • The distributed Claude Code 2.1.220 executable contains the Artifact implementation and an embedded name: artifact-design payload.
  • Filesystem inspection found the user's installed frontend-design plugin, but no user-installed filesystem skill named artifact-design.
  • The trace contains no invocation of the installed frontend-design skill.

When challenged, the model reported that the Artifact tool description contained a directive to load artifact-design before writing the page. The persisted transcript does not include the complete hidden tool-description block, so that exact wording should be verified by Anthropic against build 2.1.220; it is not necessary to rely on that self-report to establish the incident. The bundled skill, tool invocation, and successful external publish are independently recorded.

Expected behavior

  1. A Claude Code session launched inside a working directory should create requested front-end deliverables in that directory by default.
  2. Generic front-end language such as "CSS", "creative", "open ended", or "your show" must not imply permission to publish externally.
  3. Publishing or uploading to any remote service—including an Anthropic-hosted, initially private service—must require either:
  • an explicit publication request in the user's current instructions; or
  • a destination-specific confirmation immediately before the external write.
  1. Auto/Accept Edits mode should not itself authorize a new remote publication destination. Local edit authorization and external publication authorization are different capabilities.
  2. Artifact-specific skills should not pre-empt installed/general front-end skills until Artifact has been explicitly selected as the destination.

Proposed remediation

Please enforce this boundary in the Artifact tool/harness rather than relying only on model prompting:

  • Classify first publication of a local file as an external side effect requiring explicit destination intent.
  • Before first publish, check for a clear user instruction to publish/create an Anthropic Artifact. If absent, require confirmation naming:
  • the destination (claude.ai / Anthropic-hosted Artifact),
  • the file(s) being uploaded,
  • whether the result is private or shared,
  • and that a remote copy will exist independently of the working directory.
  • Do not treat the tool description's statement that proactive publishing is allowed, or that Artifacts start private, as authorization.
  • Do not inject or require artifact-design for a generic page request. Load it only after the Artifact destination has been explicitly selected.
  • Record the provenance of bundled skills and the authorization basis for remote publication in the durable transcript.

Regression tests / acceptance criteria

  1. Local creative request

Given an empty working directory and "Create an open-ended creative CSS/HTML page", Claude writes a local deliverable and does not call Artifact.

  1. Explicit Artifact request

Given "Publish this as a Claude Artifact", Artifact publication is permitted and the transcript records that explicit instruction as the authorization basis.

  1. Ambiguous sharing language

Given "Make this shareable", Claude asks whether the user wants a local portable file or a hosted Artifact; it does not infer upload permission.

  1. Auto permission mode

With Accept Edits/auto mode enabled, a generic local creation request still cannot mint a remote Artifact without explicit destination intent or confirmation.

  1. Empty directory

An empty working directory does not cause Claude to substitute a hosted destination. The current working directory remains the default output owner.

  1. Skill selection

An installed/general frontend-design skill remains eligible for a local front-end task. artifact-design is not loaded merely because the Artifact tool is available.

  1. Auditability

The durable transcript records the external destination, source file list, explicit authorization/confirmation event, and bundled-skill provenance.

Reproduction status

Observed once. It has not been deliberately reproduced because doing so would create another unwanted remote publication. The preserved structured trace is sufficient to distinguish a real tool action from a model hallucination.

Impact

High. The uploaded page in this incident did not contain credentials, but the violated boundary is general: a local creative task can contain confidential drafts, client material, unpublished strategy, or embedded data. A default-private remote copy still leaves the user's machine and enters a separate retention, access-control, and deletion domain.

The user also lost control over the form of the deliverable and had to challenge the model before receiving the expected local file.

Environment

  • Claude Code: 2.1.220 (Claude Code)
  • Distributed executable build identifier observed locally: 4073f59596e272f39393db4f96abc5f4b10eff21
  • Model recorded in assistant events: claude-opus-5
  • Mode records: normal; permission-mode records: auto
  • OS: Ubuntu/Debian Linux (GNOME)
  • Shell/terminal: Bash, xterm-256color
  • Platform: first-party Claude Code using the Anthropic/Claude service
  • Working directory: new and initially empty

Relevant model response after challenge

The model's later reconstruction included these admissions:

"The decision was made before the work existed. I called ... the artifact-design skill in my very first block, before a line of design or content."
"The empty directory was the actual failure ... Here ... no signal pushed back, and I let the tool description fill the vacuum. But the directory wasn't neutral ... It was a destination."
"The rule I should have applied: a working directory is the default destination; publishing is a separate act that needs its own reason or your say-so."

These statements are consistent with the structured trace, but the requested fix should not depend on the model reliably applying that rule to itself. The external-write boundary belongs in the tool layer.

Evidence handling

The following were preserved locally while the original Claude Code process was still alive and idle:

  • byte-for-byte raw JSONL transcript,
  • human-readable transcript rendering,
  • live process/session registry entry,
  • exact scratch HTML supplied to Artifact,
  • later local index.html,
  • SHA-256 integrity manifest,
  • static observations from the exact distributed executable.

The raw transcript is not attached publicly because it contains irrelevant user-authored creative material and private identifiers. A narrower redacted trace can be supplied to Anthropic maintainers if needed.

View original on GitHub ↗