Skip to content

Known weaknesses

The samples for each language are small. Each language has 300 items. An accuracy of near 0.8 for one language has a wide uncertainty. Treat small gaps between models in one language as noise. The 85 aligned splits give a better overall estimate through macro aggregation. The language-aware ids keep these joins explicit.

There is one prompt and there are no variants. A score mixes the judgement of the model with its sensitivity to this specific wording. The next step is a sweep of prompt variants. The run already pins the prompt digest. Therefore, such a sweep stays distinguishable.

The regions are not balanced. Antarctica has 14 items. Most regions have one item. Scoring by region is not reliable today. For this reason, nothing slices by region yet. The benchmark still carries the column.

model_revision can be empty. The code reads it from _commit_hash of the loaded config. This is a private Transformers attribute. If it goes away, runs record an empty revision. They do not fail. To remove the ambiguity, pass --revision to pin the revision.

Verdict extraction is a heuristic. The verdict is the last standalone yes/no in an untruncated generation. The parser reads a wrong verdict if a model gives its conclusion and then adds a caveat that names the other verdict. The benchmark stores the raw generations. Therefore, you can see each such case.

Constrained decoding removes the heuristic fully. But then the benchmark does not measure instruction-following. Refer to ADR-0001.

Mutation testing covers the domain, the results store, the use cases and the pipeline. application.py and adapters/pipeline.py are mutated with the domain and adapters/results_store.py. The other adapters are not mutated. Their mutants are mostly filesystem and model-runtime code with equivalent mutants.

The adapters are not thin now. hf_scorer.py (~730 lines, eight scorer families) is the largest module. The dataset card is built in adapters/publishing/, one module per section, and hf_publish.py keeps the Hub upload. Unit tests with fake runtimes cover their branches. Mutation does not cover them.

No mutant survives, and no mutant is permitted to survive. Until the 2026-09 uplift, the gate was broken and did not show it. The copied workspace of mutmut did not have the documentation that one unit test reads. Therefore, its stats run failed and no mutant was tested. The survivor count was zero.

The workspace now copies the files that the tests read. check_mutants.py refuses a run that killed nothing. The domain does not use constructs that make equivalent mutants. Two examples are guarded zip(strict=True) calls and redundant defaults. CI permits zero survivors (scripts/check_mutants.py --max-survivors 0).

CRAP ceilings and reviewed exceptions (#73). CI requires 100% domain line and branch coverage. The CRAP ceiling is 8. Adapters, the CLI and the scripts in scripts/ have a ceiling of 15.

A function in an adapter, the CLI or scripts/ that is above the ceiling must have an explicit reason and a test reference in scripts/crap-allowlist.json. The checker reports each exception. It fails if an entry becomes stale. Therefore, the exceptions cannot grow without notice.