thundercode commited on
Commit
c2283ee
·
verified ·
1 Parent(s): 08c9328

release: add docs/EVALUATION.md

Browse files
Files changed (1) hide show
  1. docs/EVALUATION.md +152 -0
docs/EVALUATION.md ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Evaluation
2
+
3
+ This document describes **how** each number in [`BENCHMARKS.md`](BENCHMARKS.md) was produced, and
4
+ enforces the project's evaluation-honesty rules. It is deliberately conservative: a metric that was
5
+ not measured is tagged `NOT RUN`, and a metric that got worse is shown getting worse.
6
+
7
+ **Status tags:** `VERIFIED` · `MEASURED` · `NOT RUN` · `OPEN` · `REJECTED`.
8
+
9
+ ---
10
+
11
+ ## 1. Evaluation-honesty rules (enforced by convention and by tooling)
12
+
13
+ 1. **Evidence before claims.** Every reported number has an artifact path. A number with no artifact
14
+ does not appear in the docs.
15
+ 2. **Two protocols are never collapsed.** Grounding is reported under canonical **and** matched6.
16
+ 3. **Two test sets are never collapsed.** Change-VQA is reported on `test` **and** `test2`.
17
+ 4. **accuracy never travels without macro-F1** for imbalanced multi-class heads.
18
+ 5. **Validation is not test.** The router figure is labelled validation, ungated, n = 86.
19
+ 6. **A negative result stays negative.** Calibration ECE worsened; it is shown worsening.
20
+ 7. **USABLE ≠ ACCEPTED.** The VLM adapter's metrics are real; its status is acceptance-rejected.
21
+ 8. **No composite/vanity score.** There is no single headline accuracy for the system, and none is
22
+ invented by averaging the per-task numbers.
23
+
24
+ ## 2. Per-task evaluation protocols
25
+
26
+ ### 2.1 Change detection — `VERIFIED`
27
+
28
+ - **Split:** LEVIR-CD-256 test, n = 2,048 (immutable public split).
29
+ - **Threshold:** 0.50, frozen in config.
30
+ - **Metrics:** pooled IoU / macro IoU / pooled F1, plus the full confusion counts so any metric can
31
+ be recomputed.
32
+ - **Why both pooled and macro:** the test split is only ≈ 5 % changed pixels
33
+ (mean change fraction 0.0509). Pooled IoU (0.8122) and macro IoU (0.8457) answer different
34
+ questions about that imbalance.
35
+ - **Artifact:** `artifacts/change/eval_test/eval_result.json`.
36
+
37
+ ### 2.2 Grounding — `MEASURED`, two protocols × two decode variants
38
+
39
+ - **Split:** VRSBench, n = 16,159.
40
+ - **Box convention:** VRSBench 0–100 → project 0–1, via declared `benchmark_box_scale: 100.0`.
41
+ - **Protocols:** *canonical* and *matched6* — both reported.
42
+ - **Decode variants:** *head threshold* (the shipped decode), *head argmax*, and *zero-shot
43
+ matched* (baseline).
44
+ - **Resolution:** frozen at 224; 448 rejected by a pre-registered paired test.
45
+
46
+ | Protocol | decode | mean best IoU | recall@0.5 |
47
+ |---|---|---|---|
48
+ | canonical | head threshold | 0.2838 | 0.2198 |
49
+ | canonical | head argmax | 0.1215 | — |
50
+ | canonical | zero-shot matched | 0.0972 | — |
51
+ | matched6 | head threshold | 0.2566 | 0.1938 |
52
+
53
+ **Artifacts:** `…/eval_result_canonical.json`, `…/eval_result_matched6.json`.
54
+
55
+ ### 2.3 Optical-SAR fusion — `MEASURED`, ruling `OPEN`
56
+
57
+ - **Split:** held-out test, n = 4,000.
58
+ - **Label space:** 19 CLC classes; 14 present, 5 absent in the scored split.
59
+ - **macro-F1 denominator:** all 19 classes (absent classes contribute 0.0) — recorded explicitly.
60
+ - **Pre-registration:** the metric is a pre-registered protocol (`pre_registered_11.5`);
61
+ `is_deciding_statistic: False`.
62
+ - **Artifact:** `artifacts/optical_sar/fusion_head_production_v001/pre_registered_115_metric.json`.
63
+
64
+ ### 2.4 Change-VQA — `MEASURED`, ruling `OPEN`
65
+
66
+ - **Splits:** `test` (n = 39,686) and `test2`.
67
+ - **Selection:** epoch 8, chosen on val answer accuracy 0.700018.
68
+ - **Artifact:** `artifacts/change_vqa/run/PROMOTION.json`.
69
+
70
+ ### 2.5 VLM adapter — `MEASURED`, `ACCEPTANCE-REJECTED`
71
+
72
+ - **Split:** frozen 1,000-question subset.
73
+ - **Metrics:** exact_match 0.963, F1 0.96432 (+49.5 pp over unadapted baseline).
74
+ - **Decision:** the artifact is **not accepted** for promotion; the record of *why* is stored in
75
+ `artifacts/vlm/phase6_closure.json` under `why_acceptance_rejected`.
76
+ - **Artifact:** `artifacts/vlm/phase6_closure.json` (`status: CLOSED`).
77
+
78
+ ### 2.6 Router — `MEASURED`, `TEST NOT RUN`
79
+
80
+ - **Split scored:** validation, n = 86, corpus-limited.
81
+ - **Metric:** overall **ungated** accuracy 0.965116.
82
+ - **Not done:** the test split was never scored. The val number is indicative only.
83
+
84
+ ### 2.7 Calibration — `MEASURED`, not an improvement
85
+
86
+ - **Fit split:** val, n = 16,441. Temperature **T = 0.9772732**.
87
+ - **Result:** ECE 0.013755 → **0.014929** (`ece_improvement = −0.001174`).
88
+ - **Retention rationale:** part of the frozen config, **not** because it helped.
89
+ - **Artifact:** `artifacts/calibration_v001.json`.
90
+
91
+ ## 3. Behavioural evaluation (live validation)
92
+
93
+ Accuracy and behaviour are evaluated separately. The deployed stack was driven in a headed browser,
94
+ one upload per case, with per-case screenshots and recorded run ids:
95
+
96
+ | Property | Result |
97
+ |---|---|
98
+ | Independent full passes | **3** |
99
+ | Cases per pass | 8 (6 regression + 2 router-defect) |
100
+ | Passes at 8/8 | **3 of 3** |
101
+ | Live runs | **24** |
102
+ | Correct dispatches | **24** |
103
+ | Mock-node contamination | **0** |
104
+ | Trace fill | **94.4444 %** |
105
+ | Frontend regression suite | **106 passed** |
106
+
107
+ ### 3.1 Harness integrity — a bug that was caught
108
+
109
+ An earlier harness revision typed queries with **synthetic CDP key events**, which Chrome **silently
110
+ drops when the window lacks OS focus**. The harness therefore dispatched the page's *default* query
111
+ and still recorded a "result" — a false pass.
112
+
113
+ The current harness **asserts form state before dispatch**: that the query box really holds the
114
+ intended query, that `#obsTail` reads `ready`, and that both frames are attached for pair tasks. The
115
+ earlier 8/8 run was independently checked and confirmed **not** to have been infected (its answers
116
+ were query-specific and the query text was embedded in the answers). This failure mode is recorded
117
+ here because it is exactly the kind of silent false-positive an evaluation harness must not have.
118
+
119
+ ## 4. Test suite
120
+
121
+ | Suite | Result | Notes |
122
+ |---|---|---|
123
+ | `tests/unit/test_frontend_live_wiring.py` | **106 passed** | re-run this session |
124
+ | Doc/frontend suite (5 files) | **183 passed** | |
125
+ | Full `tests/unit` | 5–6 failures, **all environmental/ordering** | 4× `test_safe_delete_shim` (sandbox delete guard), 1 ordering flake (passes in isolation), 1 stale adapter test (CROMA now shipped) |
126
+ | Affected files re-run together | **137 passed** | confirms the failures are not real regressions |
127
+
128
+ **The environmental failures are not hidden.** They are attributable to the sandbox delete guard and
129
+ test ordering, not to the code under test.
130
+
131
+ ## 5. What is NOT evaluated
132
+
133
+ | Item | State |
134
+ |---|---|
135
+ | System-level end-to-end accuracy | **NOT RUN — none exists** |
136
+ | Router test split | **NOT RUN** |
137
+ | Benchmark adapters | **NOT RUN** |
138
+ | End-to-end latency benchmark | **NOT RUN** |
139
+ | Cross-dataset generalisation | **NOT RUN** |
140
+ | Human evaluation | **NOT RUN** |
141
+ | Adversarial / robustness evaluation | **NOT RUN** |
142
+
143
+ ## 6. Reproducing the metric check
144
+
145
+ ```bash
146
+ python release/tools/verify_readme_metrics.py
147
+ ```
148
+
149
+ This walks every claim in [`../README.md`](../README.md) and [`BENCHMARKS.md`](BENCHMARKS.md) to its
150
+ source artifact and compares values at the printed precision. It prints `ALL CLAIMS VERIFIED` (exit 0)
151
+ only when **all 20** numeric claims match and the status assertions hold. Committed output:
152
+ `release/tools/readme_metrics_report.txt`.