Graph asset-registry event feed contract (010x023 seam)

Status: source SHIPPED (2026-08-26) — the F-R0824-GRA-1 successor to Findings Ledger’s direct cross-schema SELECT FROM graph.asset_registry_events, which breaks the moment graph leaves stellaops_platform (GRA-9) and which blocked the consolidated findings-web from booting against stellaops_findings at the 2026-08-26 FND-9 canary. Live activation (deployed graph-api build, armed findings-web, one event advancing end to end) is window work owned by SPRINT_20260722_023 GRA-9 / SPRINT_20260722_010 FND-9. Owner: Graph (producer). Consumer: Findings Ledger (consolidated host only; the predecessor findings-ledger-web keeps the same-database read until FND-10).

Source of truth for the shapes: src/Graph/__Libraries/StellaOps.Graph.Contracts/AssetRegistry/AssetRegistryEventFeedContract.cs — a closed leaf project on the StellaOps.Scanner.Contracts pattern (zero ProjectReferences, zero PackageReferences; pinned by GraphConsolidationConformanceTests.GraphContracts_RemainsAClosedLeafSeam).

Identity

FieldValue
Route (native graph-api)GET /graph/asset-registry/events
QueryafterRecordedAt (ISO-8601), afterEventId, limit (≤ 5000, default 500), maxBytes (≤ 8 MiB, default 2 MiB), streamEpoch
Authorizationgraph:asset-registry:read-all ONLY (policy Graph.AssetRegistryProjectionRead); ordinary graph:read/graph:query is refused 403
Transport identitygateway-shaped signed identity envelope (X-StellaOps-Identity-Envelope + signature, shared Router:IdentityEnvelopeSigningKey) — graph-api authenticates envelopes, not bearer tokens
Errors400 asset_registry_feed_invalid_request, 409 asset_registry_stream_epoch_mismatch (carries the live epoch), 503 asset_registry_feed_unavailable

Semantics

Verification

Producer: AssetRegistryEventFeedReaderTests (ordering/cursor/epoch/byte-bound on disposable PostgreSQL), AssetRegistryEventFeedEndpointTests (401/403/200/409/400/503 incl. the ordinary-graph:read-is-refused boundary). Consumer: GraphAssetRegistryFeedSeamTests (wire pages through the shared contract types into the Findings sink: tenant partitioning, checkpoint advance, epoch adoption, ordered-gap/epoch/identity refusals, missing-seam-relation refusal). Composition: AssetRegistrySeamCompositionTests (predecessor keeps the legacy source; seam default-off registers nothing; armed selects the feed) and FindingsWebGraphlessProductionBootTests (the production findings-web composition boots and serves against a fresh database with no graph schema — the 2026-08-26 canary’s exact failure mode, red/green-proven by flipping the host back to the legacy path).