Browse Source
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.commaster
8 changed files with 167 additions and 74 deletions
@ -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). |
||||
@ -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/<name> 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. |
||||
Loading…
Reference in new issue