454 lines
14 KiB
JSON
454 lines
14 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://cowbay.org/schemas/reporting-governance/events.schema.json",
|
|
"title": "Reporting Governance Events",
|
|
"description": "Validation schema for canonical reporting-governance events, including envelope and event-specific payload rules.",
|
|
"allOf": [
|
|
{
|
|
"$ref": "./event-envelope.schema.json"
|
|
},
|
|
{
|
|
"oneOf": [
|
|
{
|
|
"$ref": "#/$defs/taskStartedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/taskCheckpointDueEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/taskCheckpointSentEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/taskStatusChangedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/taskClaimedCompleteEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/taskEvidenceAttachedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/subagentSpawnedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/subagentSpawnFailedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/subagentCompletedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/subagentResultForwardedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/subagentResultNotForwardedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/silenceTimeoutEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/watchdogFiredEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/operatorReviewRequestedEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/reportAnchorMissingEvent"
|
|
},
|
|
{
|
|
"$ref": "#/$defs/forcedOperatorUpdateEvent"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"$defs": {
|
|
"nonEmptyString": {
|
|
"type": "string",
|
|
"minLength": 1
|
|
},
|
|
"positiveInteger": {
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
"taskStartedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"task_kind",
|
|
"started_by",
|
|
"initial_status",
|
|
"silent_task",
|
|
"report_required"
|
|
],
|
|
"properties": {
|
|
"task_kind": { "$ref": "#/$defs/nonEmptyString" },
|
|
"started_by": { "$ref": "#/$defs/nonEmptyString" },
|
|
"initial_status": { "$ref": "#/$defs/nonEmptyString" },
|
|
"silent_task": { "type": "boolean" },
|
|
"report_required": { "type": "boolean" },
|
|
"plan_ref": { "type": "string" },
|
|
"checkpoint_due_at": { "type": "string", "format": "date-time" },
|
|
"owner_agent_id": { "type": "string" }
|
|
}
|
|
},
|
|
"taskCheckpointDuePayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"checkpoint_type",
|
|
"due_at",
|
|
"expected_report_type"
|
|
],
|
|
"properties": {
|
|
"checkpoint_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"due_at": { "type": "string", "format": "date-time" },
|
|
"expected_report_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"grace_period_ms": { "type": "integer", "minimum": 0 },
|
|
"policy_id": { "type": "string" }
|
|
}
|
|
},
|
|
"taskCheckpointSentPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"checkpoint_type",
|
|
"sent_at",
|
|
"report_type"
|
|
],
|
|
"properties": {
|
|
"checkpoint_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"sent_at": { "type": "string", "format": "date-time" },
|
|
"report_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"anchor_id": { "type": "string" },
|
|
"message_ref": { "type": "string" },
|
|
"lateness_ms": { "type": "integer", "minimum": 0 }
|
|
}
|
|
},
|
|
"taskStatusChangedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"from_status",
|
|
"to_status",
|
|
"reason"
|
|
],
|
|
"properties": {
|
|
"from_status": { "$ref": "#/$defs/nonEmptyString" },
|
|
"to_status": { "$ref": "#/$defs/nonEmptyString" },
|
|
"reason": { "$ref": "#/$defs/nonEmptyString" },
|
|
"status_source": { "type": "string" },
|
|
"blocked": { "type": "boolean" },
|
|
"gate_id": { "type": "string" }
|
|
}
|
|
},
|
|
"taskClaimedCompletePayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"claimed_status"
|
|
],
|
|
"properties": {
|
|
"claimed_status": { "$ref": "#/$defs/nonEmptyString" },
|
|
"verification_state": { "type": "string" },
|
|
"claim_basis": { "type": "string" },
|
|
"pending_review": { "type": "boolean" }
|
|
}
|
|
},
|
|
"taskEvidenceAttachedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"evidence_count",
|
|
"evidence_role"
|
|
],
|
|
"properties": {
|
|
"evidence_count": { "$ref": "#/$defs/positiveInteger" },
|
|
"evidence_role": { "$ref": "#/$defs/nonEmptyString" }
|
|
}
|
|
},
|
|
"operatorReviewRequestedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"review_reason",
|
|
"review_scope"
|
|
],
|
|
"properties": {
|
|
"review_reason": { "$ref": "#/$defs/nonEmptyString" },
|
|
"review_scope": { "$ref": "#/$defs/nonEmptyString" },
|
|
"requested_status": { "type": "string" },
|
|
"deadline": { "type": "string", "format": "date-time" }
|
|
}
|
|
},
|
|
"subagentSpawnedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"subagent_id",
|
|
"subagent_label",
|
|
"dispatch_status",
|
|
"report_anchor_required",
|
|
"report_anchor_present"
|
|
],
|
|
"properties": {
|
|
"subagent_id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"subagent_label": { "$ref": "#/$defs/nonEmptyString" },
|
|
"dispatch_status": { "$ref": "#/$defs/nonEmptyString" },
|
|
"report_anchor_required": { "type": "boolean" },
|
|
"report_anchor_present": { "type": "boolean" },
|
|
"spawn_session_id": { "type": "string" },
|
|
"parent_agent_id": { "type": "string" },
|
|
"task_summary": { "type": "string" },
|
|
"worktree": { "type": "string" }
|
|
}
|
|
},
|
|
"subagentSpawnFailedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"failure_reason",
|
|
"failure_stage",
|
|
"immediate_report_required"
|
|
],
|
|
"properties": {
|
|
"failure_reason": { "$ref": "#/$defs/nonEmptyString" },
|
|
"failure_stage": { "$ref": "#/$defs/nonEmptyString" },
|
|
"immediate_report_required": { "type": "boolean" },
|
|
"attempted_subagent_label": { "type": "string" },
|
|
"error_code": { "type": "string" },
|
|
"retryable": { "type": "boolean" }
|
|
}
|
|
},
|
|
"subagentCompletedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"subagent_id",
|
|
"completion_state",
|
|
"result_available"
|
|
],
|
|
"properties": {
|
|
"subagent_id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"completion_state": { "$ref": "#/$defs/nonEmptyString" },
|
|
"result_available": { "type": "boolean" },
|
|
"result_ref": { "type": "string" },
|
|
"completed_at": { "type": "string", "format": "date-time" },
|
|
"exit_reason": { "type": "string" }
|
|
}
|
|
},
|
|
"subagentResultForwardedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"subagent_id",
|
|
"forwarded_at",
|
|
"forward_target"
|
|
],
|
|
"properties": {
|
|
"subagent_id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"forwarded_at": { "type": "string", "format": "date-time" },
|
|
"forward_target": { "$ref": "#/$defs/nonEmptyString" },
|
|
"source_result_ref": { "type": "string" },
|
|
"forward_message_ref": { "type": "string" },
|
|
"integrity_status": { "type": "string" }
|
|
}
|
|
},
|
|
"subagentResultNotForwardedPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"subagent_id",
|
|
"detected_at",
|
|
"reason",
|
|
"result_ref"
|
|
],
|
|
"properties": {
|
|
"subagent_id": { "$ref": "#/$defs/nonEmptyString" },
|
|
"detected_at": { "type": "string", "format": "date-time" },
|
|
"reason": { "$ref": "#/$defs/nonEmptyString" },
|
|
"result_ref": { "$ref": "#/$defs/nonEmptyString" },
|
|
"forward_deadline": { "type": "string", "format": "date-time" },
|
|
"watchdog_window_ms": { "$ref": "#/$defs/positiveInteger" },
|
|
"operator_notified": { "type": "boolean" }
|
|
}
|
|
},
|
|
"silenceTimeoutPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"duration_ms",
|
|
"expected_report_type"
|
|
],
|
|
"properties": {
|
|
"duration_ms": { "$ref": "#/$defs/positiveInteger" },
|
|
"expected_report_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"last_report_at": { "type": "string", "format": "date-time" },
|
|
"timeout_policy_id": { "type": "string" },
|
|
"blocking_action": { "type": "string" }
|
|
}
|
|
},
|
|
"watchdogFiredPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"watchdog_type",
|
|
"trigger_reason"
|
|
],
|
|
"properties": {
|
|
"watchdog_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"trigger_reason": { "$ref": "#/$defs/nonEmptyString" },
|
|
"triggered_at": { "type": "string", "format": "date-time" },
|
|
"policy_id": { "type": "string" },
|
|
"severity": { "type": "string" }
|
|
}
|
|
},
|
|
"reportAnchorMissingPayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"required_for",
|
|
"gate_action"
|
|
],
|
|
"properties": {
|
|
"required_for": { "$ref": "#/$defs/nonEmptyString" },
|
|
"gate_action": { "$ref": "#/$defs/nonEmptyString" },
|
|
"missing_anchor_kind": { "type": "string" },
|
|
"attempted_action": { "type": "string" },
|
|
"blocking": { "type": "boolean" }
|
|
}
|
|
},
|
|
"forcedOperatorUpdatePayload": {
|
|
"type": "object",
|
|
"additionalProperties": true,
|
|
"required": [
|
|
"reason",
|
|
"update_channel",
|
|
"trigger_event_type"
|
|
],
|
|
"properties": {
|
|
"reason": { "$ref": "#/$defs/nonEmptyString" },
|
|
"update_channel": { "$ref": "#/$defs/nonEmptyString" },
|
|
"trigger_event_type": { "$ref": "#/$defs/nonEmptyString" },
|
|
"update_ref": { "type": "string" },
|
|
"severity": { "type": "string" },
|
|
"deadline_breached": { "type": "boolean" }
|
|
}
|
|
},
|
|
"taskStartedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "task_started" },
|
|
"payload": { "$ref": "#/$defs/taskStartedPayload" }
|
|
}
|
|
},
|
|
"taskCheckpointDueEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "task_checkpoint_due" },
|
|
"payload": { "$ref": "#/$defs/taskCheckpointDuePayload" }
|
|
}
|
|
},
|
|
"taskCheckpointSentEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "task_checkpoint_sent" },
|
|
"payload": { "$ref": "#/$defs/taskCheckpointSentPayload" }
|
|
}
|
|
},
|
|
"taskStatusChangedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "task_status_changed" },
|
|
"payload": { "$ref": "#/$defs/taskStatusChangedPayload" }
|
|
}
|
|
},
|
|
"taskClaimedCompleteEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "task_claimed_complete" },
|
|
"payload": { "$ref": "#/$defs/taskClaimedCompletePayload" }
|
|
}
|
|
},
|
|
"taskEvidenceAttachedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "task_evidence_attached" },
|
|
"payload": { "$ref": "#/$defs/taskEvidenceAttachedPayload" },
|
|
"evidence_refs": {
|
|
"type": "array",
|
|
"minItems": 1
|
|
}
|
|
}
|
|
},
|
|
"subagentSpawnedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "subagent_spawned" },
|
|
"payload": { "$ref": "#/$defs/subagentSpawnedPayload" }
|
|
}
|
|
},
|
|
"subagentSpawnFailedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "subagent_spawn_failed" },
|
|
"payload": { "$ref": "#/$defs/subagentSpawnFailedPayload" }
|
|
}
|
|
},
|
|
"subagentCompletedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "subagent_completed" },
|
|
"payload": { "$ref": "#/$defs/subagentCompletedPayload" }
|
|
}
|
|
},
|
|
"subagentResultForwardedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "subagent_result_forwarded" },
|
|
"payload": { "$ref": "#/$defs/subagentResultForwardedPayload" }
|
|
}
|
|
},
|
|
"subagentResultNotForwardedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "subagent_result_not_forwarded" },
|
|
"payload": { "$ref": "#/$defs/subagentResultNotForwardedPayload" }
|
|
}
|
|
},
|
|
"silenceTimeoutEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "silence_timeout" },
|
|
"payload": { "$ref": "#/$defs/silenceTimeoutPayload" }
|
|
}
|
|
},
|
|
"watchdogFiredEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "watchdog_fired" },
|
|
"payload": { "$ref": "#/$defs/watchdogFiredPayload" }
|
|
}
|
|
},
|
|
"operatorReviewRequestedEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "operator_review_requested" },
|
|
"payload": { "$ref": "#/$defs/operatorReviewRequestedPayload" }
|
|
}
|
|
},
|
|
"reportAnchorMissingEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "report_anchor_missing" },
|
|
"payload": { "$ref": "#/$defs/reportAnchorMissingPayload" }
|
|
}
|
|
},
|
|
"forcedOperatorUpdateEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"event_type": { "const": "forced_operator_update" },
|
|
"payload": { "$ref": "#/$defs/forcedOperatorUpdatePayload" }
|
|
}
|
|
}
|
|
}
|
|
}
|