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):
| Source | Samples | Accepted | Lower | Upper | Within lower, rejected |
|---|---|---|---|---|---|
| tldr | 29,509 | 98.8% | 99.1% | 99.1% | 105 |
| NL2Bash | 10,624 | 92.1% | 93.9% | 94.5% | 235 |
| bash Cookbook | 81 | 30.9% | 34.6% | 35.8% | 3 |
| pure-sh-bible | 44 | 95.5% | 97.7% | 97.7% | 1 |
| pure-bash-bible | 122 | 39.3% | 41.8% | 41.8% | 3 |
| ShellCheck, clean | 879 | 58.7% | 61.5% | 63.5% | 38 |
| ShellCheck, warned | 766 | 57.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.
Loading marks…