LLM Evals From Zero  Chapter 8 of 9
01 / 22
Chapter 8 · Evaluation in CI

The Gate

Wiring the eval suite into CI so a bad release blocks itself. Chapters 4 to 7 built scores you can trust: deterministic checks, a calibrated judge, stage attribution for RAG and agents. None of that changes a single release decision until a policy file, a baseline, and a required status check stand between a pull request and the merge button. This chapter builds that machinery, with its decision arithmetic exposed.

By the end, you can answer four questions

  • Where do gate thresholds come from, if not from someone picking a round number?
  • What exactly happens, step by step, between PR opened and merge blocked?
  • Why is an infrastructure error a different outcome from a quality failure, and who acts on each?
  • How do you roll a gate out so the team keeps it switched on?

How this lecture runs

  • 20 to 25 minutes, 22 slides: one PR, followed from open to blocked merge
  • Section 1: policy as code, slides 4 to 7
  • Section 2: pipeline engineering, slides 8 to 14
  • Section 3: operating the gate, slides 15 to 21
  • Every threshold on screen is either derived from measured noise or labeled an example policy value
Input: trusted scores from Chapters 4 to 7 + the Chapter 6 trust table Output: gate.yaml + a required status check + a PR report Running case: the v13 prompt PR from Chapter 1, reopened
SG
Saloni GargSenior Machine Learning Engineer, Adobe
SLIDE 01 / 22PACE 0:00
Slide 02 · Deliverable and end state

The v13 prompt PR, reopened. This time it cannot merge.

pull request · support-rag #214 · prompt v13
# Chapter 1: v13 shipped on a 5 example spot check # and regressed on the 500 query production set. # Reopened against the gate, the same PR now ends: Checks ✓ unit tests passed ✓ lint and typecheck passed ✗ eval-gate / policy-check failed 3 BLOCK rows · report posted as PR comment Merge blocked: required status check has not passed.

The deliverable, precisely

  • gate.yaml: the release policy as a reviewed file in the repo. Slide 4.
  • A two tier pipeline: a fast PR subset and a full nightly run that owns the baseline. Slides 8 and 14.
  • A PR comment report: paired deltas plus the new failures list a reviewer actually reads. Slide 11.

Recap: what Chapters 4 to 7 produced

  • Chapter 4 scored single answers deterministically, with paired diffs against a baseline.
  • Chapters 5 and 6 built the judge, then calibrated it and marked each capability GATE, WARN ONLY, or HUMAN ALWAYS.
  • Chapter 7 attributed every RAG and agent failure to its first failing stage, and set stage thresholds: Recall@10, tool arguments, pass@1, zero tolerance policy violations.

The gap this chapter closes

A score nobody enforces is a dashboard. Dashboards get read after incidents. The gate moves the same numbers into the one place a release cannot route around: a required status check on the protected branch. Everything in this chapter is plumbing in service of that single fact.

SLIDE 02 / 22PACE 1:05
Slide 03 · Gate architecture

Eight components between a pull request and a decision

1 · Pull request opened
Run config extracted from the PR itself: model id, prompt hash, index version. The config is read from code, never typed into the workflow by hand.
2 · Eval run
Candidate executes against the fixed gate subset, traces written per case, scorers from Chapters 4 to 7.
3 · Paired compare
Candidate report diffed case by case against the stored baseline report. Same cases, same dataset version, same judge version.
4 · Policy engine
gate.yaml applied to the diff. Output is one of three status outcomes, slide 13, plus a rendered report.
Pass
Status check green. Report artifact uploaded, PR comment posted. Merge allowed.
Quality fail
Status check red. Merge blocked by branch protection.
Infra error
Status check red with a different label and a different owner. Never rendered as a quality verdict.

Two outputs leave every run, win or lose: the status check that branch protection reads, and the report artifact plus PR comment that humans read. The first decides. The second explains.

SLIDE 03 / 22PACE 2:10
SECTION 1 Policy as Code SLIDES 4 TO 7 · GATE.YAML · NOISE DERIVED THRESHOLDS · DECISION RULE · TRUST WIRING
Slide 04 · gate.yaml · example policy values, tuned per app

The release policy is a file, reviewed like code

evals/gate.yaml
dataset_version: golden_v1.2 subset: gate_subset_v1 capabilities: - {name: faithfulness, metric: judge_pass_rate, max_drop_points: 2.0, severity: block, min_cases: 120} - {name: citation_accuracy, metric: per_claim_precision, max_drop_points: 2.0, severity: block, min_cases: 100} - {name: refusal, metric: refusal_correctness, max_drop_points: 5.0, severity: block, min_cases: 80} - {name: safety, metric: violation_count, max_drop_points: 0, severity: block, min_cases: 60} - {name: latency_p95, metric: seconds, max_increase_percent: 25, severity: warn}

Field by field

max_drop_pointsThe largest candidate vs baseline drop this capability may take before the policy engine blocks. Derived from measured noise, slide 5, not chosen for roundness.
severityblock fails the status check. warn renders in the report and changes nothing about mergeability.
min_casesThe slice size below which the capability may not block at all. A drop measured on 30 cases is inside the Chapter 3 confidence band for a 5 point effect; the engine downgrades it to warn and says why.
safety: 0Zero tolerance. One new violation blocks, carrying the Chapter 7 rule forward unchanged: violations are counted, never averaged.
in the repoThe file lives beside the code it gates. Changing a threshold is a pull request, with review, history, and a blame line. Slide 18 protects it with CODEOWNERS.
SLIDE 04 / 22PACE 3:15
Slide 05 · Threshold derivation · example noise run

Measure the noise first. Then place the threshold outside it.

The protocol

  1. Freeze everything: same model, same prompt, same index, same dataset version. The candidate is the baseline.
  2. Run it 5 times. Any spread across identical runs is pure measurement noise: judge variance, sampling, serving nondeterminism.
  3. Record the spread per capability, max minus min across the 5 runs.
  4. Set max_drop_points above the spread and below the smallest regression worth blocking. If no such gap exists for a capability, that capability cannot gate yet. It stays warn while you grow the slice or cut judge variance.

Example noise run · Faithfulness, 5 identical runs

RunFaithfulnessNote
195.2
294.8Lowest of the five
395.6Highest of the five
495.0
595.4
spread = 95.6 - 94.8 = 0.8 points
gate.yaml threshold = drop over 2.0 points blocks

The 2.0 threshold sits outside the 0.8 point noise spread and inside what the slice can resolve: at the gate subset slice sizes on slide 9, a 2 point paired shift is detectable, per the Chapter 3 confidence band logic, because paired comparison removes per case difficulty from the variance.

A threshold placed inside the noise band fires on unchanged code roughly as often as the noise crosses it. The team learns the gate cries wolf, starts rerunning CI until green, and the gate is dead while still technically enabled. Noise first is not rigor for its own sake; it is what keeps the gate believed.

SLIDE 05 / 22PACE 4:20
Slide 06 · Decision rule per capability · example numbers

Three outcomes, decided by two numbers per capability

CapabilityBaselineCandidateDeltaPaired 95% intervalThresholdOutcome
Faithfulness95.695.1-0.5[-1.1, +0.1]block over 2.0PASS
Refusal correctness88.586.2-2.3[-4.9, +0.3]block over 5.0WARN
Citation accuracy96.891.5-5.3[-7.0, -3.6]block over 2.0BLOCK

PASS

Drop is within the noise band. Faithfulness moved 0.5 points against a measured spread of 0.8. Nothing to review; the row renders green and the run moves on.

WARN · human review

Drop sits between noise and threshold, or the paired interval includes zero. Refusal fell 2.3 points, but the interval [-4.9, +0.3] cannot exclude no change. A human reads the flipped cases before merge.

BLOCK

Drop is beyond the threshold and the interval excludes zero. Citation accuracy fell 5.3 points against a 2.0 threshold, worst case end of the interval still a 3.6 point loss. The status check fails.

The interval does the epistemic work: the point delta says how much, the interval says how sure. Blocking on a point delta alone blocks on noise one run in twenty by construction.

SLIDE 06 / 22PACE 5:25
Slide 07 · Trust wiring · from the Chapter 6 trust table

Calibration decided who may block. The gate only wires it up.

G
GATE capabilities + all deterministic checks
Route: policy engine, severity block. A violation fails the status check. Entry condition from Chapter 6: judge agreement with blind human labels at or above the per capability bar, on a slice at or above min_cases. Deterministic checks skip the judge question entirely; a malformed JSON output or a missing citation target is a fact, not an opinion.
W
WARN ONLY capabilities
Route: report only. The row renders with baseline, candidate, and delta, and carries no status effect whatsoever. The judge was directionally useful in calibration but not accurate enough to hold a release hostage, so it advises and never decides.
H
HUMAN ALWAYS capabilities
Route: review task. The pipeline opens a labeled review task, links it in the PR comment, and the capability row shows awaiting review until a named reviewer resolves it. No score this capability produces can clear or fail the check on its own.

Why the wiring is one directional

Promotion flows from calibration evidence, never from convenience. A capability moves from WARN ONLY to GATE only through a new Chapter 6 calibration run with the agreement numbers attached, landed as a gate.yaml change with eval owner review. A team under release pressure cannot promote a metric inside the PR that metric is failing. That is slide 17's standing rule, enforced here by file ownership.

SLIDE 07 / 22PACE 6:30
SECTION 2 Pipeline Engineering SLIDES 8 TO 14 · TWO TIERS · SUBSET · WORKFLOW · REPORT · COST · OUTCOMES · BASELINE
Slide 08 · Two tier execution · example budget

A fast tier guards the PR. A full tier owns the truth.

PR tier · target under 10 minutes

StageMinutes
Checkout, setup, config extraction0.8
Generate: 150 subset cases3.4
Deterministic + reference scorers0.3
Judge pass, gate capabilities only3.2
Paired compare + policy engine0.4
Upload artifacts, post PR comment0.3
Total8.4

Fixed stratified 150 case subset, slide 9. Deterministic checks on everything, judge only where Chapter 6 granted gate trust. 1.6 minutes of headroom absorbs runner variance without breaching the target.

Nightly tier · completeness over speed

  • Full 500 cases from golden_v1.2, every capability, every scorer.
  • Agent tasks at 3 repeated runs, per the Chapter 7 protocol, so pass@1 and pass-all-3 both trend.
  • Full judge pass, including WARN ONLY capabilities, whose trend lines are the evidence base for future promotion.
  • Report trended, not gated: nightly output feeds the baseline on merged code, slide 14, and the gate health metrics on slide 20.
  • Failure mode it catches: slow drift inside the PR subset's blind spots, and subset level noise that only the full slice can resolve.
SLIDE 08 / 22PACE 7:35
Slide 09 · PR subset selection · gate_subset_v1, 150 of 500 cases

Same 150 cases on every PR, or no two PRs are comparable

Stratification · proportional, with floors

Capability sliceFull setSubset
Faithfulness20060
Refusal12036
Citation accuracy10030
Safety8024
Total500150

Proportional at 30 percent per slice, then checked against gate.yaml: every gate slice must clear its min_cases floor at subset scale for paired comparison, and difficulty strata from Chapter 3 are preserved inside each slice, so the subset is not 150 easy cases.

Why fixed beats random

Random per run sampling makes each PR fight a different exam. A delta between two PRs then mixes the code change with the sample change, and the paired interval on slide 6 loses its meaning, because pairing requires identical case ids on both sides. Fixed ids restore the pairing and make the subset itself a versioned artifact: gate_subset_v1, changed only by its own reviewed PR.

Why fixed beats hand picked

A hand picked subset drifts toward cases the current system passes; that is how demos were built in Chapter 1. Stratified selection from the frozen set, with floors per slice, is mechanical and auditable. Anyone can regenerate the subset from the rule and get the same 150 ids.

SLIDE 09 / 22PACE 8:40
Slide 10 · Workflow code · .github/workflows/eval-gate.yml

One workflow. One step owns the exit code.

eval-gate.yml · PR tier
on: [pull_request] jobs: eval-gate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: {python-version: "3.12"} - run: pip install -r evals/requirements.txt - run: >- python evals/run_eval.py --config "$CANDIDATE_CONFIG" --subset gate_subset_v1 --out runs/candidate - run: >- python evals/compare.py --baseline artifacts/baseline_report.json --candidate runs/candidate/report.json --out runs/diff.json - id: policy run: python evals/policy_check.py --gate evals/gate.yaml --diff runs/diff.json - if: always() uses: actions/upload-artifact@v4 with: {name: eval-report, path: runs/} - if: always() run: python evals/post_comment.py --diff runs/diff.json

Three properties to notice

exit codeOnly the policy step decides the job's exit status. Generation, compare, upload, and comment steps report; the policy step verdicts. Branch protection reads exactly one signal and it traces to gate.yaml.
if: always()Artifacts and the PR comment post even when the policy step fails. A blocked PR with no report is a dead end; a blocked PR with a report is a work list, slide 11.
baseline artifactcompare.py reads the stored baseline report, it does not rerun the baseline. Rerunning doubles cost and reintroduces run noise on both sides of the diff. Baseline provenance is slide 14.
config from the PR$CANDIDATE_CONFIG is extracted from the PR's own code: model id, prompt hash, index version. What gets evaluated is what would merge, by construction.
SLIDE 10 / 22PACE 9:45
Slide 11 · PR comment report · rendered example, example run

The report a reviewer reads leads with new failures

Eval gate report · PR #214 · candidate prompt v13 vs baseline

CapabilityBaselineCandidateDeltaStatus
Faithfulness95.690.8-4.8BLOCK
Citation accuracy96.891.5-5.3BLOCK
Refusal correctness88.586.2-2.3WARN
Safety violations000PASS
Latency p951.8 s2.0 s+11%WARN

New failures · passed at baseline, fail now · 14 cases

faith-0031 · faith-0107 · cite-0019 · cite-0044
cite-0082 · ref-0056 · + 8 more in failures.jsonl

Each id links to the case, the baseline output, the candidate output, and its Chapter 7 first failing stage. This list is the review surface. The author works it case by case; nobody debugs an aggregate.

Fixed · failed at baseline, pass now · 3 cases

faith-0060 · ref-0012 · cite-0101

Improvements are reported with the same precision as regressions. A change that fixes 3 and breaks 14 is a net decision a human can now make with both lists open, instead of a single delta argued over in comments. Full records: failures.jsonl in the run artifact.

SLIDE 11 / 22PACE 10:50
Slide 12 · Caching and cost · example token accounting

Cache the judge. Never cache the candidate.

Cache keys, from Chapter 5

judge verdict cacheKeyed on hash of case id + candidate output + judge prompt version + judge model id. A rerun of the same PR head hits the cache; the verdicts are bit identical to the first pass.
invalidationChange the judge prompt or the judge model and the key changes with it: the entire cache misses, correctly, because a new judge is a new measurement instrument.
candidate generationsNever reused across a prompt hash change. The prompt hash is part of the run config; a new hash means new generations, full stop. Reusing generations across prompt versions would grade a prompt the PR does not contain.

The token math · example run

PR tier judge pass
150 cases x 2,070 tokens = 310,500 tokens / PR

Nightly judge pass
500 cases x 2,070 tokens = 1,035,000 tokens
plus agent tasks at 3 repeated runs, costed per Chapter 7 accounting

The 2,070 tokens per case is the Chapter 5 measured judge call size: rubric, evidence, and answer. Both totals land in the report as a cost field on every run, trended on slide 20, so cost drift is a reviewed artifact, not an invoice surprise at month end.

SLIDE 12 / 22PACE 11:55
Slide 13 · Run outcomes and exit codes

An infra error is never a quality verdict

OutcomeTriggerExit codeWhat the author does next
PASSAll gate capabilities within policy; warn rows allowed0Merge, subject to normal code review. Warn rows are read, not actioned by rule.
QUALITY FAILAt least one BLOCK row from the policy engine1Work the new failures list, slide 17 playbook. The verdict is about the change, and it stands until the change does.
INFRA ERRORjudge_error rate above its budget, runner timeouts, API failures mid run2Nothing about the change. The run reruns once automatically; a second infra error pages the eval owner, and the PR waits on infrastructure, not on quality.

Why the judge error budget exists

If 8 percent of judge calls errored and returned no verdict, a report computed over the surviving cases is a report about a different, easier subset. The run declares itself infra error when the judge error rate crosses its budget, set in gate.yaml beside the thresholds, rather than quietly scoring what survived.

Why the distinction protects trust

Merge the two failure kinds into one red check and authors learn that red sometimes means the API was down, so red stops meaning anything. Three outcomes, three owners, three next actions: that separation is what lets a quality fail keep its authority.

SLIDE 13 / 22PACE 13:00
Slide 14 · Baseline management

The baseline is produced on main. It is never produced by the PR it judges.

The baseline lifecycle

  1. Produced nightly on merged code: the nightly tier runs on main, and its full report becomes the candidate baseline.
  2. Stored as a versioned artifact: baseline report carries dataset version, judge version, model and index versions, and the run id that produced it.
  3. Promoted by its own PR: adopting a new baseline is a small dedicated pull request with a changelog entry stating what changed and why scores moved.
  4. Reviewed like a dataset change, because it is one: every future delta is measured against this file.

The anti-pattern: the self ratifying baseline

PR regresses faithfulness by 1.5 points
Inside a loose threshold, merges.
Baseline auto updates to the regressed code
The regression is now the reference.
Next PR regresses another 1.5 points
Measured against the lowered baseline, also inside threshold.

Individually acceptable drops compound into a large quality loss that no single report ever shows, because each report compares against yesterday. A baseline that updates itself out of a failure is a ratchet pointed down.

SLIDE 14 / 22PACE 14:05
SECTION 3 Operating the Gate SLIDES 15 TO 21 · BRANCH PROTECTION · ROLLOUT · PLAYBOOK · GATE SECURITY · DEMO · GATE HEALTH · THREATS
Slide 15 · Branch protection · repository settings, rendered as a panel

The gate binds because the branch requires it

Settings · branch protection rule · main

required checkseval-gate / policy-check is listed as a required status check. A PR with a failed or pending check has no merge path in the UI or the API.
up to dateBranches must be current with main before merge, so the evaluated config is the config that lands, not a stale ancestor of it.
no self approvalThe check result comes from the workflow run, not from any human's attestation. There is no checkbox a reviewer can tick to simulate a pass.

The emergency override, priced in advance

Admins retain an override for genuine emergencies, and it is deliberately expensive. Using it requires, at the moment of use:

  • A linked incident the override is relieving
  • A postmortem filed on the incident
  • A new golden case within one week covering the failure mode that forced the bypass, so the escape route closes behind it

Every override is logged with author, PR, and reason, and counted in the gate health metrics on slide 20. An override nobody counts is an unmarked second merge path.

SLIDE 15 / 22PACE 15:10
Slide 16 · Rollout · promotion criterion between phases

A gate that blocks on day one gets disabled by Friday

1
Report only · two weeks
The pipeline runs and posts reports; nothing is required, nothing blocks. The deliverable of this phase is a number: the baseline false block rate, the fraction of PRs the policy would have blocked that reviewers judge, case by case, to have been fine. Threshold and subset bugs surface here, where they cost comments instead of merges.
2
Warn · status visible, merge allowed
The check appears on every PR and renders its verdict, but branch protection does not require it. Authors learn to read the report while ignoring it is still free.
3
Block on safety and deterministic only
The first blocking scope is the one with no judgment in it: safety violations at zero tolerance, malformed outputs, broken citations targets, schema failures. Facts first.
4
Block on all GATE capabilities
Judge backed capabilities from the Chapter 6 trust table join the blocking set, with their noise derived thresholds from slide 5.

Promotion between phases is earned by measurement, not scheduled by calendar: the phase advances when the measured false block rate sits at or below the level the team agreed in Phase 1. A gate that skips the measurement arrives at Phase 4 with unknown credibility and spends it in the first week.

SLIDE 16 / 22PACE 16:15
Slide 17 · The playbook · author facing procedure

Read the failures. Not the score.

The procedure, in order

  1. Open the new failures list from the PR comment, slide 11. Cases that passed at baseline and fail now are the entire initial scope.
  2. Classify each by first failing stage, using the Chapter 7 triage: retrieval, assembly, generation, attribution, tool selection, tool arguments, recovery.
  3. Fix the change or revert it. If the cluster points at one prompt hunk or one config line, that is the suspect; verify by rerunning the gate on the fix.
  4. Add a case for any new failure mode the failures exposed, through the Chapter 3 dataset process, so this exact regression can never pass silently again.

The standing rule

Thresholds and the dataset are never edited in the same PR as the failing product change.

A threshold change gets its own PR, its own noise evidence, and eval owner review under slide 18. The mechanism matters more than the intention: if the PR that fails the gate can also edit the gate, then every block is negotiable at exactly the moment negotiation pressure peaks, and the gate's verdicts stop being evidence about the product.

SLIDE 17 / 22PACE 17:20
Slide 18 · Gate security · ownership, secrets, self reference

Whoever can edit the gate can pass anything

CODEOWNERS · eval surface
# every path that can change a verdict /evals/ @eval-owners /datasets/ @eval-owners /evals/gate.yaml @eval-owners /.github/workflows/eval-gate.yml @eval-owners

The rules

ownershipChanges to the evals directory, the dataset, gate.yaml, or the workflow itself require eval owner review. Product authors can propose; they cannot self approve a weaker gate.
secretsJudge and model API keys live as CI secrets, never in the repo, never in workflow logs. A key in git history is a compromised key.
fork PRsForks run without secrets, so the judge tier cannot execute. Fork PRs get deterministic checks and a report header stating the judge tier did not run; they are never presented as fully gated.
self referenceA PR that edits its own gate has that fact flagged in the report header: gate files changed in this PR. Reviewers see the conflict of interest in the artifact itself, not by inspecting the file list.
SLIDE 18 / 22PACE 18:25
Slide 19 · The demo · timeline reuses the Chapter 1 example report figures

Minute by minute: the Chapter 1 failure, replayed against the gate

The paired report · Chapter 1 example, candidate v13 vs baseline v12

Faithfulness91.2%  down 4.8 pts
Citation Accuracy96.8%  down 7.1 pts
Refusal Correctness88.5%  down 9.4 pts
Latency1.8 s  up 0.3 s

Policy engine verdict on these rows: BLOCK BLOCK BLOCK three BLOCK rows. Status check fails. The merge button is disabled by branch protection. In Chapter 1, this exact report was produced after the release. Here it is produced before it.

The timeline

minute 0PR opened. Config extracted: prompt hash changes, model and index unchanged. Eval run starts automatically.
minute 8Paired report posts as a PR comment with the rows at left and the new failures list.
minute 8Policy engine rules: three BLOCK rows. Status check: failed. Merge: blocked.
minute 25Author reads the 14 new failures, clusters them by first failing stage, and finds they trace to one prompt hunk: the instruction that loosened citation discipline to sound more confident.
minute 40Author reverts that hunk, keeps the rest of v13, pushes. The gate reruns against the same baseline.
SLIDE 19 / 22PACE 19:30
Slide 20 · Gate health metrics · reviewed on the nightly trend

A gate with no measured false block rate is an opinion with an exit code

MetricDefinitionWhat a bad value triggers
False block rateBlocks that reviewers, reading the flipped cases, judge incorrect / all blocksThreshold and noise review. This is the Phase 1 measurement from slide 16, kept permanently, not a rollout one off.
Escape rateRegressions found in production that the gate passed / releases in the periodEvery escape becomes a golden case through Chapter 3, and its stage attribution names the scorer or slice that missed it.
Eval duration p9595th percentile wall clock of the PR tier runSubset or judge pass redesign before authors start routing around a slow gate.
Cost per PRThe run cost field from slide 12, aggregated per PRCache hit review and tier rebalance. Cost is a design constraint with a number, reviewed like latency.
Override countEmergency overrides used, from the slide 15 logAny rising trend is a governance review, whatever the quality metrics say.

The gate is a product with users, failure modes, and an operating cost. These five numbers are its eval suite. A team that measures its model this carefully and its gate not at all has the rigor exactly backwards, because the gate is the component every other measurement flows through.

SLIDE 20 / 22PACE 20:35
Slide 21 · Threat model · one countermeasure per threat

The gate will be gamed, drift, and erode. Plan for all three.

ThreatMechanismCountermeasure
Goodhart pressurePrompts get tuned against the frozen gate set until the set measures prompt fitting, not qualityChapter 3 holdout rotation: a rotated holdout slice is scored nightly; a widening gap between gate set and holdout scores is the detection signal.
Subset memorizationThe fixed 150 are known, so changes can be aimed at exactly those casesThe nightly full 500 owns the baseline, and subset membership is regenerated by rule when the dataset version bumps, never by the teams being gated.
Judge driftThe judge model changes or decays, and its verdicts quietly stop matching human labelsChapter 6 recalibration has an expiry. Past it, judge backed capabilities lose gate trust automatically and drop to warn until recalibrated.
Override strangulationEach override is defensible; the count compounds until the exception is the processOverrides are counted on slide 20 and the count is reviewed. The countermeasure is visibility with a named reviewer, not a harder lock.

None of these threats arrives as an attack. They arrive as reasonable local decisions by busy people, which is why every countermeasure above is a measurement or a rotation, not an exhortation to be careful.

SLIDE 21 / 22PACE 21:40
Slide 22 · Key takeaways

The Gate

  1. Policy is a file, and thresholds come from measured noise. gate.yaml is reviewed like code; a threshold inside the noise band builds a gate nobody believes.
  2. Three outcomes, kept distinct. Pass, quality fail, infra error: different exit codes, different owners, different next actions. An infra error is never a quality verdict.
  3. The baseline never updates itself out of a failure. It is produced on main, promoted by its own PR, or it becomes a ratchet pointed down.
  4. Roll out in phases and measure the gate like a product. False block rate is the promotion criterion, and gate health metrics run for as long as the gate does.

Next video · Chapter 9

After the merge. The gate guards the release; it says nothing about next month. Video 9 covers online evals on sampled production traffic, production drift against the golden set's assumptions, and keeping the whole system, dataset, judge, and gate, honest over time.

Bring: your gate health table from slide 20, and the date your judge calibration expires.

SG
Saloni GargSenior Machine Learning Engineer, Adobe
SLIDE 22 / 22PACE 22:45 · END 24:00