Phase 1 — Core System & Security Modules#

Status: shipped on branch phase-1/core-security (pending push + merge to master). Depends on: Phase 0. Why first? Every other module needs working access control, system settings, and audit logging.

Modules — delivered#

ModuleAPIJira
Auth login + rehash-on-loginPOST /api/v1/auth/loginBFC-13
Login Activity trackingMnxLoginActivity inserts on every login attemptBFC-13
User Access InformationGET /api/v1/users/me/accessBFC-14
Group SetupGET/POST/PUT/DELETE /api/v1/groups (writes flag-gated)BFC-15
License InformationGET /api/v1/license, /summaryBFC-29
Self-guided help / tutorialGET /api/v1/help/sections, /documentsBFC-30
FavoritesGET/POST/DELETE /api/v1/users/me/favoritesBFC-23
UI Conventions / Main MenuGET /api/v1/navigation/menuBFC-25
System SettingsGET /api/v1/settings, PUT /{id} (writes flag-gated)BFC-22
Global SearchGET /api/v1/search?q=&types=&take=BFC-24
Dockerfile + health endpointsDockerfile + GET /health + GET /readyBFC-20
Docs pipelineHugo + Cloudflare PagesBFC-36
MX Chat — architecture ADRADR 0007 (Proposed)BFC-27

Modules — deferred#

ModuleReasonJira
MX Chat MVPBlocked on product input per ADR 0007 § “Decisions required”BFC-28
Calendar APINo legacy calendar table exists; greenfield module needs product scopeBFC-26

Cross-cutting deliverables#

  • 7 ADRs — 0001 (auth model, amended with corrected Encrypted algorithm), 0004 (additive-only migration), 0005 (group → role/claim mapping), 0006 (Cube-2.0-owned rehash persistence), 0007 (MX Chat proposed)
  • JWT with mod_admin, grp, role, itar claims — derived from legacy security graph per ADR 0005
  • Feature flags: EnableGroupWrites, EnableFavoritesWrites, EnableSettingsWrites — all default false
  • Global exception middleware + ProblemDetails
  • Rate limiter (per-user + per-IP fallback)
  • Serilog request logging + correlation ID middleware
  • Health checks — /health liveness, /ready with SQL Server dependency
  • 91 automated tests passing (Data.Tests + Web.Tests + IntegrationTests)

Exit criteria — met#

  • A user logs in through the new Auth API and receives their real roles / permissions
  • System Settings, Group Setup, and Login Activity are servable from the new API and match legacy output (verified locally against compAdmin on staging DB)
  • Feature-flag mechanism is proven end-to-end (writes off by default; toggle enables them)
  • Rollback plan documented for each module (Dry-Run § 4.5)

Sign-off gates#

  • Migration Dry-Run — BFC-17. Reviewer executes 3 SQL files against staging and fills in the report template.
  • UAT Plan — BFC-35. QA + reviewer + product each run the golden-path scripts and sign off.

Only after both are complete does Phase 1 merge to master.

Known limitations at ship time#

Tracked as follow-up tickets (full detail):

  • BFC-31 — machine keys still in appsettings.json (blocked on ops / secrets store)
  • BFC-32 — GroupWrite policy tightening (blocked on reviewer)
  • BFC-33 — /users/{userId}/access cross-tenant guard (blocked on reviewer)
  • BFC-34 — failed-attempt tracking + auto-lockout (blocked on product)

None of the above block Phase 1 sign-off — the reviewer acknowledges them per UAT Plan § 7.

Risks — resolved#

  • Legacy password hash format may not match what we assumed. Resolved 2026-09-04: Encrypted algorithm confirmed against staging user compAdmin. Algorithm documented in ADR 0001 as amended.
  • Group / permission model is spread across AspMnxGroup, AspnetMembership, MnxUser*. The mapping is not trivial. Resolved: ADR 0005 captures the end-to-end mapping; implementation in Manex.Web.Auth.TokenService + UserAccessService.