Skip to content

A sidecar entry named HED for a column named HED halts validation with INTERNAL ERROR (bids-validator 1.15.0) #836

Description

@ttm

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

  1. 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.
  2. 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.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bidsBIDS integrationexternal holdWaiting on external development

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions