# Non-Collapse Structural Check

## Purpose

Operationalize Hard Rule 1 (NON-COLLAPSE) as a schema-level, mechanical check. Non-collapse is structural, not rhetorical. The check must succeed before the scored artifact is allowed to emit. The three audit axes -- Evidence-Independent, Transportability-Independent, Decision-Independent -- are separately reasoned AND separately displayed. This layer does NOT compute a combined score under any name, at any layer of the emission.

## The Three-Axis Invariant

Exactly three axis records. Each is computed in isolation during Phase C using a frame-prefixed formula with its own declared inputs. No axis formula may read another axis's intermediate computation. No axis may be imputed from another. If an axis cannot be computed, it is stamped `Non-Assertible` with a reason -- never interpolated, never averaged, never demoted to a soft numeric proxy.

The axis-count invariant is mechanical: exactly three axis records; exactly three disagreement blocks at the TOP; exactly three entries in `emission_metadata.disagreement_counts_per_axis`. Any other result trips E-COLLAPSE or E-HIDDEN-DISAGREEMENT at Phase G.

## Schema-Level Prohibitions

The emission schema FORBIDS these field names and their semantic equivalents anywhere in the output:

- `overall_confidence`, `overall_score`, `overall_verdict`
- `composite_confidence`, `composite_score`, `composite_index`
- `integrated_confidence`, `integrated_score`, `integrated_axis`
- `aggregate_confidence`, `aggregate_delta`, `aggregate_verdict`
- `weighted_mean`, `weighted_average`, `weighted_score`
- `summary_score`, `summary_verdict`, `summary_confidence`
- `holistic_verdict`, `holistic_view`
- `total_disagreement`, `disagreement_score` (singular)

The check is content-based, not only name-based. A field named `unified_reading` that averages the three axes fails the same way a field named `overall_confidence` fails. The governing rule: any field whose computation reads more than one axis value is a composite.

## Structural Check Procedure (Phase G pre-emit)

1. Count axis records. Assert `count == 3`.
2. Count disagreement blocks at TOP. Assert `count == 3`.
3. Assert `axis_count == disagreement_block_count`.
4. Enumerate all top-level fields. Assert NONE match the prohibited-name regex or the semantic-aggregation pattern.
5. Enumerate fields in the emission metadata block bound for E9. Assert `disagreement_counts_per_axis` has exactly three entries.
6. Inspect each axis record's `frame_prefixed_formula_id`. Assert the prefix is one of `PRAG`, `PHEN`, `CONSTR`, `REAL-AC`, `HIST`, `DISC`, `CHILISA`. Any `RAM-*` prefix fails (co-occurrence detection for E-MIRROR).
7. On any failure, abort emission; classify the error; route to the repair procedure in `DISAGREEMENT_RENDERING_RULES.md` Section 4.

## Why This Is Load-Bearing

Downstream consumers reach for a single number. If this layer emits one, it destroys the dual-system premise -- the Evaluator becomes a second opinion that can be rolled into RAM's verdict. The temptation is persistent and shows up in many shapes. It is easier to catch mechanically than rhetorically. Composite content is never a style defect. It is a run-invalidating failure.
