Tree:
47c9f99eff
master
v0.1a
${ noResults }
134 Commits (47c9f99eff4d64b20c2b0e7a297547f6477c789d)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
5a8a62547b |
G-057: kit icon step - resource sidecar every target, twapi PE embedding
Every kit a bake builds now gets a <kitname>.resources.toml sidecar (build folder + deployed beside bin/<kit>) recording the build-time icon choice: schema-1 flat TOML in the G-135 tolerant family - kit, target, kit_type, icon_origin default|override, icon_source (repo-relative), icon_hash, provenance source+hash lifted from the icon's assetorigin sidecar (the chain reaches the SVG master), embedding, embedding_status embedded|not-applicable|unavailable|failed, embedding_reason. Byte-stable (no timestamps, write-only-if-changed); named "resources" so the parked RT_VERSION follow-on extends the same file. Format doc: bin/AGENTS.md. win32-target kits get the icon embedded as RT_ICON/RT_GROUP_ICON via the twapi resource-update APIs - the tcl-sfe sfe-0.2.tm mechanism (Ashok P. Nadkarni) generalized: enumerate all existing icon/group entries via extract_resources, delete ALL, write ids 1..N plus one group under the first pre-existing group's name+lang (fallback 1/1033) in a single update transaction - idempotent by construction. Ordering is stub-first: a PER-KIT copy of the extraction phase's payload-free raw runtime prefix is stamped BEFORE payload attach, so the resource rewrite can never corrupt an overlay; all three assemblers (zipfs mkimg, zipcat/concat, sdx wrap) consume the stamped copy; runtime store originals untouched. ::punkboot::kit_icon_process is the single internal entry point with mechanism selection inside (a G-128 portable stamper becomes a substitution). Skip taxonomy: non-PE target / runtimeless .kit = NOT APPLICABLE; cookfs, missing icon, missing raw prefix, cross-host (non-windows process family), twapi-unloadable = UNAVAILABLE with distinct named reasons; embed errors = recapped BUILD-WARNING + status failed. Sidecar written in every case. Default icon joins the kit's punkcheck source set (icon changes rebuild kits); sha256 self-contained (bootsupport has sha1/md5 only), memoized per run. Verified (evidence in the goal detail file Progress): full bake embeds all 10 buildable win32 kits (zip x64+ix86, sdx metakit trio) with resource inspection byte-matching the source ico (punk91, punk86, punk91ix86 inspected; group name SFE preserved); scratch-copy boots for zip, metakit and a stamped concat image (androwish exe-path mount); override round-trip via punk9wintk903.vfs (solid ico embedded + recorded, then reverted); linux cross-target punkshell902 sidecar with not-applicable; mingw tclsh86 bake takes the concat path with the distinct twapi-unloadable notice; vendored twapi 5.0b1 arm proven under tclsh9.0.5-punk; double-restamp converges. punk9_beta embedded+built but deploy still blocked by the known bin file lock (stamped product waits in src/_build). make.tcl workflow text gains the icon step + sidecar output; punkshell 0.29.0 -> 0.30.0 (minor: kits now wear the punkshell icon; new shipped sidecar) with CHANGELOG entry. G-057 detail file: ordering + override + sidecar + seam decisions recorded with tcl-sfe attribution; cross-host known-shortcoming + G-128 remedy recorded per acceptance. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
768dab399f |
G-033: proj: package-mode scope prefix - visitor binary resolves dev/src against the cwd's project
punk_main.tcl: an optional proj: prefix on the package-mode string
(e.g 'proj:internal-src') rebinds the dev/src path blocks to the punk
project containing the current directory instead of the executable's
own project. Root discovery is ::punkboot::proj_root_find, a lean
boot mirror of punk::repo::find_project/is_project_root in Tcl
builtins only (git/fossil control markers via 'file exists', unwise-
path exclusion, ./src plus src/modules|src/vfs|src/scriptapps|
punkproject.toml candidate check; .git accepted as file OR dir for
worktree checkouts - recorded divergence). The proc stays defined
post-boot like the G-129 mount procs. The prefix sits outside the
ordered dash-list, whose block order remains the same-version
tie-break dial; an invalid mode remainder is not consumed (whole arg
falls through as subcommand/script as today); bare 'proj:' reads as
internal and warns. Discovery outcome is always reported on stderr
(detected root + effective precedence - never a silent rebind), a
failed walk-up warns and leaves dev/src unbound (no exe-relative
fallback rebind), and proj: without a dev/src block warns it has no
effect. Under proj:, dev resolves <root>/modules{,_tclN} and
<root>/lib{,_tclN} only; src feeds the discovered root into the
existing src-mode machinery unchanged (tm paths, auto_path, package
prefer latest, inline #modpod scanner). Exe-relative src/dev launches
are untouched.
punk::args::moduledoc::punkexe 0.1.1: the packagemode help text
drafted in the goal file is now live as the packagemode leader of
(script)::punkexe (@leaders max 2), with proj: wording in the @cmd
overview; rendering/parse wiring remains G-032.
Verified on a rebaked punk91 kit, standalone copy outside any source
tree: proj:internal-src from tomlish (fossil root, builds no
executable) loads tomlish 999999.0a1.0 from its src/modules with
kit-first ties; proj:src flips the ordering; from punkshell the
visited-root modpod scan registers 6 modpods; no-project and
no-root-using-block warnings fire and proceed; bin/punk91 src
unchanged.
Docs: bin/AGENTS.md launch-package-modes proj: contract,
src/vfs/AGENTS.md punk_main contract line, ARCHITECTURE.md entry
point. punkshell 0.29.0 (minor - new launch invocation) + CHANGELOG.
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
3 days ago |
|
|
df6642e189 |
punk::zip 0.3.0: punkzip extraction accelerator + parity suite (G-126); 0.28.4
The final G-126 acceptance clauses:
- punk::zip::accelerator (auto|none|<path>): auto probes
env(PUNKZIP_EXE) then a punkzip beside [info nameofexecutable];
resolution cached until reconfigured
- unzip hands whole-archive member WRITING to the accelerator only when
the call is one it serves identically (globs {*}, no excludes,
default -overwrite/-mtime/-verify, ascii member names) and re-stamps
mtimes with punk::zip's local-time convention afterwards, so the two
engines produce identical trees; preflight refusals, member selection
and the returned names always come from punk::zip's own reader (the
G-124 floor, unchanged); accelerator failure falls back to pure Tcl
silently; last_unzip_engine/last_accelerator_note expose the per-call
decision
- parity suite zipaccel.test (9 tests): identical names, bytes and
mtimes through both engines over the G-124 shapes and whole-kit
extraction of the file-relative tclsh90b4_piperepl.exe (841 members);
listings engine-independent; punkzip porcelain agrees with punk::zip
member dicts on every shared field (mtime excluded by design - UTC vs
local convention); pure path proven when the binary is absent;
selective calls proven to run pure. Implicit directories (kits store
no dir entries) are excluded from mtime comparison - neither engine
stamps them
- recorded benchmark (in the goal detail): accelerator fixed cost
~9-13ms, crossover ~15-20 members, material (>= x1.7) from ~50;
x2.3-2.6 at kit scale under a native tclsh and x3.8-4.9 kit-hosted
(punk91.exe 21.9s -> 5.7s) - the bake-from-kit case the goal
motivated
- full runtests at recorded baseline under tclsh9.0.5-punk: 1186/1211,
1 failed = the pre-existing exec-14.3 baseline
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
d76a7907ea |
make.tcl tool subcommand: build vendored zig tools into bin/ (G-126); 0.28.3
New surface for the vendored first-party build tools under src/tools:
make.tcl tool list|info|build|test ?<toolname> ...? ?-test 0|1?
- discovery is convention-based (a src/tools directory carrying
build.zig is a tool), so the G-128 tool will appear with zero
make.tcl edits; per-tool records are read tolerantly from
build.zig.zon (version, minimum_zig_version floor) and PROVENANCE.md
(upstream, vendored commit)
- list/info report installed-binary state (current|stale|absent vs
bin/<name><exe-suffix>) and the resolved toolchain
- toolchain resolution: PUNK_ZIG=<path> overrides; otherwise
bin/tools/zig* is scanned and the LOWEST release satisfying the floor
wins - deterministic as newer toolchains get unpacked beside the
pinned one; dev builds count only when their base version exceeds
the floor
- build runs the tree's own 'zig build test' as an EXIT-CODE gate
(expected stderr warnings do not fail it), then builds ReleaseSafe
and installs to bin/; nothing installs when the gate or build fails;
-test 0 skips the gate; build caches are deliberately left in place
between runs for rebuild speed (git- and fossil-ignored)
- zig stays OPTIONAL: packages/bake never require the step; without a
suitable toolchain, list reports the state and build/test exit
nonzero with bin/punk-getzig.cmd guidance
- full subcommand accompaniments per src/AGENTS.md: punk::args argdoc
(SUMMARIES/HELPTEXTS/bespoke passthrough definition), SUBGROUPS
("vendored tools"), known_commands, degraded-mode dispatch, plain
help text, bootsupport-staleness exemption, workflow text (new
OUT-OF-BAND SUBSYSTEMS section also covering buildsuite), project
version 0.28.3 + CHANGELOG entry
- piped characterization (zig-independent):
src/tests/shell/testsuites/punkexe/maketcltool.test - 4/4 green
- verified live: 'tool build punkzip' gated on the vendored tree's
130/130 suite and installed bin/punkzip.exe (ReleaseSafe, v2.3.1,
1.1MB) over the stale Nov-2024 v2.1.0 binary; list state flipped
stale -> current; PUNKBOOT_PLAIN degraded dispatch and tabled help
verified
G-126 Progress updated: the acceptance's build-step clause is
satisfied. Remaining: punk::zip fast path, parity suite, benchmark.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
583dd5e0b2 |
G-133: bake payload/target consistency checks - advisory arch scan + smoke-require probe
- punkboot::utils 0.5.0: binary_arch_classify (PE Machine field, ELF e_machine,
Mach-O thin+universal - honest unknowns), platform_expected_binary,
platform_discriminated_segment (canonical <os>-<cpu> tokens + vendor spellings,
extensible namespace variables), vfs_binary_arch_report (per-directory exemption,
exempt subtrees counted unread)
- make.tcl: advisory binary-arch scan at the G-125 gate seam (recapped
BUILD-WARNINGs naming file/found-arch/kit-target, capped at 8 per kit with honest
total; cross-target kits included); post-build smoke-require probe running the
freshly built artifact via its tclsh subcommand with drained stdin (failures
recapped naming kit/package/actual error; cross-target skip with stated reason;
undeclared kits run nothing new); mapvfs.config entries accept a 5th
smoke-require element (mapvfs_parse/mapvfs_kit_outputs carry smokerequire);
'check' reports scan ACTIVE/UNAVAILABLE + declared smoke matrix; workflow K11
- mapvfs.config: smoke-requires declared - punkluck86 {Thread} (the 2026-07-27
incident construction), punk91ix86 {Thread iocp}, punkshell902 {Thread}
(cross-target skip demonstrator)
- tests: binaryarch.test (generated header fixtures only - no committed binaries;
punkluck86 case reproduced; iocp pair + win-x64 exemptions; real-tree sweep with
known-real findings filtered), maketclpayloadcheck.test (piped check
characterization, ESC-free per G-113)
- docs: src/AGENTS.md + bin/AGENTS.md state what the checks do and do NOT
guarantee; src/runtime/AGENTS.md entry grammar; ARCHITECTURE.md bake section
- REAL FINDING on the scan's first sweep: zint.dll 2.13.0 in punk8win.vfs
lib_tcl8/ is 32-bit (PE i386, confirmed with file(1)) and can never load in the
x64 tcl8 kits punk86/punkbi/punksys that carry it - those bakes warn until the
payload is fixed
- punkshell 0.28.2
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
f4d1091d61 |
win32-ix86 verification kits repointed at minimal payloads punk8min.vfs / punk9min.vfs
The full punk8win/punk9win_for_tkruntime payloads shipped x64-only binary packages into the 32-bit kits (user-observed): a higher-versioned x64 Thread 2.8.12 shadowed the LUCK runtime's working 32-bit 2.8.5 on plain package require and broke the repl (tsv machinery), and x64-only dlls (tcludp etc) failed with "couldn't load from current filesystem". Measured: forcing -exact Thread 2.8.5 loaded fine, proving the backport's zipfs dll loading works and the failure was purely wrong-arch version shadowing. New minimal payloads: both startup fauxlinks (root main.tcl + the undroidwish app/main.tcl hook) plus directory fauxlinks to MULTI-ARCH packages only - those carrying a win32-ix86 platform subdir: iocp-2.0.2 (both majors, from punk8win.vfs / punk9magicsplat.vfs) and twapi-5.0b1 (tcl8, from punk86.vfs). No binary duplication in VCS (G-004); the pure-tcl module/lib set arrives via the dll-free _vfscommon.vfs overlay. Verified: both kits boot, resolve punk::args from _vfscommon, load Thread (2.8.5 own-arch on LUCK / 3.0.5 static on sfe), iocp 2.0.2 (ix86 dll), twapi (4.7.2 stable beats the linked 5.0b1 beta under prefer-stable on LUCK; 5.2.0 static on sfe), udp 1.0.11 on LUCK (own archive copy, no longer shadowed); piped shell sessions evaluate cleanly on both with zero tsv-unavailable noise. Remaining specimen quirk (out of payload scope): punkluck86 segfaults at process exit AFTER a completed shell session (exit 139) - repl-teardown x 2019-era runtime interaction; the tclsh subcommand exits 0 with all four packages loaded. punkexe subtree 69 tests 0 fail. Claude-Session: https://claude.ai/code/session_01UEgomWq6kA6c4A8GswqqGW Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
191d8ff490 |
G-129: kit boot derives its payload mount from the runtime's mount table (punkshell 0.28.0)
Boot (punk_main.tcl + project_main.tcl, identical copies):
- zipfs presence keys on tcl::zipfs::mount - present in every supported zipfs
generation - not tcl::zipfs::root (8.7/9-era; absent from the androwish/
undroidwish 8.6 backport, whose ::zipfs ensemble also lacks a root subcommand).
- New factored ::punkboot procs (zipfs_mount_pairs, zipfs_kit_mountbase,
path_within) derive where this executable's attached archive actually mounted:
the mount-table entry whose archive file is [info nameofexecutable] (the
backport reports it without the windows drive prefix - handled), fallback the
mount containing the boot script. //zipfs:/app stays the expected modern
answer, not an assumption. Procs remain defined post-boot for tests.
- A mounted archive that cannot be attributed to the executable is reported on
stderr instead of silently configuring no internal paths (the old failure shape).
- The starkit quick-search line [zipfs root]/app/tcl_library (an error on the
backport) uses the derived base; internal_paths gains the derived base when no
zipfs volume root covers it; the internal-only simulate-kit branch recognises a
script under the derived mount as kit-internal.
make.tcl (necessary companion fixes - Scope extension flagged in the goal file):
- Runtime capability probe keys has_zipfs on tcl::zipfs::mount (was root, which
refused zip assembly for the backport; the block also rode a body-less
'if {![catch ..]}' that only worked because piped-stdin tclsh continues past
command errors).
- merge_over resolves relative fauxlink targets against the link file's own
directory (the fauxlink module's symlink semantics) - identical for the
pre-existing root-level links, required for the new nested one.
Payload + matrix:
- punk8win.vfs gains an app/main.tcl fauxlink beside root main.tcl: the
undroidwish family auto-runs app/main.tcl INSIDE the attached archive
(embedded /app/main.tcl string in the exe) and ignores a root main.tcl.
Inert in the metakit kits sharing the payload (punksys/punk86/punkbi verified).
- mapvfs.config: punkluck86 (tclsh8.6.10-luck-zip) + punk91ix86
(tclsh9.1b0-tclsfe), both zip kits targeting win32-ix86.
Tests + docs:
- New shell/testsuites/punkexe/kitmountpoint.test (4 tests): backport exe-path
attribution, modern-32 //zipfs:/app, baked punkexe regression pin,
unattributed-mount stderr report + no foreign paths. Self-gates on the
untracked verification runtimes.
- bin/AGENTS.md "Kit-wrappable runtime requirements (G-129)" + src/AGENTS.md
pointer, src/vfs/AGENTS.md boot contract, src/tests/shell/AGENTS.md suite doc,
ARCHITECTURE.md boot-chain bullet.
- Thin-layout + templates-modpod copies synced (make.tcl modules; _config boot
mains refreshed into the project-0.1 store layout per the
|
4 days ago |
|
|
df83b21a24 |
bootsupport: replace mounted modpods by delete-then-place, and explain the windows catch-all (punkshell 0.27.4)
'make.tcl bootsupport' failed three times this session replacing the zip-based
punk::mix::templates modpod, always with:
error copying "<src>" to "<dst>": invalid argument
Root cause, demonstrated rather than inferred. A zipfs mount MEMORY-MAPS its archive
(tclZipfs.c CreateFileMappingW + MapViewOfFile), and windows refuses to overwrite a file
with a user-mapped section open - ERROR_USER_MAPPED_FILE (1224). Any holder blocks it: a
running punk shell that loaded the modpod, a src-mode session, or the build itself.
Reproduced directly: the same file copies fine unmounted, fails while zipfs-mounted, and
copies fine again once unmounted.
The message is a dead end BY CONSTRUCTION, which is why two earlier attempts at
characterising this (in commit messages and in the archived G-124 detail file - first "a
modpod make.tcl has itself mounted", then "a transient lock") were both wrong in different
ways. Tcl_WinConvertError maps only Win32 codes 0..267 and sends everything above them to
errorTable[1], which is EINVAL - so EVERY high-numbered windows error surfaces as "invalid
argument", naming neither cause nor remedy. Byte-identical code in 8.6 and 9.1b1.
FIX. ::punkboot::replace_possibly_mapped_file tries the ordinary copy and, on failure,
falls back to DELETE-THEN-PLACE, which windows does permit: unlinking a mapped file leaves
the holder reading its own mapping while new content lands at the name (measured: delete
succeeds while mounted, the mount keeps serving its old content afterwards). Replacement
content is staged to a sibling <target>.punkboot-new first, so a mid-sequence failure can
never leave the target missing; a 'broken' return - unlinked and unrestorable - is reported
as a build failure naming the file to restore by hand. This replaces a narrower prior
workaround that only recognised the already-identical case and otherwise recorded FAILED.
DIAGNOSIS. ::punkboot::mapped_file_hint fires when a genuine failure carries the catch-all
message and explains what it actually means and which process class to look for, instead of
leaving "invalid argument" bare. It stays silent for unrelated errors.
Verified on the real failure: the bootsupport run that has failed all session now reports
"(in-place overwrite refused - replaced by delete-then-place; target was memory-mapped, e.g
a mounted modpod)" and completes, with no hand-copy and no rerun. Helper-level checks cover
the unmapped path (plain copy, unchanged), the mapped path (recovers, content correct,
holder's mapping intact, no temp left behind) and both hint branches. Full suite 1167 tests,
1146 passed, 1 failure - core/tcl exec-14.3, the documented baseline.
Documented in src/bootsupport/AGENTS.md, including the general warning that 'invalid
argument' from ANY windows file operation in Tcl means "some windows error above 267" and
must never be read at face value.
Also drafts G-132 (user-approved): the errno catch-all is upstream's defect, not ours, and
deserves reporting. The goal is deliberately shaped so an AGENT DRAFTS AND THE DEVELOPER
SUBMITS - no account use, no web form, no API - following the G-039 precedent, with the
submission-ready text staged in TEMP_REFERENCE and the finding, reproducer, eventual ticket
URL and disposition kept in the tracked detail file, because TEMP_REFERENCE is one
'git clean -xdf' from gone. The report's claim is deliberately narrow: the errno conversion
is plainly wrong, while the related fact that 'file copy -force' over a mapped file succeeds
on unix and fails on windows rides along as context rather than as a second demand.
punkshell's workaround is explicitly not removed if upstream fixes it - an upstream fix
dates it rather than deletes it.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
176f2ad702 |
punk-runtime list/use stop offering support files as runtimes (punkshell 0.27.3)
'bin/punk-runtime.cmd list -platform win32-ix86' listed a LUCK.url shortcut and a tclsh8.6.10-luck-zip.cfg build request as if they were selectable runtimes. Both payloads already filtered support files - .txt/.toml/.tm/.tmp/.log - so the mechanism existed and only the recognised set was too narrow. It was also duplicated across NINE filter sites in three syntaxes (a powershell array, a bash case pattern, a bash grep -E regex), and two of them had already drifted: the "not a selectable runtime" guard omitted .log and matched *_BUILDCOPY without a trailing wildcard. The set is now defined ONCE per payload - $PunkRuntimeSupportExt / Test-PunkRuntimeSupportName in the ps1, punk_support_ext_re / is_punk_support_name in the bash - and every site consults it, so the two payloads cannot drift apart. Their listings are required to agree byte-for-byte and now do so by construction. Recognised support files, by category: docs/text (.txt .md .html .htm .pdf .url), config/metadata (.toml .json .xml .yml .yaml .ini .cfg), dev leftovers (.tm .tmp .log .bak .old), checksums/signatures (.sha1 .sha256 .asc .sig) and archives (.zip .tar .gz .bz2 .xz .7z), plus any *_BUILDCOPY* name. Anything else is still treated as a runtime candidate - deliberately, so a stray binary is visible rather than silently hidden. Verified: the win32-ix86 listing drops from 6 entries to the 4 real runtimes; the bash helpers produce the identical four (the polyglot routes msys bash to the ps1 payload on windows, so the bash side was exercised directly). Re-wrapped per bin/AGENTS.md with checkfile ERROR-free; runtimecmd_roundtrip (byte-identity), runtimecmd_checkfile, runtimecmd_freshness (10/10, both payloads against the fixture server) and runtimebash_wsl (8/8) all pass, as does the full suite at its documented baseline. bin/runtime/README.md now states what a platform folder is FOR (a store tier keyed by the platform a runtime is for, not by this machine) and what is tolerated in it, with the recognised-support-file table and the warning that anything else will be offered as a runtime. It is force-added to git: /bin/* is ignored and a ! negation cannot re-include a file inside an excluded directory, so git add -f is the only mechanism - recorded in the .fossil-settings/AGENTS.md force-tracked one-off list, whose fossil counterpart is an explicit 'fossil add' at the next catch-up checkin. Also records in G-101 a survey of TEMP_REFERENCE/androwish for the zipfs-on-8.6 question the developer raised (non-contract findings; pointer added to TEMP_REFERENCE/AGENTS.md per its contract so the survey is not repeated). The undroidwish zipfs backport is ADDITIVE - generic/zipfs.c (6586 lines) + zipfs.h + a library/zipfs1.0 dir + one object line in the win and unix Makefiles - so it is carryable as a suite patch rather than a fork; it is C rather than C++ like mk4tcl; Tcl_StaticPackage registration is gated on ZIPFS_IN_TCL / ZIPFS_IN_TK, i.e. designed to compile into tcl or tk; and it is Christian Werner's, under the tree's Tcl-style license.terms. Its capability delta against Tcl 9 zipfs is recorded (no 'root', no ::zipfs ensemble, and not registered in child or thread interps), as is the exe-path mount convention that motivates G-129. Provenance of our specimen is established: LUCK is a CGI repacker that selects packages out of a prebuilt vanillatclsh binary's ZIP, so bin/runtime/win32-ix86/tclsh8.6.10-luck-zip.exe is a repack of androwish's own build - a working existence proof of zipfs-on-8.6 rather than a claim. Three open questions are recorded rather than guessed: whether it applies to 8.6.18 (the tree is 8.6.10), whether it builds under the pinned zig, and where the boot-time self-mount hook lives - stock tclAppInit calls Tclzipfs_Init only under #ifdef TCL_TEST, so it is in the vanillatclsh/undroidwish application main, which is also the hook a dual-container autodetecting boot would need. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
4 days ago |
|
|
20ee103120 |
boot-precondition gate learns the exe-path-mount tcl library convention (punkshell 0.27.2)
The G-125 gate refuses a kit whose merged .vfs supplies no tcl library. It knew two conventions - tcl_library/ for zipfs-attached kits and lib/tcl<major>.<minor>/ for starkit-style ones - which covered all ten kit trees this project builds. A third-party runtime under evaluation (Lean Undroidwish Construction Kit, 32-bit windows, Tcl 8.6.10) uses a third: its attached archive mounts at the EXECUTABLE'S OWN PATH rather than at //zipfs:/app, so [info library] is <exe>/tcl8.6 and the library sits at tcl8.6/ in the root of the tree. The gate reported that runtime unbootable - a false refusal on a directory that is unmistakably a complete Tcl library (auto.tcl, clock.tcl, encoding/, history.tcl, init.tcl, package.tcl ...). Found while investigating whether our bake infrastructure can handle that kit; the androwish/undroidwish zipfs backport for 8.6 mounts this way generally, so it is a family of runtimes, not one artifact. punkboot::utils 0.3.0 -> 0.4.0 adds tcl<M>.<m>/ at the vfs root as a third recognised location; the report's 'checked' list and the not-found reason name all three, as do 'make.tcl check' and the workflow K10 key note. Glob note worth keeping: the root tcl[0-9]* pattern also matches the tcl8/ and tcl9/ MODULE trees this project's own kits carry. They hold no init.tcl, so the existing qualification test rejects them without needing a narrower pattern - now pinned by bootlib_module_tree_not_a_library so a later tightening of the glob has to argue with a test rather than look like an obvious cleanup. Verified: the LUCK runtime's extracted tree now reports ok=1 locations=tcl8.6, and all ten assembled src/_build/*.vfs trees still pass with unchanged detected locations (tcl_library for the six zipfs kits, lib/tcl8.6 for punk86/punkbi/punksys, lib/tcl9.0 for punkshell902). Full suite 1167 tests, 1146 passed, 1 failure - core/tcl exec-14.3, the documented baseline. One of the gate's own punkexe pins failed first time round and was right to: re-wrapping the 'check' report split "...that / cannot initialise" across lines. The pattern now matches across the break rather than the assertion being loosened. Note this does NOT make such a runtime bakeable yet - src/vfs/_config/punk_main.tcl still probes zipfs with 'info commands tcl::zipfs::root' (a 9-era command the 8.6 backport lacks) and assumes the //zipfs:/app mount point, so a kit built on it would not find its own payload. That is separate work; this change only stops the gate refusing a tree that has a perfectly good library. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
4 days ago |
|
|
ec781d7019 |
punk::libunknown 0.2.3: pkgIndex.tcl scripts run in the global namespace again (punkshell 0.27.1)
A third-party 8.6 kit under evaluation (Lean Undroidwish Construction Kit, 32-bit windows)
could not load its own bundled twapi 4.7.2 inside punkshell:
P% package require twapi
invalid command name "twapi::set_scriptdir"
("package ifneeded twapi 4.7.2" script)
twapi's pkgIndex.tcl defines 'namespace eval twapi { proc set_scriptdir ... }' when the
INDEX is sourced, and its ifneeded script calls that command at require time. The command
existed - as ::punk::libunknown::twapi::set_scriptdir. punk::libunknown 0.2.0 moved index
sourcing out of 'namespace eval ::' into source_pkgindex, a proc of the punk::libunknown
namespace, to stop each index's helper variables leaking into the global namespace and to
stop a user global named 'dir' being clobbered. That fixed the frame, but a proc body
executes in ITS OWN namespace, so an index's RELATIVE 'namespace eval foo' started
creating ::punk::libunknown::foo instead of ::foo. Stock tclPkgUnknown is a proc in ::,
so indexes have always had global resolution; the ifneeded script, evaluated later at
global scope, then looked for a command that was never there.
The body now runs via apply with :: as its namespace argument, which gives both
properties at once: a local frame (index helper variables still discarded, user 'dir'
still safe) and the global resolution context indexes are written against.
Not twapi-specific: any index that defines commands or namespaces at source time for its
own ifneeded scripts to use hits this, and the pattern is common in third-party indexes.
punkshell's own vendored twapi 5.0b1 happens to avoid it (self-contained 'apply' ifneeded
scripts), which is why the tree never surfaced it.
Verified on the LUCK 8.6.10 runtime end-to-end - 'package require twapi' at the punkshell
prompt now returns 4.7.2 with ::twapi::scriptdir correctly set - and pinned generically by
pkgindex_relative_namespace_is_global in the discovery suite, whose new fixture copies
twapi's pattern so no third-party kit is needed. The pin was proven to bite: driven
against the pre-fix body the same fixture fails with 'invalid command name' and leaves
::punk::libunknown::pklu_nsindex behind; against 0.2.3 it resolves and leaves nothing.
Full suite 1165 tests, 1144 passed, 1 failure - core/tcl exec-14.3, the documented
baseline.
Manual-version bump per src/modules/AGENTS.md: file renamed, Meta line, manpage_begin and
provide-block updated, version-history line appended. The rename sweep converted the two
goal Scope references (G-035, G-109) from the exact filename to the glob form
src/modules/punk/libunknown-*.tm that GOALS.md's own Scope-authoring guidance recommends,
so the reference stops drifting at every bump.
Also records in G-035 the mechanism behind its "avoid mixing .tm and pkgIndex.tcl
provision" folklore, which this investigation identified (non-contract Notes). Stock
::tcl:™️:UnknownHandler returns early when $satisfied is set and therefore never falls
through to ::tclPkgUnknown, so a require satisfied from a .tm suppresses the whole library
scan. Measured with a synthetic fixture on both 8.6.10 and 9.0.3: with mixpkg 1.0 as a .tm
and mixpkg 2.0 in an auto_path library under 'package prefer latest', stock returns 1.0
and reports only 1.0 from 'package versions', runs no index side effect and registers no
sibling package; the libunknown chain returns 2.0 and does all three. libunknown already
neutralises it - its handler still computes $satisfied but the early return is commented
out - and that unconditional fallthrough is exactly what the epoch cache pays for. The
folklore is therefore substantiated for stock Tcl with a named failure mode (silent
older-version selection) and neutralised under the punkshell chain, with stock behaviour
still reachable in any interp that has not run punk::libunknown::init.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
b7c632b670 |
G-125 achieved: a kit that cannot boot is not deployed (punkshell 0.27.0)
The kit machinery already knew when it had failed to extract anything from a source
runtime, and under G-122 that notice became a recapped BUILD-WARNING - but the build
still assembled an artifact, DELETED the deployed kit and copied the new one over it,
closing running instances of the kit first. Field-observed 2026-07-26: an msys2-hosted
bake of punk91 produced a 49,501,792-byte bin/punk91.exe that failed at startup with
"application-specific initialization failed: Cannot find a usable init.tcl", by which
point the previously working kit was already gone. G-124 removed the particular cause;
this removes the class. A build tool should not make a working executable worse.
A bake now refuses any kit whose merged .vfs supplies no tcl library: the kit is listed
under FAILED KITS with a reason naming the cause and NOTHING is written - no
src/_build/<kit>, no deploy, and the previously deployed bin/<kit> is left byte-identical.
The gate sits immediately after the _vfscommon.vfs + <kit>.vfs merges and before the
kit-type assembly switch, the last point at which no build product exists; a refusal
appends to failed_kits, ends the punkcheck event FAILED and continues, so the punkcheck
records stay consistent with what is on disk. The merged src/_build/<kit>.vfs tree is
deliberately left behind - it is the evidence for the refusal.
It gates on the BOOT PRECONDITION, not on the extraction step having run. Some .vfs
folders legitimately supply their own tcl library (src/vfs/punk8_statictwapi.vfs,
punk9test.vfs and mkzipfix.vfs do today), and those must keep building - so the check
reads the merged tree. It is structural and executes nothing, which also makes it valid
for cross-target kits this host could never run, and costs 0.63ms per kit (measured over
200 iterations against the real src/_build/punk905.exe.vfs), so it runs unconditionally.
The predicate is punkboot::utils::vfs_boot_library_report (0.2.0 -> 0.3.0), called through
a guarded require modelled on the existing get_src_provenance_warnings: a stale or missing
bootsupport snapshot degrades the gate to a NOTE rather than failing every kit. Both
branches were observed live - before the bootsupport propagation 'make.tcl check' reported
UNAVAILABLE, after it ACTIVE. Scope was extended at activation (user-approved) to put the
predicate in that module rather than private to the build script, because a gate that
cannot be exercised cannot be characterized, and punkboot::utils is already where
make.tcl's provenance gate helper lives.
What qualifies as a tcl library: tcl_library/init.tcl (zipfs-attached kits) or
lib/tcl<major>.<minor>/init.tcl (starkit-style), AND at least one companion file beside it
(tm.tcl, package.tcl, auto.tcl, clock.tcl, history.tcl, word.tcl) or an encoding/
directory. The companion test is load-bearing: every punkshell kit carries
lib/BWidget1.10.1/init.tcl, so a check that looked for any init.tcl anywhere would pass a
kit with no tcl library at all. lib/tcllib2.0 is correctly not matched by the lib/tcl[0-9]*
glob. Verified against all 10 assembled trees in src/_build - both conventions are
represented (tcl_library for punk902z/punk905/punk91/punk9_beta/punk9bi_beta/punkmagic,
lib/tcl8.6 for punk86/punkbi/punksys, lib/tcl9.0 for punkshell902).
The no-extraction BUILD-WARNING was reworded from "will not initialise unless src/vfs/<x>
supplies one" - a consequence the build then ignored - to "will FAIL the boot-precondition
gate unless src/vfs/<x> supplies one". It stays a warning rather than becoming the failure,
because a .vfs that supplies its own library needs no extraction.
Verified 2026-07-27 end-to-end against a temporary fixture kit (a mapvfs entry pointing a
zip kit at a payload-free runtime, plus a vfs with no tcl library), with sentinel files
standing in for a previously deployed kit and a previous build product. Across the failing
run bin/punkgatefixture.exe (sha1 2a0700eb...) and src/_build/punkgatefixture.exe (sha1
12c50567...) were byte-identical with unchanged mtimes, and the kit was reported under
FAILED KITS with the cause named. Adding tcl_library/{init.tcl,tm.tcl} to that same fixture
vfs - extraction still yielding nothing - made it build and deploy normally, which is the
other half of the criterion. The fixture was removed afterwards and mapvfs.config restored
byte-identical to its backup. Real-kit bake through the gate: punk905 builds, deploys and
boots.
Characterization: 12 tests in modules/punkboot/utils/testsuites/utils/bootlibrary.test
(both conventions, the companion-file requirement and its BWidget decoy, near-miss
reporting, missing/empty trees, and a sweep asserting every assembled src/_build/*.vfs
tree still passes so the gate cannot fail kits that boot today) and 2 in
shell/testsuites/punkexe/maketclbootgate.test (the ACTIVE/UNAVAILABLE report, ESC-free per
the G-113 piped policy). Existing punkexe suites pass unchanged.
Documented in src/AGENTS.md with the remedy when a kit is refused, in ARCHITECTURE.md
beside the provenance gates, and in the embedded 'make.tcl workflow' data flow as key note
K10 (verified under the default and PUNKBOOT_PLAIN=1 paths, within the 100-column budget).
The achieved flip archives the entry and the detail file, and sweeps the live tier: G-127
(its output location inherits the never-written guarantee as long as the gate stays
upstream of the artifact write, and its payload/target mismatch reporting should share this
vocabulary), G-028 (the sibling "why bin/<kit> was not updated" surface in the same deploy
step) and G-101 (a new container type must land its library where the gate looks, or extend
the location list).
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
78d9bf238a |
G-124 achieved: dependency-free zip reading in punk::zip (punkshell 0.26.0)
punk::zip could write a zip and split an executable-prefixed one, but nothing in the tree
could READ a zip without zipfs, vfs::zip or tcllib's zipfile::decode - a system package
punkshell does not vendor, with exactly one consumer: make.tcl's zipfs-less kit
extraction. Measured at drafting: msys2's /usr/bin/tclsh8.6 has no tcllib, so a bake
driven from that host could not lift the runtime's own zip (its tcl_library) into the kit
and the artifact did not boot.
punk::zip 0.1.1 -> 0.2.0 adds three commands, stock Tcl only. archive_info reports where
the archive begins inside its host file and which offset convention it uses; members
walks the central directory and returns one dict per entry without decompressing
anything; unzip extracts all or part of it with every member's crc32 verified,
directories materialized, and the writer's 2MB whole-member-vs-streaming threshold
mirrored. All three accept a plain .zip or a zip attached to an executable or script
prefix, so "what is inside this kit / runtime / modpod" is now answerable on a runtime
without zipfs.
The offset derivation is stated once and shared: offsetbase = cdiroffset - diroffset.
Positive means an external preamble with archive-relative offsets, zero means the offsets
are file-relative (or there is no preamble); dataoffset is the split point either way.
Because every surface reads the ORIGINAL file at that base, the file-relative shape stops
being a special case - the broken split-off intermediate is never produced.
tclsh90b4_piperepl.exe is the store's one file-relative artifact: the old
split-then-tcllib path still fails on it with exactly "Bad zip file. Bad closure.", and
it now extracts all 841 members crc-verified in 735ms.
extract_preamble consumes that machinery instead of carrying its own scan, and two
defects went with the refactor: it read 28 bytes of a 30-byte local file header, and it
derived the file-relative base from the FIRST central directory record only (its own
'#todo! loop through all cdr file headers'). The shared walk takes the minimum over ALL
records and then validates that a PK\3\4 really sits there. Its five puts stdout debug
lines are gone.
Refusals are decided for every selected member before any file is opened, so an
unsupported archive cannot leave a half-populated directory: encrypted entries, zip64
size/offset fields, unknown compression methods, crc mismatch (partial file removed) and
member paths that would escape the target are each named. Store and deflate only,
mirroring the writer's own primitives.
make.tcl's zipfs-less extraction now calls punk::zip::unzip on the original runtime and no
longer creates the extracted_<runtime>.zip intermediate. No punkshell code requires
zipfile::decode any more. Two categories of hit remain and are deliberate: tcllib's own
zip/decode.tcl shipped as a LIBRARY inside some .vfs payloads, and one guarded optional
probe inside the vendored third-party ooxml1.10/ooxml.tcl.
First tests punk::zip has ever had (src/tests/modules/punk/zip/), covering the three
archive shapes from one source tree, the introspection output, the named refusals, and
the mkzip -> read round trip - the first coverage that what punkshell WRITES is readable.
Verification, all 2026-07-26. Reference host for the dependency-free claim: msys2
tclsh8.6 8.6.12, probed as zipfs / vfs::zip / zipfile::decode all ABSENT - suite driven
there harness-free, 28 passed, 2 skipped (the zipfs-gated cross-checks only), 0 failed.
30/30 under Tcl 9.0.3, 28 + 2 skipped under native 8.6. Full source-tree suite after the
change: 1142 tests, 1 failure - core/tcl exec-14.3, the documented baseline. Independent
cross-check: 868 members of tclsh905.exe extracted byte-identical against the same
archive mounted with tcl zipfs. Bake demonstration: 'bake -confirm 0 punk905' driven by
the msys2 tclsh8.6 (host=msys-x86_64, target=win32-x86_64) produced
extracted_tclsh905.exe/{tcl_library,lib} with no intermediate .zip, and the deployed kit
boots with tcl_library at //zipfs:/app/tcl_library, 95 encodings, msgcat 1.7.1, http
2.10.2 - and reads itself with the new reader.
Trap worth keeping: zlib stream inflate's 'get' returns only what the stream has already
produced, so one get per put silently truncates a large member to the first few chunks
(measured 327680 of 5048890 bytes on both 8.6.12 and 9.0.3). The inner drain loop is
load-bearing, and the >2MB streaming test exists to catch its removal.
Standing question answered and pinned: zipfs does NOT misidentify punk::zip::mkzip
directories. It keys on the trailing slash (which punk::zip::walk always emits), not the
stored permission bits, exactly as the current cli-999999.0a1.0.tm wording says - the
older, less precise wording survives only in frozen module snapshots under
src/vfs/mkzipfix.vfs and src/vfs/project.vfs. The real difference from zipfs mkzip is
that zipfs writes no directory entries at all.
The achieved flip archives the entry and the detail file, and sweeps the live tier: G-034
(the reader is its extract-rather-than-mount alternative, plus the measured finding that
make.tcl on 8.6 cannot mount its own templates modpod), G-101 (the read half of a
zipfs-less 8.6 container is solved), G-125 (the gate now has a named failure reason to
report), G-126 (the member-dict keys and fixture set its parity suite must reproduce, and
a back-pointer to G-128 whose only recorded bridge was this goal), G-128 (archive_info
answers "is this artifact safe to move the overlay of?" in one call).
One acceptance clause is reported for review rather than claimed silently: "NO
zipfile::decode requirement remains anywhere in the shipped tree" is satisfied for
punkshell's own code, with the vendored-third-party residue named above.
The archived detail file's diff is a rename plus the flip's evidence write-up.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
04d2a51b67 |
G-122 achieved: make.tcl bakes by target platform, not host personality (punkshell 0.25.0)
Everything a bake EMITS is now keyed by the artifact's TARGET platform rather than the driving tclsh's personality: the bin/runtime/<tier> store a runtime is read from, .exe suffixing of runtime files and kit outputs, presence checks, and whether the pre-deploy process sweep uses tasklist/taskkill or ps/kill. Host semantics - copy commands, path handling, filesystem case rules, prompts - stay keyed to the host. The default target is the host's platform canon EXCEPT for a cygwin-family host (an msys2/cygwin-runtime tclsh, which reports tcl_platform(platform) unix on windows), which targets win32-x86_64. Such a host now drives the identical kit set, names and store addressing as a native tclsh; before, it reported every kit runtime=missing against a nonexistent mingw64-x86_64 store. mapvfs.config entries take an optional 4th element naming the kit's target platform, so a runtime kept in another platform's tier is a first-class mapping entry. The linux tclkit entry now declares linux-x86_64 and bakes to a suffixless bin/punkshell902. Zip-type kits assemble without zipfs in the driving tcl: when tcl::zipfs::mkimg is absent (any 8.6) the image is built by raw-runtime split + punk::zip::mkzip + concatenation - the same helper the zipcat type uses. Both mount identically (archive-start-relative offsets). Fixes exposed by the above: the runtime capability probe looked for a suffixless filename and so reported find-fail for every runtime on windows; with real capabilities arriving, the extraction try-list was found to test capability presence rather than value, which would send a plain zipfs runtime down the kit path where a failed sdx mksplit replaces raw_runtime with the un-split original; BUILDCOPY names now follow the runtime's own filename; runtime map keys strip only .exe (file rootname would eat the last dotted segment of tclsh9.0.5); and native windows command lines run through a guard suppressing msys2's posix-path argument rewriting - without it taskkill /PID <n> reached taskkill as taskkill C:/<msysroot>/PID <n>, so the sweep could find a running kit but never replace it. punk::platform folds the msys2 family (mingw64/mingw32/ucrt64/clang*) onto one stable 'msys' tag and CYGWIN_NT onto 'cygwin' - msys2's uname renders that token from MSYSTEM, so one binary otherwise canonizes differently per launching shell. New normalize_os; cygwin-x86_64 added to the platform table; 'help platforms' documents the fold. make.tcl check reports the derivation on one line; bakelist rows carry target=<platform> for non-default targets and the detail block names the tier; workflow text gains key note [K9]. New characterization suite maketclplatform.test (5 tests, two self-gating on discovering and probing a real msys/cygwin tclsh). Full suite 1112 tests: 1093 passed, 18 skipped, 1 failed = the documented exec-14.3 baseline. Verified: msys2 tclsh8.6 bakelist output identical to native Tcl 9; a changed punk91 baked and deployed from that host with the sweep killing a running instance msys ps cannot see; a real cross-target linux kit baked from windows to a 24MB ELF; a zipfs-less 8.6 bake producing a bootable zip kit. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
5 days ago |
|
|
d9061b90ce |
bakelist/bake: loud missing-store-folder diagnosis; punk::platform into bootsupport (punkshell 0.24.1)
Field-driven follow-ons to G-121 from driving make.tcl with an msys/cygwin-runtime tclsh (scoop msys2 tclsh8.6, tcl_platform(platform)=unix): - bakelist: when the derived per-platform runtime store folder does not exist, a stderr WARNING now shows the platform-canon derivation (tcl_platform os/platform -> canon, observed mingw64-x86_64 under a MINGW64_NT MSYSTEM env) and the header line carries (FOLDER MISSING) - every row reading runtime=missing now self- diagnoses its non-per-entry cause. bake's "No executable runtimes found" exit gains the same note when the folder is absent. Native-host output unchanged (maketclbakelist.test 4 PASS). - make.tcl shell 'help platforms' degraded to "punk::platform package not available" on ALL hosts (not msys-specific): the module was absent from the bootsupport snapshot. Added punk::platform to src/bootsupport/modules/include_modules.config (pure Tcl, deps only Tcl's own platform package); verified the full canon table renders via a piped 'help platforms' under tclsh90 src/make.tcl shell. - G-013 Notes: recorded the msys raw-mode field finding (cursor placed at row 1 after each command under the msys pty class) as a raw-mode-default blocker dimension - console/repl work, deliberately outside the make.tcl host/target catering goal being drafted. Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
0abd07ecd7 |
G-121: make.tcl bakelist + selective bake (punkshell 0.24.0)
One parsed-mapping model (::punkboot::lib::mapvfs_parse / mapvfs_kit_outputs / mapvfs_match_outputs) now backs the kit surfaces - the bake machinery, the new bakelist report and the bake/bakelist argdoc kit-name choices all consume the model, never the file format, so the G-024 toml conversion can swap the reader underneath. - bakelist ?kitname ...? (informational SUBGROUP): kit name, type, runtime with presence, vfs folder, deployed state of bin/<kit> vs src/_build/<kit> (current|stale|absent|nobuild; size/mtime fast path, byte-compare when in doubt), anomalies as trailing key=value notes (runtime=missing, vfs=missing, rtrev=r<cur><r<max> via the shared runtime_materialization_check core). Name filtering doubles as per-kit detail (resolved paths/sizes/mtimes). - bake ?kitname ...?: selective kit assembly - unknown names error before any build listing the configured names (flag-order hint included); selected-but- unbuildable kits (missing runtime/vfs) fail fast; runtime BUILDCOPY/caps probe/vfs cksums/vfslibs phase all narrow to the selected kits so other kits' _build/bin artifacts and punkcheck records stay untouched. Bare bake unchanged (verified full-set run). Deprecated alias vfs mirrors the values. - argdocs: SUBVALUES/VALUES_SYNOPSES mechanism, kitname choices enumerated from the mapping at define time (-choicerestricted 0, degrade-safe), block-form help values; SUMMARIES/HELPTEXTS/SUBOPTS/SUBGROUPS/known_commands/plain gethelp/workflow text updated per the update contract; degraded-mode (PUNKBOOT_PLAIN) dispatch collects trailing kit names. - mapvfs.config todo comment retired to point at G-121. - piped characterization: src/tests/shell/testsuites/punkexe/maketclbakelist.test (full-report row/vocabulary + ESC-free, filtered detail, unknown-name errors on both surfaces with the no-build guarantee) - 4 PASS; maketclcolour.test still 3 PASS. - selective-refresh verification (recorded in the goal file): forced punk91 rebuild + deploy via 'bake -confirm 0 punk91'; stat diffs over src/_build and bin show only punk91.exe, punk91.exe.vfs, raw_tclsfe-x64.exe and bin/punk91.exe changed; .punkcheck diffs mention only punk91's records (negative grep for all other kit/vfs names clean). - docs: src/AGENTS.md work-guidance bullet; ARCHITECTURE.md build-entry subcommand list refreshed (bake/bakehouse naming + bakelist, stale in-flux G-112 mention dropped); CHANGELOG 0.24.0 + punkproject.toml minor bump. Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
f5e3ed1ce0 |
colour policy: unix-class 8.6 terminals detected via the tty channel signature (-mode)
Second 8.6 tty rung: on unix-class Tcl 8.6 (linux/WSL/mac AND msys2/cygwin- runtime builds, which report tcl_platform unix even on a windows machine - e.g the scoop msys2 usr/bin/tclsh8.6), real ttys are isatty-gated into the tty channel type and expose the serial/tty options (-mode etc) that pipes/ files lack - a zero-exec, dependency-free discriminator exactly parallel to -winsize. Verified: WSL 8.6.14 pty mode=tty colour on ansistrip=0 vs piped tcl86-plain stripped; msys2 8.6.12 piped tcl86-plain (interactive -mode presence per field report); windows batteries + punkexe suites 54/0 unchanged. Together with the 0.23.2 windows console-encoding signature this completes dependency-free 8.6 tty detection - the planned G-122 probe-ladder goal (procfs/test -t/twapi rungs) is superseded before drafting: channel signatures cover every case without exec or optional packages. Also confirmed by byte-diff: 8.6 and 9.x piped help renders are IDENTICAL (modulo native-8.6 zipfs warnings) - no 8.6-specific rendering defect exists; the top-level help's wide Description indent is a cross-version cosmetic of that one constructed definition, present on 9.x too. punkshell 0.23.3 + CHANGELOG; src/AGENTS colour bullet updated. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
ac7dcdb02a |
colour policy: never wrap utf-16 console channels; 8.6 windows console auto-detected by encoding signature
Defect: the G-113 ansistrip transform was pushed onto Tcl 8.6 windows CONSOLE
channels, which encode utf-16 ('unicode') - at byte level ESC arrives as 1B 00
so sequences passed through unstripped and the hold-back carry deferred/
dropped real content, seriously mangling interactive punk86/punksys
'src/make.tcl help' layout (user-reported). Chunk-boundary handling itself is
sound: a rig proved strip output invariant across chunk sizes 1..4096 over
byte-transparent encodings; the failing dimension was encoding, not cutting.
(Comparison recorded: shellfilter::chan::ansistrip is the complement - it
decodes per the channel encoding and buffers undecodable tails, but assumes
line-buffering for sequence splits.)
Fix is detection, not utf-16 stripping: only 8.6 windows console channels
report -encoding unicode (pipes/files get the system encoding; hidden-console
probes confirmed across bawt tclsh86 8.6.13, punk86 8.6.17, punksys 8.6.13;
tcl9 consoles report utf-16 but are caught by -winsize first). The policy now
treats that signature as tty: mode=tty, colour ON, no transform - interactive
8.6 windows colour with no env var and no twapi. The transform push is now
PER CHANNEL and skips utf-16-class channels ('> file' from an 8.6 console
wraps stdout only - stderr console keeps its ANSI); ansistrip_pushed is the
wrapped-channel list, shell pops exactly those, policy/check lines print
ansistrip=stdout+stderr|stdout|0.
Verified: hidden-console 8.6 x3 mode=tty ansistrip=0; half-redirected punk86
console run ansistrip=stdout; piped 8.6/9 batteries unchanged (zero ESC,
force re-colours); punkexe suites 54/0 (maketclcolour pins updated to the
channel-list format). punkshell 0.23.2 + CHANGELOG; src/AGENTS bullet updated.
8.6 unix/WSL stays plain-by-default pending the probe-ladder goal.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
a646f1089f |
punk-runtime use accepts suffixless names; make.tcl bake materialization staleness guard
use wart fixed (both payloads + rewrapped bin/punk-runtime.cmd, checkfile ERROR-free, scriptwrap roundtrip + binscripts freshness suites green 35/0): candidate lookup falls back to <name>.exe when the exact name is absent - exact names (incl. extensionless unix artifacts in foreign -platform staging folders) still match first. Verified live in a throwaway platform folder via the .cmd (ps1 payload) and the bash payload driven directly (msys exe-magic already masked the wart under msys bash; the fallback serves real unix shells). make.tcl: new ::punkboot::runtime_materialization_warning (warn-only, local, no network) - the kit loop compares each wrapped working runtime's beside-toml revision against the highest -r<N> artifact revision in the same folder and emits a recapped BUILD-WARNING naming the repair command. Verified live: toml demoted to revision=1 fires the warning once + recap (and would have caught today's stale-r1 punk9_beta incident at the first bake); current state silent; no spurious rewraps. Pre-family runtimes (no toml) and direct -r<N> references stay silent. Docs: bin/AGENTS.md runtime-manager contract (suffixless use + guard note), src/AGENTS.md Work Guidance bullet; G-121 Notes records the guard as bakelist's acting-path complement; G-031 Notes records the make.tcl-shell punkexe-surface question with the boot-core vehicle recommendation. punkshell 0.23.1 + CHANGELOG. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
221c2c4fff |
G-112 rename core: bake/bakehouse stage-true vocabulary, deprecated aliases, vfslibs fold
vfs -> bake (kit assembly; vfslibs phase folded in so a bake cannot ship stale binary libs), project retired -> bakehouse (packages + bake, -dirty-abort default ON, refusal names the granular developer flow). project/vfs remain as deprecated aliases: one-line stderr notice + pre-dispatch mapping; alias argdocs mirror their targets so flags parse identically. vfslibs survives as a standalone narrowing (in-session decision recorded in the goal file). SUBOPTS/SUMMARIES/HELPTEXTS/SUBGROUPS/known_commands, end-of-run guidance, plain gethelp and workflow text rewritten to the two-persona model (groups: build & bake / promotion gates / source maintenance / deprecated aliases). Verified: tabled + PUNKBOOT_PLAIN help; dirty-tree refusal via bakehouse and via the project alias; alias help renders. punkshell 0.23.0 + CHANGELOG. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
e03ce1d64a |
G-113: make.tcl terminal-aware colour policy (tty probe, force overrides, zero-ESC piped)
Startup policy: NO_COLOR > PUNK_FORCE_COLOR/FORCE_COLOR > stdout -winsize tty probe (Tcl 8.7+/9); Tcl 8.6 fails OFF. Piped/unknown non-forced runs push an ansistrip transform on stdout+stderr - zero ESC bytes from every emitter incl. module-side (punk::ansi's colour_disabled deliberately keeps non-colour effects; design finding recorded in the goal file). shell pops the transform. sgr_cache cleared for punk-exe-hosted pre-loaded interps per the punk::ansi contract. define_global_ansi fully gated; raw-SGR literals routed through new ::punkboot::sgr gate (fixes a malformed \x1b\31m). check reports the policy. make.tcl converted CRLF->LF. Verified: tclsh90 + punk91 kit piped zero-ESC (check/help/workflow/modules); force overrides re-colour piped output; NO_COLOR always suppresses colour; 8.6 tcl86-plain; real Windows console mode=tty (hidden-console evidence); WSL pty mode=tty vs piped-plain (tclkit-902-Linux64). New suite punkexe/maketclcolour.test 3/3. src/AGENTS.md bullet revised; punkshell 0.22.2. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
5d207dbfb6 |
G-120 active: libunknown 0.2.2 fixes leaked static-probe interp pinning std channels
Activation: proposed->active flip (user-confirmed), goals_xref score re-run recorded in detail Notes (nothing beyond the drafting survey). Holder named: punk::libunknown zipfs_tm_UnknownHandler's builtin-static shortcircuit leaked its version-probe child interp 'ptest' whenever an UNVERSIONED package require of a true static reached the handler - 'package vsatisfies $v' with zero requirement args throws wrong#args, skipping both interp-delete lines. The leaked non-safe child holds registrations on the process std channels, so 'chan close stderr' left the OS handle alive and the slot occupied; the next open got a fileN name and puts stderr failed (punk91/tclsfe-9.1b0 only: Thread is a true static there, punk905 loads it from a dll so the block never fires). Fix (0.2.2): auto-named probe interp deleted in try/finally; zero-requirement requires accept any provided static version; probe errors fall through to the normal tm search. Disposition recorded in the goal detail: leak, fixed - not console-ownership machinery. Verified: bin/punk91 src script recipe yields channel auto-named stderr with working puts stderr; libunknown+console+repl suites 105/105 pass (tclsh90). punkproject 0.22.1 + CHANGELOG. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
19c63ac60e |
punk-runtime list -remote identity columns (G-119 follow-on, user-directed)
The starred active row previously never changed across 'use' switches (every -rN materializes to the same working name) and carried the name-keyed dead end '(not listed on server)' - true of the name, unexplanatory for a working copy whose bytes match a server artifact. Rows the server listing does not name now carry an untitled identity middle column: from=<artifact> for materialized working copies (the beside-toml source; content verified against that artifact's server sha1 so the Remote cell shows a real status - Same version, CONTENT DIFFERS for the immutable-artifact anomaly, or '(artifact not listed on server)'), sha1=<name> for tomlless byte-copies (default-first- then-ordinal pick, the same rule as the freshness fallback so row identity and freshness verdict always name the same artifact). '(not listed on server)' remains only for genuinely unknown files; the (server default) row annotation follows artifact identity onto working copies of the default. Table header/rules widened to the three-column layout, payload row formats now column-aligned across ps1/bash; help text updated; bin/punk-runtime.cmd rewrapped (checkfile clean). Chosen shape (user-approved from mockup variants): untitled middle column with self-keyed from=/sha1= tags - consistent with the plain list metadata summary's from= vocabulary and self-describing when a row is pasted without its header. runtimecmd_freshness.test +3 row-shape tests (identity columns, the identity-following default annotation, anomaly statuses) with ps1/bash parity: 10/10 pass; scriptwrap + binscripts battery 35 pass / 1 pre-existing skip / 0 fail (roundtrip + checkfile pins green, WSL row pins unaffected). bin/AGENTS.md + shell tests AGENTS updated. punkshell 0.22.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
f562d13d2e |
G-119: punk-runtime freshness verdict - active vs server default (both payloads)
list -remote now states the relationship between the ACTIVE runtime and the SERVER DEFAULT whenever both are known: explicit freshness: AHEAD/ BEHIND verdicts naming both revisions (BEHIND adds a fetch+use update guidance line), an equivalent current verdict where the (= server default) identity annotation did not fire, a different-series incomparable note, and a stated no-revision-basis note for pre-family actives - with sha1 VALUE-matching against the server sha1sums identifying a byte-copy of a server artifact by content (support-file rows excluded; first ordinal/C-collation match in both payloads). A NO-NAME fetch prints the same verdict as a one-line note when the active diverges from the resolved default (BEHIND carries an inline 'use <default>' hint - the artifact was just fetched). Revision basis: -r<N> parsed from artifact-named actives, else the beside-toml revision field (materialized working copies); the default's revision parses from its defaults.txt name. Verdict lines are byte-identical across the payloads; guidance lines keep each payload's program-name convention. Help text (list/fetch sections) mentions the new surface; bin/punk-runtime.cmd rewrapped (checkfile clean, no spacer resize). New fixture-server suite shell/testsuites/binscripts/runtimecmd_freshness.test: a child-process http file server (new src/tests/testsupport/httpfixture.tcl) serves a crafted punkbin layout behind the PUNKBIN_URL override; the ps1 payload runs as the staged committed .cmd via cmd.exe (wrap-pinned path), the bash payload directly under a probed msys/git bash (on windows the polyglot routes unix shells to the powershell payload; WSL bash rejected - WSL2 cannot reach a 127.0.0.1 fixture server). Covers the five G-119 acceptance scenarios with per-scenario ps1/bash verdict-line parity plus bash-side extras (different-series incomparable, fetch-mode BEHIND hint): 7/7 pass; scriptwrap + binscripts subtrees 32 pass / 1 pre-existing skip / 0 fail (roundtrip, checkfile, WSL, dtplite unaffected). bin/AGENTS.md runtime-manager contract records the verdict surface; src/tests + src/tests/shell AGENTS docs cover the new suite and helper. punkshell 0.21.0 + CHANGELOG entry. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
f5deb4d1b8 |
G-118 item 10: launch subcommand family docs as punk::args definitions (moduledoc punkexe)
New punk::args::moduledoc::punkexe 0.1.0: (script)::punkexe dispatch definition (package modes, subcommand enumeration, default reclassification) + (script)::punkexe::tclsh full contract (stock arg-form parity incl the deliberate no -e boundary (G-077), lib: refusal, piperepl ::tclsh state array + env gates, intended divergences recorded per item decisions 2/6/8) + summary definitions for script/shell/punk/shellspy. G-032-compatible: the launcher help/parse wiring renders from these ids later. punk::args 0.12.7: update_definitions handles tag-prefixed id namespaces first-class - namespace_docpackages consulted with the tagged key (usage/ real_id on registered-but-unloaded (script)::* ids no longer no-such-id), generic tag strip for the real-namespace probes, unqualified-ns warning no longer fires for tag ids. args/ns/repl suites 352 pass 0 fail. punk::repl 0.5.3: code-interp setup catch-requires the punkexe moduledoc beside tclcore (both sites) so the docs are queryable in any punk shell. ARCHITECTURE.md: tclsh subcommand bullet in the boot/launch chain (architecture_lint clean). punkproject 0.20.1 + CHANGELOG. Verified: fresh-interp usage-first render (real_id path); rebuilt punk902z kit self-carries 0.1.0 (5298-char tclsh render); piped punk session renders (script)::punkexe with no manual require. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
17250a8c97 |
tclsh subcommand G-118 items 3/4/5/9: argv0 stock parity, clean not-found, console fail-fast, project_main parity (0.20.0)
- 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 |
1 week ago |
|
|
1dd9940695 |
tclsh subcommand: stock arg forms (leading dash, -encoding) + lib: refusal (0.19.0)
- 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 |
1 week ago |
|
|
cf8449e4c9 |
punk::mod 0.1.2: version-aware punk::apps latest selection (audit fix)
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
|
1 week ago |
|
|
a76e73db31 |
punk-runtime: toml-aware list -remote for the published family artifacts
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 |
1 week ago |
|
|
a423d840e3 |
punk-runtime: deterministic ordinal listing order; AGENTS .ps1-twin knowledge corrected
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 |
1 week ago |
|
|
f842b286d5 |
punk-runtime list -remote: surface server default + active selection
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 |
1 week ago |
|
|
0ac4058bcd |
punk-runtime: no-name fetch defaults come from the server's curated defaults.txt
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 |
1 week ago |
|
|
5d3950799b |
Platform matrix: win32-ix86 - supported for third-party hosting, buildsuite candidate
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 |
1 week ago |
|
|
197f55f1b2 |
punk-runtime list -remote: local column uses the shared candidate filter (ps1)
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 |
1 week ago |
|
|
2ce3edc390 |
punk-runtime: 'platforms ?-remote?' action - server platform discovery via punkbin platforms.txt
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
|
1 week ago |
|
|
3a49aa4c48 |
punk::platform buildsuite axis; record binary-.tm platform-segregation constraints (G-109)
- 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
|
1 week ago |
|
|
cae9f36d3e |
Canonical punkshell platform names: punk::platform module, help topic, tree sync (G-105 groundwork)
Survey outcome (punkbin vs punkshell platform folders): five naming sites had drifted - punkbin folders, bin/runtime, vendorlib_tclX dirs, the punkboot platform_generic snips (an old platform::generic copy), and the Tcl platform package itself whose outputs vary by version (1.1.x renamed modern macOS to 'macos', aarch64/amd64 pass through unmapped). Canon: <os>-<cpu> punkshell platform-dir names, cpu normalized amd64->x86_64 and aarch64->arm64 (arm = 32-bit; on macosx arm folds to arm64 - Apple silicon is 64-bit only), os macos->macosx. The universal 'macosx' name is the runtime-tier convention (punkbin + bin/runtime keep one macOS folder, per make.tcl's existing collapse); per-arch macosx-x86_64/macosx-arm64 serve the lib tier. - new module punk::platform 0.1.0: platforms (canonical records with status supported/dormant/recognized + tiers), normalize, local ?-tier lib|runtime? - full PUNKARGS argdocs. Tcl's platform package stays the raw identifier underneath. - punk 0.2.7: 'help platforms' topic (alias 'platform'; all prefixes mutually ambiguous so they fall through to command lookup, per the env/environment precedent) - canon table with the local interpreter marked and raw platform-package identifiers for comparison. - boot: punkboot platform_punk (inline normalization copy, sync-comment contract with the module) in punk_main.tcl/project_main.tcl/make.tcl; all platform-dir call sites switched to it. make.tcl exercised live; main.tcl copies brace-verified. - vendorlib_tcl8/9 synchronized to canon: freebsd-amd64 -> freebsd-x86_64 (READMEs updated), freebsd-arm64/linux-arm64/macosx-arm64 added, tcl8's untracked-empty linux-arm now tracked + tcl9 gains linux-arm, stray untracked macosx-arm empties removed, msys-x86_64 marked dormant pending a utility decision, top-level READMEs state the canon contract. - punk-runtime bash prongs emit canonical names: aarch64 -> linux-arm64 (no fetch default until punkbin carries that folder), arch-aware freebsd/openbsd/netbsd/dragonflybsd via normalized cpu tokens. Rewrapped; roundtrip pin PASS; layout copy + .ps1 twin refreshed. Flagged for user decisions (recorded in G-105 Notes): punkbin linux-arm holds an arm64-named kit (recommend linux-arm64 folder at next arm publish; artifacts immutable), msys-x86_64 disposition, optional platform-1.1.x re-vendor, src/vfs stays mapvfs-categorized (recommend a mapvfs platform column when cross-wraps land, not a .vfs tree restructure). Project 0.18.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
d3bfc4484c |
G-103/G-105 groundwork: punk-runtime -platform surface, help action, no-args usage
Cross-build staging surface (both payloads in parity, rewrapped polyglot, layout copy + .ps1 twin refreshed, roundtrip pin PASS): - fetch/list/use accept -platform <p> (punkbin platform-DIR names, never zig triples); resolution: -platform arg > PUNK_RUNTIME_PLATFORM env > detected local platform; shape-only lowercase validation (server URL paths are case-sensitive - ps1 uses -cnotmatch; default -notmatch is case-insensitive and passed Win32-X86_64-class typos in testing). - foreign fetch requires an explicit runtime name (fetch defaults only make sense for the platform you stand on). - use -platform manages that folder's active.toml/materialization - the marker travels with the folder when deployed (provisioning story; unix exec bits restored at deploy time). - list flags !TARGET-MISMATCH when a runtime's metadata target disagrees with the folder it sits in (cross-fetch misfiling guard). - run stays LOCAL ONLY: rejects a leading -platform, ignores the env override, later args pass through to the runtime untouched. - new 'help' action (actions, options, env vars, examples) and a real usage block on no-args invocation (was a bare action list). - bash FreeBSD platform dir aligned to punkbin's actual freebsd-x86_64 (was freebsd-amd64; the G-105 platform-dir naming-alignment item). Verified on both payloads directly and through the wrapped cmd: noargs, help, local list unchanged, foreign use-materialization + mismatch flags, foreign-fetch refusal, run guard, env override (and run's immunity to it), bad-name validation. Project 0.17.9. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
168a98d85f |
G-106: powershell console-mode fallback overhaul - punk::console 0.8.0, canonical server script, tests (project 0.17.8)
Raw mode on twapi-less windows runtimes made dependable and quiet: lazy singleton server (tsv-shared per process, spawn no longer at module load), parent-pid self-reaping (no orphan pwsh), the 20s keepalive-without-pinger and the first-message listener kill (reader Close disposing the pipe stream) both fixed, disableraw served on no-inputmode runtimes (8.6 path), enable confirmed via live tcl9 -inputmode before return, script resolution env -> argv0 -> module-dir -> embedded copy (pwd fallback gone; kits need no scriptlib on disk). PUNK_PS_CONSOLEMODE_DEBUG=1 for diagnostics both sides. scriptlib/utils/pwsh reconciled: canonical consolemode_server_async.ps1 rewritten (protocol enableraw|disableraw|ping|exit, parent-pid watch, posh-git MIT attribution for the C# snippet), five experiment variants retired (consolemode_server.ps1, *_async1.ps1, *_async.2ps1, consolemode.ps1, consolemode_enableraw.ps1), README labels the folder. New console suite psfallback.test pins the embedded-copy/file sync and the resolution chain. punk::repl stale comment fix (no behaviour change). Verified per the recipe recorded in the goal detail file: hidden-console selftests on suite tclsh90spr + zipfs kit tclsh90sprzip (25s-idle survival, stop/respawn, zero orphans), live make.tcl-shell and bare-repl sessions driven by injected keystrokes (console mode 0x1E7<->0x1E1 read externally), embedded-resolution forced run, console testsuite 76/76. G-106 acceptance met - achieved flip recorded in the detail file; archive move follows in the next commit. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
61cf903dd9 |
G-103: punk-runtime list/use surface artifact metadata; use materializes -rN artifacts
Scriptset extension (ps1 + bash payloads in parity, rewrapped polyglot, layout-shipped copy + untracked .ps1 twin refreshed, roundtrip pin PASS): - list: per-runtime summary parsed from the <rootname>.toml metadata record beside each runtime (variant, tcl patchlevel, revision, piperepl on/off, from=<artifact> on materialized working copies). - use <artifact-r<N>-name>: materializes the immutable artifact into its WORKING name (minus -r<N>) with the metadata toml copied alongside, then selects it - the G-103 naming decision's artifact->working mapping, so republishing never churns consumers. use <workingname> unchanged. - fetch of -r<N> artifacts also retrieves the metadata toml from punkbin (absence tolerated for pre-family runtimes). - rootname handling strips only .exe (dotted patchlevels break last-dot stripping for extensionless unix names); same exe_split fix applied to family_artifacts.tcl artifact/toml naming for the G-105 cross-target future. Candidate listing excludes directories and .log files (parity cleanup; bash side previously listed directories). Verified on the wrapped bin/punk-runtime.cmd (powershell 5 branch) and the bash payload under git-bash: all three family members materialized from their -r1 artifacts with metadata shown in list, and 'punk-runtime run' launched the active punk family runtime (9.0.5, piperepl machinery, //zipfs:/app/tcl_library). Project 0.17.7. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
fbd19e9123 |
make.tcl bootsupport re-vendor: cli 0.5.2 (mkzip fallback operative for make.tcl runs); project 0.17.6
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
db08369654 |
make.tcl vfscommonupdate outputs: punkcheck 0.6.0, punk::lib 0.5.1, cli 0.5.1 into _vfscommon; project 0.17.5
Batched punkcheck-managed build outputs. All mapped kits rebuilt and redeployed against the refreshed _vfscommon (punkbi punksys punk86 punk91 punk905 punk902z) - shipped kits now preload punkcheck 0.6.0 (G-095 lock protocol) and punk::lib 0.5.1. Verification: rebuilt punk86 (8.6.17) runs the punkcheck subtree + compat suites 136 pass / 2 gated skips / 0 fail via runtests - including the child-process concurrency tests that need the kit's preloaded punkcheck to carry the lock API. Native Tcl 9.0.3 and 8.6.17 punkcheck subtrees re-verified 84/84. punk905/punksys sanity-probed (punkcheck 0.6.0 + lock API present). punkproject.toml 0.17.5 + CHANGELOG entry. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
482936dc00 |
make.tcl bootsupport re-vendor: punk::lib 0.5.1 (fixed compat lpop for the runner's toplevel boot); project 0.17.4
The runtests toplevel guard loads the bootsupport punk::lib snapshot - this re-vendor puts the parity-fixed compat family there (the testinterp guard already resolved the dev module via prefer-latest). punkproject.toml 0.17.4 + CHANGELOG entry. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
d0bfefdbcb |
G-095 achieved: punkcheck concurrent-writer safety (verification recorded); project 0.17.3
Acceptance verified in full (evidence in the detail file's Progress section): concurrency suite green on Windows Tcl 9.0.3 (runtests) and Tcl 8.6.17 (direct tcltest drive) plus a linux WSL tclsh 8.6.14 run from a native-filesystem staging - two-writer no-corruption/no-loss with a clean polling reader, lock timeout naming the holder, dead-pid and age stale-breaks, non-interactive duplicate-INSTALLER recovery. Real builds under the re-vendored 0.6.0 run with zero lock timeouts, zero tripwire warnings and unchanged decisions. Index entry moved to GOALS-archive.md; reference sweep: G-027's punkcheck note updated to achieved tense, G-028 gains the advisory-lock name-the-blocker precedent pointer. Detail file moves to goals/archive/ in the adjacent commit (pure rename). punkproject.toml 0.17.3 + CHANGELOG entry. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
e33dfe7ba5 |
G-094 achieved: punkcheck single record lifecycle (verification recorded); project 0.17.2
Acceptance verified in full (evidence in the detail file's Progress section): characterization suites pass with one recorded pin flip, lifecycle.test pins batch/OO field equivalence (-targets_cksums incl) and o_record_list coherence across sequential events, the retired-trio grep is clean, and a full make.tcl build completes with skip/copy decisions unchanged against pre-refactor .punkcheck state. Index entry moved to GOALS-archive.md; reference sweep: G-095 notes gain the chokepoint-achieved pointer, the transient concurrent-save evidence observed during verification, and the inherited MAX_PATH rider pointer (G-087/G-094, unaddressed); G-027's punkcheck note updated to achieved tense. Detail file moves to goals/archive/ in the adjacent commit (pure rename per the doc-restructure rules). punkproject.toml 0.17.2 + CHANGELOG entry (punkcheck ships in kits; the in-shell punkcheck API surface changed with the retirement). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
90a0e3ddce |
G-093 achieved flip edits + punkproject 0.17.1
In-place closeout edits ahead of the archive move (per the goals/AGENTS.md pure-rename discipline): detail-file Status flipped to achieved 2026-07-20 (all amended acceptance clauses verified - see the detail file's Progress record), the console-attachment finding pushed to live G-061's Notes as part of the archive reference sweep, and punkproject.toml patch-bumped 0.17.0 -> 0.17.1 for the punk::path 0.4.0 pathglob addition shipping in kit payloads (user-directed). goals_lint transiently red until the archive-move commit. Claude-Session: https://claude.ai/code/session_01BNUVVkYq9vHa6G3S9a3XTZ Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
e2fc7332fe |
G-087 stages 4+5: overlay merge primitive, marker/matrix retirement, version seeding
Stage 4 - documented overlay semantics implemented (commandset::layout 0.2.0): layout_materialize resolves a layout to its overlay chain (vendor tier then custom tier per store+vendor, <name>@<base> derived-layout folders expanding their base chain first, cycle-guarded) and composes multi-folder chains into a disposable staging dir applying <item>.anti deletion markers (zero-byte marker files recommended - committable, unlike the originally documented empty marker folders, which are also accepted). Single-folder chains with no markers are used in place, so punk.project (store and zipfs modpod) behaviour is unchanged. project.new (commandset::project 0.4.0) copies from the materialized path and the layout listing/scanning commands show the effective merged view. Fixtures: punk.othersample is now a live derived layout (new custom-deck fauxlink ref + .gitignore.anti demo marker); extra.txt/store README rewritten to the implemented semantics. New tcltest suite src/tests/modules/punk/mix/testsuites/layout/materialize.test (20 tests). Anti markers deliberately stay a plain filename convention rather than tag-bearing fauxlinks: a fauxlink is a reference tooling may follow (fcat auto-follows), a marker is a tombstone with no target. Stage 5 - retirements and generated-project version seeding: - The empty unimplemented child-side src/PROJECT_LAYOUTS_CREATE_FROM_... marker folder is deleted along with its project.new and make.tcl sync exclusions. - The vendor/custom x _project matrix collapses for layouts: custom/<vendor> is the one override level; _project folders join no overlay chain (the pseudo-vendor remains for decktemplates module/utility templates only). - project.new seeds generated projects post-materialization (only-if-missing, never from payload): punkproject.toml ([project] name + 0.1.0), a matching CHANGELOG.md ## [0.1.0] header, and punkorigin.toml - an interim generation provenance baseline (utc, layout name + resolved store target, punk::mix::templates version, punkshell version when derivable, origin path) for the G-027 pull design to adopt (noted in G-027). Also: script-mode/programmatic project.new robustness (explicit shellrun require; punk::mix::util askuser/do_in_path/foreach-file fully qualified - the util:: shorthand exists only after cli commandset import). Includes the concurrently-landed (other session, previously uncommitted) 0.3.1 early module-name validation fix in project.new, shipped within the 0.4.0 bump. G-087 flipped achieved 2026-07-19 (verification in the detail file; archive move follows in the next commit). punkshell 0.16.0 -> 0.17.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
411df7482b |
G-087 stage 3: thin layouts + generation-time bootsupport injection (sources)
punk::cap::handlers::templates 0.3.0: module-pathtype layout refs resolve against the providing module's own templates/project_layouts store (sibling of its layout_refs folder) instead of the never-existing <modulebase>/src tree - module-carried thin layouts become usable. punk::mix::templates 0.2.0: ships the thin punk.project layout payload inside the modpod (payload synced from src/project_layouts by make.tcl - see below); shellproject_multivendor declaration fixed decktemplates -> src/decktemplates (shell-project layouts/templates were invisible when cwd was outside any project). punk::mix::commandset::project 0.3.0: project.new injects bootsupport into the generated project at generation time via new lib::bootsupport_inject - manifest (include_modules.config) driven module resolution from the generating shell's project bootsupport tree, or a standalone kit's tcl:™️:list paths (999999.* dev versions never injected; latest-version non-glob semantics matching make.tcl bootsupport; adjacent non-.tm support files such as struct sets_*.tcl and textutil .tex data carried along; bootsupport lib* trees copied from a shell project, notice emitted for manifest-less standalone kits); punkcheck- recorded with plain-copy degradation. -layout now prefix-matches the live layout set instead of the package-load-time snapshot. punkcheck 0.4.0: start_installer_event no longer writes literal '$eventid'/ '$rel_source'/'$rel_target'/'$config' into event headers (braced-literal expansion bug, latent since inception - collided as duplicate ids when install and installtrack writers shared one db); sources with no common root vs the punkcheck folder (e.g //zipfs:/ module-mounted layouts) are recorded as independent absolute paths instead of erroring. punk::mix::base 0.1.1 -> 0.1.2 (manually versioned rename): cksum_path no longer hangs forever on vfs-mounted files - tcllib -file digest modes read via fileevent+vwait and zipfs channels never deliver fileevents (empty ZipChannelWatchChannel in core); non-native files are slurped and digested in data mode (new cksum_data_command per algorithm + cksum_crc_data/ cksum_adler32_data helpers; exec-based sha3 errors cleanly for vfs paths). make.tcl: custom/_project layout bootsupport-sync retired (project layouts store no snapshots); sync_layouts retargeted to thin vendor layouts (make.tcl, build.tcl + bootsupport manifest copies; punkcheck db at src/project_layouts/.punkcheck) plus store->modpod punk.project payload sync (excludes bin/sdx.kit and src/PROJECT_LAYOUTS_* marker; fossil settings kept via core-exclude override); bootsupport copy onto a modpod the running make.tcl has mounted records OK when target content is already identical (FAILED-record churn fix); workflow text updated (DIAGRAM 1b) and help/argdoc texts adjusted. bootsupport include_modules.config: added previously-recordless-but-required entries cmdline (fileutil dep), struct::set (make.tcl accelerators), textutil, textutil::expander, textutil::patch - generated projects' make.tcl now boots under a plain tclsh. Docs: root/src/bootsupport/punk AGENTS.md updated for the retired sync and build-managed modpod payload; goal detail G-087 stage-3 progress record; CHANGELOG 0.16.0 + punkproject.toml bump. Claude-Session: https://claude.ai/code/session_01WS3VakZo4sgbFzcQFW3twZ Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
4fc1d62ce2 |
agent skills: tcl-nslist namespace discovery; punk::ns 0.9.1 packagetails fix
New scriptlib/developer/nslist.tcl backing the new cross-framework tcl-nslist agent skill (.agents/skills/ canonical, .claude/skills/ synced copy): the discovery counterpart of whatis.tcl - lists what a namespace/package actually exposes at runtime via punk::ns::get_ns_dicts (the n// machinery): child namespaces with loadable-package markers, commands classified by kind, punk::args-documented commands, -synopsis whole-namespace usage lines, -pathcommands namespace-path resolution. Auto-package-requires unloaded packages and follows ensemble commands to their implementation namespace. The tcl-whatis skill/script cross-reference it (whatis redirects with a hint when the queried name is a namespace, not a command). punk::ns 0.9.1: get_ns_dicts packagetails/packageprefixes initialization moved inside the per-namespace loop - with multiple matched namespaces (path globs, trailing **) every dict after the first carried the union of all earlier namespaces' entries, mis-marking non-package children in nslist/n// underline styling and in the returned data; a child with several deeper packages below it was appended to packageprefixes once per matching package (now once). Pinned in nslist.test (nslist_classification_multins_package_buckets_reset). Documentation-only PUNKARGS added for get_ns_dicts (returned dict keys documented) and nslist_dict; parsing stays manual. Root AGENTS.md: introspection note + scriptlib/developer inventory updated. Project version 0.15.1 + CHANGELOG entry. punk::ns suite 102/102 pass. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
a65f9e5b67 |
shellrun 0.2.0 runx -teelog + runtests UDP watch mode (PUNK_TEST_UDPTEE)
runx -teelog {-tag/-syslog/-file/-raw settings}: live tee of the
captured stdout/stderr to shellfilter::log workers (log sources
<tag>stdout/<tag>stderr) while captured/returned data is unchanged.
Implemented as write traces on the capture variables rather than extra
channel transforms: probing showed a tee_to_log float combined with the
float-locked capture junction is starved or loses its worker settings
through add/remove churn (float-placement logic is unaudited - README
'very unripe parts'), and shellthread's parked-worker adoption does not
re-apply settings (writes silently misroute to a previous target). Both
findings deliberately not addressed here - recorded for a proposed
shellfilter/shellthread audit goal. Tag workers stay open for reuse;
conflicting reconfiguration errors explicitly.
runtests.tcl watch mode: env PUNK_TEST_UDPTEE=<port>|<host>:<port>
streams runner lifecycle events (tag 'runtests', tcl-list
RUNTESTS-EVENT messages: run-start/file-start/file-end/run-end with
tallies) and test output (tags teststdout/teststderr) to a local UDP
listener via the same mechanism - live per chunk in singleproc mode
(runx -teelog inside the testinterp), relayed per completed file by the
parent in multiproc mode. Watch mode terminates the per-testinterp log
worker threads after each file; unwatched runs are unchanged (including
the pre-existing teehandle-worker leak, also noted for the audit). The
parent extends auto_path with <projectroot>/lib_tcl<N>/<arch> so
workers load tcludp 1.0.13+ (1.0.12 UDP_ExitProc = G-036 exit-hang
class).
Verified on native tclsh 9.0.3: full-suite result parity (87 files, 989
tests, exec-14.3 sole failure) for watch-off and watch-on singleproc
runs vs the pre-change baseline; focused watch runs in both modes
captured over UDP (events + live/relayed output). Viewer-side caveat
documented: tcludp's receive fileevent under Tcl 9.0.3/Windows
delivered only the first datagram (send side unaffected; .NET UdpClient
received all).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 weeks ago |