Get the report
GET /namespaces/{ns}/judgments/{name}/calibration returns the report for the active version, and both SDKs call it ns.judgments.calibration(name). The dashboard shows it as the Calibration section of the judgment’s Overview, under the definition.
Brussle makes the report when you ask for it, from all the outcomes and answers up to your request, so its raw and calibrated metrics include outcomes you posted a minute ago and answers corrected after the fit. The fit itself, with held_out, held_out_metrics and lift, changes only at the next fit (see when fits run).
A report can take longer to make than the limit for a request, usually on the first read for a judgment with a long history. You then get unavailable (503) with Retry-After while Brussle keeps working on it. Retry after that time, as the SDKs do, and the retry gets the report.
reliability curve and band, and all of lift.history but the first point.
A correction without features makes the numbers true and keeps the order of the answers, so in the example it cuts log loss and calibration error while auroc stays the same. accuracy rises from 0.801 to 0.837 only because some corrected numbers move to the other side of 0.5. The engine got no better at telling the answers apart.
Read the top of the report
outcomesandoutcomes_by_source: the outcomes that count, by source:posted,rule(made by outcome rules),queue(from the labelling queue) andimplicit(implicit negatives). Their sum isoutcomes.rule_outcomes_paused: rule outcomes left out because your plan did not include outcome rules when they were observed, after a downgrade to Developer. Brussle keeps them outsideoutcomes, and the count stays 0 while your plan includes rules.unmatched_outcomes: posted and rule outcomes that join no answer, by reason. See outcomes that join nothing.censored_predictions: with implicit negatives on, the windows with no outcome that do not count asfalse. See implicit negatives.mode:pinnedwhen a pin applies to a version and epoch of the judgment,autootherwise.
Read each epoch
The report lists one entry for each engine epoch of the active version, newest first. A new version starts with no fit and an empty history.outcomes,outcomes_by_source,rule_outcomes_paused: as at the top, for the outcomes joined to this epoch’s answers.implicit_negativescounts the implicit ones. Brussle counts outcomes replayed into the epoch after the engine changed inreplay.outcomesinstead, so each outcome counts once.fitted_on:queuewhen the epoch’s queue labels alone meet the fit minimums (50, with 15 of each kind). The fit then uses only them, each weighted for how common its part of the range is in your traffic. Otherwise it isall, and each outcome counts once.fit_sourceandreplay: whether the fit uses outcomes replayed after the engine changed. See when the engine changes.stageandfitted_at: how settled the fit is, and when the run that made the current fit ran (the same date ascurrent.fitted_at).stageisnullwhen nothing is fitted,earlyfrom 50 outcomes,fullfrom 1,000, andfeatureson aboolwhose fit uses its features. See when you get a correction.not_fitted: why the epoch has no correction. See why an epoch has no correction.prior: what the fit starts from (identity, the engine’s own numbers, orpoolon a template’s tenant) andweight, your outcomes’ share. It isnullwhen nothing is fitted, and from 1,000 outcomes. See below 100 outcomes.held_out: the test a fit must pass before answers read it, recorded when the fit was made. It gives the log loss of the raw answers and of fits scored on outcomes they did not see, and the fit applies only whencalibrated_log_lossis lower. It also givesraw_ece,calibrated_eceand thestandard_errorof the difference, and on fits made since 2026-10-13raw_brierandcalibrated_brier, weighted as the log losses are.holdoutsays how outcomes were held out (five_groupsof documents, orper_documentbelow 100 outcomes).gain_standard_errorsis the win over raw in standard errors, and below 100 outcomes a fit applies only above 1.held_outisnullwhen nothing is fitted, and a template tenant’s own test does not give these values.held_out_metrics: each way of reading the number, scored on the same held-out outcomes. See how well answers rank.coverage: the lowest and highest raw value among the outcomes the fit uses (the queue labels, whenfitted_onisqueue). The raw value ispfor abool, and the probability of the most probable option or level for achoiceorscore.labels_on_later_revisionscounts the labelled examples that joined an answer made after the document already had one: the document changed, was judged again, and the label was dated after the change. A label dated at discovery rather than at decision time joins this way. See date each label when the answer was acted on.effective_sample_size: what the outcomes the fit uses count for once each is weighted: the outcome count withfitted_onofall, and less with queue labels weighted to skewed traffic, where a few heavy labels carry most of the weight. The held-out numbers are as sure as this count, not the label count. See what the even half costs.features_margin: on aboolwith features, once a fit with them exists: its held-outgainover the fit on the engine’s answer alone, thestandard_errorof that gain, andlabels_needed, an estimate of the further labels, drawn as these were, before the gain is clear by one standard error (0 when it already is;nullwhen the gain is zero or negative, since more of the same labels do not turn that round).nullelsewhere.warnings: see warnings.rawandcalibrated: the same metrics before and after the correction, on every outcome so far and the answer it joins now.calibratedapplies the current fit, so it can include outcomes and answers the fit did not use. Withraw_betterit shows what the fit would have given, and it isnullwhile nothing is fitted. On a composite,rawmeasures the combinedpandcalibratedisnull.accuracy: aboolanswer counts astruewhenpis at least 0.5, and achoiceorscoremust have the outcome as its most probable option or level. Accuracy says little when the event is rare, so readheld_out_metricsthen.expected_calibration_error: how far the stated probabilities are from how often things came true. Lower is better.log_loss: lower is better.reliability: 10 bins of equal width, such as{"lower": 0.8, "upper": 0.9, "count": 137, "mean_predicted": 0.845, "observed": 0.883}. A well calibrated judgment hasobservednearmean_predictedin each bin. Achoiceorscoreanswer goes in a bin by the probability of its most probable option or level. Empty bins havenullmeans.mean_level_distance, on ascoreonly: the mean number of levels between the most probable level and the observed one.
band: see the band.currentandchallenger: the fit answers read now, and the night’s fit when it did not replace it. See read the current fit and the challenger.tenantandtenants: on a template, what a tenant reads and why, and how many tenants read each.nullfor a namespace’s own judgment.alternative_selection: on a version made from an alternative, whether its gain held. See read whether the gain held.
Why an epoch has no correction
not_fitted is null when the epoch has a correction of its own. Otherwise its reason is one of:
When more than one applies,
reason names the first in this order: a kind of outcome fully missing (all true is too_few_negatives, all false is too_few_positives, one value only is too_few_values); then fewer than 50 outcomes; then fewer than 15 of a kind. So 40 outcomes that are all true read too_few_negatives, not too_few_outcomes. message says what to post, such as “Only positive outcomes so far: post outcomes for documents where it did not happen.”
Warnings
Each warning has acode and a message.
above_thresholdsandhigh_band: the outcomes look like a reviewed sample, and the fit is reliable only where they are. See label more than the reviewed documents.coverage_truncated: more than 20% of the live answers have a rawpoutside the range the labels cover. It givesuncovered, the sharesbelowandabovethelabelledrange, andlive, the percentiles the range’s bounds sit at among the live answers. A fit on these labels, and a threshold set from them, act on answers the labels say nothing about. The threshold recommender carries it too. Label a random sample, or use the labelling queue.reads_like_the_outcome: the engine’s answer (engine) or a feature, named infeatures, predicts the outcomes almost perfectly on its own. A number that predicts the outcome this well is usually written once the outcome is known: a document changed to show what happened, or an outcome dated after the document changed, so the label measures an answer that had already read the outcome.held_out_metrics.raw.warningcarries it for the engine’s answer, and each feature’sper_featureentry for a feature. See a number that reads like the outcome.inputs_changed_since_fit: answers the fit used were judged again since, with different inputs. See when answers are corrected.pinned_fit_beaten: the night’s fit clearly beats the pinned fit on the outcomes since the pin’s fit was made.pin_suspended: a pin with features no longer applies. See pin a fit.alternative_gain_not_held: a version made from an alternative has lost the gain it was chosen on. See read whether the gain held.
The band
band is the fit’s corrected number and its 95% interval at 21 raw values, such as {"raw": 0.5, "calibrated": 0.41, "lower": 0.36, "upper": 0.46}. The raw values run from 0.00 to 1.00, and where the band is wide the fit is less sure of its numbers. Brussle draws the band at each feature’s typical value for a judgment with features. On a tenant, the band is what the tenant’s answers read. The Calibration section shades it around the reliability curve.
band is for a bool and a choice among candidates (on whether a match exists). It is null for a choice or score over fixed options, for a composite, when nothing is fitted, and for a fit made before fits recorded their intervals.
How well answers rank
Accuracy says little when the event is rare. If the event happens to 4% of documents, a judgment that answers “no” every time is 96% accurate and finds none of them. When you act on the highestp first (a review queue sorted by p, say), the order is what counts.
Each epoch’s held_out_metrics on a bool scores each way of reading p on the same held-out outcomes as the fit’s test, with labelling-queue labels weighted to your traffic. For each way it gives:
log_loss,expected_calibration_errorandbrier: how far the probabilities are from what happened. Lower is better.auroc: the chance that an answer where the event happened has a higherpthan one where it did not. 0.5 is chance; 1 is a perfect order.precision_at_5andprecision_at_10: the share of events among the 5% and 10% of answers with the highestp.nullwhen there are too few scored answers for a top 5% or 10%.
base_rate, the share of events among all the answers. Say the precision at the top 5% is 0.30 and the base rate is 0.04. Then 30% of the documents at the top of your queue had the event, against 4% of all documents.
The ways of reading p:
raw: the engine’s ownp. Itswarningisreads_like_the_outcomewhen the engine’s answer alone predicts the outcomes almost perfectly, as a feature’s reading warns (see warnings). This reading, thefeatures_marginand the names in thereads_like_the_outcomewarning come from the newest run’s fit, which read the labels last, even while an earlier fit stays current under the promotion rule.scalar:pcorrected on the engine’s answer alone. It ranks exactly asrawdoes, unless the fit gives the samepto answers the engine told apart, and then it ranks a little closer to chance.features:pcorrected with the judgment’s features and the engine’s answer, so features can change the order. It also givesengine_weightandper_feature(see read each feature).features_only:pfrom the features alone, which answers never read. Compare it withfeaturesto see what the engine adds to your own numbers.
auroc compares only answers that the same fit scored, so it can leave some outcomes out, while log_loss and expected_calibration_error are over all the outcomes. Answers with the same p count as a tie (half for auroc, and by their share of events at the edge of the top 5% or 10%). features and features_only are null without features.
The same four readings score the whole distribution on a choice or score with features, with accuracy (and on a score, mean_level_distance) in place of the ranking. For a choice among candidates, see features on a choice among candidates. held_out_metrics is null for a choice or score without features, for a composite, while an epoch has no fit, and on a template tenant with its own fit.
Read the lift
lift tells how much the correction has lowered the judgment’s held-out log loss since its first fit in the current epoch. The Calibration section opens with it in one sentence (in the example, that the correction lowered the held-out log loss by 20%, on 1,432 outcomes). On Team and Scale the section also charts the log loss after each fit, with the raw log loss beside what answers read, what each new fit would score, and the outcomes each rests on. On Developer the section shows the sentence as a preview, and the API returns lift on every plan.
headline: from the newest point of the current epoch.error_reductionis the part of the raw answers’ held-out log loss that the correction removes,(raw_log_loss − applied_log_loss) / raw_log_loss, on the same outcomes for both (0.204 is 20%).intervalis its 95% interval, which more outcomes make narrower. Whenloweris 0 or less, the decrease is not clear yet.appliedisfalsewhen the fit did not beat the raw numbers, anderror_reductionis then 0.sinceis the epoch’s first fit, andoutcomesis what the newest fit uses.history: one point for each fit whose numbers changed, oldest first, at most one a day for each epoch, kept for 400 days. Each point hasfitted_at,outcomes,outcomes_by_source,fitted_on,source(replayfor a fit made from a replay),stage,applied, and the held-out log loss and calibration error, raw and corrected, with the Brier score from 2026-10-13. Brussle adds a point when the log loss or calibration error changes, and the Brier score adds none of its own.roleis absent for what answers read, andchallengerfor what a new fit would score on a night the current fit was kept. While a fit is kept the line of what answers read stays flat, the chart draws challengers dotted, and where the lines meet a new fit replaced the current one. Every number is measured on outcomes the fit did not see, and every run, with its fits, stays in the list of fits for the life of the namespace.withheld: why there is no headline yet, in the form ofnot_fitted: too few outcomes in the current epoch, a fit held back below 100 outcomes (within_noise,readers_need_full), orawaiting_fitbefore the first point. There is never a headline below the fit minimums.model_changed: present after the engine changed. It gives the earlier epoch (from), the current one (to) and the day the current one started (on). A headline never mixes epochs, so the new epoch starts its own from its first fit, and the chart keeps the old epoch’s points beside the new.
lift is null for a composite, whose p comes from its combiner, and on a template’s tenant (the template’s report has the pool’s lift).
Log loss measures how true the numbers are. It does not count right answers or say how well answers rank (read auroc and precision_at_5 against base_rate for that). Precision and recall at your named thresholds are not part of the lift either. Without features, thresholds read the engine’s numbers, which the correction never changes, so they measure the engine. The recommender gives precision and recall.