{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://github.com/Kucell/cortex-agent/schemas/decision.schema.json",
  "title": "Cortex Agent Decision",
  "description": "Mode-agnostic decision record. Both code mode (architecture/merge/release) and general mode (lifestyle/risk) use the same shape. A decision is the resolved answer to a gate; a waitpoint (WP-*) is its paused-state twin.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "decision_id",
    "type",
    "status",
    "requested_by",
    "prompt",
    "options",
    "gate",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "schema_version": { "const": 1 },
    "decision_id": {
      "type": "string",
      "pattern": "^D-[A-Za-z0-9][A-Za-z0-9._-]*$",
      "description": "Stable decision id, prefix D-."
    },
    "type": {
      "type": "string",
      "enum": ["approval", "architecture", "merge", "release", "risk", "lifestyle"],
      "description": "lifestyle is general-mode only; the rest apply to both modes."
    },
    "status": {
      "type": "string",
      "enum": ["open", "approved", "rejected", "revision_requested", "canceled", "superseded"]
    },
    "requested_by": { "type": "string", "minLength": 1 },
    "prompt": { "type": "string", "minLength": 1 },
    "options": {
      "type": "array",
      "minItems": 2,
      "uniqueItems": true,
      "items": { "type": "string", "minLength": 1 }
    },
    "selected_option": { "type": ["string", "null"] },
    "resolved_by": { "type": ["string", "null"] },
    "resolved_at": { "type": ["string", "null"], "format": "date-time" },
    "rationale": { "type": "string" },
    "gate": {
      "type": "object",
      "required": ["action", "resource_ref"],
      "properties": {
        "action": {
          "type": "string",
          "enum": ["architecture", "merge", "release", "destructive", "credential", "external_side_effect", "lifestyle"]
        },
        "resource_ref": { "type": "string", "minLength": 1 }
      },
      "additionalProperties": false
    },
    "task_id": { "type": ["string", "null"] },
    "mission_id": { "type": ["string", "null"] },
    "superseded_by_decision_id": {
      "type": ["string", "null"],
      "pattern": "^D-[A-Za-z0-9][A-Za-z0-9._-]*$"
    },
    "created_at": { "type": "string", "format": "date-time" },
    "updated_at": { "type": "string", "format": "date-time" }
  },
  "allOf": [
    {
      "if": {
        "properties": { "status": { "enum": ["approved", "rejected", "revision_requested"] } },
        "required": ["status"]
      },
      "then": {
        "properties": {
          "selected_option": { "type": "string", "minLength": 1 },
          "resolved_by": { "type": "string", "minLength": 1 },
          "resolved_at": { "type": "string", "format": "date-time" }
        }
      }
    },
    {
      "if": {
        "properties": { "status": { "const": "open" } },
        "required": ["status"]
      },
      "then": {
        "properties": {
          "selected_option": { "type": "null" },
          "resolved_by": { "type": "null" },
          "resolved_at": { "type": "null" }
        }
      }
    },
    {
      "if": {
        "properties": { "status": { "const": "superseded" } },
        "required": ["status"]
      },
      "then": {
        "properties": {
          "selected_option": { "type": "null" },
          "resolved_by": { "type": "string", "minLength": 1 },
          "resolved_at": { "type": "string", "format": "date-time" },
          "superseded_by_decision_id": { "type": "string", "pattern": "^D-[A-Za-z0-9][A-Za-z0-9._-]*$" }
        },
        "required": ["resolved_by", "resolved_at", "superseded_by_decision_id"]
      }
    }
  ]
}
