tm_path_additional_ifneeded (punk::tcltestrun) and its inline equivalent in
src/modules/test/runtestmodules.tcl called punk::path::subfolders with
-exclude {**/_build/** **/_build} - the G-155 _build -> _mint staging rename
never reached these call sites, so staged pods in <srcdir>/_mint were being
registered as bogus modules (e.g punk::mix::_mint::templates 0.2.0; measured
99 leaked _mint subfolder entries under src/modules across the two staging
trees src/modules/_mint + src/modules/punk/mix/_mint).
Both call sites now use the full option name and the pruning ***-tail form:
-exclude-paths {**/_build/*** **/_mint/***} (_build kept for legacy
checkouts). The ***-tail form prunes descent per punk::path 0.5.0, and
kit-baked punk::path 0.4.0 already accepts both the literal -exclude-paths
name and *** segments (G-093), so kit-child shadowing scenarios stay
compatible.
Verified: direct probe shows 0 _mint/_build subfolder entries and only
legitimate pods registered; runtests.tcl path.test 67/67 with no _mint
registrations in the harness startup.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
tm_path_additional_ifneeded referenced an out-of-scope \ variable that was never a parameter or local, causing 'can't read project_root: no such variable' whenever a #modpod module was found. The proc now requires project_root as a 2nd parameter. Additionally, the #modpod directory pattern was hardcoded to 999999.0a1.0 which the build system replaces with the real version (e.g 0.3.0) during make.tcl modules — breaking pattern matching in built bootsupport copies that looked for #modpod-*-0.3.0 directories which don't exist on disk. The proc now extracts both modname and version dynamically from the #modpod-<modname>-<version> directory name by splitting on the last dash, making it version-agnostic. Punk::lib::tm_version_magic convention was considered but dynamic extraction is preferred here as it will also work in the future src package_mode boot context where punk modules aren't loaded yet.
parse_testrun now keeps the full Tcl errorInfo in testcase_fails entries for ERROR-status failures (previously parsed then discarded), and captures the actual vs expected result blocks for FAILED-status result mismatches via a new result_stage sub-state. Test name extraction in the took/PASSED/SKIPPED handlers is fixed to use the full substring between the structural delimiters instead of lindex \ 1, which corrupted timing associations and testcase_passes/testcase_constraintskips keys for any test name containing spaces; the took handler uses string last to allow test names that themselves contain the word 'took'. The closing-FAILED microseconds lookup now keys on \ (authoritative) instead of the stale \. New dict keys are additive; existing consumers using dict exists/dict get are unaffected.