jonny commited on
Commit
50e4585
·
verified ·
1 Parent(s): 1873a1b

card: standing report-card contract — four blocks published every release, regressions included

Browse files
Files changed (1) hide show
  1. README.md +65 -18
README.md CHANGED
@@ -49,26 +49,73 @@ any label in [tau_low, tau_high) → escalate to the pack's LLM (amb
49
  nothing anywhere, none included → escalate to the pack's LLM (ignorance)
50
  ```
51
 
52
- ## Numbers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
- Benchmark: `role_classify_8` 1,071 cases, template-disjoint from training, multi-label
55
- gold, 24% adversarial negatives. It is built to be hard: don't anchor against CLINC-style
56
- intent scores. The right column is the same benchmark's LLM baseline.
57
 
58
- | metric | v2 | v1 | mistral:7b (4.4 GB) |
59
- |---|---|---|---|
60
- | macro-F1 | **0.613** | 0.512 | 0.495 |
61
- | exact set match | **0.558** | 0.496 | 0.243 |
62
- | negatives abstained | **0.941** | 0.984 | 0.126 |
63
- | single / multi-gold recall | 0.502 / 0.596 | 0.388 / 0.425 | — |
64
- | dead rate | 0.149 | 0.171 | — |
65
- | disjoint rate | 0.206 | 0.217 | — |
66
- | per-scope recall 0.60 | 6 / 14 | 2 / 14 | 9 / 14 |
67
-
68
- On a 53-case hand-annotated probe of natural phrasings — which neither version trained
69
- on v2 routes **77%** correctly against v1's 58%.
70
-
71
- ### With its LLM escalation (composed per-case)
 
 
 
72
 
73
  | arm | macro-F1 | exact | neg-abstain | wrong-scope | LLM sees |
74
  |---|---|---|---|---|---|
 
49
  nothing anywhere, none included → escalate to the pack's LLM (ignorance)
50
  ```
51
 
52
+ ## Report card
53
+
54
+ Every release publishes all four blocks below, in full, **including the numbers that got
55
+ worse** — this is a standing contract, not a summary of a good run. Each block is here
56
+ because a metric nobody was required to report hid a real regression:
57
+
58
+ * `disjoint` sat at 0.206–0.265 across three training rounds while macro-F1 climbed 20%.
59
+ An average would have called that pure progress.
60
+ * Artifact-concrete swallowing was 26% while the overall dead rate looked healthy at
61
+ 0.171. The split found the defect; the total hid it.
62
+ * `wrong` on unseen phrasings rose 11% → 17% in the same round routing improved 14
63
+ points. Only block 3 can see that.
64
+ * `swallowed` and `escalated` have opposite fixes. Collapsing them into "not answered"
65
+ hides which one you have.
66
+
67
+ Reproduce every block with one command:
68
+ `topos-eval/scripts/scope_head_report_card.py --head A --label v1 --head B --label v2`.
69
+
70
+ ### 1. `role_classify_8` — the promotion gate
71
+
72
+ 1,071 cases, template-disjoint from training, multi-label gold, 24% adversarial
73
+ negatives. Built to be hard: don't anchor against CLINC-style intent scores. The right
74
+ column is the same benchmark's LLM baseline.
75
+
76
+ | metric | v2 | v1 | mistral:7b (4.4 GB) | gate |
77
+ |---|---|---|---|---|
78
+ | macro-F1 | **0.613** | 0.512 | 0.495 | ≥ incumbent ✅ |
79
+ | exact set match | **0.558** | 0.496 | 0.243 | — |
80
+ | negatives abstained | 0.941 | 0.984 | 0.126 | ≥0.85 ✅ |
81
+ | single / multi-gold recall | 0.502 / 0.596 | 0.388 / 0.425 | — | gap ≤0.05 ✅ |
82
+ | dead rate | **0.149** | 0.171 | — | <0.20 ✅ |
83
+ | **disjoint rate** | 0.206 | 0.217 | — | ≤0.03 ❌ |
84
+ | per-scope recall ≥ 0.60 | 6 / 14 | 2 / 14 | 9 / 14 | 14/14 ❌ |
85
+
86
+ ### 2. Real language — a gap finder, not a score
87
+
88
+ 53 hand-annotated natural phrasings neither version trained on. The labels are one
89
+ annotator's judgement, so the totals measure agreement-with-the-annotator; the **split**
90
+ is the signal worth acting on.
91
+
92
+ | metric | v2 | v1 | gate |
93
+ |---|---|---|---|
94
+ | correct | **0.774** | 0.585 | — |
95
+ | swallowed | **0.132** | 0.189 | — |
96
+ | escalated | 0.094 | 0.189 | — |
97
+ | **swallowed — artifact-concrete** | 0.176 | 0.265 | ≤0.10 ❌ |
98
+ | swallowed — abstract / band | 0.053 | 0.053 | — |
99
 
100
+ ### 3. Unseen phrasings did the authoring generalise?
 
 
101
 
102
+ 2,745 rows from the schema-grounded generator's heldout half, which the training corpus
103
+ never draws from. Provably unseen by both versions and absent from the benchmark. This
104
+ block separates *learning a register* from *memorising the rows we wrote*.
105
+
106
+ | metric | v2 | v1 |
107
+ |---|---|---|
108
+ | routed | **0.565** | 0.421 |
109
+ | swallowed | **0.172** | 0.214 |
110
+ | **wrong scope** | 0.169 | 0.113 |
111
+ | escalated | 0.094 | 0.252 |
112
+
113
+ **Read the `wrong` row, not just the first one.** v2 routes 14 points more of this
114
+ traffic and is confidently wrong 6 points more often. It got better at recognising that
115
+ a question concerns personal data, and no better at discriminating *which* data — the
116
+ same finding as the flat `disjoint` rate. Those are separate abilities; one improved.
117
+
118
+ ### 4. With its LLM escalation (composed per-case)
119
 
120
  | arm | macro-F1 | exact | neg-abstain | wrong-scope | LLM sees |
121
  |---|---|---|---|---|---|