VexHub

Status: Implemented Source: src/VexHub/ Owner: VEX Guild

Purpose

VexHub aggregates, validates, and distributes VEX statements from multiple upstream sources. It is the canonical VEX distribution layer for Stella Ops, providing deterministic outputs, conflict detection, and offline-friendly operation for internal services (such as VexLens) and external tools (Trivy/Grype).

Components

Services:

There is no StellaOps.VexHub.Worker project. A background ingestion scheduler (VexIngestionScheduler) is implemented in StellaOps.VexHub.Core but is not wired into the WebService host. In production, scheduled ingestion is handled by the Excititor Worker, which projects AOC-checked claims into vexhub.statements.

Libraries:

Configuration

Settings bind from the VexHub section (VexHubOptions); PostgreSQL binds from Postgres. Key groups:

API Surface

Read endpoints require scope vexhub:read; the conflict-resolution endpoint requires vexhub:admin.

Statements carry a SHA-256 content_digest for dedup; timestamps are UTC.

Rate limiting (sliding 1-minute window) is applied per client (API-key id, else forwarded/remote IP); /health* is exempt. Responses carry X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset headers, and exceeded limits return 429 with Retry-After. Authenticated clients receive 2x the configured Distribution.RateLimitPerMinute.

Dependencies

Current Status

WebService implemented with the distribution API, admin conflict-resolution endpoint, API-key + bearer auth, in-process rate limiting, and startup migrations. Normalization, validation (OpenVEX/CycloneDX/CSAF), offline DSSE-HMAC signature verification, and OpenVEX export are in place. Scheduled ingestion is not run by a VexHub worker (none exists); statements are populated by the Excititor Worker’s projection into vexhub.statements. Prometheus metrics and dedicated tracing spans are not yet implemented (roadmap).