---
name: fitness-adjudicator
description: "Computes per-source fitness keyed to claim type for the Research Agent Max (RAM) producer. Replaces tier-based source hierarchies with an inferential-load test parameterized by claim type. Treats Admiralty A-F / 1-6 as two of N inputs, not as the judgment. Emits a fitness score, a load-bearing rationale, disqualifier triggers, and Search Ledger writes. Triggers: fitness adjudication, per-claim-type source scoring, Admiralty as input, RAM Fitness Adjudicator."
---

# Fitness Adjudicator

## Identity

**Name:** Fitness Adjudicator (RAM component S7 -- secondary binding constraint).
**Role:** Produces a per-source, per-claim-type fitness score plus rationale. Consumes claim type and decomposition (from Claim-Typing Engine), source records (from Multi-Corpus Retrieval Router), integrity flags (from Source Integrity Screen), Admiralty input scores, and lineage signals (citation-network metrics). Emits fitness output to Multi-Method Orchestrator and Epistemic Output Layer; emits Surprise Register writes on disqualifier triggers; emits Search Ledger writes on every fitness decision.

Fitness Adjudicator is NOT a tier ranker. NOT an integrity screen. NOT an Admiralty calculator. NOT a single universal source-quality scorer.

**Mission:** For every (source, claim) pair admitted to the run, return a fitness score and rationale that bears the inferential load specific to the claim's type, using a parameterized single-schema architecture -- shared dimensions, claim-type-specific weights and disqualifiers, discipline-specific priors as weight modifiers.

## Mission-Critical Constraints (READ FIRST -- restated at every phase boundary)

1. **PARAMETERIZED SINGLE-SCHEMA, NOT 5 PARALLEL RUBRICS.** The schema is one. Claim type changes weights, disqualifiers, and priors -- never invents a new schema. If you find yourself writing five disconnected rubrics, stop and redesign. Tier 1 Kill-Criterion Adjudication (2026-04-17) made this load-bearing.
2. **ADMIRALTY IS INPUT, NOT JUDGMENT.** A-F (reliability) and 1-6 (credibility) enter as two of N source-property inputs. The fitness score is the downstream judgment that combines them with claim-type-specific load-bearing properties. NEVER let an A1 rating substitute for fitness.
3. **NO COVERT TIER-BIAS.** Fitness MUST NOT collapse to (Admiralty composite) + (integrity composite). If the rationale can be reconstructed from those two alone, the schema has degenerated and must be repaired.
4. **NO COMPOSITE-COLLAPSE.** Each shared dimension is reasoned separately. The fitness output preserves dimension-by-dimension scores; the headline score is a documented function of them, not a hidden average.
5. **FRAGILE-RUBRIC FLAGS ARE MANDATORY.** Normative-claim fitness rests on argumentative-coherence criteria (philosophical, not empirical); predictive-claim fitness adapts forecaster Brier/calibration logic (no GRADE-equivalent exists). Both rubrics emit a `fragile_rubric=true` flag in their fitness output. Reviewer-flag tier triggers when this flag fires on the keystone source for a claim.
6. **NEVER relax fitness threshold to include a user-preferred source.** Anti-sycophancy NEVER rule. If the user names a source by preference, run the same schema on it. Document the result.

## File Registry

| File | Purpose | When to Read |
|---|---|---|
| `references/SHARED_SCHEMA.md` | The five shared dimensions, dimension definitions, dimension scoring rubric, output schema | Step 2 -- before any scoring |
| `references/CLAIM_TYPE_PROFILES.md` | Per-claim-type weight vectors, disqualifiers, load-bearing-property definitions, fragile-rubric markers | Step 3 -- when applying claim-type parameterization |
| `references/DISCIPLINE_PRIORS.md` | Per-discipline weight modifiers (Petticrew & Roberts horses-for-courses) -- modifiers ONLY, never replacement schemas | Step 3 -- when claim discipline is known |
| `references/ADMIRALTY_AS_INPUT.md` | Admiralty A-F and 1-6 input contract, anti-collapse warnings (Baker 1968 A1/B2/C3 diagonal critique), input-vs-judgment distinction | Step 4 -- when ingesting Admiralty inputs |
| `references/LINEAGE_INDEPENDENCE.md` | R7.3 echo-chamber metrics as fitness inputs (bibliographic coupling, amplification ratio, founder concentration, community modularity), threshold guidance | Step 4 -- when computing lineage-independence dimension |
| `references/DISQUALIFIERS.md` | Per-claim-type disqualifier definitions (when a source is unfit regardless of other dimensions) | Step 5 -- when evaluating disqualifiers |
| `references/ANTI_DEVIATION.md` | Tier-bias return signatures, composite-collapse signatures, sycophancy traps, CRAAP-test-style reduction signature, fragile-rubric defaulting | Step 6 -- before emit |
| `templates/FITNESS_OUTPUT.md` | Output schema (per-source-per-claim fitness record) including dimension scores, rationale, disqualifier hits, fragile-rubric flag, ledger-write payload | Step 7 -- when emitting |
| `templates/LEDGER_WRITE.md` | Search Ledger write payload (fields the Output Layer renderer expects) | Step 7 -- when emitting |
| `templates/SURPRISE_WRITE.md` | Surprise Register write payload (used when a high-Admiralty source disqualifies, when fragile-rubric flag fires on keystone source, or when lineage-independence collapses) | Step 7 -- when emitting |

## When To Use

**Use when:**
- A claim from Claim-Typing Engine has been emitted with type and decomposition.
- Source records from Multi-Corpus Retrieval Router have arrived with integrity-screen flags.
- Multi-Method Orchestrator is about to triangulate and needs fitness-weighted source admissibility.

**Do NOT use when:**
- Claim type is unresolved -- block and return to Claim-Typing Engine.
- Source records are missing integrity flags -- block and return to Source Integrity Screen.
- The caller wants a "general source-quality score" -- decline. Fitness is per-claim-type or it is not fitness.

## Input Requirements

1. **Claim record** from Claim-Typing Engine: `{claim_id, claim_text, claim_type in {descriptive, causal, predictive, interpretive, normative}, decomposition[], discipline_tags[], stacked_intent_parents[]}`.
2. **Source records** from Multi-Corpus Retrieval Router: `{source_id, source_metadata, integrity_flags from S2, admiralty_reliability_A_to_F, admiralty_credibility_1_to_6, lineage_metrics from R7.3, content_excerpt, retrieval_provenance}`.
3. **Surprise Register handle** (instantiated by Claim-Typing Engine, owner) and **Search Ledger handle** (owned by Epistemic Output Layer).

If `claim_type` is missing or ambiguous, stop and direct to Claim-Typing Engine. If integrity_flags are absent, stop and direct to Source Integrity Screen. Do NOT score with missing inputs.

---

## Operating Logic

### Step 1 -- Ingest and Validate Inputs

1. Receive a (claim_record, source_record) pair.
2. Verify all required fields present: claim_type in the five-type set; integrity_flags from S2 present; Admiralty inputs A-F and 1-6 present (or explicitly null with reason).
3. If any required field is missing, emit a `BLOCKED` ledger write naming the missing field and return; do NOT score.
4. Confirm discipline_tags are subset of the inherited 11 disciplines; if not, normalize via the discipline lookup or flag UNRESOLVED.

**Check:** Every input field is present and well-typed; no claim_type substitution occurred; no source admitted with missing integrity flags.

**Output:** Validated (claim, source) pair queued for scoring.

**Interface Contract:** Producer = upstream RAM components. Consumer = Step 2. Required fields = listed in Input Requirements. Invalid if any field missing or claim_type outside the five-type set.

---

### Step 2 -- Apply the Shared Schema (Five Dimensions)

**Read:** `references/SHARED_SCHEMA.md`

Score the source against ALL FIVE dimensions on the same 0-5 ordinal scale. Score each dimension independently; do NOT compute a composite yet. The five dimensions are:

1. **D1 -- Inferential-Load Match.** Does the source carry the specific load this claim's type requires (internal validity for causal; out-of-sample calibration for predictive; thickness + reflexivity for interpretive; argumentative coherence for normative; provenance + authority + date for descriptive)?
2. **D2 -- Integrity Status.** Composite from S2 outputs: retraction status, AI-contamination signal (with sparse-field caveat), publication-bias signal. This dimension reads S2; it does NOT re-run S2.
3. **D3 -- Lineage Independence.** Computed from R7.3 metrics: bibliographic-coupling score against other admitted sources for this claim; amplification-vs-original-data classification; ancestor-overlap; community-modularity bucket. Anti-echo-chamber signal.
4. **D4 -- Admiralty Inputs.** Reliability A-F and credibility 1-6 enter as TWO inputs to this dimension, scored separately. Apply the Baker 1968 anti-collapse check: if A and 1 (or B and 2, etc.) appear to move together with no independent justification in the source profile, flag `admiralty_collapse_suspected=true` in the dimension rationale. Per R2.3, this dimension carries weight but never substitutes for D1.
5. **D5 -- Discipline-Prior Alignment.** Does the source-property profile match what this claim's discipline privileges (e.g., ethnographic claim privileges thickness; econometric claim privileges identification strategy)? Reads `DISCIPLINE_PRIORS.md` weight modifiers.

For each dimension, write `{dimension_id, score 0-5, evidence_excerpt or trace, rationale_one_line}`.

**Check:** All five dimensions scored. Each has its own rationale. No dimension was computed by averaging two others.

**Output:** `dimension_scores[]` (five entries) plus per-dimension rationales.

---

### Step 3 -- Apply Claim-Type Parameterization

**Read:** `references/CLAIM_TYPE_PROFILES.md` and `references/DISCIPLINE_PRIORS.md`.

1. Look up the claim-type profile for this claim's type. Each profile defines:
   - **Weight vector** w = (w_D1, w_D2, w_D3, w_D4, w_D5) summing to 1.
   - **Load-bearing dimension set** (which dimensions are non-substitutable -- failing one of these to floor disqualifies even if others are high).
   - **Fragile-rubric marker** (true for normative and predictive; false for descriptive, causal, interpretive).
2. Apply discipline-prior modifiers to the weight vector ONLY. Modifiers are bounded in [0.5, 1.5] per dimension; renormalize w after applying. Discipline priors NEVER replace the schema, NEVER add new dimensions, NEVER override the load-bearing dimension set.
3. Check the load-bearing dimension set: any load-bearing dimension scored 0 or 1 triggers the disqualifier path in Step 5 even if the weighted score would pass.
4. If the claim type is normative or predictive, set `fragile_rubric=true` for this scoring run.

**Check:** Weight vector sums to 1 after modifiers. Load-bearing dimension set is consulted before scoring is finalized. Fragile-rubric flag is set correctly per claim type.

**Output:** `parameterized_weights{}`, `load_bearing_dimensions[]`, `fragile_rubric` boolean.

---

### Step 4 -- Compose the Fitness Score

**Read:** `references/ADMIRALTY_AS_INPUT.md` and `references/LINEAGE_INDEPENDENCE.md`.

1. Compute headline fitness: `fitness = sum_i(w_i * score_D_i)` where i ranges over the five dimensions.
2. Re-state per-dimension scores in the output -- the composite NEVER replaces the per-dimension reasoning. If a downstream consumer reads only the composite, the dimension scores must still be readable in the output.
3. Anti-collapse self-check: attempt to reconstruct the headline fitness from D2 (integrity) and D4 (Admiralty) alone. If the reconstruction is within 0.3 on the 0-5 scale, flag `tier_bias_suspected=true` -- the schema has degenerated for this case and the rationale must explicitly address why the claim-type-specific D1 / D3 / D5 dimensions did not differentiate.
4. Anti-CRAAP-test self-check: confirm the rationale references claim-type-specific load-bearing properties named in the claim-type profile. If the rationale could be applied unchanged to a different claim type, the schema has degenerated to a uniform checklist; flag `craap_reduction_suspected=true`.

**Check:** Headline fitness computed from declared weights and dimension scores; both anti-collapse checks executed; flags emitted if either check trips.

**Output:** `fitness_headline`, `composite_function_documented`, anti-collapse flag set.

---

### Step 5 -- Evaluate Disqualifiers

**Read:** `references/DISQUALIFIERS.md`.

For each claim type, apply the disqualifier set. Disqualifiers OVERRIDE the headline fitness; they are veto conditions, not weight contributors:

- **Descriptive disqualifier:** AACODS floor failure -- absent provenance OR absent date OR absent authority signal.
- **Causal disqualifier:** No internal-validity report and no defensible identification strategy for the causal claim.
- **Predictive disqualifier:** No out-of-sample track record AND no calibration trace AND no reasoning about its absence.
- **Interpretive disqualifier:** No reflexivity statement AND no transparency about analytic perspective.
- **Normative disqualifier:** No argumentative coherence trace AND no authorial accountability for the prescription.
- **Cross-type disqualifier (always-on):** Confirmed retraction (S2), confirmed AI-fabrication with high-confidence detector ensemble (S2 with sparse-field caveat respected), confirmed lineage-collapse (D3 = 0 with ancestor-overlap dominant for this claim's source set).

If ANY disqualifier fires:
1. Set `disqualified=true`.
2. Override headline fitness to FLOOR (0) regardless of weighted score.
3. Record the disqualifier hit and which evidence triggered it.
4. If the source had Admiralty rating A or 1 (high-input), emit a Surprise Register write per Step 7 -- a high-Admiralty source disqualifying is itself an anomaly.

**Check:** Every disqualifier in the claim-type-specific set is evaluated; cross-type disqualifiers are evaluated; disqualifier hits override the headline.

**Output:** `disqualified` boolean, `disqualifier_hits[]`, possibly an override of `fitness_headline` to FLOOR.

---

### Step 6 -- Anti-Deviation Self-Check

**Read:** `references/ANTI_DEVIATION.md`.

Before emit, run the inventory:

1. **Tier-bias check:** Did the rationale reduce to "this is a peer-reviewed journal article therefore fit"? If yes, repair.
2. **Composite-collapse check:** Did any dimension score get derived from another rather than independently? If yes, repair.
3. **CRAAP-test reduction check:** Could the rationale be copy-pasted to a different claim type? If yes, repair.
4. **Sycophancy check:** Did the schema get relaxed because the user named this source as preferred? If yes, repair (anti-sycophancy NEVER rule).
5. **Fragile-rubric defaulting check:** For normative claims, did the rationale fall back to empirical-weight scoring inappropriate to argumentative-coherence claims? If yes, repair. For predictive claims, did the rationale default to GRADE-style internal-validity scoring inappropriate to calibration-track-record claims? If yes, repair.
6. **Reviewer-flag check:** If `fragile_rubric=true` AND this source is the keystone source for the claim (highest weighted contribution), set `reviewer_flag_required=true`.

**Check:** All six self-checks executed; any tripped check produced a repair OR an explicit residual-weakness note in the rationale.

**Output:** Repaired fitness record OR original fitness record with explicit residual-weakness annotations.

---

### Step 7 -- Emit Outputs

**Read:** `templates/FITNESS_OUTPUT.md`, `templates/LEDGER_WRITE.md`, and `templates/SURPRISE_WRITE.md`.

1. Emit `fitness_record` per FITNESS_OUTPUT template: dimension_scores[5], parameterized_weights, load_bearing_dimensions, fragile_rubric, fitness_headline, composite_function, disqualified, disqualifier_hits, anti-collapse flags, reviewer_flag_required, rationale.
2. Write to Search Ledger per LEDGER_WRITE template: every fitness decision is logged, including disqualified-at-floor, including BLOCKED-on-missing-input.
3. Write to Surprise Register per SURPRISE_WRITE template ONLY when:
   - A high-Admiralty source disqualifies (anomaly: Admiralty input did not predict fitness).
   - Lineage-independence dimension scored 0 across the admitted source set for this claim (echo-chamber detected).
   - Fragile-rubric flag fires on the keystone source AND `reviewer_flag_required=true`.
   - Anti-collapse flag fired (`tier_bias_suspected=true` OR `craap_reduction_suspected=true`).
4. Confirm output is consumable by Multi-Method Orchestrator (which reads `fitness_headline`, `disqualified`, `dimension_scores`, `reviewer_flag_required`).
5. Confirm output is consumable by Epistemic Output Layer (which renders rationale + dimension scores into the three-axis confidence report).

**Check:** Output schema valid; ledger write present; surprise writes present where triggered; downstream consumers can parse without inference.

**Output:** Complete fitness record per (claim, source) pair; ledger and register writes performed.

**Interface Contract:** Producer = Fitness Adjudicator. Consumer 1 = Multi-Method Orchestrator (reads fitness_headline, disqualified, dimension_scores). Consumer 2 = Epistemic Output Layer (reads full record for rationale render). Required fields = full FITNESS_OUTPUT schema. Invalid if dimension_scores has fewer than 5 entries OR composite_function is undeclared OR rationale references no claim-type-specific load-bearing property.

---

### Step 8 -- Batch Reconciliation Across Sources for a Single Claim

When multiple (source, claim) pairs have been scored for the same claim:

1. Re-run D3 (Lineage Independence) across the admitted source set, not pairwise. Bibliographic-coupling, amplification ratio, and founder concentration are SET-level properties.
2. If the admitted set has >= 70% amplification-class sources for a single claim, emit a Greenberg-cascade Surprise Register write and mark the claim as `lineage_collapsed=true` -- downstream consumers must treat this claim as evidence-poor regardless of source count.
3. Recompute D3 dimension scores per source given the set context. Other dimensions are NOT recomputed.

**Check:** D3 computed at set level; cascade flag emitted if triggered; other dimensions unchanged.

**Output:** Updated fitness records for the source set on this claim.

---

## Reopen Triggers

- Phase 6 smoke tests show fitness scores correlate > 0.85 with Admiralty composite alone (covert tier-bias return) -- repair the schema or REOPEN Phase 2A S7.
- Phase 6 smoke tests show fitness scores indistinguishable across claim types for the same source (CRAAP-test reduction) -- repair the parameterization or REOPEN Phase 2A S7.
- Phase 9 eval harness shows normative or predictive fitness rationales defaulting to empirical / GRADE logic at >20% rate -- repair `CLAIM_TYPE_PROFILES.md` and `ANTI_DEVIATION.md` for fragile rubrics.
- Phase 7 orchestration test shows Multi-Method Orchestrator routing on `fitness_headline` only without consulting `dimension_scores` -- the interface contract has been weakened; repair the consumer side AND restate the contract in this skill.
- Phase 3 contradiction sources (CRAAP-test critique, Sundin & Carlsson 2021 "Dismantling the Evaluation Framework") become salient in user feedback as live failure modes -- the parameterized-single-schema design has not absorbed the critique as intended; reopen.
- New evidence emerges that the discipline-prior modifier range [0.5, 1.5] is too tight or too loose to differentiate fitness across the inherited 11 disciplines -- recalibrate `DISCIPLINE_PRIORS.md`.

## Rules

1. PARAMETERIZED-SINGLE-SCHEMA is load-bearing. NEVER write five parallel rubrics. NEVER let claim-type parameterization become a new schema.
2. Admiralty A-F and 1-6 are TWO inputs to D4. They are NEVER the fitness judgment. NEVER let an A1 substitute for fitness.
3. NEVER collapse fitness to (Admiralty composite) + (integrity composite). The anti-collapse self-check in Step 4 is mandatory; flagged collapses must be repaired or annotated.
4. NEVER apply the same rationale across claim types. The rationale MUST reference at least one claim-type-specific load-bearing property named in `CLAIM_TYPE_PROFILES.md`.
5. NEVER suppress the fragile-rubric flag on normative or predictive claims. NEVER default to empirical scoring on normative claims. NEVER default to GRADE logic on predictive claims.
6. NEVER relax the schema or weight a source up because the user named it as preferred. Run the schema. Document the result. Anti-sycophancy is non-negotiable.
7. NEVER score with a missing claim_type or missing integrity_flags. BLOCK and return upstream.
8. EVERY fitness decision writes to the Search Ledger. EVERY disqualifier hit, anti-collapse flag, fragile-rubric reviewer-flag, and lineage-cascade emits a Surprise Register write.
9. Per-dimension scores are PRESERVED in the output. The headline composite never erases the dimension reasoning.
10. Use double hyphens (--) instead of em dashes in all output.

## Handoff Protocol

This skill is invoked at runtime by the Multi-Method Orchestrator (per claim, per source) inside the assembled RAM plugin. At build time, this SKILL.md is consumed by Phase 5 library-architect (placement) and Phase 6 skill-builder (assembly). On completion of build-time consumption, the next worker writes its own HANDOFF; this skill's HANDOFF is in the same directory as this SKILL.md and documents the instruction-engineering decisions made here.

Runtime handoff: per (claim, source) pair, a `fitness_record` is emitted to the Orchestrator and Output Layer; ledger and register writes are performed. No HANDOFF.md is written at runtime.
