Deferred scope from #1954 (the issue offered "a button in the connect-failure dialog or a --test viewer flag"; the button shipped). A headless flag would run the same layered ladder (StoreConnectionSelfTest.RunAsync in Darling.Storage) against the resolved config and print/log the report without starting WPF — useful for scripted diagnostics over RDP/SSM sessions where clicking the overlay button isn't possible, and it would let the monitoring-box dogfood loop exercise the ladder remotely.
Why deferred: a WPF app has no console by default — honest stdout needs AttachConsole(-1)/alloc fallback p/invoke and exit-code plumbing, which deserves its own focused change rather than riding the button PR blind (the flag path can't be tested on the development Mac; the button path's core is fully covered by unit + live tests).
Shape sketch:
Deferred scope from #1954 (the issue offered "a button in the connect-failure dialog or a
--testviewer flag"; the button shipped). A headless flag would run the same layered ladder (StoreConnectionSelfTest.RunAsyncin Darling.Storage) against the resolved config and print/log the report without starting WPF — useful for scripted diagnostics over RDP/SSM sessions where clicking the overlay button isn't possible, and it would let the monitoring-box dogfood loop exercise the ladder remotely.Why deferred: a WPF app has no console by default — honest stdout needs
AttachConsole(-1)/alloc fallback p/invoke and exit-code plumbing, which deserves its own focused change rather than riding the button PR blind (the flag path can't be tested on the development Mac; the button path's core is fully covered by unit + live tests).Shape sketch:
PerformanceMonitor.Darling.Viewer.exe --test [--config <path>]→ resolve config exactly like startup (all four rules), run the ladder, printFormatReport, exit 0 when no layer failed / 1 otherwise.