Found while reviewing validation behavior for the project-overview deck (2026-08-18).
Current behavior
scripts/validate_against_hprc.py → validate_dimension() treats all of our sentinel outputs alike:
_SENTINELS = {"not_classified", "not_applicable", ""}
if not our_value or our_value.lower() in _SENTINELS:
counters[f"{dim_name}_unknown"] += 1
So when the HPRC catalog declares a value (e.g. library_strategy → assay) and we assert not_applicable, the pair is scored unknown — the same as "we couldn't tell."
Why that's wrong
not_classified is a non-answer, and unknown is the right bucket for it. But not_applicable is a positive assertion — "this dimension makes no sense for this file." When the authority declared a value for that very dimension, our assertion of inapplicability is contradicted, and lumping it with non-answers under-penalizes it. It should count as a mismatch (and appear in the mismatches list with ours: not_applicable).
The other direction (report, don't score)
When the catalog omits the field and we say not_applicable, that pair is currently skipped entirely (no ground truth). Field absence is ambiguous — "doesn't apply" vs "catalog incomplete" — so it must NOT be credited as agreement. Worth reporting as a separate consistent_na count outside the accuracy figures, purely for visibility.
Definition of done
🤖 Generated with Claude Code
Found while reviewing validation behavior for the project-overview deck (2026-08-18).
Current behavior
scripts/validate_against_hprc.py→validate_dimension()treats all of our sentinel outputs alike:So when the HPRC catalog declares a value (e.g.
library_strategy→ assay) and we assertnot_applicable, the pair is scoredunknown— the same as "we couldn't tell."Why that's wrong
not_classifiedis a non-answer, andunknownis the right bucket for it. Butnot_applicableis a positive assertion — "this dimension makes no sense for this file." When the authority declared a value for that very dimension, our assertion of inapplicability is contradicted, and lumping it with non-answers under-penalizes it. It should count as a mismatch (and appear in the mismatches list withours: not_applicable).The other direction (report, don't score)
When the catalog omits the field and we say
not_applicable, that pair is currently skipped entirely (no ground truth). Field absence is ambiguous — "doesn't apply" vs "catalog incomplete" — so it must NOT be credited as agreement. Worth reporting as a separateconsistent_nacount outside the accuracy figures, purely for visibility.Definition of done
validate_dimensionsplits sentinels:not_classified/empty →unknown;not_applicablevs a declared value →mismatch(with mismatch detail recorded)not_applicablereported as a separateconsistent_nacounter, excluded from accuracyoutput/hprc/hprc_validation_current.jsonregenerated; any accuracy changes noted🤖 Generated with Claude Code