The multiproc child bootstrap no longer preloads shellrun + the no-op
runx warmup: 17 test files gained their missing explicit package
require lines (punk::ansi for the bare ansi suites, punk::args for the
bare args suites incl dev/dynamic-cache, punk::lib for the lib suites
and for grepstr/untabify/examples whose punk::ansi/punk::args commands
reach punk::lib internally, plus textblock for examples.test - caught
by the empirical lean run: punk::args only soft-requires textblock and
punk::args::helpers::example calls textblock::join). Children now load
only tcltest plus each file's declared deps; the singleproc testinterp
keeps shellrun as the runner's own capture mechanism.
Module-web finding recorded in src/tests/AGENTS.md and the test-file
comments rather than fixed: punk::ansi and punk::args call punk::lib
without requiring it, and a hard back-require is blocked by punk::lib's
own hard require of punk::args (cycle) - deps declared at test level;
a considered module-level resolution remains open.
UDP watch-mode note folded into child_test_runner.tcl per user
direction: no interaction today (the parent relays child output at file
granularity; verified post-lean - events + relay flow); any future live
per-child tee must be conditional on PUNK_TEST_UDPTEE so unwatched
children stay lean.
Verified (native tclsh 9.0.3): full-suite PARITY ok for lean -jobs 16
vs the pre-lean baseline, between repeated lean -jobs 16 runs, and
lean -jobs 1 vs -jobs 16 (989/973/15/1, exec-14.3 sole failure).
Timings: -jobs 16 70.7s -> 49-53s; sequential multiproc ~5m30 -> 4m32;
singleproc unchanged. AGENTS scaling guidance refreshed.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Multi-process mode previously execd bare test files with no environment
(children died on their first package require) and misreported the
crashes as missing-cleanupTests warnings with the stderr discarded.
- testsupport/child_test_runner.tcl (new): per-file child bootstrap.
Applies a runtests-generated environment payload (prefer latest, test
tm paths, auto_path, modpod ifneeded defs, tcltest options; per-file
-testdir computed child-side), warms 'clock format' before the
module-path wipe (first script-level clock use loads msgcat from the
runtime default paths, which the test paths do not supply), and
mirrors the testinterp preload: package require shellrun plus one
no-op runx -tcl call (runx execution pulls punk::lib; several suites
depend on preloaded punk::* commands).
- runtests.tcl: generate the payload per run; spawn children via plain
exec with file-captured stdout/stderr and immediate-EOF stdin
(mechanism reusable for future parallel -jobs scheduling); classify
nonzero child exits as file-level failures with the stderr tail
surfaced in all report styles (exit-0-no-summary remains the
missing-cleanupTests warning); warn under kit executables (children
boot with kit-stamped punk packages preloaded, shadowing src dev
modules - prefer a native tclsh).
- scriptlib/developer/runtests_parity.tcl (new): compares two
'-report json' captures on result identity (per-file counts,
failure/skip/warning identities; timings ignored), tolerating
preamble noise and the ANSI SGR reset emitted on the JSON line.
Verified on native tclsh 9.0.3: full suite singleproc vs multiproc
PARITY ok (87 files, 989 tests, 973/15/1 with the documented exec-14.3
baseline as the sole failure); crash and warning classification
exercised. Wall time ~5m50s in both modes.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com