Characterized (windows tcl 9.0.5) how a binary inside a zip-based .tm (modpod)
loads, per user request. All three loading locations - dll direct in a kit's
zipfs, a standalone .tm on disk, and a .tm nested inside a kit's zipfs
(zip-in-zip, mounts in place, no .tm pre-extraction) - converge on the same
copy-to-temp path: the binary extracts to %TEMP%\TCL<hex>\ with the same
TIP-741 non-cleanup/accumulation flaw (verified with a #modpod-mybintest
wrapping a real tcl9thread307.dll built via modpod::lib::make_zip_modpod).
- G-066 (substantive): the characterization + the multi-package-name design -
manifest-at-well-known-location read by libunknown (not yet implemented);
multi-name .tm are punkshell/libunknown-only, not plain-tclsh loadable, which
is acceptable if clearly documented; TIP 590 lowercase single-name is the
plain-tclsh-loadable happy path; complex mechanisms OK with extensive tests.
- G-103: TIP-741 thread extended - windows flaw now confirmed for BOTH
direct-kit and modpod-.tm binary loads.
- G-105: linux leg BLOCKED - local WSL is tcl 8.6.14 (no zipfs); needs a linux
tcl9 runtime. Windows done; linux expectation (no accumulation) unverified.
- G-067: binary modpod .tm as a publish payload; cross-refs.
Temp reclaim also done this session: 15,596 orphaned %TEMP%\TCL* dirs removed.
Notes only; no contract changes. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Ran the copy-to-temp characterization on the suite's own tclsh90szip.exe 9.0.5:
loading a dll out of a zipfs mount extracts it to %TEMP%\TCL<8hex>\<dll>, a new
dir per load, none removed on exit. 'info loaded' reports the //zipfs:/ path so
the temp copy is invisible to script. Unbounded accumulation confirmed in the
wild: 15,609 such dirs in this machine's %TEMP% spanning ~5 months of kit runs.
Windows = the known TIP-741 flaw, no in-runtime cleanup in 9.0.5. Linux/WSL and
qemu guests still to characterize (unix can unlink-while-mapped, so expect no
accumulation - verify).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Self-contained-but-loads-binaries (the tclkit model) resolved: tclkitsh
binaries are self-contained via an embedded Metakit/zip VFS yet DYNAMICALLY
linked to libc - that dynamic libc is what makes dlopen/'load' work; extensions
reach Tcl via the stubs table handed through the interp (no host symbol export
needed). "Self-contained" and "static libc" are orthogonal.
- G-105 (Notes were empty): the dynamic-libc first-linux-target choice is the
tclkit model; fully-static-musl 'load' limitation stands; compiled-in
alternative is G-058.
- G-101 (Notes were empty): the prebuilt tclkit86bi/tclkit-win64-dyn runtimes
it replaces are dynamic-libc Metakit kits; loadable binary batteries imply a
dynamic-libc runtime; container choice is orthogonal to libc linking.
- G-103: temp-copy dll cleanup wart the family runtimes inherit - Tcl core
TIP 741 (DRAFT, windows-framed: TclpFinalizeLoad; extract-to-temp preserved
vs TIP 709). Requirement (user): test on ALL target platforms (windows,
linux/WSL, G-060 guests) that temp-dll/dir accumulation does not happen or is
characterized. Applies to G-101's Metakit kits too.
- G-060: one-line cross-platform test item pointing at the G-103 requirement.
Notes only; no contract changes. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
bi (batteries-included) kits should carry tcltls (core.tcl-lang.org/tcltls) as
a suite-built battery with a zig-built OpenSSL/LibreSSL backend. TLS is already
a consumer dependency (punk::imap4, punk::netbox) shipped today only as vendored
prebuilt binaries (tcltls1.7.23/tls2.0b2) - building it retires those and
advances G-004.
Recorded as a battery line, not a separate goal, and explicitly non-gating:
the crypto-backend build (the real work - no OpenSSL/LibreSSL in the tree yet)
lands when convenient; tcltls stays a vendored binary in the interim. Aim is
to validate the general build/test/kit processes, not rush a releasable product.
Notes capture the feasibility crux (thin extension over a crypto lib built under
zig-only) and the G-107 test-step follow-on.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
All six acceptance clauses satisfied (suite tclsh90s.exe 9.0.5, zig 0.16.0,
machine superbee): thread 143/0 + tclvfs 51/7 GATED with tracked dispositioned
baselines, deterministic across consecutive full runs; tcllib 62328/54 WITH
tcllibc accelerators engaged + tklib 796/18 RECORDED with artifact paths in the
detail file; tk opt-in step with a recorded first census (9865/27, native-
dialog files excluded by default); per-library policy/testargs/notfiles
overridable at invocation; no-totals fails the step in gate AND record mode
(verified); evidence-summary shape documented for the G-103 metadata consumer.
Flips G-107 active -> achieved and archives it (index entry to GOALS-archive.md,
detail file to goals/archive/). Reference sweep: G-103 Notes gain the thread-
payload-refresh forward-pointer (the suite now derives thread naming from the
checkout; the punk905 kit payload still carries the old 3.0.1 copy) and the
evidence-summary-shape pointer; G-108 Notes record that its constrained-test
runs reuse G-107's test_gate generalization + -notfiles knob.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The Tk opt-in census surfaced that the full suite cannot run unattended in
the batch/suite-built shell: winDialog.test (72 cases) and winMsgbox.test (19)
pop real OS dialogs whose message-injection automation does not drive them
here, so each blocks waiting on a human. The first attempt hung there and the
engine correctly reported no-totals/fail.
Adds a dedicated file-exclusion mechanism: tools/test_gate.tcl gains -notfiles
(a Tcl list of test-file globs passed to the driver as one -notfile list
value - a flat -testargs cannot carry a multi-file list through the option
chain, since -notfile takes a single list arg), and build905.zig gains a
per-library -Dtestnotfiles-<lib> knob defaulting to each LibSuite's
default_notfiles. tk defaults to excluding winDialog.test + winMsgbox.test so
its census completes hands-off; -Dtestnotfiles-tk="" re-includes them for a
manual interactive run. The exclusion is recorded in the evidence summary
(notfiles key). Empty for every other library (no behaviour change).
Verified: tk census now completes unattended (9865 run / 8127 passed / 1711
skipped / 27 failed, result pass; log shows winDialog/winMsgbox in the driver
skip list); thread gate still PASS with notfiles {} recorded.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Index entry + detail file for a debug tier of suite_tcl90: build debug-flavoured
runtimes (NDEBUG off / tcl::test compiled in; deeper tier adds TCL_MEM_DEBUG for
the script-level memory command), named with a trailing -dbg<n> suffix, and run
the core suite's normally skipped C-test-command-constrained tests in record
mode (never gated). Kit-family debug members coordinate with G-103; the
TCL_MEM_DEBUG all-or-nothing linking constraint drives the feasibility item.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New goal from the 2026-07-21 discussion: the libraries the buildsuites compile
and ship (thread, tclvfs, tcllib+tcllibc, tklib, tk) get their own testsuites
run under the suite-built shell as named recipe steps with per-library policy -
gate (core test-gate mechanism, dispositioned baselines), record (report
artifacts under out/testreports/), or opt-in (tk). Context carries the source
survey, test_gate.tcl generalization notes, G-102 cost knowns, and the G-103
metadata / 8.6-arc relationships.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Records the 2026-07-21 discussion: make.tcl's zip-kit extract+merge_over+mkimg
flow already unifies runtime-zip and vfs-folder payloads, so the bi family is
isomorphic to a .vfs kit without its main.tcl fauxlink. Where the equivalence
breaks (tcl_library provenance, stock-boot path setup, dll-from-zip loading) is
the goal's design content; generators stay separate (bootstrap hermeticity,
release axis) and meet at the attached-image contract - the concrete payload
contract promised to G-101.
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
The remaining pre-policy punkshell-own bin utilities take the punk- prefix
(bin/AGENTS.md policy, G-096); external-tool wrappers (dtplite/sdx/kettle)
and getpunk stay unprefixed. No behaviour changes ride along.
- runtime scriptset: sources/toml renamed (src/scriptapps/bin/punk-runtime.*),
the eight ps1 usage/guidance messages now say punk-runtime.cmd, the bash
payload's filename-derivation comment example updated; REWRAPPED ->
bin/punk-runtime.cmd (checkfile clean) with the .ps1 twin regenerated as a
byte-copy. The roundtrip + checkfile pins retarget the new names and pass.
- tclargs + bits: sources/tomls renamed; bin artifacts moved BYTE-FAITHFULLY
(git mv, no rewrap): a pre-rename drift check showed both carry
pre-template-refresh wraps (477-byte delta = the template's 2025
wmic-deprecation timestamp fix; runtime was in sync). Regenerating them is
a behaviour change and is deliberately not smuggled into the rename -
recorded in the goal. Fresh .ps1 twins cut from the current .cmds; stale
untracked bits.bat/bits.ps1/tclargs.ps1/runtime.ps1 removed.
- selfsign experiments: SELFSIGN.PS1 -> punk-selfsign.ps1 (case normalized),
wrap toml + cert-create script renamed; the four untracked bin experiment
scripts renamed on disk; the exported .cer is not a script and keeps its
name.
- runtimebash_wsl.test: functional staged-filename sites updated (bash
./punk-runtime.bash; solo-fixture cp) along with comments.
- Docs: bin/AGENTS.md (examples, policy paragraph records the sweep, runtime
contract section, pin pointer corrected to runtimecmd_roundtrip.test),
src/scriptapps/AGENTS.md, root AGENTS.md, README.md, src/README.md,
untracked bin/runtime/README.md, G-060 reference, libunknown comment (src
copy; root modules/ + bootsupport copies catch up on their re-vendor
cycles).
Suites green: scriptwrap + binscripts 26 run / 25 passed / 1 constraint-skip
/ 0 failed - the roundtrip pin passes against the renamed artifact.
Discovered and recorded for user decision (goal Progress): the project
LAYOUT stores ship stale utility copies - runtime.cmd (2025-era payload) and
getzig.cmd (the G-096 rename missed this channel) - so generated projects
still receive old-named utilities; folding the layout channel into this
goal's scope vs a layout-sync mechanism is flagged.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
First of the confirmed sequence G-097 -> G-103 -> 8.6 arc: the bits/runtime/
tclargs scriptsets and selfsign experiment scripts take the punk- prefix per
the bin/AGENTS.md policy, ahead of G-103 extending the runtime scriptset.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Two naming tiers mapped by tooling: immutable fully-qualified ARTIFACT names
in punkbin vs short stable WORKING names consumed by mapvfs and typed by
users, with 'runtime use' and mapvfs as the mapping. Runtime artifacts:
tclsh<dotted-patchlevel>[-punk[-bi]]-r<N> (dotted patchlevels required,
always-present assembly-revision tail, no punkshell version or patch revision
in the name - metadata is authoritative); working names drop the -rN. Kits
flip the release axis to the punkshell version: major-only typable working
names (punk9/punk8/punk9bi), artifact names punk<major>-<punkshellversion>;
the dev-matrix style (punk905 etc) remains a recognized owner-controlled
third style. Hyphen separators (no punk- prefix or PATH collision in these
namespaces), '+' banned for punkbin URLs, ordering by metadata not filename
sort. Resolves the acceptance's tcl-patchlevel/punk-version/separator
questions; the acceptance's pre-decision tclsh905punk.exe example is noted
as superseded by the dotted -punk shape.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User confirmation 2026-07-21, noted in the three affected goals: the bin
naming sweep runs first (runtime.cmd -> punk-runtime lands before G-103
extends the scriptset's list/use), the kit family + naming decision +
punkbin publication next, and the suite_tcl86 fork is taken only after the
family assembly steps exist in suite_tcl90 (fork-timing logic per
G-102-before-G-099), giving G-101 a concrete payload contract.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The archived verification is corrected to the accurate history: the earlier
scrubbed passes proved each pipeline step green individually while the
single-invocation composite was failing on the decorative echo banner steps
(a pipeline-exit misread had over-claimed it). With the banners removed the
clean-clone composite now runs to a true exit 0 with all four shells landing
(incl tclsh90szip/tclsh90sprzip) and every smoke green; the echo-spawn hazard
joins the environment findings. The sprzip install residual is marked resolved
(user application released the file; copy completed).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance verified in full (evidence in the detail file's Progress
section): concurrency suite green on Windows Tcl 9.0.3 (runtests) and
Tcl 8.6.17 (direct tcltest drive) plus a linux WSL tclsh 8.6.14 run
from a native-filesystem staging - two-writer no-corruption/no-loss
with a clean polling reader, lock timeout naming the holder, dead-pid
and age stale-breaks, non-interactive duplicate-INSTALLER recovery.
Real builds under the re-vendored 0.6.0 run with zero lock timeouts,
zero tripwire warnings and unchanged decisions.
Index entry moved to GOALS-archive.md; reference sweep: G-027's
punkcheck note updated to achieved tense, G-028 gains the
advisory-lock name-the-blocker precedent pointer. Detail file moves to
goals/archive/ in the adjacent commit (pure rename).
punkproject.toml 0.17.3 + CHANGELOG entry.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance evidence recorded in the archived detail file: PATH-scrubbed
clean-clone demonstration (c:/T/g102, env probed tclsh/fossil/git-free) ran
'zig build bootstrap' end-to-end - zon-pinned sources materialized, runtime +
piperepl variants built, smokes green (static/zip shells, Tk tooltip, tcllib,
tcllibc accelerators via critcl+zig cc), demo shell's tcl::build-info identical
to the fossil-flow build; scrubbed test gate 69552/56075/13468/9 with 8
baselined + fCmd-30.3 proven a SystemDrive scrub artifact (single-file rerun
with the var: GATE PASS), matching the same-day fossil-flow delegated gate
(69552/56040/13503/9 GATE PASS). Environment findings (critcl target probing,
windows Run-step stdio, testsuite base-env needs, firewall consent on first
socket listen) recorded in the detail file for future suite work.
Flip mechanics: detail file to goals/archive with Status achieved 2026-07-21,
GOALS.md entry removed, GOALS-archive record appended (Scope+Acceptance
verbatim), pending-tense G-102 references in G-099/G-103/G-104/G-105 annotated
with the achievement and the settled driver shape. goals_lint clean (77
active-index goals, 29 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Follows straight from G-094's landing: the single save chokepoint
(installtrack save_working_recordset) is in place and the G-094
verification itself logged a transient concurrent-save failure with a
second session active in this checkout - the exact exposure this goal
closes.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance verified in full (evidence in the detail file's Progress
section): characterization suites pass with one recorded pin flip,
lifecycle.test pins batch/OO field equivalence (-targets_cksums incl)
and o_record_list coherence across sequential events, the retired-trio
grep is clean, and a full make.tcl build completes with skip/copy
decisions unchanged against pre-refactor .punkcheck state.
Index entry moved to GOALS-archive.md; reference sweep: G-095 notes gain
the chokepoint-achieved pointer, the transient concurrent-save evidence
observed during verification, and the inherited MAX_PATH rider pointer
(G-087/G-094, unaddressed); G-027's punkcheck note updated to achieved
tense. Detail file moves to goals/archive/ in the adjacent commit (pure
rename per the doc-restructure rules).
punkproject.toml 0.17.2 + CHANGELOG entry (punkcheck ships in kits; the
in-shell punkcheck API surface changed with the retirement).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Readonly reference checkout of the community Tcl 9 port of classic
Expect (alpha, Linux-tested, unix-pty only - no ConPTY/windows
backend). Full assessment in the G-061 notes: reference for expect
primitive semantics, candidate unix-backend tool at arm's length,
pty-allocation reference. G-020/G-044 get pointers, plus stale
"candidate goal drafted" phrasing updated to name G-061.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-102 continues in a parallel session; this session takes the punkcheck
arc. G-094 is the unification prerequisite for G-095 (concurrent-writer
safety): one lifecycle implementation with an explicit eager/deferred
persistence policy and a single save chokepoint.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Sequencing per the recorded plan: suite_tcl90 arc closed (G-096/G-098
achieved, punk905 promoted 2026-07-21), so the driver-shape work starts
now, ahead of the 8.6 arc (G-099 born onto the chosen shape).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User direction 2026-07-21 recorded in G-103: piperepl-patched runtime
executables must carry 'punk' in the name (e.g tclsh905punk.exe) so
patched and unpatched are never confusable - now an Acceptance item, with
the open design questions captured (how to encode tcl patchlevel + punk
version, separator choice; existing sub-namespaces punkNNN kits /
tclsh-runtimes / punk- utilities; metadata carries authoritative versions
so filenames stay human-distinguishing). The suite's tclsh90spr/sprzip
are flagged as internal working names in patches/README.md pending the
scheme.
Also noted: punkbin pushes of suite runtimes are deferred until family
members carry Thread etc in the attached zip and the punk-named pr
variants exist - publication follows G-103's artifacts, not the interim
tclsh905/punk905 shapes. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
All acceptance items met and recorded in the goal file: clean-checkout +
punk-getzig-pinned-zig build PASS (shallow-path/longpaths MAX_PATH caveat
recorded; c:/T available as a shallow test base per user), recovered +
rebased piperepl patch set with the G-103 opt-out gate policy and full
behaviour matrix (automated rows + user interactive verification),
tclsh90spr/tclsh90sprzip products, per-version punk-getzig into versioned
dirs (all four paths verified), both-VCS tracking + samplesuite1/
vendorbuild reconciliation, bin/AGENTS.md naming policy + punk-getzig
rename. Flipped to achieved 2026-07-20 and archived; GOALS/GOALS-archive
updated; achieved markers added to the six referencing goals flagged by
the lint reference sweep (G-097, G-100, G-102, G-103, G-104, G-106).
goals_lint clean (79 active, 27 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Fresh clone (shallow path + core.longpaths - the deep-path first attempt
hit windows MAX_PATH on the modpod template trees, caveat recorded) ->
the clone's own punk-getzig fetched 0.16.0 (mirror chain, minisign,
versioned dir) -> cold-cache suite build PASS: 9.0.5 static/zip/pr/przip
shells with recipe-generated configure-products, zip shell smoked, all
tk/tklib/tcllib/tcllibc legs green.
Cold-log 'failed command:' blocks diagnosed as BENIGN zig 0.16 behaviour
(build_runner prints that block for any step with nonempty result_stderr
even on success) triggered by our own tools' informational stderr prints
- zipfs_mkzip/mkimg call echoes now go to stdout and wrapfiletofile's
octet count is removed; rebuild shows zero occurrences, PASS.
All G-096 acceptance items are now met - achieved flip pending user
confirmation.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The zig version is now the first argument (default = the suite pin,
0.16.0) and each version installs into tools/zig-x86_64-windows-<version>
- the zip's own root folder name, so the old rename-to-tools/zig step and
its post-ExtractToDirectory lock retry/GC dance are gone. Installed-check
warns if the exe's reported version mismatches its versioned folder.
Documented limitations: dev builds (/builds/) and pre-0.14.1 releases
(old zig-<os>-<arch> naming) are not handled - the punkbin flat tools/
mirror path covers those if one must be pinned. The bash side stays an
honest stub with the same argument convention.
Rewrapped via scriptwrap::multishell (punk905_beta src script) ->
bin/punk-getzig.cmd (the untracked .ps1 twin byte-synced locally).
Verified all four paths through the polyglot: explicit present version,
no-arg default, existing-zip verify+extract (0.15.2 zip with no dir), and
the FULL network path (0.15.2 artifacts removed then re-materialized:
mirror latency selection -> download zip+minisig -> signature verified ->
versioned extract -> ZIG VERSION 0.15.2). G-096's remaining item is now
the final clean-checkout re-verification only.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User verified tclsh90spr 2026-07-20: interactive sessions normal with and
without TCLSH_PIPEREPL=0 (closes the G-096 matrix's residual user-level
check), and basic punk features work on the bare pr shell via repo tm
paths (raw mode twapi-reliant). Via './tclsh90spr src/make.tcl shell' the
powershell console-mode fallback engaged and raw mode worked - modulo
consolemode_server_async.ps1 noise and an early server shutdown.
New G-106 captures the requested direction: maintain the fallback as a
dependable raw-mode path for twapi-less runtimes (suite shells/kits),
hardening the known weak points recorded at creation - argv0-derived
pstooldir resolution (works for make.tcl shell by construction, little
else; kits need G-089 scriptlib delivery), server early-shutdown +
startup noise, and the unmarked experiment variants beside the canonical
script in scriptlib/utils/pwsh. Priority rises if G-103's zig-built twapi
investigation proves impractical - cross-noted there.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The recovered 2024 TCLSH_PIPEREPL patch applies cleanly to current
core-9-0-branch tclMain.c (8 hunks, offset 4). Tracked as
patches/tclMain_piperepl_905.c = stock 9.0.5 + patch + gate-default flip:
ENABLED unless TCLSH_PIPEREPL=0 (2024 was opt-in set-and-not-"0") per the
G-103 punk-kit policy - the goal's Goal/Acceptance were aligned to that
policy first at user request. Era files kept unmodified as recovered
artifacts; patches/README updated (status, gate semantics, known
tcl_interactive early-link divergence when the gate is open).
build905.zig gains tclsh90spr (per-source construction mirroring tclsh90s
with both tclMain compiles - unicode + TCL_ASCII_MAIN ansi - swapped to
the patched file; stock products stay byte-for-byte unpatched) and
tclsh90sprzip (zipfs_mkimg wrap of the pr exe, -infile form). patches/
added to suite.tcl's staged recipe items. Full suite build PASS.
Behaviour matrix recorded in the goal: 9/9 stock-equivalence rows
IDENTICAL (script-arg / script-consuming-stdin / piped-commands x
unset/0/1 - open-gate plain scripts behave stock; unread piped payload
never eval'd); feature row proves buffering verbatim into
::tclsh(inputbuffer) (write-trace capture), console reopen success and
repl landing; =0 feature row identical to stock; przip variant identical
to pr - the G-103 punk-kit precursor works.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User decision 2026-07-20: other build systems/distributions already
provide completely-plain tclsh executables - not a punkshell product role.
G-103's 'plain' family member (no piperepl patch, batteries attached) is
plain enough for our purposes; the truly bare bootstrap-intermediate
tclsh (tclsh90szip-class, which already satisfies G-018's substance:
stock invocations, no punk namespaces, self-contained) remains readily
accessible as an ordinary suite build product under _build/<suite>/out
but is deliberately not showcased or published.
G-018 closing note records all of this; G-103 gains the plain-niche
boundary paragraph (scope's subsumption-review item resolved and
removed, GOALS.md mirror updated); G-102's relationship line updated.
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User requirements batch 2026-07-20 integrated:
- G-103 runtime kit family: buildsuites produce self-contained kits whose
info library and batteries live in the initially attached zip - PLAIN
tclsh kit (Thread + tclvfs/vfs::* + tcllib/tcllibc), PUNK kit (piperepl
applied, ENABLED BY DEFAULT with env opt-out - gating review agreed; the
plain kit serves stock semantics), BI kits adding libraries we build (Tk
now; sqlite3/tdom easy/moderate futures; twapi flagged needs-investigation
under the zig-only policy). tcllib+tcllibc in all members (user lean,
agreed). Artifact metadata in punkbin (+compatible repos) surfaced by the
runtime scriptset list/use. G-018 flagged as substantially subsumed. 8.6
variant deferred through G-101 (static-vfs/metakit questions noted there).
- G-104 make.tcl buildsuite surface: list / info <suite> / build <suite>
with suites SELF-describing (info contract survives the G-102 driver
migration; copied trees appear automatically). mapvfs single-kit/list
wishes noted as sibling ergonomics.
- G-105 cross-target builds: -target as an invocation dimension (suite
folders stay version-named), linux x86_64 first verified via local WSL
with its own test baseline; zig tier findings VERIFIED and recorded -
the freebsd asymmetry suspicion is inverted (freebsd AS TARGET was the
gap, closed in zig 0.16 for FreeBSD 14+ with CI-tested x86_64/aarch64;
building FROM freebsd was already fine); macOS-as-target (SDK/frameworks)
recorded as the hard case; fully-static-musl dlopen limitation drives a
dynamic first linux target.
Cross-edits: G-096 piperepl matrix gains the kit-default policy update
(punk kits opt-out not opt-in); G-101 records the 8.6 kit-family
dependency; G-102 notes the family/target/surface as build-graph products.
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Direction agreed 2026-07-20: the whole buildsuite pipeline becomes
drivable with only the pinned zig toolchain present. Pre-tclsh phases
(fetch, configure-product generation, compile) move into the zig build
layer with sources in a content-hashed zon-shaped manifest (fossil
sources pin as per-checkin tarballs - '-refresh' becomes 'bump the pin';
fossil-checkout flow retained as the dev alternative); post-tclsh phases
(tcllib/tklib installers, critcl, parsed-totals test gate) stay Tcl
scripts run by the FRESHLY BUILT suite tclsh as build steps. Acceptance
includes a PATH-scrubbed no-tclsh end-to-end demonstration, preservation
of the copy-and-tweak retargeting property, and the recorded rejection of
a bash+powershell polyglot for this layer (polyglot craft remains the
acquisition layer's mechanism - punk-getzig/getpunk first contact).
Cross-references: G-096 direction note marked RESOLVED -> G-102 (its
remaining items close on the current suite.tcl shape regardless); G-099
sequencing now weighs birthing suite_tcl86 onto the chosen driver shape.
goals_lint clean (76 active, 26 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
A developer (no llm assistance, no punkshell modules - the driver stays
dependency-free plain tclsh) can now copy the suite tree and retarget
sources declaratively: urls/refs/pins live in sources.config (plain line
records 'source <name> <kind> <url> <ref> <dir>', parsed never executed;
fossil sources + the critcl git pin), and the build stage derives from the
suite FOLDER name so a copied tree stages into its own _build/<name>
isolated from the original. -tclbranch becomes a per-run override of the
declared tcl ref. Depth limit documented where the tweaker will read it:
same-major url/ref changes are config-only; version-class changes ripple
into build905.zig (checkout dir names, version-derived tm/dll/manifest
names).
README gains a Retargeting/copying section; its Sources section corrected
(stale per-stage fossil-store location from before the ~/.punkshell/fossils
move, and the G-098 sources were missing from the table).
Direction recorded in G-096 notes (2026-07-20): toml requirement DROPPED
for binary-build buildsuites; long-term intent is bootstrapping without a
pre-existing tclsh (zig acquisition = accepted root dependency; the
freshly built tclsh is the legitimate intermediate for tcllib/tklib
installers and critcl); zig-driver-vs-polyglot question recorded with the
current recommendation (zig hybrid; polyglot counselled against).
Verified: suite.tcl test -testargs '-file assocd.test' passes through
config load + fetch skip-logic + gate on the existing stage; stage
derivation for a copied name resolves to _build/<copyname>.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-098 (suite_tcl90 Tk+tklib, tcllib/tcllibc via critcl, test gating)
flipped to achieved 2026-07-20 and archived - all acceptance items
recorded in the goal file across increments 1-7 (Tk 9.0.2 + tklib,
tcllib+tcllibc ~248x hashing speedup, parsed-totals test gate with
dispositioned baseline, full punkshell runtests parity with the Tcl903
baseline including Tk suites unskipped, kit-hosted runs fixed).
New proposed goals mirror the arc for fossil core-8-6-branch (8.6 stays
punkshell's real Tcl 8 target; current punk86-class kits ride prebuilt
third-party tclkits - a provenance gap):
- G-099: suite_tcl86 core - zig-only 8.6 runtime + thread 2.8-branch +
tclvfs + parsed-totals core-test gate with its own dispositioned
baseline. Records expected differences (no zipfs, entry-point/bundled
lib divergences, no tcl::process).
- G-100: Tk 8.6 + tklib + tcllib/tcllibc via critcl on the 8.6 runtime +
punkshell runtests census against a native 8.6 kit baseline.
- G-101: kit container strategy without zipfs (metakit/tclkit lineage vs
cookfs vs zipvfs boot; TEMP_REFERENCE/metakit + KitCreator guidance) -
separated so the well-understood ports stay incrementally landable.
Sequencing recorded in each goal: recommendation is to close G-096's
remainder and run the punk905_beta trial to promotion before activating
the 8.6 arc, so shared suite scaffolding settles before it is forked.
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Under punk91/punk902z/punk905_beta, '-include-paths modules/punk/console/***
-jobs 16' failed all 7 files with zero tests run: child processes boot via
plain kit script dispatch, preloading kit-stamped punk packages
(punk::console 0.7.2) before the payload's src paths apply - the suites'
pinned 'require punk::console 999999.0a1.0-' then version-conflicts and
the child exits 1 (the known shadowing runtests already warned about).
Fix: when the host is a PUNK kit (kit container heuristics AND the
::punkboot namespace marker from punk_main.tcl boot) children launch as
'kitexe src child_test_runner.tcl ...' so they boot the project's src dev
modules - matching what the payload selects. Non-punk kit containers (e.g
tclsh90szip.exe: zipfs app mount, no punk boot) keep the old warning and
get no extra arg. runtests_run_child_process gains a required exemodeargs
param (tpool info args/body replication unaffected).
Tally: file-level failures are not test results, so a FAIL run could sit
beside 'Failed 0' unexplained (user report). The tally line now appends a
fail-coloured 'Testfiles-failed N' whenever testfiles failed.
Verification: console suites 71/71 under punk905_beta, punk91, punk902z
(previously 0 run / 7 files failed); native Tcl903 + suite tclsh90s
unchanged 71/71 with no modeargs; tclsh90szip warning path passes; tally
demo shows 'Total 0 ... Failed 0 Testfiles-failed 1'.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Copying ::punk::libunknown::epoch verbatim into a fresh interp/thread
carries per-epoch 'added' maps that drive zipfs_tclPkgUnknown's
can_skip_sourcing short-circuit - sound only in the interp that performed
the scans. Packages the donor obtained at an earlier epoch (or with no
unknown call: Thread is baked into thread::create'd threads) are absent
from the donor's current-epoch map, so recipients skip their pkgIndex
sourcing and requires fail where stock tclPkgUnknown would succeed.
Bit deterministically as repl_console_backend_tkconsole under the suite
9.0.5 runtime: 'package require Tk' bumps the epoch pre-init, the
codethread inherits the post-bump sparse map, the code interp then can't
find vfs/Thread/registry, its init aborts before the G-001 conredirect
junction vars exist, and the first pending-collect error left the repl
reader inactive until the driver failsafe. Tcl903 escaped only by an
accidental extra epoch bump in its code interp (fresh map, full rescan).
Fix: punk::lib::libunknown_epoch_export (PUNKARGS-documented) - epoch
record with every 'added' map emptied; counters/untracked/scripts/index
globs preserved. Used at all four propagation sites (interp_sync,
snapshot, repl %lib_epoch%, repl safe-arm). Hardening: the repl
pending-collect now tolerates missing junction vars so a code-interp init
failure can't wedge the reader.
Also: test socketpairs pinned to -myaddr 127.0.0.1 (all-interfaces
listens raised windows firewall consent popups for each newly built test
exe - user datapoint).
Verification: consolebackends 3/3 both runtimes (suite 42s->14s); full
runtests sweeps identical on suite runtime and Tcl903: 1037/1021/15/1
with the sole failure exec-14.3 (documented machine baseline). G-098
acceptance sweep met. Pre-existing PUNK_TEST_TK opt-in quirk noted in the
goal (silent early end, both runtimes, out of scope).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New src/vfs/punk9wintk905_beta.vfs modelled on punk9wintk903.vfs: suite-built
tk9.0/tklib0.9/tcllib2.0/tcllibc/thread3.0.1/vfs1.4.2 payload (tk + thread
dlls in bin/ per the ../../bin pkgIndex convention; tclvfs dll rides inside
vfs1.4.2 - vfs.tcl loads from $::vfs::self), plus twapi5.0.2 + sqlite3.51.0
carried over from the 903 vfs for basic human trial. tcludp deliberately
omitted (one vendorlib_vfs.toml target line away if -teelog trials wanted).
Runtime = _build/suite_tcl90/out/bin/tclsh90szip.exe copied (untracked) to
bin/runtime/win32-x86_64/tclsh905_beta.exe - static tclsh 9.0.5 with the
tcl library in its attached zip; the zip wrap merge_overs that into the kit
so tcl_library survives (same mechanism as tclsh902z->punk902z).
Built with 'make.tcl vfs -confirm 0': punk905_beta.exe INSTALLED; kit smoke
passes - Thread/vfs/vfs::zip/sqlite3/twapi/tcllibc(md5 C-accelerated)/tk
9.0.2 all load with functional pokes, punk boot machinery active.
Beta-kit policy recorded in mapvfs.config + goal: wrap fresh suite runtimes
as *_beta kits even before punk tests pass, for early interactive trial.
Future noted: 'make.tcl vfs <kitname>' single-kit build + configured-kit
listing; move tclvfs/thread into the runtime-attached zip.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
suite.tcl 'test' is now a gate: full tcltest output logged, totals parsed
(all.tcl's exit code does not reflect failures), failed test names compared
against expected_test_failures.txt - unexplained failures fail the action;
stale baseline entries are noted on full runs. Totals on core-9-0-branch
9.0.5 / zig 0.16.0: 67281 run / 55835 passed / 11435 skipped / 11 failed,
GATE PASS, deterministic across two full runs. The 11 are dispositioned in
the baseline: 6 fCmd (OS username vs profile-dir machine trait), 2 filename
(admin-share self-globbing), 2 safe-stock (install-layout accessPath
tokens), 1 console-bug-f10d91c2 (powershell driver yields empty result in
batch context; semantics verified independently by G-076 kill procedure).
Runtime package plumbing gaps closed (built artifacts without install
wiring): thread pkgIndex generated (lib/thread3.0.1 -> bin dll), registry
dll install artifact hooked to install-libraries (was orphaned - registry
1.3.7 + dde 1.4.6 now load), tclvfs script package installed with vfs.tcl
+ pkgIndex.tcl generated from .in templates (vfs 1.4.2 + vfs::zip 1.0.4).
punkshell runtests under the suite runtime: checkbugs 5/5, opunk
backends.test PASS (Tk-widget console suite runs unskipped on the
suite-built Tk), repl consolebackends 2/3 - repl_console_backend_tkconsole
open (code-interp console_pending_out junction init missing; DRIVER-DONE
timeout-failsafe).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
tcllib pure side via its own installer (explicit -pkg-path; driver now unsets
TCLLIBPATH/TCL_LIBRARY/TK_LIBRARY for hermetic child shells after the default
libdir followed inherited TCLLIBPATH to C:/TCLPKGS - additive pollution
verified and removed). install-libraries now installs the whole tcl library
tree (its own pkgIndex references msgcat/opt/... subdirs the piecemeal
install missed). critcl pinned 3.3.1 (git) + tracked critcl_zig.config
(zig cc -target x86_64-windows-gnu); driver replicates sak's direct critcl
invocation over the 21 declared files -> tcllibc.dll at out/lib/tcllibc
(provide 2.0). Evidence: md5 accel(critcl)=1; sha1 5MB critcl 12.3ms vs
pure 3.06s (~248x) - the punkcheck hashing pain quantified and fixed.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Installer behaviour checked first per user caveat: module exclusions,
app-script generation, doc options, and the aggregating top-level
pkgIndex.tcl (gen_main_index) - not a straight copy; critcl DSL stubbed to
no-ops (pure-tcl). Driver runs it with the suite-built tclsh in batch mode,
packages only, landing out/lib/tklib0.9. Smoke: package require Tk +
tooltip -> 2.0.4 in the suite shell.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Per user direction and draft refinements 2026-07-20: matching tklib alongside
Tk (pure-tcl, own installer.tcl where it does more than straight copy);
tcllib installed via its installer machinery (installer.tcl/sak.tcl checked
for non-copy behaviour) with critcl-built tcllibc driving zig cc; the
totals-parsing test gate owns the 72-failure triage. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The build016 experiment port lands in the tracked recipe (root_module/
createModule creation, addLibrary+linkage, .root_module.* method sweep,
linkSystemLibrary options arg, array_list.Managed, Io.Dir dir-walks with
b.graph.io, wrapfiletofile ported to the 0.16 entry/Io idiom). 0.14 support
deprecated per user direction; 0.14.1 remains archived on punkbin. Verified
on the pinned default (bin/tools/zig-x86_64-windows-0.16.0): build PASS,
shells 9.0.5, tcl-test parity 557/357/200/0 identical to the 0.14.1 build.
punk-getzig payload pins -> 0.16.0 (windows zip + linux tarball), re-wrapped
checkfile ERROR-free, ps1 twin refreshed. punkbin commit 54714d7 holds the
0.16.0 archive; push pending gitea recovery (server currently 500s).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Recipe: b.host -> b.graph.host; redundant second UNICODE tclMain add into the
objs lib removed; exe's ansi tclMain compiled with -UUNICODE -U_UNICODE
-DTCL_ASCII_MAIN (zig cc windows-default defines made it a duplicate UNICODE
compile under 0.14.1 - lld duplicate Tcl_MainExW/commons). Driver: per-item
recipe staging, per-zig-version local caches (.zig-cache-<ver>; caches must
not be shared across zig versions), zig resolution -zig > PUNK_ZIG > pinned
bin/tools/zig-x86_64-windows-0.14.1 > PATH. Verified: PASS on 0.14.1 AND
regression PASS on 0.14.0-dev.2074; pinned-default no-option run PASS.
Pinned archive minisign-verified and published to punkbin (abcd87c).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
First real buildsuite: build905.zig (verbatim G-076-validated recipe) +
helper modules + tools, driven by suite.tcl which stages the recipe into
src/buildsuites/_build/suite_tcl90, arranges sources (tcl fossil
core-9-0-branch --nested with FOSSIL_HOME isolation; thread/tclvfs trunk;
zlib from the tcl tree's compat/zlib; vqtcl from a local dir), generates the
configure-products fresh checkouts lack (tclUuid.h, tclsh.exe.manifest,
thread.rc include), builds and smoke-tests. Verified PASS: static + zip
shells report 9.0.5 (checkout 1a9c3b9d96), Thread 3.0.1 builds from current
trunk (new generated-include fix in build_tclthread) and loads. The 2024
TCLSH_PIPEREPL/tclZipfs/tclCmdIL patches are now tracked under
suite_tcl90/patches with a semantics README (not applied by default builds).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Sweep: G-096 detail and the punk::lib gate comment now point at the archived
path with achieved phrasing. goals_lint clean (72 active, 25 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com