diff --git a/docs/plans/2026-06-14-deferred-followups.md b/docs/plans/2026-06-14-deferred-followups.md index 17545f4..066fc56 100644 --- a/docs/plans/2026-06-14-deferred-followups.md +++ b/docs/plans/2026-06-14-deferred-followups.md @@ -232,3 +232,39 @@ backup, start. This plan is intentionally NOT executed. When ready, execute on a branch off `main` (`feat/deferred-followups` or per-item branches) — do not commit to `main` directly. D1/D2 need a Server redeploy to take effect; D4/D5 are host operations; D3 touches nothing permanent. + +--- + +## D2 — Resolution (2026-06-14) + +Static source determination on build `5976770` (runtime repro out of scope). What was checked: + +- **Razor `@page "/"` count:** exactly ONE — `Dashboard/Components/Pages/DashboardHome.razor`. + All other pages declare distinct routes (`/login`, `/sessions`, `/galaxy`, `/browse`, + `/apikeys`, `/workers`, `/events`, `/alarms`, `/settings`, `/sessions/{SessionId}`). +- **No root index.html:** `src/ZB.MOM.WW.MxGateway.Server/wwwroot/` contains only `css/` and + `lib/` subdirectories; no `index.html` anywhere under `wwwroot/`. +- **No `UseDefaultFiles` / no `MapFallback`:** neither appears anywhere in the Server project. +- **`MapStaticAssets` mapped once** (`GatewayApplication.cs:190`) and `UseStaticFiles()` once + (`:41`); the static-assets manifest serves fingerprinted CSS/JS assets, not a literal `/`. +- **No `MapGet("/")`:** the dashboard endpoint builder + (`Dashboard/DashboardEndpointRouteBuilderExtensions.cs`) maps only `/auth/login`, `/logout`, + `/denied`, `/hubs/{snapshot,alarms,events}`, `/hubs/token`, then `MapRazorComponents()`. + None use pattern `/`. +- **`MapZbHealth` / `MapZbMetrics`** come from the external `ZB.MOM.WW.Health` shared library + (not in this repo) and map health/metrics paths, not `/`. + +**Root cause of the 2026-06-05 log:** `code-reviews/Server/findings.md` (re-review at `42b0037`, +2026-05-24) records that commit `de7639a` **removed the legacy `MapGet("/", ...)` redirect that +was colliding with the Blazor `@page "/"` (a real 500)**. That legacy registration was the source +of the `AmbiguousMatchException`. It is gone on the current build, so the second `/` endpoint no +longer exists. + +**Conclusion:** No duplicate `/` endpoint on build `5976770`. The AmbiguousMatchException is not +reproducible from source — it was a stale Development-only artifact from before `de7639a` reached +the deployed instance. **No source change made** (no-op). + +**Residual:** A 100% confirmation still requires an authenticated runtime `GET /` against a +deployed instance (the only path that exercises routing past the unauthenticated 302-to-`/login`). +Recommend a spot-check of authenticated `GET /` after the next Server redeploy; if it returns 200 +(not 500), this item can be fully closed.