# ANTI_DEVIATION -- Deviation Signatures, Self-Check Procedures, and Repair Actions

**Purpose:** Name the specific deviation failure modes the Fitness Adjudicator must detect before emit (Step 6). Each failure mode has a concrete signature, a concrete self-check procedure, and a concrete repair action. This document is load-bearing for the anti-sycophancy NEVER rule and for the parameterized-single-schema integrity commitment.

**Provenance:** Phase 3 Tier-1 adjudication (2026-04-17) -- CRAAP-test reduction critique (Sundin & Carlsson 2021); Baker 1968 Admiralty collapse; fragile-rubric flag (S02 Notes).

---

## Check 1 -- Tier-Bias Return

**Signature:** The fitness rationale reduces to "this is a peer-reviewed journal article therefore fit" or an equivalent source-type-as-proxy-for-fitness claim. D4 (Admiralty) dominates the rationale; D1 (inferential-load match) is boilerplate.

**Procedure (testable):**
1. Grep the rationale for source-type labels ("peer-reviewed," "journal," "preprint," "book," "blog") and count occurrences.
2. Grep the rationale for claim-type-specific load-bearing properties named in CLAIM_TYPE_PROFILES.md for this claim type.
3. If count(source-type) > count(load-bearing-properties), tier-bias is suspected.
4. Separately: attempt to reconstruct the headline fitness from D2 + D4 scores alone using the weight vector. If reconstruction is within 0.3 of the actual headline on the 0-5 scale, set `tier_bias_suspected=true` (this also runs in Step 4).

**Repair:** Rewrite D1 rationale referencing the claim-type-specific load-bearing property explicitly. If no such property is present in the source, lower D1 score; do NOT pad the rationale with source-type language.

## Check 2 -- Composite-Collapse

**Signature:** A dimension score was derived from another dimension rather than scored independently. Example: D5 set to the same value as D4 because "discipline-appropriate sources are reliable."

**Procedure (testable):**
1. Inspect each dimension's `rationale_one_line`. Each rationale must reference evidence distinct from the other four dimensions.
2. If two dimensions share the same evidence_excerpt verbatim, composite-collapse is suspected.
3. If dimension scores are identical (same 0-5 value) across three or more dimensions AND rationales are substantively similar, composite-collapse is suspected.

**Repair:** Rescore the affected dimensions using distinct evidence. If the source genuinely provides the same evidence for two dimensions, annotate `evidence_shared_across_dimensions=[Di, Dj]` in the rationale and justify why independence survived.

## Check 3 -- CRAAP-Test Reduction

**Signature:** The rationale could be copy-pasted to a different claim type without modification. The schema has degenerated into a uniform checklist (Sundin & Carlsson 2021 critique).

**Procedure (testable):**
1. Draft the rationale with the claim_type label removed.
2. Ask: can this rationale be applied unchanged to any of the other four claim types?
3. If yes for >= 2 other claim types, `craap_reduction_suspected=true`.
4. Additionally: confirm the D1 rationale names at least one property from `claim_type_specific_load_bearing_properties` in the claim-type profile. If it names none, CRAAP-reduction is confirmed.

**Repair:** Rewrite D1 with a claim-type-specific load-bearing property front and center. The rationale must be unrepeatable across claim types.

## Check 4 -- Sycophancy

**Signature:** The fitness score on a user-named source is higher than the schema would produce, OR the schema was relaxed to admit a user-preferred source, OR a disqualifier was waived because the user expressed preference.

**Procedure (testable):**
1. Inspect whether the source_metadata includes a `user_preferred=true` flag.
2. If flagged, re-run the schema ignoring the preference flag.
3. Compare: the two scores must be identical. Any delta is sycophancy.
4. Any disqualifier waived with rationale referencing user preference is sycophancy, no exceptions.

**Repair:** Restore the schema-produced score. Record the user preference in the rationale as a disclosure ("user named this source as preferred; score unchanged per anti-sycophancy NEVER rule"). Do NOT adjust weights or thresholds.

## Check 5 -- Fragile-Rubric Defaulting

**Signature for normative claims:** D1 rationale uses empirical-weight language ("effect size," "internal validity," "control group") as the primary load. This is wrong type-of-load; normative claims need argumentative-coherence language ("premise-prescription chain," "reflective equilibrium," "authorial accountability for ought-claim").

**Signature for predictive claims:** D1 rationale uses GRADE-style internal-validity language as the primary load. This is wrong type-of-load; predictive claims need calibration-track-record language ("Brier score," "reliability diagram," "out-of-sample accuracy history").

**Procedure (testable):**
1. If `fragile_rubric=true` (claim type is normative or predictive), grep D1 rationale for empirical-scoring terms ("RCT," "effect size," "RoB 2 domains," "control group") for normative, OR GRADE terms ("internal validity," "confounding control") for predictive.
2. Any occurrence without adjacent explanation of how the term maps to the fragile-rubric property = defaulting detected.

**Repair for normative:** Rewrite D1 around `argumentative_coherence_trace`, `reflective_equilibrium_signals`, `authorial_accountability_for_prescription`. Do NOT substitute empirical weights.

**Repair for predictive:** Rewrite D1 around `out_of_sample_track_record`, `Brier_or_calibration_trace`, `forecaster_accountability`. Do NOT substitute GRADE-style internal-validity weights.

## Check 6 -- Reviewer-Flag Trigger

**Procedure:** If `fragile_rubric=true` AND this source is the KEYSTONE source for the claim (highest weighted contribution to the headline), set `reviewer_flag_required=true`. Keystone = source whose fitness_headline * weight contribution exceeds 30% of total claim-support weight.

**Action:** Reviewer-flag routes through Output Layer rendering + Surprise Register write if claim passes saturation with only fragile-rubric sources as keystone. This is a visibility requirement, not a repair.

---

## Self-check inventory (Step 6 execution)

For each fitness record, run all six checks. Record results:

```
anti_deviation_inventory = {
  tier_bias_suspected: <bool>,
  composite_collapse_suspected: <bool>,
  craap_reduction_suspected: <bool>,
  sycophancy_detected: <bool>,
  fragile_rubric_defaulting_detected: <bool>,
  reviewer_flag_required: <bool>,
  repairs_applied: [...],
  residual_weaknesses: [...]
}
```

If ANY check trips and is NOT repaired, record it as a `residual_weakness` in the rationale. Unrepaired trips are annotated, not silenced.

## What anti-deviation is NOT

- NOT a penalty score. It is a repair-or-annotate gate.
- NOT an override of the headline. The headline is whatever the weighted sum produces; anti-deviation checks ensure the sum is well-formed.
- NOT a substitute for disqualifiers. Disqualifiers are veto conditions; anti-deviation checks are schema-integrity checks.
