to navigate Enter to open "…" all these words ANDOR to combine

Onboarding guide

MMCA.Common + MMCA.ADC, Onboarding Guide

A teaching guide for an experienced .NET engineer who is new to this codebase. It walks every first-party type, explaining not just what each type is but how it works and why it was built that way, introducing each project-specific concept the first time it appears, and connecting the code to a 34-category architecture-evaluation rubric as it goes.

Ground rule for this guide: every statement is traceable to source actually read, cited as path/File.cs:line. Where the source can't settle a question, the text says so explicitly ("Not determinable from source: …") rather than guessing. The existing docs (Architecture/ArchitecturalAnalysis.md, ADRs/, per-project CLAUDE.md) are used as a map and cross-check, but source code is ground truth, where a doc and the code disagree, the code wins and the discrepancy is noted.

Building a new app rather than reading an existing one? This guide is a tour of code that already exists. The adoption path is the getting-started guide, which scaffolds the solution with dotnet new mmca-app; the phase-by-phase detail behind it is the build-by-hand walkthrough, whose worked companion is the runnable MMCA.Helpdesk seed.


How the guide is organized, two axes

The guide has two organizing axes that work together.

  1. Primary axis, functional grouping. Every type lives in exactly one functional group: the capability or cross-cutting concern it most exists to serve. The 27 group chapters (group-01-*.mdgroup-27-*.md) are sequenced roughly topologically, foundational, widely-depended-on concerns first (Result → domain blocks → querying → events → CQRS → …), then the ASP.NET/UI/Aspire edges, then the MMCA.ADC business modules that build on all of it, then the test infrastructure. The full assignment of every type to its group is 00-group-taxonomy.md.

  2. Secondary axis, dependency leveling within a group. Inside each chapter, the per-type sections run in ascending Level (a longest-path topological layering over first-party dependencies), so you meet a type only after the first-party types it depends on.

First-party type = any type declared in MMCA.Common or MMCA.ADC source. The .NET BCL and external NuGet packages are not first-party, they are "external Level 0", explained once in the primer, never per class.

Level(C) = 0                              if C references only external (BCL/NuGet) types
Level(C) = 1 + max(Level(D)) over all first-party D that C depends on

When a type must reference a first-party type whose home group appears later, that forward reference is allowed (functional cohesion can outrank strict progressive disclosure) and is cross-linked. Thirty-six dependency cycles exist (mutually-dependent types, e.g. an aggregate root and its child entity with bidirectional EF navigations); each is kept whole within a single group and called out where it occurs. They are listed in the dependency manifest. Three of them are name-collision artifacts rather than real dependencies: the identically-named pairs SelfHttpWarmupTask (MMCA.ADC.Engagement.Service/SelfHttpWarmupTask.cs:23 and MMCA.ADC.Identity.Service/SelfHttpWarmupTask.cs:23), Priority (MMCA.Common.Infrastructure.Tests/Persistence/Conversions/EnumerationValueConverterTests.cs:89 and MMCA.Common.Shared.Tests/ValueObjects/EnumerationTests.cs:122), and GateTestContext (MMCA.Common.Infrastructure.Tests/Persistence/AuditTrail/AuditTrailModelGateTests.cs:76 and MMCA.Common.Infrastructure.Tests/Scheduling/SchedulerModelGateTests.cs:71) are distinct types the globally-unique-name fallback described below cannot tell apart, so each resolves to the other.

How the inventory & leveling were computed

The type inventory and dependency graph are produced mechanically by a small Roslyn syntactic parser (Tools/invtool/), so the type list, namespaces, and file:line are exact and reproducible. Edges are resolved by namespace-aware name matching; ~96% bind by namespace visibility, the rest by a globally-unique-name fallback (586 edges), and 38 references are dropped as ambiguous. The functional grouping is then applied mechanically (Tools/invtool/classify.ps100-group-taxonomy.md), so every one of the 4,257 distinct type nodes maps to exactly one group with no silent drops. See the manifest's accuracy note for residual caveats.


Chapters

Front matter

File Contents
00-primer.md Cross-cutting concepts, the BCL/NuGet stack, build/language conventions, and the 34-category rubric, taught once
00-inventory.md Phase 0, every in-scope type (4,257 distinct), mechanically extracted, with file:line
00-dependency-manifest.md Phase 1a, per-type first-party deps + computed Level; the 36 cycles
00-group-taxonomy.md Phase 1b, the ordered groups + every type's group assignment (the primary axis)

Group chapters (primary axis)

# Chapter Types Concern
1 Result & Error Handling 16 The Result/Error railway returned instead of throwing, incl. its own JSON round-trip converter
2 Domain Building Blocks 36 Entity/aggregate bases, value objects + invariants, domain markers, attributes, identifier aliases, [Pii] redaction, row-version concurrency marker
3 Querying: Specifications, Filtering & the Entity Query Service 38 Specification pattern (incl. cross-source), dynamic filter/sort/page (incl. IN-list value parsing), the generic query pipeline
4 Domain & Integration Events + Outbox Dual-Dispatch 37 Event contracts, dispatcher, transactional outbox/inbox (incl. the async OutboxFinalizer), message buses, OutboxSettings
5 CQRS: Commands, Queries & the Decorator Pipeline 57 Handler abstraction + the logging/transaction/caching/feature-gate/idempotency decorators (incl. the cache-stampede lock)
6 Validation 22 FluentValidation contracts + failure mapping that gate commands
7 Persistence & EF Core 122 SQLServerDbContext over abstract ApplicationDbContext, interceptors (incl. the deferred-dispatch record), repositories, engine-aware entity config, data-source routing, conventions (incl. the soft-delete unique-index convention), factories, and the persistence/audit-trail/connection-string/data-source/tenancy settings classes (regrouped here from the module-system chapter on 2026-09-05)
8 Authentication & Authorization 90 JWT/JWKS dual-fetch, the shared AuthenticationServiceBase<TUser> login/refresh workflow (IAuthUser), current-user/claims, password hashing, cookie sessions, role policies + the permission-based authorization mechanism (registry, [HasPermission]), the RoleValue base, the external-auth-broker contract (ADR-042/043), the JWT/JWKS settings (JwtSettings, JwksSettings, JwtSigningAlgorithm)
9 Caching 9 The cache abstraction + its invalidation-aware decorator integration, CacheSettings
10 Notifications (Push + In-App Inbox + Email) 57 Push (SignalR), in-app inbox, email, recipient providers, the ADR-039 hub-channel live publisher, ADR-044 native OS-level push (Azure Notification Hubs, shipped inert), ADC Notification module + its cross-service gRPC live-channel plumbing + extractable-host Kestrel config
11 Navigation Metadata & Populators 12 EF-decoupled cross-container/cross-source eager loading (ADR-002)
12 API Hosting, Middleware, Idempotency & DTO/Contract Mapping 81 Controller bases (incl. OAuth + service-info + API versioning, ADR-046), middleware (incl. soft-deleted-user revocation, ADR-047), startup, model binders, JSON converters, feature mgmt, idempotency, mapping, edge error localization (i18n), authenticated output caching (ADR-040), app-association/deep-link endpoints (ADR-043)
13 gRPC & Inter-Service Contracts 6 Typed gRPC clients/servers, interceptors, Result-over-the-wire (ADR-007)
14 Module System, Composition & Configuration 69 IModule + Kahn-ordered loader, DI composition roots, data-source attributes, options-binding plumbing (the per-subsystem settings classes live with their subsystems since 2026-09-05), plus the host-level infrastructure services: managed file storage + image processing (ADR-045), native-push sender + device registrar (ADR-044), TenantContext, the upcasting/fault integration-event consumers and PeriodicBackgroundService
15 Common UI Framework 117 Reusable MudBlazor building blocks: data-grid list page base, theme, common pages/services, i18n culture bootstrap + day/dark ThemeService, user-preference readers/writers, pseudo-localization gate, OAuth UI settings + token storage (Web/WASM), hub-channel subscriptions (ADR-039)
16 Aspire Orchestration & Service Defaults 60 AppHost wiring, ServiceDefaults, warmup, telemetry, security helpers, the shared HttpResilienceDefaults Polly source of truth, the shared HealthCheckTags liveness/readiness vocabulary
17 ADC Conference, Domain Model & Module Contracts 99 Event/Session/Speaker/Category/Question aggregates + domain events + invariants + Shared contracts (incl. ConferencePermissions, the current/next-event selector + live-validation contracts)
18 ADC Conference, Application & Use Cases 303 Conference CQRS handlers, validators (incl. the per-field session validation-rule family), DTOs, specs, Sessionize import, decision-support analytics, batch bookmark-count query, event-filtering-by-role handlers, calendar (.ics) export slice (ADR-042)
19 ADC Conference, Infrastructure & Persistence 37 Conference DbContext registration, EF configs, seeding, infra services
20 ADC Conference, API, gRPC Contracts & Service Host 44 REST controllers, .Contracts gRPC, the extractable service host (incl. its Kestrel config), the gRPC adapters (incl. cross-service live-validation), localized error resources
21 ADC Conference, UI 146 Conference Blazor pages + UI services, the single canonical ADC Home page + its view models, the AI-scoring poll recovery tracker, calendar/QR export UI, OfflineBanner, PresenterLayout on Common theme providers
22 ADC Engagement Module (Session Bookmarks) 193 The attendee-activity slice of the Engagement bounded context, four capability families: the session-bookmark aggregate, the QR badge check-in surface (organizer scanning, manual fallback, attendee self-service, attendance rollup), the points economy (append-only ledger + opt-in public leaderboard), and the feedback UI; plus use cases, persistence, API/contracts/service, the durable live-channel publish queue (ADR-039), the cross-service user-engagement export slice (gRPC); the live-layer UI services (SessionLiveUIService, LivePollUIService, SessionQuestionUIService, LiveEventService, SessionLookupService) and the live-poll EF configurations sit here too (regrouped from the live-layer chapter on 2026-09-05)
23 ADC Engagement Live Layer (Real-Time Polls & Session Q&A) 85 Event-wide live polls with voting + moderated per-session Q&A with upvoting, over the ADR-039 hub-channel transport and the cross-service gRPC live-channel adapter (HappeningNow / SessionLive / PresenterView)
24 ADC Identity Module (Users, Profiles, GDPR Export/Erasure) 90 The Identity bounded context end-to-end (incl. IdentityPermissions, user culture/theme preferences, the ADR-045 user-avatar photo slice end to end, the external-login email verifier + extractable-host Kestrel config; AuthenticationService now extends Common's shared base)
25 ADC Application Host, UI Shell & Cross-Module Composition 17 Blazor Web/WASM/WinUI shells, host pages/services, security, app composition, device-capability DI wiring, one-time preference migrator (the shared ADC Home page + its view models now live in the Conference UI chapter)
26 Device Capability Abstraction Layer (Native Contracts, MAUI, Browser & Fallback Adapters) 99 Per-capability interface contracts (biometric, geolocation, speech, push registration, clipboard/share/haptics, external auth/links, connectivity/battery, deep links) + their MAUI-native, browser-JS-interop, and inert-fallback implementations, selected per host at DI composition time (ADR-042/043/044/045)
27 Testing & Quality Infrastructure 2,315 All test projects + reusable Testing/Testing.E2E/Testing.UI/Testing.Architecture bases (incl. the handler + decorator-pipeline test bases, the shared production-host/graceful-shutdown bases, the observability-convention fitness base, and the Gallery auth stubs) + architecture-fitness tests + Gallery + the BenchmarkDotNet perf-smoke suite

DevOps & operations chapters

File Contents
devops-cicd.md CI/CD workflows (the lockstep package release, count in FACTS.md; the automated Claude review + MAUI audit workflows; ADC deploy/e2e/cost-guard/load-test/cutover)
devops-iac.md Bicep infrastructure-as-code, the UAMI/OIDC + shared-RG + database-per-service deployment model
devops-aspire.md Aspire AppHost + ServiceDefaults orchestration; how local run and service wiring work
devops-runbooks.md Operational scripts, SQL, and runbooks (disaster recovery, post-cutover downgrade)
devops-testing.md Solution composition (.slnx/.slnf), MTP/xUnit v3 runner, the test strategy & pyramid

Back matter

File Contents
99-coverage-audit.md Phase 4, coverage cross-check, exceptions log, grouping/ordering verification, rubric matrix, open questions

Legend, how to read a type section

Every type gets one section using this template:

{TypeName}

{Assembly} · {namespace} · {file:line} · Level {n} · {kind}

  • What it is: one or two plain-language sentences.
  • Depends on: first-party types (linked) and notable externals.
  • Concept introduced: taught from first principles the first time a pattern appears; otherwise cross-references where it was introduced. Relevant rubric categories are tagged inline as [Rubric §N, Name].
  • Walkthrough: members in teaching order (fields → constructor/factory → key methods), with line numbers and the mechanism.
  • Why it's built this way: design rationale; cites the relevant ADR when one applies.
  • Where it's used: a forward pointer to consumers.
  • Caveats / not-in-source: anything uncertain, stated explicitly.
  • Cross-links. A first-party type named in prose links to its section, e.g. Result. The target is computed from the type's group (see 00-group-taxonomy.md); within a chapter, links are same-page anchors.
  • Sibling families. Near-identical types (per-entity Add*/Remove*/Update* commands, *DTOMapper, *Validator families) may share one ### A, B, C section that teaches the shared shape once, with a per-member File:Line table so every type stays individually cited.
  • [Rubric §N, Name] tags. These connect the code to the 34-category rubric introduced in the primer. A tag explains the category and how this code embodies (or under-uses) it, it does not score it. Scoring lives in the separate ArchitectureEvaluation-*.md reports.

Suggested reading paths

  • Framework-first (recommended). Primer → group-01 → upward. You meet the MMCA.Common foundations before the MMCA.ADC features that build on them; this matches dependency order across and within groups.
  • "I need to touch the ADC Conference module." Primer → skim group-01/02/05 (Result, domain blocks, CQRS) → then Conference DomainApplicationUI.
  • Capability deep-dive. Jump straight to the group for the concern you care about, persistence, auth, events/outbox, notifications, navigation populators, etc. Each chapter opens with a "how this capability is implemented" overview before the per-type sections.
  • Rubric-driven (architecture review). Read the primer's rubric section, then follow the [Rubric §N] tags; the coverage audit maps every category to where it's first explained.
  • Operations / DevOps. Primer → the devops-* chapters.
  • "I want to build my own app on the framework." Not this guide: start at the getting-started guide, then come back here for the internals behind whichever pattern you land on.

The companion projects (context)

MMCA.Common , shared framework, published as 15 NuGet packages (DDD/Clean Arch/CQRS base classes)
   ├── consumed by MMCA.ADC   (Atlanta Developers Conference app, the focus of this guide)
   └── consumed by MMCA.Store  (e-commerce app, out of scope here)

This guide covers MMCA.Common (the framework) and MMCA.ADC (one consumer). MMCA.Store is out of scope. The dependency arrow is why the Common framework groups (1–16) come before the ADC business-module groups (17–25); the late-added Common Device Capability layer (26, a framework concern appended after the business modules) and the test infrastructure (27) come last.