G-024 - kit mapping converted to toml (tomlish-parsed), same-day activation->achieved:
- src/runtime/mapvfs.toml: [kit.<name>] / [group.<name>] / [scheme.<name>] tables
(header comment = user-facing spec). All 12 active line-format mappings migrated
(order preserved - identical bakelist rows vs the legacy parse); historical
comments carried over; mapvfs.config deleted here AND in the project-0.1 layout
(converted to mapvfs.toml there).
- make.tcl reader family under the unchanged G-121 model surface: mapvfs_locate
(toml > legacy; PUNK_MAPVFS_CONFIG env override = characterization seam),
mapvfs_parse dispatching on extension, strict mapvfs_parse_toml, deprecated
mapvfs_parse_config fallback (un-migrated generated projects keep baking, with a
NOTE; toml wins when both files exist). Shared toml helpers hoisted to
punkboot::lib (inline toml_untag copies removed).
- Strict entry-named validation: unknown keys/types/schemes, conflicting targets,
duplicate outputs, parse failures fatal (exit 3 pre-build). Full-bake
unresolvables split by nature: missing vfs folder (repo content) fatal per
entry; missing runtime file (environment - part-populated stores are legitimate)
entry-named recapped BUILD-WARNING + skip.
- Groups: @<group> selection in bake/bakelist, group/default/scheme notes columns
+ detail lines, groups listed in errors and argdoc choices. verify-ix86 wraps
the G-129 kits; bake_default=false excludes entries from full bakes.
- G-023 versioned scheme declared live ([scheme.punk8]/[scheme.punk9], group
versioned, bake_default=false pending G-023 activation): parse-time expansion
from punkproject.toml to punk<gen>-<version> / punk<gen>-dev / release-gated
punk<gen>; kit loop creates the plain name when absent and never overwrites it
on a normal bake. punk9-dev baked end-to-end; punk9 gate skip demonstrated.
- Consumer dedupe fix: several entries may share one runtime on one vfs -
kit-output enumeration and the kit-loop runtimes list process each distinct
runtime once (latent multiplication in the legacy format, unreachable there).
G-115 - declarative .vfs composition with drop-in preservation, same-day
activation->achieved:
- Sibling declarations src/vfs/<name>.vfs.toml ([payload.<name>]: source,
source_root src|packages, target, supersedes, replace) materialized by the new
VFSPAYLOAD phase (bakehouse/bake/vfslibs; selective bakes narrow; strict
entry-named errors). Drop-in-wins precedence via punkcheck -overwrite
synced-targets: undeclared or modified-since-install files preserved and
reported (changed-but-preserved NOTE = files_skipped minus sources_unchanged);
supersedes/replace are the explicit exceptions; an undeclared .vfs is untouched.
- vendorlib_vfs.toml relationship settled: folded/superseded - all six install
entries migrated into per-.vfs files for the 13 participating folders (first
materialization run reproduced every payload with zero tracked-content change);
file deleted; a leftover copy warns and is ignored.
- Demonstration kit punkdeclare (group declare-demo, bake_default=false,
smokerequire udp+tcllibc): VCS carries only the boot fauxlink; the whole
lib_tcl9 payload (tcludp vendor tree + tcllibc consent-gated packages tier)
rematerializes from the declaration - clean-tree rebuild smokes pass in-kit,
and drop-in survival was proven live (a foreign pkgIndex.tcl and an undeclared
note both survived; the foreign file genuinely won until removed, caught by the
G-133 smoke probe as designed). Payload ignored in both VCS (.gitignore +
derived ignore-glob; ignore-sync verification clean).
- Docs: src/vfs/README.md (format + precedence spec), src/vfs + src/runtime +
src + bin AGENTS.md, ARCHITECTURE.md (+lint clean), workflow text and
summaries/helptexts/argdoc; layout store seeds the convention (vfs README +
mapvfs.toml; machinery travels via the established make.tcl sync).
Verification: legacy-vs-toml identical kit rows; punkluck86 force-rebuilt under
both formats content-identical (identical 1.73MB runtime+stamp prefix, identical
2993-member payloads; whole-artifact byte identity is not a pipeline property -
consecutive same-config rebuilds differ in zip timestamp metadata, pre-existing);
punkexe suite 98 tests 0 failures incl. 5 new G-024 characterizations
(maketclbakelist.test: @group filter + PUNK_MAPVFS_CONFIG fixture tests) and
updated pins (payloadcheck declared list + punkdeclare; platform detail wording).
Goals: both flipped achieved 2026-07-31 with evidence in the detail files;
GOALS.md entries moved to GOALS-archive.md; live-tier reference sweep applied
(G-004/G-019/G-023/G-025/G-026/G-035/G-065/G-127/G-131/G-137/G-141) including
the G-127 mapvfs-seam retirement note (PUNK_MAPVFS_CONFIG) and a direct
G-137<->G-127 bridge replacing the archived G-024 one. Detail files move to
goals/archive/ in the follow-up pure-rename commit.
Also included as found: the developer's concurrent G-142 goal addition (GOALS.md
entry + goals/G-142-punkbin-listing-manifests.md), committed unmodified for
git/fossil coherence - not agent-authored.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
suite_tcl90: critcl_zig.config gains the linux-x86_64-zig cross target
(zig cc -target x86_64-linux-gnu.2.17 - the dynamic-glibc floor decision,
recorded in the goal file and fed to G-105). build905.zig gains the
tcllibc-linux step (critcl driver on the windows suite shell, stubs
linkage, no linux host; uuid.tcl excluded matching upstream's own
native-linux package shape) gated by the new tools/elf_gate.tcl
(G-133-equivalent ELF64/LSB/ET_DYN/x86_64 structural check - the
load-smoke stand-in for cross lanes). library-artifacts emits
lib/linux-x86_64/tcllibc-tcl9-r<N>.zip in the same run: target =
linux-x86_64, build_host_platform = win32-x86_64, full provenance set,
deliberately no [tests] section. build_id seeds now include the tier
path so same-named artifacts in different target tiers get distinct
identity digests (both suites' tool copies kept byte-identical). Step
lists (build905.zig -Dsteps default, suite.tcl) and README document the
lane and invocation.
Consumption: libpackages.toml declares tcllibc-tcl9-linux (target
linux-x86_64); vendorlib_vfs.toml install.tcllibc_tcl9_linux switches
punk9linux.vfs/lib_tcl9 - replace retires the hand-dropped tcllibc,
supersedes removes the stray tcllibc2.0 - so the last provenance-less
accelerator hand-drops in any kit payload are gone. punkshell902 baked
(G-133 payload arch scan: 6/6 match target linux-x86_64) and
WSL-verified: materialized-tier accel smoke plus baked-kit smokes
(default paths + a pinned variant proving the kit's own lib_tcl9
artifact tree loads with the accelerator engaged). Finding recorded:
the tclkit-902 runtime bundles its own lib/tcllibc2.0 which wins
default precedence - the origin of the retired stray folder name.
Determinism: back-to-back re-emission byte-identical for all three
artifacts; the zig Run session-env cache finding extended (FOSSIL_HOME
and invocation mode churn the key; the linux ELF .so observed
bit-stable across critcl re-runs, unlike the windows PE). Goal flipped
achieved with evidence in the detail file; G-105 notes carry the libc
decision as prior art. Docs: buildsuites AGENTS.md child index,
ARCHITECTURE.md buildsuites paragraph, CHANGELOG + punkproject 0.32.2.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
make.tcl libfetch gains env-only isolation seams - PUNK_LIBFETCH_CONFIG
(alternate declarations file) and PUNK_LIBFETCH_PACKAGES (alternate tier
root), the PUNK_RUNTIME_PLATFORM idiom - so fixture/mirror runs never read
the real declarations or write the real bin/packages tier. Neither seam
bypasses the -trust-server consent gate.
New shell/testsuites/punkexe/maketcllibfetch.test (piped maketcl* harness +
testsupport/httpfixture.tcl + a file:// mirror; the canonical origin is
never contacted) pins the G-139 behaviours that previously had only manual
session evidence: the server-trust gate refusing non-canonical origins with
exit 3 before any network access or tier write, -serverurl-over-PUNKBIN_URL
precedence, consented fetch/verify/materialize (sha1sums + zip + sidecar +
installed-shape tree with embedded record), idempotent re-run vs -force,
declared-revision-change re-materialization keyed to the tree record (with
the sidecar-not-listed note lane), sha1-MISMATCH rejection without residue,
missing-from-server-sha1sums failure, and the no-config no-op. 8/8 pass in
both runner modes (singleproc + -jobs); full punkexe subtree green (93
runnable, 0 failed); the real bin/packages tier verified untouched.
Also refreshes the stale src/runtime/libpackages.toml header (r1 IS
published as of 2026-07-30; the G-139 reference now points at the archive)
and documents the seams there and in the libfetch help text.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
make.tcl libs/packages/bakehouse gain the PACKAGES_tcl<N> phase: materialized
punkbin lib-tier packages under bin/packages/<target>/tcl<N>/ deploy into
lib_tcl<N>/allplatforms + lib_tcl<N>/<this platform> with punkcheck
provenance, mirroring the VENDORLIB_tcl<N> shape (embedded
punkbin-artifact.toml records ride into the deployed trees; absent tier =
silent per-item no-op with a libfetch pointer).
vfslibs declaration schema extended (vendorlib_vfs.toml header documents
both): source_root = "packages" resolves an entry's source against the
bin/packages tier (missing source errors name 'make.tcl libfetch');
replace = true clean-slates a SAME-NAMED existing target folder before
install (supersedes deliberately cannot name the folder being installed -
needed because the pre-G-139 tcl9 hand-drops nested md5c + tcllibc INSIDE
tcllib2.0).
Declarations added for the switchover set (per-kit, never blanket - the
trees that carried hand-drops at 2026-07-30): 8 win32 tcl9 kit vfs trees get
tcllib2.0-tcl9 + tcllibc-tcl9 (supersedes the stray-named tcllibc2.0);
punk9linux (linux target) gets only platform-neutral tcllib2.0 (its
linux-built tcllibc siblings stay - a linux lib-tier emission is future
work); punk86/punk8win/punk8_statictwapi upgrade tcllib1.21 (+nested tcllibc
0.4 + md5c, removed with it via supersedes) to tcllib2.0-tcl8 + tcllibc-tcl8;
punk86bawt refreshes its bare tcllibc only.
Verified: make.tcl libs deployed the tier into lib_tcl8|9 (allplatforms +
win32-x86_64) with embedded records present; vendored mirrors coexist in the
deployed trees until the sequenced retirement. Thin-layout make.tcl sync
copies updated by the run (punkcheck-managed outputs, batched per the
carve-out). Project 0.31.1 + CHANGELOG.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New 'make.tcl libfetch' subcommand (argdoc'd; workflow text + plain help
updated): fetches the punkbin LIB-TIER artifacts declared in the new
src/runtime/libpackages.toml ([artifact.<name>] name/target; the four G-138
r1 artifacts, both generations) from <origin>/lib/<target>/ into the
untracked bin/packages/<target>/ input tier - zip + .toml sidecar, each
sha1-verified against the server's per-target sha1sums.txt (local tier copy
kept, the punk-runtime store idiom) - then materializes each verified zip
via punk::zip::unzip (crc-verified, mtimes restored, accelerator-eligible)
into bin/packages/<target>/tcl<N>/<pkgfolder>/ (generation subdirs: both
generations install identically-named folders). Idempotent: present
artifacts re-verify and skip; a materialized tree is current while its
embedded record names the declared artifact (the G-138 self-description
payoff); -force overrides.
Consent keyed to server trust (the G-123 posture): the canonical punkbin
origin (punk-runtime raw-base convention) gates nothing; any other origin
(-serverurl or env PUNKBIN_URL) refuses before network access without the
explicit -trust-server flag - never an interactive prompt. file:// origins
served natively (mirrors/fixtures); http(s) transport: Tcl http (+tls) when
loadable, else curl, else PowerShell. The dispatch block sits before the
build-command whitelist gate per the standalone-command pattern and exits
itself.
Emission-side amendment (both suites' library_artifacts.tcl): sidecar tomls
now ride the per-tier staging sha1sums.txt, matching the punkbin repo's
build_sha1sums.tcl coverage so staging-derived mirrors serve verifiable
sidecars.
Verified against a file:// mirror assembled from both suites' staging:
trust-gate refusal, consented fetch of all 4 artifacts (sha1-verified),
materialization of all 4 trees, fully idempotent re-run, and a package-load
proof from the tier (md5 2.0.9 + tcllibc accel=1 under the plain family
kit, ifneeded paths in bin/packages). bin/packages is already ignored in
both VCS via the /bin/* rules. Docs: bin/AGENTS.md tier section,
src/runtime/AGENTS.md libpackages.toml bullet. Project version 0.31.0 +
CHANGELOG (new make.tcl subcommand = product surface). Remaining G-139 work
recorded in the goal's Progress section.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance verified in full on 2026-07-29 (evidence in the detail file's
Progress section): windows-host bakes embed the default punkshell.ico
into all 10 buildable win32 kits across zip (x64 + ix86), sdx-metakit
and stamped-concat assembly, verified by twapi resource inspection
byte-matching the source ico; override round-trip proven and reverted;
boots for zip, metakit and concat images from scratch copies; linux
cross-target kit gets its sidecar with NOT APPLICABLE; the two
incapable-host conditions produce their distinct notices in REAL bakes
(mingw tclsh86: twapi not loadable; WSL linux cross-bake: cross-host
with the G-128 remedy named - and the cross-baked kit boots on windows,
the recorded known shortcoming live); idempotence converges; runtime
store originals untouched; vendored-twapi no-toolchain arm proven under
tclsh9.0.5-punk.
Index entry moves to GOALS-archive.md (ID position); the detail-file
move to goals/archive/ follows as its own pure-rename commit. Reference
sweep: G-023, G-028, G-127 and G-128 notes gain achieved/archive markers
plus what each consumes from the delivered mechanism (G-128: the seam
now exists - kit_icon_process entry point, sidecar record, cross-host
notice naming it as remedy; G-028: the stub-first ordering concentrates
the locked-target exposure at deploy, punk9_beta observed). AGENTS.md
owning-doc pointers land alongside: src/vfs (override convention),
src/runtime (default-icon role + derivation sidecar), src/assets/logo
(propagation honesty: G-057 consumes the src/runtime copy - syncing the
four build-consumed copies after artwork changes stays deliberate, with
assetorigin stale-detection as the drift signal), and an ARCHITECTURE.md
build-section bullet (architecture_lint clean).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
make-ico.tcl (any tclsh 8.6+, rsvg-convert on PATH) replaces make-ico.ps1
in place: pure-Tcl PNG decode (core zlib inflate + row unfilter) and
DIB/ICONDIR assembly take over from System.Drawing, with an embedded
sha256 (NIST-vector validated, cross-checked against Get-FileHash).
Byte-identity proven before the ps1 removal: 'all -check' regenerates all
seven recorded artifacts (punk-mark.ico, punk-mark-solid.ico,
project-default/icon.ico on the DIB+PNG256 profile; favicon.ico all-PNG;
apple-touch/192/512 rasters) byte-identical to the committed files under
both mingw tclsh 8.6.11 and native Tcl 9.0.3.
Every artifact now carries its <name>.assetorigin.toml sidecar (schema 1:
artifact sha256, source + source hash, role, generator + invocation
options), (re)written by every generator subcommand so regeneration
cannot leave a stale record. The 'all' manifest embeds the invocation
profiles; 'all -check' is the no-write drift probe (exit 1 on any
difference). src/runtime/punkshell.ico gains a derived-copy sidecar (hash
equals source_hash, source ../assets/logo/punk-mark.ico); the three vfs
copies stay unrecorded pending the user call on shipping sidecars inside
baked kits.
src/assets/logo/AGENTS.md: assetorigin schema 1 format documentation
(canonical), Tcl-generator work guidance, drift-probe verification line.
favicon source recorded as web/icon.svg (renders byte-identical to
punk-mark.svg at 16/32/48; the same-directory primary web icon chosen).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The four build-consumed copies are renamed and their artwork replaced with
src/assets/logo/punk-mark.ico (all four byte-identical to the master):
src/runtime/punk1.ico -> src/runtime/punkshell.ico
src/vfs/_vfscommon.vfs/punk1.ico -> .../punkshell.ico
src/vfs/mkzipfix.vfs/punk1.ico -> .../punkshell.ico
src/vfs/punk8_statictwapi.vfs/punk1.ico -> .../punkshell.ico
Recorded as delete+add rather than renames: the content is entirely different,
so git's similarity detection finds no link and --follow will not trace through.
The pre-2026-07 artwork keeps its own lineage under src/assets/logo/legacy/,
now the only place the punk1 name survives.
No code referenced the old name - every mention was documentation or goal prose,
checked before renaming.
G-057's contract lines are updated for the new path (Scope in both tiers, plus
Goal and Acceptance): pure path substitution, no semantics changed. Its Context
gains a dated note recording the rename and artwork swap, and its _vfscommon.vfs
override-detection wrinkle now names punkshell.ico. goals_lint clean.
Adds src/assets/logo/project-default/, a frozen monochrome placeholder - a blank
screen wearing the crest - held as the single copy for seeding generated
projects. Unbranded so it reads "replace me" rather than as a product identity.
Bezel and crest are ONE union path (drawn as two shapes the bezel's top edge
cuts a visible line across the mohawk) and the screen is filled rather than
outlined (a solid mass survives 16px where nested thin strokes merge). It shares
only the crest with punk-mark.svg and must not be re-derived from it: tracking
the real mark would churn every generated project on every logo tweak.
Also corrects a defect introduced in 91fa500e. The Ownership bullet in
src/assets/logo/AGENTS.md said "do not repoint build consumers at this directory
on your own initiative" and then, in the next sentence, instructed re-copying
them by hand after regeneration - so whichever half an agent read first would
win. It now states the dated fact and names G-057 as the owner of future
propagation. Distribution machinery does not belong in an AGENTS instruction,
and drift wants a check rather than a standing manual obligation.
Stale punk1.ico copies were also swept from the untracked build trees
(src/_build x12, bin/test, bin/test2, scratch, testsdx) so the next bake cannot
merge both names into a kit payload.
Claude-Session: https://claude.ai/code/session_01YNjnq6oDzecknLg7AuWZgU
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
- punkboot::utils 0.5.0: binary_arch_classify (PE Machine field, ELF e_machine,
Mach-O thin+universal - honest unknowns), platform_expected_binary,
platform_discriminated_segment (canonical <os>-<cpu> tokens + vendor spellings,
extensible namespace variables), vfs_binary_arch_report (per-directory exemption,
exempt subtrees counted unread)
- make.tcl: advisory binary-arch scan at the G-125 gate seam (recapped
BUILD-WARNINGs naming file/found-arch/kit-target, capped at 8 per kit with honest
total; cross-target kits included); post-build smoke-require probe running the
freshly built artifact via its tclsh subcommand with drained stdin (failures
recapped naming kit/package/actual error; cross-target skip with stated reason;
undeclared kits run nothing new); mapvfs.config entries accept a 5th
smoke-require element (mapvfs_parse/mapvfs_kit_outputs carry smokerequire);
'check' reports scan ACTIVE/UNAVAILABLE + declared smoke matrix; workflow K11
- mapvfs.config: smoke-requires declared - punkluck86 {Thread} (the 2026-07-27
incident construction), punk91ix86 {Thread iocp}, punkshell902 {Thread}
(cross-target skip demonstrator)
- tests: binaryarch.test (generated header fixtures only - no committed binaries;
punkluck86 case reproduced; iocp pair + win-x64 exemptions; real-tree sweep with
known-real findings filtered), maketclpayloadcheck.test (piped check
characterization, ESC-free per G-113)
- docs: src/AGENTS.md + bin/AGENTS.md state what the checks do and do NOT
guarantee; src/runtime/AGENTS.md entry grammar; ARCHITECTURE.md bake section
- REAL FINDING on the scan's first sweep: zint.dll 2.13.0 in punk8win.vfs
lib_tcl8/ is 32-bit (PE i386, confirmed with file(1)) and can never load in the
x64 tcl8 kits punk86/punkbi/punksys that carry it - those bakes warn until the
payload is fixed
- punkshell 0.28.2
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
Boot (punk_main.tcl + project_main.tcl, identical copies):
- zipfs presence keys on tcl::zipfs::mount - present in every supported zipfs
generation - not tcl::zipfs::root (8.7/9-era; absent from the androwish/
undroidwish 8.6 backport, whose ::zipfs ensemble also lacks a root subcommand).
- New factored ::punkboot procs (zipfs_mount_pairs, zipfs_kit_mountbase,
path_within) derive where this executable's attached archive actually mounted:
the mount-table entry whose archive file is [info nameofexecutable] (the
backport reports it without the windows drive prefix - handled), fallback the
mount containing the boot script. //zipfs:/app stays the expected modern
answer, not an assumption. Procs remain defined post-boot for tests.
- A mounted archive that cannot be attributed to the executable is reported on
stderr instead of silently configuring no internal paths (the old failure shape).
- The starkit quick-search line [zipfs root]/app/tcl_library (an error on the
backport) uses the derived base; internal_paths gains the derived base when no
zipfs volume root covers it; the internal-only simulate-kit branch recognises a
script under the derived mount as kit-internal.
make.tcl (necessary companion fixes - Scope extension flagged in the goal file):
- Runtime capability probe keys has_zipfs on tcl::zipfs::mount (was root, which
refused zip assembly for the backport; the block also rode a body-less
'if {![catch ..]}' that only worked because piped-stdin tclsh continues past
command errors).
- merge_over resolves relative fauxlink targets against the link file's own
directory (the fauxlink module's symlink semantics) - identical for the
pre-existing root-level links, required for the new nested one.
Payload + matrix:
- punk8win.vfs gains an app/main.tcl fauxlink beside root main.tcl: the
undroidwish family auto-runs app/main.tcl INSIDE the attached archive
(embedded /app/main.tcl string in the exe) and ignores a root main.tcl.
Inert in the metakit kits sharing the payload (punksys/punk86/punkbi verified).
- mapvfs.config: punkluck86 (tclsh8.6.10-luck-zip) + punk91ix86
(tclsh9.1b0-tclsfe), both zip kits targeting win32-ix86.
Tests + docs:
- New shell/testsuites/punkexe/kitmountpoint.test (4 tests): backport exe-path
attribution, modern-32 //zipfs:/app, baked punkexe regression pin,
unattributed-mount stderr report + no foreign paths. Self-gates on the
untracked verification runtimes.
- bin/AGENTS.md "Kit-wrappable runtime requirements (G-129)" + src/AGENTS.md
pointer, src/vfs/AGENTS.md boot contract, src/tests/shell/AGENTS.md suite doc,
ARCHITECTURE.md boot-chain bullet.
- Thin-layout + templates-modpod copies synced (make.tcl modules; _config boot
mains refreshed into the project-0.1 store layout per the 17250a8c precedent).
Verified: punkluck86 + punk91ix86 boot and resolve punk::args from inside their
mounts with externals stripped; punk905/punk902z (zipfs) + punksys/punk86
(starkit) probe byte-identical before/after; both zip offset conventions (mkimg
+ concat) mount on the backport; full suite 1171 tests with only the documented
exec-14.3 baseline failure.
Claude-Session: https://claude.ai/code/session_01UEgomWq6kA6c4A8GswqqGW
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Everything a bake EMITS is now keyed by the artifact's TARGET platform rather than the
driving tclsh's personality: the bin/runtime/<tier> store a runtime is read from, .exe
suffixing of runtime files and kit outputs, presence checks, and whether the pre-deploy
process sweep uses tasklist/taskkill or ps/kill. Host semantics - copy commands, path
handling, filesystem case rules, prompts - stay keyed to the host.
The default target is the host's platform canon EXCEPT for a cygwin-family host (an
msys2/cygwin-runtime tclsh, which reports tcl_platform(platform) unix on windows), which
targets win32-x86_64. Such a host now drives the identical kit set, names and store
addressing as a native tclsh; before, it reported every kit runtime=missing against a
nonexistent mingw64-x86_64 store.
mapvfs.config entries take an optional 4th element naming the kit's target platform, so a
runtime kept in another platform's tier is a first-class mapping entry. The linux tclkit
entry now declares linux-x86_64 and bakes to a suffixless bin/punkshell902.
Zip-type kits assemble without zipfs in the driving tcl: when tcl::zipfs::mkimg is absent
(any 8.6) the image is built by raw-runtime split + punk::zip::mkzip + concatenation - the
same helper the zipcat type uses. Both mount identically (archive-start-relative offsets).
Fixes exposed by the above: the runtime capability probe looked for a suffixless filename
and so reported find-fail for every runtime on windows; with real capabilities arriving,
the extraction try-list was found to test capability presence rather than value, which
would send a plain zipfs runtime down the kit path where a failed sdx mksplit replaces
raw_runtime with the un-split original; BUILDCOPY names now follow the runtime's own
filename; runtime map keys strip only .exe (file rootname would eat the last dotted
segment of tclsh9.0.5); and native windows command lines run through a guard suppressing
msys2's posix-path argument rewriting - without it taskkill /PID <n> reached taskkill as
taskkill C:/<msysroot>/PID <n>, so the sweep could find a running kit but never replace it.
punk::platform folds the msys2 family (mingw64/mingw32/ucrt64/clang*) onto one stable
'msys' tag and CYGWIN_NT onto 'cygwin' - msys2's uname renders that token from MSYSTEM,
so one binary otherwise canonizes differently per launching shell. New normalize_os;
cygwin-x86_64 added to the platform table; 'help platforms' documents the fold.
make.tcl check reports the derivation on one line; bakelist rows carry target=<platform>
for non-default targets and the detail block names the tier; workflow text gains key note
[K9]. New characterization suite maketclplatform.test (5 tests, two self-gating on
discovering and probing a real msys/cygwin tclsh). Full suite 1112 tests: 1093 passed,
18 skipped, 1 failed = the documented exec-14.3 baseline.
Verified: msys2 tclsh8.6 bakelist output identical to native Tcl 9; a changed punk91
baked and deployed from that host with the sweep killing a running instance msys ps
cannot see; a real cross-target linux kit baked from windows to a 24MB ELF; a zipfs-less
8.6 bake producing a bootable zip kit.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Acceptance verified in full (evidence recorded in the detail file's Progress
section): bakelist under plain tclsh + punk902z with per-entry presence and
deployed state; selective 'bake punk91' refreshing only that kit's _build/bin
artifacts and punkcheck records (stat + punkcheck diffs, negative grep clean);
unknown-name no-build errors; bare bake kit-set parity; help/workflow contract
updates; maketclbakelist.test 4 PASS; punkshell 0.24.0 minor bump.
Index entry moved to GOALS-archive.md. Reference sweep: no pending-tense
live-tier mentions existed; mapvfs.config pointer updated to the archive path;
forward-pointing notes pushed as back-pointers to the live goals they serve
(G-024 parsed-model reader swap, G-023 scheme-expansion entry point, G-115
per-kit payload detail, G-057 single-kit icon verification, G-028 deployed
-state reporting sibling, G-101 kit-type non-assumption).
Detail-file move to goals/archive/ follows in the adjacent commit as a pure
rename (root AGENTS.md Doc Restructures).
Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
One parsed-mapping model (::punkboot::lib::mapvfs_parse / mapvfs_kit_outputs /
mapvfs_match_outputs) now backs the kit surfaces - the bake machinery, the new
bakelist report and the bake/bakelist argdoc kit-name choices all consume the
model, never the file format, so the G-024 toml conversion can swap the reader
underneath.
- bakelist ?kitname ...? (informational SUBGROUP): kit name, type, runtime with
presence, vfs folder, deployed state of bin/<kit> vs src/_build/<kit>
(current|stale|absent|nobuild; size/mtime fast path, byte-compare when in
doubt), anomalies as trailing key=value notes (runtime=missing, vfs=missing,
rtrev=r<cur><r<max> via the shared runtime_materialization_check core).
Name filtering doubles as per-kit detail (resolved paths/sizes/mtimes).
- bake ?kitname ...?: selective kit assembly - unknown names error before any
build listing the configured names (flag-order hint included); selected-but-
unbuildable kits (missing runtime/vfs) fail fast; runtime BUILDCOPY/caps
probe/vfs cksums/vfslibs phase all narrow to the selected kits so other kits'
_build/bin artifacts and punkcheck records stay untouched. Bare bake
unchanged (verified full-set run). Deprecated alias vfs mirrors the values.
- argdocs: SUBVALUES/VALUES_SYNOPSES mechanism, kitname choices enumerated from
the mapping at define time (-choicerestricted 0, degrade-safe), block-form
help values; SUMMARIES/HELPTEXTS/SUBOPTS/SUBGROUPS/known_commands/plain
gethelp/workflow text updated per the update contract; degraded-mode
(PUNKBOOT_PLAIN) dispatch collects trailing kit names.
- mapvfs.config todo comment retired to point at G-121.
- piped characterization: src/tests/shell/testsuites/punkexe/maketclbakelist.test
(full-report row/vocabulary + ESC-free, filtered detail, unknown-name errors
on both surfaces with the no-build guarantee) - 4 PASS; maketclcolour.test
still 3 PASS.
- selective-refresh verification (recorded in the goal file): forced punk91
rebuild + deploy via 'bake -confirm 0 punk91'; stat diffs over src/_build and
bin show only punk91.exe, punk91.exe.vfs, raw_tclsfe-x64.exe and bin/punk91.exe
changed; .punkcheck diffs mention only punk91's records (negative grep for
all other kit/vfs names clean).
- docs: src/AGENTS.md work-guidance bullet; ARCHITECTURE.md build-entry
subcommand list refreshed (bake/bakehouse naming + bakelist, stale in-flux
G-112 mention dropped); CHANGELOG 0.24.0 + punkproject.toml minor bump.
Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Each site read in context, not grep-replaced; bakehouse vs bake chosen per
meaning, and missing invocation arguments supplied where the reference
describes an unattended flow:
- G-005 Approach + Notes, G-006 Acceptance + body: 'make.tcl project' ->
'make.tcl bakehouse' (the full consumer build these goals integrate with;
no flags - conceptual references on a clean checkout, not recipes).
- G-057 Acceptance: 'make.tcl project' -> 'make.tcl bake' (icon embedding
lives in the kit-wrap stage and must hold for a bare bake; bakehouse
inherits).
- G-028 Context DELIBERATELY UNCHANGED: dated 2026-07-07 incident narrative -
the command actually run; history stays verbatim (alias keeps it readable).
- src/runtime/mapvfs.config todo: 'vfs' -> 'bake' wish, re-annotated - G-104
achieved WITHOUT the single-kit-by-name/list-kits item (still open).
- src/runtime/vendorlib_vfs.toml header: vfslibs now runs as a phase of bake
(G-112 fold), not 'as part of project'.
- shellexit.test + staticruntime.test rebuild comments: 'project' -> 'bake'
AND stale '(interactive y confirmation)' / bare vfscommonupdate corrected to
'-confirm 0' (piped y retired since G-030) - the missing-arguments class.
- punk.project layout store vfs READMEs (lib + modules): 'make.tcl vfs' ->
'make.tcl bake'; modpod template twins propagated via the punkcheck
layout->modpod sync (make.tcl modules run), never hand-edited.
Variant-phrasing sweep confirmed non-hits: G-115 '(vfs assembly)' names the
src/vfs payload tier (name retained), G-047 'make.tcl/project.new' is the dev
project.new command. Archive tier + CHANGELOG history untouched.
goals_lint + goals_xref refs clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Root README, src/README, src/AGENTS.md (full-build guidance, provenance command
list incl. bakehouse's default-on dirty gate, punk-exe-hosted builds,
verification), src/modules + src/lib + src/vfs + src/tests + src/tests/shell +
src/runtime AGENTS.md workflow references, and the rebuild-instruction comments
in scriptexec.test/tclshcmd.test. G-104's G-058 mention gains its archive
marker. Historical CHANGELOG entries untouched; goal-file contract texts
(G-005/G-006/G-057 Acceptance mention 'make.tcl project') left for
proposal-first user approval - the deprecated alias keeps them executable.
Layout make.tcl copies are punkcheck-synced build outputs - they refresh via
the normal sync channels in the acceptance build, never hand-edited.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
suite_tcl90 now assembles and verifies the G-103 family as part of the
default pipeline:
- kit-family: two staging trees (core, bi) wrap into working-name products
tclsh9.0.5.exe / tclsh9.0.5-punk.exe / tclsh9.0.5-punk-bi.exe under
out/family. Attached image mirrors the installed prefix - tcl_library/ at
the app root (stock C-boot position, no main.tcl - falls through to the
interactive shell), tm tree at tcl9/<ver>, batteries under lib/ with their
installed-shape pkgIndexes (../../bin -> /app/bin), dlls under bin/, plus a
one-line stock pkgIndex hook at lib/pkgIndex.tcl extending auto_path (the
tclPkgUnknown mid-scan growth mechanism tcllib's own index uses).
- tools/family_check.tcl: per-member self-containment verification from a
scratch dir with scrubbed env - patchlevel, zipfs tcl_library, tzdata/
encodings, attached tm modules, functional Thread (cross-thread eval), vfs
zip-mount round-trip, tcllib md5 + tcllibc accel engaged, piperepl
default-ON/opt-out per variant (::tclsh(istty) discriminator), Tk
create/destroy + tklib for bi. All three members PASS.
- kit-family-artifacts + tools/family_artifacts.tcl: punkbin-layout emission
(immutable -r<N> names via -Dfamilyrev, per-artifact toml metadata with
variant/sha1/versions/provenance/G-107 evidence, sha1sums.txt), run UNDER
the plain family kit itself. punkbin publication stays a user step.
- build_tclthread/build_tk return pkgidx+version facts; tclvfs configured
package generation shared between prefix install and family staging;
tm-module install list single-sourced; manifestUuid helper tolerates
repos without the fossil manifest setting.
- consumers: mapvfs.config entries punk9_beta (punk + punk9wintk905.vfs) and
punk9bi_beta (punk-bi + punk9win_for_tkruntime.vfs); working names copied
to bin/runtime/win32-x86_64 (untracked). src/runtime/AGENTS.md stale
runtime.cmd references updated to punk-runtime (G-097).
Full pipeline suite.tcl build PASS end-to-end; verification evidence
recorded in the goal Progress section. Remaining: punk-runtime list/use
metadata surfacing, kit-wrap trial of the new mapvfs entries.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Per the *_beta convention (trial before punk tests, drop the suffix on
acceptance): punk9wintk905_beta.vfs renamed to punk9wintk905.vfs, the
runtime redeployed as bin/runtime/win32-x86_64/tclsh905.exe (fresh copy
of the suite's tclsh90szip.exe, self-containment smoked), and the
mapvfs.config entry becomes 'tclsh905.exe {punk9wintk905.vfs punk905
zip}' with the promotion recorded in the comment block. tcludp joins the
promoted vfs via vendorlib_vfs.toml (daily-driver expectation - teelog
workflows), installed by make.tcl vfslibs.
Built punk905.exe verified: kitcheck full pass (Thread/vfs/vfs::zip/
sqlite3/twapi/tcllibc/md5-accelerated/tk 9.0.2) plus udp 1.0.13; 'shell'
round-trips (repl 0.5.2, libunknown 0.2.1); kit-hosted console suites
71/71 via the src-mode child launch. Beta artifacts (bin/punk905_beta.exe,
runtime tclsh905_beta.exe) removed. A piperepl-runtime punk kit
(tclsh90sprzip base) remains G-103 kit-family territory.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New src/vfs/punk9wintk905_beta.vfs modelled on punk9wintk903.vfs: suite-built
tk9.0/tklib0.9/tcllib2.0/tcllibc/thread3.0.1/vfs1.4.2 payload (tk + thread
dlls in bin/ per the ../../bin pkgIndex convention; tclvfs dll rides inside
vfs1.4.2 - vfs.tcl loads from $::vfs::self), plus twapi5.0.2 + sqlite3.51.0
carried over from the 903 vfs for basic human trial. tcludp deliberately
omitted (one vendorlib_vfs.toml target line away if -teelog trials wanted).
Runtime = _build/suite_tcl90/out/bin/tclsh90szip.exe copied (untracked) to
bin/runtime/win32-x86_64/tclsh905_beta.exe - static tclsh 9.0.5 with the
tcl library in its attached zip; the zip wrap merge_overs that into the kit
so tcl_library survives (same mechanism as tclsh902z->punk902z).
Built with 'make.tcl vfs -confirm 0': punk905_beta.exe INSTALLED; kit smoke
passes - Thread/vfs/vfs::zip/sqlite3/twapi/tcllibc(md5 C-accelerated)/tk
9.0.2 all load with functional pokes, punk boot machinery active.
Beta-kit policy recorded in mapvfs.config + goal: wrap fresh suite runtimes
as *_beta kits even before punk tests pass, for early interactive trial.
Future noted: 'make.tcl vfs <kitname>' single-kit build + configured-kit
listing; move tclvfs/thread into the runtime-attached zip.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Adds the main.tcl fauxlink omitted from the punk9win.vfs split, and
points the commented-out tclsh90b2/tksfe-twapi-x64 mapvfs.config
entries at the new kit names.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Replace the single punk9win.vfs payload with two per-Tk-version kits:
- punk9wintk90b2.vfs: content-identical copy of punk9win.vfs (same Tk
9.0b2-era bin/tcl9tk90.dll) except the main.tcl punk_main fauxlink
was not carried over (kit is parked; its tclsh90b4_piperepl mapping
remains commented out in mapvfs.config)
- punk9wintk903.vfs: same payload with a newer Tk bin/tcl9tk90.dll
(Dec 2025 build, Tk 9.0.3) and the old 9.0b2-era dll set aside as
bin/tcl9tk90xxx.dll; adds lib_tcl9/apave4.4.10 (pure Tcl); drops the
modules_tcl9 Thread-3.0b3 modules (Thread is static in the tclsfe
runtime); now the mapping target for tclsfe-x64.exe (punk91 kit)
src/runtime/mapvfs.config and src/runtime/vendorlib_vfs.toml (tcludp
install targets) retargeted from punk9win.vfs to the new kit names.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- tclsfe-x64.exe is not a tk runtime and the tk-having sfe variants are wish-based (unsuitable), so punk91 moves off punk9win_for_tkruntime.vfs (which is intended for kits that already carry Tk) to punk9win.vfs - Tk loads as an extension per the punkbin runtime convention
- commented-out tksfe-twapi-x64 experiment recorded: the kit builds and can run tk apps (punkwish91 lib:tkhello) but the tk console does not display; noted todos - get the builtin tk console showing for exploration (unsuitable long-term: no ansi handling) and consider a textwidget-based virtual console capable of hosting the punk shell (relates to G-001 pluggable console backends)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New 'make.tcl vfslibs' step (also run inside 'make.tcl project' before kit vfs
assembly): propagates declared vendored platform-library packages into kit vfs
lib_tcl<N> trees, ending the hand-copying that let kits ship a known-buggy
tcludp through three make invocations (the G-036/G-037 motivating case).
- declaration: src/runtime/vendorlib_vfs.toml, parsed with bootsupport tomlish
(no ad-hoc parsing; G-024's mapvfs toml conversion NOT required first - this
file is recorded as a candidate for absorption into it). [install.<name>]
entries: source (relative to src/), targets (kit vfs lib folders relative to
src/vfs/), optional supersedes (folder names removed from each target before
install - explicit, no silent mixed-version provision per G-035 concerns).
- participation is per-package per-kit; authority is the declaration - nothing
syncs undeclared, so the known vendorlib/kit twapi drift is deliberately
untouched (resolves the direction/authority design question).
- punkcheck provenance at src/vfs/.punkcheck (gitignored, outside kit
payloads); skip-if-unchanged proven (rerun: 0 copied, 9 skipped per target);
malformed/unresolvable entries fail the build naming the entry (exit 3).
- 8.6 kits upgraded (the G-036 loose-end decision, recorded): tcludp 1.0.13 is
dual-generation (pkgIndex selects tcl9udp1013.dll on 9+, udp1013t.dll on
8.5+) so the single vendorlib_tcl9 source serves punk8win.vfs/lib_tcl8;
superseded udp1.0.12 removed.
- verified on rebuilt kits: punksys/punkbi (8.6.13) and punk902z (9.0.2) all
report package require udp == 1.0.13 loading the generation-appropriate dll
from their vfs; no udp1.0.12 remains under src/vfs; punksys piped-shell exit
smoke clean.
- G-037 flipped proposed -> achieved 2026-07-08 under user direction (no
intermediate active stop).
- includes project-build byproducts via established channels: bootsupport
snapshots refreshed to punk-0.2.1 / punk::lib-0.3.0 (from today's version
bumps) and make.tcl synced into layout copies.
- project 0.4.8 (CHANGELOG entry)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com