{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "schemas/callback_4tuple.schema.json",
  "title": "callback_4tuple.v1",
  "description": "task-2553+32 §4.5/§6.12 — executor callback 4-tuple. normal_collector_cron_id is MANDATORY (a missing/null value makes the contract INVALID; NO-CRON does NOT exempt it, §6.3/§6.5). The executor normal completion callback is a designed lifecycle signal, NOT a registry/checkpoint ad-hoc cron and NOT a +32 cron-remove (9-R.1).",
  "type": "object",
  "required": [
    "schema",
    "task_id",
    "dispatch_cron_id",
    "normal_collector_cron_id",
    "fallback_callback_cron_id"
  ],
  "properties": {
    "schema": {
      "type": "string",
      "const": "callback_4tuple.v1"
    },
    "task_id": {
      "type": "string",
      "minLength": 1
    },
    "dispatch_cron_id": {
      "type": "string",
      "minLength": 1
    },
    "normal_collector_cron_id": {
      "type": "string",
      "minLength": 1,
      "description": "MANDATORY. Null/empty/absent => contract invalid (§4.5/§6.12). This is the executor's own normal completion callback cron — a lifecycle signal."
    },
    "fallback_callback_cron_id": {
      "type": "string",
      "minLength": 1,
      "description": "Safety path (§6.6). Preserved; cancel-on-success applies only AFTER normal collector success (§4.9/§6.7)."
    },
    "fallback_cancel_on_success": {
      "type": "boolean",
      "description": "If true, fallback is cancelled ONLY after a verified normal collector success (system-sanctioned, 9-R.1; +32 executes 0 cron-remove)."
    }
  },
  "additionalProperties": true
}
