Repository navigation
What's Changed
- fix(parse): adapt nested pattern groups after literal text by @ss-o in #205
- docs(parser): record the local-first front-end strategy by @ss-o in #219
- fix(parse): keep brace-form if chains across line continuations and end them at newlines by @ss-o in #218
- fix(parse): bump mvdan/sh to v3.14.1 and fail closed on repeat and foreach by @ss-o in #217
- chore(contrib): add parser-gap intake, scoped parser guidance, commit lint by @ss-o in #222
- docs(readme): improve root README with org template guidance by @ss-o in #223
- fix(parse): reject newline between brace-form if condition and body (#220) by @ss-o in #224
- fix(parse): honor quotes and escapes inside pattern bracket expressions (#204) by @ss-o in #225
- fix(parse): support associative-array subscripts beginning with @ (#194) by @ss-o in #226
- fix(parse): support function name; { list } definitions (#213) by @ss-o in #227
- docs(readme): correct contracts the CLI does not emit by @ss-o in #229
- docs(project): record the 2026-09-16 organization discovery survey by @ss-o in #240
- fix(parse): keep ${#name} inside brace-form if bodies by @ss-o in #243
- fix(parse): accept the ${name::=word} assignment operator by @ss-o in #244
- fix(parse): accept a second parameter subscript as File metadata by @ss-o in #249
- fix(parse): accept bracket expressions in flagged subscript patterns by @ss-o in #248
- fix(parse): accept bare associative keys with operator punctuation by @ss-o in #247
- fix(parse): accept associative keys mixing an expansion with ':' by @ss-o in #256
- fix(parse): end a brace-form condition only at a whole-word ]] by @ss-o in #257
- fix(parse): accept a quoted or escaped ) inside a conditional pattern group by @ss-o in #258
- fix(parse): accept a declaration builtin or let as the last command before } by @ss-o in #262
- fix(parse): rebase alternate-for retry errors and keep later anonymous-arg blockers by @ss-o in #264
- fix(parse): accept a multi-line word list in an alternate for loop by @ss-o in #268
- fix(parse): read repeat loops as while clauses with count metadata by @ss-o in #272
- fix(parse): read a rejected expression after
,in a flagged subscript literally by @ss-o in #286 - ci(corpus): pin consumer revisions so unrelated changes stay green by @ss-o in #292
- docs(corpus): declare the src loader as a startup-file by @ss-o in #294
- fix(parse): support the if list sublist short form (#210) by @ss-o in #295
- fix(parse): support multi-name function definitions (#251) by @ss-o in #304
- fix(parse): accept a loop body that begins with a separator after do (#238) by @ss-o in #296
- fix(parse): read the select short form as a select loop (#212) by @ss-o in #305
- fix(parse): close a repeat sublist from the source, not from End() (#300) by @ss-o in #308
- fix(parse): end a select sublist from the source (#300) by @ss-o in #310
- fix(parse): close a declaration brace block inside a loop, if or case body (#298) by @ss-o in #309
- fix(scope): index multi-name and anonymous function declarations (#306) by @ss-o in #311
- fix(parse): accept a separator that opens a then or else branch (#297) by @ss-o in #312
- fix(parse): accept a select header with an empty body (#302) by @ss-o in #313
- fix(parse): accept the brace body of a select loop (#301) by @ss-o in #315
- fix(parse): reject a bare } word as native Zsh does (#314) by @ss-o in #317
- fix(parse): reject a } that ends a word as native Zsh does (#316) by @ss-o in #318
- fix(parse): accept the parenthesized list form of select (#303) by @ss-o in #320
- fix(parse): read an empty select body before an operator (#319) by @ss-o in #322
- fix(parse): accept a negated select or for adapter form (#321) by @ss-o in #323
- fix(parse): support single-command for, while and until loops (#211) by @ss-o in #325
- fix(parse): accept the alternate for (( ... )) sublist form (#241) by @ss-o in #326
- fix(parse): accept an empty loop body after while, until and for (#327) by @ss-o in #329
- refactor(parse): share one command-position walker (#299) by @ss-o in #328
- perf(ci): check every Zsh file in one job instead of one job per file (#334) by @ss-o in #336
- fix(parse): disarm alternate-form scan on a non-brace while body (#337) by @ss-o in #338
- fix(parse): reject carriage returns Zsh rejects (#333) by @ss-o in #339
- fix(parse): accept a redundant
;in command position (#332) by @ss-o in #340 - fix(parse): read a while or until condition as a list (#330) by @ss-o in #341
- docs(project): record the 2026-09-21 survey and pin two fixtures by @ss-o in #342
- docs: use semantic line breaks in prose by @ss-o in #343
- fix(parse): accept a list ending in a dangling && or || by @ss-o in #345
- fix(parse): accept a separator before a () function body by @ss-o in #347
- fix(parse): accept a multi-name for with a parenthesized word list by @ss-o in #348
- fix(parse): accept a function body that is not a brace group by @ss-o in #349
- fix(parse): accept math function calls in arithmetic expressions by @ss-o in #352
- fix(parse): keep a condition brace group out of the alternate-if body by @ss-o in #353
- fix(parse): accept a math function call in a ternary branch by @ss-o in #355
- fix(parse): read a nested
$((as arithmetic, as native Zsh does by @ss-o in #364 - fix(parse): accept a flagged subscript pattern in every position by @ss-o in #358
- perf(parse): stop anonymous-function closer retries without progress by @ss-o in #365
- fix(parse): read a bracket expression before a flagged pattern's operator by @ss-o in #367
- fix(parse): read a doubled sign in an associative key as key text by @ss-o in #370
- fix(parse): read a subscripted expansion inside a flagged pattern (#371) by @ss-o in #375
- fix(parse): read an expansion operator under a length prefix (#373) by @ss-o in #377
- fix(parse): read a bracket expression in a flagged pattern in arithmetic (#368) by @ss-o in #378
- fix(parse): read a command substitution in a flagged pattern (#379) by @ss-o in #381
- fix(parse): reject a flagged pattern the parser cut short (#382) by @ss-o in #383
- fix(parse): read a single-quoted key in a nested expansion by @ss-o in #388
- fix(parse): accept a plain command heading a brace-form condition list (#376) by @ss-o in #392
- fix(parse): read substitutions inside double quotes (#393) by @ss-o in #399
- fix(parse): read the until brace form like while (#394) by @ss-o in #402
- fix(lint): clear staticcheck findings and lint the module in CI (#380) by @ss-o in #403
- test(survey): check fixtures against native zsh in Go CI (#404) by @ss-o in #405
- docs(project): freeze requiredFixtures as the deletion baseline (#406) by @ss-o in #407
- feat(survey): trace base parses and adapter depth per file (#408) by @ss-o in #409
- feat(survey): compare verdicts against a base build (#412) by @ss-o in #413
- ci: report parse cost per pull request, observed not gated (#414) by @ss-o in #415
- test(manualcite): require released Zsh manual citations by @ss-o in #411
- docs: add the parser-gap fix skill and agent session setup (#416) by @ss-o in #417
- test(ci): keep hardened action pins in step with Renovate bumps (#420) by @ss-o in #421
- ci: bump the golangci-lint version in all three places together (#422) by @ss-o in #423
- test(corpus): cite the manual on every ok- fixture by @ss-o in #424
- feat: mutation-test the lines a change touches (#425) by @ss-o in #426
- test(parse): cite the manual on the #120 invalid source by @ss-o in #427
- test(parse): cite the manual on the #208 invalid sources by @ss-o in #430
- test(parse): cite the manual on the #211 invalid sources by @ss-o in #432
- test(parse): cite the manual on the #212 invalid sources by @ss-o in #433
- feat: generate probe grids across scanner contexts (#428) by @ss-o in #431
- fix(parse): skip here-document bodies in the brace-form scanners (#429) by @ss-o in #436
- fix(ci): flag parse cost only when a file keeps its verdict (#437) by @ss-o in #438
- fix(parse): read ${...} as its own quoting context in patterns (#401) by @ss-o in #442
- test(parse): cite the manual on the #215 invalid sources by @ss-o in #434
- test(parse): cite the manual on the #216 invalid sources by @ss-o in #444
- test(parse): cite the manual on the #220 invalid sources by @ss-o in #445
- feat(parse): read brace-form if and while in the parser fork (#446) by @ss-o in #447
- docs(project): cut the parser-gap workflow back to the contract (#448) by @ss-o in #449
- fix(parse): read a quote in a double-quoted ${...} word as text (#400) by @ss-o in #450
- fix(parse): read a here-string as a word in the try/always scanner (#435) by @ss-o in #451
- fix(parse): read a case pattern's leading ( as its opener (#440) by @ss-o in #454
- fix(parse): recognise a quoted pattern closer inside backquotes (#441) by @ss-o in #455
- fix(parse): read a pattern group through a substitution (#439) by @ss-o in #456
- fix(parse): read a case pattern that begins with a group (#452) by @ss-o in #458
- fix(parse): keep a same-line tail after a brace-form for closer (#275) by @ss-o in #460
- feat(parse): read loop short and alternate forms in the fork (#459) by @ss-o in #461
- feat(parse): read repeat loops as a RepeatClause in the fork (#281) by @ss-o in #464
- fix(ci): stop mutation.sh passing runs where every mutant times out (#463) by @ss-o in #465
- docs(agents): name the org files parser work must open (#468) by @ss-o in #471
- fix(parse): read list trivia before a closer after a dangling operator (#466) by @ss-o in #472
- ci: adopt the organization routing caller (ADR-0031) by @ss-o in #473
- fix(parse): accept an empty alternative in a case pattern (#396) by @ss-o in #474
- fix(parse): read a bare associative key holding a blank (#372) by @ss-o in #475
- feat(parse): read the csh-style foreach ... end loop (#214) by @ss-o in #477
- fix(parse): accept a function name holding an expansion (#234) by @ss-o in #478
- ci(corpus): guard F-Sy-H and the Zsh Completion tree against regressions (#470) by @ss-o in #486
- fix(parse): stop the function head scan at a closer (#480) by @ss-o in #487
- fix(parse): read a line continuation as trivia before a redundant separator (#467) by @ss-o in #489
- docs(corpus): verify the Zsh 5.9 false accepts in the regression survey record (#488) by @ss-o in #491
- ci: judge native-oracle jobs with Zsh 5.9.2 (#492) by @ss-o in #493
- docs: document the two-tier zsh -n verdict and corpus renames (#287, #290) by @ss-o in #498
- fix(parser): accept separators between the case word and in (#485) by @ss-o in #499
- fix(parser): reject reserved words after an assignment prefix (#278) by @ss-o in #500
- fix(parser): read a function keyword definition with no body (#479) by @ss-o in #501
- fix(parse): read a math function call inside a parenthesized group (#356) by @ss-o in #504
- fix(parse): end a dangling && or || at its closing backquote (#469) by @ss-o in #505
- fix(parser): accept a subscripted or array assignment prefix (#285) by @ss-o in #506
- fix(parser): require a name after a braced ${+ (#363) by @ss-o in #507
- ci: emit corpus checks on every pull request by @ss-o in #508
- fix(parser): accept module and multi-operand dash conditions (#484) by @ss-o in #510
- fix(parser): end a word inside a glob group as Zsh does by @ss-o in #514
- fix(parser): reject a lone - condition and ! or ( after < or > by @ss-o in #515
- fix(parse): skip a parameter expansion in a conditional pattern group by @ss-o in #516
- fix(parser): nest braces in the word of a parameter expansion by @ss-o in #520
- fix(parser): end an =~ operand inside a group as other Zsh words by @ss-o in #523
- fix(parser): end a word at an empty group in a [[ ]] operand by @ss-o in #524
- fix(parser): count braces in the subscript of an unquoted ${...} by @ss-o in #525
- fix(parser): parse a command substitution body inside a glob group by @ss-o in #527
- fix(parser): parse a command substitution body in a subscript flag argument by @ss-o in #528
- fix(parser): keep a
]inside a substitution in a subscript flag argument by @ss-o in #530 - fix(parser): nest a bare group inside a word's glob group by @ss-o in #533
- fix(parser): keep a flagged short subscript inside a subscript flag argument by @ss-o in #535
- fix(parser): balance substitution brackets over a whole subscript by @ss-o in #536
- fix(parser): reject a
[never closed in a subscript flag argument by @ss-o in #537 - fix(parser): reject a
[never closed in a short subscript flag argument by @ss-o in #539 - test(survey): check corpus trees against Zsh's own deparse (#541) by @ss-o in #549
- fix(parser): keep a brace-form else without a then position (#541) by @ss-o in #550
- fix(parser): print function and case forms Zsh reads as written (#541) by @ss-o in #551
- fix(parser): read a short subscript flag with dquote_parse rules (#540) by @ss-o in #552
- fix(parser): read && or || across ; as Zsh does (#548) by @ss-o in #556
- fix(parser): read | or |& across ; as Zsh does (#553) by @ss-o in #558
- feat(agents): add one command that verifies a parser change (#560) by @ss-o in #561
- feat(survey): one command for a parser fix's grid, differentials and checks (#545) by @ss-o in #559
- feat(survey): judge a file against zsh -f -n and reduce a parser gap (#562) by @ss-o in #566
- fix(survey): report a file zsh cannot open instead of judging it invalid by @ss-o in #568
- fix(parser): read a leading ; in a quoted or backquoted substitution (#569) by @ss-o in #570
- fix(parser): read a # glued to a case pattern's opener as text (#482) by @ss-o in #579
- fix(parser): keep a blank inside a case pattern's bracket expression (#483) by @ss-o in #581
- fix(parser): read a (( that continues a word as a glob group (#481) by @ss-o in #585
- feat(agents): adopt complete organization instruction consumers by @ss-o in #593
- ci: pin org routing to 893749ca and refresh code-review skill by @ss-o in #594
- chore(github): vendor the organization issue forms by @ss-o in #595
- docs(github): describe the vendored organization forms in the issue config by @ss-o in #596
- ci: re-pin the code-review skill with bundled criteria by @ss-o in #597
- docs(project): correct the agent tooling plan and track each step by @ss-o in #599
- fix(tooling): cover fork and case mutation blind spots by @ss-o in #601
- ci: adopt advisory tool-attribution checks by @ss-o in #602
- chore(github): sync the organization forms and repin commit-lint by @ss-o in #603
- test(survey): link each runtime-tier invalid fixture to its issue (#563) by @ss-o in #604
- ci: repin org routing and add the reporting-issues section by @ss-o in #605
- ci: repin org routing to the reporting heading fix by @ss-o in #606
- ci: repin org routing to link the project profile by @ss-o in #607
- docs(project): record full #489 and #536 mutation replays (#544) by @ss-o in #608
- docs: align local parser guidance with tooling (#564) by @ss-o in #600
- fix(parser): return an error, not a panic, for ${[ at EOF (#609) by @ss-o in https://github.com//pull/617
- fix(parser): read empty sublists and dangling and-or in the fork (#572) by @ss-o in #615
- fix(rules): resolve command prefixes, narrow unquoted-var (#613) by @ss-o in #618
- docs(project): put fix evidence in the PR, not dated records (#546) by @ss-o in #616
Full Changelog: v1.3.0...v1.4.0