card: standing report-card contract — four blocks published every release, regressions included
Browse files
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 |
-
##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
-
|
| 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 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
|
| 63 |
-
|
|
| 64 |
-
|
|
| 65 |
-
|
|
| 66 |
-
|
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
|
|
|
|
|
|
|
|
|
| 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 |
|---|---|---|---|---|---|
|