Schema: operation-receipt

{
  "$id": "https://australis.systems/schemas/htmx-ui-template-scaffold/operation-receipt.schema.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "description": "Target-side receipt emitted by reconcile, assets sync, and other operations. The receipt records the operation kind, dry-run flag, ordered per-path status outcomes, and an RFC3339 timestamp. Optional fields bind the receipt to the plan or asset approval that authorized it. NOTE: planner.py.sync_assets() does NOT emit plan_digest; only planner.py.reconcile() does. Producers MUST attach plan_digest only when the underlying operation was reconcile.",
  "properties": {
    "backup_path": {
      "minLength": 1,
      "type": "string"
    },
    "corpus_manifest_path": {
      "description": "Optional target-state-relative path to the Shape-B corpus manifest emitted after successful non-dry reconcile.",
      "minLength": 1,
      "type": "string"
    },
    "dry_run": {
      "description": "True if the operation computed the receipt without mutating. False if any filesystem mutation or state-root creation occurred.",
      "type": "boolean"
    },
    "history_revision": {
      "description": "Optional immutable history revision id assigned to this operation. Populated when not a dry run.",
      "minLength": 1,
      "type": "string"
    },
    "journal_path": {
      "minLength": 1,
      "type": "string"
    },
    "operation": {
      "description": "Operation discriminator. Mapped reconcile is distinct from generic reconcile.",
      "enum": [
        "reconcile",
        "mapped_reconcile",
        "assets_sync"
      ],
      "type": "string"
    },
    "operations": {
      "description": "Per-path status entries, ordered as executed.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "path": {
            "description": "Target-relative path the operation refers to.",
            "minLength": 1,
            "type": "string"
          },
          "source_path": {
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "description": "Operation status emitted by reconcile or assets sync.",
            "enum": [
              "CREATE",
              "CREATE_PARTIAL",
              "IDENTICAL",
              "MANAGED_DRIFT",
              "PRESERVED_EXISTING",
              "UPDATE",
              "UPDATE_PARTIAL",
              "UPGRADE",
              "REPLACED"
            ],
            "type": "string"
          }
        },
        "required": [
          "path",
          "status"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "plan_digest": {
      "description": "OPTIONAL SHA-256 hex digest of the plan that authorized this receipt. Reconcile emits this; assets sync MUST omit it because assets sync binds to an asset approval rather than a plan.",
      "pattern": "^[a-f0-9]{64}$",
      "type": "string"
    },
    "profile_validations": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "profile": {
            "enum": [
              "PAGE_ONLY",
              "PAGE_WITH_HTMX_PARTIALS"
            ],
            "type": "string"
          },
          "route_id": {
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "const": "PASS"
          }
        },
        "required": [
          "route_id",
          "profile",
          "status"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "replacement_mode": {
      "type": "boolean"
    },
    "schema_version": {
      "description": "Major-version-locked envelope. Documents with any value other than 1.0.0 MUST fail validation, which enforces the major-version-1 contract.",
      "enum": [
        "1.0.0"
      ],
      "type": "string"
    },
    "target_state_digest": {
      "description": "SHA-256 digest of the expected post-reconcile target state (approved paths only); null when the approval omitted this field.",
      "pattern": "^[a-f0-9]{64}$",
      "type": [
        "string",
        "null"
      ]
    },
    "timestamp_utc": {
      "description": "RFC3339 (ISO 8601 with UTC offset) timestamp the receipt was produced.",
      "format": "date-time",
      "type": "string"
    }
  },
  "required": [
    "schema_version",
    "operation",
    "dry_run",
    "operations",
    "timestamp_utc"
  ],
  "title": "Operation Receipt",
  "type": "object"
}