Tracking issue for the prioritized follow-ups from the ground-up review (docs/GROUND_UP_APP_REVIEW.md). Findings were verified against source; severities below are post-verification. The full refactor/feature/long-term roadmap lives in the review doc and docs/IMPLEMENTATION_PLAN_ENTERPRISE_APP.md.
Already shipped in #138: critical seed-user gate · admin password reset (/admin/users + API) · dead-code removal · doc-accuracy fixes.
P0 — do first
P1 — security / auth
P1 — API contract / error handling
P1 — observability
P1 — data correctness / performance
P1 — consistency / UX foundation
Discovery (the product thesis — see the review for sequencing)
Generated from the multi-agent review on 2026-06-17. See docs/GROUND_UP_APP_REVIEW.md for the full findings, enterprise-readiness checklist, and roadmaps.
Tracking issue for the prioritized follow-ups from the ground-up review (
docs/GROUND_UP_APP_REVIEW.md). Findings were verified against source; severities below are post-verification. The full refactor/feature/long-term roadmap lives in the review doc anddocs/IMPLEMENTATION_PLAN_ENTERPRISE_APP.md.Already shipped in #138: critical seed-user gate · admin password reset (
/admin/users+ API) · dead-code removal · doc-accuracy fixes.P0 — do first
admin@email.compassword (operational — code doesn't reset existing users). Use the new/admin/usersreset after Enterprise review + seed-user security gate + admin password reset #138 deploys, or the SQL stopgap now.build.ymlis build-only; ~340 NUnit cases (incl. auth/SSR-form regression guards) gate nothing. Add anmssqlservice container +ConnectionStrings__DefaultConnectionenv override +dotnet test --logger trx --collect "XPlat Code Coverage".Login.razorcallsPasswordSignInAsync(..., lockoutOnFailure: false), so the configured 5-attempt lockout never fires. One-line fix.P1 — security / auth
"api"rate limiter. Registered (100/min) but attached to zero endpoints → the whole/apisurface is unthrottled. Add.RequireRateLimiting("api")to the/apigroup."auth"limiter per-IP. Currently a single global fixed-window bucket → one client can DoS login/logout for everyone.FallbackPolicy; every Employee gets a Read floor on all areas (Sales/HR/Person incl. credit-card tables). Reconcile the endpoint-RequireRolevsAreaPermissionMiddlewaremodels so they can't drift.FixedTimeEquals.p@55wOrdfrom theDemo:AutofillLoginpath inLogin.razor.P1 — API contract / error handling
AddProblemDetails()+IExceptionHandler→ RFC-7807 JSON for/api/*(today unhandled API exceptions render the HTML/Errorpage). MapDbUpdateException(unique/FK) → 409.X-Api-Keyscheme in OpenAPI (AddSecurityDefinition+ requirement); enable XML-comment ingestion.Resultsendpoints (e.g.ShopFloorEndpoints) toTypedResults.P1 — observability
SecurityAuditLogevents (login/lockout/password/role/API-key). The entity is read by the failed-login alert but never written, so the alert is permanently 0.RequestLogs↔AuditLog↔ errors (can't join them today).HEALTHCHECK→/healthz· Serilog rolling-file fallback.P1 — data correctness / performance
InventoryBalancelost-update race — read-modify-write with no concurrency token. Use an atomicUPDATE ... SET Quantity = Quantity + {delta}or a rowversion + retry.HasQueryFilter) —DeletedDateis enforced ad hoc per query today.EnableRetryOnFailureon the SqlServer DbContext (verify inline-transaction endpoints tolerate the execution strategy).*ExpandedRowloaders (Customer/Product/Vendor/SalesTerritory/SalesPerson) that materialize an entity's entire transaction history per row-expand → aggregate projections +Take(10).P1 — consistency / UX foundation
PageHeader(title as<h1>→ fixes the silentFocusOnNavigatea11y defect) and routeCrudPagethrough it; defaultEmptyState/loading skeletons. Then migrate hand-rolledIndexpages in batches.TestValidate) — 250 validators currently have 0 direct tests; runs without SQL Server.Discovery (the product thesis — see the review for sequencing)
GlobalSearchto the existingLookupServicerecord searches (+/api/search).?id=filters for/aw+ Enterprise-core (template already exists in newer modules) so cross-entity links land on the actual record./catalog) + schema relationship map + native AdventureWorks activity timelines (the Process Timeline is empty for all historical data today).Generated from the multi-agent review on 2026-06-17. See
docs/GROUND_UP_APP_REVIEW.mdfor the full findings, enterprise-readiness checklist, and roadmaps.