{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://oneclickpostfactory.invalid/coding-agent-skills/evidence-bundle.schema.json",
  "title": "Coding Agent Evidence Bundle",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "bundleVersion",
    "bundleId",
    "generatedAt",
    "core",
    "replay",
    "retention",
    "provenance",
    "archive",
    "entries",
    "regression",
    "changedState",
    "recommendedNextAction"
  ],
  "properties": {
    "bundleVersion": {
      "const": "1.2.0"
    },
    "bundleId": {
      "type": "string",
      "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
    },
    "generatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "core": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "currentVersion", "previousVersion"],
      "properties": {
        "id": {
          "const": "coding-agent-skills"
        },
        "currentVersion": {
          "type": "string",
          "pattern": "^\\d+\\.\\d+\\.\\d+$"
        },
        "previousVersion": {
          "type": "string",
          "pattern": "^\\d+\\.\\d+\\.\\d+$"
        }
      }
    },
    "replay": {
      "type": "object",
      "additionalProperties": false,
      "required": ["deterministic", "strategy"],
      "properties": {
        "deterministic": {
          "const": true
        },
        "strategy": {
          "const": "canonical-report-hash"
        }
      }
    },
    "retention": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "policyVersion",
        "classification",
        "minimumDays",
        "retainUntil",
        "disposition",
        "redaction",
        "storage",
        "expiryAdvisory"
      ],
      "properties": {
        "policyVersion": {
          "const": "1.0.0"
        },
        "classification": {
          "enum": ["synthetic-test-evidence", "maintainer-release-evidence"]
        },
        "minimumDays": {
          "type": "integer"
        },
        "retainUntil": {
          "type": "string",
          "format": "date-time"
        },
        "disposition": {
          "enum": ["retain-then-review", "retain-until-superseded"]
        },
        "redaction": {
          "const": "secret-values-prohibited"
        },
        "storage": {
          "enum": ["repository-fixture", "local-artifact", "external-archive-deferred"]
        },
        "expiryAdvisory": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "mode",
            "reviewThresholdDays",
            "action",
            "advisoryOnly",
            "deleteAutomatically"
          ],
          "properties": {
            "mode": {
              "const": "retention-expiry-review"
            },
            "reviewThresholdDays": {
              "type": "integer"
            },
            "action": {
              "const": "manual-review-only"
            },
            "advisoryOnly": {
              "const": true
            },
            "deleteAutomatically": {
              "const": false
            }
          }
        }
      }
    },
    "provenance": {
      "type": "object",
      "additionalProperties": false,
      "required": ["schemaVersion", "source", "producer", "sourceCommit", "sourceTag", "signature"],
      "properties": {
        "schemaVersion": {
          "const": "1.0.0"
        },
        "source": {
          "enum": ["synthetic-fixture", "maintainer-loop"]
        },
        "producer": {
          "type": "string",
          "pattern": "^[a-z0-9]+(?:[-./][a-z0-9]+)*$"
        },
        "sourceCommit": {
          "type": "string",
          "pattern": "^[a-f0-9]{40}$"
        },
        "sourceTag": {
          "type": "string",
          "pattern": "^v\\d+\\.\\d+\\.\\d+$"
        },
        "signature": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "mode",
            "status",
            "identityRef",
            "canonicalization",
            "digestAlgorithm",
            "verificationPlan"
          ],
          "properties": {
            "mode": {
              "const": "detached-signature-design"
            },
            "status": {
              "enum": ["unsigned-fixture", "verification-deferred", "detached-signature-present"]
            },
            "identityRef": {
              "type": "string",
              "pattern": "^[a-z0-9]+(?:[-./][a-z0-9]+)*$"
            },
            "canonicalization": {
              "const": "canonical-json-v1"
            },
            "digestAlgorithm": {
              "const": "sha256"
            },
            "signaturePath": {
              "type": "string",
              "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.env(?:\\.|/|$)).+\\.(?:sig|jsonl)$"
            },
            "signatureSha256": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            },
            "verificationPlan": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "mode",
                "status",
                "requiredArtifacts",
                "validatesSignatureNow",
                "failClosedWithoutValidSignature"
              ],
              "properties": {
                "mode": {
                  "const": "detached-signature-verification-plan"
                },
                "status": {
                  "enum": [
                    "fixture-unsigned-not-required",
                    "planned-not-run",
                    "ready-artifacts-required"
                  ]
                },
                "requiredArtifacts": {
                  "type": "array",
                  "minItems": 3,
                  "uniqueItems": true,
                  "items": {
                    "enum": [
                      "canonical-bundle-json",
                      "detached-signature",
                      "public-verification-identity"
                    ]
                  }
                },
                "validatesSignatureNow": {
                  "const": false
                },
                "failClosedWithoutValidSignature": {
                  "const": true
                }
              }
            }
          }
        }
      }
    },
    "archive": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "schemaVersion",
        "reportPath",
        "format",
        "includeRawEvidence",
        "includeSecretValues",
        "writePolicy",
        "maxReportBytes",
        "retentionLinked",
        "index"
      ],
      "properties": {
        "schemaVersion": {
          "const": "1.0.0"
        },
        "reportPath": {
          "type": "string",
          "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.env(?:\\.|/|$)).+\\.json$"
        },
        "format": {
          "const": "sanitized-json-summary"
        },
        "includeRawEvidence": {
          "type": "boolean"
        },
        "includeSecretValues": {
          "type": "boolean"
        },
        "writePolicy": {
          "const": "no-write-without-approval"
        },
        "maxReportBytes": {
          "type": "integer"
        },
        "retentionLinked": {
          "const": true
        },
        "index": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "schemaVersion",
            "path",
            "format",
            "includeRawEvidence",
            "includeSecretValues",
            "writePolicy",
            "retentionLinked"
          ],
          "properties": {
            "schemaVersion": {
              "const": "1.0.0"
            },
            "path": {
              "type": "string",
              "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.env(?:\\.|/|$)).+\\.json$"
            },
            "format": {
              "const": "sanitized-json-index"
            },
            "includeRawEvidence": {
              "const": false
            },
            "includeSecretValues": {
              "const": false
            },
            "writePolicy": {
              "const": "no-write-without-approval"
            },
            "retentionLinked": {
              "const": true
            }
          }
        }
      }
    },
    "entries": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["id", "kind", "path", "sha256", "expectedStatus"],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
          },
          "kind": {
            "enum": ["evidence-pack", "adapter-upgrade-evidence"]
          },
          "path": {
            "type": "string",
            "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.env(?:\\.|/|$)).+\\.json$"
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "expectedStatus": {
            "enum": ["complete", "partial", "failed", "blocked", "pass", "warn", "fail"]
          }
        }
      }
    },
    "regression": {
      "type": "object",
      "additionalProperties": false,
      "required": ["baselineVersion", "targetVersion", "baselineEntries"],
      "properties": {
        "baselineVersion": {
          "type": "string",
          "pattern": "^\\d+\\.\\d+\\.\\d+$"
        },
        "targetVersion": {
          "type": "string",
          "pattern": "^\\d+\\.\\d+\\.\\d+$"
        },
        "baselineEntries": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": ["id", "status"],
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
              },
              "status": {
                "enum": ["complete", "partial", "failed", "blocked", "pass", "warn", "fail"]
              }
            }
          }
        }
      }
    },
    "changedState": {
      "type": "object",
      "additionalProperties": false,
      "required": ["changed", "summary"],
      "properties": {
        "changed": {
          "const": false
        },
        "summary": {
          "type": "string",
          "minLength": 1
        }
      }
    },
    "recommendedNextAction": {
      "type": "string",
      "minLength": 1
    }
  }
}
