{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Krummholz preliminary historical text excerpt",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "text",
    "language",
    "topic",
    "word_count",
    "source_record_id",
    "source_title",
    "source_url",
    "source_collection",
    "source_record_year",
    "source_publication_label",
    "source_license",
    "rights_jurisdiction",
    "rights_basis",
    "source_dataset",
    "source_revision",
    "source_shard",
    "source_chunk_ordinal",
    "text_sha256",
    "status",
    "curation_version"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Stable chunk identifier, derived from original record ID, candidate ordinal and text hash."
    },
    "text": {
      "type": "string",
      "description": "Curated historical source excerpt; residual OCR and outdated claims may remain."
    },
    "language": {
      "type": "string",
      "description": "en; upstream English label, supported by prose screening.",
      "const": "en"
    },
    "topic": {
      "type": "string",
      "description": "Editorial scope label; not a trained or validated classifier result.",
      "enum": [
        "reasoning_language",
        "forestry_ecology"
      ]
    },
    "word_count": {
      "type": "integer",
      "description": "Count using ASCII alphabetic word tokens with optional internal apostrophe/hyphen; not model tokens.",
      "minimum": 120,
      "maximum": 360
    },
    "source_record_id": {
      "type": "string",
      "description": "Exact identifier from the pinned Common Corpus source row."
    },
    "source_title": {
      "type": "string",
      "description": "Source title from Common Corpus."
    },
    "source_url": {
      "type": "string",
      "description": "Reviewed original catalog or library item URL."
    },
    "source_collection": {
      "type": "string",
      "description": "Original Common Corpus collection label."
    },
    "source_record_year": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Uncorrected upstream year; may be null or a journal-series start, and must not be treated as an exact volume year."
    },
    "source_publication_label": {
      "type": "string",
      "description": "Reviewed original volume/edition date label; preserves reprint ambiguity where relevant."
    },
    "source_license": {
      "type": "string",
      "description": "Upstream Public Domain label; read rights_basis, sources.json and README."
    },
    "rights_jurisdiction": {
      "type": "string",
      "description": "Jurisdiction used for rights assessment; not worldwide clearance."
    },
    "rights_basis": {
      "type": "string",
      "description": "Evidence supporting source eligibility; not legal advice or a warranty."
    },
    "source_dataset": {
      "type": "string",
      "description": "Pinned dataset repository identity."
    },
    "source_revision": {
      "type": "string",
      "description": "Immutable source revision."
    },
    "source_shard": {
      "type": "string",
      "description": "Path of the original downloaded Parquet shard."
    },
    "source_chunk_ordinal": {
      "type": "integer",
      "description": "Zero-based ordinal in deterministic pre-filter sentence chunks of the normalized upstream fragment; gaps indicate exclusions. This is not an original book page or paragraph number.",
      "minimum": 0
    },
    "text_sha256": {
      "type": "string",
      "description": "SHA-256 over exact UTF-8 text field bytes.",
      "pattern": "^[a-f0-9]{64}$"
    },
    "status": {
      "type": "string",
      "description": "PRELIMINARY",
      "const": "PRELIMINARY"
    },
    "curation_version": {
      "type": "string",
      "description": "Curation release version."
    }
  }
}
