# G-100 suite_tcl86 dependency set: Tk 8.6 + tklib, tcllib with critcl accelerators, punkshell runtests on the 8.6 runtime Status: achieved 2026-07-26 Scope: src/buildsuites/suite_tcl86/ (recipe extensions, driver steps); src/buildsuites/_build/ (tk/tklib/tcllib/critcl sources and outputs); bin/tools/ (pinned zig as consumed); src/tests/ (punkshell suites exercised against the suite-built 8.6 runtime) Goal: suite_tcl86 builds/installs the remaining runtime pieces punkshell's Tcl 8 testing depends on - Tk from fossil core-8-6-branch loadable by the suite's 8.6 windows runtime together with a matching tklib (installer.tcl where it does more than a straight copy), and tcllib installed via its documented installer machinery WITH its critcl-built C accelerators (tcllibc; critcl driving zig cc, bootstrapped by the suite-built tclsh86 - no MS toolchain) - and punkshell's own runtests runs against the suite-built 8.6 runtime with Tk-dependent suites unskipped. Acceptance: from the pinned zig and fetched sources the suite produces a Tk 8.6 the suite tclsh loads (package require Tk with a create/destroy-window verification recorded here) and a matching tklib whose packages resolve (a representative require recorded); a tcllib install via its installer whose accelerators load (package require tcllibc) with the accelerated-vs-pure comparison recorded; punkshell runtests runs against the suite 8.6 runtime and its census is recorded here against a same-day native/kit 8.6 baseline run (same include set), with every difference dispositioned - Tk-dependent suites run unskipped, and any 8.6-runtime-only failures are root-caused or baselined with reasons. ## Context Mirror of G-098 (suite_tcl90 dependency set, achieved 2026-07-20) for the 8.6 arc. Depends on G-099 (suite_tcl86 core buildsuite) - ACHIEVED 2026-07-26 (see goals/archive/G-099-suite-tcl86-buildsuite.md); the 8.6 runtime (tclsh86ts/ tclsh86t + tcl86t.dll + installed lib tree), thread 2.8.13, tclvfs 1.4.2 and the core/thread/tclvfs test-gate this goal extends now exist, so the dependency is met and G-100 is unblocked. 8.6-specific expectations (verify at activation): - Tk core-8-6-branch pairs with the 8.6 runtime; the 9.0 build_tk zig module was derived from tk9 makefile.vc object lists - the 8.6 lists/xlib arrangement differ, so expect a re-derivation rather than reuse. - tcllib trunk supports 8.5+; the same vendored critcl mechanism applies, with critcl driven by the suite tclsh86. tcllibc built per-generation (the punk9wintk903 vfs precedent carries tcl8/tcl9 tcllibc side by side under lib_tcl8/lib_tcl9). - runtests under 8.6: no tcl::process, so -jobs child spawning falls back to blocking execs which CONVOY on windows (documented) - run -singleproc 1 or accept serialized child walls for the census run; record which mode produced the census. - Census baseline: compare against the punk86-class kit runtime results on the same day/include-set (forward-slash path conventions on 8.6 kits noted in project memory) rather than against the 9.x census. - The kit-child 'src' package_mode launch added to runtests for punk kits (G-098 increment 7) applies to 8.6 punk kits too - a plain suite tclsh86 host takes the native path. SEQUENCING: as for G-099 - proposed now, activation recommended after suite_tcl90's G-096 (achieved 2026-07-20) remainder closed and punk905_beta trial concludes. ## Progress ### 2026-07-26 activation + increment 1 (dependency set built, census taken) - ACTIVATED by the user. Sources wired into both flows: `sources.config` gains tk (`core-8-6-branch` -> dir `tk86`), tklib/tcllib (trunk) and critcl (git 3.3.1); `build.zig.zon` gains the matching pins - tk freshly `zig fetch`ed (checkin 9986fdc267, 2025-03-17 = Tk 8.6.17), tklib/tcllib/critcl re-fetched and verified BYTE-IDENTICAL to suite_tcl90's pins (generation-neutral upstreams; what differs per suite is the shell running the installers and the critcl target). suite.tcl gains git-source support + the new staging items; the bootstrap driver's `source_dirs`/`recipe_items` match. - TK 8.6 RE-DERIVED (`build_tk86/build_tk86.zig`) from the staged 8.6 `win/makefile.vc` + `rules.vc`, not ported from the 9.0 module - the goal Context's expectation held. Full derivation record in `src/buildsuites/suite_tcl86/README.md`; the load-bearing differences: no `tkPkgConfig.c` (so NO `CFG_*` defines at all), the TCL_MAJOR_VERSION==8 naming arm (`tk86t.dll`, `lib/tk8.6`), the `@TK_WIN_VERSION@` = `$(DOTVERSION).0.0` manifest substitution (not the tcl-style releaselevel formula), and an 8.6 object inventory without tkIcu/tkImgListFormat/tkImgSVGnano/tkWinGDI/tkWinIco/tkWinSysTray. Products: `bin/tk86t.dll` + `lib/tk86t.lib` + the `lib/tk8.6` script library + makefile-shaped `pkgIndex.tcl`. - TK ACCEPTANCE EVIDENCE (repeatable - `tools/tk_smoke.tcl` runs in the `smoke` step on every build, and a load-only check would pass with no usable display): `tk_smoke OK: Tk 8.6.17 (Ttk 8.6.17) windowingsystem win32 screen 3840x2160 depth 32 widgets Label/TButton/Toplevel create+map+destroy clean`. Both shells load it: `pkg_smoke OK: Thread:2.8.13 vfs:1.4.2 registry:1.3.5 dde:1.4.6 Tk:8.6.17` (static AND dynamic). - TKLIB via its OWN installer (batch, packages-only, explicit `-pkg-path` so the installer's tcl_pkgPath-derived default can never place files off-tree) -> `lib/tklib0.9`. Representative require recorded: `pkg_smoke OK: tooltip:2.0.4` - a Tk-DEPENDENT package resolving through the installer-generated aggregate pkgIndex. - TCLLIB 2.0 installed the same way (`md5:2.0.9 sha1:2.0.5 cmdline:1.5.3`), and TCLLIBC built by critcl 3.3.1 driving `zig cc` under the suite-built 8.6 shell (tracked `critcl_zig.config`, target pinned `win32-x86_64-zig` - critcl otherwise probes PATH and falls back to its builtin msvc target). Accelerator evidence, both on every build: `pkg_smoke OK: tcllibc:2.0 md5-critcl-accel:1` and the new `tools/accel_bench.tcl` - `accel_bench OK: sha1 over 4198400 bytes - critcl 5.9ms vs pure-tcl 2661.4ms = 452.3x (digests identical, sha1 2.0.5, tcllibc 2.0)`. The bench loads BOTH implementations via `::sha1::LoadAccelerator` and switches with `::sha1::SwitchTo`, so the comparison is in-process and the digests are compared rather than assumed. - TEST TIERS extended on the G-107 policy pattern: `test-tcllib` / `test-tklib` (record tier, inside `test-libraries`) and the OPT-IN `test-tk` (excluded from `test-libraries`; `winDialog.test`/`winMsgbox.test` excluded by default - their message-injection automation blocks on a human under a batch shell). - HERMETIC-ENVIRONMENT FINDING (see Notes): `TCL__TM_PATH` was never scrubbed, so the suite shells were silently preferring repo-built tm modules over the tcllib the suite had just installed. Fixed in all three scrub sites before the census was taken. #### punkshell runtests census (2026-07-26, both runs same day, same include set) Mode: DEFAULT single-process sequential (`-singleproc 1`; no `-jobs` - 8.6 has no `tcl::process`, so parallel child spawning re-convoys on windows, per the goal Context). Identical invocation for both runtimes, full source-tree suite, no include filter: ` src/tests/runtests.tcl -report json`. - BASELINE - native Tcl 8.6.17 (`C:/Users/sleek/AppData/Local/Apps/Tcl86`, which carries Tk 8.6.17, Thread 2.8.12, tcllibc 2.0, twapi): 101 files, Total 1003 / Passed 986 / Skipped 10 / Failed 7, 657s. Files failed: `core/tcl/.../exec.test` (ERROR `invalid command name "tcl::build-info"` - a 9-era core test under an 8.6 shell), `modules/punk/ns/.../nslist.test` (4), `modules/punk/ns/.../nsprimitives.test` (2 - the `:::odd` namespace-lookup class), `modules/punkcheck/.../concurrency.test` (1). - SUITE RUNTIME - `out/bin/tclsh86ts.exe` (8.6.18, this suite's static shell): 101 files, Total 1003 / Passed 987 / Skipped 10 / Failed 6, 601s. - DIFFERENCE SET (authoritative, `scriptlib/developer/runtests_parity.tcl`): exactly ONE - `punkcheck concurrency_two_writers_no_corruption` ERRORed in the BASELINE run and PASSED on the suite runtime. Every other per-file status, tally, failure identity, skip identity+reason and warning code is identical. DISPOSITION: flake under full-suite load, not a runtime difference - the file passes 6/6 in isolation on BOTH runtimes, twice each (verified same day). ZERO suite-runtime-only failures; nothing needed baselining. - TK-DEPENDENT SUITES RAN UNSKIPPED on the suite runtime: `modules/punk/repl/testsuites/repl/consolebackends.test` 3/3 PASS (its tkconsole backend drives a child repl on the suite-built Tk) and `modules/opunk/console/testsuites/console/backends.test` 7 passed / 1 skipped. That single skip is `backends_tkconsole_widget_size_and_eof`, whose `tkavailable` constraint requires the `PUNK_TEST_TK` OPT-IN env var (not Tk availability); it skips identically on the native baseline, and the opt-in's own pre-existing quirk is recorded in G-098's increment 6 notes. - Runtime-difference note (does not change any result): the suite runtime has no twapi, so its runs open with `is_interactive cannot detect console ... without twapi` and a `punk::du` slower-disk-operations warning that the native baseline (twapi present) does not print. #### library test tiers - first censuses (2026-07-26, suite tclsh86ts.exe 8.6.18) Beyond the acceptance text; run because the goal Context asks the G-107 policy-tier shape to follow for the new libraries. - thread (gate): 142 run / 126 passed / 16 skipped / 0 failed - GATE PASS (baseline still empty; constraint-driven skips only). - tklib (RECORD, new tier): 796 run / 684 passed / 112 skipped / 0 failed. Its Tk-dependent suites exercise the suite-built Tk, and nothing failed. - tcllib (RECORD, new tier): 64259 run / 61186 passed / 3032 skipped / 41 failed - names in `out/testreports/tcllib.summary`. Dominant classes: network-reaching suites (picoirc 20, httpd-proxy/cgi 4), installer/path assumptions (install-2.1/2.2, find-sf-*/find-4.0, multi/multiop-5.2), plus matrix-16.7/16.8, tar-add, uri-4.1, example-*, zipfile-encode-6.4/6.5. A record tier is evidence, not a gate criterion - no baseline is tracked and the step never fails the build on these. - tclvfs (gate): the tcllib install CHANGED this suite's census - vfsFtp-1.1.. 1.3 sit behind an `ftp` constraint that needs tcllib's ftp package (absent at the G-099 capture: 3 constraint skips), so they now RUN and reach the retired `ftp://ftp.tcl.tk`, the same external-service class already baselined for vfsUrl-1.2/2.1 (skips 8 -> 5 accordingly). `expected_test_failures_tclvfs.txt` extended with the three names and the cause; re-run confirms GATE PASS (51 run / 42 passed / 5 skipped / 4 failed, all baselined; vfsUrl-1.2 noted as a stale entry - which members of the family fail is network-timing dependent, so stale notes are expected and never fatal). Remains for acceptance: nothing - the four acceptance clauses (Tk loadable + create/destroy verification, matching tklib with a representative require, tcllib installed by its own machinery with loading accelerators and a recorded accelerated-vs-pure comparison, and a dispositioned runtests census against a same-day 8.6 baseline with Tk suites unskipped) are all recorded above. ## Notes - Hermetic-environment finding 2026-07-26 (fixed here, exposure recorded for suite_tcl90): `scrubTclEnv` cleared only TCLLIBPATH/TCL_LIBRARY/TK_LIBRARY, but `tm.tcl` also seeds module roots from `env(TCL__TM_PATH)` down through every lower minor. This machine points `TCL8_6_TM_PATH` at `C:/repo/jn/shellspy/modules` among others, so suite shells preferred a repo-built `sha1-2.0.4.tm` / `md5 2.0.8` over the tcllib 2.0.5 / 2.0.9 the suite had just installed - a census through such a shell measures the machine. Scrub list now covers `TCL8_0..8_7_TM_PATH` + `TCL9_0/9_1_TM_PATH` in the per-step scrub (`build_common.zig` `tcl_env_vars`), `suite.tcl`'s process-level unset and the bootstrap nested-build scrub. suite_tcl90 has the same exposure via `TCL9_0_TM_PATH` and was deliberately left untouched (out of this goal's scope) - worth a suite_tcl90-scoped fix. - zig 0.16 trap (recorded while pinning): `zig fetch ` resolves a BUILD ROOT before fetching, so it must be run from a directory containing a `build.zig`; from anywhere else it dies with the misleading "no build.zig file found, in the current directory or any parent directories". Also in the `build.zig.zon` header. - Activation freshness 2026-07-26: goals_xref.tcl score G-100 re-run at the proposed->active flip (user-directed activation). Top pairs G-105 / G-101 / G-116 / G-108 reviewed; the two that were only one-directional get the back-pointers below, G-116 was already recorded here, and the remaining hits are term noise - no new relationships. - Related: G-105 (buildsuite cross-target) - it names this arc as a target- dimension consumer; the tk/tklib/tcllib/critcl steps this goal adds must not preclude a per-target dimension (no per-target tree copies, per-target out prefixes). - Related: G-101 (8.6 kit container strategy) - the downstream consumer of this dependency set: whatever container it picks carries the Tk/tklib/tcllib/ tcllibc payload this goal produces. - Related: G-108 (debug buildsuite tier) - sibling suite-arc goal queued behind this arc; its -dbg/tcl::test variant pattern is suite_tcl90-scoped today. - G-116 relationship (recorded 2026-07-24 after overlap review): G-116's zig-built crypto-backend + static tcltls pattern (suite_tcl90) is the reference if the 8.6 dependency set later grows a tls battery - the bi-family payload contract it extends is generation-shaped, not 9-only. - G-005 relationship: same zig toolchain-policy lineage as G-099's note - G-005 owns the make.tcl-integrated vendored-extension build direction; the suites are its arm's-length proving ground. - G-099 (achieved, see goals/archive/G-099-suite-tcl86-buildsuite.md) delivered the patterns this goal extends: the build86.zig recipe + build_tclthread86/ build_tclvfs86 helpers (TEA-shape companion builds against the 8.6 stub lib), the whole-tree library install + tm-module derivation, and the suite_tcl90 G-107 (achieved - goals/archive/G-107-buildsuite-library-tests.md) policy-tier test-gate (test_gate.tcl) - a Tk/tklib/tcllib gate follows the same shape. Two 8.6-specific traps recorded there carry forward: the load-bearing MP_FIXED_CUTOFFS define and TCL_BROKEN_MAINARGS+console-subsystem entry handling (build86.zig comments + README DERIVATION). Also inherited from G-099 Notes: the G-106 powershell console-mode disableraw-via-server path is only tcl9-verified - now that a twapi-less 8.6 runtime exists, run the G-106 recipe against it (goals/archive/G-106-powershell-consolemode-fallback.md).