[MODEL] Unrequested Anthropic Artifact publication from a local front-end task
[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
modelissues 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:
- In the first tool sequence, before producing page content, the model invoked:
``text``
Skill({"skill":"artifact-design"})
- Claude Code injected a complete
artifact-designskill into the conversation. Its instructions were specific to the Artifact environment, including Artifact CSP behavior and viewer theme handling.
- 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.
- The model invoked the bundled tool:
``text``
Artifact({
"file_path":"<tmp>/.../scratchpad/page.html",
"description":"<redacted>",
"favicon":"<redacted>",
"label":"<redacted>"
})
- 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.
- The model presented the hosted URL as the completed deliverable. It did not initially provide a file in the working directory.
- 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
Artifacttool 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.220executable contains the Artifact implementation and an embeddedname: artifact-designpayload. - Filesystem inspection found the user's installed
frontend-designplugin, but no user-installed filesystem skill namedartifact-design. - The trace contains no invocation of the installed
frontend-designskill.
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
- A Claude Code session launched inside a working directory should create requested front-end deliverables in that directory by default.
- Generic front-end language such as "CSS", "creative", "open ended", or "your show" must not imply permission to publish externally.
- 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.
- Auto/Accept Edits mode should not itself authorize a new remote publication destination. Local edit authorization and external publication authorization are different capabilities.
- 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-designfor 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
- 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.
- 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.
- 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.
- 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.
- Empty directory
An empty working directory does not cause Claude to substitute a hosted destination. The current working directory remains the default output owner.
- 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.
- 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.