The hardest design decision so far was MoonBase. Apps had to come from somewhere, and the easy answer was "host them in the shell" — one process, tabs, shared memory, fast. I rejected that. MoonBase is a framework library, not a host. Each .app launches as its own process and links libmoonbase.so.1. A crash in one app doesn't take the shell down with it. There's no shared-process model to leak state between apps.
Phase B landed the framework skeleton, the launcher, and two sandbox profiles — `native` (bundle read-only, no devices, no network unless declared) and `webview` (native plus /dev/dri and GBM passthrough for zero-copy WPE WebKit). MoonRock owns 100% of the chrome — title bar, traffic lights, shadows, drag, resize. Apps draw only their content rect. If an app draws its own titlebar, it's a bug.
Per-output scale landed the same window. EDID hash → PPI band → default backing scale, persisted per-output. That's the foundation the whole HiDPI story sits on.