Microservice → database ownership matrix

Status: evidence inventory (current state verified 2026-07-22) + Accepted target (ADR-039 rev-4, owner-approved 2026-07-22). Sources: devops/compose/docker-compose.stella-services.yml, live stellaops-postgres catalog (read-only), AddStartupMigrations sweep over src/, docs/agent-playbooks/data-and-stores.md. src/ wins over this document; rows marked (verify) lack a confirmed code anchor.

1. Current physical reality (measured 2026-07-22)

2. Deployable → schema matrix

Replica sets (web/worker/init of one service) are one row — they legitimately share the owner database. Wave = adoption wave from ADR-039 (1 = vulnerability plane now, 2 = large/high-churn next, 3 = small batch moves). Risk = migration risk of the move itself.

Deployable(s) (compose)Schemas written todayMigration assembly (AddStartupMigrations)CategoryProposed database / role (stellaops_*)ClusterWaveRisk
platformplatform, sharedPlatform.Databasecontrol planeplatform — DB name stays stellaops_platform(owner correction 2026-07-22; keeps shared.tenants while the resolver contract stands)control— (stays)low
authorityauthority (own DB already)Authority.Persistencecontrol planeauthority (done — the precedent)controldone
concelier (+ concelier-jobs-init) → merges into StellaOps.Vulnerabilitiesconcelier (sources/DTOs/jobs), vuln canonical advisory tables + issue_observations/_evidence_refs/_linksets (global consensus)Concelier.Storage → Vulnerabilities.Persistencedata plane (hub)vuln(single hub DB stellaops_vuln, ADR-039 D2; fresh build, no data moved — D7)vulndata1rename + rebuild, no data migration
concelier (today’s serving role) — vuln.issue_gate_decisions + rebuild queueper-tenant gate projectionConcelier.Storage (today)control plane (tenant decisions)moves to policy— Policy-owned projection fed by hub events (ADR-039 D3)control1rebuilt by Policy projector
excititor-web + excititor-worker → merges into StellaOps.Vulnerabilitiesvex (claims, raw blobs/documents, product dedup, checkpoints, quarantine)Excititor.Persistence → Vulnerabilities.Persistencedata plane (hub)vulnvulndata1rename + rebuild
vexhub-web → merges into StellaOps.Vulnerabilitiesvexhub (statements, sources, provenance, conflicts) — rows currently written by Excititor’s sink, not by VexHubVexHub.Persistence → Vulnerabilities.Persistence (dist schema)data plane (distribution view, rebuildable)vulnvulndata1rename + rebuild
scanner-web + scanner-worker (+ cache-init)scanner (106 tables, 2.1 GB)Scanner.Storagedata planescannercontrol2medium
advisory-ai-web + advisory-ai-worker (+ data-init)advisoryaiAdvisoryAI hostingdata planeadvisoryaicontrol2low
opsmemory-webopsmemoryOpsMemorycontrol planeopsmemorycontrol3low
timeline-webtimeline (+ timeline_app)Timeline persistenceevidence/read-modeltimelinecontrol2low
notify-webnotify (+ notify_app)Notify.Persistencecontrol planenotifycontrol2low
notifier-workernotifier (verify: compose points notifier__storage__postgres at shared DB; live schema is empty)(verify)control planenotifier (or fold into notify if same service — decide in Wave 2)control2low
policy-enginepolicy (+ policy_app); plus foreign writes: scheduler (via its scheduler connection), release.security_finding_projection (verify writer path); foreign read: vuln.issue_gate_decisionsPolicy.Persistencecontrol planepolicycontrol2medium (contracts, not size)
scheduler-webscheduler (+ scheduler_app)Scheduler.Persistence (JobEngine)control planeschedulercontrol2low
release-orchestrator (+ agent-ca-init)release (83 tables), release_orchestrator, release_orchestrator_agent, scriptsReleaseOrchestrator(+.Environment)control planerelease_orchestrator (all four schemas)control3medium (Platform/Policy seams)
agent-core(verify — likely none / registry cache volumes)control plane3low
attestor (+ tileproxy, tsa)attestor, proofchainAttestor.Persistenceevidenceattestorcontrol3low
signersigner, crypto (CredentialStore shared lib)Signer.KeyManagement + CredentialStorecontrol planesigner (crypto schema instantiates per host DB per ADR-039 P4)control3low
evidence-locker-web + workerevidence_locker (+ _app)EvidenceLocker persistenceevidenceevidence_lockercontrol3low
findings-ledger-webfindingsFindings ledger persistencedata planefindingscontrol3low
riskengine-web + workerriskengineRiskEnginedata planeriskenginecontrol3low
findings-security-webfindings_securityFindings.Security.Persistenceread-modelfindings_securitycontrol3low
findings-vulncorrelationanalyticsFindings.VulnCorrelation.Persistenceread-modelvulncorrelationcontrol3low
signalssignalsSignals.Persistencedata planesignalscontrol3low
sbomservicesbomSbomService.Persistencedata planesbomservicecontrol3low
graph-apigraphGraph.Indexer.Persistencedata planegraphcontrol3low
reachgraph-webreachgraphReachGraph.Persistencedata planereachgraphcontrol3low
binaryindex-webbinaries, binary_index, golden_sets(runtime — BinaryIndex.WebService/Program.cs:48 auto-migrates it via AddStartupMigrations; previously mislabeled bench, round-20 correction)BinaryIndex persistencedata planebinaryindexcontrol3low
symbolssymbolsSymbols runtime persistencedata planesymbolscontrol3low
export-web + export-workerexport_center (+ _app)ExportCenter persistencecontrol planeexport_centercontrol3low
replay-webreplayReplay.WebServiceevidencereplaycontrol3low
integrations-webintegrationsIntegrations.Persistencecontrol planeintegrationscontrol3low
packsregistry-web + workerpacksPacksRegistry.Persistencecontrol planepacksregistrycontrol3low
doctor-web (+ evidence-init)doctorDoctor persistenceopsdoctorcontrol3low
issuer-directoryissuerIssuerDirectory persistencecontrol planeissuer_directorycontrol3low
vexlens-webvexlensVexLens persistenceread-modelvexlenscontrol3low
airgap-controllerairgapAirGap persistencecontrol planeairgapcontrol3low
registry-tokenregistry_tokenRegistry token persistencecontrol planeregistry_tokencontrol3low
unknowns-webunknowns (schema not yet present live)Unknowns.Persistencedata planeunknownscontrol3low
replay/tester, workflow host (verify — workflow schema, 10 tables, host unconfirmed)workflowWorkflow.DataStore.PostgreSQLcontrol planewith its host servicecontrol3low
bench/tools (non-runtime)groundtruth, publicfixtures/benchout of runtime scope; must not block waves (golden_sets moved to the binaryindex-web row — it is runtime; round-20 correction)3low

Notes:

3. Cross-service SQL inventory (violations to burn down)

#Consumer → targetKindEvidenceDisposition (target, ADR-039 rev-2)
X1Excititor worker → vuln.issue_observations/_evidence_refs/_linksetsDELETE (destructive, cross-owner)src/Concelier/StellaOps.Excititor.Worker/Scheduling/VexRetentionSweepService.cs:111-130Freeze now (D6); disappears entirely with consolidation — v2 has no retention sweep at all
X2Excititor (web+worker) → vexhub.statementswrite (cross-owner)src/Concelier/__Libraries/StellaOps.Excititor.Persistence/Postgres/VexHub/PostgresVexHubProjectionSink.cs:461-487Becomes internal to StellaOps.Vulnerabilities (D2): a rebuildable dist projection driven by the hub outbox
X3Policy engine → vuln.issue_gate_decisions + vuln.advisory_affected(matcher rows via VulnMatch.Core/IAdvisoryRowSource)readsrc/Policy/StellaOps.Policy.Engine/Services/PostgresFindingsLookup.cs:1083,1135 (+ advisory_affected reads; src/__Libraries/StellaOps.VulnMatch.Core/IAdvisoryRowSource.cs)Killed by D3 + DC-30 v2: gates → Policy-owned projection fed by hub events; matcher rows → the generation-stamped compact corpus artifact consumed via VulnDb.Compact (one artifact for every matcher host, online = offline); no cross-DB read remains (P15); no advisory-row tables outside the hub
X4CLI compact vuln-db export → vuln.issue_gate_decisionsvuln.issue_linksetsread (cross-DB JOIN)src/Cli/StellaOps.Cli/Commands/VulnDb/PostgresCompactVulnDbCorpusSource.cs:126-164Killed by D3: CLI reads the hub’s global corpus-export API (the export is global data; reading tenant gates was a category error)
X5CLI mirror-seed / archive rebuild → concelier/vulnwrite (ops tool as owner)src/Cli/StellaOps.Cli/Commands/MirrorSeedCommandGroup.cs:472,547; src/Concelier/__Libraries/StellaOps.Concelier.Persistence/Postgres/MirrorSeed/*Becomes the hub’s mirror import/export plugins (D2); the CLI drives the hub API, never SQL
X6Authority → shared.tenants (platform DB)writesrc/Authority/StellaOps.Authority/StellaOps.Authority/Tenants/SharedTenantsPropagation.cs:397 (falls back to STELLAOPS_POSTGRES_CONNECTION)Killed by D10: Authority is sole tenancy owner in stellaops_authority; shared.tenants becomes an event-carried replica or is retired; Authority never touches the platform DB
X7Authority → platform DB (IdP provider import)readcompose docker-compose.stella-services.yml:507Killed by D10: IdP configuration is Authority-owned (completes the SPRINT_20260718_006 direction)
X8Policy engine → scheduler schemawrite via Scheduler.Persistence clientcompose docker-compose.stella-services.yml:1751-1752Wave 2 decision: JobEngine API/queue, or the scheduler client persists into Policy’s own DB (P4) (verify current semantics first)
X9corrected (dig 2026-07-22): all projection code lives in StellaOps.Findings.Security.* (owns findings_security.security_finding_projection); the release.-schema copy (574 rows) has no code writer found — suspected legacy duplicategrep sweep 2026-07-22; live row countsFindings copy → owned by 010; release. copy → confirm + retire in SPRINT_20260722_018 RO-1
X10Doctor DB checks → many schemasread-only monitoringsrc/__Libraries/StellaOps.Doctor.Plugins.Database/Checks/DatabaseCheckBase.cs:17Killed by D11/P11: doctor checks become plugins hosted inside each service; Doctor aggregates via APIs and holds no cross-DB connections. Doctor also reads shared.tenants directly (SharedTenantsDoctorTenantCatalog) — dies with the 009 retirement
X11Findings.Security → scanner.*read (SQL joins)src/Findings/__Libraries/StellaOps.Findings.Security.Persistence/Stores/SecurityFindingProjectionStore.cs (FROM scanner.)Disposition in SPRINT_20260722_010 (owner API / event-carried projection) before Scanner’s grant revocation (017)
X12Integrations → scanner.*readsrc/Integrations/StellaOps.Integrations.WebService/PostgresRegistryImageSeverityCountProvider.csDisposition in SPRINT_20260722_024 before 017’s revocation
X13Policy → scanner.*readsrc/Policy/StellaOps.Policy.Engine/Services/PostgresFindingsLookup.csDisposition with the 007 lookup replacement (same file as X3)
X14Every tenant-resolving service → shared.tenantsread via shared librarysrc/Authority/StellaOps.Authority/StellaOps.Auth.ServerIntegration/Tenancy/StellaOpsTenantResolver.cs (ADR-010); direct readers: IssuerDirectory, DoctorThe library mechanism is built once in SPRINT_20260722_027 (replica tables per host DB, dual-mode rollout; covers shared.actor_identity too); 016 lands the tenants producer
X15platform-web migrates ~23 foreign schemas (central migrator)cross-service DDL/migrationssrc/Platform/__Libraries/StellaOps.Platform.Database/MigrationModulePlugins.cs — 24 IMigrationModulePlugin entries (airgap, authority, binaries, evidence, evidence_locker, export_center, graph, integrations, issuer, notify, packs, policy, proofchain, reachgraph, release_orchestrator, remediation, sbom, scheduler, signer, timeline×2, unknowns, workflow, + platform’s own). Explains the 0-byte shell schemas and X9’s origin (archived mig061/Release/050_SecurityDispositionProjection.sql). Runtime faces: PlatformMigrationAdminService + /api/v1/admin/* (incl. seed-demo), CLI MigrationCommandService manual applierDC-26: each program deletes its plugin in the same change as its DB move (recipe S3/M1); the mechanism + runtime faces retire early in SPRINT_20260722_026; 021 PLT-4 final sweep
X16ReleaseOrchestrator ⇄ platform-schema plugin-registry tablesread/write via shared librarysrc/Plugin/StellaOps.Plugin.Registry/PostgresPluginRegistry.cs; consumers: ReleaseOrchestrator.WebApi/Program.cs, ReleaseOrchestrator.Plugin/Registry/ConnectorRegistry.cs; migrated by Platform’s PluginRegistryMigrationModulePluginP4 pattern (019 SGN-2): Plugin.Registry instantiates its tables in the host’s own DB (RO’s registry → stellaops_release_orchestrator, in 018); Platform keeps its own instance; the central plugin entry dies with DC-26
X17Eventing producers → timeline.outbox/timeline.eventswrite via shared librarysrc/__Libraries/StellaOps.Eventing (EventingDbContext.cs:35,69ToTable("events"/"outbox", schemaName)); hosts: VexLens, Findings-Ledger, Concelier (Feedser.Core), Timeline; schema centrally migrated (X15 EventingMigrationModulePlugin)DC-29: P6 is delivered by evolving StellaOps.Eventing — per-host outbox tables (P4), DC-06 envelope, new inbox/lease/fencing; Timeline becomes a stream consumer via the existing ITimelineStreamBridge; shared-DB tables retire with the producers’ moves
X18Findings.Security → vuln.* (heavy)read (SQL joins)SecurityFindingProjectionStore.cs + AggregatedRiskStatusService.cs join vuln.sbom_canonical_match, vuln.sbom_registry, vuln.advisory_canonical, vuln.advisories, vuln.advisory_cvss, vuln.kev_flags(the exploited-flag reader)Disposition (010 + DC-30): advisory/CVSS/exploited data → corpus artifact + hub events; sbom_registry + sbom_canonical_match are artifact-scoped match RESULTS, not global knowledge — they move to the Findings family’s ownership (control plane), never into the tenant-free hub
X19SbomService → vuln.sbom_canonical_matchwrite (BYOS upload “produces real vuln.sbom_canonical_match rows”, SbomUploadService.cs:179)src/SbomService/StellaOps.SbomService/Services/SbomUploadService.csDies with the X18 re-homing: SbomService publishes an sbom.uploaded event; match computation runs on the corpus artifact in the Findings family (010); Scanner’s historical involvement (Scanner.WebService/Program.cs:1279 comment “Scanner no longer…”) confirmed in 017 S0
X20Scanner.Worker → ReachGraphwrite (HTTP publisher)Scanner.Worker/Processing/Reachability/Publishers/HttpReachGraphPublisher.cs posts ReachGraphMinimal to POST /v1/reachgraphs when ScannerWorkerOptions.PublishToReachGraph is true (base URL option, e.g. http://reachgraph:8080); stage: ReachabilityPublishStageExecutor023 merge preserves the POST /v1/reachgraphs contract + keeps the reachgraph network alias during transition; Scanner repoints its base-URL option at its next deploy (coordinate with 017); contract test pins the writer alongside the two pinned readers

Approved read-contract register (ADR-039 P5): transitional only — X6/X7 until D10 lands, X10 until D11 lands, X8/X9 until their Wave-2 dispositions. The target register is empty. New entries require an ADR-039 amendment.

4. Shared-fallback burn-down

Code that resolves STELLAOPS_POSTGRES_CONNECTION outside Platform (must fail closed instead — ADR-039 P3): Authority SharedTenantsPropagation.cs:397; CLI MigrationCommandService.cs:408 and MirrorSeedCommandGroup.cs:547; every compose service env described in §1. The conformance test in ADR-039 P10 pins this list and fails on additions.

5. Full rename map — every container: current → target

Legend: unchanged = same name/src path. (verify) = project name not yet confirmed against a code anchor — the owning program’s S0 task confirms it. D12 DAL renames (…Storage/…DatabaseStellaOps.<Service>.Persistence) land with each service’s own wave, never out-of-band. “shared DB” = stellaops_platform (name kept — owner correction 2026-07-22; the bare stellaops name applies at the container/instance level, aligned at endgame per SPRINT_20260722_021 PLT-2).

5.1 Vulnerabilities program (sprints 003–008)

Current microserviceSrc pathDB project(s) usedDB usedNew microserviceNew src pathNew DB projectNew DB
concelier (+ concelier-jobs-init)src/Concelier/StellaOps.Concelier.WebServiceStellaOps.Concelier.Persistenceshared DB (concelier, vuln)StellaOps.Vulnerabilities (vulnerabilities-web/-worker)src/Vulnerabilities/StellaOps.Vulnerabilities.Persistencestellaops_vuln
excititor-web + excititor-workersrc/Concelier/StellaOps.Excititor.WebService / .WorkerStellaOps.Excititor.Persistenceshared DB (vex)merged ↑src/Vulnerabilities/merged ↑stellaops_vuln
vexhub-websrc/VexHub/StellaOps.VexHub.Persistenceshared DB (vexhub)merged ↑ (dist schema)src/Vulnerabilities/merged ↑stellaops_vuln
vexlens-websrc/VexLens/VexLens persistence (verify)shared DB (vexlens)folds into Vulnerabilities (hub close-out evaluation)src/Vulnerabilities/merged ↑stellaops_vuln
— (EPSS data only)src/Scanner/ EPSS connector tablesStellaOps.Scanner.Storageshared DB (scanner.epss_*, ~2.05 GB)data relocates to the hub (P14); Scanner keeps no EPSS tablesStellaOps.Vulnerabilities.Persistencestellaops_vuln

5.2 Family merge programs (sprints 010–016)

Current microserviceSrc pathDB project(s) usedDB usedNew microserviceNew src pathNew DB projectNew DB
findings-ledger-websrc/Findings/StellaOps.Findings.Ledger.WebServiceStellaOps.Findings.Ledger (library w/ migrations)shared DB (findings)StellaOps.Findings (findings-web/-worker)src/Findings/StellaOps.Findings.WebService/.WorkerStellaOps.Findings.Persistencestellaops_findings
riskengine-web + riskengine-workersrc/Findings/StellaOps.RiskEngine.WebService/.WorkerStellaOps.RiskEngine.Core (store wired in WebService)shared DB (riskengine)merged ↑ (scoring = worker role)merged ↑stellaops_findings
findings-security-websrc/Findings/StellaOps.Findings.Security.WebServiceStellaOps.Findings.Security.Persistenceshared DB (findings_security)merged ↑merged ↑stellaops_findings
findings-vulncorrelationsrc/Findings/StellaOps.Findings.VulnCorrelation.WebServiceStellaOps.Findings.VulnCorrelation.Persistenceshared DB (analytics)merged ↑merged ↑stellaops_findings
attestorsrc/Attestor/StellaOps.Attestor.WebServiceAttestor.Persistence (ProofChainDbContext)shared DB (attestor, proofchain)StellaOps.Evidence (owner-widened, 011)src/Evidence/StellaOps.Evidence.Persistencestellaops_evidence
attestor-tileproxysrc/Attestor/StellaOps.Attestor.TileProxyrole of StellaOps.Evidence
tsainfra container from devops/docker/tsa/ (openssl RFC3161 — no .NET host)tsa-data volumeinfra role of StellaOps.Evidencedevops/docker/tsa/
evidence-locker-web + workersrc/EvidenceLocker/StellaOps.EvidenceLocker (one project; web+worker = role containers)migrations embedded in StellaOps.EvidenceLocker(.Infrastructure)shared DB (evidence_locker)merged into StellaOps.Evidence (011)src/Evidence/merged ↑stellaops_evidence
scheduler-websrc/JobEngine/StellaOps.Scheduler.WebService (+ Worker.Host)StellaOps.Scheduler.Persistenceshared DB (scheduler)StellaOps.JobEngine (jobengine-web/-worker)src/JobEngine/StellaOps.JobEngine.WebService/.WorkerStellaOps.JobEngine.Persistencestellaops_jobengine
packsregistry-web + packsregistry-workersrc/JobEngine/StellaOps.PacksRegistryStellaOps.PacksRegistry.Persistenceshared DB (packs)merged ↑merged ↑stellaops_jobengine
advisory-ai-web + advisory-ai-workersrc/AdvisoryAI/StellaOps.AdvisoryAI.WebService/.WorkerAdvisoryAI hosting migrations (verify)shared DB (advisoryai)StellaOps.AdvisoryAI (advisoryai-web/-worker)same module, consolidated hostsStellaOps.AdvisoryAI.Persistencestellaops_advisoryai
opsmemory-websrc/AdvisoryAI/StellaOps.OpsMemory.WebServiceStellaOps.OpsMemoryshared DB (opsmemory)merged ↑ (module)merged ↑stellaops_advisoryai
binaryindex-websrc/BinaryIndex/StellaOps.BinaryIndex.WebService (+ .Worker)StellaOps.BinaryIndex.Persistenceshared DB (binaries, binary_index)dissolves into the hub (DC-33): connector family + binary fact class + artifact content + internal VEX deriver; deployable retiressrc/Vulnerabilities/hub persistencestellaops_vuln
symbolssrc/BinaryIndex/StellaOps.Symbols.Serversymbols runtime persistenceshared DB (symbols)hub-adjacent global CAS (catalog in hub; blobs → object store, P16); deployable retiressrc/Vulnerabilities/hub persistencestellaops_vuln
notify-websrc/Notify/StellaOps.Notify.WebServiceStellaOps.Notify.Persistenceshared DB (notify)StellaOps.Notify (notify-web/-worker)src/Notify/StellaOps.Notify.Persistence (kept)stellaops_notify
notifier-workersrc/Notifier/StellaOps.Notifier/StellaOps.Notifier.WebService + .Worker (only worker deployed)own schema live-empty; hosts a crypto CredentialStore instanceshared DB (notifier, empty)merged ↑ (worker role); src/Notifier/ deletedsrc/Notify/merged ↑stellaops_notify
issuer-directorysrc/Authority/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.WebServiceIssuerDirectory.Infrastructureshared DB (issuer)role of StellaOps.Authority (S0 decision on container shape)src/Authority/StellaOps.Authority.Persistencestellaops_authority
authoritysrc/Authority/StellaOps.AuthorityStellaOps.Authority.Persistencestellaops_authority (already own DB)unchanged + D10 (tenants/IdP sole owner; zero platform-DB access)unchangedunchangedstellaops_authority

5.3 Same service, new database (Waves 2–3; D12 DAL rename where deviating)

Owning programs: Scanner → SPRINT_20260722_017; ReleaseOrchestrator → 018; Signer → 019; Platform → 021 (endgame); Graph+ReachGraph → 023; Integrations+registry-token → 024; EvidenceLocker → 011; doctor-web → retirement via 009; remediation → archived; ExportCenter + AirGap (+ Mirror.Creator) → 025 (OfflineKit, owner-approved); every other row → SPRINT_20260722_020 (batch).

Current microserviceSrc pathDB project(s) usedDB usedNew microserviceNew src pathNew DB projectNew DB
platformsrc/Platform/StellaOps.Platform.Databaseshared DB (platform, shared)unchangedunchangedStellaOps.Platform.Persistence (D12)stellaops_platform(name kept — owner correction; container/instance naming aligned at PLT-2)
policy-enginesrc/Policy/StellaOps.Policy.EngineStellaOps.Policy.Persistenceshared DB (policy)unchanged + gains vuln gate projection (D3, sprint 007)unchangedunchangedstellaops_policy
scanner-web + scanner-worker (+ cache-init)src/Scanner/StellaOps.Scanner.Storageshared DB (scanner, minus EPSS)unchangedunchangedStellaOps.Scanner.Persistence (D12)stellaops_scanner
release-orchestrator (+ agent-ca-init)src/ReleaseOrchestrator/StellaOps.ReleaseOrchestrator.Persistence (+ Environment data source in WebApi)shared DB (release, release_orchestrator, release_orchestrator_agent, scripts)unchangedunchangedconsolidated StellaOps.ReleaseOrchestrator.Persistencestellaops_release_orchestrator
signersrc/Attestor/StellaOps.SignerSigner.KeyManagement + CredentialStore libs (crypto)shared DB (signer, crypto)unchanged — stays separate (key custody, D14)unchangedStellaOps.Signer.Persistence (D12; crypto schema instantiates per host, P4)stellaops_signer
evidence-locker-web + worker— row moved to §5.2 (Evidence merge, 011) —
timeline-websrc/Timeline/Timeline persistence (verify)shared DB (timeline)unchanged (+ audit-event partitioning, review §3)unchangedper D12stellaops_timeline
export-web + export-workersrc/ExportCenter/StellaOps.ExportCenter/* (WebService/Worker/Infrastructure + Cra/Nis2/StandardsMapping/RiskBundles adapters)ExportCenter.Infrastructureshared DB (export_center, 16 tables)StellaOps.OfflineKit (owner-approved EVL-3, 025)src/OfflineKit/StellaOps.OfflineKit.Persistencestellaops_offlinekit
replay-websrc/Replay/in-WebService store (PostgresFeedSnapshotIndexStore)shared DB (replay)unchangedunchangedStellaOps.Replay.Persistence (D12: extract from WebService)stellaops_replay
integrations-websrc/Integrations/Integrations.Persistence (IntegrationDbContext)shared DB (integrations)StellaOps.Integrations + registry-token role (owner-approved, 024)src/Integrations/StellaOps.Integrations.Persistencestellaops_integrations
signalssrc/Signals/StellaOps.Signals.Persistenceshared DB (signals)unchangedunchangedunchangedstellaops_signals
sbomservicesrc/SbomService/StellaOps.SbomService.Persistenceshared DB (sbom)SBOM system of record (DC-34): absorbs vuln.sbom_registry + Scanner’s SBOM registry; blobs → object store; producers publish, consumers subscribeunchangedunchangedstellaops_sbomservice
graph-apisrc/Graph/StellaOps.Graph.Indexer.Persistenceshared DB (graph)StellaOps.Graph (owner-approved merge, 023)src/Graph/StellaOps.Graph.Persistencestellaops_graph
reachgraph-websrc/ReachGraph/ReachGraph.Persistenceshared DB (reachgraph)merged into StellaOps.Graph (023; CAS role)src/Graph/merged ↑stellaops_graph
doctor-web (+ evidence-init)src/Doctor/Doctor persistence (verify)shared DB (doctor)retired (owner-approved, 009 DOC-5) — module survives as plugin SDK + CLI; registry lives in Platform— (schema dispositioned at retirement)
airgap-controller (+ airgap-time)src/AirGap/StellaOps.AirGap.Persistence (one 32 kB state table)shared DB (airgap)split decided (owner EVL-3, 025): posture → Platform (seal/status/time-anchor; both deployables retire); Importer/Bundle/Sync + Mirror.Creator → OfflineKitposture src/Platform/; exchange src/OfflineKit/Platform.Persistence / OfflineKit.Persistenceposture → platform DB; exchange → stellaops_offlinekit
registry-tokensrc/Registry/StellaOps.Registry.TokenServicein-service (RegistryTokenPersistenceExtensions.cs:52)shared DB (registry_token)role of StellaOps.Integrations (owner-approved, 024)src/Integrations/mergedstellaops_integrations
unknowns-websrc/Unknowns/StellaOps.Unknowns.Persistenceshared DB (unknowns, not yet live)unchangedunchangedunchangedstellaops_unknowns
remediationsrc/Remediation/RemediationDataSource assemblynone (dormant: no compose service/route/UI)archived (owner-approved; AdvisoryAI autofix is in-module)
workflow host (verify which service hosts it)src/Workflow/StellaOps.Workflow.DataStore.PostgreSQLshared DB (workflow)with its host service (P4)unchangedunchangedhost’s DB

Evaluation families (VexLens fold, Reachability, Offline/exchange): SPRINT_20260722_022.

5.4 No database / infrastructure (unchanged unless noted)

ContainerSrc pathDBChange
router-gatewaysrc/Router/StellaOps.Gateway.WebService— (Valkey)route table updates only (sprints 006 + per-program S5)
stellaops (console) + frontdoor + console-buildersrc/Web/StellaOps.WebAPI base-map repoints only (S6 stages)
stellaops-cli (stella)src/Cli/— (was direct SQL)X4/X5 die: corpus/mirror via hub APIs
agent-coreRO agent host (verify)(verify)unchanged
airgap-timeAirGap moduleunchanged
init jobs (scanner-cache-init, doctor-evidence-init, advisory-ai-data-init, release-orchestrator-agent-ca-init, concelier-jobs-init)with their servicesfollow their owning service’s program (concelier-jobs-init → Vulnerabilities)
stellaops-postgres (postgres:18.1)hosts control-plane DBsstays; gains per-service DBs (platform DB name unchanged)
stellaops-postgres-vulndatahosts stellaops_vulnnew (own volume, P8)
valkey / rustfs (seaweedfs) / registry (zot)unchanged

Bench/tools schemas (groundtruth, public; analytics is VulnCorrelation) are non-runtime; dispositioned in Wave 3 (must not block any program). golden_sets is not bench — binaryindex-web live-migrates and serves it (round-20 correction); its destination rides the 014 dissolution.