{
  "schema": "T_GPT_ANNOTATION_SPEC_V0_8_2",
  "date": "2026-09-11",
  "status": "DEVELOPMENT_BEFORE_CONFIRMATORY_FREEZE",
  "record_types": {
    "OUTPUT_ASSIGNMENT": {
      "unit": "one generated output",
      "fields": ["record_id", "phase", "task_id", "blinded_output_id", "annotator_id", "frozen_cluster_id_or_special", "confidence", "adjudication_required"],
      "allowed_final_assignments": ["FROZEN_CLUSTER_ID", "UNMAPPED", "UNRESOLVED"],
      "rule": "confirmation/replication cannot merge, split or create cluster identities; uncertain must be adjudicated to a final assignment or UNRESOLVED before metric export"
    },
    "CLUSTER_RELEVANCE": {
      "unit": "one frozen cluster per task",
      "fields": ["task_id", "cluster_id", "annotator_id", "relevance", "confidence", "adjudication_required"],
      "allowed_values": ["relevant", "irrelevant"],
      "rule": "R_t(c) is adjudicated at cluster level; output-level relevance is not converted silently into cluster relevance"
    },
    "AGGREGATE_REPRESENTATION": {
      "unit": "one aggregate Y × one blinded candidate cluster description",
      "fields": ["task_id", "aggregate_id", "candidate_cluster_id", "candidate_type", "annotator_id", "represented", "confidence", "adjudication_required"],
      "candidate_type": ["TRUE_POOL", "DISTRACTOR"],
      "represented_values": ["yes", "no"],
      "rule": "true-pool clusters and plausible distractors are mixed blindly; same normalized proposition-list aggregate and same output-token cap across conditions"
    },
    "BLINDNESS_GUESS": {
      "unit": "audit annotation session",
      "fields": ["annotator_id", "audit_item_id", "guessed_condition", "confidence"],
      "purpose": "measure whether condition masking actually prevents identification above chance"
    }
  },
  "blinding": {
    "condition_label_removed": true,
    "model_identity_removed_where_feasible": true,
    "T_vocabulary_forbidden_in_annotation_instructions": true,
    "project_author_primary_reference_annotator": false,
    "minimum_independent_annotators": 2,
    "third_adjudicator": "required for disagreements affecting primary endpoints"
  },
  "agreement_gates": {
    "cluster_assignment": {"metric":"Krippendorff_alpha_nominal", "minimum":0.67, "target":0.80},
    "cluster_relevance": {"metric":"Krippendorff_alpha_nominal", "minimum":0.67, "target":0.80},
    "aggregate_representation": {"metric":"Krippendorff_alpha_nominal", "minimum":0.67, "target":0.80},
    "failure_action": "NO-GO: return to development, revise codebook/rubric, issue new freeze_id before any primary analysis"
  },
  "metric_export_rules": {
    "uncertain_token_forbidden": true,
    "unknown_cluster_id_forbidden": true,
    "all_non_special_cluster_ids_must_exist_in_relevance_table": true,
    "UNMAPPED_and_UNRESOLVED_retained_in_total_denominator": true,
    "no_silent_default_relevance": true
  }
}
