Runtime & Integrations · Evaluation Core

Decision Policy

What it takes for an estimate to clear a gate. experimental

A DecisionPolicy is a host-owned, content-addressed rule for turning an Estimate into pass / fail / blocked. By default it decides on the confidence bound on the threatened side — not the point. Built in the framework; not yet in the version the plugin installs.

Estimate is not decision. The policy makes the rule explicit: which statistic is compared, how much evidence is required before it will decide at all, and — because it is content-addressed — exactly which rule an authority grant approved.

The policy

FieldType · defaultMeaning
thresholdfloatThe bar the chosen statistic must clear.
directionhigher_is_better · lower_is_betterWhich side of the threshold passes.
decision_statisticpoint · lower_confidence_bound · upper_confidence_bound · nullWhich statistic is compared. null resolves to the conservative bound for the direction (below).
min_n_effectiveint ≥ 1 · 2Below this effective n, the gate blocks rather than guesses.
max_missing_fractionfloat [0, 1] · 0.0The most missing / non-scored evidence the decision tolerates.
interval_levelfloat (0, 1) · 0.95The confidence level the bound is read at.
required_studystr | nullAn optional prerequisite study the run must carry.
policy_idstr | nullAn optional name — used to declare a deliberate, named exception (below).

The lower-bound rule

When decision_statistic is left null — the default — the policy resolves to the conservative bound for the direction: the lower confidence bound for higher_is_better, the upper bound for lower_is_better. The gate reads the edge of the interval that could hurt you, not the hopeful point.

A perfect 3/3 fails the default gate Three-for-three is a point of 1.0, but its 95% Wilson lower bound is ~0.44 (see Estimate). Against a 0.8 threshold on the default lower-bound rule that fails — three observations have not earned the claim. Illustrative example, not a measured result.

The named exception

The escape hatch is explicit, never silent: a named policy (a policy_id) that sets decision_statistic: point decides on the point value — a smoke / dev check that trades the interval’s caution for speed. A deliberate, recorded choice, not the default.

Adequacy guards — it blocks, it does not guess

Applying a policy returns pass, fail, or blocked. It blocks — never fabricates a pass — whenever the evidence is inadequate:

ConditionOutcome · reason
no measured pointblocked · no_measured_value
n_effective < min_n_effectiveblocked · insufficient_samples
missing fraction > max_missing_fractionblocked · excessive_missing_evidence
a bound is required but the estimate has no intervalblocked · decision_statistic_unavailable
the chosen statistic clears the thresholdpass
it does notfail
Content-addressed, so a grant can bind to it DecisionPolicy.digest() hashes every decision-bearing field (with the direction-resolved statistic), so an AuthorityGrant approves the exact policy — change any field and the approval no longer matches. The policy is a pure rule; it never is the verdict — the Verdict Engine consumes it.

Next steps