ADR 001 — Native desktop, canonical processes
Accepted 2026-10-08. The product is a new C#/.NET 10/Avalonia 11 desktop instrument. No Desktop UI dependency.
| Criterion | .NET / Avalonia | Tauri / TypeScript | Electron |
|---|---|---|---|
| macOS, Windows, Linux | Native platform backends, shared controls | WKWebView/WebView2/WebKitGTK, platform rendering differences | Shared Chromium, all three |
| Visual fidelity | Custom native styles, vector drawing, splitters | CSS/SVG excellent, browser differences | CSS/SVG excellent |
| Canvas / mixer / timeline | Skia drawing, native input, virtual lists | SVG/canvas, web pointer input | SVG/canvas, web pointer input |
| Packaging | Self-contained .app; no host .NET requirement | .app and installers built by Rust | Chromium/Node bundle |
| Testing | Core xUnit + Avalonia headless + actual window dogfood | Web E2E mature; native host tests separately | Mature renderer E2E |
| Processes / IPC | Typed ProcessStartInfo and JSON streams | Rust commands and sidecars | Node main-process IPC |
| SEIF reuse | CLI boundary; public Application exports in narrow Node helper | Same supported boundaries | Same supported boundaries |
| Ergonomics | Strong C# state/control model; additional adapter process | CSS ergonomics, additional Rust toolchain | Existing ecosystem, larger runtime |
| Footprint | .NET/Skia plus canonical CLI and narrow Node helper | Small shell, same required canonical sidecars | Additional Chromium distribution |
Avalonia is preferred because its resizable native control surfaces and custom canvas serve a desktop instrument well. Cross-language integration is not a reason to port authority. Tauri is a viable alternate but adds a Rust host and varying browser engines; Electron has no evidence strong enough to justify its extra browser runtime here. The host had .NET 6 only, so a project-local .NET 10 SDK was installed. Avalonia 11.3.22 is pinned for its stable desktop/headless API.
Process boundaries: Avalonia owns presentation, desired disclosure intent, local navigation and ephemeral observation history. A pinned Go CLI owns Workspace resolution, ProductMotor, disclosure composition, source expansion, ProductOperation qualification, admission, effect, receipts and postconditions. A narrow Node process loads the existing public Application resource-preview and proposal-acceptance exports; no copied rules. Credentials remain in canonical process configuration. Only structured arguments are sent; no shell interpreter.
Focus in Context Entry controls disclosure and does not change canonical selection. Mixer explicitly exposes both desired participation and Product selection. Working Context is the bounded disclosure plus source observations acquired through canonical expansion; it is ephemeral, never a new durable Product entity. Layout, graph coordinates and history are presentation state.
References: Avalonia macOS, Avalonia headless, Tauri process model, Tauri distribution, Electron distribution. Current local operational sources are recorded in docs/research/source-estate.json.