Extraction looks easier than classification until you have to say what counts as right. A renewal term can be written a dozen ways, and a clause that isn't there is an answer too.
| Pitfall | What it looks like | How to check, before spending anything |
|---|---|---|
| "Not present" wins | High field accuracy, low recall on clauses that exist | Score recall on present clauses separately, per field. |
| Template duplicates | Great hold-out score, poor on new counterparties | Split by template or counterparty, not by document. |
| Amendments | The base agreement's term is extracted, the amendment's is not | Include amendments with the base document, and label the term in force. |
| Unnormalized labels | Correct answers scored as wrong | Normalize labels and outputs the same way before comparing. |
| Judge drift | Scores rise, answers do not get better | Prefer deterministic scorers wherever the field allows one. |
Tools that run this loop: DSPy and its GEPA optimizer, bpto (ours, open source), and Impromptune, the studio built on it.