readEnvRows
env.stamp's own pair, deliberately not the mods.stamp one: the two disagree on line shape, on what column one holds, on whole-file against per-line comparison, and on what a mismatch costs. Either parser would read the other's file without complaint and mean something else.
No file reads as no rows, which never equals envRows — so the rebuild path is the default.