fix(adminui,client): error boundary inside the interactive scope, stale-commit OnSaved, AbCip browse delay emit, DisposeBridge cancel (review R3)

M1: PageErrorBoundary wraps the body of every InteractiveServer page; the inert layout boundary is removed.
m1: DisposeBridge cancels its CTS when the 5 s wait times out.
m2: a CSV import that commits after the modal closed still raises OnSaved.
m3: document SecurityMode=None no-fallback in Client.CLI.md / Client.UI.md.
m4: browsePageDelayMs written only when loaded or changed; negative flagged.

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-08 07:31:19 -04:00
parent ca0f1e7735
commit 1475991fd6
39 changed files with 478 additions and 48 deletions
@@ -29,7 +29,13 @@ internal static class DisposeBridge
using var cts = new CancellationTokenSource(Timeout);
try
{
Task.Run(() => work(cts.Token), cts.Token).Wait(Timeout);
var task = Task.Run(() => work(cts.Token), cts.Token);
// Observe a late fault so it never surfaces as an unobserved-task exception.
_ = task.ContinueWith(t => _ = t.Exception, TaskContinuationOptions.OnlyOnFaulted);
// The CTS's own timer and this Wait race: when Wait loses, `using` would dispose the CTS before
// the token ever fired, leaving the work running while the caller goes on to dispose the session.
// Cancel explicitly so the in-flight Close/Delete is told to stop.
if (!task.Wait(Timeout)) { cts.Cancel(); }
}
catch
{