>_SUMMARY
On zsh's own regression suite, zshrs passes 2,068 of the 2,068 assertions that zsh 5.9.2 passes (100.00%). Against the v0.13.18 run (2,038 of 2,068) every gap is closed: the kill and math-error wording, the typeset hide flag, let status, alias function definition, RESTRICTED, subshell jobs, the Equals token in a ${x:-=word} default, the ZLE highlight file (a zsh drop-in sends no startup terminal queries and writes text attributes the 5.9.2 way) and the two completion tests that a subshell cd had broken. Where upstream has since changed behaviour, the zsh drop-in keeps 5.9.2's.
100.00%
zsh Test Suite
2,068 / 2,068
0
ztst Divergences
core and completion
178/178
Completion ztst
Y01–Y03
468/488
TAB Screens
byte-identical
1,275
Names Matched
14 missing of 1,289
49,300
cargo Parity Pass
35 fail · 4 timing
87
C Fn Stubs
of 2,473 C functions
9-Way
Emulation Fuzz
--zsh 0 / 20,000 divergent
29
zshrs-only Passes
fail or unrunnable in this zsh build
>_BY METHOD
>_ZTST BY CATEGORY
Only assertions zsh 5.9.2 passes in this build count, so tests zsh skips or cannot run here never count against zshrs. Y is the completion suite (Y01–Y03 in 5.9.2); every other letter is the core suite, run with zshrs as its own ztst harness via scripts/ztst_compsys.py --core.
| Cat | Area | Files | zsh pass | zshrs pass | Missed | Status |
>_EVERY TEST FILE
same result as zsh on every assertionzshrs misses an assertion zsh passeszsh passes nothing here in this build (root, gdbm, private module)
Tile figures: zshrs pass / zsh pass. Y04–Y06 exist only in the zsh development tree, not in 5.9.2, so they hold no assertions here. X04zlehighlight passes 12 / 12.
>_ZTST DIVERGENCES
| File | # | Assertion | Differs in | Cause |
Other direction: zshrs passes 3 assertions zsh marks expected-to-fail (D04parameter #234, E03posix #13, V01zmodload #35), and 29 that zsh does not pass in this build (V10private and V11db_gdbm are skipped by zsh here).
>_TAB COMPLETION SCREENS (v0.13.18)
Each cell types a buffer, presses TAB once, and diffs the 40×110 grid zsh draws against the grid zshrs draws (-f -i, the same pinned zsh-written compdump, native mode, 30 s key budget). 490 cells: the shared corpus plus 300 commands discovered on this host. 468 identical, 20 diverged, 2 skipped (zinit and zpwr are not on the test shell's PATH).
| Buffer | zsh | zshrs | Δ | What differs |
16 of 20 differ only in the candidate count the listing prompt reports; 2 differ in the RANDOM description row and 2 in the order of the history-modifier list. Where zshrs lists more, the extras are its own parameters and completion functions.
>_CARGO PARITY TESTS (v0.13.18)
cargo test --test parity: 49,300 passed, 39 failed, 28 ignored (known divergences, not counted). The reference shell is the zsh development-tree oracle build (5.9.999.3-test). Each failure was then re-run alone, single-threaded: 35 still fail, 4 pass and failed only under parallel load. The full run was made on the commit before the argv[0]-zsh gate narrowing; the 3 hex-colour tests that gate had broken were re-run green afterwards and are counted as passes.
>_SURFACE
Name-by-name diff of zsh -fc against zshrs --zsh -fc with every loadable module except example loaded in both, on main. Missing: parameters zcurses_* (4), ZFTP_* (4) and ZCURSES_COLORS / ZCURSES_COLOR_PAIRS; widgets delete-to-char and zap-to-char with their dotted forms. zshrs also exposes names zsh 5.9.2 lacks: builtin nameref; parameters .zle.esc, .zle.sgr, SRANDOM, ZSH_EXEPATH, ZSHRS_HOME; modules zsh/hlgroup, zsh/ksh93, zsh/random.
| Set | zsh 5.9.2 | zshrs | Missing | Status |
>_9-WAY EMULATION PARITY (main, v0.13.48 and later)
Curated matrix. cargo test --test emulation_parity runs hand-written per-dialect corpora, generated operator grids and two tagged data files through zshrs --X and the real shell X and compares stdout and the exit-status sign; every script runs in an empty scratch directory with a 30 s limit and the ways run in parallel. The references are the newest installed shells (bash 5.3.20, ksh 93u+m/1.0.10, zsh 5.9.2); the sh way is skipped where /bin/sh is dash, and pdksh runs only where a reference is installed. All 55 tests in the file pass on the macOS aarch64 host.
| Way | zshrs | Reference | Cases | Mismatches | Status |
| zsh | --zsh | zsh 5.9.2 | 3,306 | 0 | match |
| bash | --bash | bash 5.3.20 | 3,389 | 0 | match |
| ksh | --ksh | ksh 93u+m/1.0.10 | 3,212 | 0 | match |
| sh | --sh | /bin/sh (bash 3.2.57, POSIX mode) | 2,585 | 0 | match |
| dash | --dash | dash | 2,491 | 0 | match |
| sh, zsh-style | --sh --zsh | zsh 5.9.2 emulate sh | 2,632 | 0 | match |
| ksh, zsh-style | --ksh --zsh | zsh 5.9.2 emulate ksh | 3,075 | 0 | match |
| mksh | --mksh | mksh R59 | 2,625 | 0 | match |
| ash | --ash | ash (busybox) | 2,475 | 0 | match |
Differential fuzz. parity-fuzz --matrix --count 20000 --seed 1 --verify 2, one run per leg, with the divergence cap lifted so every leg checks all 20,000 cases. Each leg runs zshrs in an emulation mode against the real shell it imitates and compares stdout and exit status. A case counts only when it diverges on two consecutive runs. Each target has its own script generator, so rates are not comparable across rows. The sh leg uses bash 5.3 in POSIX mode as its oracle (this host’s /bin/sh is bash 3.2 and answers differently from POSIX sh), and with no pdksh installed the pdksh leg falls back to mksh, so the 11 legs reduce to the 10 distinct comparisons below. The csh leg runs each script as a file on both sides, because tcsh -c executes only the first line of a multi-line string. “Distinct” counts the different minimized programs among the divergent cases; the bash, ksh and mksh generators reach constructs (;;&, @A/@K transforms, sparse arrays, ksh .sh.*) that are not yet in the curated matrix.
| Leg | zshrs | Reference | Cases | Divergent | Rate | Distinct | Example minimized divergence | Status |
| zsh | --zsh | zsh 5.9.2 | 20,000 | 0 | 0.0% | 0 | — | match |
| sh, zsh-style | --sh --zsh | zsh 5.9.2 emulate sh | 20,000 | 0 | 0.0% | 0 | 15,824 cases had no signal: the oracle exited non-zero with empty stdout | match |
| ksh, zsh-style | --ksh --zsh | zsh 5.9.2 emulate ksh | 20,000 | 13 | 0.07% | 7 | [[ -z ${arr[99]} ]]; print -r -- $? | diverged |
| dash | --dash | dash 0.5.13.5 | 20,000 | 0 | 0.0% | 0 | — | match |
| ash | --ash | ash (busybox) | 20,000 | 28 | 0.14% | 5 | getopts ':a:b' o -a (silent-mode missing argument) | diverged |
| sh | --sh | bash 5.3.20 --posix | 20,000 | 0 | 0.0% | 0 | — | match |
| bash | --bash | bash 5.3.20 | 20,000 | 1,620 | 8.10% | 35 | (exit N) | (exit N); echo "${PIPESTATUS[*]}", ${BASH_REMATCH[N]} after a failed match, [[:upper:]] in case | diverged |
| ksh | --ksh | ksh 93u+m/1.0.10 | 20,000 | 2,005 | 10.03% | 27 | IFS=, field splitting with print, builtin -d | diverged |
| mksh (= pdksh) | --mksh | mksh R59 | 20,000 | 1,324 | 6.62% | 221 | (( N||N )) and (( x=N )) arithmetic result forms | diverged |
| csh | --csh | tcsh 6.21.00 | 20,000 | 0 | 0.0% | 0 | — | match |
The csh corpus (cargo test --test csh_parity, zshrs --csh against /bin/tcsh, stdout byte for byte) passed 4 of 4 tests: 76 table-driven script cases across three tests, plus the stdin-driven prompt-loop test. A further 20,000 generated cases (--count 5000 at base seeds 10000, 50000, 200000 and 1000000) had 0 divergences. Before the fix the first leg run had 123 of 2,000 divergent, every one an exit status: tcsh exits 1 when it skips forward to a final closer line with no newline after it (the rest of an if chain after a taken branch, a false test with no else, breaksw, a break), zshrs exited 0. The hand-written battery found 4 more differences, still open: if ({ false }) cmd leaves status 1 in tcsh and 0 here; @ with no arguments piped (@ | grep) prints nothing; the :& history modifier on a $var runs a background job; time cmd prints its summary twice, to stderr, where tcsh prints one line to stdout.
>_DAILY DRIVER
Measured 2026-10-10 on main, five zshrs runs. Both shells started interactively in a pty with the real ~/.zshrc (zpwr, zinit turbo) and probed through a sourced file once the prompt settled.
| Check | zsh | zshrs | Status | Reading |
$#_comps, no key pressed | 51,795 | 51,836 | match | zinit turbo drains while the prompt sits idle; the probe ran after a 30 s settle. |
$#fpath | 52 | 52 | match | same count in this run |
| zstyles defined | 204 | 206 | by design | .zshrc takes different branches under zshrs (ZPWR_NATIVE_ZLE); the count was 190 on v0.13.18 |
| 3 commands typed in one burst | 3/3 | 3/3 | match | no type-ahead lost |
Fast-typed $( [ ' ${ lines | 5/5 | 2–5/5 | varies | lines: $(echo a), quote mix, ${HOME:t}, $((1+2)), "x y", typed back to back; the later lines were missing from the captured screen in 4 of 5 runs, zsh in 1 of 1. Not yet separated into a capture artefact and lost type-ahead. |
>_METHOD
- ztst, TAB screens, cargo parity, surface, fuzz and daily driver: zshrs built from
main (git archive into a scratch directory, debug profile). The non---zsh fuzz legs and the C-port count are carried over, as labelled.
- Oracle: zsh 5.9.2 built from the
zsh-5.9.2 tag with --enable-unicode9. scripts/ztst_compsys.py ran the suite once with zsh as baseline and once with zshrs as the shell under test (--core for the non-Y files, default mode for Y01–Y03). The 5.9.2 tree holds no Y04–Y06.
- This zsh build has no gdbm and cannot load
zsh/param/private, and P01privileged needs root. Those assertions are excluded from both sides.
- X04zlehighlight, invoked as
zsh: the shell sends no startup terminal queries or OSC 7 (5.9.2 sends none), writes text attributes with explicit off bits and per-attribute off capabilities as 5.9.2 does, and keeps hex colours 24-bit unless zsh/nearcolor is loaded. These gates apply to a zsh drop-in (--zsh or argv[0] zsh); native zshrs keeps the development-tree behaviour.
- TAB screens:
scripts/comptab_parity.py --sequences tab1 --discover 300 --key-budget 30, native mode, a pinned zsh-written compdump, reference Homebrew zsh 5.9.2.
- cargo parity:
cargo test --test parity; the reference shell is the development-tree oracle build resolved by tests/parity/oracle.rs, which lacks the restricted option and the subshell job-control guard that 5.9.2 has, so main differs from that oracle in a few cases it matched before. Failures re-run alone with --test-threads=1.
- Surface and fuzz checks compare against the host zsh 5.9.2 and the reference shells named in each table.
- csh:
parity-fuzz --shell csh --count 2000 --seed 1 --verify 2 and cargo test --test csh_parity, debug build, reference /bin/tcsh 6.21.00; one run each. The generator covers 28 statement kinds; a hand-written battery of 170 further constructs was also run against tcsh (stdout and exit status; job pids normalised).
- C port coverage is read from the published port report (generated 2026-10-17), not regenerated for this page.
- Daily driver: a pty harness started each shell with
-i and the real ~/.zshrc, waited 30 s, then sourced a probe file and typed the burst and quote lines.