Files
nash/corpus/DIVERGENCES.md
T

2.0 KiB

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).