Builds a Tcl 8.6.18 windows runtime from core-8-6-branch sources with the
pinned zig 0.16.0 toolchain only (no MS toolchain), forked from suite_tcl90
(duplication-with-a-note posture). Products (stock threaded-release naming -
rules.vc keeps the 't' SUFX on 8.6):
bin/tcl86t.dll + tcl86t.lib shared core (static zlib compiled in; no zlib1.dll)
bin/tclsh86ts.exe static shell (kit-class; dde/registry static)
bin/tclsh86t.exe dynamic shell against the dll
lib/libtclstub86.a stub lib for extensions
lib/tcl8.6/... script library tree (dde/reg dlls inside)
lib/tcl8/{8.5,8.6}/... tm modules; lib/thread2.8.13, lib/vfs1.4.2
Companions: thread 2.8.13 (thread2813t.dll, TEA installed shape from the
checkout's own pkgIndex.tcl.in) and tclvfs 1.4.2 (vfs142t.dll) build and load;
registry 1.3.5 / dde 1.4.6. No zipfs in 8.6 - exe+dll+on-disk lib tree only,
resolved hermetically (exe/dll-relative, TCLLIBPATH/TCL_LIBRARY unset in all
child runs).
Recipe: build86.zig + build_common.zig + build_zlib86/build_tclthread86/
build_tclvfs86 helpers; tools/ and src/main.zig copied verbatim (suite-agnostic).
Two load-bearing 8.6 findings recorded in the README DERIVATION and recipe
comments: MP_FIXED_CUTOFFS (the in-core libtommath ships no bn_cutoffs.c) and
TCL_BROKEN_MAINARGS + console subsystem for the gcc-class main() entry.
Test gates (suite.tcl test -> zig build test-gate/test-libraries) parse all.tcl
totals (exit codes untrusted) and gate against tracked dispositioned baselines.
First census + two-consecutive-run deterministic PASS (machine SuperBee):
core 46525 run / 2 failed (filename-16.12/16.13 admin-share self-globbing)
thread 142 run / 0 failed (empty baseline)
tclvfs 51 run / 2 failed (vfsUrl-1.2/2.1 external ftp.tcl.tk dependency)
Goal flipped to achieved 2026-07-26 and archived; reference sweep updated G-005,
G-100 (now unblocked), G-101 and ARCHITECTURE.md. No project-version bump
(arm's-length build tooling, not shipped shell behaviour).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation gated on the G-112 rename core + G-104 contract (both achieved
today); score re-run recorded. First increment:
- suite_tcl86/: sources.config (source + self-description records - lists and
describes itself via 'make.tcl buildsuite list/info' with no make.tcl
edits), suite.tcl fork (folder-derived naming, {tcl tclthread tclvfs}
requireds, build86.zig recipe file), build86.zig pending-derivation skeleton
(staging succeeds, recipe fails with a clear message), build.zig.zon with
real zig-fetch hashes, README with the DERIVATION record.
- Thread 2.8 selection: thread-2-8-branch @ e14fa771ae (tagged thread-2-8-13,
2.8.13); configure.ac TCL_MAJOR_VERSION==8 guard confirms the pairing.
- 8.6 source records in BOTH flows: dev refs (core-8-6-branch -> tcl86,
thread-2-8-branch, tclvfs trunk 1.4.2-era) + zon per-checkin pins
(tcl 1d1d5cbd91 = 8.6.18 era).
- First staging run through 'make.tcl buildsuite build suite_tcl86' (a real
driver run through the G-104 surface): checkouts staged from the shared
hermetic store, TCL_PATCH_LEVEL 8.6.18 read from the tree.
- makefile.vc derivation findings recorded incl. two Context corrections:
8.6.18 DOES generate tclUuid.h; zlib is prebuilt-import in stock nmake
(zig-only recipe will compile compat/zlib statically).
Core-test census + baseline deliberately pending until a built tclsh86 exists
(recorded in Progress).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
buildsuite group added as a declared passthrough (punk::args + fallback paths):
list discovers suites (dirs carrying suite.tcl; _build excluded), info renders
the manifest-derived detail, build forwards driver args untouched streaming
output and exiting with the driver's status (punk-kit-hosted runs launch the
driver via the kit's script subcommand, selected by the G-058 marker).
Self-description = manifest option: sources.config gains description/product/
doc/zigpin records parsed by both suite.tcl (strict; pinned-zig default now
reads zigpin - one source of truth) and make.tcl (tolerant). suite_tcl90
seeded with its records. Copied trees appear automatically (verified with a
throwaway copy). Contract documented in new src/buildsuites/README.md +
AGENTS.md, indexed from src/AGENTS.md. CHANGELOG extended under 0.23.0.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance evidence in the archived detail file: embed verified in all three
family members (family_check), sidecar derived from embed with identical
build_id, 'info' identifies sidecar-paired/renamed-stray/pre-v1 files without
execution and flags doctored-sidecar disagreements, punkbin AGENTS.md schema
docs, roundtrip pin green, record survives make.tcl kit wrapping (punk9_beta
reads its runtime's r2 record in-kit), r2 re-emitted with full v1 records.
Sweep: achieved markers in G-025/G-057/G-108/G-116/G-118/G-119 (G-025's
survival expectation updated to confirmed). tclshcmd.test pins
::tclsh(reopened) publication on the rebuilt patched kits (G-118 items 1+7
landed+verified; Progress updated). build905.zig: packager git-identity leg
judges success by output not out_code (resolved 'unrecorded' on this host -
effective at next emission).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
family_artifacts.tcl: reads the embedded record back out of each finished kit
(exec with a piped //zipfs:/app/punkbin-artifact.toml reader - another
executes-self-contained proof), verifies it against the invocation (schema/
name/variant/working_name/revision/target/tcl_patchlevel/batteries - stale-
staging tripwire), and derives the sidecar's identity fields from it
(build_id/origin/packager/project/project_url/license/build_host_platform -
identical build_id by construction). Sidecar carries schema = 1, '#' comments
on the non-obvious fields, and keeps sha1/size/built as its finished-binary
additions.
family_check.tcl: new embedrecord probe (record exists in the attached image;
schema/variant/patchlevel/working_name/piperepl/batteries MATCH probed facts;
v1 fields present; -expectrev asserts revision + the -r<N> artifact name) and
the gate probe now asserts ::tclsh(reopened) publication (0 at gate-open
start, absent on plain/opt-out - G-118 item 7 patch-rev verification).
build905.zig passes -expectrev; configure-compiles clean, both tools parse.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
In-source rev of tclMain_piperepl_905.c, effective at the next suite rebuild
(the G-117 cycle): the '? reopen stdin from console' notice prints only when
TCLSH_PIPEREPL_DEBUG is set truthy; all reopen-path messages (gated notice +
genuine failure messages) move from stdout to stderr; ::tclsh(reopened)
published as an unlinked fact (0 at gate-open startup, republished 1 after a
successful console reopen). 2024-era artifacts (tclMain_piperepl.c, .patch)
stay unmodified per the recovery policy.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- new punkexe suite (17 tests): dispatch contract (script-arg argv0/argv/
info-script state, honest exit codes, piped no-arg eval, stock arg forms,
lib: refusal) plus the piperepl launch-state contract on patched kits
(istty/dorepl/evalinput published, piped script-arg state all-zero,
unconsumed-piped-input safety default, evalinput opt-in ordering, script
consuming stdin itself) and the unpatched degraded-mode notice
- hang rule baked in: no test or fixture may set ::tclsh(dorepl) (the
console-reopen path blocks under a piped harness; G-106-recipe territory)
- patched-kit resolution: env PUNK_PIPEREPL_TEST_EXE, else the punkexe if it
probes patched, else bin/punk9_beta.exe / punk9bi_beta.exe
- encoding coverage is byte-level (utf-8 vs iso8859-1 fixture; [format %c 233]
keeps the .test file pure ascii, runner-encoding-proof)
- patches/README.md: corrected the tcl_interactive divergence note (console
script-arg runs READ 1 where stock reads 0 - piped launches identical; the
early link stays load-bearing for the piped prompt opt-in) and recorded the
'? reopen stdin from console' stdout residue as known
- shell/AGENTS.md: tclshcmd bullet; stale runtime.bash names corrected to
punk-runtime.bash/punk-runtime.cmd
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User direction: the BAWT-shipped tclvfs 1.5.0 comes from the forTcl9
branch of the same core.tcl-lang.org/tclvfs repo our trunk ref trailed
at 1.4.2 - tcl9 suites move to it (a future suite_tcl86 keeps trunk;
recorded in sources.config). Both flows updated: sources.config ref +
build.zig.zon per-checkin tarball pin (75a2672991).
build_tclvfs_shared.zig gets the G-107 derivation treatment: every
version-derived name (package dir, dlls, rc fields, configured
vfs.tcl/pkgIndex.tcl) now follows the checkout's AC_INIT via
versionInfo() - the hardcoded 1.4.2 was the same stamped-mismatch class
as the thread 3.0.1 case. build905 consumers use the derived info
(szip staging, family staging, family_check args, artifact metadata).
forTcl9 build glue: export guard is now lowercase BUILD_vfs;
HAVE_SYS_STAT_H defined; and an include-order shim TU works around
zig's mingw headers defining __stat64 as a MACRO for _stat64 - tcl.h's
'typedef struct __stat64 Tcl_StatBuf' parsed before <sys/stat.h> binds
a forever-incomplete tag and forTcl9's direct Tcl_StatBuf field access
fails (MSVC has a real tag; upstream never sees this; -include trips
zig cc CacheCheckFailed, hence the generated-TU overlay).
Verification: all three family members PASS self-containment with vfs
1.5.0 incl the functional zip-mount round-trip; tclvfs test gate PASS
51/42/9/0 twice-deterministic - the branch CLEARED the whole 1.4.2-era
baseline (glob-nomatch drift entries now pass, network vfsFtp/vfsUrl
now skip) - baseline re-established empty. familyrev default bumped to
2 (r1 published+immutable; r2 emitted locally + staged to the runtime
store; r2 publication is a user decision). Wrapped kits confirm the
resolution skew the user found is gone: punk9bi_beta script-mode
'package require vfs' now 1.5.0 (boot loads the runtime's copy - both
tiers now agree).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The published r1 artifact metadata recorded 'unrecorded' checkout uuids
for tclvfs/tcllib/tklib: fossil only writes manifest.uuid when the
REPOSITORY enables the versioned 'manifest' setting, which those
upstreams do not (tcl/tk/thread do). The checkout-scoped setting is
ours to control: 'fossil settings manifest u' materializes manifest.uuid
immediately and keeps it current across updates - now applied
idempotently to every staged checkout on each build. Verified on the
live stage (tclvfs f082c47f, tcllib c784f6fd, tklib 2d53beaf now
recorded); future emissions carry full provenance (r1 stays immutable
as published). Zon-flow tarballs share the upstream limitation - their
checkin uuids are derivable from the per-checkin pin URLs; recorded in
the comment as the not-yet-wired follow-up.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
suite_tcl90 now assembles and verifies the G-103 family as part of the
default pipeline:
- kit-family: two staging trees (core, bi) wrap into working-name products
tclsh9.0.5.exe / tclsh9.0.5-punk.exe / tclsh9.0.5-punk-bi.exe under
out/family. Attached image mirrors the installed prefix - tcl_library/ at
the app root (stock C-boot position, no main.tcl - falls through to the
interactive shell), tm tree at tcl9/<ver>, batteries under lib/ with their
installed-shape pkgIndexes (../../bin -> /app/bin), dlls under bin/, plus a
one-line stock pkgIndex hook at lib/pkgIndex.tcl extending auto_path (the
tclPkgUnknown mid-scan growth mechanism tcllib's own index uses).
- tools/family_check.tcl: per-member self-containment verification from a
scratch dir with scrubbed env - patchlevel, zipfs tcl_library, tzdata/
encodings, attached tm modules, functional Thread (cross-thread eval), vfs
zip-mount round-trip, tcllib md5 + tcllibc accel engaged, piperepl
default-ON/opt-out per variant (::tclsh(istty) discriminator), Tk
create/destroy + tklib for bi. All three members PASS.
- kit-family-artifacts + tools/family_artifacts.tcl: punkbin-layout emission
(immutable -r<N> names via -Dfamilyrev, per-artifact toml metadata with
variant/sha1/versions/provenance/G-107 evidence, sha1sums.txt), run UNDER
the plain family kit itself. punkbin publication stays a user step.
- build_tclthread/build_tk return pkgidx+version facts; tclvfs configured
package generation shared between prefix install and family staging;
tm-module install list single-sourced; manifestUuid helper tolerates
repos without the fossil manifest setting.
- consumers: mapvfs.config entries punk9_beta (punk + punk9wintk905.vfs) and
punk9bi_beta (punk-bi + punk9win_for_tkruntime.vfs); working names copied
to bin/runtime/win32-x86_64 (untracked). src/runtime/AGENTS.md stale
runtime.cmd references updated to punk-runtime (G-097).
Full pipeline suite.tcl build PASS end-to-end; verification evidence
recorded in the goal Progress section. Remaining: punk-runtime list/use
metadata surfacing, kit-wrap trial of the new mapvfs entries.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
The external libraries the suite builds and ships now run their own
testsuites under the suite-built shell as named recipe steps - evidence for
the exact zig-built combinations nobody upstream tests.
tools/test_gate.tcl generalized into the shared engine: -mode gate|record
(gate = parsed totals diffed against the tracked dispositioned baseline,
the core-gate mechanism; record = run must complete, failures recorded not
fatal), -driver selection (tcllib-family trees run via their own
support/devel/all.tcl - sak's underlying driver, standard aggregate totals,
per-file child interps), -summaryfile/-library line-record evidence
summaries for the G-103 artifact-metadata consumer (shape documented in the
goal detail file), file-error evidence capture (@+ blocks, runAllTests
error-exit sections). A run with no parseable totals FAILS the step in
every mode - infrastructure breakage must never masquerade as recorded
results. Core gate semantics unchanged; the core gate step now also writes
out/testreports/tclcore.summary.
build905.zig: steps test-thread test-tclvfs test-tcllib test-tklib test-tk
+ composite test-libraries (tk excluded - opt-in: interactive desktop, maps
windows, tens of minutes; intended before publishing bi-family artifacts).
Per-library -Dtestpolicy-<lib>=gate|record|skip and -Dtestargs-<lib>
invocation overrides - no recipe edits needed. Baselines staged in both
flows (suite.tcl item list + bootstrap recipe_items).
suite.tcl: test action takes -steps (default test-gate) and a -zigargs
passthrough (both actions); passes -j1 so combined test invocations
serialize (zig runs independent steps concurrently; thread's suite is
timing-sensitive).
Census results (suite tclsh90s.exe 9.0.5, zig 0.16.0): thread 143/0 failed,
EMPTY baseline, GATE PASS x3 identical consecutive runs; tclvfs 51/7
failed, all dispositioned (3x tcl9 glob-nomatch semantics through vfs
handlers, 4x dead-FTP network tests), GATE PASS x3 identical; tcllib WITH
tcllibc accelerators engaged (E tcllibc markers, crc32-critcl-* variants
running) RECORDED 62328/54 failed; tklib RECORDED 796/18 failed (widgetPlus
drift under Tk 9). No-totals failure path verified in both modes.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Found by G-107's first library-test census: build_tclthread.zig compiled
thread trunk 3.0.7 sources with -DPACKAGE_VERSION="3.0.1", so the dll
self-reported the wrong version, and the pkgIndex declared only capital-T
Thread 3.0.1 - the thread testsuite's 'package require -exact thread 3.0.7'
could never load the package (nothing previously load-tested thread at all).
The version now derives from the tree's AC_INIT (new build_common helpers
acInitVersion/stripChars) and flows into every version-derived name: dll
tcl9thread<nodots>.dll, install dir lib/thread<version>, PACKAGE_VERSION/
PACKAGE_STRING defines, rc resource fields, and a pkgIndex declaring BOTH
'Thread' and 'thread' (threadCmd.c provides both; the testsuite requires
lowercase, existing punkshell consumers the capitalized name). Dead
zip-related consts riding the stale version removed.
Note for the next kit/vfs refresh: the punk905 kit payload
(src/vfs/punk9wintk905.vfs/lib_tcl9/thread3.0.1/) still carries the old
self-consistent 3.0.1-stamped copy - refresh to the derived naming then.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The five decorative 'echo --Installing package X--' addSystemCommand steps
(2024-era) spawned 'echo' as a program - a cmd BUILTIN that only resolved when
a coreutils echo.exe happened to be on PATH. In the PATH-scrubbed bootstrap
environment the spawns failed and took the tm installs, install-libraries and
(transitively) make-zipfs down with them - the reason the zip-wrapped shells
never landed in scrubbed composite runs while every package step was green.
zig's own step reporting makes the banners redundant.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Three deltas surfaced by the PATH-scrubbed clean-checkout demonstration:
- build.zig: default-entry re-export of build905.zig's build so the documented
plain 'zig build stage|bootstrap' works from the tracked suite dir (the
recipe keeps its versioned filename; staged flows still invoke it via
--build-file).
- critcl_zig.config + recipe: settings move under an EXPLICIT target
(win32-x86_64-zig) and the tcllibc step passes -target win32-x86_64-zig.
critcl otherwise chooses its build target by probing PATH for compilers -
with a gcc visible the config defaults engaged (why G-098's flow worked),
but the scrubbed environment fell back to critcl's builtin msvc 'cl'
target and all 25 accelerator modules failed with "couldn't execute cl".
Verified green in BOTH environments (scrubbed and normal PATH).
- build905.zig comptime gate: the stale 0.13-dev minimum becomes the actual
suite pin (0.16.0) with a message pointing at punk-getzig and the README
(acceptance: the recipe records the zig version it is written against).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The whole pipeline now lives in the zig recipe; Tcl remains the tool exactly
where a tclsh is guaranteed to exist - run by the FRESHLY BUILT suite shell
as build steps:
- New steps (native-host builds): smoke (static shell patchlevel; zip shell
patchlevel + attached tzdata/autoload), tklib / tcllib (their own installers,
batch, -pkg-path as a cached output dir installed into the prefix, + package
smokes incl withdrawn-Tk tooltip), tcllibc (critcl driving zig cc via the
tracked critcl_zig.config, module list parsed from tcllib's version.tcl,
pinned-zig dir prepended to PATH, + accel smoke), test-gate (tools/
test_gate.tcl - the parsed-totals gate vs expected_test_failures.txt,
-Dtestargs passthrough).
- Package landing moves into the recipe proper: thread pkgIndex.tcl
(build_tclthread), tk pkgIndex.tcl (build_tk), and the tclvfs script package
incl .in-template substitution + dll (build_tclvfs_shared
install_tclvfs_package) - all hooked to the install step.
- Step scripts: tools/test_gate.tcl, tools/suite_smoke.tcl, tools/pkg_smoke.tcl
(run under the built shell; assertions live in Tcl).
- Two windows-childproofing findings encoded: built-shell Runs execute the
CACHED artifact (no ../lib/tcl9.0 beside it) so each such Run gets
TCL_LIBRARY pointed at the source tree's script library (the zip smoke
deliberately excluded - its attached library is the thing under test); and
cached (non-side-effect) Runs spawn with stdout IGNORED, leaving the tcl
child without a stdout channel ('can not find channel named "stdout"',
critcl's logging) - such runs capture stdout to give the child a real pipe
while keeping caching.
- suite.tcl: thinned to the fossil dev flow - fetch live checkouts (git kind
now handled in the main loop for critcl's pin), stage the recipe, delegate
to the staged steps (run_zig_steps; 'test' delegates to test-gate). Default
-steps and the bootstrap default grow to the full pipeline short of
test-gate. critcl_zig.config + expected_test_failures.txt join both staging
lists. Docs updated (README two-flow section, sources.config two-surface
header, overlay section); .gitignore learns .zig-cache/ and zig-pkg/ (zig
0.16 extracts fetched packages into zig-pkg/ beside the manifest).
Verified (fossil flow): full pipeline PASS - suite_smoke static+zip, tklib
tooltip:2.0.4 under withdrawn Tk, tcllib md5/sha1/cmdline, tcllibc:2.0 with
md5-critcl-accel:1; 'suite.tcl test -testargs {-file http.test}' delegates to
the gate step (528/519/9/0 GATE PASS).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
suite_tcl90 gains the no-tclsh source path:
- build.zig.zon: content-hashed manifest pinning each source as a fossil
per-checkin tarball (tcl 1a9c3b9d96 / thread caa1d3aa30 / tclvfs f082c47f9b
/ tk effef6c657 / tklib 2d53beafc0 / tcllib c784f6fda4 - the exact checkouts
the promoted punk905 runtime was built from) plus critcl 3.3.1 as a github
archive. All lazy: the fossil dev flow never triggers a fetch. Refresh =
bump a pin (zig fetch --save). Verified honored under --build-file
build905.zig.
- build905.zig mode split: from the staged recipe copy the full graph
registers as before; from the TRACKED suite dir (sources.config present,
no ../tcl905) only the staging steps register. 'zig build stage'
materializes pinned sources + a recipe copy into ../_build/<suite> (the
same layout suite.tcl's fossil staging produces - both flows share the
staged invocation, and the stage dir derives from the suite folder name so
copy-and-tweak isolation holds). 'zig build bootstrap' chains the staged
build: nested zig invocation with suite.tcl-parity cwd (parts of the
recipe resolve sources cwd-relative), forward-slash prefix (the prefix
flows into -DTCL_PACKAGE_PATH as a C string literal - backslashes broke
the stubs compile), per-zig-version shared cache dir, hermetic-child env
scrub, ReleaseFast default.
- tools/stagetree.zig: host-compiled materializer. Pinned mode keys a
.stage-materialized marker on the dependency's content-addressed cache
path (pin bump = invalidation, stale trees deleted so orphans cannot
survive); always-mode for recipe items; fossil/git checkouts at the
destination are never touched (tested).
Verified: 'zig build stage' against the fossil-populated stage refreshes
only the recipe copy (checkouts untouched, fossil changes empty); a full
copy-and-tweak suite copy (suite_tcl90zt) ran 'zig build bootstrap' from
nothing but the tracked tree + pinned zig - all 7 sources fetched/staged
from the manifest, all four shells built; tcl::build-info reports the same
9.0.5+1a9c3b9d... as the fossil-flow build and the zip shell boots its
attached library (tzdata + autoload).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Generation of the configure-products a fresh checkout lacks moves from
suite.tcl tree-writes into the zig recipe as build-cache overlays:
- tclUuid.h / tkUuid.h / threadUuid.h: wrapfiletofile Run outputs consumed
via overlay include dirs added FIRST per module (stale tree copies from
pre-G-102 flows can never shadow; the LazyPath also carries the step dep).
The unused addUpdateSourceFiles tree-write variants (build905 prepare-source,
build_tclthread) are removed.
- tclsh.exe.manifest: configure-time substitution (tcl.h parsed by the new
build_common.zig helpers); tclsh.rc compiled from an overlay COPY beside the
generated manifest because rc resource references resolve rc-file-relative
before include paths. Both tclsh exes switch to .include_paths LazyPaths.
- wish.exe.manifest: overlay dir first in tk.rc include_paths (RT_MANIFEST
resolves through rc include paths - the arrangement the tk build already
relied on). tk.rc itself stays tree-compiled (lives in win/rc, no stale risk).
- thread.rc: compiled from an overlay copy with the tcl.h include inserted
(the historical checkout edit is normalized if a mutated tree is staged);
the staged tclthread checkout's thread.rc edit has been fossil-reverted.
- build905.zig: redundant configure-time top-level library install loop
removed (install_library_tree already covers it); dead zlib stage copy and
the suite.tcl generation blocks removed (read-only version parsing kept for
smokes/logging).
Verified: full staged-mode rebuild PASS (all smokes incl tklib/tcllib/tcllibc);
built binaries carry the overlay products (tcl::build-info reports
9.0.5+1a9c3b9d..., tclsh manifest version 9.0.2.905, tk dll manifest + tk
checkout uuid, thread dll uuid; thread dll's empty FileVersion matches the
pre-change binary - upstream quirk). Source checkouts stay pristine (fossil
changes empty). Core test gate: 69783 run, 12 failed - 11 baselined plus
http-4.14.2, a network-timing flake that passes on isolated rerun (528/519/9/0).
tclsh90sprzip.exe install into out/bin is currently blocked by an open user
application holding the file; the product builds identically into the zig
cache and installs on next run once released.
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
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 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
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
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
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
vqtcl was an old-tclkit experiment with no confirmed public upstream - wiring,
helper module, staging and docs removed (future tclkit work: TEMP_REFERENCE/
metakit + KitCreator). New 'test' action runs tests/all.tcl on the suite-built
static shell with -testargs passthrough; verified assocd/util/lindex: 557 run,
357 passed, 200 constraint-skipped (no C test commands in a release shell),
0 failed. install-libraries tm filenames synced to the tree's provided
versions (tcltest-2.5.11, http-2.10.2, platform-1.1.1) - the 2024-era names
made 'package require tcltest' fail on a filename/provide version conflict.
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
Blanket /src/buildsuites ignores removed from .gitignore and
.fossil-settings/ignore-glob; retired /vendorbuilds/ ignores removed with
them. src/buildsuites/_build remains ignored via the existing _build globs.
samplesuite1 sketch marked as such, buildprefix moved to the _build
convention (vendorbuild concept retired per user decision 2026-07-20).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com