StellaOps Attestor
Verified against commit
942a18727c(2026-09-26, DOC-2 of SPRINT_20260926_001). Re-verify by reading the evidence paths listed in the Evidence section.
Service wiring (image, database and role, compose profile, bundle presence) is generated in the service inventory; this dossier does not restate it.
Status: the
attestordeployable is RETIRED (2026-09-05). This directory is a pointer stub plus the format, predicate and algorithm reference that moved unchanged into the Evidence family.Successor dossier:
../evidence/architecture.md.
What runs today
| Capability | Runs in | Source |
|---|---|---|
| Attestation submission, transparency receipts, verification, verdicts, identity watchlist | evidence-web (routes under /api/evidence/v1) and evidence-worker | src/Evidence/StellaOps.Evidence.WebService/, src/Evidence/StellaOps.Evidence.Worker/, src/Evidence/__Libraries/StellaOps.Attestor.* |
| Transparency-log tile cache | attestor-tileproxy | src/Attestor/StellaOps.Attestor.TileProxy/ |
| RFC 3161 timestamping | tsa (OpenSSL container, no .NET host) | devops/docker/tsa |
| DSSE signing and key custody | signer (separate service, see ../signer/README.md) | src/Attestor/StellaOps.Signer/StellaOps.Signer.WebService/ |
- Retired host. The
attestorhost shell is frozen atsrc/__Obsoleted/Attestor/StellaOps.Attestor/StellaOps.Attestor.WebService/(owner ruling D-EVD5-7, executed asSPRINT_20260722_011EVD-10a). Its application layer moved tosrc/Evidence/__Libraries/StellaOps.Attestor.Application/and is composed byevidence-web, which registers with the Router asevidence. The Router service nameattestor, the compose keyattestorand theattestor.stella-ops.localalias are gone from the dev estate (devops/compose/docker-compose.stella-services.yml) and the release bundle (devops/release/bundle/docker-compose.yml). - Routes. The minimal-API surface (
attestations*,rekor/*,transparency/*,attestor/links,watchlist*) is served at/api/evidence/v1/..., for examplePOST /api/evidence/v1/rekor/entries. The predicate registry (/api/v1/attestor/predicates) and the MVC controllers keep their attribute routes. Full surface:../evidence/architecture.mdand./architecture.md§4. - Database. Attestation tables (
attestor.*,proofchain.*) live in the consolidated Evidence database (STELLAOPS_POSTGRES_EVIDENCE_CONNECTION) and are migrated bysrc/Evidence/__Libraries/StellaOps.Evidence.Persistence/Migrations/. src/Attestor/still exists because it holds thesignerandattestor-tileproxyhosts, the Signer libraries, and shared attestation libraries (StellaOps.Attestation,StellaOps.Attestor.Envelope,StellaOps.Attestor.Types,StellaOps.Provenance.Attestation,__Libraries/StellaOps.Attestor.{EvidencePack,FixChain,GraphRoot,Oci,Offline,Timestamping}).src/Attestor/StellaOps.Attestor.WebService/is a verdict-ledger endpoint library without aProgram.cs; it is not the retired host.
Where things went
| You were looking for | Read instead |
|---|---|
| deployables, database, HTTP surface, authorization | ../evidence/architecture.md |
| the consolidation design and the direct-HTTP-caller census | ./consolidation-design.md— kept at this path because EvidenceDirectHttpCallerConformanceTests parses it here |
| the transparency-tile proxy | ./tile-proxy-design.md |
| RFC 3161 timestamping | ../evidence/architecture.md |
| key custody and signing | ../signer/README.md |
| regional crypto providers and signing profiles | ../cryptography/README.md |
Reference material kept in this directory
These documents describe formats and algorithms that moved unchanged into src/Evidence/__Libraries/StellaOps.Attestor.* (or stayed in src/Attestor/ libraries). Statements in them about hosts, containers, ports or compose keys are historical.
- Formats and algorithms:
architecture.md,bundle-format.md,proof-chain-specification.md,proof-spine-algorithm.md,transparency.md,rekor-verification-design.md,timestamp-assurance-design.md,dsse-roundtrip-verification.md,repro-bundle-profile.md,build-profile.md. - Predicates:
predicate-schema-registry.md,fix-chain-predicate.md,operator-decision-predicate.md,vex-override-predicate.md,graph-root-attestation.md,payloads.md, schemas underschemas/. - Interoperability:
cosign-interop.md,cosign-verification-examples.md,intoto-link-guide.md,tuf-integration.md, guides underguides/. - Operations:
operations/(observability runbook and dashboard, bundle rotation, the 2026-09-12 consumer-acceptance record) and the frozen acceptance evidence underevidence/. - Wire shape: the attestor routes are served by the consolidated Evidence host under
/api/evidence/v1; the generated reference is../evidence/api-reference.md(source../evidence/openapi/v1.json). The predecessor host’s generated capture is archived underdocs-archive/modules/attestor/.openapi/proofs-openapi.yamlis a hand-written design record.
Supported library surface (consumer review, 2026-10-08)
The PCD-466 consumer review removed members that had no source, test or host consumer (pre-release removal, no deprecation shims):
StellaOps.Attestation.DsseEnvelopeExtensions.ToSerializableDict,GetPayloadStringandGetPayloadBase64.FromBase64remains; canonical wire JSON comes fromDsseEnvelopeSerializer.Serialize(envelope).CompactJson(StellaOps.Attestor.Envelope).- The uncomposed
VerdictEndpoints.MapVerdictEndpointsroute mapper in the Attestor verdict-ledger handler class library, together with the three private handlers only it used; no host mapped it. The Evidence host’s own, composed verdict mapper is unchanged. - The DI registration extensions
AddFixChainAttestation(two overloads),AddFixChainAttestationStore,AddFixChainRekorClient,AddGraphRootAttestation(two overloads),AddAttestorOfflineand the twoAddKeylessSigningoverloads. No production host called them; the libraries’ services, parsing/verification and signing algorithms remain, and a consumer composes them directly.
The Types generator (StellaOps.Attestor.Types.Generator) has a test consumer: GeneratorConsumerTests builds it through a build-only ProjectReference, runs it into scratch under tmp/scratch/, and requires the emitted schemas and Go/TypeScript files to equal the committed assets. This proves the generator and its generated TypeScript corpus have a source/test consumer; it is not an npm-package, production SDK or deployed-service claim. Re-verify with tools/scripts/test-targeted-xunit.ps1 on the Types, Attestation, FixChain and GraphRoot test projects and python3 tools/scripts/validate/check-consumer-census.py.
Formats that did not change
- Versioned payload schemas —
StellaOps.BuildProvenance@1,StellaOps.SBOMAttestation@1,StellaOps.ScanResults@1,StellaOps.VEXAttestation@1,StellaOps.PolicyEvaluation@1,StellaOps.RiskProfileEvidence@1— are generated byStellaOps.Attestor.Types(src/Attestor/StellaOps.Attestor.Types/Tools/StellaOps.Attestor.Types.Generator/, fixtures undersrc/Attestor/StellaOps.Attestor.Types/Fixtures/v1/). - In-toto predicate URIs are tracked in
proofchain.predicate_type_registryand listed byGET /api/v1/attestor/predicates(Endpoints/PredicateRegistryEndpoints.cs). Routing and validation go throughPredicateTypeRouter; an unregistered predicate yields a validation error. - DSSE envelopes are canonicalised, hashed and stored with the transparency UUID, index and proof. Multiple signatures per envelope are supported. Proofs carry the Merkle inclusion path and checkpoint metadata. The local Stella transparency log (
stellaops://attestor/local-transparency) is the default primary; external Rekor-compatible logs are an operator-configured mirror. - Scopes. The policy names
attestor:read,attestor:verifyandattestor:writemap to the canonical claimsattest:readandattest:create(Security/AttestorPolicies.cs); the identity watchlist useswatchlist:*policy names.
Evidence
| Claim | Source |
|---|---|
| Host retired and frozen; application layer moved | src/__Obsoleted/Attestor/StellaOps.Attestor/StellaOps.Attestor.WebService/AGENTS.md |
evidence-web composes the Attestor layer at /api/evidence/v1, Router name evidence | src/Evidence/StellaOps.Evidence.WebService/Program.cs |
| Minimal-API and predicate-registry routes | src/Evidence/__Libraries/StellaOps.Attestor.Application/AttestorWebServiceEndpoints.cs, src/Evidence/__Libraries/StellaOps.Attestor.Application/Endpoints/PredicateRegistryEndpoints.cs |
| CLI uses the consolidated prefix | src/Cli/StellaOps.Cli/Services/AttestorLinkClient.cs |
Live containers attestor-tileproxy, tsa, signer, evidence-web, evidence-worker; no attestor key | devops/compose/docker-compose.stella-services.yml, devops/release/bundle/docker-compose.yml |
| Attestation tables in the Evidence database | src/Evidence/__Libraries/StellaOps.Evidence.Persistence/Migrations/001_evidence_consolidated_baseline.sql |
| Payload schema generator and fixtures | src/Attestor/StellaOps.Attestor.Types/ |
| Scope claims | src/Authority/StellaOps.Authority/StellaOps.Auth.Abstractions/StellaOpsScopes.cs (AttestRead, AttestCreate) |
