Lens
Policy decisions
Every verdict the answer-policy engine produces — on every surface, in every mode — is recorded as an append-only decision row carrying the exact feature snapshot the verdict was computed from. The log is three things at once: the audit surface for "why did the assistant refuse?", the tuning dataset for calibrating confidence thresholds, and the evidence that shadow mode is safe to promote to enforce.
Anatomy of a decision
One row per gate: a pre row for the pre-generation verdict (proceed / clarify / abstain with pointers) and a post row for the post-generation verdict (answer / answer with caveat / abstain), each tagged with the surface it came from — chat (with its conversation id), structured, or agent (with its run id):
This row tells a complete story: the model was 90% sure of itself (verbalizedConfidence), but no cited document was verified, so the Glean cap pinned confidence just below the answer floor and the answer shipped with three explicit caveats. Reading rows like this is how you learn whether your floors are honest.
Append-only, by construction
policy_decisions (and its sibling evidence_conflicts) are the audit surface for the answer policy. Every row records the calibrationVersion that produced its confidence, so a recalibration never silently rewrites history; changes to the policy settings are audited through the standard workspace-settings audit trail.The Policy page
The workspace's Policy page (under Insights) shows the last 30 days at a glance: stat cards of decisions by verdict, and the decision table — time, surface, verdict, confidence, the truncated question, and expandable reasons — filterable by surface and verdict. Agent-surface decisions also appear as a policy row in the run inspector for the run that produced them; chat verdicts surface inline as confidence pills and caveat banners on the messages themselves.
API
/api/v1/policy/decisionsBearer · kb:read or runs:readNewest-first decision listing with optional filters. limit clamps to 1..200 (default 50).
Query parameters
/api/v1/policy/statsBearer · kb:read or runs:readDecision counts by verdict and by surface over the last 30 days. Pre-stage rows (proceed/clarify/abstain_with_pointers) and post-stage rows (answer/answer_with_caveat/abstain) both count.
From log to calibration
The feature snapshot on every row is exactly what the confidence model scores — which makes the log a ready-made calibration dataset. The loop:
- Collect — run in shadow (or enforce) until a few hundred post-stage rows exist.
- Label — mark answered questions correct/incorrect (spot-review, or reuse golden-set judgments).
- Refit & rethreshold — Platt-scale new coefficients from the labeled rows and read the answer/caveat floors off the risk-coverage curve.
The full walkthrough, curls included, is in Tune the answer policy.
Related
- Answer policy — the verdicts, confidence model, and caps that produce these rows.
- Workspace settings — where the
policybag (mode, floors, toggles) lives. - Judge governance — the same discipline applied to the judge that feeds groundedness features.