Signals API — Reachability Contract

Status: Working contract (aligns with src/Signals/StellaOps.Signals/Program.cs).

This document is the as-wired contract for the Stella Ops Signals service: it enumerates exactly the HTTP routes the Signals host registers in the request pipeline, the scopes each requires, and the routes that are defined in the assembly but not served. It is the authoritative companion to the Signals API reference, which presents the same surface in a more narrative form — when the two disagree, prefer this contract and the source it cites.

All routes are registered in Program.cs (minimal-API endpoints), CompatibilityApiV1Endpoints.cs, and ScmWebhookEndpoints.cs. URLs are lowercased (AddRouting(LowercaseUrls = true)).

Auth, scopes, sealed mode

Endpoints

Discovery, health & status

Callgraph ingestion & retrieval

Sample request: docs/api/signals/samples/callgraph-sample.json

Runtime facts ingestion

Runtime observations ingestion (internal agent)

Unknowns ingestion, retrieval & query

Reachability scoring & facts

Sample fact: docs/api/signals/samples/facts-sample.json

Execution evidence

Beacon attestation

Reachability union bundle ingestion (CAS layout)

Compatibility surface (/api/v1/signals)

These return a fixed, in-memory deterministic sample dataset (operator/console compatibility) and accept either signals:read or orch:read.

SCM / CI webhooks

Anonymous endpoints (AllowAnonymous()); authentication is per-provider signature/token validation rather than Authority scopes. All are subject to sealed-mode enforcement.

Responses: 202 Accepted with { eventId, eventType, provider, repository, triggersDispatched, scanTriggersCount, sbomTriggersCount } on success; 200 with a message when the event is ignored; 400/401 on validation failures.

Defined but not currently mapped

The following attribute-routed controllers exist in the Signals assembly but are not served by the Signals host as shipped: Program.cs never calls AddControllers() / MapControllers(), so these routes are not registered and return 404. They are documented here as forward/internal surface only — do not treat them as live API: