POST /outcomes ({"traceId", "outcome", "isNegative", "reason?", "reportedBy?"}; evaluationRunResultId works in place of traceId for offline eval results). Overview’s Judge Calibration card compares each report against whatever verdict AgentX recorded for the same trace at the time - pattern hits, online-evaluator scores - and shows the agreement rate: how often a negative outcome was flagged in advance (and how often a good one was wrongly flagged). That turns “trust the LLM judge” into a measured number, and tells you which evaluators are worth tightening.
Per-evaluator calibration is also readable from the SDK - agreement rate, misses,
over-flags, and the exact disagreement cases - and feeds straight into the scriptable
judge-tuning loop:
End-user feedback
The other ground-truth stream is your own users’ votes, forwarded withclient.feedback.report(...) - every vote (up and down) feeds the same calibration math as
outcome reports, so the judges get measured against real human reactions too. See
User Feedback for the full story (trace chips, the triage signal,
the Downvote rate KPI).
Both streams are deliberately kept out of the “AgentX flagged it in advance” side of
calibration: they are the reports being calibrated against, never predictions that inflate
agreement.

