Tracking follow-ups for the Artifacts experiment stack (#5422 – #5430 ). Everything is behind the Artifacts experiment (off by default).
Deferred from Codex review (round 1)
Deferred from Codex review (round 2)
Deferred from Codex review (round 3)
Deferred from Codex review (round 4)
Valid but rare: a same-size replacement that also preserves mtime keeps the preview until R reloads it, and distinguishing it needs a new ctime/version field in both host and runtime listings. (🤖 feat: Artifacts tab for files in $XUM_SCRATCH_DIR/artifacts (experiment) #5422 , oQf7d)
Correct that host reads ignore the request signal (remote runtime reads are already aborted, L2); (🤖 feat: Artifacts tab for files in $XUM_SCRATCH_DIR/artifacts (experiment) #5422 , oQf7g)
Valid cost concern: the portable sh walk forks one stat per file, bounded by the 5,000-visit budget. (🤖 feat: Artifacts scratch dir and reads on SSH, Docker and devcontainer runtimes #5423 , oQgVe)
Valid: JSON.parse has already materialized the whole value (bounded by the 10 MB read cap), so this is linear extra validation work, not unbounded growth. (🤖 feat: rich renderers for the Artifacts tab #5424 , oQgTH)
Valid hardening: Mermaid artifacts take the same uncapped path as Mermaid blocks in chat messages today. (🤖 feat: rich renderers for the Artifacts tab #5424 , oQgTQ)
Valid: editing only a referenced sibling does not rebuild the preview until Reload or a parent edit. (🤖 feat: rich renderers for the Artifacts tab #5424 , oQgTV)
Valid gap, but fail-closed: CSP blocks the unrewritten srcset candidate, so nothing leaks; (🤖 feat: rich renderers for the Artifacts tab #5424 , oQgTY)
Valid but bounded: each read carries the 5 MiB per-asset cap server-side and at most 32 assets are read, so in-flight bytes stay under 160 MiB. (🤖 feat: rich renderers for the Artifacts tab #5424 , oQkhC)
Confirmed: the board is event-driven, so CI or review changes after the last goal event are not re-rendered (the board's Updated time shows when it was generated). (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oQgu3)
Confirmed: for multi-project workspaces the probe runs in the primary checkout, while agent bash runs at the shared workspace root. (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oQgu8)
Confirmed: if the null refresh never lands (crash or failed write), a restarted service suppresses null observations and the old board stays until the next goal. (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oQgu-)
Valid but narrow: it needs a file literally named mcp-app: while that exact view is open, and the effect is only that the app keeps showing instead of the file until the view is closed. (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oQiQT)
Reproduced (a pinned file whose size changes within the same mtime second is not re-read until the next mtime change or Reload), but it is a transient stale preview, not a blocker at this stage; (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oQjU5)
Confirmed: the Open as artifact control renders for multi-project workspaces while the backend refuses pinning there with a clear error. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oQjU9)
Valid as hardening, not a reachable OOM: the buffered bytes are the user's own local entries that the restore replaces, which a repository writer cannot grow (incoming files stay capped at 64 MiB). (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQhmC)
Confirmed: the shelf unpin resets the selection without the reread the pinned-file unpin does. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQh0k)
Confirmed: a text-kind pin holding NUL bytes is decoded and returned (capped at 100k characters). (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQh0r)
Confirmed: NFC and NFD spellings of one name both pass readShelfBackup. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQh0v)
Confirmed: applyShelfRestore refuses a symlinked artifacts/global after the settings are restored. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQh08)
Valid UX gap: copies kept as name~2 show the same label in the picker. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQh1E)
Valid as hardening: the shelf grows only by explicit pins (a repin replaces its own entry) and each refresh aborts the previous listing request. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oQh1N)
Valid narrow race: only when getState resolves before listVersions, the frame sends on load, and a new version lands before Send; (🤖 feat: artifact interactions, canvas and annotations #5429 , oQjYR)
Valid: mixing an artifact send with a typed message in one queue loses the artifact marker, but the confirmed text is restored as a normal draft, not lost. (🤖 feat: artifact interactions, canvas and annotations #5429 , oQjYU)
Needs the pending-file delete to fail after the row is durable; (🤖 feat: artifact interactions, canvas and annotations #5429 , oQjYY)
Valid UX gap for malformed agent-written canvases; (🤖 feat: artifact interactions, canvas and annotations #5429 , oQjYc)
Valid on narrow layouts where the hidden sidebar panel stays mounted under the dialog (dialog from L6); (🤖 feat: artifact interactions, canvas and annotations #5429 , oQjYg)
Valid but minor: the stale pick reappears visibly and still needs a typed comment and a click to submit. (🤖 feat: artifact interactions, canvas and annotations #5429 , oQjYm)
Valid: project shelves follow includeProjects in the L7 backup adapters, so masking needs the separate includeProjectArtifacts option already (🤖 fix: Artifacts review fixes, security hardening and docs #5430 , oQfax)
Deferred from Codex review (round 5)
Valid: the probe checks test -d, so a mount the container user cannot write (UID mismatch with updateRemoteUserUID off) is still exported and shown, and agent writes then fail with a visible permiss (🤖 feat: Artifacts scratch dir and reads on SSH, Docker and devcontainer runtimes #5423 , oRvhm)
Valid rendering gap: an inlined relative stylesheet loses its media constraint. (🤖 feat: rich renderers for the Artifacts tab #5424 , oRw2c)
Valid gap: reference-style images are not inlined, so they render broken. (🤖 feat: rich renderers for the Artifacts tab #5424 , oRw2j)
Valid: republishing identical bytes with a new kind updates the latest version's kind, so an older card opens with the newer renderer. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oRzZa)
Valid on Windows: an absolute path differing only in case from the configured root is refused with an error (it fails closed; (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oRzZu)
Valid: without XUM_SCRATCH_DIR, artifact_list is not registered, so artifact_read has no listing to name its entries. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oRxzQ)
Valid: usedDirs also takes segment 1 of global/ paths. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oRxzV)
Valid: the stored pin request is reported in later results while only an explicit pin copies a version, so the shelf keeps the earlier copy, labeled with its version. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oRxzb)
Valid but narrow: only the last state set within 250 ms of tearing the frame down is lost, and the round-2 coalescing already replaced the host drops that lost the final save more often. (🤖 feat: artifact interactions, canvas and annotations #5429 , oRxyw)
Valid hardening: it needs an agent-written canvas with millions of tiny rows inside the read size limit and only slows the renderer. (🤖 feat: artifact interactions, canvas and annotations #5429 , oRxy2)
Valid edge: only when listVersions fails or is still refreshing does a comment get version 0 or the previous version; (🤖 feat: artifact interactions, canvas and annotations #5429 , oRxzD)
Valid: artifact comments show up in the git-review sidebar list without a working jump; (🤖 feat: artifact interactions, canvas and annotations #5429 , oRxzH)
Valid: without a result record (older or pruned calls) the card's display key is still used, so servers whose configured key has whitespace runs or exceeds 80 characters cannot open input-only views. (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oR3oZ)
Valid cosmetic edge: only a narrow card with an MCP badge and a long unbroken tool name can push the header past the edge; (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oR3oq)
Include file size in the changed-artifact marker (size-only rewrite with preserved mtime shows no dot). (🤖 feat: Artifacts tab for files in $XUM_SCRATCH_DIR/artifacts (experiment) #5422 , oRtbz)
Deferred from Codex review (round 6)
Valid: in the narrow dialog an Escape bridged from the preview is ignored, as it has been since the dialog was added (the round-4 change kept the Escape branch unchanged, so this is not a regression). (🤖 feat: rich renderers for the Artifacts tab #5424 , oTbxC)
Valid, executed: mapMarkdownImageUrls rewrites an image inside an inline code span ( becomes a data URL). (🤖 feat: rich renderers for the Artifacts tab #5424 , oTbxE)
Valid hardening: an HTML artifact near the 10 MB read cap can be slow to parse. (🤖 feat: rich renderers for the Artifacts tab #5424 , oTbxF)
Valid gap, but it fails closed: img-src data: blob: blocks the unresolved relative SVG reference, so nothing is fetched and the image just does not show. (🤖 feat: rich renderers for the Artifacts tab #5424 , oTbxL)
Valid: a version read does not check the blob against its stored size and hash. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oTasQ)
Confirmed: artifact_list reports diagram.txt published as Mermaid with the extension kind (text). (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oTasU)
Valid only when two backends share one Xum home (the desktop app alongside xum server, or XUM_ALLOW_MULTIPLE_INSTANCES); (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oTasl)
Only the in-process ACP path awaits startup housekeeping; (🤖 feat: artifact interactions, canvas and annotations #5429 , oTa4u)
Nothing is lost: the confirmed record stays on disk and is delivered when Artifacts is turned on again. (🤖 feat: artifact interactions, canvas and annotations #5429 , oTa44)
Valid but needs the user to reassign an existing server key to a different server and then reopen a view recorded before the change; (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oTax-)
Valid test-coverage gap with no product impact: McpAppViewPhone reuses the file's shared PHONE preset (viewport global only, Pixel disabled), so CI runs its play at desktop width. (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oTayC)
Confirmed: a path whose flattened name exceeds 255 characters fails to pin with a misleading error. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oTZjl)
Valid, but this predates the PR: on main, bash and terminal env already merge secrets after xumEnv, so a user-defined secret can shadow any XUM_* variable, XUM_SCRATCH_DIR included (this PR does not t (🤖 feat: Artifacts tab for files in $XUM_SCRATCH_DIR/artifacts (experiment) #5422 , oR7ut)
Deferred from Codex review (round 7)
We could not reproduce this: the host effect runs right after the commit that mounts the frame, while the srcdoc document is created by an asynchronous navigation, so the listener is in place before t (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oUJ8D)
Valid narrow race: a view request already in flight when its workspace is archived or removed can reach the MCP manager without the teardown admission that prompt discovery uses (the cold-start path a (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oUJ8W)
Valid: a failed shelf listing leaves the previous value in place. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oUK4J)
Confirmed that padding bypasses the field bounds, but the cost is capped by the 64 MiB restore limit (about 40 ms per poll for 56 MiB in a probe), it needs a user-run restore from a tampered repositor (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oUL8h)
Valid race: a live frame's write can land on a version published moments earlier, so that version starts with the previous frame's state; (🤖 feat: artifact interactions, canvas and annotations #5429 , oULZq)
No product path writes a record for another workspace: records are written only under the workspace they name, and forks do not copy the pending file. (🤖 feat: artifact interactions, canvas and annotations #5429 , oULZv)
Needs a state file edited outside Xum; (🤖 feat: artifact interactions, canvas and annotations #5429 , oULZ4)
Valid gap, but it fails closed: only the entry module is inlined, and its relative imports are blocked by the frame CSP, so nothing outside the artifact folder is fetched; (🤖 feat: rich renderers for the Artifacts tab #5424 , oUKVt)
Valid: the Table/Tree/Raw switch has no dedicated shortcut (the buttons are keyboard-focusable). (🤖 feat: rich renderers for the Artifacts tab #5424 , oUKVy)
Valid wording gap: outside the desktop app, HTML artifacts show escaped source with a desktop-only notice, which is the intended fail-closed behavior. (🤖 feat: rich renderers for the Artifacts tab #5424 , oUKV4)
Valid availability concern; (🤖 feat: rich renderers for the Artifacts tab #5424 , oUMWj)
Reproduced: a same-prefix colliding pair is found in about 3 s, and the second path's publish is appended to the first path's history. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oUMU8)
Reproduced on a Linux dev container host: after the container swaps a pinned file's parent for a symlink, the pinned-files list shows the size and mtime of the host file it points to. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oUMVB)
Valid: ArtifactViewer derives the image MIME type from the extension only, so an extensionless file published with kind "image" shows "This image cannot be displayed." It fails closed with a notice an (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oUMVD)
Valid: artifact_list awaits the live listing before it reads the version indexes, so an unreachable runtime returns an error instead of the stored versions. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oUMVE)
Valid: a non-ENOENT read error on one index rejects the whole scan. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oUMVH)
Deferred from Codex review (round 8)
Valid: while the workspace runtime is unreachable, the live-listing error hides shelf selections too. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oU-UW)
Valid, and already The skipped entries are listed and stay in the backup, so a restore after the import brings them back. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oU-Ub)
Valid hardening: the artifact can replace the pick under an open comment box, but the new quote is shown in the popover before the user submits. (🤖 feat: artifact interactions, canvas and annotations #5429 , oVAPB)
Valid: an agent-written canvas with a deeply nested x value trips the Artifacts error boundary instead of reporting a bad point; (🤖 feat: artifact interactions, canvas and annotations #5429 , oVAPG)
Valid edge: saved state can be overwritten only when reading it fails while the following write succeeds, for example a brief IPC drop. (🤖 feat: artifact interactions, canvas and annotations #5429 , oVAPL)
Valid but not a blocker: the race can only leave an empty scratch directory behind (the pre-write guard still blocks the board write), so nothing is lost or exposed. (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oU_Dp)
Deferred from Codex review (round 9)
Valid but not a blocker: a transient tool_env lookup failure can cache false, which only keeps the agent-browser warning on HTML artifacts until restart; (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oVPBi)
Valid: a stored Markdown/HTML/SVG version resolves its relative assets through the live artifacts route, so an older version can render with today's image or stylesheet. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oVQ9J)
Valid: malformed persisted UI-only metadata renders an enabled Open in Artifacts button whose click fails an assertion. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oVQ9Z)
Valid: if the host clock moves backward after a publish, turn-end snapshots are skipped until wall time passes that publish. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oVQ9i)
Valid only for an entry edited by hand: pins always write exactly one content file plus meta.json, and a content file named meta.json in any case is refused. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oVP0j)
Valid: a non-missing lstat error on the backup's shelf folder is treated as no shelf backup. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oVP0n)
Valid: two overlapping pins of different versions of one artifact can land in either order. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oVP0u)
Valid: a non-missing read error on a shelf scope exports that scope as empty without a notice. (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oVP0x)
Valid hardening: a canvas packed with millions of tiny entries is fully validated before the 500-block cap applies. (🤖 feat: artifact interactions, canvas and annotations #5429 , oVSMt)
Needs a pending file Xum did not write: live sends validate depth and size before recording. (🤖 feat: artifact interactions, canvas and annotations #5429 , oVSM5)
Needs a chat.jsonl row Xum did not write: artifact data is validated before the message is sent. (🤖 feat: artifact interactions, canvas and annotations #5429 , oVSNA)
Needs two backends on the same session data, which Xum does not support by default. (🤖 feat: artifact interactions, canvas and annotations #5429 , oVSNI)
Valid gap: state of a deleted artifact is still stored but not shown in artifact_list; (🤖 feat: artifact interactions, canvas and annotations #5429 , oVSNi)
Valid at this layer: the experiment gate moved down to L2, but the corrected docs row arrives with L9 of this stack ("SSH, Docker and devcontainer workspaces get one only when the Artifacts experiment (🤖 feat: Artifacts scratch dir and reads on SSH, Docker and devcontainer runtimes #5423 , oVOkX)
Deferred from Codex review (round 10)
Valid: the panel's positive probe never expires, so a deleted SSH dir shows as an empty folder and a devcontainer rebuilt without the mount keeps showing the host folder until restart. (🤖 feat: Artifacts scratch dir and reads on SSH, Docker and devcontainer runtimes #5423 , oWlVO)
Valid edge case: a pre-1970 mtime makes stat print a negative value and the SSH/Docker listing drops that file. (🤖 feat: Artifacts scratch dir and reads on SSH, Docker and devcontainer runtimes #5423 , oWlVc)
Valid hardening: a canvas with millions of inline chart rows is fully validated before the 1,000-row display cap. (🤖 feat: artifact interactions, canvas and annotations #5429 , oWpTf)
Valid: a deleted artifact opened at its implicit latest version is classed as a live selection, so if the runtime later becomes unreachable the listing error replaces its stored preview. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oWlDs)
Valid on Windows: a relative path with backslashes is refused with an error, while forward slashes and absolute paths work. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oWlDx)
Valid: attaching an empty SVG inside the artifacts folder records an (empty, accurate) version before the tool reports failure, which also counts as that turn's publish. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oWlD2)
Valid: stale SSH/Docker pinned reads are not cancelled and can run until the 30 s exec timeout. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oWlD7)
Valid UX nit: the generated goal board gets the same 'Not checked by the agent' label as agent-written HTML when agent-browser is missing. (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oWe5T)
Deferred from Codex review (round 11)
Valid cost issue: with Artifacts as the hidden active tab, the narrow dialog mounts a second panel, so polling and any HTML frame are duplicated. (🤖 feat: rich renderers for the Artifacts tab #5424 , oXkMJ)
Valid fidelity gap: an inlined async classic script runs at its original position instead of asynchronously. (🤖 feat: rich renderers for the Artifacts tab #5424 , oXkMc)
Valid but not a blocker: the agent-browser hint can stay stale after a trust toggle until the viewer remounts. (🤖 feat: goal status board and agent-browser self-check for artifacts #5425 , oXkiO)
Valid on case-insensitive filesystems: publishing Report.md and then report.md keeps two histories for one file, and the non-listed spelling shows as deleted. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oXmfi)
Valid: a home-relative file-tool path such as ~/checkout/report.md cannot be pinned from Open as artifact and gets a refusal (it fails closed); (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oXmfq)
Valid: a same-size, mtime-preserving rewrite (cp -p) keeps the preview's read key, so the open preview stays stale until Reload or the next metadata change. (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oXmgj)
Valid: Stop puts a queued artifact send's internal envelope text into the composer instead of dropping it; (🤖 feat: artifact interactions, canvas and annotations #5429 , oXjW6)
Deferred from Codex review (after the final push)
Refresh cached state before remounting artifact frames (src/browser/features/RightSidebar/ArtifactsTab/useArtifactInteractions.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oaNqu)
Disable dismissal while an artifact send is in flight (src/browser/features/RightSidebar/ArtifactsTab/ArtifactSendStrip.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oaNqx)
Preserve the shelf sidecar across downgraded pushes (src/node/services/backup/adapters.ts) (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oaJRh)
Report I/O failures instead of succeeding at unpin (src/node/services/artifactShelf.ts) (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oZ5Z7)
Reuse an existing source entry before a free slot (src/node/services/artifactShelf.ts) (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oZ5aE)
Count sparse array slots in the JSON work budget (src/common/constants/artifactInteractions.ts) (🤖 feat: artifact interactions, canvas and annotations #5429 , oZ5JD)
Add scoped shortcuts for confirming and dismissing sends (src/browser/features/RightSidebar/ArtifactsTab/ArtifactSendStrip.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oZ5JI)
Evict obsolete assets when canvas references change (src/browser/features/RightSidebar/ArtifactsTab/CanvasArtifact.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oZ5JO)
Rebuild the sandbox when artifact identity changes (src/browser/features/RightSidebar/ArtifactsTab/SandboxedArtifactFrame.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oZ5JU)
Escape tool names before displaying consent (src/browser/features/RightSidebar/ArtifactsTab/McpAppFrame.tsx) (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oY3xy)
Permit local blob assets in app views (src/browser/features/RightSidebar/ArtifactsTab/mcpAppCsp.ts) (🤖 feat: MCP Apps views in the Artifacts tab #5426 , oY3x2)
Keep pinned previews visible when artifact listing fails (src/browser/features/RightSidebar/ArtifactsTab/ArtifactsPanel.tsx) (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oY4w_)
Preserve source bytes when registering attachments (src/node/services/tools/attach_file.ts) (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oY4xC)
Treat bare tilde prefixes as relative filenames (src/node/services/artifactVersionsOperations.ts) (🤖 feat: artifact versions, the artifact tool and pinned files #5427 , oY4xE)
Keep extended entries restorable from safety snapshots (src/node/services/backup/artifactShelfBackup.ts) (🤖 feat: cross-workspace artifact shelf and its settings backup #5428 , oYzu4)
Validate canvas button payloads before opening the send strip (src/browser/features/RightSidebar/ArtifactsTab/CanvasArtifact.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oY2JV)
Track send progress separately for each artifact (src/browser/features/RightSidebar/ArtifactsTab/useArtifactInteractions.tsx) (🤖 feat: artifact interactions, canvas and annotations #5429 , oY2Ja)
Preserve valid replacement characters in downloadable text (src/browser/features/RightSidebar/ArtifactsTab/ArtifactsPanel.tsx) (🤖 feat: rich renderers for the Artifacts tab #5424 , oY1m4)
Known follow-ups from the stack
Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high • Cost: $107.80
Tracking follow-ups for the Artifacts experiment stack (#5422 – #5430). Everything is behind the Artifacts experiment (off by default).
Deferred from Codex review (round 1)
url()references in inlined stylesheets (fonts, background images) so HTML artifacts that link a stylesheet render its assets. (🤖 feat: rich renderers for the Artifacts tab #5424 review)artifacts.readManyIPC call (HTML asset inlining and canvas readers issue one call per asset today; capped at 32 assets). (🤖 feat: rich renderers for the Artifacts tab #5424, 🤖 feat: artifact interactions, canvas and annotations #5429 review)Deferred from Codex review (round 2)
artifact_list; memory, timeline and advisor have the same gap). (🤖 feat: Artifacts tab for files in $XUM_SCRATCH_DIR/artifacts (experiment) #5422 review)Deferred from Codex review (round 3)
artifact_listoutput by serialized size, not only entry count. (🤖 feat: Artifacts tab for files in $XUM_SCRATCH_DIR/artifacts (experiment) #5422)~in pin paths per runtime. (🤖 feat: artifact versions, the artifact tool and pinned files #5427)Deferred from Codex review (round 4)
Deferred from Codex review (round 5)
test -d, so a mount the container user cannot write (UID mismatch with updateRemoteUserUID off) is still exported and shown, and agent writes then fail with a visible permiss (🤖 feat: Artifacts scratch dir and reads on SSH, Docker and devcontainer runtimes #5423, oRvhm)Deferred from Codex review (round 6)
becomes a data URL). (🤖 feat: rich renderers for the Artifacts tab #5424, oTbxE)diagram.txtpublished as Mermaid with the extension kind (text). (🤖 feat: artifact versions, the artifact tool and pinned files #5427, oTasU)xum server, or XUM_ALLOW_MULTIPLE_INSTANCES); (🤖 feat: artifact versions, the artifact tool and pinned files #5427, oTasl)Deferred from Codex review (round 7)
Deferred from Codex review (round 8)
Deferred from Codex review (round 9)
Deferred from Codex review (round 10)
Deferred from Codex review (round 11)
Report.mdand thenreport.mdkeeps two histories for one file, and the non-listed spelling shows as deleted. (🤖 feat: artifact versions, the artifact tool and pinned files #5427, oXmfi)~/checkout/report.mdcannot be pinned from Open as artifact and gets a refusal (it fails closed); (🤖 feat: artifact versions, the artifact tool and pinned files #5427, oXmfq)cp -p) keeps the preview's read key, so the open preview stays stale until Reload or the next metadata change. (🤖 feat: artifact versions, the artifact tool and pinned files #5427, oXmgj)Deferred from Codex review (after the final push)
Known follow-ups from the stack
Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:high• Cost:$107.80