The element counts that define a scenario batch’s shared base shape. Named
(rather than a bare (usize, usize, usize)) so the three same-typed fields
can’t be transposed silently in an error message or a comparison.
Coarse classification of an Error, for callers that map onto their own
taxonomy (the Python layer’s exception subclasses, C ABI status codes, a
CLI exit code). Distinguishing “the input file is bad” from “the operation
can’t run on this otherwise-valid case” is the split callers actually branch
on, and it’s a property of the error, not of the binding that surfaces it.
Why a gridfm scenario snapshot doesn’t line up with the first snapshot’s
base element set (the row-stack keeps every table schema-consistent by
requiring the same element counts and bus-id ordering across snapshots).