{
  "artifact_schema_version": 1,
  "artifact_type": "report",
  "identity": {
    "artifact_id": "durable evidence identity; distinct from content_hash",
    "report_id": "mutable ReportDefinition identity",
    "project_id": "owning project",
    "scenario_id": "owning scenario",
    "scenario_revision_id": "exact ScenarioRevision source",
    "run_ids": "ordered explicit source Run identities"
  },
  "delivery": {
    "format": ["markdown", "html"],
    "media_type": "text/markdown;charset=utf-8 or text/html;charset=utf-8",
    "filename": "download filename",
    "byte_size": "retrieved byte count",
    "content_hash": "lowercase SHA-256 hex digest",
    "storage_reference": "local IndexedDB byte-store reference",
    "availability": ["available", "missing", "corrupt"]
  },
  "generation": {
    "report_schema_version": "atom-report-v1",
    "generator_version": "atom-report-generator-v1",
    "generated_at": "ISO-8601 timestamp",
    "title": "presentation title",
    "scenario_name": "display label when available"
  },
  "provenance": {
    "source_kind": "scenario_revision, historical_run, comparison_runs, or live_compatibility",
    "report_manifest": {
      "report_schema_version": "copied from artifact",
      "generator_version": "copied from artifact",
      "scenario_fingerprint": "resolved ScenarioRevision fingerprint",
      "run_ids": "source Runs",
      "input_fingerprints": "source Run input fingerprints",
      "dataset_references": "dataset ids, versions, manifest/content hashes",
      "artifact_content_hash": "final SHA-256 after bytes are stored",
      "generated_at": "generation time"
    }
  },
  "immutability": "Generated bytes and artifact metadata are never overwritten during regeneration. A regeneration creates a new artifact_id; the ReportDefinition/source bindings are reused.",
  "validation": ["artifact_id", "report_id", "artifact_type", "format", "availability", "byte_size", "content_hash when present"]
}
