← runs · all docs · view source on github

How scores are calculated

Every run reports up to three numbers: text composite, audio composite, combined. This page is the single source of truth for what each one is and how it's derived.

Source: src/autorater.py, src/audio_eval/__init__.py, src/audio_eval/audio_judge.py, src/iterate.py.

Text composite (autorater_composite)

Output of autorater.score(...) (src/autorater.py:1184). Two ingredients:

Rules — autorater.evaluate_rules (src/autorater.py:1124)

Judge — autorater.evaluate_judge (src/autorater.py:125)

Combined autorater

text = 0.4 × (rules_composite × 10) + 0.6 × judge_composite

Default rules_weight=0.4. Judge is skipped if rules below 0.30 (DEFAULT_JUDGE_FLOOR); when skipped, text = rules_composite × 10.

Audio composite (audio_judge_composite)

Output of audio_eval.evaluate(...) (src/audio_eval/__init__.py:56). Up to 7 sub-evals run in parallel — only ONE rolls up into the audio composite number; the others are diagnostics that feed the COMBINED-score penalties below.

Audio judge — audio_eval.audio_judge.evaluate

Diagnostic sub-evals (deterministic, NOT in the audio composite)

These show up as warning flags via _grade(...) (src/audio_eval/__init__.py:107) and as multiplicative penalties in the combined score below.

Combined score (combined_score)

Computed in iterate.run_meta (src/iterate.py:835):

combined = 0.6 × text_composite + 0.4 × audio_judge_composite
# multiplicative penalty (only one — voice_consistency is authoritative):
if voice_consistency.composite_passed is False:
    combined ×= vc.score              # 0..1, catastrophic failure ≈ 0

Text-only fallback: when audio is missing, combined = text_composite.

Note (2026-05-03 update): the diarization-derived penalty was removed after Exp 10 (docs/eval_battery_findings.md) showed long-form Gemini diarization is unreliable — Gemini diarized 10 speakers for a 3-speaker corpus episode (ep06). Diarization metrics are still surfaced as observational warnings via audio_eval._grade(...) but no longer multiply the gate score. The resemblyzer + pitch voice_consistency layer remains authoritative.

Acceptance gate. A new candidate is accepted in the iteration loop only when combined > best_score + ACCEPT_DELTA_FLOOR (default 0.6). 2026-05-03 update — this gates against the noise floor: Exp 1 measured within-seed audio composite sd=0.92, so a 0.6-point lift is roughly 2σ on audio (and ~2σ on text given its sd=0.29).

Audio judge n_repeats. When --audio_judge_n_repeats=N (default 1), the audio judge is called N times in parallel and the per-axis median is used. n=2 cuts judge variance by ~30%; doubles audio-judge cost.

Worked example — v6d ("Primary Contacts")

Number Value Source
rules_composite 0.844 mean of 30 lint scores
rules_passed 26/30 passing rule count
judge_composite ≈8.49 weighted average of 11 axes
autorater_composite 8.61 0.4 × 8.44 + 0.6 × 8.49
audio_judge_composite 9.50 weighted average of 5 audio axes
voice_consistency.composite_passed True no penalty applied
combined_score 8.97 0.6 × 8.61 + 0.4 × 9.50

Confidence caveats