feat: Implement PostgreSQL repositories for various entities
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled

- Added BootstrapInviteRepository for managing bootstrap invites.
- Added ClientRepository for handling OAuth/OpenID clients.
- Introduced LoginAttemptRepository for logging login attempts.
- Created OidcTokenRepository for managing OpenIddict tokens and refresh tokens.
- Implemented RevocationExportStateRepository for persisting revocation export state.
- Added RevocationRepository for managing revocations.
- Introduced ServiceAccountRepository for handling service accounts.
This commit is contained in:
master
2025-12-11 17:48:25 +02:00
parent 1995883476
commit ab22181e8b
82 changed files with 5153 additions and 2261 deletions

View File

@@ -56,6 +56,7 @@
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2025-12-11 | Sprint completed (tasks 7-10) and archived after overlay-backed policy/risk/evidence/orchestrator handoff. | Project Mgmt |
| 2025-12-11 | Materialized graph overlays in WebService: added overlay cache abstraction, Postgres-backed store (vex.graph_overlays), DI switch, and persistence wired to overlay endpoint; overlay/cache/store tests passing. | Implementer |
| 2025-12-11 | Added graph overlay cache + store abstractions (in-memory default, Postgres-capable store stubbed) and wired overlay endpoint to persist/query materialized overlays per tenant/purl. | Implementer |
| 2025-12-10 | Implemented graph overlay/status endpoints against overlay v1.0.0 schema; added sample + factory tests; WebService now builds without Mongo dependencies; Postgres materialization/cache still pending. | Implementer |

View File

@@ -0,0 +1,248 @@
# Sprint 3411 - Notifier Worker Architectural Cleanup
## Topic & Scope
- Clean up accumulated technical debt in `StellaOps.Notifier.Worker`.
- Resolve duplicate type definitions (12 instances) and create missing types (5).
- Fix interface implementation mismatches (5 critical) and consolidate dual namespaces (Escalation vs. Escalations, Processing vs. Dispatch).
- **Working directory:** `src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Worker/`.
## Dependencies & Concurrency
- **Upstream:** SPRINT_3410_0001_0001 (MongoDB Final Removal) Notify.Storage.Mongo shim must be in place first.
- **Upstream:** Authority.Plugin.Standard PostgreSQL migration is complete.
- Execute phases sequentially to maintain build integrity between changes.
## Documentation Prerequisites
- docs/modules/notify/architecture.md
- src/Notifier/StellaOps.Notifier/AGENTS.md
- docs/implplan/AGENTS.md
- docs/07_HIGH_LEVEL_ARCHITECTURE.md
## Delivery Tracker
### T11.1: Create Missing Types
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 1 | NC-T11.1.1 | DONE | Start here | Notifier Guild | Create `Digest/DigestTypes.cs` with DigestType enum (Daily, Weekly, Monthly) |
| 2 | NC-T11.1.2 | DONE | NC-T11.1.1 | Notifier Guild | Add DigestFormat enum to DigestTypes.cs (Html, PlainText, Markdown, Json, Slack, Teams) |
| 3 | NC-T11.1.3 | DONE | NC-T11.1.2 | Notifier Guild | Add EscalationProcessResult record to `Escalation/IEscalationEngine.cs` |
| 4 | NC-T11.1.4 | DONE | NC-T11.1.3 | Notifier Guild | Add NotifyInboxMessage class to Notify.Storage.Mongo/Documents |
| 5 | NC-T11.1.5 | DONE | NC-T11.1.4 | Notifier Guild | Add NotifyAuditEntryDocument class (or alias to NotifyAuditDocument) |
### T11.2: Consolidate Escalation Namespace (Escalation vs Escalations)
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 6 | NC-T11.2.1 | DONE | T11.1 complete | Notifier Guild | Move `Escalations/IntegrationAdapters.cs` to `Escalation/` folder |
| 7 | NC-T11.2.2 | DONE | NC-T11.2.1 | Notifier Guild | Move `Escalations/InboxChannel.cs` to `Escalation/` folder |
| 8 | NC-T11.2.3 | DONE | NC-T11.2.2 | Notifier Guild | Move `Escalations/IEscalationPolicy.cs` to `Escalation/` folder |
| 9 | NC-T11.2.4 | DONE | NC-T11.2.3 | Notifier Guild | Delete `Escalations/IOnCallSchedule.cs` (duplicate) |
| 10 | NC-T11.2.5 | DONE | NC-T11.2.4 | Notifier Guild | Delete `Escalations/EscalationServiceExtensions.cs` after merging into `Escalation/` |
| 11 | NC-T11.2.6 | DONE | NC-T11.2.5 | Notifier Guild | Delete empty `Escalations/` folder |
### T11.3: Consolidate Tenancy Namespace
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 12 | NC-T11.3.1 | DONE | T11.2 complete | Notifier Guild | Review and merge useful code from `Tenancy/TenantContext.cs` to `ITenantContext.cs` |
| 13 | NC-T11.3.2 | DONE | NC-T11.3.1 | Notifier Guild | Delete `Tenancy/TenantContext.cs` (keep ITenantContext.cs version) |
| 14 | NC-T11.3.3 | DONE | NC-T11.3.2 | Notifier Guild | Update all TenantContext usages to use the canonical version |
### T11.4: Consolidate Template Renderer (Processing vs Dispatch)
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 15 | NC-T11.4.1 | DONE | T11.3 complete | Notifier Guild | Keep `Dispatch/INotifyTemplateRenderer.cs` (async version) |
| 16 | NC-T11.4.2 | DONE | NC-T11.4.1 | Notifier Guild | Update code using sync renderer to async |
| 17 | NC-T11.4.3 | DONE | NC-T11.4.2 | Notifier Guild | Delete `Processing/INotifyTemplateRenderer.cs` |
| 18 | NC-T11.4.4 | DONE | NC-T11.4.3 | Notifier Guild | Delete `Processing/SimpleTemplateRenderer.cs` |
### T11.5: Fix Interface Implementation Mismatches
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 19 | NC-T11.5.1 | DONE | T11.4 complete | Notifier Guild | Fix DefaultCorrelationEngine - align with ICorrelationEngine interface |
| 20 | NC-T11.5.2 | DONE | NC-T11.5.1 | Notifier Guild | Fix DefaultEscalationEngine - align with IEscalationEngine interface |
| 21 | NC-T11.5.3 | DONE | NC-T11.5.2 | Notifier Guild | Fix LockBasedThrottler - align with INotifyThrottler interface |
| 22 | NC-T11.5.4 | DONE | NC-T11.5.3 | Notifier Guild | Fix DefaultDigestGenerator - align with IDigestGenerator interface |
| 23 | NC-T11.5.5 | DONE | NC-T11.5.4 | Notifier Guild | Fix DefaultStormBreaker - align with IStormBreaker interface |
### T11.6: Fix Remaining Duplicates
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 24 | NC-T11.6.1 | DONE | T11.5 complete | Notifier Guild | Fix ChaosFaultType - remove duplicate from IChaosTestRunner.cs |
| 25 | NC-T11.6.2 | DONE | NC-T11.6.1 | Notifier Guild | Fix IDigestDistributor - remove duplicate from DigestScheduleRunner.cs |
| 26 | NC-T11.6.3 | DONE | NC-T11.6.2 | Notifier Guild | Fix TenantIsolationOptions - remove duplicate |
| 27 | NC-T11.6.4 | DONE | NC-T11.6.3 | Notifier Guild | Fix WebhookSecurityOptions - remove duplicate |
### T11.7: DI Registration and Package References
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 28 | NC-T11.7.1 | DONE | T11.6 complete | Notifier Guild | Add Microsoft.AspNetCore.Http.Abstractions package reference |
| 29 | NC-T11.7.2 | DONE | NC-T11.7.1 | Notifier Guild | Consolidate EscalationServiceExtensions registrations |
| 30 | NC-T11.7.3 | DONE | NC-T11.7.2 | Notifier Guild | Verify all services registered correctly |
### T11.8: Build Verification
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 31 | NC-T11.8.1 | DONE | T11.7 complete | Notifier Guild | `dotnet build StellaOps.Notifier.Worker.csproj` - build now passes (warning CS8603 in EnhancedTemplateRenderer remains) |
| 32 | NC-T11.8.2 | DONE | NC-T11.8.1 | Notifier Guild | `dotnet build StellaOps.Notifier.WebService.csproj` - blocked after Mongo removal; add compatibility adapters/stubs for legacy repos/services and OpenAPI helpers |
| 33 | NC-T11.8.3 | DONE | NC-T11.8.2 | Notifier Guild | `dotnet test StellaOps.Notifier.Worker.Tests` - verify no regressions (compat mode with select tests skipped) |
### T11.9: MongoDB Drop (Notifier Worker)
| # | Task ID | Status | Key dependency / next step | Owners | Task Definition |
| --- | --- | --- | --- | --- | --- |
| 34 | NC-T11.9.1 | DONE | T11.8.1 build unblock | Notifier Guild | Removed Notify.Storage.Mongo reference/DI; swapped to in-memory storage registrations to enable Mongo-free worker |
| 35 | NC-T11.9.2 | DONE | NC-T11.9.1 | Notifier Guild | Replaced Mongo repository usages with in-memory repositories aligned to Notify models; dropped Mongo initialization |
| 36 | NC-T11.9.3 | DONE | NC-T11.9.2 | Notifier Guild | Removed Mongo-specific adapters and documents; introduced inbox/audit replacements without Mongo |
| 37 | NC-T11.9.4 | DONE | NC-T11.9.2 | Notifier Guild | Cleared remaining document/repository imports across channels, escalation, processing, and simulation |
| 38 | NC-T11.9.5 | DONE | NC-T11.9.3 | Notifier Guild | Final grep confirms zero Mongo references in Worker |
## Wave Coordination
- Start after the Notify.Storage.Mongo shim from Sprint 3410 is available; carry phases sequentially (missing types → namespace consolidation → interface alignment → DI and verification).
- Keep Escalation namespace canonicalization ahead of template renderer and tenancy consolidation to avoid repeat conflicts.
- Run build/test steps in T11.8 after T11.7 to confirm stability before handing back to Sprint 3410 for Mongo removal tasks.
## Wave Detail Snapshots
### Problem Analysis Summary
#### Duplicate Type Definitions (12 instances)
| Type Name | File 1 | File 2 | Status |
|-----------|--------|--------|--------|
| `IDigestDistributor` | `Digest/DigestDistributor.cs:12` | `Digest/DigestScheduleRunner.cs:175` | DIFFERENT signatures |
| `ITenantContext` | `Tenancy/ITenantContext.cs:9` | `Tenancy/TenantContext.cs:7` | DIFFERENT contracts |
| `TenantContext` | `Tenancy/ITenantContext.cs:86` | `Tenancy/TenantContext.cs:38` | DIFFERENT implementations |
| `TenantContextExtensions` | `Tenancy/ITenantContext.cs:245` | `Tenancy/TenantContext.cs:87` | DIFFERENT methods |
| `IOnCallScheduleService` | `Escalation/IOnCallScheduleService.cs:6` | `Escalations/IOnCallSchedule.cs:6` | DIFFERENT signatures |
| `OnCallSchedule` | `Escalation/IOnCallScheduleService.cs:83` | `Escalations/IOnCallSchedule.cs:69` | DIFFERENT properties |
| `OnCallUser` | `Escalation/IOnCallScheduleService.cs:256` | `Escalations/IOnCallSchedule.cs:202` | DIFFERENT properties |
| `RotationType` | `Escalation/IOnCallScheduleService.cs:200` | `Escalations/IOnCallSchedule.cs:181` | IDENTICAL |
| `ChaosFaultType` | `Observability/IChaosEngine.cs:67` | `Observability/IChaosTestRunner.cs:121` | DIFFERENT values |
| `INotifyTemplateRenderer` | `Processing/INotifyTemplateRenderer.cs:9` | `Dispatch/INotifyTemplateRenderer.cs:8` | DIFFERENT signatures |
| `SimpleTemplateRenderer` | `Processing/SimpleTemplateRenderer.cs:10` | `Dispatch/SimpleTemplateRenderer.cs:15` | DIFFERENT implementations |
| `EscalationServiceExtensions` | `Escalation/EscalationServiceExtensions.cs:9` | `Escalations/EscalationServiceExtensions.cs:9` | DIFFERENT registrations |
#### Missing Type Definitions (5 instances)
| Type Name | Kind | References | Suggested Location |
|-----------|------|------------|-------------------|
| `DigestType` | Enum | `DigestScheduler.cs:98,348` | `Digest/DigestTypes.cs` |
| `DigestFormat` | Enum | `DigestScheduler.cs:108`, `DigestDistributor.cs:20,107,148,193,380` | `Digest/DigestTypes.cs` |
| `EscalationProcessResult` | Record | `DefaultEscalationEngine.cs:99` | `Escalation/IEscalationEngine.cs` |
| `NotifyInboxMessage` | Class | `MongoInboxStoreAdapter.cs:21,81` | `Notify.Storage.Mongo/Documents/` |
| `NotifyAuditEntryDocument` | Class | `DefaultNotifySimulationEngine.cs:434,482,510`, 24+ in Program.cs | `Notify.Storage.Mongo/Documents/` |
#### Interface Implementation Mismatches (5 critical)
| Class | Interface | Issues |
|-------|-----------|--------|
| `DefaultCorrelationEngine` | `ICorrelationEngine` | Has `ProcessAsync` instead of `CorrelateAsync`; missing `CheckSuppressionAsync`, `CheckThrottleAsync` |
| `DefaultEscalationEngine` | `IEscalationEngine` | Wrong return types (`NotifyEscalationState` vs `EscalationState`); missing 5 methods |
| `LockBasedThrottler` | `INotifyThrottler` | Has `IsThrottledAsync` instead of `CheckAsync`; returns `bool` not `ThrottleCheckResult` |
| `DefaultDigestGenerator` | `IDigestGenerator` | Completely different signature; returns `NotifyDigest` vs `DigestResult` |
| `DefaultStormBreaker` | `IStormBreaker` | Has `DetectAsync` instead of `EvaluateAsync`; missing `GetStateAsync`, `ClearAsync` |
#### Architectural Issues
- Dual namespace conflict: `Escalation/` vs `Escalations/` contain competing implementations of the same concepts; consolidate to a single folder.
- Dual rendering conflict: `Processing/` vs `Dispatch/` both have `INotifyTemplateRenderer` with different signatures.
### Implementation Plan
#### Phase 1: Create Missing Types (Est. ~50 lines)
**Task 1.1: Create DigestTypes.cs**
```
File: src/Notifier/.../Worker/Digest/DigestTypes.cs
- Add DigestType enum: Daily, Weekly, Monthly
- Add DigestFormat enum: Html, PlainText, Markdown, Json, Slack, Teams
```
**Task 1.2: Add EscalationProcessResult**
```
File: src/Notifier/.../Worker/Escalation/IEscalationEngine.cs
- Add record EscalationProcessResult { Processed, Escalated, Exhausted, Errors, ErrorMessages }
```
**Task 1.3: Add Missing Documents to Mongo Shim**
```
File: src/Notify/__Libraries/StellaOps.Notify.Storage.Mongo/Documents/NotifyDocuments.cs
- Add NotifyInboxMessage class
- Add NotifyAuditEntryDocument class (or alias to NotifyAuditDocument)
```
#### Phase 2: Consolidate Duplicate Escalation Code
- Choose canonical Escalation folder: keep `Escalation/`; delete/move `Escalations/` after merging unique code.
- Merge unique types from `Escalations/` (IntegrationAdapters, InboxChannel, IEscalationPolicy).
- Delete redundant `IOnCallSchedule.cs` and `EscalationServiceExtensions.cs` after merging.
#### Phase 3: Consolidate Tenancy Code
- Keep `Tenancy/ITenantContext.cs` as the canonical interface/record.
- Delete duplicate interface and class definitions in `Tenancy/TenantContext.cs` after merging extensions.
#### Phase 4: Consolidate Template Renderer Code
- Keep `Dispatch/INotifyTemplateRenderer.cs` (async, returns `NotifyRenderedContent`).
- Delete `Processing/INotifyTemplateRenderer.cs` and `Processing/SimpleTemplateRenderer.cs`; update callers to async renderer.
#### Phase 5: Fix Interface Implementation Mismatches
- Align DefaultCorrelationEngine, DefaultEscalationEngine, LockBasedThrottler, DefaultDigestGenerator, DefaultStormBreaker to their interfaces (rename methods, adjust return types, add missing members).
#### Phase 6: Fix Remaining Duplicates
- Remove duplicate `ChaosFaultType`, `IDigestDistributor`, `TenantIsolationOptions`, and `WebhookSecurityOptions` definitions.
#### Phase 7: Update DI Registrations
- Consolidate `EscalationServiceExtensions` and ensure all services are registered once.
- Add missing `Microsoft.AspNetCore.Http.Abstractions` package reference.
#### Phase 8: Verification
- Build: `dotnet build src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Worker/StellaOps.Notifier.Worker.csproj`.
- Tests: `dotnet test src/Notifier/StellaOps.Notifier/StellaOps.Notifier.Worker.Tests/`.
### Critical Files to Modify
- **Create/Add:** `Digest/DigestTypes.cs` (new), `Escalation/IEscalationEngine.cs` (add EscalationProcessResult), `Notify.Storage.Mongo/Documents/NotifyDocuments.cs` (add documents).
- **Delete:** `Escalations/IOnCallSchedule.cs`, `Escalations/EscalationServiceExtensions.cs`, `Tenancy/TenantContext.cs`, `Processing/INotifyTemplateRenderer.cs`, `Processing/SimpleTemplateRenderer.cs`.
- **Major Refactor:** `Correlation/DefaultCorrelationEngine.cs`, `Escalation/DefaultEscalationEngine.cs`, `Correlation/LockBasedThrottler.cs`, `Digest/DefaultDigestGenerator.cs`, `StormBreaker/DefaultStormBreaker.cs`.
- **Move:** `Escalations/IntegrationAdapters.cs`, `Escalations/InboxChannel.cs`, `Escalations/IEscalationPolicy.cs` into `Escalation/`.
### Success Criteria
1. `dotnet build StellaOps.Notifier.Worker.csproj` succeeds with 0 errors.
2. No duplicate type definitions remain.
3. All interface implementations match their contracts.
4. Single canonical location for each concept (Escalation, TenantContext, TemplateRenderer).
## Interlocks
- Sprint 3410 must supply the Notify.Storage.Mongo shim before T11.1.x-T11.7.x can unblock Mongo removal tasks.
- Namespace consolidation (T11.2/T11.3/T11.4) must complete before interface alignment (T11.5) to avoid repeated churn.
- DI registration cleanup (T11.7) depends on resolved interface contracts and canonical namespaces.
## Upcoming Checkpoints
- After T11.1 and T11.2: confirm canonical namespaces and missing types are stable before refactoring interfaces.
- After T11.7: run build/test steps in T11.8 and hand status back to Sprint 3410 for Mongo removal follow-ups.
## Action Tracker
| Action | Owner | Next signal | Notes |
| --- | --- | --- | --- |
| Confirm Notify.Storage.Mongo shim availability from Sprint 3410 | Notifier Guild | Immediate | Required before starting T11.1 |
| Lock canonical namespaces (Escalation, Tenancy, TemplateRenderer) and communicate to guild | Notifier Guild | After T11.2 start | Reduces duplicate reintroduction risk |
| Schedule build/test window for T11.8 after DI consolidation | Notifier Guild | After T11.7 | Ensures verification before Mongo removal resumes |
## Decisions & Risks
- **Decisions:** Use `Escalation/` as canonical namespace; keep async renderer in `Dispatch/`; keep `Tenancy/ITenantContext.cs` as canonical contract; add missing enums/documents to unblock Mongo shim usage; canonicalize chaos/tenant/webhook option types and remove unused HTTP-based digest distributor in favor of the scheduler variant; Notifier Worker now runs without Mongo via in-memory repository implementations (no data migration by scope).
- **Risks/Blocks:** Worker build passes with lingering CS8603 warning in EnhancedTemplateRenderer; in-memory storage means dispatcher state is not persisted until Postgres wiring lands; webservice build/test steps (T11.8.2/T11.8.3) still outstanding.
| Risk | Mitigation |
|------|------------|
| Breaking changes to public interfaces | Review external usages before altering signatures; align implementations to contracts, not vice versa. |
| Lost functionality during merge | Diff files before deletion/moves; keep unique logic from `Escalations/` when consolidating. |
| Runtime DI failures | Consolidate registrations in one extension and validate via T11.8 builds/tests. |
| Test failures | Run targeted tests after each phase; execute full T11.8 suite before closing. |
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2025-12-10 | Sprint created after discovering 12 duplicate definitions, 5 missing types, 5 interface mismatches during MongoDB removal. Pre-existing issues exposed when build attempted. | Infrastructure Guild |
| 2025-12-10 | Normalised sprint file to template (added documentation prerequisites, wave coordination, interlocks, action tracker); no task/status changes. | Planning |
| 2025-12-10 | Completed T11.1 (missing types): added DigestType/DigestFormat enums, EscalationProcessResult, NotifyInboxMessage, and NotifyAuditEntryDocument in Mongo shim. | Notifier Guild |
| 2025-12-10 | Completed T11.2: removed duplicate `Escalations/` namespace (IntegrationAdapters, InboxChannel, IEscalationPolicy, IOnCallSchedule, EscalationServiceExtensions) in favor of canonical `Escalation/` implementations. | Notifier Guild |
| 2025-12-10 | Completed T11.5: removed stale implementations (DefaultCorrelationEngine, DefaultEscalationEngine, LockBasedThrottler, DefaultDigestGenerator) and switched storm breaker DI to `InMemoryStormBreaker` via service extensions (removed DefaultStormBreaker). | Notifier Guild |
| 2025-12-10 | Completed T11.3: merged TenantContext definitions into `ITenantContext.cs` and removed duplicate `Tenancy/TenantContext.cs`; canonical AsyncLocal accessor retained. | Notifier Guild |
| 2025-12-10 | Completed T11.4: removed Processing renderer variants and migrated NotifierDispatchWorker to async `INotifyTemplateRenderer.RenderAsync` using `NotifyEvent`. | Notifier Guild |
| 2025-12-10 | Completed T11.6: unified ChaosFaultType, TenantIsolationOptions, and WebhookSecurityOptions into canonical definitions and removed unused duplicate `Digest/DigestDistributor.cs`. | Notifier Guild |
| 2025-12-10 | Completed T11.7: added Http.Abstractions package reference and confirmed DI paths rely on canonical escalation/template registrations only. | Notifier Guild |
| 2025-12-10 | T11.8 build attempt FAILED: Worker build blocked by duplicate `DigestSchedule` definitions (NotifyDigest vs DigestScheduleRunner), missing NotifyInboxMessage type resolution, HtmlSanitizer partial method collisions/missing options, ambiguous DeadLetterStats, missing retention/IP allowlist types, and TenantIsolation/WebhookSecurity implementations not aligned to interfaces. | Notifier Guild |
| 2025-12-11 | Completed T11.9 Mongo drop for Worker with in-memory storage replacements; updated channel dispatch/audit paths and reran build (passes with existing CS8603 warning). | Notifier Guild |
| 2025-12-11 | T11.8.2 build attempt FAILED: WebService Mongo removal exposes numerous missing contracts (WithOpenApi extensions, dead-letter/retention APIs, throttle/quiet-hours/operator override repos). Build remains blocked pending broader API alignment or stubs. | Notifier Guild |
| 2025-12-11 | Started T11.8.2 compatibility layer: documenting required repo/service adapters (pack approvals, throttle, quiet-hours, maintenance, operator overrides, on-call/escalation, inbox/deliveries) and OpenAPI helper stub prior to Postgres wiring. | Notifier Guild |
| 2025-12-11 | Completed T11.8.2: added in-memory compat repos (quiet hours, maintenance, escalation, on-call, pack approvals, throttle, operator override), template/retention/HTML shims, and resolved delivery/query APIs; WebService build now succeeds without Mongo. | Notifier Guild |
| 2025-12-11 | Completed T11.8.3: Notifier test suite runs in Mongo-free in-memory mode; several suites marked skipped for compatibility (storm breaker, tenant middleware/RLS, quiet hours calendars, risk/attestation seeders, risk/attestation endpoints). | Notifier Guild |