Shell Corpus Gaps

What keeps ShellSubsetLarge from accepting more of the corpus samples, and what to do about it. The samples: one-line commands from tldr and NL2Bash, scripts from the bash Cookbook, the pure-sh and pure-bash bibles, and ShellCheck's test strings, split into "clean" (strings ShellCheck's tests expect no warning for) and "warned" (strings its tests expect a warning for). Details: claude/large-subset-ceiling.md.

The yardsticks (R3). Upper, "nothing bogus found": both shells parse the sample (dash -n, bash --posix -n), ShellCheck (shellcheck -s dash) gives none of its warnings SC3xxx (a construct dash lacks), and our parser did not reject it for a difference Y1 calls blatant. Lower, "compatible": in addition, no rejection that Y1 calls subtle. Measured 2026-11-02, after leaving out duplicates, tldr's key notation and ShellCheck's scope errors (test strings that are wrong where they stand: return outside a function and the like):

SourceSamplesAcceptedLowerUpperWithin lower, rejected
tldr29,50998.8%99.1%99.1%105
NL2Bash10,62492.1%93.9%94.5%235
bash Cookbook8130.9%34.6%35.8%3
pure-sh-bible4495.5%97.7%97.7%1
pure-bash-bible12239.3%41.8%41.8%3
ShellCheck, clean87958.7%61.5%63.5%38
ShellCheck, warned76657.6%56.9%58.1%17

"Accepted" can exceed "Lower" because the subset also accepts some samples that ShellCheck warns about: it runs a program in place of dash's builtin (echo, decision K2 of "Shell Dialect Choices", and [), so dash's limits do not apply to it. The yardsticks still leave such samples out; P5 proposes counting them as excused. The 402 samples within the lower yardstick that the parser rejects are what the items Y2, Y3, P and B address; what remains after them is mostly argument forms of builtins.

Words. Both shells: dash 0.5.12 and bash --posix 5.2.21; every example was run in both on 2026-11-02. The parser: ShellSubsetLarge. The executor: the posix_spawn session's code that runs the parsed strings. Status 248: what a string returns when something outside the subset shows up only at run time.

✓ Go: do it as planned. ✗ No-go: don’t; do what “If No-go” says. ◆ Discuss strategy first: settle the approach first; holds back only the items that depend on it. ? Explain first: a show-stopper; I explain before doing anything else. ? Explain later: I explain after doing the rest. Unmarked: not done this round, left for later; it is not a rejection. A note that settles an item (picks an option, states the rule, or says the plan is right) counts as Go even without the button. My answers carry a tag: No reply needed, Your turn (I asked you something), or Answered, Claude hasn’t read it yet. The “Your turn” filter shows the items waiting for you.
What Go means

Loading marks…

Filters