Mirror Architecture

Scope. Where the mirror capability lives in src/ today: producing offline copies of Stella Ops content for sealed or bandwidth-limited estates, and applying them on the far side. Mirror is a capability, not a service. It has no src/Mirror root, no host, no database and no gateway route of its own.


0) Mission & boundaries

Mission. Let an air-gapped or disconnected estate stay current without direct access to upstream vulnerability feeds, by moving signed, digest-verified content across the gap.

Where the responsibilities live. Each part of the capability sits with the service that owns its data (/AGENTS.md rule 14):

ResponsibilityOwnerLive code
Holding the mirrored vulnerability and VEX data, importing seeds, publishing the corpusVulnerabilities hubsrc/Vulnerabilities/ (section 4.2)
Building, validating, importing and delivering mirror seeds from an operator hostCLIsrc/Cli/StellaOps.Cli/Commands/MirrorSeedCommandGroup.cs (section 4.1)
Producing mirror bundles from a mirror export profileOfflineKit export planesrc/OfflineKit/__Libraries/StellaOps.ExportCenter.* (section 2)
Carrying a seed or bundle into a sealed estate and handing it to its ownerOfflineKit custody planesrc/OfflineKit/StellaOps.OfflineKit.WebService/Imports/ (section 4.3)

Boundaries.


1) Retired predecessors and where their responsibilities went

The mirror capability used to be spread across Concelier and a standalone src/Mirror tree. Neither exists in src/ today.

PredecessorStatusResponsibility now held by
Concelier service, including its federation bundle export/import library and its stella-mirror feed connectorRetired; the service stopped at the VULN-G1 cutover and its source is frozen under src/__Obsoleted/Concelier/ (Concelier)The Vulnerabilities hub owns the data; the mirror seed (section 4) replaces the federation bundle as the offline exchange for vulnerability data
Concelier-based seed archive and devops/mirror seed scriptsRetired with the VULN-B1 source cutover; scripts frozen under devops/mirror/_archived/vuln-b1/stella mirror seed and the hub’s seed import endpoint (section 4)
src/Mirror/StellaOps.Mirror.Creator planning coreThe tree moved to OfflineKit when OfflineKit absorbed Mirror; the planning semantics were re-authored as the mirror export profile kind (section 2)OfflineKit export plane

Two remnants were removed on 2026-09-26:

The stella mirror create command fails closed with exit code 9 and error mirror_create_not_implemented, and writes no files.


2) Mirror export profile (OfflineKit)

Mirror bundle production is a kind of export profile, not a second engine (design challenge DC-22). The OfflineKit dossier owns the run lifecycle; this section only places the mirror parts.

Bundle layout: mirror bundles. Profile options: export profiles.


3) Contracts and interfaces

SurfaceContractSource
CLI seed commandsstella mirror seed export, validate, import, downloadsrc/Cli/StellaOps.Cli/Commands/MirrorSeedCommandGroup.cs
Seed formatmanifest.json, advisories.jsonl, advisory-index.jsonl; digests, lengths, counts and the advisory state-index digestmirror seeds
Seed importPOST /api/vulnerabilities/v1/mirror/seeds/importsrc/Vulnerabilities/StellaOps.Vulnerabilities.WebService/Serving/MirrorSeedEndpoints.cs
Seed export inputThe hub’s current corpus publication, /api/vulnerabilities/v1/corpus/publications/currentcorpus artifact
Offline Kit seed partDomain vulnerabilities, media type application/vnd.stellaops.mirror-seed+ndjsonStellaOps.Vulnerabilities.Contracts/Mirror/MirrorBundleStream.cs and StellaOps.Vulnerabilities.Contracts/OfflineKit/
Mirror export profileExportProfileKind.Mirror, MirrorProfileScopesrc/OfflineKit/__Libraries/StellaOps.ExportCenter.Application/Mirror/

The mirror capability declares no Authority scopes of its own; there are no mirror:* constants in StellaOpsScopes. Seed export and import use the advisory and VEX scopes named on the mirror seeds page. A mirror export run is started like any other profile run, under the OfflineKit ExportOperator policy (StellaOps.ExportCenter.Application/Api/ExportApiEndpoints.cs).


4) Mirror seed — the current offline distribution path

The operator reference is Vulnerability mirror seeds; it owns the command options, token scopes, tenant order, the seed format and the owner endpoint contract. This section only places the seed surface in the architecture. The Concelier-based seed archive this section described before (a --profile option, a Concelier persistence seed engine, a standalone seed tool and the devops/mirror seed scripts) was retired with the VULN-B1 source cutover; its scripts are frozen under devops/mirror/_archived/vuln-b1/ and the historical v1 seed catalogue under devops/mirror/seeds/ is not an input to the current importer.

4.1 CLI: the stella mirror seed group

src/Cli/StellaOps.Cli/Commands/MirrorSeedCommandGroup.cs defines the group under the top-level mirror command; src/Cli/StellaOps.Cli/Services/HubMirrorSeedClient.cs is its client.

4.2 Owner: the Vulnerabilities service

The vulnerability hub owns the mirrored data. src/Vulnerabilities/StellaOps.Vulnerabilities.WebService/Serving/MirrorSeedEndpoints.cs maps POST /api/vulnerabilities/v1/mirror/seeds/import (advisory and VEX ingest policies); src/Vulnerabilities/__Libraries/StellaOps.Vulnerabilities.Ingestion/Mirror/ validates and applies a seed through the ordinary ingestion paths; and src/Vulnerabilities/StellaOps.Vulnerabilities.Worker/MirrorSeedPublicationWorker.cs publishes the corpus after a local import, also when online ingestion is disabled or the estate is sealed. Export reads the published corpus at /api/vulnerabilities/v1/corpus/publications/current.

4.3 Offline Kit carrier

An Offline Kit carrier can hold a mirror seed part. The Offline Kit service activates it against the same owner API (src/OfflineKit/StellaOps.OfflineKit.WebService/Imports/VulnerabilityMirrorSeedActivator.cs), using the exchange contract in StellaOps.Vulnerabilities.Contracts/OfflineKit/.

4.4 Module-boundary note

The seed surface belongs to the Vulnerabilities module (data owner) with the CLI and the Offline Kit as clients. It has no code under a src/Mirror root; this section is its pointer from the mirror dossier.