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.
Loading...
Searching...
No Matches
design_docs Directory Reference
Directory dependency graph for design_docs:

Detailed Description

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.

Tree Groups

On number collisions.

  • Pre-merge (both docs unmerged): the second doc simply renumbers to the next free slot. Cheap — nothing external references an unmerged doc yet.
  • Post-merge (one doc is already on main): if a parallel branch assigned the same number, the new doc adopts a -2 suffix: NNNN-2-short_name.md (third collider -3, etc.). The already-landed doc keeps its bare NNNN- form so external links stay stable. No renumbering, no history rewrite.

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.

Workflow

  1. Draft (Status: Draft) — Use docs/design_docs/design_template.md. Goals, non-goals, open questions, a first pass at the implementation plan.
  2. In Progress — Mark TODOs in the implementation plan. Check them off as milestones land. The doc is the single source of truth for "where is this?"
  3. Shipped / Implemented — Write the developer-facing documentation the design earned (a new explainer via docs/design_docs/developer_template.md, or content folded into ../developer_docs.md). Never delete the design doc or recycle its number. Instead, rewrite it in place into a short summary: set Status to Implemented, briefly describe what the design was, and link the developer docs it spawned (plus a git-history pointer to the original full doc). The developer docs are "what ships today"; this stub keeps the number and every inbound link valid forever.
  4. Retrospective — Use retrospective_template.md after a difficult bug, incident, or workstream. Retrospectives may include history, but their output should be concrete decisions, review findings, and follow-up actions.

See docs/design_docs/AGENTS.md for more detail on the conventions automated agents should follow when editing design docs.

Templates

  • design_template.md — in-flight designs
  • developer_template.md — shipped features
  • retrospective_template.md — bug/workstream retrospectives

Document Index

# 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.

Cross-reference: developer docs

Once a design ships and stabilizes, its runtime surface is documented in the developer-facing tree under docs/. Especially relevant entry points: