SBOM Service Architecture

Scope: canonical SBOM projections, ledger history, lineage, registry-source state, and durable SBOM event backlogs consumed by Console, Policy, Concelier, Graph, and Findings.

Authenticated tenant boundary. SBOM Service accepts a validated Authority bearer token or a Router-generated signed identity envelope. Tenant identity comes only from the canonical stellaops:tenant claim. Legacy tenant/user headers cannot authenticate a request. Existing tenant/tenantId request fields are optional compatibility assertions: an omitted value uses the authenticated tenant, an equal value is accepted, and a mismatch is rejected before repository access.

1) Mission and boundaries

2) Runtime layout

2.1 Durable state

2.2 Truthful unsupported surface

2.3 Tenant-scoped derived read models

sbom.catalog and sbom.component_lookups were created installation-wide — no tenant column — so every authenticated caller could read every row. Migration 006_catalog_component_lookup_tenant_id.sql adds the durable tenant key (SPRINT_20260712_007, SBOM-READMODEL-007-001):

3) Primary APIs

All routes below are minimal-API endpoints in Program.cs unless explicitly noted as MVC controller routes. Minimal-API endpoints are gated by the Sbom.Read, Sbom.Write, Sbom.Attest, or Sbom.Internal named policies (constants in Auth/SbomPolicies.cs); see Section 8a for the auth model.

3.1 Upload, versions, and ledger

3.2 Lineage graph (host minimal-API)

Lineage is minimal-API only. The dead MVC LineageController/LineageStreamController that formerly declared duplicate routes under api/v1/lineage (and consumed the unwired StellaOps.SbomService.Lineage runtime services) were removed in BL-3 (SPRINT_20260713_002). The endpoints above are the sole api/v1/lineage surface; there is no route-prefix collision to reconcile. The stream/optimize/levels/metadata/cache operations the old LineageStreamController declared were never mapped and had no live equivalent.

3.3 Change-trace compatibility

3.4 Artifact associations

3.5 Console / component lookup / entrypoints

3.6 Registry sources and webhooks

3.7 Health and build info

4) Internal APIs

All internal endpoints require Sbom.Internal / sbom:operate. Event, asset, inventory, resolver, ledger-audit, analysis, backfill, and retention APIs are installation-wide because their current repository contracts are installation-wide. /internal/orchestrator/* is tenant-scoped and always binds storage access to the authenticated tenant.

5) Ingestion and ledger behavior

6) Events and derived state

7) Registry source management

8) Determinism and offline posture

8a) Authentication and authorization model

9) Configuration

9a) Observability

10) Proof status

11) Open gaps