# CLAIM TRIANGULATION RECORD (Template -- S3 Multi-Method Orchestrator)

**Purpose:** One record per claim after parallel disciplines return and triangulation classifies convergence. This is the unit of handoff to S4 (output) and a read-unit for S6 (saturation).

## Fields

```yaml
record_schema_version: "1.0.0"
record_id: "triangulation-<uuid>"
run_id: "<run-id>"
claim:
  claim_id: "<claim-id>"
  claim_text: "<verbatim from S5 decomposition>"
  claim_type: "descriptive | causal | predictive | normative | interpretive"
  stacked_intent: true | false
  fitness_requirements: ["<req1>", "<req2>", ...]
dispatch:
  selected_disciplines:
    - name: "<discipline>"
      selection_driver: "baseline | fitness-overlay | debiasing-overlay"
      selection_ledger_ref: "<ledger-id>"
  deferred_disciplines:
    - name: "<discipline>"
      deferral_reason: "CAPACITY_BOUND | DISCIPLINE_FAILED"
      ledger_ref: "<ledger-id>"
  exception_filed:
    present: true | false
    trigger_code: "T1 | T2 | T3 | T4 | null"
    exception_ledger_ref: "<ledger-id> | null"
  research_auditor_present: true
findings:
  - discipline: "<discipline>"
    finding_text: "<claim-level conclusion>"
    self_confidence_rubric: "GRADE | CERQual | Admiralty-input | realist-CMO | ..."
    self_confidence_value: "<per-rubric value>"
    sources_cited: ["<source-id>", ...]
    method_internal_flags: ["<flag>", ...]
    method_anomalies: ["<anomaly-ref>", ...]
    return_status: "RETURNED | DISCIPLINE_FAILED | CAPACITY_DEFERRED | INSUFFICIENT_EVIDENCE"
    ledger_ref: "<ledger-id>"
triangulation:
  convergence_class: "CONVERGENT | PARTIAL_AGREEMENT | CONTRADICTORY | UNDER_DETERMINED | NULL | EXCEPTION_SINGLETON"
  material_difference_exceeded: true | false
  synthesized_finding: "<text> | CONTESTED"
  contradiction_entries:
    - pair: ["<discipline_a>", "<discipline_b>"]
      axis: "direction | magnitude | mechanism | population | scope | other"
      surprise_register_entry_id: "<entry-id>"
  claim_type_revision_candidate:
    present: true | false
    surprise_register_entry_id: "<entry-id> | null"
    returned_to_S5: true | false
coverage_flag: "FULL_DISCIPLINE_COVERAGE | PARTIAL_DISCIPLINE_COVERAGE"
ledger_reference_range:
  first_entry_id: "<ledger-id>"
  last_entry_id: "<ledger-id>"
provenance:
  created_timestamp_utc: "<ISO-8601>"
  writer_component: "S3"
  version: "1.0.0"
```

## Invariants

- `selected_disciplines` length MUST be >= 2 OR `exception_filed.present` MUST be true. Never both false.
- `research_auditor_present` MUST be true on every record (non-removable baseline).
- `synthesized_finding` MUST equal literal `CONTESTED` iff `convergence_class == CONTRADICTORY` or (`PARTIAL_AGREEMENT` AND `material_difference_exceeded == true`).
- `contradiction_entries` non-empty iff `convergence_class == CONTRADICTORY` or material partial.
- `claim_type_revision_candidate.returned_to_S5` true iff a discipline surfaced a re-typing finding; silent re-routing is forbidden.
- `coverage_flag == PARTIAL_DISCIPLINE_COVERAGE` iff `deferred_disciplines` is non-empty; S6 MUST NOT stop while this flag is set on any claim.
- No field anywhere in this record contains a procedural tiebreaker outcome.

## Handoff

This record is emitted to S4 via the RAM handoff bundle and read by S6 for the run-level signal. It is NOT written to the Surprise Register -- the register receives only anomalies, contradictions, and revision candidates via SURPRISE_REGISTER_ENTRY.md.
