{
  "schema": "T_GPT_METRICS_V0_8_1",
  "version": "0.8.1",
  "date": "2026-09-11",
  "status": "FORMAL_SPEC_BEFORE_CONFIRMATORY_COLLECTION",
  "scope": "Observable semantic support and recoverability. No metric is interpreted as direct access to a latent total field or model weights.",
  "field_types": {
    "FIELD_TOK": "conditional token-probability distribution when available",
    "FIELD_SEM": "empirical distribution over frozen semantic cluster identities",
    "FIELD_TRAJ": "set or graph of reasoning/agent trajectories with provenance",
    "FIELD_VIS": "configurations exposed by an interface or final aggregate"
  },
  "non_equivalence_rule": "FIELD_TOK != FIELD_SEM != FIELD_TRAJ != FIELD_VIS. Cross-level claims require an explicit measurement bridge.",
  "semantic_identity": {
    "development_phase": "Build the semantic codebook on development data only, using bidirectional entailment as the primary semantic-equivalence criterion, embedding clustering as sensitivity analysis, and blinded human validation.",
    "confirmation_phase": "Freeze cluster IDs, labels, exemplars and assignment rules before confirmatory samples are generated. Confirmation samples map to frozen IDs or UNMAPPED; primary metrics do not create new cluster identities post hoc.",
    "split_merge_rule": "Apparent splits or merges discovered after freeze are exploratory. They cannot alter primary confirmatory scores; they are reported as sensitivity analyses.",
    "reference": "Farquhar et al., Nature 2024 semantic-entropy methodology is an antecedent for semantic equivalence/clustering, not a claim that T^GPT measures the same construct."
  },
  "support_detection": {
    "tau_support": 0.02,
    "minimum_count": 2,
    "formula": "k_X = max(minimum_count, ceil(tau_support * N_X)); cluster c is observed in condition X iff n_X(c) >= k_X.",
    "rationale": "Prevents a single accidental generation from defining confirmatory support while retaining low-frequency clusters at N>=64.",
    "sensitivity": [0.01, 0.03, 0.05]
  },
  "relevance": {
    "symbol": "R(c)",
    "primary_definition": "Binary adjudicated relevance of frozen cluster c to the task, based on condition-masked double annotation under the frozen codebook.",
    "allowed_values": [0, 1],
    "author_primary_annotation_forbidden": true,
    "report_unfiltered_parallel_analysis": true
  },
  "probabilities": {
    "formula": "p_X(c) = n_X(c) / sum_j n_X(j) over mapped samples in condition X",
    "unmapped_reporting": "UNMAPPED rate is reported separately and never silently redistributed."
  },
  "D_sem": {
    "role": "secondary descriptive",
    "formula": "D_sem(X) = |S_X^+| where S_X^+ = {c : observed_X(c)=1 and R(c)=1}",
    "interpretation": "Count of relevant frozen semantic configurations observed above the support floor."
  },
  "H_sem": {
    "role": "secondary descriptive",
    "formula": "H_sem(X) = - sum_{c in S_X^+} q_X(c) * ln(q_X(c)), where q_X is p_X renormalized over S_X^+",
    "interpretation": "Entropy across relevant frozen semantic configurations; reported separately from task quality."
  },
  "P": {
    "role": "guardrail",
    "formula": "P(X) = (# mapped samples assigned to clusters with R(c)=1) / (# mapped samples)",
    "interpretation": "Sample-level relevance proportion, never multiplied into D_sem as a sovereign score."
  },
  "ES_LOSS": {
    "role": "primary precursor",
    "direction": "A -> B, where A is the preregistered wider/reference condition and B the candidate contracted condition",
    "lost_set": "L(A,B) = S_A^+ \\ S_B^+",
    "formula": "ES_LOSS(A,B) = sum_{c in L(A,B)} p_A(c) / sum_{c in S_A^+} p_A(c)",
    "range": [0, 1],
    "interpretation": "Reference semantic probability mass carried by relevant clusters observed in A but not observed above the frozen support floor in B. It is observable support loss, not latent-space loss."
  },
  "REC_GAIN": {
    "role": "PRIMARY_ENDPOINT",
    "probe_pool": "R(B) is generated from B using only preregistered generic recovery probes that do not name missing cluster identities.",
    "recovered_set": "G(A,B,R) = L(A,B) intersect S_R^+",
    "formula": "REC_GAIN(A,B,R) = sum_{c in G(A,B,R)} p_A(c) / sum_{c in L(A,B)} p_A(c)",
    "undefined_case": "If ES_LOSS(A,B)=0, REC_GAIN is NA rather than 0 or 1.",
    "range": [0, 1],
    "interpretation": "Fraction of lost reference mass whose cluster identities reappear under generic recovery probes."
  },
  "IRREV_OBS": {
    "role": "derived endpoint",
    "formula": "IRREV_OBS(A,B,R) = 1 - REC_GAIN(A,B,R)",
    "undefined_case": "NA whenever REC_GAIN is NA.",
    "interpretation": "Non-recovered fraction under this exact probe family, model, sampling regime and budget; never interpreted as irreversibility of model weights or cognition."
  },
  "AGG_COVERAGE": {
    "role": "primary for aggregation/topology studies",
    "formula": "AGG_COVERAGE(P,Y) = sum_{c in S_P^+ and represented_Y(c)} w_P(c) / sum_{c in S_P^+} w_P(c), with w_P(c)=p_P(c) by default",
    "interpretation": "Relevant semantic coverage retained when a frozen branch pool P is transformed into aggregate Y."
  },
  "MINORITY_RECALL": {
    "role": "secondary for aggregation/topology studies",
    "minority_definition": "Clusters in the bottom preregistered quartile of non-zero p_P(c) within the frozen relevant pool.",
    "formula": "MINORITY_RECALL(P,Y) = (# minority relevant cluster IDs represented in Y)/(# minority relevant cluster IDs in P)",
    "interpretation": "Whether low-frequency relevant configurations survive aggregation; rarity alone is not a quality signal."
  },
  "quality_guardrails": {
    "Q_task": "Task-success measure defined per task before confirmation.",
    "Q_fact": "Factuality measure used only on tasks with externally checkable factual claims.",
    "cost": ["input_tokens", "output_tokens", "total_tokens", "wall_clock_latency", "serial_depth", "parallelizable_calls", "estimated_monetary_cost"]
  },
  "uncertainty": {
    "within_task": "Non-parametric bootstrap over independent generations with frozen cluster assignment rules; 10000 resamples; percentile 95% confidence intervals.",
    "across_tasks": "For claims generalized across a task family, task is the upper-level unit. Use task-level bootstrap or a preregistered hierarchical model; samples within one task are not independent replications of the general phenomenon.",
    "paired_aggregation": "For aggregators operating on the same frozen branch pools, bootstrap resamples pools as paired units.",
    "multiple_comparisons": "One primary endpoint/comparison is declared per experiment. Secondary endpoints are labeled exploratory or adjusted using Holm correction within each experiment family.",
    "effect_sizes": "Always report absolute difference and ratio where defined, with confidence intervals; p-values alone are insufficient."
  },
  "finite_sample_caveat": "Support is operational and N-dependent. All primary results include the preregistered support-threshold sensitivity analysis and UNMAPPED rate.",
  "primary_experiment_order": ["E1_STAGE", "E2_RECOVERY", "E3_TOPOLOGY", "E4_R_META"],
  "primary_endpoint_by_experiment": {
    "E1_STAGE": "change in ES_LOSS/REC_GAIN across adjacent post-training stages with Q_task/Q_fact guardrails",
    "E2_RECOVERY": "REC_GAIN",
    "E3_TOPOLOGY": "AGG_COVERAGE at matched total-token budget",
    "E4_R_META": "difference in blinded structural-recurrence rate between structural-critique and style-control arms"
  }
}