Anode quick checks, run for the comparison page on 2026-10-16 (Europe/London, about 23:10) Source: skulitom/Anode main at 47feb59 (the 0.11.3 candidate), Release build Command: powershell -ExecutionPolicy Bypass -File scripts\build.ps1 -QuickTest -OutputDirectory artifacts\pkg-build Machine: Windows 11 Pro build 26200, x64 Result: exit 0; the build, 110 quick checks and the documentation check took 45.0 s in all selftest --quick uses private test pipes and a disposable MCP subprocess; it creates no seat and injects no input. Self-test Anode self-test [ok ] key names and chords 35 names resolve; unknown names, out-of-range codes and empty chord parts are refused before the seat (32 ms) [ok ] text typing pace 15 ms apart by default, pauses for a busy program, stops with an exact count for a hung one, a deadline, a cancel or input Windows refuses partway, keeps Enter, Tab and emoji whole (14 ms) [ok ] text typing limits one call fits 45 s: 3001 characters at 15 ms, fewer when slower or with Enter presses; refused before typing (3 ms) [ok ] text typing waits 5 ms waits take 5.4 ms (median, high-resolution timer); a busy thread holds the next character, a free one releases it (1678 ms) [ok ] gamepad mapping 15 buttons, 4 axes, 2 triggers (44 ms) [ok ] controller isolation entries jail the next pad names and their recorded devices to the seat, leave the user's HidHide entries and settings alone, clear ended seats, and step aside for ViGEm programs outside the seat (25 ms) [ok ] isolated controller attach attach jails the controller before it exists, checks from the desktop, unplugs one the desktop can open, and reports a machine-wide one (3 ms) [ok ] gamepad set all or nothing a set refused for an unknown button, axis or trigger, or a trigger named as a button, leaves nothing for the next report; a valid one sends all of it at once; tap takes l2; no controller plugged in (14 ms) [ok ] CLI help routing 27 command lines; help never runs the command, and free text stays data (0 ms) [ok ] CLI argument checks 70 accepted and 82 rejected before any side effect (19 ms) [ok ] CLI help and messages one table covers 46 command names; wording, suggestions and JSON shapes hold (12 ms) [ok ] CLI mcp --help help on stderr, nothing on stdout, exit 0 (104 ms) [ok ] channel names main keeps its names; other channels get their own pipes, mutex, logs and title (3 ms) [ok ] one seat per session one channel at a time holds the seat; refusals, MCP's included, name the channel that has it (141 ms) [ok ] capture unavailable message disconnected capture points to seat_status; unknown causes keep the hidden/minimized diagnosis; no screen captured (0 ms) [ok ] pipe round trip request and response over a named pipe (20 ms) [ok ] pipe queue deadline queued requests time out without interrupting or replaying other commands (105 ms) [ok ] pipe forwarded time left the daemon forwards each request with its caller's time left, so time queued behind another isn't counted twice (1574 ms) [ok ] pipe late reply timed-out connections close; a fresh connection gets its own reply (108 ms) [ok ] pipe reply identity replies must match the request id (3 ms) [ok ] pipe close during request closing an active connection unblocks its request without throwing (2 ms) [ok ] pipe server shutdown server disposal closes active clients even while a handler is blocked (2 ms) [ok ] pipe access control pipe ACL grants access only to the creating Windows identity (3 ms) [ok ] pipe connect cancellation startup connection attempts can be interrupted by stop (128 ms) [ok ] launch arguments Windows launch preserves empty arguments, whitespace, quotes and trailing slashes (1 ms) [ok ] Steam launch guard direct Steam clients and URLs are refused before process launch when Steam runs outside the seat; no Steam process started (7 ms) [ok ] Steam launch configuration text and binary KeyValues (appinfo formats 27-29) parse; launch entries follow system, branch, type and architecture (9 ms) [ok ] Steam launch placement games start in the seat against Steam where it runs, which starts on the desktop if needed; a client in the seat and force keep the old path (11 ms) [ok ] Steam namespace links names in this session's namespace resolve through links and stop with them; listening follows the client's objects (6 ms) [ok ] desktop references window reuse, expired/consumed references, observation limits and action arguments checked without desktop access (5 ms) [ok ] desktop dispatch validation precedes workers, private references stay private, timed-out actions consume their observation (6 ms) [ok ] desktop raise coverage nearest overlapping window, visibility, cloaking, owners, overlays, stacking bands, always-on-top covers and frame edges checked without windows (2 ms) [ok ] desktop raise reply covering and always-on-top targets become reusable public window IDs, details and summary notes survive, uncovered replies stay unchanged (2 ms) [ok ] desktop worker deadline hung subprocess terminated within deadline; uncertain action reported without replay (321 ms) [ok ] desktop report escaping HTML report escapes untrusted app text; text summary keeps automation IDs, bounds and capture geometry (2 ms) [ok ] desktop unknown control types a control type .NET's client can't name (AppBar, as in File Explorer) is observed as Unknown, and actions on it reach their checks (184 ms) [ok ] desktop ignored set_value set_value reads the control back: an ignored value (as Chrome's open) or under a second parent, is observed once, without using the budget; waits and actions still work (190 ms) [ok ] execution output separate streams, incremental cursors, Unicode-safe pages/retention, output limits and lost-data reporting (2 ms) [ok ] execution jobs UTF-8 streams/exit codes, recovery, hard timeouts, cancelled requests, owner-only discovery/read/cancel and cleanup of owned descendants (3120 ms) [ok ] execution job tail a job that finishes during a read is reported finished only with its output to the end (381 ms) [ok ] cancelled execution already cancelled execution requests have no process or job-history side effects (0 ms) [ok ] malformed pipe messages duplicate fields and invalid Unicode are refused without dispatch; the same pipe remains usable (3 ms) [ok ] agent ownership exclusive ownership, recoverable acquire, bounded renewal, idle expiry, stale-token refusal and scoped release (7 ms) [ok ] agent client lifetime dead clients hand off without clock advance; live/untracked owners, TTL, replacement and admitted work retain their rules (4 ms) [ok ] agent client probe real current, reused, absent and killed client pids; access denied and other unreadable processes remain alive (42 ms) [ok ] agent client validation optional paired positive int32/int64 process fields, malformed values, action restrictions and envelope stripping (0 ms) [ok ] MCP lease client process private-pipe explicit acquire/renew and implicit acquire name this process only for generated identities; release stays unchanged (10 ms) [ok ] agent queue and disconnect private clients contend, expired queued input is fenced, disconnect recovers by expiry, and Stop bypasses ownership (6 ms) [ok ] agent queue time an action queued behind another of its agent's runs in the time its caller has left, and stops before it (1762 ms) [ok ] agent deadline replies an action cut short by its deadline answers timed_out with its time and how far it got: nothing done, nothing changed, a job to find, or input that may have run (2569 ms) [ok ] agent line first-come line, places kept only while asking, owner names, waiting counts and leases extended by work (2 ms) [ok ] agent names agents are named after their client and project folder; status says when the desktop is yours; hand-overs are logged (3 ms) [ok ] MCP ownership MCP identities, cached tokens, errors, stable restart recovery, stale-connection refusal, no relaunch after quit and stopped-seat reporting (134 ms) [ok ] MCP lease helper desktop tools take a free desktop, busy desktops name their owner, waiting agents get it on release, input waits for a look after Anode takes the lease, ended sessions hand it on (1016 ms) [ok ] agent startup and Stop daemon validates before startup, pending acquisition cannot undo Stop, and neither lease status nor helper acquisition starts a seat (7 ms) [ok ] UI condition waits fresh matching observations, honest timeouts, incomplete-tree refusal and cancellation (285 ms) [ok ] development validation execution arguments, environment, cursors and UI predicates validated before dispatch (0 ms) [ok ] display modes sizes, 12 scaling steps, DPI, physical size, written sizes and JSON (2 ms) [ok ] display validation 6 accepted and 12 refused before any lease or daemon; the CLI maps to the same arguments (1 ms) [ok ] display changes live changes are awaited; ignored or refused ones reconnect once; partial and failed changes report the actual display and tell the daemon; only given fields change; reset and no-ops ask nothing extra (583 ms) [ok ] display restored after a lease a lease's end restores a changed display once, holds the next desktop action until done, and retries a failed restore (282 ms) [ok ] display requests to the daemon reports the startup display from the options and status; refuses invalid requests, and every change or record while the seat is not ready (9 ms) [ok ] display measurement this desktop reads as 1920x1080 at 100% in physical pixels; the thread's DPI awareness is restored (0 ms) [ok ] Android SDK and AVDs SDK, AVD home and AVDs found as the SDK finds them; broken installs and stale emulator files skipped; software rendering named per emulator version (27 ms) [ok ] Android emulators free ports, read-only starts, boot waits, seat-only stop/screenshot/adb, refused server commands and other devices' forwards, and failed starts, all with stand-ins (127 ms) [ok ] Android start deadlines a stalled adb, the final delay and a zero-second wait stay inside the reply deadline, with stand-ins (19 ms) [ok ] Android validation 12 accepted and 21 refused before any lease or daemon; the CLI maps to the same arguments (11 ms) [ok ] seat launch guards Chrome and Edge on their usual profile, links they would open and Android Studio are refused before launch; everything else starts (2 ms) [ok ] Android Studio profile Android Studio starts on its own config, system, plugin and log folders with the setup wizard skipped and the SDK found (23 ms) [ok ] seat browser profile Chrome and Edge open on Anode's persistent seat profiles, with first-run pages off and a new profile reported (17 ms) [ok ] seat browser sign-in the sign-in window opens on a page that says what to do, then a tab per address; agents get the whole command, address included (30 ms) [ok ] seat browser profile in use seat_browser and browser --sign-in refuse while another desktop has the seat profile, naming its process; Restart Manager finds a real holder (330 ms) [ok ] Android on this machine SDK with emulator 36.2.12, 3 AVD(s), 1 Android Studio install(s); read only (39 ms) [ok ] audio clips PCM WAV roundtrip, silent gaps, clipped timestamps, full-scale samples and malformed chunks (13 ms) [ok ] audio isolation and validation only active remote render endpoints, lease gating, closed schemas and bounded inputs (2 ms) [ok ] audio MCP protocol private-pipe validation before dispatch, lease acquisition, native MCP audio, an embedded WAV for 2024-11-05 clients and pre-cancelled capture (3 ms) [ok ] audio playback lifetime single playback, owner-only stop, release/expiry cleanup, startup failure and cancellation using an injected renderer (5 ms) [ok ] hidden viewer startup hidden RDP initialization, a window fitted to the seat, input labels, connecting screen, full diagnostics, full-screen Stop/exit and narrow layout; no connection or shown form (441 ms) [ok ] viewer pointer guard 1 mstscax.dll import(s) gated; failed guards prevent connection; hidden managed/native calls cannot move the real pointer (48 ms) [ok ] RDP extended settings real COM child-session, audio, scaling and credential-prompt settings round-trip and the live display change resolves; no connection, audio or credential prompt opened (12 ms) [ok ] RDP event callbacks native callbacks verified; host waits for login, reconnects after login and ignores cancelled startup (5 ms) [ok ] viewer sign-in manual sign-in and Reconnect retries, login gating, Stop and later unattended startup verified without connecting a viewer (7 ms) [ok ] daemon detached viewer detached status, capture guidance, display refusals, password and automatic reconnects, Stop and ended-seat cleanup; no live seat (9 ms) [ok ] stop during display change a stranded display reconnect reports detached; one ending after a stop, or after a stop and a new start, leaves that state and display alone; a lost host stays detached; no live seat (8 ms) [ok ] refused reconnect keeps the seat a refused Reconnect or Sign in keeps a ready or detached seat's state, advice, host and display changes; a later viewer disconnect detaches it; prerequisites that can't be read refuse the same way and say why; Reconnect works once the prerequisite is back; no live seat (7 ms) [ok ] rdp extended reasons six Windows display/session failures explained; other extended reasons keep the control's description (0 ms) [ok ] RDP handshake diagnostics only the current process and attempt's terminal handshake failure is surfaced (0 ms) [ok ] RDP listener probe live and closed loopback ports are distinguished; missing listeners explain the next checks (1026 ms) [ok ] setup listener repair start, repair, healthy no-op, listener failure, and immediate service reactivation verified without changing services (1 ms) [ok ] startup disconnect refused connections fail promptly with the reason, including when a child session already exists (4 ms) [ok ] seat cleanup absent sessions are harmless; uncertain failures remain visible; Stop disconnects despite logoff failure (6 ms) [ok ] quit with a held window quit stops the seat, ends the process when a dialog holds the window, and refuses new starts meanwhile (439 ms) [ok ] startup status polling CLI/MCP startup polling immediately returns terminal states and pipe failures (4 ms) [ok ] startup daemon discovery absent daemon returns in 0 ms; starting, compatible and cancelled daemons handled without launching anything (2 ms) [ok ] startup host connection missing hosts launch once; retained hosts are reused; cancellation prevents a launch (505 ms) [ok ] startup state notification all startup waiters wake on state changes (0 ms for failure), and Stop cannot be undone by a later start (4 ms) [ok ] log diagnostics explicit paths, concurrent subprocess writers, and visible write failures verified (567 ms) [ok ] self-test log the checks log to a file of their own, not the user's log; nested diversions end where they began (6 ms) [ok ] log timestamps log lines carry a Gregorian, colon-separated time under the Thai, Saudi and Finnish cultures (15 ms) [ok ] rendering backup locations the state directory's backup first; without --state-dir, packaged apps' Anode folders too, never another channel's; refused inside a packaged app (10 ms) [ok ] MCP stdio initialize, 41 tools, embedded guide, prompts, notifications, ping, malformed JSON and errors over stdio (163 ms) [ok ] MCP validation protocol negotiation, duplicate fields, invalid Unicode, envelopes, notifications and arguments validated before actions (6 ms) [ok ] MCP agent discovery guide and prompts answer during busy tools; only start/acquire consider startup; 41 titled tools, annotation table, schema bounds, 1995-byte instructions and skill frontmatter; image results omit structuredContent; summaries are not duplicated (777 ms) [ok ] MCP stop and cancellation ping and Stop bypass busy tools; cancelled queued commands never execute (3 ms) [ok ] MCP disconnect closing stdin cancels outstanding requests and exits promptly (1 ms) [ok ] MCP busy daemon Stop reaches a busy daemon on a separate pipe; subsequent tools reconnect (4 ms) [ok ] MCP command ordering normal tools preserve arrival order while protocol messages stay responsive (2 ms) [ok ] seat identity guard only the child session identified by a different parent session is accepted (0 ms) [ok ] child-session API readable; feature enabled, current child session none (2 ms) All local checks passed. `anode doctor` covers the machine settings a seat still needs. Documentation check Checked 41 documents against 41 tools from artifacts\pkg-build\anode.exe Documentation links, anchors and tool names are consistent.