Regenerated by 'make.tcl modules'/'packages' after the G-122 make.tcl changes - the
punkcheck-managed thin-layout copies (src/project_layouts/vendor/punk/{basic,project-0.1}
and the punk.project payload inside the punk::mix templates modpod) plus the pending
punk::platform entry in the bootsupport include_modules.config copies.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; 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
Notes-only on the goal; the new tracked material is the sdx patch capture.
G-101 gains four sections and an extended Scope line naming the surveyed trees
and bin/sdx.kit: a reference-material inventory giving the metakit boot chain in
reading order with file:line anchors (kbskit kitInit.c pre-init -> boot.tcl raw
mk::select bootstrap -> setupvfs.tcl -> mk4tcl.cpp Mk4tcl_Init, with KitCreator's
storage-switch variant as the comparison reference for scoping cookfs/zipvfs);
sdx provenance; the self-mount shadowing gotcha; and metakit-under-Tcl-9
feasibility. Two findings bear on the container choice: 8.6's core zlib cannot do
mk4vfs streaming (kbskit boot.tcl states it - forces whole-blob decompression,
relevant to a battery-carrying kit), and TEMP_REFERENCE/metakit is UNPATCHED
upstream while KitCreator carries eight 8.x-era fixes.
Self-mount shadowing verified live rather than inferred: inside a running tclkit
[file type [info nameofexecutable]] is 'directory', so a kit cannot read or copy
itself as a file and cannot be handed to sdx as -runtime (wrap.tcl LoadHeader is a
plain file read). make.tcl:4995-5005 already works around this with _BUILDCOPY;
recorded as a requirement to preserve. Container-agnostic - zipfs has the same
shape via its /app anchor.
src/buildsuites/suite_tcl86/patches/ captures the bin/sdx.kit delta into tracked
form. bin/sdx.kit is tracked and is what make.tcl resolves for the 'kit' wrap
path, but it is NOT stock sdx: unwrapping it and stock 2011-03-17 sdx gives 64
identical files except lib/app-sdx/wrap.tcl, whose entire difference is a
two-line binary-mode read of tclkit.inf before stringfileinfo patches the PE
version resource. That evidence previously existed only in gitignored scratch/
and TEMP_REFERENCE/ copies - one git clean from gone. Stock baseline, patched
file and diff are all byte-exact (hashes in the README); the patch round-trips to
the patched file byte for byte under 'patch --binary'. The stock baseline is kept
in full because upstream (svn://svn.equi4.com/sdx/trunk) no longer exists. Both
.tcl files are CRLF and must stay CRLF - vendored fidelity artifacts, exempt from
the repo's LF-on-edit preference.
Scope-limiting facts recorded rather than assumed: the patched path is DORMANT
for present builds (fires only with -runtime + a .exe runtime + a tclkit.inf in
the source .vfs, and no tclkit.inf exists in this repo), and the fix itself is
UNVERIFIED - plausible as a CRLF-corruption fix but no reproducer was recorded
with it. Confirming or retiring it is part of this goal's characterization work,
alongside the bootstrap circularity noted in the goal (sdx.kit is itself a metakit
starkit, so wrapping a suite-built 8.6 runtime currently needs a prebuilt
third-party tclkit of exactly the kind G-101 exists to replace).
Of the two proposed acceptance riders, this commit discharges the first (capture
the patch before any sdx rebuild). The second stands: the end-to-end demonstration
must wrap a SEPARATE COPY of the runtime so the shadowing path is exercised rather
than accidentally avoided.
A back-pointer to these findings was added to TEMP_REFERENCE/AGENTS.md so the
survey is not repeated; that tree is VCS-ignored, so it is not part of this commit.
Claude-Session: https://claude.ai/code/session_014UkdFjhuEdfCNDp4f8V6Xe
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Extends the 8.6 buildsuite with the remaining pieces punkshell's Tcl 8 testing
depends on, all built from source with the pinned zig 0.16.0 toolchain only.
Tk 8.6.17 (build_tk86/build_tk86.zig) is a RE-DERIVATION from the staged 8.6
win/makefile.vc + rules.vc, not a port of suite_tcl90's build_tk.zig:
- no generic/tkPkgConfig.c in 8.6 -> no CFG_* defines at all
- rules.vc TCL_MAJOR_VERSION==8 arm -> tk86t.dll + lib/tk8.6 (vs tcl9tk90.dll)
- @TK_WIN_VERSION@ substitutes $(DOTVERSION).0.0, not the tcl-style
<dotversion>.<releaselevel>.<patchlevel> formula
- 8.6 TKOBJS carries no tkIcu/tkImgListFormat/tkImgSVGnano/tkWinGDI/tkWinIco/
tkWinSysTray; XLIBOBJS is a first-class makefile macro here (the 9.0
derivation had to recover those files by hand)
USE_TCL_STUBS + USE_TCLOO_STUBS against libtclstub86.a is the stock rules.vc
arrangement and keeps the dll loadable by both suite shells. tkMain.c is
compiled twice per makefile.vc, the ansi copy forced with -UUNICODE/-U_UNICODE
(verified the pinned zig cc defines neither for x86_64-windows-gnu, so the 8.6
core's ANSI/TCHAR arrangement is matched exactly).
tklib 0.9 and tcllib 2.0 install via their own installer.tcl (batch, packages
only, explicit -pkg-path so the installer's tcl_pkgPath-derived default can
never write off-tree); tcllibc is built by critcl 3.3.1 driving zig cc (tracked
critcl_zig.config, target pinned win32-x86_64-zig - critcl otherwise probes PATH
and falls back to its builtin msvc target). critcl compiles against its own
bundled headers chosen by the driving shell's version, which is why one config
serves both generations.
New evidence tools, run on every build:
tools/tk_smoke.tcl maps a real toplevel with classic + themed widgets,
updates, then destroys it - a load-only check passes
even with no usable display
tools/accel_bench.tcl same payload through sha1's critcl and pure-Tcl
implementations with the digests compared:
4MB -> critcl 5.7ms vs pure-tcl 2736ms = 477x
Test tiers (G-107 policy pattern): test-tcllib/test-tklib on the record tier
inside test-libraries, plus an opt-in test-tk (winDialog/winMsgbox excluded by
default - their message-injection automation blocks on a human under a batch
shell). First censuses on tclsh86ts.exe 8.6.18:
thread 142 run / 0 failed GATE PASS
tklib 796 run / 0 failed record
tcllib 64259 run / 41 failed record (names in the summary artifact)
tclvfs 51 run / 4 failed GATE PASS after baseline extension
The tclvfs baseline grew vfsFtp-1.1..1.3: they sit behind an 'ftp' constraint
needing tcllib's ftp package - absent at the G-099 capture, satisfied now that
the suite installs tcllib - so they run and reach the retired ftp.tcl.tk, the
same external-service class already baselined for vfsUrl-1.2/2.1.
punkshell runtests census (both runs 2026-07-26, identical flags, default
single-process sequential - 8.6 has no tcl::process so -jobs re-convoys):
native Tcl 8.6.17 1003 total / 986 passed / 10 skipped / 7 failed
suite tclsh86ts 1003 total / 987 passed / 10 skipped / 6 failed
runtests_parity.tcl finds exactly ONE difference: punkcheck
concurrency_two_writers_no_corruption failed in the BASELINE run and passed on
the suite runtime - a full-suite-load flake (6/6 twice in isolation on both
runtimes). Zero suite-runtime-only failures. Tk-dependent suites ran unskipped
(repl consolebackends 3/3, including the tkconsole backend on the suite Tk).
Two defects fixed in passing:
- scrubTclEnv never cleared TCL<major>_<minor>_TM_PATH, so suite shells
silently preferred machine/repo tm modules over what the suite had just
installed (a repo-built sha1-2.0.4.tm shadowed tcllib's 2.0.5, md5 2.0.8
shadowed 2.0.9) - any census through such a shell measures the machine. The
scrub list now covers TCL8_0..8_7 + TCL9_0/9_1 in all three sites (per-step,
suite.tcl process-level, bootstrap nested build). suite_tcl90 has the same
exposure via TCL9_0_TM_PATH and is deliberately untouched here (out of this
goal's scope) - pointers recorded in G-108 and G-116.
- build.zig.zon's .fingerprint was hand-authored, so 'zig build' from the
tracked suite dir died with 'invalid fingerprint' - the no-tclsh bootstrap
flow could never have run. Corrected to zig's computed value (its low half
is a checksum of the package name); 'zig build stage' now verified.
Goal flipped to achieved 2026-07-26 and archived; reference sweep updated G-005,
G-101, G-105 and ARCHITECTURE.md, and the archive-time xref pair G-101 <-> G-116
(whose only bridges were the archived G-100/G-103) gained a direct Related
pointer. No project-version bump - arm's-length build tooling, not shipped shell
behaviour.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Builds a Tcl 8.6.18 windows runtime from core-8-6-branch sources with the
pinned zig 0.16.0 toolchain only (no MS toolchain), forked from suite_tcl90
(duplication-with-a-note posture). Products (stock threaded-release naming -
rules.vc keeps the 't' SUFX on 8.6):
bin/tcl86t.dll + tcl86t.lib shared core (static zlib compiled in; no zlib1.dll)
bin/tclsh86ts.exe static shell (kit-class; dde/registry static)
bin/tclsh86t.exe dynamic shell against the dll
lib/libtclstub86.a stub lib for extensions
lib/tcl8.6/... script library tree (dde/reg dlls inside)
lib/tcl8/{8.5,8.6}/... tm modules; lib/thread2.8.13, lib/vfs1.4.2
Companions: thread 2.8.13 (thread2813t.dll, TEA installed shape from the
checkout's own pkgIndex.tcl.in) and tclvfs 1.4.2 (vfs142t.dll) build and load;
registry 1.3.5 / dde 1.4.6. No zipfs in 8.6 - exe+dll+on-disk lib tree only,
resolved hermetically (exe/dll-relative, TCLLIBPATH/TCL_LIBRARY unset in all
child runs).
Recipe: build86.zig + build_common.zig + build_zlib86/build_tclthread86/
build_tclvfs86 helpers; tools/ and src/main.zig copied verbatim (suite-agnostic).
Two load-bearing 8.6 findings recorded in the README DERIVATION and recipe
comments: MP_FIXED_CUTOFFS (the in-core libtommath ships no bn_cutoffs.c) and
TCL_BROKEN_MAINARGS + console subsystem for the gcc-class main() entry.
Test gates (suite.tcl test -> zig build test-gate/test-libraries) parse all.tcl
totals (exit codes untrusted) and gate against tracked dispositioned baselines.
First census + two-consecutive-run deterministic PASS (machine SuperBee):
core 46525 run / 2 failed (filename-16.12/16.13 admin-share self-globbing)
thread 142 run / 0 failed (empty baseline)
tclvfs 51 run / 2 failed (vfsUrl-1.2/2.1 external ftp.tcl.tk dependency)
Goal flipped to achieved 2026-07-26 and archived; reference sweep updated G-005,
G-100 (now unblocked), G-101 and ARCHITECTURE.md. No project-version bump
(arm's-length build tooling, not shipped shell behaviour).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
make.tcl bootsupport pulled the newly-included punk::platform; the templates
modpod refresh used the established virgin-tclsh direct copy (cd6aec8f
precedent) because the in-process punkcheck copy fails while the running
interp holds the target modpod mounted ("invalid argument") - snapshot now
byte-identical to the built modules/punk/mix/templates-0.2.0.tm (carries the
G-121-era layout make.tcl payload).
Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Field-driven follow-ons to G-121 from driving make.tcl with an msys/cygwin-runtime
tclsh (scoop msys2 tclsh8.6, tcl_platform(platform)=unix):
- bakelist: when the derived per-platform runtime store folder does not exist, a
stderr WARNING now shows the platform-canon derivation (tcl_platform os/platform
-> canon, observed mingw64-x86_64 under a MINGW64_NT MSYSTEM env) and the header
line carries (FOLDER MISSING) - every row reading runtime=missing now self-
diagnoses its non-per-entry cause. bake's "No executable runtimes found" exit
gains the same note when the folder is absent. Native-host output unchanged
(maketclbakelist.test 4 PASS).
- make.tcl shell 'help platforms' degraded to "punk::platform package not
available" on ALL hosts (not msys-specific): the module was absent from the
bootsupport snapshot. Added punk::platform to
src/bootsupport/modules/include_modules.config (pure Tcl, deps only Tcl's own
platform package); verified the full canon table renders via a piped
'help platforms' under tclsh90 src/make.tcl shell.
- G-013 Notes: recorded the msys raw-mode field finding (cursor placed at row 1
after each command under the msys pty class) as a raw-mode-default blocker
dimension - console/repl work, deliberately outside the make.tcl host/target
catering goal being drafted.
Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t
Assisted-by: harness=claude; primary-model=claude-fable-5; 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
make.tcl packages run after the G-121 make.tcl change - punkcheck-recorded sync
of src/make.tcl into the vendor layouts (basic, project-0.1) and the
punk::mix::templates modpod payload copy, per the established sync channels.
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
Second 8.6 tty rung: on unix-class Tcl 8.6 (linux/WSL/mac AND msys2/cygwin-
runtime builds, which report tcl_platform unix even on a windows machine -
e.g the scoop msys2 usr/bin/tclsh8.6), real ttys are isatty-gated into the
tty channel type and expose the serial/tty options (-mode etc) that pipes/
files lack - a zero-exec, dependency-free discriminator exactly parallel to
-winsize. Verified: WSL 8.6.14 pty mode=tty colour on ansistrip=0 vs piped
tcl86-plain stripped; msys2 8.6.12 piped tcl86-plain (interactive -mode
presence per field report); windows batteries + punkexe suites 54/0
unchanged. Together with the 0.23.2 windows console-encoding signature this
completes dependency-free 8.6 tty detection - the planned G-122 probe-ladder
goal (procfs/test -t/twapi rungs) is superseded before drafting: channel
signatures cover every case without exec or optional packages.
Also confirmed by byte-diff: 8.6 and 9.x piped help renders are IDENTICAL
(modulo native-8.6 zipfs warnings) - no 8.6-specific rendering defect exists;
the top-level help's wide Description indent is a cross-version cosmetic of
that one constructed definition, present on 9.x too.
punkshell 0.23.3 + CHANGELOG; src/AGENTS colour bullet updated.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Defect: the G-113 ansistrip transform was pushed onto Tcl 8.6 windows CONSOLE
channels, which encode utf-16 ('unicode') - at byte level ESC arrives as 1B 00
so sequences passed through unstripped and the hold-back carry deferred/
dropped real content, seriously mangling interactive punk86/punksys
'src/make.tcl help' layout (user-reported). Chunk-boundary handling itself is
sound: a rig proved strip output invariant across chunk sizes 1..4096 over
byte-transparent encodings; the failing dimension was encoding, not cutting.
(Comparison recorded: shellfilter::chan::ansistrip is the complement - it
decodes per the channel encoding and buffers undecodable tails, but assumes
line-buffering for sequence splits.)
Fix is detection, not utf-16 stripping: only 8.6 windows console channels
report -encoding unicode (pipes/files get the system encoding; hidden-console
probes confirmed across bawt tclsh86 8.6.13, punk86 8.6.17, punksys 8.6.13;
tcl9 consoles report utf-16 but are caught by -winsize first). The policy now
treats that signature as tty: mode=tty, colour ON, no transform - interactive
8.6 windows colour with no env var and no twapi. The transform push is now
PER CHANNEL and skips utf-16-class channels ('> file' from an 8.6 console
wraps stdout only - stderr console keeps its ANSI); ansistrip_pushed is the
wrapped-channel list, shell pops exactly those, policy/check lines print
ansistrip=stdout+stderr|stdout|0.
Verified: hidden-console 8.6 x3 mode=tty ansistrip=0; half-redirected punk86
console run ansistrip=stdout; piped 8.6/9 batteries unchanged (zero ESC,
force re-colours); punkexe suites 54/0 (maketclcolour pins updated to the
channel-list format). punkshell 0.23.2 + CHANGELOG; src/AGENTS bullet updated.
8.6 unix/WSL stays plain-by-default pending the probe-ladder goal.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
use wart fixed (both payloads + rewrapped bin/punk-runtime.cmd, checkfile
ERROR-free, scriptwrap roundtrip + binscripts freshness suites green 35/0):
candidate lookup falls back to <name>.exe when the exact name is absent -
exact names (incl. extensionless unix artifacts in foreign -platform staging
folders) still match first. Verified live in a throwaway platform folder via
the .cmd (ps1 payload) and the bash payload driven directly (msys exe-magic
already masked the wart under msys bash; the fallback serves real unix shells).
make.tcl: new ::punkboot::runtime_materialization_warning (warn-only, local,
no network) - the kit loop compares each wrapped working runtime's beside-toml
revision against the highest -r<N> artifact revision in the same folder and
emits a recapped BUILD-WARNING naming the repair command. Verified live: toml
demoted to revision=1 fires the warning once + recap (and would have caught
today's stale-r1 punk9_beta incident at the first bake); current state silent;
no spurious rewraps. Pre-family runtimes (no toml) and direct -r<N> references
stay silent.
Docs: bin/AGENTS.md runtime-manager contract (suffixless use + guard note),
src/AGENTS.md Work Guidance bullet; G-121 Notes records the guard as
bakelist's acting-path complement; G-031 Notes records the make.tcl-shell
punkexe-surface question with the boot-core vehicle recommendation.
punkshell 0.23.1 + CHANGELOG.
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
New informational pass in goals_lint (stem-sibling repair heuristic): a
live-tier reference to a version-suffixed filename that is MISSING while a
same-stem sibling exists on disk warns, naming the sibling(s) - the drift
signature of manually-versioned module bumps (libunknown), magic-scheme
conversions (config) and stamped bootsupport/vendored renames (fauxlink),
exactly the classes fixed in the preceding hygiene commit. References with no
stem-sibling stay quiet (proposed goals legitimately name future artifacts);
archive tier, globs, URLs, absolute paths and 999999.0a1.0 exempt; warnings
never fatal (Scope is contract text - the fix stays a directed edit).
Verified: clean on the current tree (incl. correctly-silent existing legacy
artifacts) and against a synthetic fixture exercising warn + all five silent
classes with per-file dedupe.
GOALS.md: front matter bumped v2 -> v3; version-section policy broadened per
user direction - bump for ANY change that could affect how an LLM interprets
or uses the system (contract, grammar, tooling behaviour, output shape);
liberal bumping endorsed. Format section gains Scope version-reference
guidance (glob or magic-version filename for stamped files; exact versions
only in dated prose). goals/AGENTS.md Verification describes the new check;
src/modules/AGENTS.md manual-versioning bullet gains bump step (4): the doc
reference sweep.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation gated on the G-112 rename core + G-104 contract (both achieved
today); score re-run recorded. First increment:
- suite_tcl86/: sources.config (source + self-description records - lists and
describes itself via 'make.tcl buildsuite list/info' with no make.tcl
edits), suite.tcl fork (folder-derived naming, {tcl tclthread tclvfs}
requireds, build86.zig recipe file), build86.zig pending-derivation skeleton
(staging succeeds, recipe fails with a clear message), build.zig.zon with
real zig-fetch hashes, README with the DERIVATION record.
- Thread 2.8 selection: thread-2-8-branch @ e14fa771ae (tagged thread-2-8-13,
2.8.13); configure.ac TCL_MAJOR_VERSION==8 guard confirms the pairing.
- 8.6 source records in BOTH flows: dev refs (core-8-6-branch -> tcl86,
thread-2-8-branch, tclvfs trunk 1.4.2-era) + zon per-checkin pins
(tcl 1d1d5cbd91 = 8.6.18 era).
- First staging run through 'make.tcl buildsuite build suite_tcl86' (a real
driver run through the G-104 surface): checkouts staged from the shared
hermetic store, TCL_PATCH_LEVEL 8.6.18 read from the tree.
- makefile.vc derivation findings recorded incl. two Context corrections:
8.6.18 DOES generate tclUuid.h; zlib is prebuilt-import in stock nmake
(zig-only recipe will compile compat/zlib statically).
Core-test census + baseline deliberately pending until a built tclsh86 exists
(recorded in Progress).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The bakehouse acceptance run's thin-layout sync refreshed the three layout
make.tcl copies (basic, project-0.1, templates modpod payload) with the
G-112/G-113/G-104 make.tcl - punkcheck-managed, batched per the build-output
commit carve-out.
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
buildsuite group added as a declared passthrough (punk::args + fallback paths):
list discovers suites (dirs carrying suite.tcl; _build excluded), info renders
the manifest-derived detail, build forwards driver args untouched streaming
output and exiting with the driver's status (punk-kit-hosted runs launch the
driver via the kit's script subcommand, selected by the G-058 marker).
Self-description = manifest option: sources.config gains description/product/
doc/zigpin records parsed by both suite.tcl (strict; pinned-zig default now
reads zigpin - one source of truth) and make.tcl (tolerant). suite_tcl90
seeded with its records. Copied trees appear automatically (verified with a
throwaway copy). Contract documented in new src/buildsuites/README.md +
AGENTS.md, indexed from src/AGENTS.md. CHANGELOG extended under 0.23.0.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
vfs -> bake (kit assembly; vfslibs phase folded in so a bake cannot ship stale
binary libs), project retired -> bakehouse (packages + bake, -dirty-abort
default ON, refusal names the granular developer flow). project/vfs remain as
deprecated aliases: one-line stderr notice + pre-dispatch mapping; alias
argdocs mirror their targets so flags parse identically. vfslibs survives as a
standalone narrowing (in-session decision recorded in the goal file).
SUBOPTS/SUMMARIES/HELPTEXTS/SUBGROUPS/known_commands, end-of-run guidance,
plain gethelp and workflow text rewritten to the two-persona model (groups:
build & bake / promotion gates / source maintenance / deprecated aliases).
Verified: tabled + PUNKBOOT_PLAIN help; dirty-tree refusal via bakehouse and
via the project alias; alias help renders. punkshell 0.23.0 + CHANGELOG.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation: proposed->active flip (user-confirmed), goals_xref score re-run
recorded in detail Notes (nothing beyond the drafting survey).
Holder named: punk::libunknown zipfs_tm_UnknownHandler's builtin-static
shortcircuit leaked its version-probe child interp 'ptest' whenever an
UNVERSIONED package require of a true static reached the handler -
'package vsatisfies $v' with zero requirement args throws wrong#args,
skipping both interp-delete lines. The leaked non-safe child holds
registrations on the process std channels, so 'chan close stderr' left the
OS handle alive and the slot occupied; the next open got a fileN name and
puts stderr failed (punk91/tclsfe-9.1b0 only: Thread is a true static there,
punk905 loads it from a dll so the block never fires).
Fix (0.2.2): auto-named probe interp deleted in try/finally; zero-requirement
requires accept any provided static version; probe errors fall through to the
normal tm search. Disposition recorded in the goal detail: leak, fixed - not
console-ownership machinery.
Verified: bin/punk91 src script recipe yields channel auto-named stderr with
working puts stderr; libunknown+console+repl suites 105/105 pass (tclsh90).
punkproject 0.22.1 + CHANGELOG.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The starred active row previously never changed across 'use' switches
(every -rN materializes to the same working name) and carried the
name-keyed dead end '(not listed on server)' - true of the name,
unexplanatory for a working copy whose bytes match a server artifact.
Rows the server listing does not name now carry an untitled identity
middle column: from=<artifact> for materialized working copies (the
beside-toml source; content verified against that artifact's server
sha1 so the Remote cell shows a real status - Same version, CONTENT
DIFFERS for the immutable-artifact anomaly, or '(artifact not listed
on server)'), sha1=<name> for tomlless byte-copies (default-first-
then-ordinal pick, the same rule as the freshness fallback so row
identity and freshness verdict always name the same artifact).
'(not listed on server)' remains only for genuinely unknown files;
the (server default) row annotation follows artifact identity onto
working copies of the default. Table header/rules widened to the
three-column layout, payload row formats now column-aligned across
ps1/bash; help text updated; bin/punk-runtime.cmd rewrapped
(checkfile clean).
Chosen shape (user-approved from mockup variants): untitled middle
column with self-keyed from=/sha1= tags - consistent with the plain
list metadata summary's from= vocabulary and self-describing when a
row is pasted without its header.
runtimecmd_freshness.test +3 row-shape tests (identity columns, the
identity-following default annotation, anomaly statuses) with ps1/bash
parity: 10/10 pass; scriptwrap + binscripts battery 35 pass /
1 pre-existing skip / 0 fail (roundtrip + checkfile pins green, WSL
row pins unaffected). bin/AGENTS.md + shell tests AGENTS updated.
punkshell 0.22.0.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
list -remote now states the relationship between the ACTIVE runtime and
the SERVER DEFAULT whenever both are known: explicit freshness: AHEAD/
BEHIND verdicts naming both revisions (BEHIND adds a fetch+use update
guidance line), an equivalent current verdict where the (= server
default) identity annotation did not fire, a different-series
incomparable note, and a stated no-revision-basis note for pre-family
actives - with sha1 VALUE-matching against the server sha1sums
identifying a byte-copy of a server artifact by content (support-file
rows excluded; first ordinal/C-collation match in both payloads). A
NO-NAME fetch prints the same verdict as a one-line note when the
active diverges from the resolved default (BEHIND carries an inline
'use <default>' hint - the artifact was just fetched). Revision basis:
-r<N> parsed from artifact-named actives, else the beside-toml revision
field (materialized working copies); the default's revision parses from
its defaults.txt name. Verdict lines are byte-identical across the
payloads; guidance lines keep each payload's program-name convention.
Help text (list/fetch sections) mentions the new surface;
bin/punk-runtime.cmd rewrapped (checkfile clean, no spacer resize).
New fixture-server suite
shell/testsuites/binscripts/runtimecmd_freshness.test: a child-process
http file server (new src/tests/testsupport/httpfixture.tcl) serves a
crafted punkbin layout behind the PUNKBIN_URL override; the ps1 payload
runs as the staged committed .cmd via cmd.exe (wrap-pinned path), the
bash payload directly under a probed msys/git bash (on windows the
polyglot routes unix shells to the powershell payload; WSL bash
rejected - WSL2 cannot reach a 127.0.0.1 fixture server). Covers the
five G-119 acceptance scenarios with per-scenario ps1/bash verdict-line
parity plus bash-side extras (different-series incomparable, fetch-mode
BEHIND hint): 7/7 pass; scriptwrap + binscripts subtrees 32 pass /
1 pre-existing skip / 0 fail (roundtrip, checkfile, WSL, dtplite
unaffected).
bin/AGENTS.md runtime-manager contract records the verdict surface;
src/tests + src/tests/shell AGENTS docs cover the new suite and helper.
punkshell 0.21.0 + CHANGELOG entry.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New src/tests/testsupport/consoleinject.ps1: the G-106 recipe's injection
half as a committed helper - FreeConsole/AttachConsole to a target pid's
console, open CONIN$, type lines as WriteConsoleInput key events.
tclshcmd.test: constraint punkconsole (windows + PUNK_TEST_CONSOLE=1; normal
runs skip) gates two tests driving the reopen path end-to-end in the child's
OWN hidden console (outer Start-Process -WindowStyle Hidden wrapper owns a
fresh console; wrapper runs '<kit> tclsh' there with std handles redirected
to files; piped code sets dorepl; injected lines + exit 0 finish it).
Pinned: reopened flips 0 -> 1 at reopen with istty immutable at 0,
inputbuffer published empty, reopen notice silent by default and STDERR-only
under TCLSH_PIPEREPL_DEBUG=1, injected exit completes with code 0 - closing
the item-1/7 console-side residue. Deadlines + wrapper-tree kill keep the
tests hang-proof; the piped-harness HANG RULE stands for everything else.
Verified: PUNK_TEST_CONSOLE=1 run 21/21 against punk9_beta; normal run
19 pass + 2 console skips; shell/*** suite 64 pass / 4 skips / 0 fail.
AGENTS updates: src/tests/shell (tclshcmd bullet - coverage now exists,
refined hang rule), src/tests (testsupport index + .ps1 helpers wording).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New punk::args::moduledoc::punkexe 0.1.0: (script)::punkexe dispatch
definition (package modes, subcommand enumeration, default reclassification)
+ (script)::punkexe::tclsh full contract (stock arg-form parity incl the
deliberate no -e boundary (G-077), lib: refusal, piperepl ::tclsh state
array + env gates, intended divergences recorded per item decisions 2/6/8)
+ summary definitions for script/shell/punk/shellspy. G-032-compatible: the
launcher help/parse wiring renders from these ids later.
punk::args 0.12.7: update_definitions handles tag-prefixed id namespaces
first-class - namespace_docpackages consulted with the tagged key (usage/
real_id on registered-but-unloaded (script)::* ids no longer no-such-id),
generic tag strip for the real-namespace probes, unqualified-ns warning no
longer fires for tag ids. args/ns/repl suites 352 pass 0 fail.
punk::repl 0.5.3: code-interp setup catch-requires the punkexe moduledoc
beside tclcore (both sites) so the docs are queryable in any punk shell.
ARCHITECTURE.md: tclsh subcommand bullet in the boot/launch chain
(architecture_lint clean). punkproject 0.20.1 + CHANGELOG.
Verified: fresh-interp usage-first render (real_id path); rebuilt punk902z
kit self-carries 0.1.0 (5298-char tclsh render); piped punk session renders
(script)::punkexe with no manual require.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance evidence in the archived detail file: embed verified in all three
family members (family_check), sidecar derived from embed with identical
build_id, 'info' identifies sidecar-paired/renamed-stray/pre-v1 files without
execution and flags doctored-sidecar disagreements, punkbin AGENTS.md schema
docs, roundtrip pin green, record survives make.tcl kit wrapping (punk9_beta
reads its runtime's r2 record in-kit), r2 re-emitted with full v1 records.
Sweep: achieved markers in G-025/G-057/G-108/G-116/G-118/G-119 (G-025's
survival expectation updated to confirmed). tclshcmd.test pins
::tclsh(reopened) publication on the rebuilt patched kits (G-118 items 1+7
landed+verified; Progress updated). build905.zig: packager git-identity leg
judges success by output not out_code (resolved 'unrecorded' on this host -
effective at next emission).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Both payloads + rewrapped bin/punk-runtime.cmd (roundtrip pin green 9/0/1skip).
Embedded read WITHOUT executing the target: bash uses unzip's central-directory
read; ps1 uses .NET System.IO.Compression with a manual EOCD scan + prepend
offset fixup (.NET does not apply the self-extractor fixup - the pure-zip tail
is copied to a temp file and read there; delta 0 = plain zip also fine). The
cooperative probe (piping a reader into the EXECUTED target) is printed as the
documented fallback when no zip reader exists, execution caveat stated.
Report: field-by-field embedded/sidecar columns, !DISAGREE flags on shared-field
mismatches, file sha1 checked against the sidecar (!SHA1-MISMATCH), stray
renamed copies identified embedded-only, pre-v1 artifacts report sidecar-only
(schema-tolerant parsing; new Get-PunkRuntimeRecordFields helper). Verified on
the emitted v1 r2 artifacts: sidecar-agree case, renamed-stray case, pre-v1
case - ps1/bash output parity, wrapped cmd smoke under Windows PowerShell 5.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
family_artifacts.tcl: reads the embedded record back out of each finished kit
(exec with a piped //zipfs:/app/punkbin-artifact.toml reader - another
executes-self-contained proof), verifies it against the invocation (schema/
name/variant/working_name/revision/target/tcl_patchlevel/batteries - stale-
staging tripwire), and derives the sidecar's identity fields from it
(build_id/origin/packager/project/project_url/license/build_host_platform -
identical build_id by construction). Sidecar carries schema = 1, '#' comments
on the non-obvious fields, and keeps sha1/size/built as its finished-binary
additions.
family_check.tcl: new embedrecord probe (record exists in the attached image;
schema/variant/patchlevel/working_name/piperepl/batteries MATCH probed facts;
v1 fields present; -expectrev asserts revision + the -r<N> artifact name) and
the gate probe now asserts ::tclsh(reopened) publication (0 at gate-open
start, absent on plain/opt-out - G-118 item 7 patch-rev verification).
build905.zig passes -expectrev; configure-compiles clean, both tools parse.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
In-source rev of tclMain_piperepl_905.c, effective at the next suite rebuild
(the G-117 cycle): the '? reopen stdin from console' notice prints only when
TCLSH_PIPEREPL_DEBUG is set truthy; all reopen-path messages (gated notice +
genuine failure messages) move from stdout to stderr; ::tclsh(reopened)
published as an unlinked fact (0 at gate-open startup, republished 1 after a
successful console reopen). 2024-era artifacts (tclMain_piperepl.c, .patch)
stay unmodified per the recovery policy.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- no-script forms set ::argv0 to the executable path (was the kit boot script)
- missing script file: file-exists pre-check, clean message, exit 1 (existing-file
source errors keep their full trace)
- no piperepl machinery (unpatched runtime or TCLSH_PIPEREPL=0): terminal stdin
fails fast with usage guidance (app-punkscript probe) instead of blocking in a
raw read; piped degraded eval unchanged; patch-missing notice now 'note:' and
a deliberate TCLSH_PIPEREPL=0 opt-out is quiet (old debug lines deleted)
- project_main.tcl mirrors the full tclsh dispatch (script-arg/dash/-encoding/
lib: forms; was single-arg-only with stale gate default 0); layout _config
copies byte-synced (interim duplication pending G-031)
- tclshcmd.test 17 -> 19 (tclsh_noscript_argv0, tclsh_script_notfound); shell
subtree 64 pass / 2 goal-gated skips / 0 fail against rebuilt kits
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Local 'list' rows are column-padded '* <name %-35s> (active) <metadata>' since
61cf903d; the test's single-space '* fakert_beta (active)' glob predates that
and failed. Assertion intent unchanged: the row is starred AND active-marked.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- new punkexe suite (17 tests): dispatch contract (script-arg argv0/argv/
info-script state, honest exit codes, piped no-arg eval, stock arg forms,
lib: refusal) plus the piperepl launch-state contract on patched kits
(istty/dorepl/evalinput published, piped script-arg state all-zero,
unconsumed-piped-input safety default, evalinput opt-in ordering, script
consuming stdin itself) and the unpatched degraded-mode notice
- hang rule baked in: no test or fixture may set ::tclsh(dorepl) (the
console-reopen path blocks under a piped harness; G-106-recipe territory)
- patched-kit resolution: env PUNK_PIPEREPL_TEST_EXE, else the punkexe if it
probes patched, else bin/punk9_beta.exe / punk9bi_beta.exe
- encoding coverage is byte-level (utf-8 vs iso8859-1 fixture; [format %c 233]
keeps the .test file pure ascii, runner-encoding-proof)
- patches/README.md: corrected the tcl_interactive divergence note (console
script-arg runs READ 1 where stock reads 0 - piped launches identical; the
early link stays load-bearing for the piped prompt opt-in) and recorded the
'? reopen stdin from console' stdout residue as known
- shell/AGENTS.md: tclshcmd bullet; stale runtime.bash names corrected to
punk-runtime.bash/punk-runtime.cmd
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- a leading '-' argument is no longer treated as a script name: all args stay in
::argv and the subcommand proceeds to the repl (tty) or stdin evaluation
(piped), matching stock tclsh
- '-encoding name fileName' sources the script with the named encoding;
incomplete -encoding forms fall through to the argv path as stock does
- lib: scriptlib names are refused with a pointer to the 'script' subcommand
(exit 1): the tclsh subcommand keeps plain-tclsh semantics, no punk modules
- also carries the piperepl dispatch work-in-progress this session's review
validated: TCLSH_PIPEREPL gate default enabled-unless-0 (G-103 patched-runtime
policy) and the no-arg branch (tty -> tclsh repl via dorepl; piped -> read
stdin + eval with tcl_interactive/dorepl 0)
- punkproject 0.19.0 + changelog entry
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Field report (jcross1, Windows PowerShell 5): Get-FileHash not
recognized during list -remote while Write-Host/Invoke-WebRequest
worked. Root cause class: Get-FileHash is a SCRIPT-defined function in
PS 5.1's Microsoft.PowerShell.Utility, resolved via PSModulePath
autoload - a damaged PSModulePath (pwsh7 path pollution, overridden env,
redirected user module dirs) removes it while the module's compiled
cmdlets keep working. Effects were wrong results, not just noise:
spurious UPDATE AVAILABLE rows (null local hash) and fail-closed fetch
verification.
New Get-PunkFileSha1 computes sha1 via .NET (SHA1.Create over a stream,
lowercase hex) at all three former Get-FileHash sites; works on any
PowerShell edition/state incl FIPS, and emits a one-time informational
note when the damaged condition is detected (chosen over
detect-and-offer-install/env-repair: nothing to install once the
dependency is gone, and persistent environment mutation from a fetch
tool is disproportionate). Bash payload already probes
sha1sum/shasum/sha1/openssl - unchanged. bin/AGENTS.md records the
no-script-module-cmdlets payload rule.
Verified: hash parity with Get-FileHash under powershell 5 and pwsh 7;
list -remote via the rewrapped .cmd (correct Same-version rows);
damaged-PS simulation (probe forced unresolvable): note printed once,
zero errors, hashing correct; scriptwrap roundtrip pin
runtimecmd_roundtrip PASS (payload + regenerated bin output committed
together). CHANGELOG bullet added under the in-flight 0.19.0 entry
(rides the user's pending release-notes commit).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User direction: the BAWT-shipped tclvfs 1.5.0 comes from the forTcl9
branch of the same core.tcl-lang.org/tclvfs repo our trunk ref trailed
at 1.4.2 - tcl9 suites move to it (a future suite_tcl86 keeps trunk;
recorded in sources.config). Both flows updated: sources.config ref +
build.zig.zon per-checkin tarball pin (75a2672991).
build_tclvfs_shared.zig gets the G-107 derivation treatment: every
version-derived name (package dir, dlls, rc fields, configured
vfs.tcl/pkgIndex.tcl) now follows the checkout's AC_INIT via
versionInfo() - the hardcoded 1.4.2 was the same stamped-mismatch class
as the thread 3.0.1 case. build905 consumers use the derived info
(szip staging, family staging, family_check args, artifact metadata).
forTcl9 build glue: export guard is now lowercase BUILD_vfs;
HAVE_SYS_STAT_H defined; and an include-order shim TU works around
zig's mingw headers defining __stat64 as a MACRO for _stat64 - tcl.h's
'typedef struct __stat64 Tcl_StatBuf' parsed before <sys/stat.h> binds
a forever-incomplete tag and forTcl9's direct Tcl_StatBuf field access
fails (MSVC has a real tag; upstream never sees this; -include trips
zig cc CacheCheckFailed, hence the generated-TU overlay).
Verification: all three family members PASS self-containment with vfs
1.5.0 incl the functional zip-mount round-trip; tclvfs test gate PASS
51/42/9/0 twice-deterministic - the branch CLEARED the whole 1.4.2-era
baseline (glob-nomatch drift entries now pass, network vfsFtp/vfsUrl
now skip) - baseline re-established empty. familyrev default bumped to
2 (r1 published+immutable; r2 emitted locally + staged to the runtime
store; r2 publication is a user decision). Wrapped kits confirm the
resolution skew the user found is gone: punk9bi_beta script-mode
'package require vfs' now 1.5.0 (boot loads the runtime's copy - both
tiers now agree).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-requested audit of naive [package versions] selection: punk::apps'
appinfo 'latest' used a plain lexical lsort (misorders 1.10 vs 1.9) AND
took lindex 0 - the LOWEST version - as latest (the '#todo - natsort!'
site). Now lsort -command {package vcompare} taking the highest, with
empty (unversioned-main) entries excluded before comparison since
vcompare errors on empty operands; only-unversioned yields latest "".
Audit sweep results: every other punk-owned consumer already sorts with
vcompare (punk::lib repl/udp checks, libunknown, repl autocomplete,
loadedlib copy/promote, punk_main/project_main starkit selection - the
latter even carries the 'package versions does not always return
versions in increasing order!' warning comment); packagepreference's
uses are mappings/exact-pins, not max-picks. Naive sorts remain only in
VENDORED third-party code (tcllib doctools docidx/doctoc/doctools.tcl,
vendormodules pattern-1.2.8.tm:267) - flagged, not edited, per the
vendorlib no-edit policy. Project 0.18.9.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The published r1 artifact metadata recorded 'unrecorded' checkout uuids
for tclvfs/tcllib/tklib: fossil only writes manifest.uuid when the
REPOSITORY enables the versioned 'manifest' setting, which those
upstreams do not (tcl/tk/thread do). The checkout-scoped setting is
ours to control: 'fossil settings manifest u' materializes manifest.uuid
immediately and keeps it current across updates - now applied
idempotently to every staged checkout on each build. Verified on the
live stage (tclvfs f082c47f, tcllib c784f6fd, tklib 2d53beaf now
recorded); future emissions carry full provenance (r1 stays immutable
as published). Zon-flow tarballs share the upstream limitation - their
checkin uuids are derivable from the per-checkin pin URLs; recorded in
the comment as the not-yet-wired follow-up.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Publication side-effects handled ahead of the punkbin push (b5c258f
there - first family -r1 artifacts + metadata + defaults flip to
tclsh9.0.5-punk-r1.exe):
- remote-only rows skip support files (the six metadata tomls now ride
in the server's sha1sums beside the runtimes; same extension set as
the local candidate filter).
- the '(= server default)' active marker also matches via the active's
beside-toml artifact identity: the default names an immutable -r<N>
artifact while the active is typically its materialized WORKING name,
so exact-name matching alone would never fire post-family.
Live-verified against the pushed server: no-name fetch resolves
tclsh9.0.5-punk-r1.exe + metadata; list -remote shows all three -r1
artifacts Same version, the default row marked, active
tclsh9.0.5-punk.exe annotated '(= server default)' through its toml
identity, and no toml leakage. G-067 note records publication done
(r1 immutable - next republish takes -Dfamilyrev=2). Rewrapped;
roundtrip pin PASS; layout copy refreshed. Project 0.18.8.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Output of the make.tcl project run that performed the G-103 kit-wrap
trial - the established template-payload sync channel carrying the
current punk-runtime.cmd into the punk::mix::templates source tree.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Bring the modpod-template copy of punk-runtime.cmd up to the
canonical-platform punk-runtime work already landed in bin/ and the
project_layouts copy: local_platform canonical punkshell platform-dir
names (narch normalization, win32-ix86, per-BSD prongs), no-name fetch
defaults from the server's curated defaults.txt instead of baked-in
per-platform rt_default values, and the fetch/list/use -platform
handling that goes with them.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Add punkboot::lib::platform_punk to the three layout make.tcl copies
(basic, project-0.1, and the modpod-template mirror): an inline copy of
punk::platform::normalize (the boot stage cannot package require) that
folds platform_generic's version-dependent cpu/os aliases
(amd64->x86_64, aarch64->arm64, macos->macosx, macosx arm->arm64) into
the canonical punkshell platform-dir names. The bootsupport/library
path wiring now uses it, so platform-suffixed dirs match the punkbin /
punk::platform canon documented in 'help platforms'.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Re-vendor the punk bootsupport module to pick up the canonical
punkshell platform-names work from the dev module: the 'help platforms'
topic (punk::args-documented table of punk::platform::platforms with
status, tiers, buildsuite axis and local-platform markers).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com