Files
boocode/openspec
indifferentketchup ad45b28250 v1.13.19-html-artifact-panes: pane-based artifact viewer with on-request HTML
Every assistant message gets an "Open in pane" affordance that opens the
message in the workspace splitter — Markdown pane (Copy + Download .md) by
default; HTML pane (Download .html only) when the model emits a self-contained
<!DOCTYPE html> or fenced ```html artifact. BOOCHAT.md rule keeps Markdown
default at every length; HTML opt-in on explicit user request.

Backend: services/artifacts.ts (slug derivation + write helpers with
symlink-escape guard via realpath-after-mkdir), routes/artifacts.ts (POST
download + GET stream with nosniff + CSP sandbox defense-in-depth), HTML
detection in finalizeCompletion writing a new message_parts.kind='html_artifact'
row (schema CHECK extended via v1.13.13 pattern), graceful 1MB cap via the
pure decideHtmlArtifactWrite helper. PartKind union extended.

Frontend: MarkdownRenderer.tsx extracted from MessageBubble's inline
MarkdownBody for reuse; MarkdownArtifactPane.tsx + HtmlArtifactPane.tsx with
loading/error states; pane state is reference-only ({chat_id, message_id,
title}) — content fetched on mount to keep workspace_panes jsonb small and
avoid 1MB blobs riding session_workspace_updated frames. iframe sandbox
locked to allow-scripts allow-clipboard-write allow-downloads with no
allow-same-origin, srcDoc not src. openInPane discriminates 404 (expected
fallback) from real errors (toast + bail). PanelRightOpen icon button with
mobile 44px tap-target.

31 new server unit tests including a real-symlink filesystem case; 332/332
server tests passing, tsc clean both sides, pnpm -C apps/web build green.
Smoke deferred to first deploy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 12:43:13 +00:00
..

openspec

Per-batch documentation convention adopted v1.13.15-openspec.

Lift source: Fission-AI/OpenSpec directory layout. No CLI dependency — just the folder shape. Full OpenSpec lifecycle adoption is a future v1.14+ batch.

Layout

openspec/
  changes/
    <slug>/                          # one folder per shipped or planned batch
      proposal.md                    # Why + scope summary
      tasks.md                       # implementation step list
      design.md                      # architecture / data-model decisions (optional)
      specs/                         # reserved for future OpenSpec CLI adoption
    archived/                        # snapshots of pre-v1.13.15 batch docs
      <original-filename>.md
  specs/                             # global specs, future v1.14+ use

Conventions

  • Slugs are lowercase-hyphenated derived from the batch title (e.g. v1-13-10-per-tool-cost, file-attachments-v3-5).
  • Already-shipped pre-v1.13.15 batches live in changes/archived/ as single-file snapshots. They were not split into proposal/tasks because the work was already complete; archiving preserves git history.
  • New v1.13.15+ batches should land directly in changes/<slug>/proposal.md (+ tasks.md, + design.md when applicable).
  • proposal.md carries the "Why" and scope. tasks.md is the action list (numbered or checkbox). design.md is for non-trivial architectural decisions worth recording separately.
  • A canonical dispatch brief (matching the v1.13.9 / v1.13.10 format) is most naturally split as proposal.md (Where we are, Why this matters, rationale sections) + tasks.md (Scope items, Build + smoke) + design.md (Attribution model, Filtering, Canonical mapping).