Repository navigation
Add a local-only cross-shell differential fuzzer - #16
Merged
mitchellnemitz merged 11 commits intoJul 26, 2026
Merged
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…enerable Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add gen.go: GenConfig/DefaultGenConfig/Generate plus the witness prelude and payload-centric random walk. Every generated program opens with an unconditional, deterministic prelude witnessing all 10 admitted families (convert, parse, collection, debug, option, math, array, dict, string, regex) and all 14 pure-core/payload categories, so SC-009 coverage holds by construction from any single program and every tag reaches stdout. Reconciled against the real Task 4 catalog: dropped the plan's illustrative json/result cases (no such families), and witnessed option via is_some(parse_int(...)) rather than the non-admitted Some(...) constructor so the generator's Call nodes only ever name admitted builtins. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01STfkQ5S99NLbifDZPMpdgd
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…k, docs Task 11 (final): pure-Go CI tests plus fuzzshell-gated real-shell tests, the curated INT_MIN-via-variable regression corpus entry, and the local-only fuzzer README with the done-signal / regression-direction procedure. AGENTS.md pointer (plan Step 5) intentionally skipped as untraced scope creep. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mitchellnemitz
deleted the
impl-2026-07-25-cross-shell-differential-fuzzer
branch
July 26, 2026 03:02
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a local-only cross-shell differential fuzzer for the wisp compiler. It defends the byte-identity invariant that hand-authored golden fixtures cannot exhaustively cover: hunting programs whose emitted shell behaves differently across dash, busybox ash, bash, and zsh.
New package
internal/fuzzplus acmd/wisp-fuzzCLI. Go stdlib only, and deliberately never wired into CI (it is a local/nightly soak job, run by hand).How it works:
$(...), newlines,%s, backslashes, leading-, glob metacharacters, arithmetic edge values), where cross-shell bugs actually live.Design B, one documented carve-out: the generator deliberately emits INT_MIN, and the oracle carves zsh for the single INT_MIN-in-
$(( ))case (a documented, source-cited zsh limitation, not a wisp bug). The carve is a narrow source-level data-flow check (INT_MIN reaching an arithmetic operand via variable flow); it is not widened to arith-lowering builtins, so it cannot mask a real divergence. Reverting the INT_MIN compiler fix makes the fuzzer produce a failing reproducer.Built task-by-task with a review gate after each and a final whole-branch review.
go test ./...is green. Four-shell tests are behind afuzzshellbuild tag, so the defaultgo testspawns no shells; exercising the fuzzer end-to-end needs all four shells installed (busybox included).