Good boundaries.
Explicit remaining work.
A review of the implemented dependency graph, ports, adapters, entities, value types and runtime responsibilities, with targeted fixes and a practical refactoring order.
Build and VM status: this site's source links identify the documentation build. The VM can run a separate experimental release. Current readiness identifies accepted main, the deployed candidate, source-specific native results and remaining work.
The separate host service observer report adds actual host-side evidence for four independent port consumers on source 6f9e75d0. All four binary builds, four audio mock tests and strict release Clippy pass. Each read-only 15-second run produces a snapshot and exits successfully; its owned unit is collected, and audio confirms its own watch cancellation. Ports remain domain contracts and PulseAudio, BlueZ, PowerServices and Hyprland remain adapters. No control or input is sent. This tests observation, not audible output, pairing/key events, physical controls, state-change delivery, hotplug, suspend, desktop UI or performance; the power count-only output also conflates absent and unavailable capabilities.
The separation is useful.
It is not finished everywhere.
The framework has real independent clients and avoids desktop/OS-service dependencies. The desktop receives adapters through port contracts, while production wiring lives in composition roots. Use cases depend only on the domain. These are meaningful boundaries, not just directory names.
The domain is mostly typed data and small behavior models. Some types enforce invariants, while others are public records whose callers can construct invalid values. Launcher and widget interaction now belong to child controllers with explicit borrowed inputs. The root still coordinates shared snapshots, settings and bar/dock presentation. Message payload sizes remain application-owned, and service error handling is uneven. Those limits should guide the next changes rather than adding more empty crates or abstractions.
The ongoing audit fixes concrete ownership and lifecycle problems, with separate evidence for unit tests, Vulkan pixels and native VM behavior. The implementation ledger tracks the larger backlog and unverified paths. Its current rollup and readiness guide distinguish implemented code, owned native fixtures and real application/hardware acceptance. Historical evidence keeps its original source and scope; a later test can supersede an old pending summary without rewriting that report. More crate names alone would not resolve those gaps.
Entities, value types,
snapshots and policies.
| Concept | Current examples | Assessment |
|---|---|---|
| Entity identity | Application + AppId, Window address, Workspace ID, Notification ID | AppId distinguishes desktop-entry identity from arbitrary strings. Other IDs remain strings/integers; stronger wrappers would prevent mixing them if used across more APIs. |
| Validated value types | AppId, Placement, Date, WorkspaceRef, WallpaperFps | Private storage and constructors enforce identity, finite coordinates, real calendar dates, workspace address kind and playback rate. Persisted values pass those boundaries too. MediaFrame validates dimensions and exact RGBA storage before delivery. |
| Value records | LaunchCommand, LauncherSize | These describe values rather than independent identities. They retain public fields; launcher dimension checks occur at the settings boundary. Do not infer universal validation from their names. |
| Invariant-bearing value | Secret | Encapsulated storage, zeroization and no Debug/Clone reduce accidental copying or logging. This is a stronger boundary than a public String field. |
| Stateful domain behavior | FocusTimer | Transitions and remaining time are explicit. Time is supplied as input, making behavior deterministic without system calls. |
| Service snapshot | CompositorSnapshot, SystemSnapshot, MediaSnapshot, WeatherSnapshot | Data returned by adapters. Transport and rendering details stay outside; error/unavailable states still need more consistent client handling. |
| Preference aggregate | DesktopSettings | Persisted preferences with backward-compatible defaults. Geometry resolution and design tokens stay in the client. Serde currently couples the domain record to the stored schema. |
| Use cases | Search ranking, activate application, move/snap widget, menu selection, notification inbox, validate settings | Pure policy or port calls. They do not launch processes, access files or render. Notification transport invokes the same policy as tests. |
The new LauncherSize stores optional preferred dimensions. The settings validation use case rejects zero dimensions. The client enforces useful control sizes and screen/grid limits. Keeping screen pixels, theme tokens and compositor calls out of domain policy preserves the boundary.
AppId::new now enforces a non-empty desktop-file identity ending in .desktop, without path separators or control characters. Its storage is private and deserialization uses the same check; valid saved IDs keep their existing string representation. An invalid saved ID produces a settings error and preserves the original file. Date::new rejects impossible dates, derives weekdays and performs checked relative-month arithmetic. Placement::new and deserialization reject non-finite coordinates, while allowing negative positions. The client supplies grid spacing and screen bounds to use cases; those presentation rules are separate from finite-value validity.
Ports describe needs.
Adapters supply behavior.
| Port | Contract | Adapter | Implementation |
|---|---|---|---|
| ApplicationPort | Discover, launch and explicitly open targets | XdgApplications | Merged catalog/actions, fresh launch context and Open. XDG/D-Bus/argv IO stays in this adapter; domain values carry no Wayland handles. Scoped real Chromium intent acceptance passes nine feature and eight restoration checks on unchanged 8e with the d1 independent consumer, now merged through PR89; other applications and direct token consumption remain unverified |
| CompositorPort | Read windows/workspaces, focus, switch and watch | Hyprland | Hyprland request/event sockets; reconnect policy in adapter |
| SettingsPort | Load and save DesktopSettings | JsonSettings | Validated JSON and atomic replacement |
| ClockPort | Supply local date and time | LocalClock | System time through chrono |
| SystemPort | Sample CPU and memory state | LinuxSystem | Linux counters; separate audio and network ports |
| AudioPort | Observe devices/streams and issue controls | PulseAudio | Native libpulse connection, bounded command queue, reconnect; native panel, virtual playback/capture routing, command timeout, hotplug and reconnect verified; hardware validation remains open |
| NetworkPort | Observe network state and request operations | NetworkManager | Native system-bus adapter with bounded commands/events, temporary handles and signal-driven state. The root injects it into a native child with masked SecretAgent repair that retains the saved profile UUID and storage policy. Fourteen owned-radio native recovery checks pass; physical Wi-Fi, enterprise provisioning and agent-owned vaults remain open |
| BluetoothPort | Observe controllers/devices and control discovery or paired devices | BlueZ | Native system-bus owner with transient handles, bounded commands and connection-scoped discovery. Native input, virtual-controller radio controls, discovery, explicit pairing/bonding, trust/removal and confirmed Forget pass. The rebuilt signal fix observes external changes without a restart. Decline/Escape cancellation and unpaired Disconnect reach observed terminal phases while the reference peer stays alive. Legacy entrypoints now open the native child. Connect has an explicit attempt ID and urgent cancellation; private protocol/client checks cover pending authorization, late admission, retirement and timeout. Native pending-profile, incoming and physical validation remain pending |
| DisplayPort | Read/watch layouts and apply, keep or revert a draft | HyprlandDisplays | Ordered complete captures and an independent same-executable guardian; verified native preview, 15-second deadline and UI-pipe EOF rollback; atomic guarded user monitors.lua persistence. Seven earlier one-output flows and the historical four-flow two-output result retain their scope. Later harness 1774fa87 on runtime 26d03adf passes nine virtual-output flows, including rotation, disable/re-enable and native input on a fractional Displays panel; physical/cable hotplug, suspend, compositor restart, secure-output and pacing acceptance remain separate |
| PowerPort | Observe battery/profiles/backlights and request power operations | PowerServices | Native UPower, profile, sysfs and logind adapters; command admission is separate from observed completion. SDK controls and owned protocol fixtures exist; VM/hardware acceptance remains deferred |
| TrayPort | Observe items and invoke current application actions/menus | StatusNotifier | Native session-bus watcher, owner retirement and DBusMenu revisions with SDK presentation. Owned protocol/client and native SNI/DBusMenu fixture checks pass; third-party application interoperability remains open |
| MediaPort | Observe players and send captured-target controls | Mpris | Native MPRIS owner/property/seek signals, bounded commands and transient track handles |
| WeatherPort | Return configured location weather | OpenMeteo | Checked requests, bounded legacy import and current/three-day decoding. Local/visual checks and scoped native opening/focus plus one production forecast pass; native form mutation and failure/retry remain open |
| WallpaperPort | List, stage, commit and discard backgrounds | LucentWallpaper / WallpaperStore | Bounded immutable snapshots and atomic selection |
| WallpaperPlaybackPort | Prepare owned media and supply timed decoded frames | NativeVideoWallpapers | Native FFmpeg libraries, validated RGBA frames, cancellation and FPS caps. The client owns output policy/latest delivery; the SDK owns reusable stream textures |
| WallpaperCatalogPort | Search providers and download selected assets | OnlineWallpapers | Provider HTTP responses and local download cache |
| PaletteGenerationPort | Derive a palette from an image | ImagePalette | Decoded pixel sampling and the design recipe |
| ThemePort | Apply a validated palette | LucentTheme | Exports Lucent tokens to apps and session clients |
| SessionPort | Request locking; observe lock state for background-work policy | LucentSession | Secure-lock wrapper plus bounded Hyprland observations; no authentication or unlock authority |
| NotificationPort | Watch notifications and control their lifecycle | FreedesktopNotifications | D-Bus transport around pure notification policy |
| NotificationHistoryPort | Load and save bounded private history | JsonNotificationHistory | Versioned durable history and DND; one ordered storage worker keeps filesystem work out of delivery and the UI thread |
| AuthenticationPort | Run a trusted authentication conversation | PamLocker / Greetd | PAM or greetd; separate lock/login composition roots |
| StopSignal | Cooperative cancellation and bounded waiting | WatchStop | Maps the framework cancellation handle into the domain contract |
| AssetPort (presentation) | Supply decoded images and symbols for presentation targets | NativeAssets | Worker-side SVG/image loading and physical-size background mip retention; deliberately outside the pure domain |
DesktopAdapters holds injected implementations through Arc<dyn …Port> handles. desktop_adapters() chooses concrete adapters. A trait-object call is an ordinary synchronous Rust call; the effects/subscription machinery decides which thread invokes it.
The desktop composition root is the only desktop module selecting production service implementations. In-memory adapters let client tests exercise behavior without executing host commands. Lock and login have their own composition roots.
AudioPort and NetworkPort have native adapters and desktop children. BluetoothPort has a native BlueZ adapter, an independent consumer and a desktop child with explicit pairing prompts. Two owned virtual controllers pass radio controls, discovery, comparison-code pairing, bonding, trust/removal and confirmed Forget. The rebuilt adapter fixes a real signal-filter defect: external power changes now refresh the panel without a restart or client polling. Escape closes an active prompt without reopening it. Decline now cancels its matching owned attempt, and connected unpaired devices have Disconnect beside Pair without Trust. Native tests observe terminal phases while the reference peer remains running, and successful acceptance still produces a bond without automatic trust. Existing Bluetooth entrypoints now open the Rust child without terminal windows. Pending Connect cancellation, physical devices/profiles, incoming pairing and broader faults remain open. PowerPort now covers battery, profiles, brightness and session requests. TrayPort and a native StatusNotifier/DBusMenu adapter now have an SDK client and independent consumer; owned native fixture acceptance passes. One genuine wired NetworkManager Applet item/menu/information action now passes five interaction and four cleanup checks on unchanged 8e, one virtual output, plus thirteen independent post-removal preservation checks. Other apps, wireless/secret-agent flows, nested menus, hardware, pixel quality and performance remain open. See the Bluetooth service guide for ownership, command admission and lifecycle details, and the system map for retained tools and services.
Fix the boundary.
Check the behavior.
| Finding | Action / current status | Evidence |
|---|---|---|
| CompositorPort contained a default two-second polling loop. | Removed the implementation from the domain contract. Hyprland owns watching/reconnects; the test adapter supplies its own behavior. | Domain desktop.rs; services compositor.rs; use-case fake. |
| The existing settings validation use case was not applied by JsonSettings. | Load and save now call it. Invalid saves fail before replacing the original file; optional launcher values preserve older settings. | Real file-adapter round-trip and rejection test. |
| Boundary tests missed nested modules and some Cargo declarations. | Source checks recurse through client/domain modules. The local dependency graph resolves package aliases and workspace inheritance across normal, build, development and target-specific declarations. | tests/test_architecture.py, including fixtures for bypasses the old checks missed. These checks do not analyze Rust semantics or registry-package internals. |
| The compositor adapter invented six workspaces for the bar. | Hyprland now reports actual workspaces, including special ones. The client builds six default shortcut buttons and adds other positive workspace IDs; narrow-layout rules keep the active destination visible. | Adapter snapshot fixture, client workspace policy and bar geometry tests. |
| Date allowed day zero and conflicting weekdays; Placement could carry NaN. | Constructors now enforce both invariants. Calendar month arithmetic is constant-time domain behavior. Invalid drag dimensions are rejected before mutation; release clears transient drag state even on failure. Persisted-settings failures retain their own error state through unrelated successful effects. | Calendar checks against chrono across two 400-year cycles, invalid deserialization, persistence compatibility, extreme snapping and drag tests. |
| Shadow dimensions were fixed in the GPU shader. | The public Shadow value carries color, offset and blur. The design system supplies elevation tokens; layout emits a distinct shadow primitive and the shader derives falloff and extent from its parameters. | 1×/2× Vulkan tests vary blur independently of the renderer. Desktop visual regression suite. |
| Primitive corners differed between software and hardware Vulkan. | The renderer now selects fine derivatives explicitly for primitive and rounded-clip antialiasing. This fixes driver-dependent coverage without teaching the renderer client styling. | All 148 existing visual comparisons pass on both drivers with unchanged baselines and tolerances; focused mirror-symmetry checks cover 1×/2× and both pixel-quad phases. |
| Launcher dimensions were fixed presentation constants. | Added persisted preferences and token defaults. Client geometry resolves them; neither domain nor renderer learns about launcher placement. | Resizing, keyboard, migration, clipping and native visual tests. |
| Wallpaper selection committed paths before decoding, and local/online intent could race. | A child coordinator prepares immutable snapshots, rejects stale preparation and finishes accepted commits in order. The visible background uses the prepared image. Explicit palette choices supersede older extraction. | Storage, cancellation, coalescing and desktop integration tests; native evidence tracked in the implementation ledger. |
| Desktop owns launcher, bar and widget state in one struct. | Launcher query, mode, selection, scrolling, event routing, selector rendering and panel motion are now owned by a child with private state. Borrowed inputs and typed intents connect it to the root. Widget drag/calendar/timer state and views now have the same boundary, with one catalog supplying selector metadata, geometry and rendering. Bar/dock coordination remains open. | launcher/ and widgets/; child behavior tests, boundary guards and the production visual suite. |
| One effects worker delayed unrelated actions. | Named bounded queues now separate persistence, assets, exports and interactive actions. Tests exercise ordering, independence, cancellation, saturation and worker panic. Runtime delivery now bounds waiting messages at 64, applies producer backpressure and rejects queued events from cancelled subscription lifetimes. Live subscription bodies are capped at 64, including streams still stopping. | lucent-wayland run_inner and lucent-api Effects. |
| IPC cleanup was only on the normal run_inner exit path. | An owned command server now cancels and joins its worker on scope exit, including early errors. Its poller wake-up is independent of the socket path, and cleanup checks the recorded file identity. Connected I/O has absolute deadlines; blocked delivery and pending replies observe cancellation. | Isolated socket tests cover error returns/retry, missing/replaced paths, saturated delivery, pending replies, slow peers and quit acknowledgement. Native evidence is tracked separately in the implementation ledger. |
| Every notes edit queues a full settings snapshot; completion shares the generic action-result message. | A client persistence coordinator now tracks revisions, allows one outstanding settings task and keeps only the latest pending snapshot. It retains failures across unrelated results and supports retry through Notes or IPC. Notes expose unavailable, saving, retrying, saved and failed states. | persistence.rs: burst coalescing, delayed completion, failure/retry, rejected work and stale results; root/widget status and retry tests. Native evidence is tracked in the implementation ledger. |
| Widget dragging changes the shared preference aggregate before release. | The host now keeps a separate bounded preview and commits through the move use case only on release. Reset, hide and invalid input cancel the rest of a gesture. A drag begins at the currently visible position even if a saved position falls outside a resized output. | Injected-adapter regression verifies an unrelated save excludes the preview and the release persists the final snap. Cancellation and clamped-origin behavior have child tests; native evidence is tracked separately in the ledger. |
| Wallpaper integration tests relied on a rollback snapshot still being in the cache. | A test checkpoint now preserves the selected owned image and metadata outside the cache. The helper restores it before IPC rollback, refuses to overwrite changed content, and removes private test storage after restoration is verified. Production cache policy is unchanged. | Pruned/present/changed/corrupt/symlink and legacy-file tests; native wallpaper transaction and both provider workflows with original-desktop restoration. |
| Offscreen snapshots multiplied dimensions without overflow checks; output paths did not check device texture limits. | A renderer-owned extent validator checks logical-to-physical multiplication and the requested device's texture limit. Snapshots also validate padded readback size against buffer and host limits before GPU work. Zero-sized native surfaces retain retry behavior. | Boundary arithmetic tests and a Vulkan rejection-then-valid-render regression. This protects output allocation inputs, not all scene resources or device-memory availability. |
| An opaque 65×3 image lost alpha at its final pixel on software Vulkan; exact fractional clip edges disagreed with hit testing. | Clipping now happens after derivative evaluation and implicit texture sampling. Clip coordinates come from the physical sample center, and right/bottom edges use the same exclusion rule as Rect::contains. | The original opaque pixel returned alpha 215 instead of 255 on llvmpipe; RADV passed. Focused regressions now cover odd output sizes, fractional clip boundaries, transparent exterior pixels and 1×/2× density. Existing visual tolerances remain unchanged. |
| Output validation did not cover scene content. | The renderer now checks finite geometry, image dimensions, text requests and geometry-buffer capacity against its numeric envelope and actual device limits. Text preparation checks glyph bitmap dimensions before rasterization; packed scene buffers use fallible reservation. Canvas::paint returns an error before geometry writes or frame submission if preparation fails. | Pure boundary checks and an offscreen GPU regression cover early rejection, a later glyph failure after an image upload, retained previous pixels/resources, and subsequent valid rendering. Upstream layout, font parsing, available memory and device-fault recovery remain separate boundaries. |
| Notification delivery had an unbounded signal queue and no idle disconnect observation. | The adapter now admits up to 256 pending signals before changing state. Two-signal actions and timeout batches honor that capacity. A closed connection reports unavailability and triggers reconnection; pending signals from the ended connection are discarded. Exclusive name acquisition refuses to displace another server. Inbox/history remain in memory. | Private-daemon tests reproduced both failures and now pass stalled-subscriber overload/recovery, normal protocol/actions, idle bus restart and name contention. Adapter tests cover atomic rejection, expiration capacity and connection cleanup. One drained batch can coexist with the next queue; this is not durable delivery or a total memory bound. |
| Some discovery/provider failures become empty/default values. | Still open. Model loading, empty, unavailable and failed separately where the UI needs to explain them. | platform.rs and desktop initialization/subscriptions. |
| One shared viewport and generic surface IDs limit per-output behavior. | Still open. Introduce an output-aware desktop model before claiming robust independent multi-monitor layouts. | Desktop.viewport and runtime surface reconciliation. |
The native audio-panel report records real pointer controls, routing confirmed through backend state, a 120-move gesture, a deliberately suspended audio server causing command timeout, removal of a held device and service/socket restart without restarting the desktop. Recovery assigns fresh object identities; the client now offers Dismiss when a failed target is no longer available. These guest-only tests restore original audio settings and remove owned fixtures. They do not establish physical audio behavior, memory targets or hardware frame pacing.
The session-client report records a real rejected greetd login, clearing its retained username, an empty submit and a successful clean retry. The shared client owns active-field routing and zeroizing responses; PAM, greetd and libpolkit-agent retain authentication authority. Login, secure lock and permission dialogs disable local command/inspection IPC. Native secure-lock acknowledgement, masked-response clearing, authenticated unlock and wallpaper retention pass on the rebuilt session clients.
Permission cancellation also exposed a runtime lifecycle defect: the dialog disappeared visually while an empty native surface remained in the long-lived agent. Teardown now drops GPU surfaces before their protocol roles and flushes queued destruction while the connection is alive. The native cancellation regression runs two real policy checks, requires each denied result and no authorization surfaces between requests, and verifies that the same agent survives. It supplies no credentials and performs no privileged operation. This is presentation cleanup, never an authorization to unlock.
Tests verify boundaries and selected behaviors; they do not prove every operating-system feature works. Native visual tests use the real renderer, while hardware, login and secure-lock testing require separate environments. The authentication deployment updates three session clients; other installed executables retain their linked runtime until rebuilt.
The renderer validation report records eight focused GPU tests and 172 unchanged visual comparisons on each of the software and hardware drivers, plus native desktop checks. Derivatives and implicit texture sampling depend on neighboring fragment invocations, as described by the WGSL execution model. Moving discard fixed the reproduced driver difference; the test does not identify a specific compiler instruction defect or establish correctness on every driver. Late discard can execute shader work for clipped fragments, so this change makes no performance-improvement claim.
Where failures cross the boundaries
The notification delivery report records three reproduced protocol failures, four passing private-daemon regressions and native replacement/action/dismiss/expiration checks. Name contention and bus restart are confined to test-owned daemons. The VM check uses transient fixtures and real pointer clicks; it does not restart the desktop bus. Grouped durable history, explicit storage recovery and current-version action targets are implemented in the notification history guide. Native inline styles/links and prepared image content are implemented in the rich-text and image guides; their current application/compositor and performance acceptance remain separate.
The subsequent scene-validation report records nine focused renderer checks and all 172 unchanged visual comparisons on both drivers. Its rejection test retains previous pixels and pinned resources after both early validation and later glyph-preparation errors, then renders a valid next frame. Native launcher, restart and existing secure lock/unlock checks pass. The runtime still treats a render error as fatal; offscreen recovery does not establish native device-loss recovery or a process-memory bound.
Desktop's message handling currently ignores a failed system sample. The Weather child retains same-location last-good data, error/freshness, explicit units and configuration. Its strict/visual checks and scoped native opening/focus plus one production forecast pass; native form mutation and failure/retry remain open. Media owns loading/empty/unavailable observations, player selection, targeted commands and artwork errors in a native child. Ignoring a system sampling failure still loses the distinction between retained data and an unavailable service. Audio and media have separate native observation states; the remaining sample-based services need equivalent outcome and freshness policies rather than a generic error banner only at the root.
The next service slice should preserve a typed outcome from the adapter, retain the last successful sample when useful, expose freshness/failure in client state and verify recovery after disconnect. Domain contracts describe service meaning; adapters own protocol/reconnect details; components decide how to present that state. A port-shaped trait by itself does not establish those semantics.
Resources need eligible evidence.
Pacing still needs work.
The completed FHD video measurements on archived 9eb41939 use one virtual 1920×1080/60 Hz/1× output and the same 4K H.264 60 FPS source. With tracing OFF, 480 samples over 120.000454 seconds record 497.063 MiB mean/peak RSS, 616.008 MiB process-lifetime HWM, 142.633% of one logical core and zero process swap. A separate 120.000898-second instrumented process observes 7,179 distinct prepared-revision advances over 119.983329 compositor seconds: 59.833/s, with 16.667 ms p50/p95/p99 and 50 ms maximum feedback gaps. Both phases are host-pressure-ineligible. Their different process births prevent a memory-gain comparison; bound-resource feedback establishes neither visible pixels nor physical scanout or accepted 60 FPS. Preservation, driver restoration and a separate terminal-guardian/normal-OFF check pass. PR108/main fb7b1b26 adds CPU frame reuse, but this tested VM predates it. Memory investigation, eligible targets and broader hardware/application tests remain open.
The verified delivery checkpoint is PR108/main fb7b1b26, Pages run 40044620948: three HTML pages, native manifest/PNG and 116 inputs/480 captures from b3c91fab match the artifact; the same bundle passes 20 LAN HTTP checks. CI builds and publishes later main revisions through their own receipts. The earlier 9eb trial, 4K setup/restoration follow-up and failed V1 coverage attempt retain their recorded outcomes. The completed V2 phases do not establish the actual V1 failure cause or a PR108 gain.
The historical 26d03adf 4K A/B preflights verify virtual output geometry and restoration. Resource admission was refused: A lacked a lease below the unchanged 520-second measurement/cleanup budget, and B refused host-memory admission before sampler facts/binding. A later one-off proc observation at restored 1920×1080/60 Hz/1× records 604.594 MiB RSS, 539.586 MiB anonymous RSS, 16.242 MiB process swap and 680.293 MiB process-lifetime high-water RSS. Independent normal-OFF facts pass. No eligible 120-second interval, 4K causality, allocation-owner/GPU attribution, leak or pacing result follows. The observation motivates bounded memory investigation; historical measurements and target-acceptance flags remain unchanged.
The historical 35ed87ed upload trial observes 250.580664/252.394531 MiB normal mean/peak RSS and 154.032796% of one logical core on native RADV. Separately, post-conversion prepared-callback wall bounds are 59.733251–60.129012/s, while compositor feedback references 32.224499 distinct prepared-revision advances/s; presentation gaps p50/p95/p99/max are 33.333/33.334/50/83.333 ms. Host swap and I/O stalls make both phases ineligible, leaving the 300 MiB and 60 FPS targets unaccepted. Profiling restores off with independent verification. The renderer passes source/headless correctness checks; neither those tests nor this unmatched native observation establishes a pooled-upload gain, bottleneck attribution, pixel visibility or scanout. Earlier reports below keep their original source/workload boundaries.
The separate 85a5be63 geometry diagnostic describes a moving rounded rectangle through Component::view/ViewContext.now and requests continuing native redraw through Application::animating. The shared FrameDemand tracks dirty work and pending callbacks. Without media or stream uploads, the run records 4467 intervals over 120.566662 compositor seconds, or 37.050043/s, with 33.333/33.334/50/66.667 ms gap p50/p95/p99/max. Four execution and five restoration checks pass; one static image confirms partial visibility only. No pressure/resource collector ran, so the below-60 shared-path observation attributes no renderer, compositor or VM cap and accepts no target. Subsequent retired-fixture cleanup is separately verified maintenance, not a performance comparison.
The later CPU-profiled shape run reuses that binary and records 48.370556 feedback intervals/s. Its 5,851 successful draw rows average 0.658506 ms, p99 1.145934 ms and maximum 2.480036 ms; all 5,849 feedback rows join, with two terminal CPU rows outside the feedback window. Acquire/present CPU calls are short and uploads are zero. These successful-only wall times include driver waits but omit GPU execution, application update, callback/dispatch and unsuccessful retries. Four execution and five restoration checks pass; separate static review confirms partial visibility only. No pressure collector ran, so the gaps remain unattributed and no causal improvement or target acceptance follows.
The later callback trace diagnostic at 91b964ae records 5,286 contiguous events: 2,643 matched callbacks and 2,643 presented attempts. Mean request-to-handler is 44.175852 ms, handler-to-next-attempt 0.006112 ms and attempt duration 1.603372 ms; 2,641 feedbacks separately record 21.972535 intervals/s. Four execution and five restoration checks pass with normal 35ed preserved. The earlier wait combines transport, scheduling and dispatch with compositor waiting; these records do not attribute a cause or accept a target. The bounded runtime trace preserves separate clocks and typed outcomes without domain policy or extra repainting. This follow-up integrates that instrumentation on accepted main without the unaccepted renderer/video ancestors; its final source, CI and publication gates remain separate.
The separate 120-second normal-video sample of the Display binary a7f41ecc records 384.82 MiB mean / 403.88 MiB peak RSS and 101.466% of one logical core on llvmpipe, still above the 300 MiB target. Its 4K H.264 60 FPS source is fitted to one 1080p scale-1 output with source-rate playback. This uninstrumented resource sample preserves source, settings, media, output and playback state; it establishes no actual 60 FPS presentation. It is a different source/workload cohort from Weather, with no isolated speedup or physical-GPU claim.
The Weather-source 120-second software-Vulkan video sample records 424.12 MiB mean and 424.15 MiB peak RSS, above the 300 MiB target, with about 1.49 logical cores of main-process CPU. It has no matched before/after or actual 60 FPS presentation result. The accepted-main snapshot has newer preview and invalidation changes without a new matched resource sample. The earlier live display-fit comparison verifies one-output resize/integer/fractional retargeting, with software resource targets still unmet. Historical reports below keep their original binaries and workloads. The PR73 baseline sample measures 548.29 MiB mean and 609.41 MiB peak RSS during live playback, above the 300 MiB target. Main-process CPU is 250.132% of one logical core on software Vulkan. The single 1920×1080 scale-1 output retains 33,177,600 bytes of live RGBA pixels; physical-cover conversion and decoder/driver attribution need work. Source timing, density and effects were unchanged, and exact settings/wallpaper and the running binary were verified.
The earlier Bluetooth release's 120-second normal-mode static sample measured 206.82 MiB mean and 208.18 MiB maximum process RSS. Main-process CPU was 0.7% of one logical core; the service including helpers was 1.024%. Its final Linux residency snapshot had no swapped pages. Idle background and closed-dock surfaces submitted no frames. That different historical workload does not establish current live-video efficiency.
In that historical static sample, cold and warm launcher submission gaps reached 41.07 ms and 38.38 ms. The historical PR73 live-video sample has warm medians of 32.98–48.67 ms and a maximum of 98.97 ms. This single-output software-Vulkan VM runs on a shared host; submitted frames are not monitor scanout. The binary hash and compiled source are verified, and documentation/harness commits are distinguished from Rust changes. Long idle, decoder/GPU peaks, total GPU memory, physical pacing and helper CPU still need work. The historical comparisons below explain previous improvements; these different workloads are not an isolated comparison or a hardware result.
The wallpaper milestone's two-minute runs measured 406.92 MiB mean RSS before output-aware wallpaper retention and 293.25 MiB afterward: an observed reduction of 113.67 MiB. Detected display, workload, adapter, vCPU, memory and kernel metadata match; these are sequential runs on a shared host, not an isolated allocation-attribution experiment.
| 120-second sample | Before | After | Interpretation |
|---|---|---|---|
| Mean process RSS | 406.92 MiB | 293.25 MiB | Lower measured residency; source and executable hashes are in each report. |
| Main-process CPU, one core | 0.550% | 0.583% | No CPU improvement claimed. Including service helpers: 1.132% and 1.178%. |
| Idle background / closed-dock frames | 0 / 0 | 0 / 0 | Both remain event-driven; visible widgets still update their data. |
| Retained background mip pixels | 48.0 MiB | 12.0 MiB | 4096×2304 becomes 2048×1152 for this 1920×1080 display. Icons remain 11.8 MiB; no local/online previews are retained. These counters are not RSS. |
| Cached GPU texture payload | 56.1 MiB | 20.0 MiB | Prepared CPU pixels, framebuffers and driver allocations are excluded; this is not total GPU memory. |
The wallpaper preparation report records native physical-size and integer-scale changes, rapid resize bursts, preserved source/preferences and the unchanged desktop process. BackgroundTarget validates checked physical dimensions in the presentation layer. The child retains one accepted refit and the latest size; the injected asset adapter prepares pixels. Framework image storage preserves natural aspect independently of retained mip dimensions. Last-good pixels remain visible after a normal decoding failure, with explicit retry. Decoder scratch, transient old/new images, fullscreen widget/open-overlay buffers and lock/login preparation still need separate work.
The earlier compact-dock milestone measured 284.22 MiB for the prior binary and 254.10 MiB for the new binary, an observed 30.12 MiB reduction. This fresh comparison uses the same wallpaper, prepared-asset payloads and detected display/workload metadata. The new release was sampled first, then the baseline; both ran for 120 seconds without profiling on a shared host. The earlier 293.25 MiB sample had a slightly different wallpaper payload and is not the baseline for this change. This sample is within the current 300 MiB RSS target. No CPU, startup or animation improvement is claimed.
The settled native dock is 1920 × 120 logical pixels at 1080p/1×, keeping its original display-grid position and whole shadow. One BGRA8 buffer payload is 0.88 MiB instead of 7.91 MiB; buffer counts, padding and total driver memory are unknown. The launcher child waits for a full submission before opening and a settled closing submission before shrinking. Sixteen paired compact/full comparisons pass on each Vulkan driver, and all 212 existing snapshots retain their baselines. Native pointer/keyboard, mode cycling, outside close, interrupted reopen, terminal launch, integer scaling and zero closed-dock idle frames pass, along with the existing desktop workflow.
The bounded-widget milestone moves settled cards into smaller native buffers. Overlapping paint bounds share a buffer so their original drawing order survives; disjoint groups do not rely on ordering within a Wayland layer. During capture, source geometry stays fixed and retains input without painting, while a full-display pointer-pass-through preview shows the cards and grid. Twenty-four paired scenarios pass on both available Vulkan drivers, including overlapping cards, narrow displays, both palettes and integer scales 1 and 2. Native placement, capture, snapped release, restart persistence and integer-scale cancellation pass, along with the existing desktop workflow.
The fresh, matching 120-second comparison measured 252.18 MiB for the previous release and 224.93 MiB for the new release, an observed 27.25 MiB reduction. The new release ran first, then the baseline under the same supervisor, wallpaper and workload; detected metadata and prepared assets match. The three settled widget buffers total 1.94 MiB of one-buffer BGRA8 payload, versus 7.91 MiB for the previous full-output buffer. Buffer counts, padding and driver allocations are unknown. This is a shared-host software-Vulkan comparison, with no CPU, startup or animation improvement claim; this sample is within the current 300 MiB RSS target.
Native tests exposed the old supervisor waiting for a permanent widgets buffer and stopping the new desktop after 30 seconds. Supervision and activation now share a pure readiness contract requiring first submissions from the declared widget groups; all-hidden widgets and the previous fullscreen client are supported. Both measured binaries stayed alive for their full samples. Test cleanup also checkpoints owned wallpaper snapshots and restores through IPC, verifying the active link instead of overwriting it with a stale legacy target.
Open overlays and the active drag preview retain full-output buffers. Decoding peaks, allocator/driver retention, per-output/fractional geometry and hardware frame pacing remain separate work. One observed dock opening submission gap reached 33.69 ms in the software-Vulkan sample; this does not establish smooth scanout or a flicker-free hardware transition.
Earlier 588.26 MiB and 389.93 MiB runs established the observed lazy-preview improvement on an earlier binary. The native cache test browsed a generated 73-image library, reached beyond the old preload limit, recovered a corrupt preview through retry, and verified the smaller closed-browser budget. Both live providers supplied thumbnails without changing the wallpaper or palette. These measurements do not establish hardware frame pacing or total GPU memory.
The monochrome coverage and allocation milestone stores themed icon and text coverage in one channel and requests wgpu's supported memory allocation preference. Dimensions, text supersampling, mip filtering and existing visual references stay the same. Prepared icon payload falls from 11.83 to 2.96 MiB; colored icons and wallpapers retain the RGBA path.
| Same VM boot, 120-second sample | Before | After | Interpretation |
|---|---|---|---|
| Mean process RSS | 226.78 MiB | 207.70 MiB | Observed reduction: 19.08 MiB, about 8.4%. This historical sample is within the current 300 MiB RSS target; the rebuilt Bluetooth sample is reported above. |
| Maximum sampled RSS | 229.29 MiB | 211.08 MiB | Warm single-output software-Vulkan workload; active overlays and decoder peaks need separate work. |
| Main-process CPU, one core | 0.767% | 0.767% | No CPU or hardware frame-pacing improvement is claimed. |
| Idle background / closed-dock frames | 0 / 0 | 0 / 0 | Event-driven rendering retained; visible widgets still update their data. |
The baseline and new release ran sequentially in the same capped VM boot with matching display, workload and background metadata. The current release was restored and its running hash verified after the baseline. Earlier observations remain in the report: masks alone did not show lower average RSS across separate boots, then a same-boot run measured a smaller reduction. These payload counters exclude driver allocations; measured RSS includes mapped driver/software-GPU pages. Actual GPU memory, hardware pacing, long idle and fault behavior remain unverified.
| Finding | Implication | Next test / owner |
|---|---|---|
| Prepared images, active GPU textures, caches and surface buffers have different lifetimes. | The unused texture-cache budget does not cap process RSS. Active scene resources remain pinned, and driver allocations are outside the reported payload counters. | Measure app asset ownership alongside renderer payloads and Linux mappings. Asset policy belongs in presentation adapters; GPU retention belongs in the renderer. |
| NativeAssets previously retained a 4096-pixel background at every display size. | Resize events supply logical size and integer scale; worker preparation retains sufficient cover mips for both physical edges. Source decoding still uses the original limits, and discarded GPU textures can remain in the reuse cache. | Native size/scale changes and bounded stale-result/retry tests pass. Four focused image/clipping checks pass on each of software/hardware Vulkan, and 212 desktop comparisons retain their existing baselines/tolerances. Framebuffer and peak-decoder costs remain open. |
| Selected wallpaper previews previously accumulated in Desktop.images without eviction. | A presentation coordinator now bounds local preview demand/entries, evicts unwanted images and reduces reuse after closing. Application-owned prepared storage has deduplicated byte accounting; in-flight work and other owners are excluded. | Rapid-navigation, retry, stale-result/transaction precedence, bounded retention and accounting tests passed, along with native browsing/retry checks. The paired RSS reports show the observed process change; disk snapshot retention and GPU cache lifetimes remain separate. |
| A profiled cold launcher opening had a 101.35 ms submission gap; its largest recorded dock frame cost was 10.63 ms. | Successful dock-frame work alone does not explain the gap. A later same-binary normal run had a 24.25 ms cold maximum; that does not prove the earlier hitch fixed. | Correlate input, update, reconciliation, other surfaces and submission timestamps. Keep profiling in runtime/renderer, with bounded storage and no idle redraws. |
| Text rasterization still runs synchronously on a cache miss. | Warm text can be cheap while a new query, font or scale incurs preparation work. Cache-hit behavior cannot establish first-use responsiveness. | Measure realistic large application lists and font/scale transitions before choosing asynchronous text preparation or prewarming. |
| Hardware and software Vulkan pass the existing visual suite after explicit fine-derivative coverage. | This establishes selected pixel correctness within tolerance, not native hardware frame pacing, power use or GPU execution time. | Run the actual desktop on hardware and test fractional scaling, hotplug and sleep/resume separately. |
The profiled report stores bounded CPU wall times. Text rasterization and texture upload are nested inside preparation; adding those numbers would double-count work. Submission/presentation may include driver waits. They are not Vulkan GPU timestamps or monitor scanout measurements.
A working shell.
An incomplete desktop platform.
| Area | Current limit | Required boundary |
|---|---|---|
| Control center and tray | Audio routing, personal Wi-Fi, Bluetooth, power/profile/brightness and StatusNotifier/DBusMenu have native SDK panels and independent service consumers. Enterprise credential flows, broader Bluetooth/profile acceptance, native power hardware and broader tray application interoperability remain open; owned SNI/DBusMenu fixtures already pass native VM input and lifecycle checks. The later genuine wired NetworkManager Applet run passes five native bar/menu/information-action and four cleanup checks on unchanged 8e, one virtual output; thirteen fresh outside-worker checks verify package removal and user-state preservation. | Typed domain snapshots and commands, explicit ports and platform lifecycle ownership are implemented. The power and tray guides distinguish owned protocol checks from remaining device/application acceptance. |
| Text input and shaping | Shared caret/selection and grapheme/word editing serve ordinary desktop fields, including media import. Clipboard uses bounded native pipes and current-field tickets. Multiline Notes editing, compositor clipboard exchange with wl-copy/wl-paste and restart persistence pass 17 functional and nine restoration checks on one output. Merged Text 8e6d074b implements script/bidi shaping, bounded fallback and ordinary IME composition, retaining hard-paragraph levels across wraps with exact row-bound context and cache guards. All six CI checks pass, including the full workspace, controlled protocols and 832 visual cases. The fresh owned native IME suite passes five feature and five restoration checks. Third-party/physical/cross-output IME, broader native pixel/scroll details and delayed/broader GUI clipboard acceptance remain open. Separately, the later real Chromium/Notes keyboard transfer suite passes nine interaction and twelve restoration checks in both directions on unchanged 8e, one virtual output. This does not establish rich content, other apps, delayed transfers, physical hardware or IME behavior. Formal accessibility semantics and platform bridging are deferred by the user. | Current client state owns value/selection and bounded undo/redo history. Typed edits and shared hit/paint geometry have behavior checks; current undo/redo and native acceptance belong to the text guide and ledger. |
| Displays and widgets | Named outputs have independent bars/backgrounds/widget hosts, persisted layouts and typed surface instances. Widget resizing and optional fractional density are implemented. A later 16-check native run on unchanged 8e passes placement, real panel input, density at 1×/2×/1.25×, removal/recreation and exact restoration across two simultaneous outputs, one owned headless. Cross-output clipboard, physical displays/cable hotplug, suspend and secure outputs remain unverified; richer widget reflow remains open. Native output arrangement has a draft/Apply/Keep/Revert client, ordered fresh reads and an independent rollback guardian. Seven one-output QEMU input checks pass for mode, scale, position, persistence, explicit Revert, timeout and UI-crash EOF recovery. A later harness 86df4e5b on unchanged 35ed passes four two-output draft/Apply/Revert/timeout/Keep flows. Its 1280×960 headless peer changes position or scale 1/1.25 while the original 1920×1080 scale-1 output stays unchanged. Five positive owner checks and independent retirement/normal-OFF facts verify original monitor bytes/inode, preferences, supervision, output/workspace/cursor restoration. Monitor ctime/link count are not claimed unchanged. That historical four-flow run kept all input on the original 1× panel. A later harness 1774fa87 on runtime 26d03adf passes nine virtual Display workflows, adding rotation/Revert, disable/Keep, re-enable through actual controls/Keep, fractional scale/Keep and native pointer/keyboard Apply/Revert on the fractional peer panel. Its panel is 1024×768 logical units, density 1.25, with a 1280×960 buffer. Five positive preservation checks, one ctime/link-count scope marker and three cursor checks pass. Independent later normal-OFF facts verify the same desktop lifetime, original output and unchanged 14 source/43 security entries. Physical displays/cable hotplug, suspend/resume, compositor restart, secure-output changes, resource targets and pacing remain open. | The display guide and acceptance report separate strict/pixel checks, actual native input and the explicit post-run correction for the expected supervisor restart. The historical four-flow Display report keeps its original checks and limitations. The later nine-flow Display report separates nine feature checks, five positive preservation checks, one timestamp/link-count scope marker, three cursor checks and independent normal-OFF verification. Its 26 native submissions establish prepared geometry, not presentation FPS. The initial wrong-dispatch attempt failed before checks; its immutable failure and separate guarded recovery are retained. At that capture checkpoint, site, exact-head CI and publication were pending; later verified delivery has its own checkpoint above. The monitor guide describes client profile policy; the density guide describes SDK/native rendering. Later single-output live-video resize and integer/fractional retargeting pass. The separate 16-check two-output run establishes its own density/input/lifetime scope; physical/secure-output, cross-output clipboard, suspend and presentation acceptance remain separate. |
| Launcher and dock | Live catalog observation, identity-preserving selection, persisted pin/reorder, animated autohide and ordinary desktop-service activation are implemented. Declared actions retain their recorded native scope. Merged Application bb304907 shipped in the accepted-baseline 8e release and implements fresh input-bound activation and explicit file/URI Open. A later real Chromium run with independent consumer d1, now merged through PR89, passes nine feature and eight restoration checks, including observed focus and local Open/action/socket/CLI; other applications, remote URI handlers and direct token consumption remain unverified. | Application discovery/watch and native activation stay behind the port; launcher/dock behavior belongs to the client. Historical compact-dock pointer/keyboard and launch checks are recorded above; those do not establish native acceptance for the newer catalog/pin/actions/autohide paths. |
| Live wallpapers | Local MP4/WebM/GIF import, posters, shared per-output playback, pause, sleep suspension and reusable Vulkan texture updates are implemented. Recorded VM sources pass native import/input/FPS, changing captured pixels, pause/resume, invalid-import preservation, undo/redo, pause-all preservation and restart/restoration. Single-output fullscreen pause, hidden-workspace playback, manual-pause precedence and saved policy controls also pass. Battery/fullscreen policies and shared-output freezing have owned-fixture coverage. Historical image-lifetime 120-second software-Vulkan samples peaked at 247.02 MiB static and 333.39 MiB for the 1280×800 video at 15 FPS. The later Weather-source video sample records 424.12 MiB mean and 424.15 MiB peak RSS; it is a different workload, not an isolated regression comparison. Weak image-storage lifetime observation releases unused textures; the earlier same-workload video peak was 348.88 MiB. Video remains over 300 MiB, and CPU was higher in this one-run comparison. Physical battery transitions, native multi-output behavior, hardware decode and physical-GPU pacing remain open. Actual native secure lock, desktop restart while locked and authenticated unlock/manual-pause preservation pass; Scene/Web projects require additional engines. | The media guide separates domain preferences, playback port, FFmpeg adapter, client mailbox/output policy and generic ImageStream. The playback report and policy report identify their tested sources and exact restoration checks. The lock report records independent secure-lock acceptance, and the image lifetime report records its historical memory samples and native fade-pixel acceptance. The live-preview report adds native select-only browsing, animated crops, retry/refresh and exact restoration on one 1× output; no preview-specific RSS, scanout or smoothness result is claimed. Multi-output, suspend/reconnect and secure-session display acceptance remain open. |
| Notifications and service health | Grouped durable history and DND, inline styles/links, prepared images and current-version actions are implemented. A bounded native storage worker separates archive I/O from live delivery. Canonical UriPort::open(target, context) forwards launch context through the XdgUri adapter. The later R9 run, harness 563781a2 on runtime 26d03adf, passes five scoped warm-default-route checks and nine cleanup checks: native pointer and Tab/Enter input each load one selected document with fresh context through a controlled MIME default in an already warm real browser. Independent later normal-OFF facts verify the same desktop lifetime and unchanged 14 source/43 security entries. That older active-window observation alone establishes no browser key receipt. The later recorded 9eb trial, harness 04432a73, passes five route checks, nine cleanup checks and both actual trusted a / KeyA document receipts after natural history close. Last pre-key and final post-event guards verify normal-toast policy and advanced native submissions without forced focus/hide or key retries. PR105 accepts client fix 194c0c57; PR106/main bdffd424 now includes the pool with Rust/design/configs/scripts trees identical to archived 9eb41939. The report adds a later accepted-main follow-up without changing its original pre-merge flags, build identity or native outcomes. Fresh-browser initial focus, arbitrary handlers, direct token consumption, physical hardware and pacing remain unverified. V7’s pre-link expiry and R8’s after-pointer quoted-argument failure remain failed history; R9 fixes only strictly bounded fixture arguments, preserving the canonical general encoder. Consistent sample-service loading/error/freshness presentation remains open; notes already show acknowledged save state. | Pure lifecycle/storage policy, protocol adapters and typed client states. The notification guide and image guide distinguish implemented storage/content from remaining acceptance. |
These are tracked requirements, not features implied by the screenshots. The implementation ledger records acceptance criteria and evidence. Interactive sign-in with the rebuilt root greeter is now verified. Production authentication audits, native denied-lock recovery, authority/service faults, physical sessions and driver-fault injection remain open.
Use implemented use cases
to justify each abstraction.
- Use the established notification and native-control boundaries to make sample-service status cohesive. Preserve unavailable/error outcomes through ports and adapters instead of converting them to empty data.
- Investigate active dock/widget buffer lifetimes and peak image preparation alongside prepared-pixel and texture counters. Keep client asset policy separate from generic renderer resources.
- Keep renderer admission limits separate from memory budgets and native recovery policy. Extend layout and text contracts through concrete input use cases, without treating offscreen rejection tests as device-loss evidence.
- Validate the implemented output identities, per-monitor profiles and fractional-density path through simultaneous native input, hotplug and suspend in a real compositor session.
- Continue applying explicit inputs and typed intents where bar coordination warrants a separate owner. Strengthen domain values where invalid inputs reach persistence or external commands, preserving migration behavior.
- Complete each retained capability through its port, adapter, usable client and reversible acceptance check. Keep native shell ownership and secure rollback intact.
For changes, use the repository's framework skill or desktop/integration skill. The library guide and user configuration guide keep implementation concepts separate from everyday settings.