175 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
{
 | 
						||
  "$id": "https://stella-ops.org/schemas/events/scanner.event.scan.completed@1.json",
 | 
						||
  "$schema": "http://json-schema.org/draft-07/schema#",
 | 
						||
  "title": "Scanner orchestrator event – scan completed (v1)",
 | 
						||
  "type": "object",
 | 
						||
  "additionalProperties": false,
 | 
						||
  "required": [
 | 
						||
    "eventId",
 | 
						||
    "kind",
 | 
						||
    "version",
 | 
						||
    "tenant",
 | 
						||
    "occurredAt",
 | 
						||
    "source",
 | 
						||
    "idempotencyKey",
 | 
						||
    "payload"
 | 
						||
  ],
 | 
						||
  "properties": {
 | 
						||
    "eventId": {
 | 
						||
      "type": "string",
 | 
						||
      "format": "uuid",
 | 
						||
      "description": "Globally unique identifier for this occurrence."
 | 
						||
    },
 | 
						||
    "kind": {
 | 
						||
      "const": "scanner.event.scan.completed",
 | 
						||
      "description": "Event kind identifier consumed by orchestrator subscribers."
 | 
						||
    },
 | 
						||
    "version": {
 | 
						||
      "const": 1,
 | 
						||
      "description": "Schema version for orchestrator envelopes."
 | 
						||
    },
 | 
						||
    "tenant": {
 | 
						||
      "type": "string",
 | 
						||
      "description": "Tenant that owns the scan."
 | 
						||
    },
 | 
						||
    "occurredAt": {
 | 
						||
      "type": "string",
 | 
						||
      "format": "date-time",
 | 
						||
      "description": "Timestamp (UTC) when the scan completed."
 | 
						||
    },
 | 
						||
    "recordedAt": {
 | 
						||
      "type": "string",
 | 
						||
      "format": "date-time",
 | 
						||
      "description": "Timestamp (UTC) when the event was persisted. Optional."
 | 
						||
    },
 | 
						||
    "source": {
 | 
						||
      "type": "string",
 | 
						||
      "description": "Producer identifier, e.g. `scanner.webservice`."
 | 
						||
    },
 | 
						||
    "idempotencyKey": {
 | 
						||
      "type": "string",
 | 
						||
      "minLength": 8,
 | 
						||
      "description": "Deterministic key used to deduplicate events downstream."
 | 
						||
    },
 | 
						||
    "correlationId": {
 | 
						||
      "type": "string",
 | 
						||
      "description": "Correlation identifier tying this event to a request or workflow."
 | 
						||
    },
 | 
						||
    "traceId": {
 | 
						||
      "type": "string",
 | 
						||
      "description": "W3C trace ID (32 hex chars) for distributed tracing."
 | 
						||
    },
 | 
						||
    "spanId": {
 | 
						||
      "type": "string",
 | 
						||
      "description": "Optional span identifier associated with traceId."
 | 
						||
    },
 | 
						||
    "scope": {
 | 
						||
      "type": "object",
 | 
						||
      "additionalProperties": false,
 | 
						||
      "required": ["repo", "digest"],
 | 
						||
      "properties": {
 | 
						||
        "namespace": {"type": "string"},
 | 
						||
        "repo": {"type": "string"},
 | 
						||
        "digest": {"type": "string"},
 | 
						||
        "component": {"type": "string"},
 | 
						||
        "image": {"type": "string"}
 | 
						||
      }
 | 
						||
    },
 | 
						||
    "attributes": {
 | 
						||
      "type": "object",
 | 
						||
      "description": "String attributes for downstream correlation (policy revision, scan id, etc.).",
 | 
						||
      "additionalProperties": {"type": "string"}
 | 
						||
    },
 | 
						||
    "payload": {
 | 
						||
      "type": "object",
 | 
						||
      "additionalProperties": true,
 | 
						||
      "required": ["reportId", "scanId", "imageDigest", "verdict", "summary", "report"],
 | 
						||
      "properties": {
 | 
						||
        "reportId": {"type": "string"},
 | 
						||
        "scanId": {"type": "string"},
 | 
						||
        "imageDigest": {"type": "string"},
 | 
						||
        "verdict": {"enum": ["pass", "warn", "fail"]},
 | 
						||
        "summary": {
 | 
						||
          "type": "object",
 | 
						||
          "additionalProperties": false,
 | 
						||
          "required": ["total", "blocked", "warned", "ignored", "quieted"],
 | 
						||
          "properties": {
 | 
						||
            "total": {"type": "integer", "minimum": 0},
 | 
						||
            "blocked": {"type": "integer", "minimum": 0},
 | 
						||
            "warned": {"type": "integer", "minimum": 0},
 | 
						||
            "ignored": {"type": "integer", "minimum": 0},
 | 
						||
            "quieted": {"type": "integer", "minimum": 0}
 | 
						||
          }
 | 
						||
        },
 | 
						||
        "delta": {
 | 
						||
          "type": "object",
 | 
						||
          "additionalProperties": false,
 | 
						||
          "properties": {
 | 
						||
            "newCritical": {"type": "integer", "minimum": 0},
 | 
						||
            "newHigh": {"type": "integer", "minimum": 0},
 | 
						||
            "kev": {
 | 
						||
              "type": "array",
 | 
						||
              "items": {"type": "string"}
 | 
						||
            }
 | 
						||
          }
 | 
						||
        },
 | 
						||
        "policy": {
 | 
						||
          "type": "object",
 | 
						||
          "description": "Policy revision metadata surfaced alongside the report."
 | 
						||
        },
 | 
						||
        "findings": {
 | 
						||
          "type": "array",
 | 
						||
          "items": {
 | 
						||
            "type": "object",
 | 
						||
            "additionalProperties": false,
 | 
						||
            "required": ["id"],
 | 
						||
            "properties": {
 | 
						||
              "id": {"type": "string"},
 | 
						||
              "severity": {"type": "string"},
 | 
						||
              "cve": {"type": "string"},
 | 
						||
              "purl": {"type": "string"},
 | 
						||
              "reachability": {"type": "string"}
 | 
						||
            }
 | 
						||
          }
 | 
						||
        },
 | 
						||
        "links": {
 | 
						||
          "type": "object",
 | 
						||
          "additionalProperties": false,
 | 
						||
          "properties": {
 | 
						||
            "ui": {"type": "string", "format": "uri"},
 | 
						||
            "report": {"type": "string", "format": "uri"},
 | 
						||
            "policy": {"type": "string", "format": "uri"},
 | 
						||
            "attestation": {"type": "string", "format": "uri"}
 | 
						||
          }
 | 
						||
        },
 | 
						||
        "dsse": {
 | 
						||
          "type": "object",
 | 
						||
          "additionalProperties": false,
 | 
						||
          "required": ["payloadType", "payload", "signatures"],
 | 
						||
          "properties": {
 | 
						||
            "payloadType": {"type": "string"},
 | 
						||
            "payload": {"type": "string"},
 | 
						||
            "signatures": {
 | 
						||
              "type": "array",
 | 
						||
              "items": {
 | 
						||
                "type": "object",
 | 
						||
                "additionalProperties": false,
 | 
						||
                "required": ["keyId", "algorithm", "signature"],
 | 
						||
                "properties": {
 | 
						||
                  "keyId": {"type": "string"},
 | 
						||
                  "algorithm": {"type": "string"},
 | 
						||
                  "signature": {"type": "string"}
 | 
						||
                }
 | 
						||
              }
 | 
						||
            }
 | 
						||
          }
 | 
						||
        },
 | 
						||
        "report": {
 | 
						||
          "type": "object",
 | 
						||
          "description": "Canonical scanner report document that aligns with the DSSE payload."
 | 
						||
        }
 | 
						||
      }
 | 
						||
    }
 | 
						||
  }
 | 
						||
}
 |