6ee8ff389d
`render_csv` built its layout with `GridLayout::new`, which does not apply `prune_empty` — only `with_frozen_records` does. So `:export` in the TUI and the CLI export path both wrote rows the grid does not draw. User-visible, in production, and shipping for as long as the two constructors have differed. The fourth instance of this trap; the third was `project::grid_in` in PR #78, and this is that fix line for line. The fixture is the difficulty, and the ticket says so. The sibling property written for improvise-t6db passed on the buggy tree in its first version, because it made its two views differ by turning pruning *off* — vacuous, since with nothing to prune both code paths agree. So this one contains a row that is actually empty, leaves `prune_empty` ON, and asserts the precondition in both directions before exporting: `with_frozen_records` draws 2 rows where `new` holds 3. If pruning ever becomes a no-op the precondition fails and says so, rather than the assertion passing vacuously. No fault needed injecting — the bug was live. On the unfixed tree the test fails with `["Food", "Gas", "Rent"]` against `["Food", "Gas"]`. None of `export.rs`'s three pre-existing tests mentions pruning at all, which is exactly why this shipped. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FC2jVn8Au7E9JPkw6bwXXH