↪ Both fort.14 read paths reduce "the NOPE/NBOU boundary section was physically in the file but declared zero segments" and "the file had no boundary section at all" to the same empty result, so a downstream consumer cannot tell a genuinely boundaryless mesh from one whose boundary topology was stripped in its lineage.
a. `src/chilmesh/CHILmesh.py:2722` catches `IndexError` on a truncated file and leaves `boundary_segments` empty.
↪ The comment reads *"Boundary section absent (legacy mesh) — leave segments empty"*, but a present `0`/`0` NOPE-NBOU block reaches the same `boundary_segments == []` state, and nothing records which happened.
b. `src/chilmesh/fort14_io.py` `read_fort14_raw()` returns empty `open_boundaries` / `flow_boundaries` with no presence signal on `Fort14Raw`.
↪ The docstring states *"A legacy mesh with no boundary block is accepted"*, so both absent and present-empty yield empty lists and there is no `boundaries_present`-style field to disambiguate.
Summary
Reader collapses present-but-empty and absent
↪ Both fort.14 read paths reduce "the NOPE/NBOU boundary section was physically in the file but declared zero segments" and "the file had no boundary section at all" to the same empty result, so a downstream consumer cannot tell a genuinely boundaryless mesh from one whose boundary topology was stripped in its lineage.
▸ Call sites
Why it matters
Empty vs absent is semantically load-bearing
▸ Downstream symptom
▸ Current workaround is a heuristic
▸ Writer half is already resolved
Proposed resolution (pick one)
Two viable contracts
I. Expose presence
II. Ratify empty equals absent
References
Related Valence issues
a. domattioli/Valence#212 — CHILmesh-adoption epic; fort.14 read delegation (P2/chore: introspect-v2 migration incomplete on
development— 28 deprecated docs/introspections records + write-target contradiction (needs operator) #214) targetsread_fort14_raw, enumerates reader gaps (id columns, header count, winding, mixed arity, NBOU) but not a presence flag.b. domattioli/Valence#216 — writer mirror, resolved upstream in v1.3.0.
c. domattioli/Valence#13 — downstream symptom and the
topologically_completeclassifier workaround.Filed via Claude Code at operator request.