# THREE_AXIS_COMPUTATION_SPEC -- Evidence / Transportability / Decision

**Owner:** Epistemic Output Layer (S4). **Library:** Private RAM. **Consumers:** S4 only.

This spec is the computational contract for the three axes. Each axis is an independent object. Intermediate scores are NEVER shared across axes. The three outputs are rendered as three separate blocks downstream.

---

## 1. Canonical Axis Order

The order is fixed: **evidence -> transportability -> decision**. Reordering signals tacit re-prioritization and is thrown by the render validator. Render the axes in this order in every per-claim block, every time.

---

## 2. Axis 1 -- Evidence

### 2.1 Inputs
- `triangulated_findings` (from Orchestrator): list of findings per claim with independence labels.
- `fitness_inputs` (from Fitness Adjudicator): per-source fitness score + rationale, claim-type-profile-bound.
- `integrity_inputs` (from Source Integrity Screen): retraction / AI-contamination / publication-bias screen results, per source.
- `adversarial_findings` (from Adversarial Pass Engine): disconfirmation-pass contradictions.
- Surprise Register entries bound to this claim.

### 2.2 Computation
1. Aggregate fitness scores across sources that passed the integrity screen. Sources that failed integrity are NOT part of the aggregate and appear only in Search Ledger `every-rejected` entries.
2. Count methodologically independent sources converging on the claim. Orchestrator has already labeled independence per discipline; do not recompute.
3. Attach adversarial-pass contradictions as a `contradiction-record`. Contradictions EXPAND the evidence statement; they never adjudicate it away.
4. Determine `strength_band` using: `{weak, moderate, strong, defensible-null}`. `defensible-null` only when Warrant Governor returned `nothing-found-after-expand` AND adversarial pass returned no contradictions AND Search Ledger documents the expansion.

### 2.3 Output Schema
```json
{
  "strength_band": "weak | moderate | strong | defensible-null",
  "supporting_source_count": "integer",
  "independent_method_count": "integer",
  "contradiction_record": [ { "source_ref": "...", "contradiction_text": "...", "pass_id": "..." } ],
  "fitness_distribution": { "min": "float", "median": "float", "max": "float" }
}
```

---

## 3. Axis 2 -- Transportability

### 3.1 Inputs
- `claim_type` in `{descriptive, causal, predictive, normative, interpretive}`.
- `decision_context_descriptor` (reader-supplied at question-intake; MUST be present).
- Study-context features extracted from triangulated sources.

### 3.2 Computation Contract
- Select the feature slot per claim type from `FEATURE_SLOT_SUBSTITUTION.md`. The slot is substituted, NOT reweighted.
- Compute the slot's primitive (sampling representativeness / mechanism-context coupling / covariate shift / value commensurability / reader-relevance proxy).
- If decision context is absent OR study context is ungrounded OR claim type was mis-typed upstream: emit `{axis_not_computable: true, reason: <string>}`. Do NOT impute. Do NOT default to "moderate."
- For normative claims: `value-commensurability-required` caveat MUST appear inline with the axis output.
- For interpretive claims: `reader-judgment-required` caveat MUST appear inline with the axis output.

### 3.3 Output Schema (general)
```json
{
  "slot": "sampling_representativeness | mechanism_context_coupling | covariate_shift_and_mechanism | value_commensurability | reader_relevance_proxy",
  "score": "low | moderate | high | axis-not-computable",
  "rationale": "string (slot-grounded)",
  "subscores": { ... claim-type-specific ... },
  "type_coded_caveat": "value-commensurability-required | reader-judgment-required | null"
}
```

---

## 4. Axis 3 -- Decision

### 4.1 Inputs
- `claim_type`, evidence axis output, transportability axis output.
- Warrant rationale from Warrant & Saturation Governor.
- `decision_context_descriptor`.
- Surprise Register entries bound to this claim.
- Adversarial findings.

### 4.2 Computation
- Decision bands: `{act-on, act-with-caveat, hold, seek-more-evidence, defensible-null}`.
- `act-with-caveat`: evidence-strong AND transportability-moderate-or-uncomputable AND no register-bound contradictions.
- `hold`: any axis weak OR contradictions present without resolution.
- `defensible-null`: warrant returned `nothing-found-after-expand` with documented expansion and no contradictions.
- Name the dominant constraint (evidence-bound / transportability-bound / both).
- Register entries enter the rationale only to EXPAND reasoning; NEVER to adjudicate. Any decision rationale that cites a Register entry to break a tie throws E4.

### 4.3 Output Schema
```json
{
  "band": "act-on | act-with-caveat | hold | seek-more-evidence | defensible-null",
  "dominant_constraint": "evidence | transportability | both | none",
  "rationale": "string (multi-sentence)",
  "action_caveats": [ "string", ... ],
  "register_bindings": [ "anomaly_id", ... ]
}
```

---

## 5. Non-Collapse Enforcement
The three outputs are stored as three independent objects and rendered as three separate blocks. Any rendering function that combines them into one score, one label, or one summary throws ERROR class E1 (see SKILL.md Section 4). Re-read `NON_COLLAPSE_DOCTRINE.md` if tempted.
