Resolves the two SHOULD-FIX gate findings from the #91 phase-(b) cold review by making the removal plan address them explicitly rather than clearing the gate by omission. Docs-only — no production code changes.
Enumerated the actual authorization wiring in ErsatzTV/Startup.cs + ErsatzTV/Pagesin code (not assumed):
OIDC (OidcHelper.IsEnabled, config-gated) attaches auth via AddRazorPages(… AuthorizeFolder("/")) + blazor.UseAuthentication/UseAuthorization — and AuthorizeFolder("/") gates Razor Pages only, whose sole user-facing page is Pages/_Host.cshtml (the Blazor host). The OIDC challenge protects exactly the Blazor UI, nothing else.
/app (SPA) — own MapWhen(/app) static branch, no auth middleware; open since phase (a) (PR #148).
/api/* — zero [Authorize] attributes (verified); only optional gate is ApiKeyAuthorizationFilter (independent of Blazor).
/iptv/* — ConditionalIptvAuthorizeFilter (JWT), own branch, independent of Blazor.
Verdict: removal deletes the OIDC challenge's only attachment point; no capability lost (each Blazor capability already has an open SPA equivalent), no NEW exposure beyond the phase-(a) state (open SPA already the default admin surface). Independent gates (/iptv JWT, API-key filter) survive. Real SPA/API auth deferred to #197. Recorded in docs/decisions.md.
Documented the blazor-final annotated-tag procedure: cut at removal time on the pre-deletion main commit (not now — main moves first; not a v* tag → no release build), plus the restore path (checkout → docker build → pin test container, or revert the deletion merge). Recorded in docs/decisions.md.
Consolidation
Both fold into a new "Section 5 — Removal execution runbook" in docs/blazor-route-parity.md — an ordered checklist (rollback tag → surgical Blazor delete → auth sign-off pointer → verify+docs) so the (gated) removal PR just executes it.
Notes
The physical actions (cutting the tag, deleting the OIDC/Blazor pieces) remain the gated removal PR's job — this PR makes the plan complete and durable so they don't get missed.
Files: docs/decisions.md (+63), docs/blazor-route-parity.md (+25). No API/route/schema change → no OpenAPI/generated-artifact regen needed.
Resolves the two SHOULD-FIX gate findings from the #91 phase-(b) cold review by making the removal plan **address them explicitly** rather than clearing the gate by omission. Docs-only — no production code changes.
## #206 — auth posture sign-off
Enumerated the actual authorization wiring in `ErsatzTV/Startup.cs` + `ErsatzTV/Pages` **in code** (not assumed):
- **OIDC** (`OidcHelper.IsEnabled`, config-gated) attaches auth via `AddRazorPages(… AuthorizeFolder("/"))` + `blazor.UseAuthentication/UseAuthorization` — and `AuthorizeFolder("/")` gates **Razor Pages only**, whose sole user-facing page is `Pages/_Host.cshtml` (the Blazor host). **The OIDC challenge protects exactly the Blazor UI, nothing else.**
- **`/app` (SPA)** — own `MapWhen(/app)` static branch, **no auth middleware**; open since phase (a) (PR #148).
- **`/api/*`** — zero `[Authorize]` attributes (verified); only optional gate is `ApiKeyAuthorizationFilter` (independent of Blazor).
- **`/iptv/*`** — `ConditionalIptvAuthorizeFilter` (JWT), own branch, independent of Blazor.
**Verdict:** removal deletes the OIDC challenge's only attachment point; **no capability lost** (each Blazor capability already has an open SPA equivalent), **no NEW exposure** beyond the phase-(a) state (open SPA already the default admin surface). Independent gates (`/iptv` JWT, API-key filter) survive. Real SPA/API auth deferred to **#197**. Recorded in `docs/decisions.md`.
## #205 — pre-removal rollback tag
Documented the `blazor-final` annotated-tag procedure: cut at removal time on the pre-deletion `main` commit (not now — main moves first; not a `v*` tag → no release build), plus the restore path (checkout → docker build → pin test container, or revert the deletion merge). Recorded in `docs/decisions.md`.
## Consolidation
Both fold into a new **"Section 5 — Removal execution runbook"** in `docs/blazor-route-parity.md` — an ordered checklist (rollback tag → surgical Blazor delete → auth sign-off pointer → verify+docs) so the (gated) removal PR just executes it.
## Notes
- The physical actions (cutting the tag, deleting the OIDC/Blazor pieces) remain the **gated removal PR's** job — this PR makes the plan complete and durable so they don't get missed.
- Files: `docs/decisions.md` (+63), `docs/blazor-route-parity.md` (+25). No API/route/schema change → no OpenAPI/generated-artifact regen needed.
refs #205 #206 #91
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Resolves the two SHOULD-FIX gate findings from the #91 phase-(b) cold review by making the removal plan address them explicitly rather than clearing the gate by omission. Docs-only — no production code changes.
#206 — auth posture sign-off
Enumerated the actual authorization wiring in
ErsatzTV/Startup.cs+ErsatzTV/Pagesin code (not assumed):OidcHelper.IsEnabled, config-gated) attaches auth viaAddRazorPages(… AuthorizeFolder("/"))+blazor.UseAuthentication/UseAuthorization— andAuthorizeFolder("/")gates Razor Pages only, whose sole user-facing page isPages/_Host.cshtml(the Blazor host). The OIDC challenge protects exactly the Blazor UI, nothing else./app(SPA) — ownMapWhen(/app)static branch, no auth middleware; open since phase (a) (PR #148)./api/*— zero[Authorize]attributes (verified); only optional gate isApiKeyAuthorizationFilter(independent of Blazor)./iptv/*—ConditionalIptvAuthorizeFilter(JWT), own branch, independent of Blazor.Verdict: removal deletes the OIDC challenge's only attachment point; no capability lost (each Blazor capability already has an open SPA equivalent), no NEW exposure beyond the phase-(a) state (open SPA already the default admin surface). Independent gates (
/iptvJWT, API-key filter) survive. Real SPA/API auth deferred to #197. Recorded indocs/decisions.md.#205 — pre-removal rollback tag
Documented the
blazor-finalannotated-tag procedure: cut at removal time on the pre-deletionmaincommit (not now — main moves first; not av*tag → no release build), plus the restore path (checkout → docker build → pin test container, or revert the deletion merge). Recorded indocs/decisions.md.Consolidation
Both fold into a new "Section 5 — Removal execution runbook" in
docs/blazor-route-parity.md— an ordered checklist (rollback tag → surgical Blazor delete → auth sign-off pointer → verify+docs) so the (gated) removal PR just executes it.Notes
docs/decisions.md(+63),docs/blazor-route-parity.md(+25). No API/route/schema change → no OpenAPI/generated-artifact regen needed.refs #205 #206 #91
🤖 Generated with Claude Code
ca0ad1b42cto7608cccebd