Describing an events.tsv column named HED is impossible: any sidecar entry named HED is treated as HED annotations and handed to the parser, which throws on prose. The result is INTERNAL ERROR. SOME VALIDATION STEPS MAY NOT HAVE OCCURRED rather than a reported issue.
This came out of building a generated HED profile for an ontology (SSTIM), so it is reproducible from a minimal dataset rather than from anything unusual in our data.
Environment
bids-validator 1.15.0
- HED schema 8.4.0
- Minimal BIDS Behavioral dataset wrapping a single
events.tsv + sidecar
Reproduction
events.tsv has a column literally named HED, carrying inline annotations, which is the BIDS convention. BIDS warns when a custom column has no sidecar description (CUSTOM_COLUMN_WITHOUT_DESCRIPTION), so we tried to describe it. Measured 2026-08-18, changing nothing but the sidecar:
| Sidecar entry |
Result |
"HED": {"Description": "...", "Definitions": [...]} |
INTERNAL ERROR. SOME VALIDATION STEPS MAY NOT HAVE OCCURRED |
"HED": {"Definitions": [...]} |
same internal error |
"HED": {"Description": "..."} |
same internal error |
no HED entry; definitions under their own non-column key |
0 errors, 1 warning: CUSTOM_COLUMN_WITHOUT_DESCRIPTION |
The stack lands in BidsSidecar._filterHedStrings, which maps over the entry's values and hands each to the HED parser. Prose and a Definitions array are not HED strings, so it throws instead of reporting an issue.
What we did
We took the last row: definitions live in their own non-column entry (sstim_hed_definitions, with the definitions under its HED key), and there is no HED entry. All three of our bundles then validate with zero errors and one warning. We preferred a warning to an unvalidated dataset — an internal error is not a failed validation, it is no validation, and we would rather not publish artifacts whose validator stopped early.
Questions
- Is a sidecar entry named
HED simply not allowed when a column of that name exists? If so, the CUSTOM_COLUMN_WITHOUT_DESCRIPTION warning is expected and correct to ignore, and it would help to say so in the docs — the two conventions currently pull in opposite directions.
- If it is allowed, this looks like a validator defect: prose reaching the HED parser should surface as an issue, not an uncaught throw that halts validation. Happy to open this against
bids-standard/bids-validator instead if that is the right home.
- Is the entry key for definitions arbitrary? We used
sstim_hed_definitions; if the ecosystem expects a particular name we would rather match it.
Glad to supply the minimal dataset or a PR with a regression fixture if useful.
Context, if wanted: this is one of six questions written up while building an SSTIM → HED crosswalk — full write-up. The other five are schema-modelling questions and are filed separately against hed-standard/hed-schemas.
Describing an
events.tsvcolumn namedHEDis impossible: any sidecar entry namedHEDis treated as HED annotations and handed to the parser, which throws on prose. The result isINTERNAL ERROR. SOME VALIDATION STEPS MAY NOT HAVE OCCURREDrather than a reported issue.This came out of building a generated HED profile for an ontology (SSTIM), so it is reproducible from a minimal dataset rather than from anything unusual in our data.
Environment
bids-validator1.15.0events.tsv+ sidecarReproduction
events.tsvhas a column literally namedHED, carrying inline annotations, which is the BIDS convention. BIDS warns when a custom column has no sidecar description (CUSTOM_COLUMN_WITHOUT_DESCRIPTION), so we tried to describe it. Measured 2026-08-18, changing nothing but the sidecar:"HED": {"Description": "...", "Definitions": [...]}INTERNAL ERROR. SOME VALIDATION STEPS MAY NOT HAVE OCCURRED"HED": {"Definitions": [...]}"HED": {"Description": "..."}HEDentry; definitions under their own non-column keyCUSTOM_COLUMN_WITHOUT_DESCRIPTIONThe stack lands in
BidsSidecar._filterHedStrings, which maps over the entry's values and hands each to the HED parser. Prose and aDefinitionsarray are not HED strings, so it throws instead of reporting an issue.What we did
We took the last row: definitions live in their own non-column entry (
sstim_hed_definitions, with the definitions under itsHEDkey), and there is noHEDentry. All three of our bundles then validate with zero errors and one warning. We preferred a warning to an unvalidated dataset — an internal error is not a failed validation, it is no validation, and we would rather not publish artifacts whose validator stopped early.Questions
HEDsimply not allowed when a column of that name exists? If so, theCUSTOM_COLUMN_WITHOUT_DESCRIPTIONwarning is expected and correct to ignore, and it would help to say so in the docs — the two conventions currently pull in opposite directions.bids-standard/bids-validatorinstead if that is the right home.sstim_hed_definitions; if the ecosystem expects a particular name we would rather match it.Glad to supply the minimal dataset or a PR with a regression fixture if useful.
Context, if wanted: this is one of six questions written up while building an SSTIM → HED crosswalk — full write-up. The other five are schema-modelling questions and are filed separately against
hed-standard/hed-schemas.