Files
git.stella-ops.org/docs/schemas/orchestrator-envelope.schema.json
StellaOps Bot 4042fc2184
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
release-manifest-verify / verify (push) Has been cancelled
Add unit tests for PackRunAttestation and SealedInstallEnforcer
- Implement comprehensive tests for PackRunAttestationService, covering attestation generation, verification, and event emission.
- Add tests for SealedInstallEnforcer to validate sealed install requirements and enforcement logic.
- Introduce a MonacoLoaderService stub for testing purposes to prevent Monaco workers/styles from loading during Karma runs.
2025-12-06 22:25:30 +02:00

517 lines
14 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://stella-ops.org/schemas/orchestrator-envelope.schema.json",
"title": "StellaOps Orchestrator Event Envelope Schema",
"description": "Schema for orchestrator-compatible event envelopes used by Scanner and other services. Unblocks SCANNER-EVENTS-16-301.",
"type": "object",
"definitions": {
"EventEnvelope": {
"type": "object",
"description": "Standard event envelope for orchestrator event bus",
"required": ["envelope_id", "event_type", "timestamp", "source", "payload"],
"properties": {
"envelope_id": {
"type": "string",
"format": "uuid",
"description": "Unique identifier for this event envelope"
},
"event_type": {
"type": "string",
"pattern": "^[a-z]+\\.[a-z_]+\\.[a-z_]+$",
"description": "Dot-notation event type (e.g., scanner.scan.completed)",
"examples": [
"scanner.scan.started",
"scanner.scan.completed",
"scanner.scan.failed",
"scanner.sbom.generated",
"scanner.vulnerability.detected",
"notifier.alert.sent",
"policy.evaluation.completed"
]
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp when event was created"
},
"source": {
"$ref": "#/definitions/EventSource"
},
"correlation_id": {
"type": "string",
"format": "uuid",
"description": "Correlation ID for tracing related events"
},
"causation_id": {
"type": "string",
"format": "uuid",
"description": "ID of the event that caused this event"
},
"tenant_id": {
"type": "string",
"format": "uuid"
},
"project_id": {
"type": "string",
"format": "uuid"
},
"payload": {
"type": "object",
"description": "Event-specific payload",
"additionalProperties": true
},
"metadata": {
"$ref": "#/definitions/EventMetadata"
},
"version": {
"type": "string",
"default": "1.0",
"description": "Event schema version"
}
}
},
"EventSource": {
"type": "object",
"description": "Source of the event",
"required": ["service", "instance_id"],
"properties": {
"service": {
"type": "string",
"description": "Service name (e.g., scanner, notifier, policy-engine)"
},
"version": {
"type": "string",
"description": "Service version"
},
"instance_id": {
"type": "string",
"description": "Instance identifier (hostname, pod name, etc.)"
},
"region": {
"type": "string",
"description": "Deployment region"
}
}
},
"EventMetadata": {
"type": "object",
"description": "Additional metadata for the event",
"properties": {
"trace_id": {
"type": "string",
"description": "OpenTelemetry trace ID"
},
"span_id": {
"type": "string",
"description": "OpenTelemetry span ID"
},
"priority": {
"type": "string",
"enum": ["low", "normal", "high", "critical"],
"default": "normal"
},
"ttl_seconds": {
"type": "integer",
"minimum": 0,
"description": "Time-to-live for the event"
},
"retry_count": {
"type": "integer",
"minimum": 0,
"default": 0
},
"idempotency_key": {
"type": "string",
"description": "Key for idempotent processing"
},
"content_type": {
"type": "string",
"default": "application/json"
},
"compression": {
"type": "string",
"enum": ["none", "gzip", "lz4"],
"default": "none"
}
}
},
"ScannerEventPayload": {
"type": "object",
"description": "Base payload for scanner events",
"properties": {
"scan_id": {
"type": "string",
"format": "uuid"
},
"job_id": {
"type": "string",
"format": "uuid"
},
"target": {
"$ref": "#/definitions/ScanTarget"
},
"status": {
"type": "string",
"enum": ["started", "in_progress", "completed", "failed", "cancelled"]
},
"started_at": {
"type": "string",
"format": "date-time"
},
"completed_at": {
"type": "string",
"format": "date-time"
},
"duration_ms": {
"type": "integer",
"minimum": 0
},
"results_summary": {
"$ref": "#/definitions/ScanResultsSummary"
},
"error": {
"$ref": "#/definitions/ErrorInfo"
}
}
},
"ScanTarget": {
"type": "object",
"description": "Target being scanned",
"required": ["type", "identifier"],
"properties": {
"type": {
"type": "string",
"enum": ["container_image", "repository", "filesystem", "sbom", "package"]
},
"identifier": {
"type": "string",
"description": "Target identifier (image name, repo URL, path)"
},
"digest": {
"type": "string",
"pattern": "^sha256:[a-f0-9]{64}$"
},
"tag": {
"type": "string"
},
"platform": {
"type": "string",
"description": "Platform (e.g., linux/amd64)"
}
}
},
"ScanResultsSummary": {
"type": "object",
"description": "Summary of scan results",
"properties": {
"total_vulnerabilities": {
"type": "integer",
"minimum": 0
},
"by_severity": {
"type": "object",
"properties": {
"critical": {
"type": "integer",
"minimum": 0
},
"high": {
"type": "integer",
"minimum": 0
},
"medium": {
"type": "integer",
"minimum": 0
},
"low": {
"type": "integer",
"minimum": 0
},
"info": {
"type": "integer",
"minimum": 0
}
}
},
"components_scanned": {
"type": "integer",
"minimum": 0
},
"sbom_generated": {
"type": "boolean"
},
"sbom_ref": {
"type": "string",
"description": "Reference to generated SBOM"
}
}
},
"ErrorInfo": {
"type": "object",
"description": "Error information for failed events",
"required": ["code", "message"],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"details": {
"type": "object",
"additionalProperties": true
},
"stack_trace": {
"type": "string"
},
"recoverable": {
"type": "boolean",
"default": false
}
}
},
"VulnerabilityDetectedPayload": {
"type": "object",
"description": "Payload for vulnerability detection events",
"required": ["scan_id", "vulnerability"],
"properties": {
"scan_id": {
"type": "string",
"format": "uuid"
},
"vulnerability": {
"$ref": "#/definitions/VulnerabilityInfo"
},
"affected_component": {
"$ref": "#/definitions/ComponentInfo"
},
"reachability": {
"type": "string",
"enum": ["reachable", "unreachable", "potentially_reachable", "unknown"]
}
}
},
"VulnerabilityInfo": {
"type": "object",
"required": ["id", "severity"],
"properties": {
"id": {
"type": "string",
"description": "CVE ID or vulnerability identifier"
},
"severity": {
"type": "string",
"enum": ["critical", "high", "medium", "low", "info"]
},
"cvss_score": {
"type": "number",
"minimum": 0,
"maximum": 10
},
"cvss_vector": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"references": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"fix_available": {
"type": "boolean"
},
"fixed_version": {
"type": "string"
},
"kev_listed": {
"type": "boolean"
},
"epss_score": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
},
"ComponentInfo": {
"type": "object",
"required": ["purl"],
"properties": {
"purl": {
"type": "string"
},
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"ecosystem": {
"type": "string"
},
"location": {
"type": "string",
"description": "Location in the target (e.g., layer, file path)"
}
}
},
"NotifierIngestionEvent": {
"type": "object",
"description": "Event structure for Notifier ingestion",
"required": ["envelope_id", "event_type", "severity_threshold_met"],
"properties": {
"envelope_id": {
"type": "string",
"format": "uuid"
},
"event_type": {
"type": "string"
},
"severity_threshold_met": {
"type": "boolean",
"description": "Whether event meets notification severity threshold"
},
"notification_channels": {
"type": "array",
"items": {
"type": "string",
"enum": ["email", "slack", "teams", "webhook", "pagerduty"]
}
},
"digest_eligible": {
"type": "boolean",
"description": "Whether event should be batched into digest"
},
"immediate_dispatch": {
"type": "boolean",
"description": "Whether event requires immediate dispatch"
}
}
},
"EventBatch": {
"type": "object",
"description": "Batch of events for bulk processing",
"required": ["batch_id", "events"],
"properties": {
"batch_id": {
"type": "string",
"format": "uuid"
},
"events": {
"type": "array",
"items": {
"$ref": "#/definitions/EventEnvelope"
},
"minItems": 1
},
"created_at": {
"type": "string",
"format": "date-time"
},
"total_count": {
"type": "integer",
"minimum": 1
}
}
},
"EventSubscription": {
"type": "object",
"description": "Subscription to event types",
"required": ["subscription_id", "event_patterns", "endpoint"],
"properties": {
"subscription_id": {
"type": "string",
"format": "uuid"
},
"event_patterns": {
"type": "array",
"items": {
"type": "string",
"description": "Glob pattern for event types (e.g., scanner.* or scanner.scan.completed)"
}
},
"endpoint": {
"type": "string",
"format": "uri",
"description": "Webhook endpoint for event delivery"
},
"filters": {
"type": "object",
"additionalProperties": true,
"description": "Additional filters on payload fields"
},
"enabled": {
"type": "boolean",
"default": true
}
}
}
},
"properties": {
"events": {
"type": "array",
"items": {
"$ref": "#/definitions/EventEnvelope"
}
}
},
"examples": [
{
"events": [
{
"envelope_id": "550e8400-e29b-41d4-a716-446655440000",
"event_type": "scanner.scan.completed",
"timestamp": "2025-12-06T10:00:00Z",
"source": {
"service": "scanner",
"version": "2025.10.0",
"instance_id": "scanner-pod-abc123"
},
"correlation_id": "660e8400-e29b-41d4-a716-446655440001",
"tenant_id": "770e8400-e29b-41d4-a716-446655440002",
"project_id": "880e8400-e29b-41d4-a716-446655440003",
"payload": {
"scan_id": "990e8400-e29b-41d4-a716-446655440004",
"job_id": "aa0e8400-e29b-41d4-a716-446655440005",
"target": {
"type": "container_image",
"identifier": "myregistry.io/app:v1.0.0",
"digest": "sha256:abc123def456..."
},
"status": "completed",
"started_at": "2025-12-06T09:55:00Z",
"completed_at": "2025-12-06T10:00:00Z",
"duration_ms": 300000,
"results_summary": {
"total_vulnerabilities": 15,
"by_severity": {
"critical": 1,
"high": 3,
"medium": 7,
"low": 4,
"info": 0
},
"components_scanned": 127,
"sbom_generated": true,
"sbom_ref": "s3://sboms/990e8400.../sbom.json"
}
},
"metadata": {
"trace_id": "abc123trace",
"span_id": "def456span",
"priority": "normal"
},
"version": "1.0"
}
]
}
]
}