Package-level declarations
Types
Where an attribute whose path starts with ControlRow.prefix can be set, and why.
The attributes Drift can set itself, per environment, by longest path prefix. A path no row claims is never assumed controllable. The standard table is hand-set from the plan's intervention classes.
Cost points per whole unit, in micro-points, and why.
Treatment arm: the passing side with Experiment.flips (hypothesis ids) set to the failing side's values; control arm: the passing side unchanged. Experiment.table holds what each hypothesis predicts.
What the two sides of the comparison are. Frame.passing and Frame.failing are labels used in the printed instructions; Frame.environment is where the arms run. The sides may be two commits in one place or one commit in two places (a local run against a CI run).
A candidate cause flipped as one unit; Hypothesis.members are attribute paths or step: ids.
Entropy and expected information gain in micro-bits (1_000_000 is one bit). Every figure is an integer: log2 is exact for powers of two and otherwise within 2 micro-bits of the true value (the error of FixedPoint.ln plus one division rounded to nearest), and each entropy term is rounded to nearest, ties up.
How an experiment runs, by who controls the manipulated attributes.
Per-run inputs. Options.failures of Options.runs is the observed failure rate of the red side; Options.trialMinutes is the wall time of one trial of the failing command. Options.couplings maps an attribute to the hypothesis it always moves with, for one change that shows as several. A target step:NAME without a job names the first added step called NAME. The default merges the provisioner build date with its version and the Node and npm versions with Set up Node.
What each hypothesis predicts for each outcome of an experiment: OutcomeTable.rows maps a hypothesis id to its outcome probabilities in micro-units (they sum to 1_000_000). A hypothesis with no row says nothing about the outcome and gets a uniform one.
Experiments ranked by information gain per cost, with the posterior for every outcome of each. Plan.experiments lists the ranked ones first, then the rejected, then the manual ones. The full detail is always present; how much to show is the renderer's choice.
Planned.perCost is micro-bits per cost point; Planned.points is the weighted cost in micro-points.
One-step look-ahead experiment planner. Experiments come from Zeller's ddmin run over the controllable hypotheses: for every possible single culprit, the subsets ddmin would test are proposed, so the pool holds the full bundle, its halves, quarters and single members. Each arm sets a subset to the failing side's values and holds the rest at the passing side's. What cannot be set from here is listed as a manual experiment and never as an automatic one.
Every number the planner chooses by hand, in one place, like the ranker's weights: reasoned guesses, not calibrated. They rank experiments against each other; a cost point is not money and an information gain from an uncalibrated prior is not a measured quantity.
The trial count for an arm pair. TrialPlan.perArm is null when no count up to the budget reaches TrialPlan.targetPower; TrialPlan.power is then the best reached, at TrialPlan.threshold failures for that count. TrialPlan.minimum is the fewest trials per arm at which alpha is reachable at all.
Hypotheses no controllable experiment can tell apart, after every proposed one has run.