punkcheck-managed copies refreshed by 'make.tcl modules' - vendor layouts
basic + project-0.1 and the modpod-shipped template payload, all
byte-identical to src/make.tcl.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Layout .gitignore payloads are now stored inert as gitignore.in and
materialized to .gitignore at project generation, ending the
self-censoring-template hazard (live nested .gitignore files silently
untracked template content in git while fossil managed it fine):
- punk::mix::commandset::layout 0.3.0: layout_materialize_renames map;
layout_stage_chain renames inert payloads after composing all overlay
layers (.anti markers keep targeting store names); layout_materialize
withholds the in-place fast path from inert-payload folders so the
store is never renamed; inert+live name conflict errors loudly
- make.tcl thin-layout sync refreshes every vendor/punk layout's
gitignore.in from the canonical repo-root .gitignore (punkcheck-tracked
sync_layouts events); workflow text updated
- the four vintage payload variants eliminated as drift: all payloads
now byte-identical mirrors of root; modpod copy carried and its stale
.gitignore pruned
- materialize.test +5 G-012 characterization tests (25/25; mix subtree
71 pass / 1 known skip)
Verified end-to-end: generation from each affected layout yields a
byte-identical .gitignore (othersample .anti case yields none); root
edits propagate to payloads via make.tcl libs in both directions; the
fc1c474c force-added template files are back to ordinary git tracking
with no ignore rule matching them; modpod payload README trees are now
visible as ordinary trackable files.
Goal flipped achieved 2026-08-01 (user-confirmed; the custom/_project
acceptance clause is stale - that store level was retired by G-087
stage 5 after drafting; recorded in the archive record and detail
evidence). Reference sweep + archive moves per the flip protocol.
Project version 0.39.5.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
The Tcl core delivers 'clear' to a transform stack before EVERY write op
(output-buffer flush-down; tclIORTrans.c ReflectOutput, gated on METH_CLEAR -
intentional and test-pinned, but under-documented: doc/transchan.n and TIP 230
scope clear to seek/read-side buffers). ::punkboot::ansistrip::transchan's
clear handler ran 'dict unset carry $chanid', discarding a split sequence's
held ESC tail at every write-chunk boundary: the next chunk's ESC-less
remainder ('0;1m', '1m') passed through unstripped as orphan fragment text in
piped usage tables, while the dropped ESC bytes kept the G-113 zero-ESC pin
green. The transform is write-only with no read-side state, so its
contract-conformant clear is a no-op - it no longer declares the op, the
per-write calls never fire, and the split-sequence carry survives every chunk
boundary. finalize still drops an end-of-stream partial sequence. No change in
textblock/punk::ansi (pre-transform stream verified well-formed during
diagnosis; exonerated).
Pin: maketclcolour.test gains maketcl_colour_help_tables_zero_remnants -
piped 'tclsh src/make.tcl help' for all 20 declared SUMMARIES subjects plus
bare 'help'/'-help', asserting exit 0, zero ESC bytes, zero orphan fragments
(two-step detector: strip complete sequences, then scan for [0-9;]+m not
preceded by ESC or an open bracket - a raw scan false-positives on ';1m' inside complete
multi-parameter SGR). Failing-first evidence: pre-fix the pin names exactly
the 5 fragmenting invocations (help, -help, help libs, help info, help
bootsupport); the 22-invocation NO_COLOR+PUNK_FORCE_COLOR pre-transform
corpus carries no legit text matching the detector.
Verified (tclsh 8.7a6, win32-x86_64): all 22 invocations byte-level clean;
PUNK_FORCE_COLOR=1 output intact (1177 complete sequences, 0 orphans); the 3
G-113 colour-policy pins pass unchanged; shell/testsuites/punkexe family (15
files, 102 tests) and shell/*** (127 tests) green, warnings pre-existing only;
'make.tcl packages' verified, layout + modpod make.tcl copies synced by the
build (punkcheck-managed outputs batched here per the carve-out).
Bookkeeping: goal flipped active -> achieved 2026-08-01, detail file archived
(goals/archive/G-145-piped-usage-ansi-remnants.md), G-056 Notes gains the
exoneration pointer; src/AGENTS.md colour bullet + src/tests/shell/AGENTS.md
suite description updated; project version 0.39.4 (patch) with CHANGELOG
entry.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
Convert every ::punkboot::argdoc punk::args::define to the braced file-style
block form established for the shell/tool definitions in 7ec7da4a: -& record
continuations, -summary/-help pulled from SUMMARIES/HELPTEXTS via tstr
placeholders, shared OPT_* option fragments interpolated as ${$OPT_...}
records. The SUBOPTS/OPT_SYNOPSES/VALUES_SYNOPSES/SUBVALUES tables and the
define loop are unrolled into 16 per-subcommand blocks; buildsuite/help and
the top-level definition follow the same idiom (help gains a HELPTEXTS entry;
the top-level body moves to argdoc's TOPLEVEL_HELP variable). @normalize is
dropped: -help bodies are display fields (punk::args G-046 deferred
expansion), so the HELPTEXTS block indentation now reaches the rendered
Description verbatim - every 'make.tcl help <subcommand>' Description renders
centred like 'make.tcl help tool' instead of left-aligned.
No parsing or interface changes: option/values specs, synopses, exit codes,
prefix resolution, unknown-flag/subcommand errors, PUNKBOOT_PLAIN degraded
mode and the capability probes all verified unchanged (before/after usage
captures diffed for all 20 help subjects; shell/tool byte-identical). Narrow
usage tables widen slightly to fit the indented Description.
KITNAME_CHOICEPART persists as a namespace variable because the kitname
records interpolate it at (lazy) definition resolve time.
Docs: src/AGENTS.md make.tcl bullets updated (braced-def contract, per-block
maintenance rule); src/modules/AGENTS.md G-045 subsection re-points the
@normalize exemplar to punk.tm only and records argdoc as the braced -& +
tstr exemplar. punkshell 0.39.3 + CHANGELOG entry. Thin-layout make.tcl
copies resynced via 'make.tcl libs -confirm 0' (basic, project-0.1, modpod
templates copy - byte-identical).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
tool_install_state judges bin/<tool>.exe current/stale by comparing its
mtime against the newest file anywhere in the tool tree. Two layers kept
that exe mtime frozen at the original link time: a zig cache-hit rebuild
does not rewrite the zig-out artifact, and Tcl's 'file copy -force'
preserves the source mtime (Windows CopyFile semantics). Once any
non-build-input file (e.g. PROVENANCE.md, edited after the G-128/G-135
doc passes) was newer than that link time, the tool was reported 'stale'
permanently - repeated 'make.tcl tool build' runs (field-observed
2026-08-01) reinstalled a timestamp-identical artifact and never cleared
it.
Fix: after the install copy, stamp the installed exe with the install
time ('file mtime $exe [clock seconds]'), making the state measure what
it means - installed since the last change in the tree. Also self-heals
mtime churn from branch switches/fresh clones on the next build.
punkshell 0.39.2 + CHANGELOG entry (patch: build-tooling bug fix).
Thin-layout make.tcl copies resynced via 'make.tcl libs -confirm 0'
(basic, project-0.1, modpod templates copy - byte-identical).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The G-112 stage-true rename (0.23.0) kept 'project' -> bakehouse and
'vfs' -> bake as transitional aliases until the 8.6 arc completed; that
arc landed with G-099 and the new shape is settled. All alias plumbing
is removed from src/make.tcl: known_commands, the pre-dispatch mapping
switch, the punk::args definitions (SUMMARIES/HELPTEXTS/SUBOPTS/
SUBVALUES/VALUES_SYNOPSES), the "deprecated aliases" help group, the
plain-help block, the workflow-text mention and the degraded-mode
kitname collection. 'vfs' now gets an unknown-subcommand usage error;
'project' prefix-resolves to the read-only 'projectversion' check under
punk::args unambiguous-prefix matching (PUNKBOOT_PLAIN degraded mode
rejects both). Also trimmed a pre-existing trailing space (line 8990)
surfaced by git diff --check via the verbatim layout copies.
Docs: src/README.md, ARCHITECTURE.md, src/AGENTS.md (alias mentions
removed; also corrected the stale layout-sync trigger claim - the
thin-layout sync runs in modules/libs/packages/bakehouse, not
bootsupport), root AGENTS.md sync-step subcommand list ('project' ->
'bakehouse'). Historical records (CHANGELOG 0.23.0 entry, goals
archives, GOALS-archive) deliberately untouched.
punkshell 0.39.1 + CHANGELOG entry (make.tcl interface change - patch
per root AGENTS.md versioning policy).
Build outputs batched per src/AGENTS.md: thin-layout make.tcl copies
resynced via 'make.tcl libs -confirm 0' (basic, project-0.1, modpod
templates copy - all byte-identical to src/make.tcl), plus the lagging
store->modpod catch-up the same run performed (modpod layout copy:
mapvfs.config removed, mapvfs.toml + vfs/README.md added).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
make.tcl modules regeneration of punkcheck-managed outputs: the layout
src/make.tcl sync copies (basic, project-0.1, modpod payload) pick up
the G-139-era libfetch/vfslibs help + workflow text, and the modpod
layout payload mirror-prunes the samplesuite1 sketch retired in
fc2376ca and gains the buildsuites README.md.
Assisted-by: harness=opencode; primary-model=huggingface/moonshotai/Kimi-K3; api-location=unknown
The decision (per the acceptance, recorded in the goal detail): derived
projects obtain library binaries via the SAME fetch entrypoint by default -
generated projects receive make.tcl (libfetch + the PACKAGES phase) through
the established layout-sync/G-027 channels and declare their artifacts in
their own src/runtime/libpackages.toml; the copy-and-tweak in-project suite
build per G-104's self-description contract remains the documented
alternative (a tcllib/tcllibc-only suite needs no Tcl source tree - critcl
bundles its headers).
The pre-G-096 samplesuite1 sketch in the project-0.1 layout
(download_and_build.config, mingw64/gcc-era, self-described as SKETCH ONLY)
is removed and replaced by src/buildsuites/README.md in the layout,
documenting both routes for generated projects - the disposition the goal
Approach named. Goal Progress also records the r1 publication (punkbin
ee571ed, pushed) and the live canonical-origin libfetch verification.
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
Implemented and achieved same day. punkboot::utils 0.6.0 gains
kit_offsetstyle_report (argdoc'd thin classifier over
punk::zip::archive_info), synced via modules + bootsupport (one stale
dead-pid .punkcheck.lock removed per the recorded recovery) and promoted into
_vfscommon. make.tcl: guarded getter, post-assembly probe beside the
smoke-require block (recapped BUILD-WARNING only on a FILE-relative attached
payload; plain/none/unreadable silent; NOTE on stale bootsupport), and the
'check' row (ACTIVE (advisory) + contract lines). Characterization:
offsetstyle.test 7/7 (mkzip -runtime/-offsettype hermetic fixtures for
plain/archive/file, none on text + metakit-magic binary, unreadable detail,
src/_build baseline sweep - no kit image probes file);
maketcl_check_offsetstyle_pin added (payload-check suite 4/4). Full utils
suite 69/69, punkexe suite 81/0, live punkluck86 bake silent as the
acceptance's baseline clause requires. Docs: src/AGENTS.md pin bullet with
does/does-not-guarantee, bin/AGENTS.md deployed-kit section, ARCHITECTURE.md
check-family bullet (architecture_lint clean). Reference sweep: no live-tier
references beyond the index entry; goals_xref shows no pairs bridged solely
by G-134. Archive move follows as a pure-rename commit.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Thin-layout sync (part of the bootsupport run): the project-layout
make.tcl copies (vendor/punk/basic, vendor/punk/project-0.1, and the
punk::mix::templates modpod source tree) pick up the G-126 'tool'
subcommand from d76a7907 via the punkcheck-managed sync step. No hand
edits.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Batched punkcheck-managed build outputs from make.tcl modules/bootsupport/
vfscommonupdate for the G-133 change-set: bootsupport and _vfscommon.vfs gain
utils-0.5.0.tm (0.4.0 pruned), thin-layout make.tcl copies and the modpod
templates payload re-synced.
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
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate'. The thin-layout
make.tcl copies and the templates modpod carry ::punkboot::replace_possibly_mapped_file and
::punkboot::mapped_file_hint, so generated projects get the same behaviour - a project whose
own bootsupport carries a zip-based .tm meets exactly the same windows constraint.
Note the templates modpod copy in this commit was itself replaced by the new delete-then-
place path: the bootsupport run reported "in-place overwrite refused - replaced by
delete-then-place" and completed, where the previous three runs this session failed and
needed a hand copy. The fix was exercised by the change-set that introduced it.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate'. make.tcl reaches
the predicate through a guarded require against the bootsupport snapshot, so the third
tcl-library convention only takes effect for a bake once this lands; 'make.tcl check'
confirms the gate ACTIVE and now names all three locations.
The thin-layout make.tcl copies and the templates modpod carry the reworded K10 key note,
so generated projects describe the gate the same way.
The bootsupport templates modpod again failed to copy in place with 'invalid argument' and
again succeeded on retry seconds later - the transient lock noted in the previous two
build-output commits, not a make.tcl mount this time. Copied by hand, then 'make.tcl
bootsupport' and 'vfscommonupdate' re-run to reconcile; all three copies share one sha1.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate' for the G-125
change. make.tcl loads punkboot::utils from bootsupport through a guarded require, so the
boot-precondition gate only becomes ACTIVE once the snapshot carries
vfs_boot_library_report - before this propagation 'make.tcl check' correctly reported the
gate UNAVAILABLE.
The thin-layout make.tcl copies and the templates modpod pick up the gate and the K10
workflow key note, so generated projects get the same refusal behaviour.
The bootsupport templates modpod again could not be replaced in place - 'BOOTSUPPORT
module update FAILED: ... templates-0.2.0.tm (invalid argument)'. Unlike the G-124
occurrence a plain tclsh failed on the first attempt too and succeeded on a retry moments
later, which points at a transient lock by one of the running shells rather than at
make.tcl having the file mounted. Copied by hand, then 'make.tcl bootsupport' re-run to
reconcile the punkcheck record.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate' for the G-124
change. make.tcl loads punk::zip from bootsupport, so the reader only reaches the
zipfs-less bake path once the snapshot carries it.
Also carries two version propagations pending from earlier work, not authored here:
punk 0.2.7 -> 0.2.8 and punk::platform 0.1.0 -> 0.2.0 (the latter was added to
include_modules.config in 5c1e6927 but never snapshotted). Their source buildversion
files are unchanged by this change-set.
The templates modpod is rebuilt because the layout make.tcl inside it changed. Note for
next time: 'make.tcl bootsupport' cannot replace a bootsupport modpod that the running
make.tcl has itself mounted - it failed twice with 'BOOTSUPPORT module update FAILED:
... templates-0.2.0.tm (invalid argument)' while a plain tclsh copied the identical file
without complaint. Copied by hand, then re-run to reconcile the punkcheck record.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
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
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
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
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
- 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
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
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
The user-observed ordering discrepancy decomposed into two edition
divergences, both now handled:
- launch paths run DIFFERENT powershells: the .ps1 twin executes under
the invoking shell (pwsh 7) while the .cmd routes via the wrap-pinned
'cmd.exe /c powershell' (Windows PowerShell 5);
- between those editions BOTH Hashtable key enumeration order AND
culture-sensitive Sort-Object collation differ (NLS vs ICU treat
hyphens differently). Fix: ordinal comparison for every name ordering
(candidates, platforms dirs, list -remote local+remote-only rows) in
ps1, LC_ALL=C glob/ls/sort in bash - verified byte-identical
list -remote output across cmd->powershell5, pwsh7-on-twin, and bash.
bin/AGENTS.md .ps1-twin paragraph corrected (was stale): the twin is
SELF-MATERIALIZED by the polyglot's batch layer - created when missing,
fc-compared and re-copied when content differs - so it self-heals after
a re-wrap on the next .cmd launch; no manual copy step (verified:
deleted twin regenerated byte-identical). Documented caveats: a
direct-.ps1-only user can ride a stale twin until a .cmd launch heals
it, and payload code must avoid edition-specific behaviour. Rewrapped;
roundtrip pin PASS; layout copy refreshed (twin deliberately NOT
hand-copied - the mechanism owns it now). Project 0.18.7.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Both payloads in parity (rewrapped; roundtrip pin PASS; twins + layout
copy refreshed): the remote comparison now answers "is my active runtime
the recommended one?" at a glance - summary lines show the platform's
server default (defaults.txt, best-effort fetch with cache; absent
server = markers gracefully omitted) and the locally active runtime
(annotated '(= server default)' on match); rows gain the local listing's
'*' active marker and a '(server default)' annotation on the default's
row, whether it is locally present or remote-only.
Also fixes the latent bash bug the verification exposed: CRLF server
sha1sums made locally-present runtimes ALSO appear as remote-only rows
(bash read keeps the \r that msys grep strips, so the \r-suffixed name
failed the local-existence test) - the remote-only loop now strips \r,
and punkbin's build_sha1sums.tcl writes LF sha1sums going forward
(punkbin 4b403a3). Project 0.18.6.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The per-platform default fetch runtime is a punkbin RELEASE DECISION, so
it now lives as server data (punkbin defaults.txt, c4d948f there) rather
than values baked into the payloads: updating the recommendation is a
one-line punkbin edit in the same change-set that publishes the artifact
it points at - immediate effect for every deployed punk-runtime, no
punkshell release, validated by punkbin's maintenance script, and
mirror-curatable. No pre-convention fallback per user direction (no
mirrors exist yet) - a server without the file gets an actionable
name-it-explicitly message, as does a platform without a recorded line.
Both payloads in parity (rewrapped; roundtrip pin PASS; twins + layout
copy refreshed): baked rt_default/runtime_available prong values removed
(the linux-arm one had already drifted from the server's actual artifact
name - the config-in-code failure mode this removes); default lookup
keys on the RESOLVED platform, so no-name 'fetch -platform <p>' now
works for foreign staging too (supersedes the foreign-name-required
rule); cached-copy fallback on network failure. ps1 fix: $arch? in
usage strings parsed as a variable NAMED 'arch?' - brace-delimited.
Verified: file:// happy path (local + foreign default), no-entry
platform, missing-manifest, and the LIVE server's 404 path (graceful
until punkbin c4d948f is pushed). Project 0.18.5.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User direction: 32-bit windows joins the canon marked for what it is -
status supported with runtime+lib tiers (hosting for available
third-party runtimes/libs), buildsuite CANDIDATE (zig can target it;
whether we add a buildsuite is undetermined) - the hosting-vs-building
axis expressing exactly that split. Name win32-ix86 = platform::generic's
own 32-bit x86 token (no normalization needed); normalize additionally
folds hand-typed i386/i486/i586/i686.
- vendorlib_tcl8/9 gain win32-ix86 dirs per the tree sync contract.
- punk-runtime local detection: ps1 returns win32-ix86 on genuine 32-bit
windows hosts (PROCESSOR_ARCHITECTURE x86 without ARCHITEW6432 - a
32-bit shell on a 64-bit OS keeps the x86_64 default: the runtime
store serves what the OS can run); bash MINGW32/CYGWIN prongs key off
the i*86 machine arch. Rewrapped; roundtrip pin PASS; twins + layout
copy refreshed.
Project 0.18.4.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The powershell payload's list -remote built its local-file dict with an
older inline filter (only .txt/.tm excluded), so active.toml, artifact
metadata tomls and stray .log files showed as local runtimes in the
server comparison. Now routed through Get-PunkRuntimeCandidates - the
same filter 'list'/'use' use (directories, *_BUILDCOPY*, .txt/.toml/
.tm/.tmp/.log excluded) and the bash payload's -remote loop already
used (list_candidates). Verified against the LIVE pushed punkbin: no
toml/log leakage, comparison rows correct; 'platforms -remote' also
live-verified over the network (all five served platforms). Rewrapped;
roundtrip pin PASS; layout copy + .ps1 twin refreshed. Project 0.18.3.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Raw-file artifact servers have no directory listing, so served-platform
discovery rides a root-level platforms.txt manifest, now part of the
punkbin layout contract (generated by punkbin's src/build_sha1sums.tcl;
committed in punkbin locally - 7b8a244 - push remains the maintainer's
call; third-party mirrors using the layout carry the same file).
Both payloads in parity (rewrapped; roundtrip pin PASS; layout copy +
.ps1 twin refreshed): 'platforms' lists local bin/runtime/* folders with
the local platform marked; 'platforms -remote' fetches the manifest
(cached-copy fallback), marks local platform / local-dir presence /
local-only dirs, and points at 'list -remote -platform <name>' for
per-platform runtimes. Servers without the manifest get an actionable
message naming the -platform escape hatch and the canon reference
('help platforms'). Verified end-to-end through the wrapped cmd against
a file:// mirror simulation of the local punkbin checkout, including the
no-manifest fallback path. Project 0.18.2.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Survey outcome (punkbin vs punkshell platform folders): five naming sites
had drifted - punkbin folders, bin/runtime, vendorlib_tclX dirs, the
punkboot platform_generic snips (an old platform::generic copy), and the
Tcl platform package itself whose outputs vary by version (1.1.x renamed
modern macOS to 'macos', aarch64/amd64 pass through unmapped).
Canon: <os>-<cpu> punkshell platform-dir names, cpu normalized
amd64->x86_64 and aarch64->arm64 (arm = 32-bit; on macosx arm folds to
arm64 - Apple silicon is 64-bit only), os macos->macosx. The universal
'macosx' name is the runtime-tier convention (punkbin + bin/runtime keep
one macOS folder, per make.tcl's existing collapse); per-arch
macosx-x86_64/macosx-arm64 serve the lib tier.
- new module punk::platform 0.1.0: platforms (canonical records with
status supported/dormant/recognized + tiers), normalize, local
?-tier lib|runtime? - full PUNKARGS argdocs. Tcl's platform package
stays the raw identifier underneath.
- punk 0.2.7: 'help platforms' topic (alias 'platform'; all prefixes
mutually ambiguous so they fall through to command lookup, per the
env/environment precedent) - canon table with the local interpreter
marked and raw platform-package identifiers for comparison.
- boot: punkboot platform_punk (inline normalization copy, sync-comment
contract with the module) in punk_main.tcl/project_main.tcl/make.tcl;
all platform-dir call sites switched to it. make.tcl exercised live;
main.tcl copies brace-verified.
- vendorlib_tcl8/9 synchronized to canon: freebsd-amd64 -> freebsd-x86_64
(READMEs updated), freebsd-arm64/linux-arm64/macosx-arm64 added, tcl8's
untracked-empty linux-arm now tracked + tcl9 gains linux-arm, stray
untracked macosx-arm empties removed, msys-x86_64 marked dormant
pending a utility decision, top-level READMEs state the canon contract.
- punk-runtime bash prongs emit canonical names: aarch64 -> linux-arm64
(no fetch default until punkbin carries that folder), arch-aware
freebsd/openbsd/netbsd/dragonflybsd via normalized cpu tokens.
Rewrapped; roundtrip pin PASS; layout copy + .ps1 twin refreshed.
Flagged for user decisions (recorded in G-105 Notes): punkbin linux-arm
holds an arm64-named kit (recommend linux-arm64 folder at next arm
publish; artifacts immutable), msys-x86_64 disposition, optional
platform-1.1.x re-vendor, src/vfs stays mapvfs-categorized (recommend a
mapvfs platform column when cross-wraps land, not a .vfs tree
restructure). Project 0.18.0.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Cross-build staging surface (both payloads in parity, rewrapped polyglot,
layout copy + .ps1 twin refreshed, roundtrip pin PASS):
- fetch/list/use accept -platform <p> (punkbin platform-DIR names, never
zig triples); resolution: -platform arg > PUNK_RUNTIME_PLATFORM env >
detected local platform; shape-only lowercase validation (server URL
paths are case-sensitive - ps1 uses -cnotmatch; default -notmatch is
case-insensitive and passed Win32-X86_64-class typos in testing).
- foreign fetch requires an explicit runtime name (fetch defaults only
make sense for the platform you stand on).
- use -platform manages that folder's active.toml/materialization - the
marker travels with the folder when deployed (provisioning story; unix
exec bits restored at deploy time).
- list flags !TARGET-MISMATCH when a runtime's metadata target disagrees
with the folder it sits in (cross-fetch misfiling guard).
- run stays LOCAL ONLY: rejects a leading -platform, ignores the env
override, later args pass through to the runtime untouched.
- new 'help' action (actions, options, env vars, examples) and a real
usage block on no-args invocation (was a bare action list).
- bash FreeBSD platform dir aligned to punkbin's actual freebsd-x86_64
(was freebsd-amd64; the G-105 platform-dir naming-alignment item).
Verified on both payloads directly and through the wrapped cmd: noargs,
help, local list unchanged, foreign use-materialization + mismatch flags,
foreign-fetch refusal, run guard, env override (and run's immunity to
it), bad-name validation. Project 0.17.9.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Scriptset extension (ps1 + bash payloads in parity, rewrapped polyglot,
layout-shipped copy + untracked .ps1 twin refreshed, roundtrip pin PASS):
- list: per-runtime summary parsed from the <rootname>.toml metadata record
beside each runtime (variant, tcl patchlevel, revision, piperepl on/off,
from=<artifact> on materialized working copies).
- use <artifact-r<N>-name>: materializes the immutable artifact into its
WORKING name (minus -r<N>) with the metadata toml copied alongside, then
selects it - the G-103 naming decision's artifact->working mapping, so
republishing never churns consumers. use <workingname> unchanged.
- fetch of -r<N> artifacts also retrieves the metadata toml from punkbin
(absence tolerated for pre-family runtimes).
- rootname handling strips only .exe (dotted patchlevels break last-dot
stripping for extensionless unix names); same exe_split fix applied to
family_artifacts.tcl artifact/toml naming for the G-105 cross-target
future. Candidate listing excludes directories and .log files (parity
cleanup; bash side previously listed directories).
Verified on the wrapped bin/punk-runtime.cmd (powershell 5 branch) and the
bash payload under git-bash: all three family members materialized from
their -r1 artifacts with metadata shown in list, and 'punk-runtime run'
launched the active punk family runtime (9.0.5, piperepl machinery,
//zipfs:/app/tcl_library). Project 0.17.7.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Layout fold ("fold stale layout fixes into this"): both layout stores
(src/project_layouts/vendor/punk/project-0.1/bin and the modpod-templates
equivalent) had shipped a stale 2025-era runtime.cmd and a pre-G-096
getzig.cmd - the getzig rename had missed this channel entirely, so
generated projects still received old-named, stale utilities. Both renamed
via git mv AND refreshed to byte-copies of the current bin/punk-runtime.cmd
+ bin/punk-getzig.cmd; the layout src/runtime/Readme.md references updated
in both stores (the layout bin/runtime/ data-dir READMEs are gitignored -
updated on disk only, like the root bin/runtime/README.md); residual
old-name scan of the layout trees clean. The built modpod zips (root
modules/ + bootsupport templates-0.2.0.tm) carry old names until their
normal re-vendor cycles. Layout paths join the goal Scope per the approved
fold.
Flip mechanics: detail file to goals/archive with Status achieved
2026-07-21 (verification in its Progress section: full rename sweep, pins
retargeted and passing 26/25/1/0, drift findings recorded), GOALS.md entry
removed, GOALS-archive record appended (amended Scope + Acceptance
verbatim), reference sweep: G-103 scope parenthetical (both tiers) +
Relationships and the G-099/G-103 sequencing notes annotated with the
achievement; G-096's archive gains a note recording the layout-channel gap
and its closure. goals_lint clean (75 active-index goals, 31 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
make.tcl modules + bootsupport + vfscommonupdate after the stage 4/5 source
changes: commandset layout 0.1.1->0.2.0 and project 0.3.0->0.4.0 snapshots in
src/bootsupport and _vfscommon.vfs; thin-layout sync refreshed the store
layouts' make.tcl copies and the templates modpod payload (repacked
templates-0.2.0.tm) for the retired marker exclusion comment.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
vendor/punk/project-0.1 loses its stored src/bootsupport snapshot (10.6MB, 254
files) and src/vfs/project.vfs lib+modules snapshots (7.7MB, 230 files);
vendor/punk/basic loses its 2023-era bootsupport snapshot. Thin layouts keep
structure, scripts, docs, fossil/git settings and now carry the three
bootsupport modules*/include_modules.config manifests plus README markers
documenting generation-time injection (bootsupport README, project.vfs lib and
modules READMEs).
custom/_project deleted entirely (punk.project-0.1, punk.shell-0.1,
punk.basic) together with their two decktemplates _overrides refs: these were
bootsupport-snapshot + make/build-script overlay fragments kept current by the
retired make.tcl sync - generation-time injection provides exactly that
content, so they were fully redundant (punk.shell-0.1_overrides was never a
working standalone layout).
The store payload store drops from ~43MB to under 1MB (bin/sdx.kit 300KB
remains, grandfathered - excluded from the module-shipped payload copy).
Claude-Session: https://claude.ai/code/session_01WS3VakZo4sgbFzcQFW3twZ
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Four project-layout template README.md files were untracked because the
layout templates' own nested .gitignore files are honoured by git as
nested ignores of the outer repo (fossil, which reads no nested ignore
files, already manages them). Two vendored critcl TODO.txt files were
swallowed by the unanchored 'todo.txt' ignore pattern matching
case-insensitively on Windows (core.ignorecase). All six force-added so
git's tracked set matches fossil's view; note force-adds protect only
these existing files - future files under the layout templates or new
vendored TODO.txt files will drop silently again unless the underlying
patterns are revisited.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com