Issuer Directory (served by Authority)
Verified against commit
942a18727con 2026-09-26 (UTC). Re-verify:git grep -n "AddFoldedIssuerDirectory\|MapFoldedIssuerDirectory" -- src/Authority/StellaOps.Authority/StellaOps.Authority/Program.csandgrep -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
- Host:
authority(src/Authority/StellaOps.Authority/StellaOps.Authority/).Program.cscallsAddFoldedIssuerDirectoryandMapFoldedIssuerDirectory(src/Authority/__Libraries/StellaOps.IssuerDirectory.Api/Fold/IssuerDirectoryFold.cs). - Switch:
IssuerDirectory:Fold:Enabled(IssuerDirectoryFoldOptions, source defaultfalse). When it is false, Authority registers and maps nothing from this component. - Compose: the Authority family overlay
devops/compose/docker-compose.authority.ymlsetsISSUERDIRECTORY__FOLD__ENABLEDfromAUTHORITY_ISSUER_DIRECTORY_FOLD_ENABLED(defaulttrue). That overlay is outside the default compose chain. - Release bundle:
devops/release/bundle/docker-compose.ymldoes not set the fold switch forauthority, and the bundle’s mounted Authority configuration does not set it either. The source default applies, so a bundle-only install does not map the/issuer-directoryroutes, although the bundle’splatformservice pointsSTELLAOPS_ISSUERDIRECTORY_URLat Authority. This is recorded as an open observation for the Authority owner. - Retired host: the standalone
issuer-directoryservice was retired on 2026-09-11 (SPRINT_20260722_016 AUTH-10). Its project is frozen atsrc/__Obsoleted/Authority/StellaOps.IssuerDirectory.WebService/.
Source layout
| Project | Role |
|---|---|
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
- Schema
issuerinside Authority’s databasestellaops_authority, through Authority’s own connection.IssuerDirectory:Fold:ConnectionStringmay override it; there is no generic fallback. - The tables are created by Authority migration
src/Authority/__Libraries/StellaOps.Authority.Persistence/Migrations/024_authority_issuer_directory_tables.sql(issuers,issuer_keys,trust_overrides,audit,operator_provider_change_receipts). The fold registers no migrator of its own. The SQL files under the Persistence project’sMigrations/directory are historical and are not the migration authority.
API surface
All routes are mapped by Authority from StellaOps.IssuerDirectory.Api/Endpoints/.
| Group | Source |
|---|---|
/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, /coverage | OperatorSigningKeyEndpoints.cs |
/issuer-directory/operator-signing-keys/{issuerId}/provider-change-supersede | OperatorProviderChangeEndpoints.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
IssuerDirectory:Fold(Enabled,ConnectionString,SchemaName): fold switch and persistence.IssuerDirectory(IssuerDirectoryApiOptions): API options. The fold forcesSeedCsafPublishersoff; CSAF seeding does not run on the folded host.- Authentication, tenancy middleware, health endpoints and Router registration are Authority’s.
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
issuer-directoryservice (imageissuer-directory-web, aliasissuerdirectory.stella-ops.local): replaced by the Authority fold on 2026-09-08, retired 2026-09-11. Its deployment, backup and Offline Kit procedures are archived atdocs-archive/modules/issuer-directory/retired-20260926/operations/; the pre-2026-03 dossier is atdocs-archive/modules/issuer-directory/.
Subordinate documents
| Document | Status |
|---|---|
| architecture.md | current 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.json | generated from the retired host; paths current |
Authority dossier: ../authority/architecture.md.
