Package-level declarations
Types
A changed attribute and the case for it. Candidate.score is the sum of the Candidate.evidence weights, for ordering within a tier only. Candidate.matches holds the rule matches with their mechanism text; Candidate.basis is verified exactly for a known candidate. Candidate.coverage is the lowest per-run coverage of the history behind the spectrum (null without one). A candidate with a Candidate.bundle id cannot be told apart from the other members by the data, so it is never the cause on its own. Candidate.probability (micro-units) is the candidate's share of the posterior read through the isotonic map of Weights.probabilities, fit on the dev scenarios and not held out; it is null unless every candidate of the ranking rests on its attribute change alone.
mechanistic evidence carries a symptom that matches the observed failure; everything else a ranking read is observational. Only a ranking conditioned on a failure sets a class.
One independent piece of support. EvidenceItem.ref is an attribute path, probe:<id> or rule:<id>; EvidenceItem.weight is its log-odds in micro-units and EvidenceItem.id names the Weights row it came from.
The attribute paths each probe's output depends on, keyed by probe id. A probe that differs between two captures supports a changed attribute only when the attribute path starts with one of the probe's prefixes; a probe with an empty list informs no captured attribute. The kotlin. probes carry no dimension and no entry.
The symptoms a failure caused by what a probe measures can show, keyed by probe id: lowercase ASCII phrases that may appear in a failure line, and exit codes. A probe that differs explains an observed failure only when the failure mentions one of its phrases or carries one of its exit codes (see FailureSignature); otherwise the difference is observational.
Ranks the changed attributes of a green-to-red pair. Each candidate collects independent evidence items (its attribute change, probes that differ, rule matches, the Ochiai score of its red value over a history) and the combiner adds their log-odds. The weights are hand-set and uncalibrated, see Weights. Neither the order of attributes, probes, runs or rules nor a vacuous green changes the result.
The full result: Ranking.candidates best first, the Ranking.bundles among them, rule matches that touch no changed attribute (Ranking.unattached), runs left out of the spectrum (Ranking.excluded) and the Ranking.transition when the input was one. Weights are hand-set and uncalibrated; the probability of a candidate is calibrated only where Weights.toJson says it is.
What a green-to-red transition holds beyond the ranked attributes: its TransitionNote.kind and the TransitionNote.steps added or removed, which no capsule shows.
Every number the ranker uses to compare candidates, in one place. The evidence weights are hand-set guesses and are NOT calibrated: they order candidates and a score is not a probability. The fit on the DriftBench dev split (bench/data/calibration/fit.json) tried fitted dimension priors, a fitted probe and rule ratio, a fitted NONE and isotonic maps, and no fitted weight replaced these values, so they stay.