# FITNESS_OUTPUT -- Per-(source, claim) Fitness Record Template

**Consumer 1:** Multi-Method Orchestrator (reads `fitness_headline`, `disqualified`, `dimension_scores`, `reviewer_flag_required`).
**Consumer 2:** Epistemic Output Layer (reads full record for rationale render in the three-axis confidence report).

**Rule:** If any required field is missing, the record is invalid. Orchestrator MUST refuse invalid records.

---

## Schema

```json
{
  "fitness_record_id": "uuid",
  "run_id": "string",
  "claim_id": "string",
  "source_id": "string",
  "claim_type": "descriptive | causal | predictive | interpretive | normative",
  "discipline_tags": ["..."],

  "dimension_scores": [
    {
      "dimension_id": "D1",
      "score": 0,
      "evidence_excerpt": "verbatim from source or trace",
      "rationale_one_line": "must reference claim-type-specific load-bearing property"
    },
    {
      "dimension_id": "D2",
      "score": 0,
      "evidence_excerpt": "S2 integrity_flags verbatim",
      "rationale_one_line": "..."
    },
    {
      "dimension_id": "D3",
      "score": 0,
      "evidence_excerpt": "R7.3 metrics verbatim",
      "rationale_one_line": "...",
      "set_level_note": "populated in Step 8 if batch-reconciled"
    },
    {
      "dimension_id": "D4",
      "score": 0,
      "admiralty_reliability_A_to_F": "A-F or null",
      "admiralty_credibility_1_to_6": "1-6 or null",
      "reliability_justification": "distinct from credibility",
      "credibility_justification": "distinct from reliability",
      "admiralty_collapse_suspected": false,
      "admiralty_domain_mismatch": false,
      "rationale_one_line": "..."
    },
    {
      "dimension_id": "D5",
      "score": 0,
      "evidence_excerpt": "discipline-privileged property check",
      "rationale_one_line": "..."
    }
  ],

  "parameterized_weights": {
    "D1": 0.0, "D2": 0.0, "D3": 0.0, "D4": 0.0, "D5": 0.0,
    "post_discipline_modifier_vector": {"D1": 1.0, "D2": 1.0, "D3": 1.0, "D4": 1.0, "D5": 1.0},
    "weights_sum": 1.0
  },

  "load_bearing_dimensions": ["D1", "..."],
  "fragile_rubric": false,

  "fitness_headline": 0.0,
  "composite_function_documented": "fitness = sum_i(w_i * score_D_i)",

  "disqualified": false,
  "disqualifier_hits": [],
  "disqualifier_evidence": [],
  "tier_bias_suspected": false,
  "craap_reduction_suspected": false,

  "anti_deviation_inventory": {
    "tier_bias_suspected": false,
    "composite_collapse_suspected": false,
    "craap_reduction_suspected": false,
    "sycophancy_detected": false,
    "fragile_rubric_defaulting_detected": false,
    "reviewer_flag_required": false,
    "repairs_applied": [],
    "residual_weaknesses": []
  },

  "reviewer_flag_required": false,

  "rationale": "Must reference at least one claim-type-specific load-bearing property from CLAIM_TYPE_PROFILES.md. Must preserve per-dimension reasoning. Must not reduce to source-type labels.",

  "provenance": {
    "search_ledger_query_ids": ["..."],
    "surprise_register_entries_emitted": ["..."]
  },

  "timestamp_utc": "ISO-8601"
}
```

---

## Validation rules (SKILL.md Step 7 gate)

1. `dimension_scores` MUST have exactly 5 entries with dimension_ids D1..D5 in order.
2. Each dimension entry MUST have `rationale_one_line` distinct from the others (no duplicates).
3. `parameterized_weights.weights_sum` MUST equal 1.0 (within 0.001).
4. `composite_function_documented` MUST be non-empty.
5. `rationale` MUST reference at least one property from `claim_type_specific_load_bearing_properties` in the claim-type profile for `claim_type`. Grep-testable.
6. If `disqualified=true`, `fitness_headline` MUST equal 0.
7. If `fragile_rubric=true` AND this source is keystone, `reviewer_flag_required` MUST equal true.
8. If `tier_bias_suspected=true` OR `craap_reduction_suspected=true`, a residual weakness note MUST appear in the rationale OR in `anti_deviation_inventory.residual_weaknesses`.

## What Orchestrator reads

- `fitness_headline` for triangulation weight.
- `disqualified` for admissibility.
- `dimension_scores` for per-dimension gating (e.g., do not triangulate when D3 = 0 across admitted set).
- `reviewer_flag_required` for fragile-rubric keystone warning.

Orchestrator MUST NOT route on `fitness_headline` alone; consulting `dimension_scores` is contractual (SKILL.md Step 7 Interface Contract).

## What Output Layer reads

- The full record. Dimension rationales render into the three-axis confidence report. Headline renders as summary. Disqualifier hits and fragile-rubric flags render as top-level notes, never footnotes.
