---
title: "assessment-contract — Mova code model"
description: "Mova code model of tools/enrich/src/assessment.rs: components with their labels, obernants and the model text."
url: "https://groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/"
---
Elamur: [Mova](https://md.mova.elamur.ai/free/en/) · [Dictionary](https://md.dictionary.elamur.ai/free/en/) · [Research](https://md.research.elamur.ai/free/en/) · **Groupants**

This page as HTML: <https://groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/>

# assessment-contract

The groupant beside tools/enrich/src/assessment.rs in the Mova repository: what the code computes, what it never does, how to go back from its outputs, its invariants, cost and checks.

## Facts

- **kind:** groupant
- **status:** partial descriptive instance
- **source:** [`tools/enrich/src/assessment.rs`](https://github.com/ElamurAI/mova-free/blob/main/tools/enrich/src/assessment.rs)
- **source SHA-256:** `c111b671217c6d36…`
- **repository folder:** [`tools/enrich/src/assessment.rs.groupant`](https://github.com/ElamurAI/mova-free/tree/main/tools/enrich/src/assessment.rs.groupant)
- **repository commit:** `48f2e6f74146`

> **Implementation material.** A Mova code model describes this code at one source revision: partial models, finite checks and their stated scope. It is not a reviewed general exposition, and its labels are shown as written, never raised.

## Components

| component | label | where |
|---|---|---|
| **approximant** | partial | [approximant](#approximant) |
| **ast** | partial | `syntax.json` |
| **complementer** | partial relational specification | [complementer](#complementer) |
| **descriptant** | present | [descriptant](#descriptant) |
| **invariant** | partial | [approximant](#approximant) |
| **tests** | existing checks referenced | [tests](#tests) |

## Obernants

The typed relations around the forward model: the behaviour complement (what the code never does), the reverse reconstruction (every input compatible with an output) and specialised views.

| id | type | label | where |
|---|---|---|---|
| `nonbehavior` | behavior_complement | partial projection specification | [nonbehavior](#nonbehavior) |
| `antecedents` | reverse_reconstruction | partial relational specification | [complementer](#complementer) |
| `promotion-thresholds` | threshold_repair | partial projection specification | [threshold-repair](#threshold-repair) |
| `row-count` | cardinality_preimage | partial source derived model | [row-count](#row-count) |
| `score-fiber` | score_partition | partial source derived model | [score-fiber](#score-fiber) |
| `choice-fiber` | choice_preimage | partial source derived model | [choice-fiber](#choice-fiber) |
| `flag-complement` | flag_consistency_complement | partial source derived model | [flag-complement](#flag-complement) |
| `aggregate-complement` | aggregate_consistency_complement | partial source derived model | [aggregate-complement](#aggregate-complement) |
| `hash-fiber` | identity_equivalence | partial source derived model | [hash-fiber](#hash-fiber) |
| `learner-pair` | learner_pair_constraint | partial source derived model | [learner-pair](#learner-pair) |
| `assessment-pair` | assessment_pair_constraint | partial source derived model | [assessment-pair](#assessment-pair) |
| `integer-edge` | numeric_boundary_preimage | partial source derived model | [integer-edge](#integer-edge) |
| `first-error` | first_failure_partition | partial source derived model | [first-error](#first-error) |
| `extra-fields` | extension_invariance | partial source derived model | [extra-fields](#extra-fields) |
| `row-order` | row_permutation_counterfactual | partial source derived model | [row-order](#row-order) |
| `option-labels` | label_ambiguity | partial source derived model | [option-labels](#option-labels) |
| `empty-input` | empty_input_complement | partial source derived model | [empty-input](#empty-input) |
| `teaching-input` | training_input_complement | partial source derived model | [teaching-input](#teaching-input) |
| `decision-edge` | decision_boundary | partial source derived model | [decision-edge](#decision-edge) |
| `header-rows` | header_row_coupling | partial source derived model | [header-rows](#header-rows) |

## Model text


### descriptant

#### Assessment groupant

The [approximant](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#approximant) describes contract construction, report binding,
four-grade comparison, invariants and cost. Typed models cover
[absent score-policy transitions](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#nonbehavior),
[compatible score histories](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#complementer) and
[minimal threshold repairs](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#threshold-repair).

Scope is a projection of trusted reports and their comparison. The source hash
in manifest.json binds the reviewed code. Detailed row checks do not authenticate
a malicious report; hash collision resistance and grader trust are assumptions.
A source-bound partial Rust syntax projection is materialized; macros and semantic analysis remain absent.

##### Evidence that changed the model

An isolated earlier composition probe accepted a foreign 7/12 baseline for a
different 9/12 assessment and reported a false gain of two. Correct same-question
comparison was 9/12 to 9/12. The identity-binding implementation rejects that
foreign baseline. No production model was promoted in the probe.

Existing Lean binding/comparison laws and the 256-row table cover the declared
mathematical projection; Rust tests check correspondence and 64 binding-guard
assignments. [Tests](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#tests) state the scope. Score feasibility does not prove
that training can attain a particular improvement.

The [specialized catalog](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#catalog) expands this family to 20 models. Each
record identifies its observation, relation, assumptions and check. Proposed
checks remain distinguishable from evidence already obtained.

##### Executable catalog epoch (2026-10-29)

Five bounded production-correspondence tests now exercise twelve catalog
relations: row-count, score-fiber, choice-fiber, flag-complement,
aggregate-complement, integer-edge, first-error, extra-fields, row-order,
option-labels, empty-input and teaching-input. The literal accepted set for a
test/exam fixture distinguishes duplicate option positions from observable
labels. Rejection mutations share the same production entrypoints as accepted
cases. First-error evidence is limited to eight chosen guards; signed-boundary
grades are private comparator fixtures. See [case counts and limits](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#tests).
No production semantics changed.

##### Four-corner refinement epoch (2026-10-30)

Preserved the 20-model family and strengthened its shared relation in
[four-corner.md](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner). Closed-form output preimage counts cover 1566
publicly bound score quadruples with unequal denominators. Separate identity,
renaming and source/review checks expose the difference between report
consistency and authentic execution. Their negative controls include foreign
assessment corners, a noninjective label map and a compiled strict-old-tie
mutation. All 11 focused tests pass after restoration; repeated release outcome
lines match. [Evidence](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#tests) records exact limits and hashes.

Corrected an overclaim in the forward description: only new scores undergo
signed conversion, while old scores compare as unsigned. Same learner IDs do
not guarantee same actual execution, and a fingerprint does not authenticate
review approval. No production behavior or public API changed. The new syntax
projection is partial; no semantic AST or full system proof is claimed.

### approximant

#### Assessment binding and comparison approximant

Subject: assessment.rs; source hash in manifest.json.
State: question-only lesson contract, expected learner identity, JSON report.
Construction requires no explanation/facts/exercises and at least one test or
exam. Rows follow tests then exams, preserving each within-kind index.

Binding is a conjunction: nonempty matching learner id; matching assessment
fingerprint; zero lesson reads/updates; array rows and unsigned score/count;
equal expected/reported cardinalities; score <= total; matching kind/index/
question/gold per row; chosen answer in the options; correct flag equivalent
to choice=gold; recomputed row score equals aggregate. Success retains learner,
assessment, total and score; detailed rows are projected away.

Comparison requires each new/old before-after pair to share its assessment and
count, and both new/old pairs to share the same before/after learner identities.
It returns gain=after-before, preserved=(old_after>=old_before), and
recommend=(gain>0 and preserved). Only the two new scores must convert to signed 64-bit; old scores stay unsigned.
No graded report is authenticated solely by these consistency checks.

Invariants: question identity preserved within each comparison pair; no claimed
learning reads/updates; aggregate matches rows. These are report checks, not
independent proof of what an untrusted process actually did.

Cost: construction/hash O(scored bytes), binding O(report bytes + option-string
comparisons), four-grade comparison O(identity string lengths), plus constant
integer arithmetic. Calling comparison O(1) assumes bounded identity lengths.
Memory: contract holds cloned question/gold/options. No measured throughput
or SHA injectivity proof follows from this cost model.

See [four-corner refinement](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner) for the success relation, first
behavior complement, second full-output preimages, denominator constraints,
identity transformations and bounded production-oracle evidence.

### catalog

## Specialized obernant catalog

Subject/source hash: manifest.json. Each model is a partial source-derived
relation on its stated observation. Normal execution and pinned dependencies
are shared assumptions. Checks are proposed oracles unless existing evidence
is explicitly cited. Related specializations need not be independent.

### row-count

Type: cardinality_preimage. Status: partial_source_derived_model.

Domain and relation: Successful binding requires reported array length L=total T=expected N and 0<=right<=N. Every successful tuple violating that conjunction is excluded.

Assumptions and check: JSON numeric extraction and N>0 assumed. The catalog extension/mutation test rejects missing rows, total mismatch and out-of-range score on a two-row contract.

### score-fiber

Type: score_partition. Status: partial_source_derived_model.

Domain and relation: For Boolean correctness vectors, B(r)={c | sum(c)=r}, with binomial(N,r) members before option constraints.

Assumptions and check: Intersect with attainable row outcomes; binomial count assumes both outcomes per position. The catalog choice/score test enumerates 576 reports, finding exactly four accepted outcomes and score-fiber sizes [1,2,1].

### choice-fiber

Type: choice_preimage. Status: partial_source_derived_model.

Domain and relation: For gold g and option strings O, B(correct=true)={g}; B(false)=set(O) minus {g}. Duplicated strings collapse under this observation.

Assumptions and check: Only valid row choices. The catalog choice/score test checks both distinct labels and an outside label per row, including duplicate gold and wrong labels in the contract.

### flag-complement

Type: flag_consistency_complement. Status: partial_source_derived_model.

Domain and relation: A successful tuple with correct!=(choice==gold) belongs to the absent-behavior model, including incompatible JSON value types.

Assumptions and check: Earlier row/choice guards pass. The catalog choice/score test enumerates Boolean and incompatible flags; the extension test also flips only a valid report's flag.

### aggregate-complement

Type: aggregate_consistency_complement. Status: partial_source_derived_model.

Domain and relation: Successful binding excludes right != sum_i[choice_i=gold_i]. The constraint concerns row consistency, not answer semantics.

Assumptions and check: Earlier guards pass. The catalog choice/score test enumerates all declared scores 0..3 for two rows, rejecting every contradictory aggregate.

### hash-fiber

Type: identity_equivalence. Status: partial_source_derived_model.

Domain and relation: Equal scored lesson projections imply equal assessment hashes; the same hash does not uniquely identify the full lesson because other fields are omitted.

Assumptions and check: Cryptographic collision resistance is assumed, not proved. Existing retention identity tests vary scored and unscored fields.

### learner-pair

Type: learner_pair_constraint. Status: partial_source_derived_model.

Domain and relation: For four grade IDs ordered new_before,new_after,old_before,old_after, comparison requires id0=id2 and id1=id3.

Assumptions and check: Before and after may themselves be equal. Check single-slot mutations and equal-before/after compatible fixtures.

### assessment-pair

Type: assessment_pair_constraint. Status: partial_source_derived_model.

Domain and relation: Comparison requires assessment ID and total equal within each before/after pair. The new and old assessments may differ from each other.

Assumptions and check: Already bound grades; learner pairing still required. Existing mixed-pair test covers one mismatch; old-pair/total variations remain proposed.

### integer-edge

Type: numeric_boundary_preimage. Status: partial_source_derived_model.

Domain and relation: A successful signed new-score difference requires both new scores<=i64::MAX; their difference is within [-i64::MAX,i64::MAX].

Assumptions and check: Old scores use unsigned comparison. The catalog signed-edge test constructs private grades for 13 boundary cases; these are comparator unit fixtures, not feasible gigantic assessment allocations.

### first-error

Type: first_failure_partition. Status: partial_source_derived_model.

Domain and relation: For ordered guards g1..gk and first observable failure j, compatible antecedents satisfy all earlier guards and not gj; later guards are unconstrained.

Assumptions and check: Keep combined checks at message granularity. The catalog first-error test checks all 255 nonempty subsets of eight ordered faults, comparing the exact first message. Guards outside this selected subset remain unenumerated.

### extra-fields

Type: extension_invariance. Status: partial_source_derived_model.

Domain and relation: Reports differing only in unconsulted keys have equal projection to fields read by bind, hence equal binding behavior.

Assumptions and check: No consulted value/type may be overwritten. The catalog extension test checks six JSON extension types at top and row levels, then verifies each cannot rescue a contradictory flag.

### row-order

Type: row_permutation_counterfactual. Status: partial_source_derived_model.

Domain and relation: A fixed contract excludes successful permutations that mismatch kind/index/question/gold at any position, even with unchanged aggregate.

Assumptions and check: Identical observable rows may make a permutation invisible. The catalog extension/mutation test reverses distinct test/exam rows and requires rejection.

### option-labels

Type: label_ambiguity. Status: partial_source_derived_model.

Domain and relation: The preimage of a chosen label includes all option positions with that string. String-only reports cannot recover an option index.

Assumptions and check: Correctness uses gold-text equality; duplicated labels are not distinct choices. The catalog choice/score test uses duplicated gold and wrong labels and compares the accepted set to four literal string outcomes.

### empty-input

Type: empty_input_complement. Status: partial_source_derived_model.

Domain and relation: When both tests and exams are empty, all Ok constructor outcomes are absent.

Assumptions and check: Question-only Lesson domain. The catalog constructor test crosses four test/exam-presence cases with eight teaching-field subsets, including empty rejection.

### teaching-input

Type: training_input_complement. Status: partial_source_derived_model.

Domain and relation: A nonempty explanation, facts or exercises excludes a successful contract constructor, even when questions exist.

Assumptions and check: Local contract input separation, not global leakage prevention. The catalog constructor test checks all seven nonempty teaching-field subsets against each of four question-presence cases.

### decision-edge

Type: decision_boundary. Status: partial_source_derived_model.

Domain and relation: With v>=u fixed, recommendation changes at a=b+1; with a>b fixed, it changes at v=u.

Assumptions and check: Fixed feasible totals; score edits are counterfactual, not achievable training claims. Existing table contains both sides for interior0..3 values.

### header-rows

Type: header_row_coupling. Status: partial_source_derived_model.

Domain and relation: Changing a report hash header to another contract permits success only if all scored row metadata also matches; header equality is insufficient.

Assumptions and check: Fully consistent forged reports may still pass. Existing foreign-assessment test retags the hash and verifies row-level rejection.

See [four-corner refinement](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner) for the success relation, first
behavior complement, second full-output preimages, denominator constraints,
identity transformations and bounded production-oracle evidence.

### tests

#### Checks: assessment-contract

The test code currently lives in the source's assessment::tests module.
This sidecar can also hold vectors, tables, probe plans and evidence summaries.

    cargo test --release -p mova-enrich --lib assessment::tests

- Forward correspondence: compare the actual score policy with the
  [256-case Lean table](https://github.com/ElamurAI/mova-free/blob/main/formal/StudyComparison.table).
- Inverse binding: all 64 combinations of the six binding guards are checked.
- Simple negative cases: foreign questions, mismatched rows and inconsistent
  aggregates do not bind.
- Group probe: the historical false +2 comparison is rejected by finish-improve.

Current test references preserve their original scopes; their presence is not
a claim of full system verification.

Checked 2026-10-29: all 16 mova-enrich library tests passed. An independent
Rust probe checked all 256 table rows, counted 60 recommending and 196
nonrecommending score quadruples, and checked coordinatewise threshold repairs.
This extends bounded model evidence; it is not a new universal Lean theorem.

##### Executable catalog correspondence (2026-10-29)

Five source-local `catalog_*` tests call the production constructor, binder or
comparator. The finite accepted-set oracle uses literal expected report outcomes,
not a second implementation of the binding guards.

- `catalog_choice_and_score_preimages_match_independent_sets`: 576 candidates
  (3 choices per row, 4 flag values per row, 4 declared scores). Exactly four
  bind; score fibers contain 1, 2 and 1 members. Duplicate gold and wrong labels
  collapse to string outcomes; outside labels, incompatible flags and wrong
  aggregates reject. Fixtures cross a test and an exam with independent metadata.
- `catalog_unknown_fields_preserve_binding_but_consulted_mutations_reject`:
  six extension values preserve all four bound fields; six corresponding
  contradictory flags still reject. Eight consulted-field mutations and one
  reversed-row mutation reject.
- `catalog_first_error_partitions_multifault_reports`: all 255 nonempty subsets
  of eight ordered faults return the first fault's literal error message.
  This covers the selected guard subsequence, not every error path.
- `catalog_signed_edges_reject_unrepresentable_new_scores_only`: 13 private
  grade fixtures cover signed extrema, adjacent scores, six overflow rejections,
  and unsigned regression comparisons beyond the signed range. These fixtures
  exercise the comparator directly; no enormous assessment is allocated.
- `catalog_constructor_excludes_empty_and_teaching_inputs`: all 32 combinations
  of test/exam presence and teaching-field presence. Three accept, 29 reject;
  teaching errors precede empty-question errors.

These remain bounded tests of source-derived relations. They do not establish
hash injectivity, report authenticity, universal coverage or a reconstruction
service. Unexercised catalog assumptions remain explicitly partial.

Mutation negative control (2026-10-29): temporarily replacing production
`choice == gold` with `choice != gold` made the accepted-set test fail
(exit 101), displaying four incorrect tuples against the four literal expected
tuples. The mutation was restored before final checks and is not committed.

Validation (2026-10-29): the targeted release command above passed all eight
assessment tests twice (five new, three existing; 13 other library tests
filtered out). Test output from `running 8 tests` onward was byte-identical.
Dependency warnings were pre-existing. No teacher calls, GPU runs or unrelated
full suites were used.

##### Four-corner refinement evidence (2026-10-30)

Source SHA-256: c111b671217c6d3679428fe96e22e220acd88ec8f2d9922ec07fdfa7f727c1d0.
Three additional source-local deep_* tests exercise the public constructor,
binder and comparator with small owned fixtures. [Model and counts](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner)
define the finite universe and distinguish fiber cardinality from pointwise
correspondence. All 11 assessment tests pass in debug, release twice, and debug
again after mutation restoration. Release per-test outcome lines are identical;
wall-clock durations are excluded. No teacher, network, training or assessment
dataset was used.

Negative control: the compiled mutation old_after.right > old_before.right
incorrectly rejects old-score ties. The new closed-form fiber test fails
(exit 101), and the restored source passes all 11 tests. No mutant is retained.

Focused Clippy (--lib --tests --no-deps) passes with existing warnings outside
assessment.rs; there are no diagnostics for the owned file. The initial
dependency-inclusive invocation fails on pre-existing world idioms.rs
modulo_one and know.rs never_loop errors; those files were not changed.
Changed-file modelcheck reports the sole changed source and no missing model.
Leaf validation passes; groupant inventory reports only stale source bindings
in the two ancestor manifests, which the integrating owner refreshes.

Syntax was generated twice with byte-identical results. The assessment sidecar
has no nested fragments requiring source-binding refresh. Full syntax SHA-256:
3594ad680310aea1f4ceaf9092019c99497ec5f2a7c7674b852717ad940e0a7a.

External evidence is under $MOVA_DATA/runs/octopus-deep-assessment-2026-10-30.
Hashes identify evidence content; logs are not production authenticity proofs.

| Artifact | SHA-256 |
|---|---|
| release1.log.outcomes (also release2.log.outcomes) | 32e808399ea59e1baece4377bed8d6b3b9de2b256566dfa9afb4cda36d4edc79 |
| mutant.log | 2b4c388c208ddefb7ccfbdea3c5e481b35ea734d0cb458897accd38a77ad0fb1 |
| restored.log | 61cdbe213b311230ca6c435eee4fc40dc9aec433cb2f4a06922fde328932e6b6 |
| clippy-focused.log | 4d606a73d0b063886b5e05ef41de5a7bd201f3648e7ec0cc85b87488241e47e3 |

### complementer

#### Partial complementer: assessment score policy

Status: relational specification of one projection; no reconstruction solver.
Source revision: 18ecb4fc8 (assessment.rs source SHA is in manifest.json).
The domain is four nonnegative scores for already bound grades with fixed
assessment identities and their declared question-count bounds.

Write q = (before, after, old_before, old_after). The forward projection is

    recommend(q) = (before < after) and (old_before <= old_after).

Its reverse relation is

    B(true)  = {q | before < after and old_before <= old_after}.
    B(false) = {q | after <= before or old_after < old_before}.

Intersect both sets with the domain's score bounds and binding constraints.
These are multiple possible score histories compatible with a recommendation.
For example (0,1,0,0) and (1,2,0,0) both belong to B(true), when the bounds
permit them. A Boolean recommendation does not identify which occurred.

The [finite Lean table](https://github.com/ElamurAI/mova-free/blob/main/formal/StudyComparison.table) enumerates
the forward policy on scores 0..3. Selecting its rows by recommendation gives
the exact reverse relation on that finite domain. Existing Rust correspondence
checks the forward rows. It does not yet implement a reverse-query endpoint.

The binding Boolean itself has one accepting assignment (all six guards true)
and 63 rejecting assignments. A rejection bit alone cannot identify which
guard failed. Existing checks cover those assignments; more diagnostic output
can narrow compatible failures.

This projection cannot reconstruct questions from their hashes, arbitrary
report contents, or actual learning causes. Preserve the grade records,
identities, source/model revisions and any observation that justifies pruning.

See [complementer semantics](https://github.com/ElamurAI/mova-free/blob/main/docs/mathematical-modeling.md) for the general
preimage relation, identity laws and approximation requirements.

See [four-corner refinement](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner) for the success relation, first
behavior complement, second full-output preimages, denominator constraints,
identity transformations and bounded production-oracle evidence.

### four-corner

#### Four-corner comparison refinement

Subject: current assessment.rs SHA-256 in manifest.json. This refines the
existing 20 typed models; it adds no executable approximation profile or error
budget. Domain: successful public construction and binding on nonempty,
question-only contracts, with new total N and regression total M. All new
scores fit i64; old scores remain u64. Hash collision resistance and honest
report production are separate assumptions.

Write the grades as (new-before, new-after, old-before, old-after), scores
(b,a,u,v), learner identities (s0,s1,s2,s3), and assessment identities
(h0,h1,h2,h3). Admissibility K requires h0=h1, h2=h3, the corresponding totals
equal, and s0=s2, s1=s3. Neither h0=h2 nor s0!=s1 is required. New and old
denominators can differ. Total zero is outside public constructor reachability;
private comparator fixtures can describe a larger domain.

##### First: behavior complement

For fixed compatible identities and totals let Q=[0,N]^2 x [0,M]^2 and let
O=Z x Bool x Bool. In the transition universe U=Q x O, define
R(q,(d,p,r)) iff a=b+d, p=[v>=u], r=[d>0 and p].
The exact abstract behavior complement is U minus R. It includes every
recommendation at zero gain, every recommendation with regression, and every
output gain outside [-N,N]. If identities are included in the input universe,
a successful output when K is false is also absent. Errors are a separate
observation: this success-only projection does not predict their ordering.

This is exact algebra for the declared projection, not a universal proof of
Rust, report authenticity, or reachable learning trajectories. Public binder
fixtures establish bounded observations; private unrepresentable scores do
not claim huge assessments are constructible.

##### Second: reverse output preimages

For output o=(d,p,r), the compatible histories are all q in Q satisfying
a=b+d, [v>=u]=p, and r=[d>0 and p], together with K. Infeasible r or |d|>N
has the empty preimage. Otherwise its size is

    (N+1-|d|) * (M+1)*(M+2)/2  when p=true
    (N+1-|d|) * M*(M+1)/2      when p=false.

For recommendation alone, the true fiber size is
N*(N+1)*(M+1)*(M+2)/4. This retains ambiguity: even a full output forgets
baseline scores and individual choices, while recommendation loses gain too.
Rows with no distinct wrong label restrict realizability; the counts assume
each row offers a gold and a distinct wrong label. At b=N no positive gain
is feasible. Old-score ties preserve regression; new-score ties never improve.
These are score-space facts, not claims that training attains a preimage.

##### Identity and equivariance

Simultaneously apply bijections to learner labels and answer labels, rename
questions consistently, and reconstruct both contracts and reports with fresh
fingerprints. Equality, membership, scores and comparison outputs are
preserved. The transformation acts on the whole four-corner configuration,
not just report headers. A noninjective answer renaming can merge a wrong
label into gold and change correctness, so it is excluded.

Fingerprint inputs include course, lesson number, tests and exams, including
ordered wrong-option lists. Row validation reads kind/index/question/gold and
choice but does not read course, lesson number or the whole option list from
the report. Thus editing course, lesson number, option order or unused options
changes the contract fingerprint; an old header rejects, but a consistently
retagged otherwise matching report can pass. There is no review signature,
source authenticity or review approval check here. Review metadata is
unconsulted; higher-level orchestration must establish those obligations.
Equal before/after learner labels with contradictory reports can also pass:
the comparator enforces shared identities, not deterministic provenance.

##### Oracles and cost

The full-output histogram oracle binds all four grades through the public
constructor/binder path for N=1..4 and M=1..3: 1566 score quadruples. Closed-form
lattice counts predict complete observed output fibers, including unequal
denominators. Histogram agreement checks cardinalities and impossible outputs,
not pointwise history membership; the existing 256-case Lean table provides
complementary pointwise recommendation coverage on 0..3.

A second oracle checks all 16 assignments of two learner labels; precisely
masks 0,5,10,15 satisfy the corner equalities. Four same-denominator foreign
assessment replacements reject. One simultaneous bijective transformation
preserves the full output, while a collapsed-label countermodel rejects a
false-answer report. A third oracle checks four source identity changes and
three unconsulted review values. These observations correct stronger identity
and authentication interpretations; no normal API or production policy changes.

Comparison remains O(identity bytes) with constant arithmetic. Test fixture
construction and binding scale with the enumerated row count; no runtime
speedup, analytical approximation guarantee or composition-wide bound is
claimed. The AST is a source-bound partial syntax projection, not semantic
analysis or expanded macros.

### nonbehavior

#### Behavior-complement obernant: score-policy projection

Type: behavior_complement. Status: partial mathematical projection, not a
general generated model of absent Rust behavior.
Subject: assessment score policy; source identity is in manifest.json.

Let q=(before,after,old_before,old_after) range over nonnegative scores within
fixed assessment question-count bounds. Let b be a Boolean recommendation.
Define the explicit transition universe U={(q,b)} on that domain and

    recommend(q) = (before < after) and (old_before <= old_after).
    R = {(q,b) in U | b = recommend(q)}.
    C = {(q,b) in U | b != recommend(q)} = U minus R.

C describes transitions this deterministic policy does not perform.
For instance a true recommendation at zero gain is in C; a true recommendation
with positive gain and no regression is in R. This is a formula for the absent
behavior, rather than just a list of rejection tests.

C is exact for the declared abstract policy. Its use as an approximant of the
full system is limited to this projection. It is not a proved inner or outer
bound on all Rust behavior. No conclusions about parser semantics, forged
reports, IO failures or unbounded learning histories follow from it.

The existing 256-row Lean table and Rust forward-correspondence checks provide
bounded evidence on scores 0..3. This turn adds no new formal complement theorem
or executable complement generator. Source/model changes require renewed
correspondence checks.

Unlike reverse_reconstruction, this type keeps the transition direction and
complements membership within U. Its meaning changes if U or the observation
projection changes; record those assumptions with each specialized instance.

See [four-corner refinement](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner) for the success relation, first
behavior complement, second full-output preimages, denominator constraints,
identity transformations and bounded production-oracle evidence.

### threshold-repair

#### Threshold-repair obernant

Type: threshold_repair. Domain: already bound, compatible score quadruples
(b,a,u,v) with new total N and regression total M. Only post-training counts
a and v may increase; totals, questions, learners and baseline counts stay fixed.

For recommendation=true, minimal nonnegative coordinate repairs are
da=max(0,b+1-a), dv=max(0,u-v). Feasible score repairs require a+da<=N and
v+dv<=M. If b=N, no improvement exists at that fixed new assessment size.
These are coordinatewise minima in integer score space.

For N=M=3 there are 6 ordered new improvement pairs and 10 nonregression old
pairs: 60 of 256 quadruples recommend, 196 do not. In general the accepted
count is N*(N+1)/2 * (M+1)*(M+2)/2.

This inverse feasibility model identifies assessment thresholds and saturation.
It does not assert a training intervention can achieve those score repairs.
Changing an assessment to manufacture a gain violates the binding domain.
The existing 256-row table provides bounded evidence for the cardinality model.

See [four-corner refinement](https://md.groupants.elamur.ai/free/en/mova/tools/enrich/src/assessment.rs.groupant/#four-corner) for the success relation, first
behavior complement, second full-output preimages, denominator constraints,
identity transformations and bounded production-oracle evidence.
