family_artifacts.tcl runs after kits are built, so the embed lands at kit-family
staging and emission mounts each kit exe to READ the embedded record back -
sidecar fields derive from it (identical build_id by construction; emission
inherently verifies the embed exists). sha1/size stay sidecar-only; embedded
filename namespaced per the G-025 reconciliation.
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
Cross-references recorded after user-prompted overlap review (none of the four
files referenced its counterpart): G-117 embedded runtime record vs G-025
kit-layer stamp (record expected to survive kit wrap - two-layer provenance,
build_id linkage for the stamp's runtime field, namespaced filenames); G-118
item 10 refined to G-032-COMPATIBLE punk::args definitions as the docs home
(rendering/parsing/degradation stay with G-032; item-4 file-exists precedent
noted for G-032's reclassification rule); item 9 duplication interim pending
G-031; G-077 tclsh -e boundary note. G-118 Progress records items 3/4/5/9
landed (0.20.0) with verification evidence.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- no-script forms set ::argv0 to the executable path (was the kit boot script)
- missing script file: file-exists pre-check, clean message, exit 1 (existing-file
source errors keep their full trace)
- no piperepl machinery (unpatched runtime or TCLSH_PIPEREPL=0): terminal stdin
fails fast with usage guidance (app-punkscript probe) instead of blocking in a
raw read; piped degraded eval unchanged; patch-missing notice now 'note:' and
a deliberate TCLSH_PIPEREPL=0 opt-out is quiet (old debug lines deleted)
- project_main.tcl mirrors the full tclsh dispatch (script-arg/dash/-encoding/
lib: forms; was single-arg-only with stale gate default 0); layout _config
copies byte-synced (interim duplication pending G-031)
- tclshcmd.test 17 -> 19 (tclsh_noscript_argv0, tclsh_script_notfound); shell
subtree 64 pass / 2 goal-gated skips / 0 fail against rebuilt kits
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New root ARCHITECTURE.md: descriptive, pointer-first map of boot/launch, interp/thread topology, console abstraction, module loading, build/provenance/kits and the test harness - own lane beside DOX (what you must do) and the goals system (what changed and why). In-flux subsystems documented as goal pointers only.
scriptlib/developer/architecture_lint.tcl validates the doc's reference contract: backticked repo paths exist, G-<id> references resolve against both goal indexes, 400-line size budget. Plain tclsh, no deps, mutation-tested.
Root AGENTS.md: Child DOX Index entry, Closeout item 5 (update-or-prune described mechanisms + run the linter), scriptlib/developer inventory.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
Local 'list' rows are column-padded '* <name %-35s> (active) <metadata>' since
61cf903d; the test's single-space '* fakert_beta (active)' glob predates that
and failed. Assertion intent unchanged: the row is starred AND active-marked.
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
- a leading '-' argument is no longer treated as a script name: all args stay in
::argv and the subcommand proceeds to the repl (tty) or stdin evaluation
(piped), matching stock tclsh
- '-encoding name fileName' sources the script with the named encoding;
incomplete -encoding forms fall through to the argv path as stock does
- lib: scriptlib names are refused with a pointer to the 'script' subcommand
(exit 1): the tclsh subcommand keeps plain-tclsh semantics, no punk modules
- also carries the piperepl dispatch work-in-progress this session's review
validated: TCLSH_PIPEREPL gate default enabled-unless-0 (G-103 patched-runtime
policy) and the no-arg branch (tty -> tclsh repl via dorepl; piped -> read
stdin + eval with tcl_interactive/dorepl 0)
- punkproject 0.19.0 + changelog entry
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Field report (jcross1, Windows PowerShell 5): Get-FileHash not
recognized during list -remote while Write-Host/Invoke-WebRequest
worked. Root cause class: Get-FileHash is a SCRIPT-defined function in
PS 5.1's Microsoft.PowerShell.Utility, resolved via PSModulePath
autoload - a damaged PSModulePath (pwsh7 path pollution, overridden env,
redirected user module dirs) removes it while the module's compiled
cmdlets keep working. Effects were wrong results, not just noise:
spurious UPDATE AVAILABLE rows (null local hash) and fail-closed fetch
verification.
New Get-PunkFileSha1 computes sha1 via .NET (SHA1.Create over a stream,
lowercase hex) at all three former Get-FileHash sites; works on any
PowerShell edition/state incl FIPS, and emits a one-time informational
note when the damaged condition is detected (chosen over
detect-and-offer-install/env-repair: nothing to install once the
dependency is gone, and persistent environment mutation from a fetch
tool is disproportionate). Bash payload already probes
sha1sum/shasum/sha1/openssl - unchanged. bin/AGENTS.md records the
no-script-module-cmdlets payload rule.
Verified: hash parity with Get-FileHash under powershell 5 and pwsh 7;
list -remote via the rewrapped .cmd (correct Same-version rows);
damaged-PS simulation (probe forced unresolvable): note printed once,
zero errors, hashing correct; scriptwrap roundtrip pin
runtimecmd_roundtrip PASS (payload + regenerated bin output committed
together). CHANGELOG bullet added under the in-flight 0.19.0 entry
(rides the user's pending release-notes commit).
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
User-requested audit of naive [package versions] selection: punk::apps'
appinfo 'latest' used a plain lexical lsort (misorders 1.10 vs 1.9) AND
took lindex 0 - the LOWEST version - as latest (the '#todo - natsort!'
site). Now lsort -command {package vcompare} taking the highest, with
empty (unversioned-main) entries excluded before comparison since
vcompare errors on empty operands; only-unversioned yields latest "".
Audit sweep results: every other punk-owned consumer already sorts with
vcompare (punk::lib repl/udp checks, libunknown, repl autocomplete,
loadedlib copy/promote, punk_main/project_main starkit selection - the
latter even carries the 'package versions does not always return
versions in increasing order!' warning comment); packagepreference's
uses are mappings/exact-pins, not max-picks. Naive sorts remain only in
VENDORED third-party code (tcllib doctools docidx/doctoc/doctools.tcl,
vendormodules pattern-1.2.8.tm:267) - flagged, not edited, per the
vendorlib no-edit policy. Project 0.18.9.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the publication-session design exchanges:
embed a copy of the artifact record in the attached image (embed-then-
hash ordering; sidecar + sha1sums stay the integrity authority) with a
punk-runtime 'info' action for stray/renamed binaries (zip-central-
directory read preferred over executing the target), AND harden the
record as schema v1: schema, build_id (embedded+sidecar correlation
uuid), origin (canonical repo built FOR - the timing-safe reframe of
first-published-on; mirrors preserve it), packager (declarative;
minisign noted as the verification complement), project/project_url,
license summary, build_host_platform. Emitted records gain brief toml
'#' comments for non-obvious fields (line-based consumers ignore them
by construction). Lifecycle fields deliberately rejected as repo-level
curation. Next emission after landing = r2; published r1 immutable.
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
Publication side-effects handled ahead of the punkbin push (b5c258f
there - first family -r1 artifacts + metadata + defaults flip to
tclsh9.0.5-punk-r1.exe):
- remote-only rows skip support files (the six metadata tomls now ride
in the server's sha1sums beside the runtimes; same extension set as
the local candidate filter).
- the '(= server default)' active marker also matches via the active's
beside-toml artifact identity: the default names an immutable -r<N>
artifact while the active is typically its materialized WORKING name,
so exact-name matching alone would never fire post-family.
Live-verified against the pushed server: no-name fetch resolves
tclsh9.0.5-punk-r1.exe + metadata; list -remote shows all three -r1
artifacts Same version, the default row marked, active
tclsh9.0.5-punk.exe annotated '(= server default)' through its toml
identity, and no toml leakage. G-067 note records publication done
(r1 immutable - next republish takes -Dfamilyrev=2). Rewrapped;
roundtrip pin PASS; layout copy refreshed. Project 0.18.8.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft giving the tcltls battery line a live goal home after
G-103's archive: backend choice (LibreSSL-portable vs no-asm OpenSSL) is
an in-goal decision, static link mirrors the tcllibc/tk shape, loopback
self-signed handshake + G-107 record-mode testsuite as verification, and
vendored prebuilt removal explicitly scoped OUT (recorded disposition
only - G-004-era work).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Output of the make.tcl project run that performed the G-103 kit-wrap
trial - the established template-payload sync channel carrying the
current punk-runtime.cmd into the punk::mix::templates source tree.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Final acceptance item closed by the punk9_beta/punk9bi_beta kit-wrap
trial (user go-ahead; quiet tree): make.tcl project wrapped both kits
over the family runtimes (the user's own earlier same-day build agreed -
punkcheck no-change), and probes UNDER each kit verified 9.0.5,
//zipfs:/app/tcl_library, PIPEREPL MACHINERY PRESENT, Thread 3.0.7
winning over the vfs payload's legacy thread3.0.1, vfs/tcllib/tcllibc
engaged, punk::args from the vfs side, and Tk create/destroy in both -
punk9bi_beta's Tk necessarily from the runtime's attached image
(punk9win_for_tkruntime.vfs carries none). Every acceptance clause is
now met; evidence recorded in the detail file.
Flip mechanics: Status achieved 2026-07-22; detail file to
goals/archive/ (content-identical move after edits); index entry to
GOALS-archive.md; reference sweep across 13 live goal files (archive
markers per the G-058 precedent - non-contract text only, Scope lines
untouched; pending-tense updates in G-099 arc-unblocked, G-108 family
production landed, G-018/G-023 naming-authority pointers). Forward
pointers pushed to live goals: G-101 (8.6-family deferral target),
G-067 (family -rN artifacts exist; publication user-gated with the
defaults.txt flip process).
Flagged (completion report): tcltls bi-battery line loses its goal home
with this archive - candidate goal on request; punk9wintk905.vfs legacy
thread3.0.1 payload cleanup can ride a future payload refresh; beta
promotion is the user's interactive trial per the *_beta convention.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Bring the modpod-template copy of punk-runtime.cmd up to the
canonical-platform punk-runtime work already landed in bin/ and the
project_layouts copy: local_platform canonical punkshell platform-dir
names (narch normalization, win32-ix86, per-BSD prongs), no-name fetch
defaults from the server's curated defaults.txt instead of baked-in
per-platform rt_default values, and the fetch/list/use -platform
handling that goes with them.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Add punkboot::lib::platform_punk to the three layout make.tcl copies
(basic, project-0.1, and the modpod-template mirror): an inline copy of
punk::platform::normalize (the boot stage cannot package require) that
folds platform_generic's version-dependent cpu/os aliases
(amd64->x86_64, aarch64->arm64, macos->macosx, macosx arm->arm64) into
the canonical punkshell platform-dir names. The bootsupport/library
path wiring now uses it, so platform-suffixed dirs match the punkbin /
punk::platform canon documented in 'help platforms'.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Re-vendor the punk bootsupport module to pick up the canonical
punkshell platform-names work from the dev module: the 'help platforms'
topic (punk::args-documented table of punk::platform::platforms with
status, tiers, buildsuite axis and local-platform markers).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User policy 2026-07-22: doc examples for the polyglot bin utilities show
the .cmd extension (bin/punk-runtime.cmd ...) - extensionless windows
invocation resolves the .ps1 twin, which is ExecutionPolicy-gated and
runs under the invoking powershell edition, while .cmd always executes
via the wrap-pinned tested path. The same .cmd file runs on unix shells
unmodified, so one form serves all platforms with path-separator style
as the only remaining per-platform difference. Sweep confirmed no
existing user-facing guidance contradicts (none exists yet).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The user-observed ordering discrepancy decomposed into two edition
divergences, both now handled:
- launch paths run DIFFERENT powershells: the .ps1 twin executes under
the invoking shell (pwsh 7) while the .cmd routes via the wrap-pinned
'cmd.exe /c powershell' (Windows PowerShell 5);
- between those editions BOTH Hashtable key enumeration order AND
culture-sensitive Sort-Object collation differ (NLS vs ICU treat
hyphens differently). Fix: ordinal comparison for every name ordering
(candidates, platforms dirs, list -remote local+remote-only rows) in
ps1, LC_ALL=C glob/ls/sort in bash - verified byte-identical
list -remote output across cmd->powershell5, pwsh7-on-twin, and bash.
bin/AGENTS.md .ps1-twin paragraph corrected (was stale): the twin is
SELF-MATERIALIZED by the polyglot's batch layer - created when missing,
fc-compared and re-copied when content differs - so it self-heals after
a re-wrap on the next .cmd launch; no manual copy step (verified:
deleted twin regenerated byte-identical). Documented caveats: a
direct-.ps1-only user can ride a stale twin until a .cmd launch heals
it, and payload code must avoid edition-specific behaviour. Rewrapped;
roundtrip pin PASS; layout copy refreshed (twin deliberately NOT
hand-copied - the mechanism owns it now). Project 0.18.7.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Both payloads in parity (rewrapped; roundtrip pin PASS; twins + layout
copy refreshed): the remote comparison now answers "is my active runtime
the recommended one?" at a glance - summary lines show the platform's
server default (defaults.txt, best-effort fetch with cache; absent
server = markers gracefully omitted) and the locally active runtime
(annotated '(= server default)' on match); rows gain the local listing's
'*' active marker and a '(server default)' annotation on the default's
row, whether it is locally present or remote-only.
Also fixes the latent bash bug the verification exposed: CRLF server
sha1sums made locally-present runtimes ALSO appear as remote-only rows
(bash read keeps the \r that msys grep strips, so the \r-suffixed name
failed the local-existence test) - the remote-only loop now strips \r,
and punkbin's build_sha1sums.tcl writes LF sha1sums going forward
(punkbin 4b403a3). Project 0.18.6.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The per-platform default fetch runtime is a punkbin RELEASE DECISION, so
it now lives as server data (punkbin defaults.txt, c4d948f there) rather
than values baked into the payloads: updating the recommendation is a
one-line punkbin edit in the same change-set that publishes the artifact
it points at - immediate effect for every deployed punk-runtime, no
punkshell release, validated by punkbin's maintenance script, and
mirror-curatable. No pre-convention fallback per user direction (no
mirrors exist yet) - a server without the file gets an actionable
name-it-explicitly message, as does a platform without a recorded line.
Both payloads in parity (rewrapped; roundtrip pin PASS; twins + layout
copy refreshed): baked rt_default/runtime_available prong values removed
(the linux-arm one had already drifted from the server's actual artifact
name - the config-in-code failure mode this removes); default lookup
keys on the RESOLVED platform, so no-name 'fetch -platform <p>' now
works for foreign staging too (supersedes the foreign-name-required
rule); cached-copy fallback on network failure. ps1 fix: $arch? in
usage strings parsed as a variable NAMED 'arch?' - brace-delimited.
Verified: file:// happy path (local + foreign default), no-entry
platform, missing-manifest, and the LIVE server's 404 path (graceful
until punkbin c4d948f is pushed). Project 0.18.5.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User direction: 32-bit windows joins the canon marked for what it is -
status supported with runtime+lib tiers (hosting for available
third-party runtimes/libs), buildsuite CANDIDATE (zig can target it;
whether we add a buildsuite is undetermined) - the hosting-vs-building
axis expressing exactly that split. Name win32-ix86 = platform::generic's
own 32-bit x86 token (no normalization needed); normalize additionally
folds hand-typed i386/i486/i586/i686.
- vendorlib_tcl8/9 gain win32-ix86 dirs per the tree sync contract.
- punk-runtime local detection: ps1 returns win32-ix86 on genuine 32-bit
windows hosts (PROCESSOR_ARCHITECTURE x86 without ARCHITEW6432 - a
32-bit shell on a 64-bit OS keeps the x86_64 default: the runtime
store serves what the OS can run); bash MINGW32/CYGWIN prongs key off
the i*86 machine arch. Rewrapped; roundtrip pin PASS; twins + layout
copy refreshed.
Project 0.18.4.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The powershell payload's list -remote built its local-file dict with an
older inline filter (only .txt/.tm excluded), so active.toml, artifact
metadata tomls and stray .log files showed as local runtimes in the
server comparison. Now routed through Get-PunkRuntimeCandidates - the
same filter 'list'/'use' use (directories, *_BUILDCOPY*, .txt/.toml/
.tm/.tmp/.log excluded) and the bash payload's -remote loop already
used (list_candidates). Verified against the LIVE pushed punkbin: no
toml/log leakage, comparison rows correct; 'platforms -remote' also
live-verified over the network (all five served platforms). Rewrapped;
roundtrip pin PASS; layout copy + .ps1 twin refreshed. Project 0.18.3.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Raw-file artifact servers have no directory listing, so served-platform
discovery rides a root-level platforms.txt manifest, now part of the
punkbin layout contract (generated by punkbin's src/build_sha1sums.tcl;
committed in punkbin locally - 7b8a244 - push remains the maintainer's
call; third-party mirrors using the layout carry the same file).
Both payloads in parity (rewrapped; roundtrip pin PASS; layout copy +
.ps1 twin refreshed): 'platforms' lists local bin/runtime/* folders with
the local platform marked; 'platforms -remote' fetches the manifest
(cached-copy fallback), marks local platform / local-dir presence /
local-only dirs, and points at 'list -remote -platform <name>' for
per-platform runtimes. Servers without the manifest get an actionable
message naming the -platform escape hatch and the canon reference
('help platforms'). Verified end-to-end through the wrapped cmd against
a file:// mirror simulation of the local punkbin checkout, including the
no-manifest fallback path. Project 0.18.2.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the binary-policy framing discussion: per-.vfs
toml declarations materialize payload from suite build products, punkbin
artifact classes (consent-gated) and vendor trees, making kit payloads
buildable on a clean binary-free tree (G-004) - while the folder remains
the operative assembly area: declarations optional, undeclared drop-ins
preserved (permissive derived projects and gitignored test .vfs keep
drop-in simplicity). Context records the precedents (vendorlib_vfs.toml,
G-087 layout_materialize, vendored tomlish), the relationship to the
punkbin third-class question, and precedence design as the core work.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Non-contract Context/Notes updates from the user's long-term framing:
- G-004: the two further motivations (third-party distribution platforms
that disallow binaries; the consent promise as an auditable product
commitment); binaries must still OPERATE in the tree post-achievement
(local uncommitted experimentation + permissive derived projects - scan
polices the committed tree only, ignore rules double as drop-in
enablement); exit-path assessment for the src/vfs interim exception
(prefer suite batteries + per-package punkbin library artifacts; whole
.vfs zip archives recorded as an open third-class option).
- G-006: the consent gate recorded as a product commitment, not just
anti-surprise hygiene.
- G-067: buildsuites as a producing source - per-platform library .tm
artifacts as punkbin's second artifact class (platform canon + G-103
metadata pattern); retrieval-target/G-004 ignore interplay.
- G-114: provenance boundary - binary .tm arrive via G-067/local drops,
never checked into punkshell; drop-in acceptance ties to G-004's
operate-in-tree requirement.
Goal/Acceptance contract lines untouched throughout.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the platform-canon survey discussion: binary
modpod .tm are one-platform-per-file under per-platform TM ROOTS the boot
registers for the running platform only (punk::platform canon names).
Context records the motivating fat-tm evidence (oversized downloads;
same-version shadowing with no drop-in path), the subdirs-are-namespace-
components constraint forcing sibling roots, and the division of labour
with G-109 (manifest target-platform field stays there). Deliberately
dormant until binary-.tm distribution starts - no speculative structure.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
src/vendormodules_tcl8 is a tm root - a pkgIndex-style directory there is
invisible to tm handling and nothing referenced this copy (experiment
leftover; added in an early bulk commit). Its designed home is the
platform vendor-library tree: pkgIndex-based, win-x64 dll, Tcl 8 ->
src/vendorlib_tcl8/win32-x86_64/ (reachable via make.tcl's bootstrap
lib paths and the libs build; kit inclusion stays declarative via
src/runtime/vendorlib_vfs.toml - no kit content change from this move).
pages.tcl's comment drift from the old TODO-resolution sweep (283ca03b)
reverted per the vendorlib dont-edit-vendor-code contract - the moved
copy is now byte-identical to the working punk86bawt.vfs payload copy.
Smoke-verified: package require cookfs -> 1.9.0 (dll load, Mount cmd
present) from the new location under native tclsh86t.
(tdbc/sqlite3-1.1.5.tm beside it is NOT misplaced - a namespace subdir
in a tm root is correct tm layout: package tdbc::sqlite3.)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- platform records + 'help platforms' gain buildsuite
(supported|planned|candidate|none): whether OUR zig buildsuites produce
runtimes for a platform. Deliberately a separate axis from tiers -
punkbin-structured repos (or third-party equivalents) can host runtimes
built by any mechanism, so runtime-tier hosting coexists with
buildsuite=none (netbsd/dragonflybsd-class examples, per user review).
openbsd/netbsd/dragonflybsd records now carry the runtime tier.
Current values: win32-x86_64 supported (suite_tcl90), linux-x86_64
planned (G-105), linux-arm64/linux-arm/macosx/freebsd-* candidate,
rest none.
- G-109 notes record the binary-.tm platform reality the user's fat-tm
experience established (retracting this survey's earlier
'tm-are-cross-platform' shorthand): multi-platform fat .tm are the
wrong shape (oversized downloads; same-version shadowing leaves no
drop-in path), platform segregation must ride tcl:™️:path via
per-platform TM ROOTS selected by boot - and platform dirs cannot nest
inside an existing tm root (subdirs are namespace components), so those
roots must be sibling trees. Candidate manifest field: declared target
platform so libunknown can skip wrong-platform binary .tm.
Project 0.18.1.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com