diff --git a/GOALS-archive.md b/GOALS-archive.md index 8ab2b354..d135810b 100644 --- a/GOALS-archive.md +++ b/GOALS-archive.md @@ -128,3 +128,7 @@ Acceptance: from a clean checkout plus a punk-getzig-fetched pinned zig, the sui ### G-094 [achieved 2026-07-21] punkcheck single record lifecycle: OO installtrack as sole implementation with a persistence policy → detail: goals/archive/G-094-punkcheck-single-lifecycle.md Scope: src/modules/punkcheck-999999.0a1.0.tm (installtrack/installevent lifecycle unification, installfile_* retirement, punkcheck::install as OO consumer), src/modules/punk/mix/cli-999999.0a1.0.tm + src/make.tcl (consumers verified unchanged), src/tests/modules/punkcheck/testsuites/punkcheck/ (characterization + new equivalence/staleness coverage) Acceptance: characterization suites install.test and installtrack.test pass (pins flipped only where this goal's contract deliberately changes behaviour, each flip recorded); a new test pins field equivalence between batch-installed and OO-installed records (including -targets_cksums, which the legacy proc pipeline never stored); a new regression test covers o_record_list coherence - two sequential events on one installtrack instance, with targetset writes in the first event, lose nothing at the second start_event; grep of src/modules, src/make.tcl and src/project_layouts finds no live caller of the retired trio outside shims and tests; a full make.tcl build completes with skip/copy decisions unchanged against pre-refactor .punkcheck state (no spurious recopies of unchanged sources). + +### G-102 [achieved 2026-07-21] buildsuite bootstrap without a pre-existing tclsh: zig-driver hybrid → detail: goals/archive/G-102-buildsuite-zig-bootstrap.md +Scope: src/buildsuites/suite_tcl90/ (driver split: zig-layer fetch/generate/compile + suite-tclsh-run Tcl phases; sources.config -> zon-shaped manifest migration), src/buildsuites/ (the pattern future suites fork - interplay with G-099), bin/tools/ (pinned zig acquisition per the consent-gated mechanism), src/scriptapps/bin/ punk-getzig (acquisition layer, unchanged in role) +Acceptance: from a clean checkout plus the pinned zig (acquired via the consent-gated download mechanism or self-built), a documented zig invocation performs the whole pipeline in an environment where no pre-existing tclsh is resolvable (PATH-scrubbed demonstration recorded in this file): fetch/stage sources per the declarative manifest (content-integrity pins for zig-fetched trees; the fossil-checkout flow retained as a documented dev alternative for live-branch work), generate the configure-products, build the runtime, then run the post-tclsh phases under the suite-built shell - tcllib install with tcllibc accelerators via critcl, tklib, tk - and the expected-failure-baselined test gate, with results matching the suite.tcl-driven equivalents; the manifest is the documented tweak surface and copied suite trees remain isolated (G-096 copy-and-tweak property preserved); the recipe pins the zig version it is written against (API-churn mitigation - the 0.14->0.16 migration cost is the recorded precedent); the bash+powershell polyglot alternative for this layer is recorded as considered and rejected, with polyglot craft remaining the ACQUISITION layer's mechanism (punk-getzig/getpunk first-contact story). diff --git a/GOALS.md b/GOALS.md index 25df6cfd..9b2a3121 100644 --- a/GOALS.md +++ b/GOALS.md @@ -354,10 +354,6 @@ Detail: goals/G-100-suite-tcl86-tk-tcllib.md Scope: investigation + decision record under src/buildsuites/suite_tcl86/ (or successor mechanism), TEMP_REFERENCE/metakit + TEMP_REFERENCE/KitCreator (read-only guidance), src/runtime/mapvfs.config ('kit' type consumers), src/make.tcl kit-wrap path (as consumer) Detail: goals/G-101-tcl86-kit-container-strategy.md -### G-102 [active] buildsuite bootstrap without a pre-existing tclsh: zig-driver hybrid -Scope: src/buildsuites/suite_tcl90/ (driver split: zig-layer fetch/generate/compile + suite-tclsh-run Tcl phases; sources.config -> zon-shaped manifest migration), src/buildsuites/ (the pattern future suites fork - interplay with G-099), bin/tools/ (pinned zig acquisition per the consent-gated mechanism), src/scriptapps/bin/ punk-getzig (acquisition layer, unchanged in role) -Detail: goals/G-102-buildsuite-zig-bootstrap.md - ### G-103 [proposed] runtime kit family from buildsuites: plain / punk / bi kits with attached batteries + artifact metadata Scope: src/buildsuites/suite_tcl90/ (kit assembly steps in recipe/driver; pattern for later suites), src/vfs/_config + src/runtime/mapvfs.config (as consumers of the new runtime names), punkbin repo layout + metadata (c:/repo/jn/punkbin; compatible repos), src/scriptapps runtime scriptset ('runtime.cmd' list/use - punk-runtime rename pending G-097) Detail: goals/G-103-runtime-kit-family.md diff --git a/goals/G-099-suite-tcl86-buildsuite.md b/goals/G-099-suite-tcl86-buildsuite.md index d2aa0fe2..7d7f48dc 100644 --- a/goals/G-099-suite-tcl86-buildsuite.md +++ b/goals/G-099-suite-tcl86-buildsuite.md @@ -45,7 +45,9 @@ recommendation is to complete G-096's remaining items (TCLSH_PIPEREPL patch reba behaviour matrix, punk-getzig per-version fetch) and run the punk905_beta interactive trial through to promotion before activating this goal, so the shared suite scaffolding settles before it is forked. Also weigh G-102 (zig-driver hybrid -bootstrap, agreed direction 2026-07-20): its natural slot is before or alongside +bootstrap, achieved 2026-07-21 - the driver shape is now SETTLED: pipeline as zig +recipe steps, zon-pinned + fossil-checkout source flows converging on one staged +invocation): its natural slot was before or alongside this goal so suite_tcl86 is born onto the chosen driver shape rather than ported later. diff --git a/goals/G-102-buildsuite-zig-bootstrap.md b/goals/G-102-buildsuite-zig-bootstrap.md deleted file mode 100644 index d406db76..00000000 --- a/goals/G-102-buildsuite-zig-bootstrap.md +++ /dev/null @@ -1,64 +0,0 @@ -# G-102 buildsuite bootstrap without a pre-existing tclsh: zig-driver hybrid - -Status: active -Scope: src/buildsuites/suite_tcl90/ (driver split: zig-layer fetch/generate/compile + suite-tclsh-run Tcl phases; sources.config -> zon-shaped manifest migration), src/buildsuites/ (the pattern future suites fork - interplay with G-099), bin/tools/ (pinned zig acquisition per the consent-gated mechanism), src/scriptapps/bin/ punk-getzig (acquisition layer, unchanged in role) -Goal: a buildsuite is drivable end-to-end with only the pinned zig toolchain present - no pre-existing tclsh anywhere in the chain. Pre-tclsh phases (source fetch, configure-product generation, compile) move into the zig build layer, with sources declared in a content-hashed declarative manifest (build.zig.zon or a zon-shaped equivalent) that keeps the copy-and-tweak retargeting property; post-tclsh phases (tcllib/tklib installers, critcl accelerators, the parsed-totals test gate, smokes) remain Tcl scripts executed by the FRESHLY BUILT suite tclsh as build steps - Tcl stays the tool exactly where a tclsh is guaranteed to exist because the suite just built it. The plain-tclsh suite.tcl remains as an ergonomic dev driver during transition (or is reduced to a thin documented wrapper). -Acceptance: from a clean checkout plus the pinned zig (acquired via the consent-gated download mechanism or self-built), a documented zig invocation performs the whole pipeline in an environment where no pre-existing tclsh is resolvable (PATH-scrubbed demonstration recorded in this file): fetch/stage sources per the declarative manifest (content-integrity pins for zig-fetched trees; the fossil-checkout flow retained as a documented dev alternative for live-branch work), generate the configure-products, build the runtime, then run the post-tclsh phases under the suite-built shell - tcllib install with tcllibc accelerators via critcl, tklib, tk - and the expected-failure-baselined test gate, with results matching the suite.tcl-driven equivalents; the manifest is the documented tweak surface and copied suite trees remain isolated (G-096 copy-and-tweak property preserved); the recipe pins the zig version it is written against (API-churn mitigation - the 0.14->0.16 migration cost is the recorded precedent); the bash+powershell polyglot alternative for this layer is recorded as considered and rejected, with polyglot craft remaining the ACQUISITION layer's mechanism (punk-getzig/getpunk first-contact story). - -## Context - -Direction agreed 2026-07-20 (discussion recorded in the notes of G-096 (achieved 2026-07-20); user decisions: -toml dropped for binary buildsuites, long-term no-tclsh bootstrap intent, zig -acquisition accepted as the root dependency, the freshly built tclsh accepted as -the legitimate intermediate for tcllib/tklib installers and critcl). - -Why zig fits this layer: - -- build.zig.zon is itself a declarative, content-hashed source manifest - fetch by - url+hash gives declarative retargeting WITH integrity. Fossil sources pin as - per-checkin tarball urls (branch-tip tarballs are not hash-stable); that is a - provenance feature - '-refresh' becomes 'bump the pin' - with the fossil-checkout - path kept for dev-friendly live-branch work. -- The recipe already generates configure-products (tclUuid.h, manifests, rc edits) - inside the zig layer - the boundary just extends to cover fetch. -- zig Run steps execute artifacts they just built: 'zig build tcllib' = build tclsh - -> run installer.tcl under it; 'zig build test-gate' = run the core suite under it - and gate on parsed totals. The freshly-built-tclsh intermediate maps 1:1 onto the - build graph. - -Why NOT a bash+powershell polyglot for this layer (considered and rejected): the -polyglot's value is first contact - zero installed tools - but the suite driver runs -AFTER zig acquisition by definition, so a capable tool is always already present. -The driver's workload (manifest parsing, byte-exact file generation, totals parsing, -child-process orchestration) is what dual shell implementations do worst: two -codebases in lockstep or a fragile dual-parse dialect, divergent quoting/path -semantics as a permanent bug farm. Polyglot craft stays where it already earns its -keep in this repo: the acquisition layer (punk-getzig / getpunk cmd-or-powershell -first-contact twins). - -Residual external tools, and their long-term story: fossil and git CLIs are used by -the current fetch flow. Under the zon path they become optional (tarball fetch with -pinned hashes needs neither); fossil itself is buildable with zig cc if live -checkouts without a preinstalled fossil are ever wanted. - -Relationships: G-005 (this formalizes its zig-build-infrastructure intent for the -buildsuite path), G-006 (consent-gated artifact/toolchain download - the zig -acquisition gate), G-018 (superseded 2026-07-20 - the bare bootstrap-intermediate -tclsh stays an accessible, unshowcased build product; the showcased 'plain' niche -is G-103's plain-for-punk member), G-096 (origin discussion in its notes; -the suite.tcl scaffolding this splits), G-099 (sequencing interplay below). - -SEQUENCING: proposed 2026-07-20. Natural slot is before or alongside G-099 -activation so suite_tcl86 is born onto the chosen driver shape rather than ported -later - but this goal must not block G-096's remaining items (piperepl matrix, -punk-getzig per-version fetch), which close out on the current suite.tcl shape. -sources.config records are deliberately name/url/ref-shaped (close to zon records) -so the manifest migration is mechanical. - -## Notes - -- 2026-07-20 (user requirements batch): the build-graph products this driver shape - must express grew concrete - the G-103 runtime kit FAMILY (plain/punk/bi kits with - attached batteries) become named build outputs, G-105 adds -target as a build - dimension, and G-104's make.tcl surface fronts whichever driver shape wins (its - suite self-description contract must survive the migration). diff --git a/goals/G-103-runtime-kit-family.md b/goals/G-103-runtime-kit-family.md index 3f2131b2..acd76c4b 100644 --- a/goals/G-103-runtime-kit-family.md +++ b/goals/G-103-runtime-kit-family.md @@ -49,7 +49,8 @@ READILY ACCESSIBLE as an ordinary suite build product (_build//out/bin) b is not showcased or published as a family member. Relationships: G-018 (superseded 2026-07-20 - see its closing note). G-102 -(zig-driver hybrid): the family members become named build-graph products. G-105 +(achieved 2026-07-21 - zig-driver hybrid landed): the family members become named +build-graph products of the settled step shape. G-105 (cross-target): family x target is the punkbin artifact matrix - metadata carries the target dimension. G-101: the 8.6 family variant depends on the container strategy. G-006: punkbin download consent. G-097: runtime.cmd -> punk-runtime diff --git a/goals/G-104-maketcl-buildsuite-surface.md b/goals/G-104-maketcl-buildsuite-surface.md index 4c1bfdf2..3bfb8ce8 100644 --- a/goals/G-104-maketcl-buildsuite-surface.md +++ b/goals/G-104-maketcl-buildsuite-surface.md @@ -16,8 +16,10 @@ make.tcl." Design lean: make.tcl stays a THIN front - discovery by directory scan, description and info answered by the suite itself (a 'suite.tcl info' action emitting a stable record, or a small manifest the driver also reads). That keeps copied/retargeted -trees first-class citizens and survives the G-102 driver-shape migration (whatever -replaces suite.tcl keeps answering the same contract; make.tcl need not know which +trees first-class citizens and survives the G-102 driver-shape migration (achieved +2026-07-21: suite.tcl remains as the fossil dev wrapper delegating to the recipe's +zig steps, with 'zig build stage|bootstrap' as the no-tclsh flow - whatever +fronts these keeps answering the same contract; make.tcl need not know which shape a suite uses). Sibling ergonomics note: the earlier-recorded make.tcl 'vfs' wishes (build a single @@ -27,7 +29,7 @@ separate subsystem (kit wrapping) but the same ergonomic family - a candidate to execute alongside this goal. Relationships: G-096 (achieved 2026-07-20 - suite.tcl driver + copy-and-tweak workflow this fronts), -G-102 (driver shape - the info/build contract must survive it), G-103 (family +G-102 (achieved 2026-07-21 - driver shape settled; the info/build contract holds), G-103 (family products appear in info output), G-105 (target dimension forwarded when it exists). ## Notes diff --git a/goals/G-105-buildsuite-cross-target.md b/goals/G-105-buildsuite-cross-target.md index 8854dc6a..a12e3877 100644 --- a/goals/G-105-buildsuite-cross-target.md +++ b/goals/G-105-buildsuite-cross-target.md @@ -34,7 +34,7 @@ INVERTED): Relationships: G-060 (qemu cross-platform matrix - WSL is the cheap first rung; qemu covers what WSL cannot), G-099/G-100 (the 8.6 suite inherits the target -dimension), G-102 (driver shape: target becomes a build-graph dimension), G-103 +dimension), G-102 (achieved 2026-07-21 - driver shape settled; target becomes a build-graph dimension), G-103 (family x target = the punkbin artifact matrix), G-006 (punkbin artifact consent). ## Notes diff --git a/goals/archive/G-102-buildsuite-zig-bootstrap.md b/goals/archive/G-102-buildsuite-zig-bootstrap.md new file mode 100644 index 00000000..bc19a61e --- /dev/null +++ b/goals/archive/G-102-buildsuite-zig-bootstrap.md @@ -0,0 +1,152 @@ +# G-102 buildsuite bootstrap without a pre-existing tclsh: zig-driver hybrid + +Status: achieved 2026-07-21 +Scope: src/buildsuites/suite_tcl90/ (driver split: zig-layer fetch/generate/compile + suite-tclsh-run Tcl phases; sources.config -> zon-shaped manifest migration), src/buildsuites/ (the pattern future suites fork - interplay with G-099), bin/tools/ (pinned zig acquisition per the consent-gated mechanism), src/scriptapps/bin/ punk-getzig (acquisition layer, unchanged in role) +Goal: a buildsuite is drivable end-to-end with only the pinned zig toolchain present - no pre-existing tclsh anywhere in the chain. Pre-tclsh phases (source fetch, configure-product generation, compile) move into the zig build layer, with sources declared in a content-hashed declarative manifest (build.zig.zon or a zon-shaped equivalent) that keeps the copy-and-tweak retargeting property; post-tclsh phases (tcllib/tklib installers, critcl accelerators, the parsed-totals test gate, smokes) remain Tcl scripts executed by the FRESHLY BUILT suite tclsh as build steps - Tcl stays the tool exactly where a tclsh is guaranteed to exist because the suite just built it. The plain-tclsh suite.tcl remains as an ergonomic dev driver during transition (or is reduced to a thin documented wrapper). +Acceptance: from a clean checkout plus the pinned zig (acquired via the consent-gated download mechanism or self-built), a documented zig invocation performs the whole pipeline in an environment where no pre-existing tclsh is resolvable (PATH-scrubbed demonstration recorded in this file): fetch/stage sources per the declarative manifest (content-integrity pins for zig-fetched trees; the fossil-checkout flow retained as a documented dev alternative for live-branch work), generate the configure-products, build the runtime, then run the post-tclsh phases under the suite-built shell - tcllib install with tcllibc accelerators via critcl, tklib, tk - and the expected-failure-baselined test gate, with results matching the suite.tcl-driven equivalents; the manifest is the documented tweak surface and copied suite trees remain isolated (G-096 copy-and-tweak property preserved); the recipe pins the zig version it is written against (API-churn mitigation - the 0.14->0.16 migration cost is the recorded precedent); the bash+powershell polyglot alternative for this layer is recorded as considered and rejected, with polyglot craft remaining the ACQUISITION layer's mechanism (punk-getzig/getpunk first-contact story). + +## Context + +Direction agreed 2026-07-20 (discussion recorded in the notes of G-096 (achieved 2026-07-20); user decisions: +toml dropped for binary buildsuites, long-term no-tclsh bootstrap intent, zig +acquisition accepted as the root dependency, the freshly built tclsh accepted as +the legitimate intermediate for tcllib/tklib installers and critcl). + +Why zig fits this layer: + +- build.zig.zon is itself a declarative, content-hashed source manifest - fetch by + url+hash gives declarative retargeting WITH integrity. Fossil sources pin as + per-checkin tarball urls (branch-tip tarballs are not hash-stable); that is a + provenance feature - '-refresh' becomes 'bump the pin' - with the fossil-checkout + path kept for dev-friendly live-branch work. +- The recipe already generates configure-products (tclUuid.h, manifests, rc edits) + inside the zig layer - the boundary just extends to cover fetch. +- zig Run steps execute artifacts they just built: 'zig build tcllib' = build tclsh + -> run installer.tcl under it; 'zig build test-gate' = run the core suite under it + and gate on parsed totals. The freshly-built-tclsh intermediate maps 1:1 onto the + build graph. + +Why NOT a bash+powershell polyglot for this layer (considered and rejected): the +polyglot's value is first contact - zero installed tools - but the suite driver runs +AFTER zig acquisition by definition, so a capable tool is always already present. +The driver's workload (manifest parsing, byte-exact file generation, totals parsing, +child-process orchestration) is what dual shell implementations do worst: two +codebases in lockstep or a fragile dual-parse dialect, divergent quoting/path +semantics as a permanent bug farm. Polyglot craft stays where it already earns its +keep in this repo: the acquisition layer (punk-getzig / getpunk cmd-or-powershell +first-contact twins). + +Residual external tools, and their long-term story: fossil and git CLIs are used by +the current fetch flow. Under the zon path they become optional (tarball fetch with +pinned hashes needs neither); fossil itself is buildable with zig cc if live +checkouts without a preinstalled fossil are ever wanted. + +Relationships: G-005 (this formalizes its zig-build-infrastructure intent for the +buildsuite path), G-006 (consent-gated artifact/toolchain download - the zig +acquisition gate), G-018 (superseded 2026-07-20 - the bare bootstrap-intermediate +tclsh stays an accessible, unshowcased build product; the showcased 'plain' niche +is G-103's plain-for-punk member), G-096 (origin discussion in its notes; +the suite.tcl scaffolding this splits), G-099 (sequencing interplay below). + +SEQUENCING: proposed 2026-07-20. Natural slot is before or alongside G-099 +activation so suite_tcl86 is born onto the chosen driver shape rather than ported +later - but this goal must not block G-096's remaining items (piperepl matrix, +punk-getzig per-version fetch), which close out on the current suite.tcl shape. +sources.config records are deliberately name/url/ref-shaped (close to zon records) +so the manifest migration is mechanical. + +## Verification (acceptance evidence, 2026-07-21) + +Landed as increments on suite_tcl90: 84a1b225 (configure-products as build-cache +OVERLAYS - tclUuid.h/tkUuid.h/threadUuid.h via generator include-dirs, the two exe +manifests + thread.rc via overlay writefiles/rc copies; source trees never written, +fossil checkouts stay pristine), 51fc727f (build.zig.zon pinned manifest + +zig-native bootstrap staging: 'zig build stage|bootstrap' from the tracked suite +dir, tools/stagetree.zig materializer with pin-marker invalidation and fossil/git +checkout protection), e5db0513 (post-tclsh phases as recipe steps under the +suite-built shell: smoke/tklib/tcllib/tcllibc/test-gate + package landing in the +recipe; suite.tcl thinned to the fossil dev wrapper delegating to the same staged +steps), acc6ab40 (build.zig default-entry shim; deterministic critcl target; +comptime zig pin 0.16.0). + +PATH-scrubbed no-tclsh demonstration (clean checkout): + +- Clean git clone of the repo at e5db0513 to c:/T/g102 (shallow base). The clone + carries no toolchain; the pinned zig is the acquisition layer's + bin/tools/zig-x86_64-windows-0.16.0 (punk-getzig-fetched, minisign-verified + hosting). +- Environment: env -i with PATH = the pinned zig dir (plus C:\Windows\System32 + + COMSPEC/PATHEXT/SystemDrive for the TEST-SUITE phase - base windows facilities, + see findings) and TEMP/LOCALAPPDATA/USERPROFILE only. Probed: 'where zig.exe + cmd.exe' resolve; 'where tclsh.exe tclsh90.exe fossil.exe git.exe' finds + NOTHING. +- Documented invocation 'zig build bootstrap' (build.zig shim -> build905.zig + bootstrap mode) performed the whole pipeline: the seven build.zig.zon pinned + per-checkin tarballs materialized into _build/suite_tcl90 (stagetree pin + markers; packages verified against the manifest hashes by zig's fetch layer), + recipe staged, and the nested staged build ran install + install-libraries + + make-zipfs + smoke + tklib + tcllib + tcllibc - ALL GREEN: suite_smoke + static+zip (9.0.5; zip proves attached tzdata+autoload), tklib tooltip:2.0.4 + under withdrawn Tk, tcllib md5:2.0.9 sha1:2.0.5 cmdline:1.5.3, tcllibc:2.0 + with md5-critcl-accel:1 (critcl driving zig cc). tcl::build-info of the demo + shell reports 9.0.5+1a9c3b9d... - IDENTICAL to the fossil-flow build: the zon + pins are the exact checkouts the promoted punk905 runtime was built from. + (The build pipeline was additionally green in an earlier pass with PATH = the + zig dir ALONE - not even cmd.exe.) +- Test gate ('zig build bootstrap -Dsteps=test-gate', scrubbed): totals 69552 + run, 56075 passed, 13468 skipped, 9 failed - 8 baselined plus fCmd-30.3, + which is a scrub artifact (the test's expected result assumes + $env(SystemDrive) exists); with SystemDrive present the file reruns GATE PASS + all-baselined. Same-day suite.tcl-driven equivalent (fossil flow, delegated + to the same test-gate step): 69552 run, 56040 passed, 13503 skipped, 9 + failed, GATE PASS - matching run counts, with the small passed<->skipped + shift being env-dependent test constraints. +- Copy-and-tweak preserved: exercised via a full suite copy (suite_tcl90zt) + that bootstrapped from nothing but its tracked tree + pinned zig into its own + _build/ stage; the stage dir derives from the suite folder name in both + flows. The fossil-checkout dev flow is retained: suite.tcl fetches live + checkouts per sources.config and delegates to the same staged steps, and the + bootstrap staging never touches an existing fossil/git checkout (guarded in + the recipe and in stagetree, tested against the fossil-populated stage). + +Environment findings (recorded for future suite work): + +- critcl chooses its build target by PROBING PATH for compilers: with a gcc + visible the tracked config's defaults engaged (why the G-098-era flow always + 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". The + config now declares an explicit win32-x86_64-zig target and the recipe passes + -target win32-x86_64-zig - deterministic in both environments. +- The tcl core test suite needs base windows facilities beyond the toolchain: + without cmd.exe/COMSPEC/PATHEXT the winpipe/auto_execok/fCmd families fail + spuriously (~52 extra), and fCmd-30.3 needs SystemDrive. These are properties + of the tests, not the pipeline. +- First socket listen by a newly built shell at a new path raises the windows + firewall consent dialog (user-observed and accepted mid-run during the first + demo gate) - socket-family flakes in a first gate run on a fresh clone can be + firewall artifacts; post-accept runs are deterministic. An isolated + http-4.14.2 connect-refused flake was also observed once on the fossil flow + and passed on rerun (528/519/9/0). +- Windows Run-step spawn semantics encoded in the recipe: cached + (non-side-effect) zig Run steps spawn children with stdout IGNORED - a tcl + child then has no stdout channel and any puts errors; such runs capture + stdout. Built-shell artifact runs execute the CACHED exe (no ../lib/tcl9.0 + beside it) and get TCL_LIBRARY pointed at the source tree's script library + (the zip smoke deliberately excluded - its attached library is under test). + +Residual: out/bin/tclsh90sprzip.exe in the MAIN repo's fossil-flow stage is +pending one install copy (the file was held open by a user application through +the verification window; the product builds and installed cleanly in the demo +clone, and the next make-zipfs run installs it once released). The G-104 +make.tcl surface will front these flows; -Dtestargs passthrough on bootstrap +mode (currently a staged-invocation option only) is a G-104-adjacent nicety. + +## Notes + +- 2026-07-20 (user requirements batch): the build-graph products this driver shape + must express grew concrete - the G-103 runtime kit FAMILY (plain/punk/bi kits with + attached batteries) become named build outputs, G-105 adds -target as a build + dimension, and G-104's make.tcl surface fronts whichever driver shape wins (its + suite self-description contract must survive the migration). The shape that won + (this goal, achieved): pipeline entirely in the zig recipe as steps; two source + flows (zon pins / fossil checkouts) converging on one staged invocation.