pub enum ApplyVerdict {
Apply {
winner_composite: f64,
incumbent_mean: f64,
margin: f64,
drift: f64,
paired: Option<PairedEffect>,
},
IncumbentStands {
incumbent_mean: f64,
},
WithinDrift {
margin: f64,
drift: f64,
},
PairedDisagrees {
wins: usize,
losses: usize,
},
Uncalibrated,
Contaminated {
unmeasured_runs: usize,
},
}Expand description
What an apply attempt decided, and the numbers it decided on.
Refusals are first-class outcomes, not errors: each names the evidence that was missing or contrary, because “the gate said no” is only useful if it says what would have changed the answer.
Variants§
Apply
The winner cleared every gate and may be stored as this model’s measured defaults.
Fields
paired: Option<PairedEffect>The winner-versus-incumbent paired comparison.
IncumbentStands
The best candidate is the incumbent: the model’s current defaults beat every swept candidate, and there is nothing to apply. Not a failure — the run answered its question.
WithinDrift
The winner’s margin over the incumbent is inside the run’s own drift. Unresolved, not absent — the fix is more tasks or a re-run, never a smaller threshold.
PairedDisagrees
The margin clears the drift, but the per-task paired comparison runs the other way — the winner’s mean rests on a minority of tasks. A mean and its pairs disagreeing is exactly the shape a lucky outlier task produces.
Uncalibrated
The run carries no incumbent pair, so nothing calibrates it — a run from before the calibration pair existed, or one whose incumbents never completed. Nothing can be applied from it.
Contaminated
The winner or an incumbent has runs that never reached the model, so their composites are contaminated by a knowable amount and the comparison is not trustworthy.
Implementations§
Source§impl ApplyVerdict
impl ApplyVerdict
Sourcepub const fn rationale(&self) -> &'static str
pub const fn rationale(&self) -> &'static str
Why the gate decided this, in one sentence.
Split from Display because the two surfaces want different
amounts: a table column wants the numbers, a detail view wants the
numbers and the reasoning. Keeping them apart lets both read from
one source instead of each restating the gate’s rules in its own
words — which is how three renderers came to disagree about what a
refusal meant.
Every sentence here says what would resolve the refusal, because a gate that only says “no” teaches nobody anything.
Trait Implementations§
Source§impl Clone for ApplyVerdict
impl Clone for ApplyVerdict
Source§fn clone(&self) -> ApplyVerdict
fn clone(&self) -> ApplyVerdict
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ApplyVerdict
impl Debug for ApplyVerdict
Source§impl<'de> Deserialize<'de> for ApplyVerdict
impl<'de> Deserialize<'de> for ApplyVerdict
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Display for ApplyVerdict
The verdict’s headline: what happened, with the numbers that decided it.
impl Display for ApplyVerdict
The verdict’s headline: what happened, with the numbers that decided it.
Deliberately unstyled and single-line so every surface can wrap it in its
own presentation. Pair with ApplyVerdict::rationale where there is
room to explain.
Source§impl PartialEq for ApplyVerdict
impl PartialEq for ApplyVerdict
Source§fn eq(&self, other: &ApplyVerdict) -> bool
fn eq(&self, other: &ApplyVerdict) -> bool
self and other values to be equal, and is used by ==.