{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:orbiplex:schema:artifact-acquisition-record:v1",
  "title": "Artifact Acquisition Record v1",
  "description": "Closed append-only record family for acquisition attempts, stable receipts, extraction facts, and object transitions.",
  "oneOf": [
    { "$ref": "#/$defs/attempt" },
    { "$ref": "#/$defs/receipt" },
    { "$ref": "#/$defs/extraction" },
    { "$ref": "#/$defs/objectTransition" }
  ],
  "x-dia-workflow": "project",
  "x-dia-status": "draft",
  "x-dia-basis": [
    "doc/project/40-proposals/088-pull-based-artifact-acquisition.md"
  ],
  "$defs": {
    "digest": { "type": "string", "pattern": "^sha256:[A-Za-z0-9_-]{43}$" },
    "ref": { "type": "string", "minLength": 3, "maxLength": 512, "pattern": "^[a-z][a-z0-9.-]*:[^\\s\\u0000-\\u001F\\u007F]+$" },
    "refusal": {
      "type": "object",
      "additionalProperties": false,
      "required": ["code", "retry/class"],
      "properties": {
        "code": {
          "enum": [
            "source-generation-inactive",
            "source-generation-stale",
            "consumption-mode-unsupported",
            "connector-authority-refused",
            "locator-authority-refused",
            "source-unavailable",
            "operation-capacity-unavailable",
            "operation-deadline-exceeded",
            "content-limit-exceeded",
            "package-malformed",
            "package-layout-refused",
            "content-size-mismatch",
            "content-digest-mismatch",
            "carrier-content-type-refused",
            "extraction-profile-refused",
            "extraction-selector-refused",
            "extraction-no-candidate",
            "extraction-candidate-ambiguous",
            "extraction-limit-exceeded",
            "inner-schema-unsupported",
            "inner-signature-invalid",
            "inner-trust-unresolved",
            "inner-trust-refused",
            "anti-rollback-regression",
            "anti-rollback-conflict",
            "snapshot-incomplete",
            "location-advice-refused",
            "location-resolution-unavailable",
            "location-cycle-detected",
            "admission-acceptor-refused",
            "operation-interrupted",
            "external-outcome-unknown"
          ]
        },
        "retry/class": { "enum": ["terminal", "retryable", "reconcile-required"] },
        "cause/code": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[a-z][a-z0-9-]*$" }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "code": {
                "enum": [
                  "source-unavailable",
                  "operation-capacity-unavailable",
                  "operation-deadline-exceeded",
                  "inner-trust-unresolved",
                  "location-resolution-unavailable",
                  "operation-interrupted"
                ]
              }
            }
          },
          "then": { "properties": { "retry/class": { "const": "retryable" } } }
        },
        {
          "if": { "properties": { "code": { "const": "external-outcome-unknown" } } },
          "then": { "properties": { "retry/class": { "const": "reconcile-required" } } }
        },
        {
          "if": {
            "properties": {
              "code": {
                "not": {
                  "enum": [
                    "source-unavailable",
                    "operation-capacity-unavailable",
                    "operation-deadline-exceeded",
                    "inner-trust-unresolved",
                    "location-resolution-unavailable",
                    "operation-interrupted",
                    "external-outcome-unknown"
                  ]
                }
              }
            }
          },
          "then": { "properties": { "retry/class": { "const": "terminal" } } }
        }
      ]
    },
    "attempt": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schema", "schema/v", "record/kind", "attempt/id", "operation/ref", "source/id", "source/generation", "outcome", "checked/at", "freshness/advanced"],
      "properties": {
        "schema": { "const": "artifact-acquisition-record.v1" },
        "schema/v": { "const": 1 },
        "record/kind": { "const": "attempt" },
        "attempt/id": { "$ref": "#/$defs/ref" },
        "operation/ref": { "$ref": "#/$defs/ref" },
        "source/id": { "type": "string", "minLength": 17, "maxLength": 256, "pattern": "^artifact-source:[A-Za-z0-9][A-Za-z0-9._:-]*$" },
        "source/generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
        "outcome": { "enum": ["receipts-created", "unchanged", "refused", "failed-retryable", "unknown"] },
        "checked/at": { "type": "string", "format": "date-time" },
        "freshness/advanced": { "type": "boolean" },
        "candidate/count": {
          "type": "integer",
          "minimum": 1,
          "maximum": 64,
          "description": "Number of verified candidates produced before receipt deduplication. P088-007 typed validation enforces that receipt/refs contains no more entries than this count."
        },
        "receipt/refs": {
          "type": "array",
          "minItems": 1,
          "maxItems": 64,
          "uniqueItems": true,
          "items": { "$ref": "#/$defs/ref" },
          "description": "Distinct receipts created or replayed for the verified candidates. P088-007 typed validation enforces 1 <= receipt/refs length <= candidate/count."
        },
        "refusal": { "$ref": "#/$defs/refusal" }
      },
      "allOf": [
        {
          "if": { "properties": { "outcome": { "enum": ["refused", "failed-retryable", "unknown"] } } },
          "then": { "required": ["refusal"], "properties": { "freshness/advanced": { "const": false } } },
          "else": { "not": { "required": ["refusal"] } }
        },
        {
          "if": { "properties": { "outcome": { "const": "receipts-created" } } },
          "then": { "required": ["candidate/count", "receipt/refs"] },
          "else": {
            "not": {
              "anyOf": [
                { "required": ["candidate/count"] },
                { "required": ["receipt/refs"] }
              ]
            }
          }
        },
        {
          "if": { "properties": { "outcome": { "const": "unchanged" } } },
          "then": { "properties": { "freshness/advanced": { "const": true } } }
        },
        {
          "if": { "properties": { "outcome": { "const": "refused" } } },
          "then": { "properties": { "refusal": { "properties": { "retry/class": { "const": "terminal" } } } } }
        },
        {
          "if": { "properties": { "outcome": { "const": "failed-retryable" } } },
          "then": { "properties": { "refusal": { "properties": { "retry/class": { "const": "retryable" } } } } }
        },
        {
          "if": { "properties": { "outcome": { "const": "unknown" } } },
          "then": { "properties": { "refusal": { "properties": { "retry/class": { "const": "reconcile-required" } } } } }
        }
      ]
    },
    "receipt": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schema", "schema/v", "record/kind", "receipt/id", "source/id", "source/generation", "content/digest", "content/size", "object/ref", "verified/at"],
      "properties": {
        "schema": { "const": "artifact-acquisition-record.v1" },
        "schema/v": { "const": 1 },
        "record/kind": { "const": "receipt" },
        "receipt/id": { "$ref": "#/$defs/ref" },
        "source/id": { "type": "string", "minLength": 17, "maxLength": 256, "pattern": "^artifact-source:[A-Za-z0-9][A-Za-z0-9._:-]*$" },
        "source/generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
        "content/digest": { "$ref": "#/$defs/digest" },
        "content/size": { "type": "integer", "minimum": 0, "maximum": 8388608 },
        "object/ref": { "$ref": "#/$defs/ref" },
        "verified/at": { "type": "string", "format": "date-time" }
      }
    },
    "extraction": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schema", "schema/v", "record/kind", "extraction/id", "source/id", "source/generation", "carrier", "profile", "selector", "candidate", "receipt/ref"],
      "properties": {
        "schema": { "const": "artifact-acquisition-record.v1" },
        "schema/v": { "const": 1 },
        "record/kind": { "const": "extraction" },
        "extraction/id": { "$ref": "#/$defs/ref" },
        "source/id": { "type": "string", "minLength": 17, "maxLength": 256, "pattern": "^artifact-source:[A-Za-z0-9][A-Za-z0-9._:-]*$" },
        "source/generation": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
        "carrier": { "$ref": "#/$defs/contentEvidence" },
        "profile": {
          "type": "object",
          "additionalProperties": false,
          "required": ["ref", "digest", "implementation/digest"],
          "properties": {
            "ref": { "$ref": "#/$defs/ref" },
            "digest": { "$ref": "#/$defs/digest" },
            "implementation/digest": { "$ref": "#/$defs/digest" }
          }
        },
        "selector": {
          "type": "object",
          "additionalProperties": false,
          "required": ["kind", "digest"],
          "properties": {
            "kind": { "enum": ["whole-resource", "whole-text", "line-range", "html-element-id", "mime-part"] },
            "digest": { "$ref": "#/$defs/digest" }
          }
        },
        "candidate": {
          "type": "object",
          "additionalProperties": false,
          "required": ["ordinal", "digest", "size-bytes"],
          "properties": {
            "ordinal": { "type": "integer", "minimum": 0, "maximum": 63 },
            "digest": { "$ref": "#/$defs/digest" },
            "size-bytes": { "type": "integer", "minimum": 0, "maximum": 8388608 }
          }
        },
        "receipt/ref": { "$ref": "#/$defs/ref" }
      }
    },
    "contentEvidence": {
      "type": "object",
      "additionalProperties": false,
      "required": ["digest", "size-bytes"],
      "properties": {
        "digest": { "$ref": "#/$defs/digest" },
        "size-bytes": { "type": "integer", "minimum": 0, "maximum": 67108864 }
      }
    },
    "objectTransition": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schema", "schema/v", "record/kind", "object/ref", "transition/sequence", "from", "to", "transitioned/at"],
      "properties": {
        "schema": { "const": "artifact-acquisition-record.v1" },
        "schema/v": { "const": 1 },
        "record/kind": { "const": "object-transition" },
        "object/ref": { "$ref": "#/$defs/ref" },
        "transition/sequence": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 },
        "from": { "enum": ["absent", "staged", "verified", "admitted", "expired", "corrupt"] },
        "to": { "enum": ["staged", "verified", "admitted", "expired", "purged", "corrupt"] },
        "transitioned/at": { "type": "string", "format": "date-time" }
      }
    }
  }
}
