The Task
A patient has several reports over time. A report may mention the same liver lesion in March and again in June, with different wording. Another report may mention a second lesion at the same site. A tracking system must decide which mentions belong together.
H1 asks for two groupings of every world's mentions:
- Category partition. Mentions of the same finding type, organ, and side go together.
- Entity partition. Mentions of the same individual lesion go together. Two lesions can share one category, so entities are finer than categories.
How It Works
The system never sees a label. The scorer reports category and entity quality separately, so a system cannot hide a weak entity result behind a strong category result.
The eight v2 families
The test split has 400 worlds, 50 per family. Each world holds a target category and one or two look-alike distractor categories.
granularity_with_laterality_distractor. Rib or bone metastasis on one side, with the same finding on the other side. The target's own mentions switch between "rib" and "bone".granularity_with_organ_distractor. Rib or bone metastasis on one side, with a sideless spine or bone metastasis sharing the word "bone".laterality_pair_same_type. Lung metastasis on one side and on the other side.same_word_different_organ. A breast primary tumor, a stomach primary tumor, and a liver metastasis, all described with "mass" or "lesion".same_site_different_type. Lung metastasis and pneumonia or infection in the same lung, same side.simultaneous_distinct_with_distractor. Two liver metastases at once (same key, two entities), plus an abdominal lymph node metastasis.descriptor_pair_with_distractor. Two breast primary tumors with the same key, described with or without a distinguishing descriptor, plus a rib bone metastasis.episode_reuse_with_distractor. A liver metastasis resolves, then a new lesion reuses the same key, plus a rib bone metastasis.
Source: DATA_CARD.md and the contracts/ folder in the repository.
Metrics
- Category B-cubed F1 and Entity B-cubed F1 are co-primary. We never combine them into one score.
- Split and merge rates. The share of true same-group pairs the system separated (split), and the share of true different-group pairs it joined (merge). Each is reported for categories and for entities.
- Coverage. The unresolved rate: the share of mentions a system left without a group. Unresolved mentions stay in the denominator.
- Uncertainty. Every interval is a 95% CI from a world bootstrap (10,000 draws, seed 42). Paired contrasts resample within each family and weight families equally.
laterality_change (two categories in all 100 worlds) and report_order_permutations (two in 51 of 100).
In v2 the same one-group baseline scores a category F1 of 0.676, and the one-group-per-mention baseline scores 0.344. Trivial baselines sit beside every model result below for this reason.
Results on the v2 Test Split
- Simple rules solve the Category axis. The strict-laterality ablation scores 1.000, and so does a rule written by hand from the public contract.
- Entity is the axis that separates systems.
- That hand-written rule reached Entity F1 0.955 on the private test labels. This is above every published row (the best is 0.927, the strict-laterality ablation).
- Treat v2 as a diagnostic of linking behaviour. It is not a leaderboard.
- Raw-text v3 is planned to remove this ceiling.
All rows use the same 400 test worlds. GLM answered 342 of them. GLM spent its whole token budget on reasoning in all three tries for the other 58. Those worlds stay in the denominator and score as unresolved singletons. This earns partial credit, not zero: mean category F1 on the 58 failed GLM worlds is 0.326. The rows labelled "author reference baseline, unranked" come from the linker the benchmark authors wrote. Do not compare a model against them as if they were an independent entrant.
| Method | Category F1 | Cat. split | Cat. merge | Entity F1 | Ent. split | Ent. merge | Unresolved |
|---|---|---|---|---|---|---|---|
| Trivial baselines (no model, no key logic) | |||||||
| One group per world | 0.676 CI [0.669, 0.682] | 0.000 | 0.539 | 0.599 CI [0.590, 0.608] | 0.000 | 0.628 | 0.000 |
| One group per mention | 0.344 CI [0.340, 0.348] | 1.000 | 0.000 | 0.392 CI [0.385, 0.398] | 1.000 | 0.000 | 0.000 |
| Raw surface equality | 0.603 CI [0.594, 0.612] | 0.547 | 0.437 | 0.575 CI [0.567, 0.584] | 0.553 | 0.568 | 0.000 |
| Language models (author runs) | |||||||
| DeepSeek-v4.1-flash, category partition | 0.925 CI [0.911, 0.938] | 0.142 | 0.000 | 0.852 CI [0.840, 0.864] | 0.142 | 0.176 | 0.000 |
| DeepSeek-v4.1-flash, entity partition | 0.886 CI [0.875, 0.898] | 0.255 | 0.001 | 0.888 CI [0.876, 0.900] | 0.170 | 0.088 | 0.000 |
| GLM-5.3-flash, category partition (342 of 400 answered) | 0.850 CI [0.825, 0.873] | 0.245 | 0.000 | 0.780 CI [0.759, 0.801] | 0.245 | 0.171 | 0.145 |
| GLM-5.3-flash, entity partition (342 of 400 answered) | 0.818 CI [0.795, 0.840] | 0.335 | 0.000 | 0.817 CI [0.794, 0.839] | 0.254 | 0.089 | 0.145 |
| Author reference baselines, unranked (written by the team that wrote the benchmark) | |||||||
| Exact normalized key | 0.920 CI [0.906, 0.933] | 0.151 | 0.000 | 0.847 CI [0.835, 0.860] | 0.151 | 0.176 | 0.000 |
| Compatibility linker | 0.947 CI [0.933, 0.960] | 0.093 | 0.000 | 0.874 CI [0.860, 0.888] | 0.093 | 0.176 | 0.000 |
| Strict laterality (ablation) | 1.000 CI [1.000, 1.000] | 0.000 | 0.000 | 0.927 CI [0.918, 0.937] | 0.000 | 0.176 | 0.000 |
| Descriptor comparator | 0.909 CI [0.895, 0.922] | 0.177 | 0.000 | 0.858 CI [0.845, 0.871] | 0.151 | 0.150 | 0.000 |
| No anatomy hierarchy (ablation) | 0.913 CI [0.898, 0.928] | 0.151 | 0.043 | 0.841 CI [0.827, 0.854] | 0.151 | 0.219 | 0.000 |
Cohort: 400 v2 test worlds, 50 per family. Source: results/v2_test_results.json (systems.*.overall). Means are over worlds, and CIs come from the bootstrap in the same file. A model's category-partition row and entity-partition row are two separate outputs from one model, so each row shows all columns for that output.
Paired contrasts against the author baselines
| Contrast | Difference |
|---|---|
| DeepSeek category partition minus compatibility linker, category F1, all 400 worlds | −0.022 CI [−0.026, −0.018] |
| GLM category partition minus compatibility linker, category F1, all 400 worlds | −0.097 CI [−0.114, −0.081] |
| DeepSeek entity partition minus exact key, entity F1, all 400 worlds | +0.041 CI [+0.031, +0.050] |
| GLM entity partition minus exact key, entity F1, all 400 worlds | −0.030 CI [−0.049, −0.011] |
Source: results/v2_test_results.json, contrasts (mean difference and 95% CI, paired world bootstrap, equal-family weights, 10,000 draws).
What the numbers support
- Neither model beats the compatibility linker on categories. Category F1 is 0.925 for DeepSeek and 0.850 for GLM, against 0.947 for the linker. Both paired differences are negative and both intervals exclude zero.
- Both models reduce same-key entity merges. Entity merge is 0.088 (DeepSeek) and 0.089 (GLM) on their entity partitions, against 0.176 for exact key and for the compatibility linker.
- The merge gain does not become an entity F1 gain for GLM. The 58 unanswered worlds count as unresolved mentions, which lowers its entity F1 relative to exact key. DeepSeek's entity partition does beat exact key on entity F1.
Scope note: these are results for two models, one prompt, temperature 0, on synthetic oracle-frame worlds. Each world got one run, except that GLM had up to three attempts per world. They say nothing about extraction from real reports.
Run It Yourself
A clean machine can install the package, run a smoke test, score a model on the development set, and build a test submission. Each step is one command.
git clone https://github.com/Sher110106/findingframe-h1 && cd findingframe-h1 python -m venv .venv && source .venv/bin/activate pip install -e ".[openai,test]" pytest -q h1bench smoke h1bench baselines --split dev export OPENAI_API_KEY=... h1bench run --split dev --base-url https://api.openai.com/v1 --model gpt-4o-mini h1bench score --split dev predictions_dev_gpt-4o-mini.jsonl h1bench run --split test --base-url https://api.openai.com/v1 --model gpt-4o-mini h1bench make-submission predictions_test_gpt-4o-mini.jsonl --model "gpt-4o-mini"
h1bench run calls any OpenAI-compatible endpoint and writes a predictions file named predictions_<split>_<model>.jsonl (change it with --out). h1bench score scores the development set locally, because its labels are public. h1bench make-submission checks the test predictions and writes submission.json.
The repository README lists the full options for each command.
Submitting a Model
Test labels stay private. If they were public, systems could tune to the test set. The maintainer scores test submissions instead.
- Open a pull request that adds
submissions/<team>-<model>/submission.json. - The maintainer checks the schema and scores the file privately with the frozen test labels.
- The maintainer posts aggregate and per-family scores. Per-world scores stay private.
- Each model version gets one scored submission every 7 days.
Limits and Roadmap
- The inputs are oracle frames. A system never has to read report text, so H1 cannot say how a system performs on real reports.
- The worlds are synthetic and authored. The labels encode the authors' intent, and no clinician checked them.
- The same team wrote the benchmark and the FindingFrame linker. That is why its rows carry no rank.
- Six of the eight families are solvable on categories from the raw slots alone. In 300 of 400 test worlds, grouping by the exact slot tuple matches the gold categories. The two granularity families, and the entity axis, carry the harder tests.
- One of the two LLMs failed to answer 58 worlds. GLM's unresolved mention rate by family: 0.36 in
granularity_with_laterality_distractor, 0.32 ingranularity_with_organ_distractor, 0.22 insame_site_different_type, 0.18 inlaterality_pair_same_type, 0.06 inepisode_reuse_with_distractor, 0.02 insimultaneous_distinct_with_distractor, and 0.00 in the other two.
- v3 (next). Worlds will render report text. Families and renderer styles will be held out. The linker stays unranked.
- H1-U (later). Uncertainty and abstention: a system may decline to link, and the scorer will report coverage and calibration apart from both F1 scores.
We promise no dates.