// ZSHRS — PARITY REPORT

zshrs on main (431cc21de5) against zsh. Oracle: zsh-5.9.2's own Test/*.ztst, built from the zsh-5.9.2 tag. Every section was measured on this build except the emulation-fuzz legs other than --zsh, the C-port count, and the daily-driver burst rows, which are labelled. Measured 2026-10-10, aarch64-apple-darwin.

GitHub
// Color scheme

>_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.
CatAreaFileszsh passzshrs passMissedStatus

>_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#AssertionDiffers inCause
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).
BufferzshzshrsΔ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.
TestRe-run alone

>_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.
Setzsh 5.9.2zshrsMissingStatus

>_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.
WayzshrsReferenceCasesMismatchesStatus
zsh--zshzsh 5.9.23,3060match
bash--bashbash 5.3.203,3890match
ksh--kshksh 93u+m/1.0.103,2120match
sh--sh/bin/sh (bash 3.2.57, POSIX mode)2,5850match
dash--dashdash2,4910match
sh, zsh-style--sh --zshzsh 5.9.2 emulate sh2,6320match
ksh, zsh-style--ksh --zshzsh 5.9.2 emulate ksh3,0750match
mksh--mkshmksh R592,6250match
ash--ashash (busybox)2,4750match
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.
LegzshrsReferenceCasesDivergentRateDistinctExample minimized divergenceStatus
zsh--zshzsh 5.9.220,00000.0%0—match
sh, zsh-style--sh --zshzsh 5.9.2 emulate sh20,00000.0%015,824 cases had no signal: the oracle exited non-zero with empty stdoutmatch
ksh, zsh-style--ksh --zshzsh 5.9.2 emulate ksh20,000130.07%7[[ -z ${arr[99]} ]]; print -r -- $?diverged
dash--dashdash 0.5.13.520,00000.0%0—match
ash--ashash (busybox)20,000280.14%5getopts ':a:b' o -a (silent-mode missing argument)diverged
sh--shbash 5.3.20 --posix20,00000.0%0—match
bash--bashbash 5.3.2020,0001,6208.10%35(exit N) | (exit N); echo "${PIPESTATUS[*]}", ${BASH_REMATCH[N]} after a failed match, [[:upper:]] in casediverged
ksh--kshksh 93u+m/1.0.1020,0002,00510.03%27IFS=, field splitting with print, builtin -ddiverged
mksh (= pdksh)--mkshmksh R5920,0001,3246.62%221(( N||N )) and (( x=N )) arithmetic result formsdiverged
csh--cshtcsh 6.21.0020,00000.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.
CheckzshzshrsStatusReading
$#_comps, no key pressed51,79551,836matchzinit turbo drains while the prompt sits idle; the probe ran after a 30 s settle.
$#fpath5252matchsame count in this run
zstyles defined204206by design.zshrc takes different branches under zshrs (ZPWR_NATIVE_ZLE); the count was 190 on v0.13.18
3 commands typed in one burst3/33/3matchno type-ahead lost
Fast-typed $( [ ' ${ lines5/52–5/5varieslines: $(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