Issuer Directory (served by Authority)

Verified against commit 942a18727c on 2026-09-26 (UTC). Re-verify: git grep -n "AddFoldedIssuerDirectory\|MapFoldedIssuerDirectory" -- src/Authority/StellaOps.Authority/StellaOps.Authority/Program.cs and grep -n -i "ISSUERDIRECTORY__FOLD\|IssuerDirectory__Fold" devops/compose/docker-compose.authority.yml devops/release/bundle/docker-compose.yml.

Service rows (host project, image, database and role, compose file, bundle presence, Doctor registration) are generated in docs/architecture/service-inventory.md; where this page and the inventory differ, the inventory is authoritative.

Issuer Directory is the trust registry of CSAF publishers and VEX statement issuers: issuer metadata, issuer signing keys with a rotation and revocation lifecycle, per-tenant trust weight overrides, and the operator decision-signing keys. It is a component of Authority, not a service of its own.

Where it runs

Source layout

ProjectRole
src/Authority/__Libraries/StellaOps.IssuerDirectory.Api/endpoint groups, contracts, options, policies, tenant resolution, fold composition
src/Authority/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Core/domain model and services (IssuerDirectoryService, IssuerKeyService, IssuerTrustService), key validation, metrics
src/Authority/StellaOps.IssuerDirectory/StellaOps.IssuerDirectory.Infrastructure/CSAF seed loader, Testing-only in-memory repositories
src/Authority/__Libraries/StellaOps.IssuerDirectory.Persistence/PostgreSQL repositories, audit sink, IssuerDirectoryDbContext
src/Authority/__Libraries/StellaOps.IssuerDirectory.Client/typed HTTP client, referenced by Policy Engine, the Release Orchestrator web API and StellaOps.DeltaVerdict

Database

API surface

All routes are mapped by Authority from StellaOps.IssuerDirectory.Api/Endpoints/.

GroupSource
/issuer-directory/issuers (CRUD)IssuerEndpoints.cs
/issuer-directory/issuers/{issuerId}/keys (add, rotate, revoke)IssuerKeyEndpoints.cs
/issuer-directory/issuers/{issuerId}/trust (get, set, delete override)IssuerTrustEndpoints.cs
/issuer-directory/operator-signing-keys/{issuerId}/keys, /enroll-invite, /coverageOperatorSigningKeyEndpoints.cs
/issuer-directory/operator-signing-keys/{issuerId}/provider-change-supersedeOperatorProviderChangeEndpoints.cs

Policies IssuerDirectory.Reader, IssuerDirectory.Writer and IssuerDirectory.Admin bind the scopes issuer-directory:read, issuer-directory:write and issuer-directory:admin. Operator signing-key routes also use authority:signing-keys.enroll and authority:signing-keys.admin (Security/IssuerDirectoryPolicies.cs, StellaOpsScopes.cs). The isolation tenant comes from the authenticated stellaops:tenant claim; see architecture.md section 4.

api-reference.md and openapi/v1.json were generated from the retired standalone host. Their paths and payloads match the folded surface; their server URL names the retired issuerdirectory.stella-ops.local alias.

Configuration

Observability

Meter StellaOps.IssuerDirectory (IssuerDirectoryMetrics): issuer_directory_changes_total, issuer_directory_key_operations_total, issuer_directory_key_validation_failures_total.

Tests

AuthorityIssuerFoldHostingTests and AuthorityIssuerFoldGlobalTenantTests (src/Authority/StellaOps.Authority/StellaOps.Authority.Tests/Integration/) boot the folded Authority host; IssuerDirectoryFoldMigrationTests (StellaOps.Authority.Persistence.Tests) covers migration 024; src/Authority/__Tests/StellaOps.IssuerDirectory.Persistence.Tests/ covers the repositories.

Retired predecessors

Subordinate documents

DocumentStatus
architecture.mdcurrent for sections 1 to 3, 5, 6 and 8 (rewritten 2026-09-26); sections 4 and 7 are design record, not re-verified 2026-09-26
api-reference.md, openapi/v1.jsongenerated from the retired host; paths current

Authority dossier: ../authority/architecture.md.