|
|
Donner SVG Editor & Engine
SVG-native editor and embeddable SVG2 + CSS3 engine in C++20, with GPU (WebGPU) and compact CPU renderers, built for correctness, security, and performance.
|
This directory holds every design doc for the Donner project, numbered ADR-style in the order they were first written. New docs append the next free number — NNNN-short_name.md — and existing numbers never change once assigned, so external references stay stable.
Every model-authored design records the exact accountable model identifier on its Author line; a human-led, model-assisted design records it on a separate Model line. This provenance is preserved across later review and upgrade passes; see AGENTS.md. tools/check_design_doc_provenance.py enforces the rule in CI. Historical records whose exact model cannot be established from the document or repository history are ratcheted in provenance_debt.txt; that list may shrink but cannot silently grow.
On number collisions.
For how Donner's runtime is organized and documented, start with Developer Docs. Design docs capture why a piece of the system looks the way it does (or will look). Developer docs describe what ships today.
See docs/design_docs/AGENTS.md for more detail on the conventions automated agents should follow when editing design docs.
| # | Doc | Status | Summary |
|---|---|---|---|
| 0001 | terminal_image_viewer | — | Plans for a terminal image viewer to preview SVG renders over SSH / in CI output. |
| 0002 | mcp_test_triage_server | — | MCP server that lets agents triage resvg golden-image diffs interactively. |
| 0003 | renderer_interface_design | Shipped (Phases 1-2a, CMake backend selection, drawText, MockRendererInterface) | The abstract RendererInterface / RendererDriver split that unblocked multiple backends (Skia removed; TinySkia + Geode remain). |
| 0004 | external_svg_references | Shipped | How <image href="…"> and <use href="…other.svg"> are fetched, sandboxed, and cached. |
| 0005 | incremental_invalidation | Partially implemented | Dirty-flag propagation from DOM mutations through layout, style, and compositing. |
| 0006 | color_emoji | Implemented | Rendering strategy for COLR/CPAL and CBDT color-emoji tables. |
| 0007 | coverage_improvement_plan | Complete | The plan used to raise Donner's line coverage into the 80%+ range. |
| 0008 | css_fonts | Partial | CSS @font-face loading pipeline (TTF/OTF/WOFF/WOFF2); most font-matching properties now implemented. |
| 0009 | resvg_test_suite_bugs | Living catalog | Cases where resvg's golden images disagree with the SVG/CSS spec. |
| 0010 | text_rendering | Implemented (Phases 1–6); backend refactor complete | <text>, <tspan>, <textPath>, the stb / FreeType / HarfBuzz backend tiers. |
| 0011 | v0_5_release | Shipped (v0.5.0, 2026-04-16) | Release checklist and implementation plan for shipping v0.5, plus retrospective for the next release. |
| 0012 | continuous_fuzzing | Implemented | Dockerized always-on fuzzing harness for every parser surface. |
| 0013 | coverage_improvement | Superseded by 0044 | Ongoing per-round coverage work: what's still uncovered and why. Repo-wide coverage has since passed this doc's target. |
| 0014 | filter_performance | Historical (Skia comparison target removed) | How the tiny-skia filter pipeline caught up with Skia on every primitive; Part 2 SIMD work is still the live reference. |
| 0015 | skia_filter_conformance | Removed | Filter conformance for the removed full-Skia backend; superseded by 0014 + the TinySkia/Geode resvg suites. |
| 0016 | ci_escape_prevention | Phase 1 Implemented; Phase 2 partial (diff-only) | Taxonomy of CI escapes and the checks that catch each one before merge. |
| 0017 | geode_renderer | Feature-complete GPU backend | The GPU-backed Geode renderer (originally Dawn, now wgpu-native); AA pipeline superseded by 0041. |
| 0018 | bcr_release | Active — blocked | Step-by-step for publishing Donner to the Bazel Central Registry; the v0.5.0 publish attempt failed and no successful publish has landed. |
| 0019 | css_token_stream | Implemented (Milestones 1–3); Milestone 4 STOP HERE | The ComponentValueStream replacement for ad-hoc CSS token iteration. |
| 0020 | editor | Implemented | Brought jwmcglynn/donner-editor in-tree as //donner/editor (M1–M8, #529). See Editor Architecture. |
| 0021 | resvg_feature_gaps | Living catalog | SVG features Donner doesn't implement yet (or implements incompletely). |
| 0022 | resvg_test_suite_upgrade | Design | Upgrading the vendored resvg test suite snapshot to a newer revision. |
| 0023 | editor_sandbox | Historical; replacement planned for v1.0 | Historical design for the removed editor parser / renderer process-isolation prototype. |
| 0024 | proposed_issues_2026q2 | Stale wishlist — largely overtaken by direct implementation | Q2 2026 wishlist: feature gaps and CI improvements; see 0021/0031 for current state. |
| 0025 | composited_rendering | Implementing (Phase 1 + 2.5 live; Phase 2 partial) | Layer-based compositor for fluid editor dragging without full re-render. |
| 0025-2 | editor_ux | Implemented | Viewport zoom/pan/DPR, marquee multi-select, gestures, menu parity; superseded architecturally by the thin-client EditorShell. |
| 0026 | svg_conformance_testing | Draft | Manifest-driven SVG 1.1 filter + WPT + scripted conformance program. |
| 0026-2 | drag_end_latency | Superseded by 0035 | The shipped fix used a structural-remap path, not this doc's drop-reparse plan. |
| 0027 | tight_bounded_segments | Implementing (M0/0.5/0.6 landed; M1–6 not started) | Tight per-segment path bounds; tightBoundedSegments now defaults on. |
| 0027-2 | scripting | Draft | donner::script: QuickJS-NG + IDL codegen that projects the ECS as the DOM. |
| 0028 | v1_0_release | Draft — superseded as the next release by v0.8 | Release checklist and implementation plan for shipping v1.0; ProjectRoadmap.md now targets v0.8 next. |
| 0028-2 | tinyskia_premul_internal | Rejected proposal | Internal premultiplied-alpha representation for tiny-skia; rejected with rationale recorded. |
| 0029 | ui_input_repro | Implemented | Deterministic UI input recording/replay (Stage 1 + Stage 2 headless replay); backs the gl_rnr_replay CI golden suite. |
| 0029-2 | ci_runtime | Superseded by 0031 | CI runtime reduction plan (post-Skia baseline, per-config cache slots, runner sizing). Scope folded into 0031. |
| 0030 | geode_performance | In Progress | Geode GPU-backend performance milestones (counters, arenas, shared command encoder, target reuse). |
| 0031 | ci_hardening_2026q2 | In Progress — Milestone 1 and most of Milestone 2 landed | Consolidated CI work for 2026-Q2: escape prevention (issue #552 class) + runtime reduction (subsumes 0029). |
| 0032 | sandbox_branch_split | Design | Plan for extracting general-purpose improvements off the sandbox branch into main-targeted PRs (tiered by porting cost). |
| 0033 | multithreading_and_dom_lifetime | Implemented | DOM lifetime ownership model, ConcurrentDom access guards, and immutable render snapshots. Shipped in #596; see linked dev docs. |
| 0033-2 | editor_design_tool_responsiveness | Implementing | Editor responsiveness plan for high-zoom dragging, async rendering, and composited presentation. |
| 0034 | progressive_rendering | Removed | Historical design for progressive intermediate frames; removed after stale-canvas tile bugs. |
| 0035 | filter_layer_compose_offset_bug | Fixed | Root cause and coverage for the filtered-layer compose-offset/source-sync bug class. |
| 0036 | composited_presentation_retrospective | Retrospective | Review of the filtered drag repro, flat-mode removal, fragile code paths, testing gaps, and cleanup actions. |
| 0037 | geode_presentation_glitch_investigation | Investigation | Handoff notes for the remaining Geode direct-texture drag/zoom overlay pops and texture-splat glitches. |
| 0038 | geode_tinyskia_text_parity | Developer reference | Geode↔tiny-skia text parity: shared PlacedTextGeometry layer both backends consume. Live GeodeTinyParity comparison mode retired by 0041; each backend now gates against its own golden. |
| 0039 | text_editor_focus_and_flash | Implemented; see Editor Source Focus | Source-pane focus view, changed-character flash highlight, and context-aware soft wrap without horizontal scrolling. |
| 0040 | semantic_text_completion | Design | Parser-backed text completion and source block movement that preserve cursor flow and document structure. |
| 0041 | geode_analytical_aa | Developer reference | Geode anti-aliasing & coverage: dual-ray band-grid analytic coverage (superseded 4× MSAA sample_mask); appendix of rejected AA approaches. |
| 0041-2 | path_authoring_and_boolean_operations | Partially implemented | Professional path authoring (Pen tool, boolean ops) and Donner-level boolean path operations for the editor; Path Edit tool not started. |
| 0042 | geode_slug_conformance | Developer reference | Geode Slug implementation reference: dual-ray/band-grid fragment pipeline, invariants, and known limitations. |
| 0043 | deterministic_replay_testing | Implemented — shipped in #602 | Deterministic multi-thread replay framework; re-enabled the #601-related tests. |
| 0044 | coverage_improvement_2026q2 | Implemented | Raised line coverage 81.5→85.6% (phases 0–4); also fixed 3 bugs the push surfaced (2 TextEditor crashes + EncodeColor CurrentColor). |
| 0044-2 | editor_fluid_canvas_rendering | Implementation in progress | Viewport-bounded high-zoom rendering, immediate-mode editor chrome/spans, and large-selection LOD for fluid editor UX. |
| 0045 | editor_geode_chrome_migration | Draft | Next steps for moving source ropes and chip decorative chrome from ImGui draw lists to Geode-backed screen-space rendering. |
| 0046 | editor_group_layers | Design | User-facing editor layer tree for SVG groups and shapes, with per-tier previews and selection sync. |
| 0047 | v0_8_showcase | Design | v0.8 rebrand and splash showcase for Donner SVG Editor & Engine, including text-to-outlines and viewport SVG export with overlay chrome. |
| 0048 | design_doc_hygiene | Draft | Cleanup plan for issues the 2026-06-30 design-doc audit found: missing 0015, five number collisions, unindexed docs, deferred finalizations. |
| 0049 | structured_text_editing | Implemented | Structured source editing (XMLSourceStore/DocumentSyncController); structuredEditingEnabled_ defaults on. See Structured Source Editing. |
| 0050 | text_editor_behavior | Living reference | Text editor behavior spec and known-bug tracker for the source editor. |
| 0051 | text_editor_refactor | Mostly implemented | TextEditorCore extraction plan (Commit 1 done, most of Commit 2 done; copy/cut/paste and final TextEditor_tests.cc split remain). |
| 0052 | text/overview | Implemented | Text rendering hub doc; TinySkia/Geode backends. |
| 0052-2 | text/architecture | Historical | Text backend architecture notes, explicitly marked historical. |
| 0052-3 | text/rtl_and_complex_scripts | Reference | RTL/complex-script shaping notes. |
| 0052-4 | text/testing | Reference | Text test strategy, golden image tests, resvg slices, and backend parity (Geode vs TinySkia). |
| 0052-5 | text/text_backend_refactor | Reference | stb / FreeType+HarfBuzz backend tier split. |
| 0052-6 | text/text_v1_release | Reference | Text v1 release checklist. |
| 0052-7 | text/textpath | Reference | <textPath> implementation notes. |
| 0053 | native_gpu_hal | Design | Clean-room Donner GPU runtime, native Metal/Vulkan backends, browser bridge, shader IR, and a Rust-independent build graph. |
| 0054 | editor_design_language | In Progress | Graphite editor chrome, Signal Teal interaction states, source palette, fixed control geometry, and deterministic visual verification. |
| 0055 | binary_size | Draft | Binary size reduction: reproducible native + wasm size report tooling, measured baseline, and ranked reduction plan. |
| 0056 | wasm_ios_runtime_compatibility | In Progress | Feature-detected Geode WebGPU plus TinySkia WebGL2 packaging and iPhone-profile runtime verification. |
| 0057 | donner_svg2_test_suite | Draft | Reusable adapter and distribution layer combining the upstream resvg corpus with focused Donner SVG 2 extension tests. |
Once a design ships and stabilizes, its runtime surface is documented in the developer-facing tree under docs/. Especially relevant entry points: