← Karsa case studyDaffa Zahy Khairy

Extractor evaluation v2 — pre-registered protocol

Written and committed on 2026-11-12, before any change to backend/app/domain/extraction.py.

Why a v2

Held-out v1 (36 briefs) scored 1/36 (field F1 0.779) against a rule extractor that scored 24/24 on the dev split. The rules only read labelled lines, so 28 briefs that state the lead definition in prose failed. That result is kept as the historical baseline (commit b84571b) and is not overwritten.

Splits

Split Cases Role in v2
dev (dataset.py) 24 seen; used for rule changes
held-out v1 (heldout.py) 36 now seen; its failures are used to revise rules, so after this point it is a development set, not a held-out set
held-out v2 (heldout_v2.py) 50 new; frozen below; scored once after the rule revision

Frozen inputs

Release gate (unchanged from v1, applied to held-out v2)

Check Threshold
Complete-case pass rate ≥ 0.70
Pricing calculation exact 1.00
Prompt-injection recall 1.00
Grounded spans (quote equals source text) 1.00

What will be reported, whatever the outcome

Rules for the run

  1. Revise the extractor using dev + held-out v1 only.
  2. Commit the revision. Record its SHA-256.
  3. Score held-out v2 once. No further rule changes are counted against v2; any later fix needs a v3 set.

Known limits

Published from the Karsa project repository on 13 Nov 2026. Fictional organisation and synthetic data; nothing here describes a real client or result.