@@ -196,6 +196,27 @@ the Crypt::OpenSSL Bouncy Castle port. Defer until asked.
196196 a ` $ENV{SHLVL} ` mismatch — IPC::Open3 appears to wrap the child in a
197197 shell, bumping SHLVL. Unrelated to fork, low priority.
198198
199+ - [x] ** Phase 2b — open3 exec-failure + waitpid SIG{CHLD}=IGNORE (2026-04-22)**
200+ - Real-Perl parity for ` IPC::Open3 ` shell-wrapping: bare single-arg
201+ commands now exec directly instead of via ` /bin/sh -c ` , so exec
202+ failures surface as ` open3: exec of X failed: Y ` . The bundled
203+ ` System/Command.pm ` translates that into the fork-path's
204+ ` Can't exec( @cmd ): Y ` so ` eval ` -based error tests keep working.
205+ - ` WaitpidOperator ` now honours ` $SIG{CHLD} eq 'IGNORE' ` : when set,
206+ waitpid on a tracked Java child returns -1 (ECHILD simulation)
207+ and leaves ` $? ` untouched, so ` System::Command::Reaper ` reports
208+ the ` (-1, -1, -1) ` BOGUS triple the POSIX semantics call for.
209+ - Also fixed a real ` ConcurrentModificationException ` in
210+ ` GlobalDestruction.runGlobalDestruction ` uncovered while
211+ repro'ing t/30-exit.t: DESTROY callbacks could mutate the global
212+ HashMaps mid-iteration. Snapshot before walking.
213+ - ** ` ./jcpan -t System::Command ` : 230/241 pass (95.4%)** , up from 94%.
214+ - t/11-spawn-fail.t 2/2 (was 0/2)
215+ - t/20-zombie.t 31/32 (was 27/30)
216+ - Remaining 11 are 9 DESTROY-scope tests (tracked on the
217+ ` weaken/DESTROY ` branch) + 1 ` -Ilib ` test-harness artifact
218+ + 1 related zombie-DESTROY assertion.
219+
199220### Caveat: install-time precedence
200221
201222` @INC ` lists ` ~/.perlonjava/lib ` before the JAR-bundled lib. If a user
0 commit comments