# nash ↔ bash divergence log Live record of behavioral divergences found by the replay harness (`replay.py`, corpus in `corpus.jsonl`). Per docs/NASH.md §10.3/§11, each entry stays open until fixed in the fork (or upstream) and re-verified by the corpus. ## Open (none) ## Closed ### D1 — IFS word-splitting applied to literal words (fixed in fork) - **Found**: M0 corpus run (`ifs-split`), brush-shell-v0.4.0. - **Repro**: `IFS=,; set -- a,b,c; echo $1` → bash `a b c`, nash `a`. - **Root cause**: brush applied IFS splitting to *literal* words, not just expansion results: under `IFS=,`, `echo a,b,c` printed `a b c` (bash: `a,b,c`) and `set -- a,b,c` received 3 args (bash: 1). POSIX/bash split only the results of parameter/command/arithmetic expansion. Mechanically, `brush-core/src/expansion.rs` had a two-state `ExpansionPiece` (`Splittable`/`Unsplittable`) conflating "field-splittable" with "glob-active", and literal text was marked `Splittable`. - **Fix**: added a third piece state `LiteralText` (never field-split, glob chars active) and produce it for unquoted literal text, the no-expansion-chars fast path, and retained-backslash escapes (`// nash:` markers in `expansion.rs`). Corpus back to 100% (94/94); candidate for upstreaming. - **Regression tests**: corpus `ifs-split` (+ `glob-all`, `glob-txt`, `cond-pattern`, `case` guard the glob/pattern side); brush compat suite. - **Fix fallout (caught by the brush compat suite, both fixed)**: (a) text substituted by `${v:-word}`/`${v:+word}`/`${v:=word}` *is* an expansion result and must split — restored via a boundary conversion in the `ParameterExpansion` arm; (b) `compgen -W` splits its word-list string as data — restored via `ExpanderOptions.field_split_literal_text`. Final suite: 1684 succeeded / 6 failed, failure set identical to the pristine-brush baseline in this container (environmental only); 3 upstream known-fail IFS tests now pass (markers flipped in `ifs.yaml`).