From f4d1091d61b40591f0707318036fb5d4d434a2b9 Mon Sep 17 00:00:00 2001 From: Julian Noble Date: Mon, 27 Jul 2026 12:36:39 +1000 Subject: [PATCH] win32-ix86 verification kits repointed at minimal payloads punk8min.vfs / punk9min.vfs The full punk8win/punk9win_for_tkruntime payloads shipped x64-only binary packages into the 32-bit kits (user-observed): a higher-versioned x64 Thread 2.8.12 shadowed the LUCK runtime's working 32-bit 2.8.5 on plain package require and broke the repl (tsv machinery), and x64-only dlls (tcludp etc) failed with "couldn't load from current filesystem". Measured: forcing -exact Thread 2.8.5 loaded fine, proving the backport's zipfs dll loading works and the failure was purely wrong-arch version shadowing. New minimal payloads: both startup fauxlinks (root main.tcl + the undroidwish app/main.tcl hook) plus directory fauxlinks to MULTI-ARCH packages only - those carrying a win32-ix86 platform subdir: iocp-2.0.2 (both majors, from punk8win.vfs / punk9magicsplat.vfs) and twapi-5.0b1 (tcl8, from punk86.vfs). No binary duplication in VCS (G-004); the pure-tcl module/lib set arrives via the dll-free _vfscommon.vfs overlay. Verified: both kits boot, resolve punk::args from _vfscommon, load Thread (2.8.5 own-arch on LUCK / 3.0.5 static on sfe), iocp 2.0.2 (ix86 dll), twapi (4.7.2 stable beats the linked 5.0b1 beta under prefer-stable on LUCK; 5.2.0 static on sfe), udp 1.0.11 on LUCK (own archive copy, no longer shadowed); piped shell sessions evaluate cleanly on both with zero tsv-unavailable noise. Remaining specimen quirk (out of payload scope): punkluck86 segfaults at process exit AFTER a completed shell session (exit 139) - repl-teardown x 2019-era runtime interaction; the tclsh subcommand exits 0 with all four packages loaded. punkexe subtree 69 tests 0 fail. Claude-Session: https://claude.ai/code/session_01UEgomWq6kA6c4A8GswqqGW Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com --- CHANGELOG.md | 11 ++++++++++ punkproject.toml | 2 +- src/runtime/mapvfs.config | 21 ++++++++++++------- src/vfs/AGENTS.md | 1 + ...main.tcl#@punk%3a%3aboot,merge_over#.fxlnk | 0 ...@punk%3a%3aboot,merge_over#directory.fxlnk | 0 ...@punk%3a%3aboot,merge_over#directory.fxlnk | 0 ...main.tcl#@punk%3a%3aboot,merge_over#.fxlnk | 0 ...main.tcl#@punk%3a%3aboot,merge_over#.fxlnk | 0 ...@punk%3a%3aboot,merge_over#directory.fxlnk | 0 ...main.tcl#@punk%3a%3aboot,merge_over#.fxlnk | 0 11 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 src/vfs/punk8min.vfs/app/main.tcl#..+..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk create mode 100644 src/vfs/punk8min.vfs/lib_tcl8/iocp-2.0.2#..+..+punk8win.vfs+lib_tcl8+iocp-2.0.2#@punk%3a%3aboot,merge_over#directory.fxlnk create mode 100644 src/vfs/punk8min.vfs/lib_tcl8/twapi-5.0b1#..+..+punk86.vfs+lib_tcl8+twapi-5.0b1#@punk%3a%3aboot,merge_over#directory.fxlnk create mode 100644 src/vfs/punk8min.vfs/main.tcl#..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk create mode 100644 src/vfs/punk9min.vfs/app/main.tcl#..+..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk create mode 100644 src/vfs/punk9min.vfs/lib_tcl9/iocp-2.0.2#..+..+punk9magicsplat.vfs+lib_tcl9+iocp-2.0.2#@punk%3a%3aboot,merge_over#directory.fxlnk create mode 100644 src/vfs/punk9min.vfs/main.tcl#..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk diff --git a/CHANGELOG.md b/CHANGELOG.md index c656d792..591f117d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ The latest `## [X.Y.Z]` header must match the `version` field in `punkproject.to Entries are newest-first; one bullet per notable change. See the root `AGENTS.md` "Project Versioning" section for the bump policy. +## [0.28.1] - 2026-07-27 + +- The win32-ix86 verification kits (punkluck86 / punk91ix86) wrap new MINIMAL payloads + `punk8min.vfs` / `punk9min.vfs`: boot fauxlinks plus multi-arch binary packages only + (iocp-2.0.2 both majors, twapi-5.0b1 for tcl8, via directory fauxlinks - no binary + duplication), pure-tcl set via the dll-free `_vfscommon.vfs` overlay. The previous + full 64-bit payloads broke basic shell functionality on the 32-bit kits: a + higher-versioned x64 Thread shadowed the LUCK runtime's working 32-bit copy, and + x64-only dlls could never load. Both kits now run a working piped shell session and + resolve Thread/iocp/twapi (punkluck86 additionally udp) at correct architecture. + ## [0.28.0] - 2026-07-27 - Kit boot finds its payload wherever the runtime mounted the attached archive (G-129): diff --git a/punkproject.toml b/punkproject.toml index 5572c1d3..d744607c 100644 --- a/punkproject.toml +++ b/punkproject.toml @@ -1,4 +1,4 @@ [project] name = "punkshell" -version = "0.28.0" +version = "0.28.1" license = "BSD-2-Clause" diff --git a/src/runtime/mapvfs.config b/src/runtime/mapvfs.config index d0c357e4..1acb8fa8 100644 --- a/src/runtime/mapvfs.config +++ b/src/runtime/mapvfs.config @@ -114,13 +114,20 @@ tclsh9.0.5-punk-bi.exe {punk9win_for_tkruntime.vfs punk9bi_beta zip} tclkit-902-Linux64-intel-dyn {punk9linux.vfs punkshell902 kit linux-x86_64} #G-129 verification runtimes: third-party 32-bit windows, bin/runtime/win32-ix86/ tier -# (see goals/G-129-kitboot-mountpoint-derivation.md). Kept active so both zipfs mount -# conventions stay covered by real kits. +# (see goals/archive/G-129-kitboot-mountpoint-derivation.md). Kept active so both zipfs +# mount conventions stay covered by real kits. +#These wrap the MINIMAL payloads punk8min.vfs / punk9min.vfs: boot fauxlinks plus +# multi-arch binary packages only (win32-ix86 subdir present: iocp-2.0.2 both majors, +# twapi-5.0b1 for tcl8), with the pure-tcl module/lib set arriving via the _vfscommon +# overlay. The original full punk8win/punk9win_for_tkruntime pairings shipped x64-only +# binary packages into 32-bit kits: a higher-versioned x64 Thread shadowed the runtime's +# working 32-bit copy (broke the repl), and x64-only dlls (tcludp etc) could never load +# (repointed 2026-07-27). #androwish/undroidwish 8.6 zipfs backport (LUCK build): mounts its attached archive at the # EXECUTABLE'S OWN PATH and has no tcl::zipfs::root - the boot derives the mount point -# from the runtime's own mount table. 8.6 payload. -tclsh8.6.10-luck-zip.exe {punk8win.vfs punkluck86 zip win32-ix86} +# from the runtime's own mount table. +tclsh8.6.10-luck-zip.exe {punk8min.vfs punkluck86 zip win32-ix86} #apn tcl-sfe 9.1b0 32-bit: modern //zipfs:/app convention - proves the 32-bit target -# itself needs nothing special. Runtime carries no Tk, so pair the no-tk-payload vfs -# (its tk-carrying siblings ship x64 dlls a 32-bit runtime cannot load). -tclsh9.1b0-tclsfe.exe {punk9win_for_tkruntime.vfs punk91ix86 zip win32-ix86} +# itself needs nothing special. Runtime carries no Tk; Thread/twapi/sqlite3/tdbc are +# STATIC in this runtime (32-bit builtins - G-058 capture resolves them). +tclsh9.1b0-tclsfe.exe {punk9min.vfs punk91ix86 zip win32-ix86} diff --git a/src/vfs/AGENTS.md b/src/vfs/AGENTS.md index c399755a..6c0fc603 100644 --- a/src/vfs/AGENTS.md +++ b/src/vfs/AGENTS.md @@ -21,6 +21,7 @@ VFS (Virtual File System) folders define the runtime payloads that get wrapped i - `src` mode loads unbuilt modules and libraries from the project's `src/` tree (`src/modules`, `src/lib`, `src/bootsupport`, `src/vendormodules`) instead of built output. It also runs an inline `#modpod` package-ifneeded scanner (using Tcl builtins only, since no punk modules are loaded at boot time) and sets `package prefer latest` so `999999.0a1.0` dev modules are preferred over stable bootsupport/vendored copies. - `_config/punk_main.tcl` and `_config/project_main.tcl` derive the kit's payload location from the runtime's own zipfs mount table (G-129): zipfs presence keys on `tcl::zipfs::mount` (not `tcl::zipfs::root`, which the androwish/undroidwish 8.6 backport lacks), the mount base is the table entry whose archive file is `[info nameofexecutable]` (fallback: the mount containing the boot script), `//zipfs:/app` stays the expected modern answer rather than a compiled-in assumption, and a mounted archive that cannot be attributed to the executable is reported on stderr. The derivation lives in `::punkboot` procs (`zipfs_kit_mountbase`, `zipfs_mount_pairs`, `path_within`) that remain defined after boot for probing and tests. Both files carry identical copies of this logic (G-031 is the planned consolidation). Characterization: `src/tests/shell/testsuites/punkexe/kitmountpoint.test`. - `punk8win.vfs` carries TWO startup-script fauxlinks resolving to `_config/punk_main.tcl`: root `main.tcl` (modern zipfs and metakit convention) and `app/main.tcl` (the undroidwish family sources `app/main.tcl` INSIDE the attached archive; the file is inert in kits whose runtime does not look for it). Fauxlink targets are link-location-relative (symlink semantics): `make.tcl`'s `merge_over` resolves them against the link file's own directory, which is indistinguishable from the old vfs-root-relative resolution for root-level links. +- `punk8min.vfs` / `punk9min.vfs` are MINIMAL payloads for the win32-ix86 verification kits (punkluck86 / punk91ix86 in `src/runtime/mapvfs.config`): both startup fauxlinks plus directory fauxlinks to MULTI-ARCH binary packages only - packages whose own tree carries a `win32-ix86` platform subdir (iocp-2.0.2 for both majors, twapi-5.0b1 for tcl8), linked from their existing homes in sibling `.vfs` folders so no binary is duplicated in VCS. Everything pure-tcl arrives via the `_vfscommon.vfs` overlay (which deliberately contains no dlls). Composition rule: an x64-only binary package must NOT be added to these payloads - a higher-versioned wrong-arch copy silently shadows a runtime's own working 32-bit package on plain `package require` (measured 2026-07-27: payload Thread 2.8.12 x64 beat the LUCK runtime's 2.8.5 and broke the repl), and wrong-arch-only packages surface as "couldn't load from current filesystem" at require time. - `dev` mode loads built output from `/modules` and `/lib`; `src` mode loads unbuilt source from `/src/modules` etc. Use `src-dev-internal` to combine both with src priority. ## Work Guidance diff --git a/src/vfs/punk8min.vfs/app/main.tcl#..+..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk b/src/vfs/punk8min.vfs/app/main.tcl#..+..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk new file mode 100644 index 00000000..e69de29b diff --git a/src/vfs/punk8min.vfs/lib_tcl8/iocp-2.0.2#..+..+punk8win.vfs+lib_tcl8+iocp-2.0.2#@punk%3a%3aboot,merge_over#directory.fxlnk b/src/vfs/punk8min.vfs/lib_tcl8/iocp-2.0.2#..+..+punk8win.vfs+lib_tcl8+iocp-2.0.2#@punk%3a%3aboot,merge_over#directory.fxlnk new file mode 100644 index 00000000..e69de29b diff --git a/src/vfs/punk8min.vfs/lib_tcl8/twapi-5.0b1#..+..+punk86.vfs+lib_tcl8+twapi-5.0b1#@punk%3a%3aboot,merge_over#directory.fxlnk b/src/vfs/punk8min.vfs/lib_tcl8/twapi-5.0b1#..+..+punk86.vfs+lib_tcl8+twapi-5.0b1#@punk%3a%3aboot,merge_over#directory.fxlnk new file mode 100644 index 00000000..e69de29b diff --git a/src/vfs/punk8min.vfs/main.tcl#..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk b/src/vfs/punk8min.vfs/main.tcl#..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk new file mode 100644 index 00000000..e69de29b diff --git a/src/vfs/punk9min.vfs/app/main.tcl#..+..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk b/src/vfs/punk9min.vfs/app/main.tcl#..+..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk new file mode 100644 index 00000000..e69de29b diff --git a/src/vfs/punk9min.vfs/lib_tcl9/iocp-2.0.2#..+..+punk9magicsplat.vfs+lib_tcl9+iocp-2.0.2#@punk%3a%3aboot,merge_over#directory.fxlnk b/src/vfs/punk9min.vfs/lib_tcl9/iocp-2.0.2#..+..+punk9magicsplat.vfs+lib_tcl9+iocp-2.0.2#@punk%3a%3aboot,merge_over#directory.fxlnk new file mode 100644 index 00000000..e69de29b diff --git a/src/vfs/punk9min.vfs/main.tcl#..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk b/src/vfs/punk9min.vfs/main.tcl#..+_config+punk_main.tcl#@punk%3a%3aboot,merge_over#.fxlnk new file mode 100644 index 00000000..e69de29b