# Consolidation Decision Ledger > **Last updated:** 2026-03-04 > **Owner:** Sprint 218 (DOCS: Consolidation Decision Finalization) > **Wave:** Microservices Consolidation Wave 1 (Feb-Mar 2026) This document records the final outcome of every consolidation sprint in the first consolidation wave. Each sprint was evaluated for source-level consolidation (moving source directories under a parent module) and schema-level consolidation (merging DbContexts). In all cases where consolidation proceeded, only source consolidation was executed; schema merges were rejected to preserve security boundaries and avoid blast-radius expansion. --- ## Outcome Legend | Outcome | Meaning | |---------|---------| | **Proceed (done)** | Source consolidation completed. Code moved under parent module. | | **Boundary-preserved** | Evaluated and deliberately kept as separate modules. No consolidation. | | **Deferred** | Consolidation approved in principle but deferred to a future wave. | | **Canceled** | Consolidation evaluated and rejected. Will not proceed. | | **No-op** | Not applicable to the consolidation wave. | | **Completed separately** | Work done outside the consolidation wave. | --- ## Complete Outcome Table | Sprint | ID | Description | Outcome | Sprint File | |--------|----|-------------|---------|-------------| | Gateway deletion | 200 | Delete `src/Gateway/`; Router is canonical | **Proceed (done)** | [`SPRINT_20260225_200_Platform_gateway_deletion.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_200_Platform_gateway_deletion.md) | | Scanner absorb Cartographer | 201 | Move Cartographer under Scanner | **Proceed (done)** | [`SPRINT_20260225_201_Scanner_absorb_cartographer.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_201_Scanner_absorb_cartographer.md) | | BinaryIndex absorb Symbols | 202 | Move Symbols under BinaryIndex | **Proceed (done)** | [`SPRINT_20260225_202_BinaryIndex_absorb_symbols.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_202_BinaryIndex_absorb_symbols.md) | | Concelier absorb Feedser/Excititor | 203 | Move Feedser and Excititor under Concelier | **Proceed (done)** | [`SPRINT_20260225_203_Concelier_absorb_feedser_excititor.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_203_Concelier_absorb_feedser_excititor.md) | | Attestor absorb Signer/Provenance | 204 | Move Signer and Provenance under Attestor | **Proceed (done)** | [`SPRINT_20260225_204_Attestor_absorb_signer_provenance.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_204_Attestor_absorb_signer_provenance.md) | | VEX consolidation (VexHub/VexLens) | 205 | Consolidate VexHub and VexLens | **Deferred** -- future wave | _(no sprint file; deferred before sprint creation)_ | | Policy/Unknowns boundary | 206 | Evaluate Policy absorbing Unknowns | **Boundary-preserved** | [`SPRINT_20260225_206_Policy_absorb_unknowns.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_206_Policy_absorb_unknowns.md) | | Findings absorb RiskEngine/VulnExplorer | 207 | Move RiskEngine and VulnExplorer under Findings | **Proceed (done)** | [`SPRINT_20260225_207_Findings_absorb_riskengine_vulnexplorer.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_207_Findings_absorb_riskengine_vulnexplorer.md) | | Orchestrator absorb Scheduler/TaskRunner/PacksRegistry | 208 | Move Scheduler, TaskRunner, PacksRegistry under Orchestrator | **Proceed (done)** | [`SPRINT_20260225_208_Orchestrator_absorb_scheduler_taskrunner_packsregistry.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_208_Orchestrator_absorb_scheduler_taskrunner_packsregistry.md) | | Notify/Notifier boundary | 209 | Evaluate Notify absorbing Notifier | **Boundary-preserved** | [`SPRINT_20260225_209_Notify_absorb_notifier.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_209_Notify_absorb_notifier.md) | | Timeline absorb TimelineIndexer | 210 | Move TimelineIndexer under Timeline | **Proceed (done)** | [`SPRINT_20260225_210_Timeline_absorb_timelineindexer.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_210_Timeline_absorb_timelineindexer.md) | | ExportCenter/AirGap boundary | 211 | Evaluate ExportCenter absorbing Mirror and AirGap | **Boundary-preserved** | [`SPRINT_20260225_211_ExportCenter_absorb_mirror_airgap.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_211_ExportCenter_absorb_mirror_airgap.md) | | Tools absorb Bench/Verifier/Sdk/DevPortal | 212 | Move Bench, Verifier, Sdk, DevPortal under Tools | **Proceed (done)** | [`SPRINT_20260225_212_Tools_absorb_bench_verifier_sdk_devportal.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_212_Tools_absorb_bench_verifier_sdk_devportal.md) | | AdvisoryAI absorb OpsMemory | 213 | Move OpsMemory under AdvisoryAI | **Proceed (done)** | [`SPRINT_20260225_213_AdvisoryAI_absorb_opsmemory.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_213_AdvisoryAI_absorb_opsmemory.md) | | Integrations absorb Extensions | 214 | Move Extensions under Integrations | **Proceed (done)** | [`SPRINT_20260225_214_Integrations_absorb_extensions.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_214_Integrations_absorb_extensions.md) | | SmRemote standalone | 215 | SmRemote standalone evaluation | **No-op** in consolidation wave | _(no sprint file; SmRemote remains standalone)_ | | Authority absorb IssuerDirectory | 216 | Move IssuerDirectory under Authority | **Proceed (done)** | [`SPRINT_20260225_216_Authority_absorb_issuerdirectory.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_216_Authority_absorb_issuerdirectory.md) | | Orphan library cleanup | 217 | Archive AdvisoryLens and Resolver | **Proceed (done)** | [`SPRINT_20260225_217_Platform_orphan_library_cleanup.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_217_Platform_orphan_library_cleanup.md) | | Consolidation docs finalization | 218 | Final documentation sweep | **Proceed (done)** | [`SPRINT_20260225_218_DOCS_consolidation_final_update.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_218_DOCS_consolidation_final_update.md) | | EF compiled model generation | 219 | EF compiled model pre-requisite | **Completed separately** | _(completed outside consolidation wave)_ | | SbomService absorption | 220 | Evaluate SbomService merge | **Canceled** -- decision not to merge | _(canceled before sprint creation)_ | | Orchestrator domain rename | 221 | Rename Orchestrator to JobEngine | **Proceed (done)** | [`SPRINT_20260225_221_Orchestrator_domain_rename.md`](../../docs-archived/implplan/2026-03-04-completed-sprints/SPRINT_20260225_221_Orchestrator_domain_rename.md) | --- ## Schema Merge Decisions (All Rejected) Every consolidation sprint evaluated whether DbContexts should be merged in addition to source consolidation. In all cases, schema merges were **rejected**. The common rationale: merging DbContexts widens the blast radius of credential compromise and couples unrelated write patterns. | Domain | Decision | Rationale | |--------|----------|-----------| | Orchestrator + Scheduler | No merge | `OrchestratorDbContext` (39 entities) and `SchedulerDbContext` (11 entities) have `Jobs`/`JobHistory` name collisions with incompatible semantics. | | Authority + IssuerDirectory | No merge | `AuthorityDbContext` manages passwords, MFA, tokens. Merging would expose authentication internals to issuer metadata code paths. | | Concelier + Excititor + Feedser | No merge | Three DbContexts (49 entities, 5 schemas) have distinct write lifecycles. Schema isolation is a feature. | | Attestor + Signer | No merge | Security boundary between key material and attestation evidence is deliberate. | | Policy + Unknowns | No merge | `UnknownsDbContext` retains independent schema ownership. Boundary preserved. | | ExportCenter + AirGap | No merge | AirGap has 14+ external consumers vs ExportCenter's 2. Asymmetric coupling makes merge a poor tradeoff. | | SbomService | Canceled | Decision not to merge SbomService into any other module. | --- ## Post-Consolidation Module Layout After all consolidation sprints, the canonical module layout is: | Module | Source Path | Notes | |--------|------------|-------| | Authority | `src/Authority/` | Now includes IssuerDirectory (Sprint 216) | | Scanner | `src/Scanner/` | Now includes Cartographer (Sprint 201) | | BinaryIndex | `src/BinaryIndex/` | Now includes Symbols (Sprint 202) | | Concelier | `src/Concelier/` | Now includes Feedser and Excititor (Sprint 203) | | Attestor | `src/Attestor/` | Now includes Signer and Provenance (Sprint 204) | | Findings | `src/Findings/` | Now includes RiskEngine and VulnExplorer (Sprint 207) | | JobEngine | `src/JobEngine/` | Now includes Scheduler, TaskRunner, PacksRegistry (Sprint 208); renamed from Orchestrator (Sprint 221) | | Timeline | `src/Timeline/` | Now includes TimelineIndexer (Sprint 210) | | Tools | `src/Tools/` | Now includes Bench, Verifier, Sdk, DevPortal (Sprint 212) | | AdvisoryAI | `src/AdvisoryAI/` | Now includes OpsMemory (Sprint 213) | | Integrations | `src/Integrations/` | Now includes Extensions (Sprint 214) | ### Preserved Boundaries (no consolidation) | Module A | Module B | Sprint | Rationale | |----------|----------|--------|-----------| | Policy | Unknowns | 206 | Distinct domain ownership, separate DbContexts | | Notify | Notifier | 209 | Library vs. host application boundary | | ExportCenter | AirGap | 211 | Asymmetric coupling, blast radius | ### Deleted / Archived | Item | Sprint | Action | |------|--------|--------| | `src/Gateway/` | 200 | Deleted (Router is canonical) | | AdvisoryLens library | 217 | Archived | | Resolver library | 217 | Archived | ### Deferred / Canceled | Item | Sprint | Status | |------|--------|--------| | VexHub/VexLens consolidation | 205 | Deferred to future wave | | SbomService absorption | 220 | Canceled | | SmRemote | 215 | No-op (remains standalone) |