Tree:
b77d9a5630
master
v0.1a
${ noResults }
31 Commits (b77d9a5630efef04fef97ddaf1b7ba76137f8bf4)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
4aae330b31 |
G-134 achieved: flip, archive record - archive-relative output is a checked contract; punkshell 0.30.7
Implemented and achieved same day. punkboot::utils 0.6.0 gains kit_offsetstyle_report (argdoc'd thin classifier over punk::zip::archive_info), synced via modules + bootsupport (one stale dead-pid .punkcheck.lock removed per the recorded recovery) and promoted into _vfscommon. make.tcl: guarded getter, post-assembly probe beside the smoke-require block (recapped BUILD-WARNING only on a FILE-relative attached payload; plain/none/unreadable silent; NOTE on stale bootsupport), and the 'check' row (ACTIVE (advisory) + contract lines). Characterization: offsetstyle.test 7/7 (mkzip -runtime/-offsettype hermetic fixtures for plain/archive/file, none on text + metakit-magic binary, unreadable detail, src/_build baseline sweep - no kit image probes file); maketcl_check_offsetstyle_pin added (payload-check suite 4/4). Full utils suite 69/69, punkexe suite 81/0, live punkluck86 bake silent as the acceptance's baseline clause requires. Docs: src/AGENTS.md pin bullet with does/does-not-guarantee, bin/AGENTS.md deployed-kit section, ARCHITECTURE.md check-family bullet (architecture_lint clean). Reference sweep: no live-tier references beyond the index entry; goals_xref shows no pairs bridged solely by G-134. Archive move follows as a pure-rename commit. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
1c771a8920 |
Polyglot scope policy recorded (bootstrap-only); G-006 fetcher-shape leaning noted
bin/AGENTS.md gains the user's 2026-07-29 principle: the multishell polyglot mechanism exists to serve BOOTSTRAPPING (no-tclsh/no-toolchain cold start - punk-runtime, punk-getzig) and, being complex and potentially fragile long term, is not to be expanded unnecessarily - capabilities that only run with a tclsh present belong in-tree behind make.tcl. G-006's Notes record the corresponding fetcher-shape leaning (non-contract): no punk-gettool polyglot; the make.tcl-integrated downloader the goal's Approach already leans toward is the indicated shape (build-tool fetching always has a tclsh - make.tcl IS the consumer), with punkres on the punkbin tools tier noted as the first concrete artifact the channel would serve. Doc-only, non-shipped surfaces - no version bump. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
1f8af99805 |
G-128: punkbin publication route settled, staged and documented; punkshell 0.30.6
Distribution convention (recorded in src/tools/punkres/PROVENANCE.md): the tool publishes to the punkbin tools tier as win32-x86_64/tools/punkres-x86_64-windows-<ver>.exe (arch-os-version beside the zig archives; immutable), integrity via that tier's sha1sums.txt. 0.3.1 STAGED as punkbin commit 1b471fc (sha1 166cd176..., built by the tool step from vendored 0.3.1/f0af880, all other sha1sums SAME) - push is maintainer-gated per punkbin AGENTS.md, and agents never push. Route documented in bin/AGENTS.md; the seam's skip notice names both remedies (build from vendored source, or fetch the prebuilt artifact). Demonstrated in the program-files checkout: artifact placed as bin/punkres.exe reports 0.3.1 and make.tcl tool list reads it CURRENT against the vendored tree. Reproducibility note recorded: zig builds differ across invocations in the PE-header timestamp region - the published sha1 pins THE artifact. Goal Progress: increment 1f; the only remaining acceptance item is the maintainer push making the fetch URL live - achieved flip flagged for confirmation at that point. punkres.test 8/8 re-verified. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
c6d50b3b2a |
G-128: fleet renamed to PUNKSHELL via punkres; punkres 0.3.0 -drop-opaque-overlay for mingw stub symbol tables; punkshell 0.30.3
Forced fleet rebake (user-directed): all ten win32 kits now carry the embedded PUNKSHELL group icon via punkres, verified per kit (punkres list, sidecar icon_group=PUNKSHELL + embedding=punkres, extract-ico byte-identical spot check) and booting (incl. metakit punksys 8.6.13 / punk86 8.6.17 and punk902z 9.0.2). punkmagic excluded (runtime absent - keeps its old icon and _build cache); punkshell902 linux = not applicable. The first fleet pass surfaced a real shape: mingw-built runtimes (tclsh902z, tclkit-win64-dyn family) keep COFF symbol/debug tables AFTER their sections, the extraction head carries them, and punkres correctly refused those stubs as data-classified overlay. Measured against twapi-era artifacts: Windows' EndUpdateResource has always silently STRIPPED exactly those bytes at stub-stamp time (leaving PointerToSymbolTable dangling) and the kits work - so punkres 0.3.0 (upstream dca8634, re-vendored, 33/33) encodes the distinction: -drop-opaque-overlay DISCARDS expendable trailing data and zeroes the orphaned symbol-table header fields, vs -allow-opaque-overlay which RELOCATES a real self-locating payload; conflicting flags rejected; drop is inert on zip overlays. The seam's punkres arm passes -drop (twapi-arm-equivalent stub hygiene; bin/AGENTS.md documents it). Recovery note: a 10-minute foreground timeout killed the first 3-kit rerun during deploy - stale src/_build/.punkcheck.lock removed after a dead-pid check per the recorded procedure; the completion bake deployed the already-wrapped kits. Full punkexe suite 83 tests 0 failed; goals_lint + architecture_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
bd65183061 |
G-128: seam names the kit group icon PUNKSHELL (icon-derived, both arms); punkshell 0.30.2
RT_GROUP_ICON name policy (user decision 2026-07-29): kit_icon_process derives icon_group from the icon FILE's uppercased rootname (RC convention) - punkshell.ico -> PUNKSHELL for the default icon and per-kit overrides alike - and passes it to whichever mechanism embeds. punkres arm uses set-icon -group (punkres 0.2.0); kit_icon_embed_twapi gains the matching optional group_override (name only - language adoption unchanged) so the arms stay in parity. Replaces the retained stub-lineage names (punk91 "SFE", suite kits "TCLSH"); already-deployed kits keep theirs until their next natural rebuild (the policy is not in the punkcheck source set). Sidecar gains icon_group (recorded whenever the icon file exists); bin/AGENTS.md format doc + ARCHITECTURE.md updated, architecture_lint clean. Live-verified on punkluck86 rebakes: punkres arm and twapi arm (TCLLIBPATH route) both emit RT_GROUP_ICON "PUNKSHELL" lang 1033, extracted icons byte-identical between arms; sidecar icon_group=PUNKSHELL; final deployed state punkres-stamped and booting. Full punkexe suite 83 tests 0 failed. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
5e9f1c75fc |
G-128: seam selects punkres when built; characterization tests; punkshell 0.30.1
src/make.tcl kit icon seam (G-057): mechanism selection is now punkres-first - kiticon::punkres_available (memoized; binary presence at bin/punkres(.exe) is the selection signal) + kit_icon_embed_punkres (exec wrapper; punkres verifies its own output). twapi arm unchanged as fallback; when NEITHER serves the skip notice combines both reasons and names the 'make.tcl tool build punkres' remedy. Sidecar embedding value gains 'punkres' (bin/AGENTS.md format doc, ARCHITECTURE.md kit-icon bullet updated; architecture_lint clean). Live-bake fallback matrix on punkluck86 (win32-ix86 = PE32 arm live): punkres present -> embedded via punkres, kit boots + smoke OK; punkres absent + twapi loadable -> via twapi; both absent -> unavailable with combined notice, embedding none (exact pre-G-128 degradation). Live parity: both arms' baked kits listing-identical (codepage host-ACP noise finding recorded in the goal detail) with byte-identical extracted icons. New src/tests/shell/testsuites/punkexe/punkres.test (7/7 under the tclsh9.0.5-punk runner; self-gates on bin/punkres + store fixture): overlay- unsafe refusal exit 3 with untouched input, consented file-relative shift with convention preserved, payload intact via punk::zip members + crc-verified extraction, icon replaced (extract-ico == punkshell.ico), idempotent re-stamp byte-identical, make.tcl tool info punkres provenance records. Full punkexe suite 83 tests 0 failed (no collateral). Goal detail: Notes findings (codepage noise, root-vendorlib twapi fragility, nested tclsfe payload, metakit move-safety -> G-101 pointer updated) + Progress increment 1 with the two remaining acceptance items (non-windows-host e2e, punkbin publication route) and one acceptance-wording flag for the user (metakit 'kit' shape vs 'zip overlay' clause). punkshell 0.30.1 + CHANGELOG. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
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
|
2 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
|
3 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 |
|
|
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 |
|
|
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 |
4 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 |
|
|
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 |
|
|
ee3ed05923 |
punk-runtime: dependency-free sha1 hashing in the powershell payload (Get-FileHash field failure)
Field report (jcross1, Windows PowerShell 5): Get-FileHash not recognized during list -remote while Write-Host/Invoke-WebRequest worked. Root cause class: Get-FileHash is a SCRIPT-defined function in PS 5.1's Microsoft.PowerShell.Utility, resolved via PSModulePath autoload - a damaged PSModulePath (pwsh7 path pollution, overridden env, redirected user module dirs) removes it while the module's compiled cmdlets keep working. Effects were wrong results, not just noise: spurious UPDATE AVAILABLE rows (null local hash) and fail-closed fetch verification. New Get-PunkFileSha1 computes sha1 via .NET (SHA1.Create over a stream, lowercase hex) at all three former Get-FileHash sites; works on any PowerShell edition/state incl FIPS, and emits a one-time informational note when the damaged condition is detected (chosen over detect-and-offer-install/env-repair: nothing to install once the dependency is gone, and persistent environment mutation from a fetch tool is disproportionate). Bash payload already probes sha1sum/shasum/sha1/openssl - unchanged. bin/AGENTS.md records the no-script-module-cmdlets payload rule. Verified: hash parity with Get-FileHash under powershell 5 and pwsh 7; list -remote via the rewrapped .cmd (correct Same-version rows); damaged-PS simulation (probe forced unresolvable): note printed once, zero errors, hashing correct; scriptwrap roundtrip pin runtimecmd_roundtrip PASS (payload + regenerated bin output committed together). CHANGELOG bullet added under the in-flight 0.19.0 entry (rides the user's pending release-notes commit). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
640d53f7cb |
bin/AGENTS: record .cmd-extension invocation guideline for future user-facing docs
User policy 2026-07-22: doc examples for the polyglot bin utilities show the .cmd extension (bin/punk-runtime.cmd ...) - extensionless windows invocation resolves the .ps1 twin, which is ExecutionPolicy-gated and runs under the invoking powershell edition, while .cmd always executes via the wrap-pinned tested path. The same .cmd file runs on unix shells unmodified, so one form serves all platforms with path-separator style as the only remaining per-platform difference. Sweep confirmed no existing user-facing guidance contradicts (none exists yet). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
099ac699e3 |
G-097: bin utility naming sweep - punk-bits, punk-runtime, punk-tclargs, selfsign
The remaining pre-policy punkshell-own bin utilities take the punk- prefix (bin/AGENTS.md policy, G-096); external-tool wrappers (dtplite/sdx/kettle) and getpunk stay unprefixed. No behaviour changes ride along. - runtime scriptset: sources/toml renamed (src/scriptapps/bin/punk-runtime.*), the eight ps1 usage/guidance messages now say punk-runtime.cmd, the bash payload's filename-derivation comment example updated; REWRAPPED -> bin/punk-runtime.cmd (checkfile clean) with the .ps1 twin regenerated as a byte-copy. The roundtrip + checkfile pins retarget the new names and pass. - tclargs + bits: sources/tomls renamed; bin artifacts moved BYTE-FAITHFULLY (git mv, no rewrap): a pre-rename drift check showed both carry pre-template-refresh wraps (477-byte delta = the template's 2025 wmic-deprecation timestamp fix; runtime was in sync). Regenerating them is a behaviour change and is deliberately not smuggled into the rename - recorded in the goal. Fresh .ps1 twins cut from the current .cmds; stale untracked bits.bat/bits.ps1/tclargs.ps1/runtime.ps1 removed. - selfsign experiments: SELFSIGN.PS1 -> punk-selfsign.ps1 (case normalized), wrap toml + cert-create script renamed; the four untracked bin experiment scripts renamed on disk; the exported .cer is not a script and keeps its name. - runtimebash_wsl.test: functional staged-filename sites updated (bash ./punk-runtime.bash; solo-fixture cp) along with comments. - Docs: bin/AGENTS.md (examples, policy paragraph records the sweep, runtime contract section, pin pointer corrected to runtimecmd_roundtrip.test), src/scriptapps/AGENTS.md, root AGENTS.md, README.md, src/README.md, untracked bin/runtime/README.md, G-060 reference, libunknown comment (src copy; root modules/ + bootsupport copies catch up on their re-vendor cycles). Suites green: scriptwrap + binscripts 26 run / 25 passed / 1 constraint-skip / 0 failed - the roundtrip pin passes against the renamed artifact. Discovered and recorded for user decision (goal Progress): the project LAYOUT stores ship stale utility copies - runtime.cmd (2025-era payload) and getzig.cmd (the G-096 rename missed this channel) - so generated projects still receive old-named utilities; folding the layout channel into this goal's scope vs a layout-sync mechanism is flagged. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
e68d9800a7 |
G-096: getzig renamed to punk-getzig; utility naming policy documented in bin/AGENTS.md
Scriptset (src/scriptapps/bin) and the generated bin wrapper renamed; the untracked bin/getzig.ps1 twin replaced by punk-getzig.ps1 (byte-copy of the .cmd - launchability convenience for cmd.exe-or-powershell starts). Payload improvements: self-references updated, and the ziglang.org release URL now derives its version from the single $releasearchive pin (was a separately hardcoded 0.15.1 vs the 0.15.2 archive). Re-wrapped via scriptwrap multishell; checkfile ERROR-free (the two boundary-scan warnings are the documented-normal polyglot ones). bin/AGENTS.md gains the punk- naming policy section (exceptions: dtplite/sdx/kettle wrappers, getpunk; sweep of bits/runtime/ tclargs/selfsign is G-097). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
49ec22a928 |
doc: restore 'dev doc.validate' - wrap tcllib dtplite as bin/dtplite.cmd
'dev doc.validate' invokes a bare dtplite command which the repl unknown-handler resolves via auto_execok on PATH - no dtplite executable existed (only the legacy misnamed bin/dtplite_run.bat), giving "invalid command name dtplite". - src/scriptapps/dtplite.tcl: LF-converted (polyglot payloads are embedded verbatim into the LF-only multishell output); fall back to the project-vendored tcllib (src/vendorlib_tcl9/<arch>/tcllib*) when the invoking tclsh lacks the dtplite package - src/scriptapps/dtplite_wrap.toml: new scriptset config (tclsh nextshell on all platforms) - bin/dtplite.cmd: generated polyglot via punk::mix::commandset::scriptwrap::multishell (checkfile-clean, LF-only) - src/tests/shell/testsuites/binscripts/dtplite.test: artifact pins (LF-only, checkfile, byte-identical round-trip re-wrap) + execution usecases (usage error, validate good/bad file, validate directory tree, html generation) - 8/8 pass under runtests - AGENTS.md (bin, src/scriptapps): record the dtplite scriptset, its test pin and the LF-only payload requirement - punkproject.toml: 0.12.22 -> 0.12.23 Verified: 'dev doc.validate' in punk902z src validates all 64 src/doc .man files clean. The doctools pipeline remains interim - punk::args is the intended doc source of truth. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
e6be532938 |
runtime.cmd: list -remote for the unix payload + PUNKBIN_URL override (punkshell 0.8.0)
- bash/zsh payload gains list -remote parity with the powershell payload: local-vs-server sha1 comparison table (Same version / UPDATE AVAILABLE / not listed on server, plus remote-only entries), falling back to a cached sha1sums.txt with a warning when the server is unreachable (the powershell version has no cached fallback - candidate backport) - both payloads: artifact server base url overridable via PUNKBIN_URL (mirrors/testing - also what makes the new feature testable offline) - first real catch for the 512-byte label guard: the payload growth pushed the template's :exit_multishell target label across a boundary from its callsite (checkfile ERROR at wrap time); fixed with a documented byte-alignment spacer comment at the end of runtime.bash, and the resize-the-spacer workflow recorded in bin/AGENTS.md - bin/runtime.cmd regenerated via scriptwrap (roundtrip pin green; multishell suite 9 pass + 1 skip on 9.0.3 and 8.7); runtime.bash syntax-checked under bash and zsh; windows list/use/run sanity re-verified Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 weeks ago |
|
|
7f32862d2f |
runtime.cmd: active-runtime selection (use subcommand + active.toml), bash checksum parity, scriptset moved to src/scriptapps/bin (punkshell 0.7.0)
- run no longer launches the last runtime alphabetically: resolution is PUNK_ACTIVE_RUNTIME env override -> bin/runtime/<platform>/active.toml (constrained single-key toml, written by the new 'use <name>' subcommand, marked with * in list, covered by the existing bin/* VCS ignores) -> sole installed candidate -> error listing candidates. First fetch sets active only when none recorded; later fetches never steal it. Stale active (file removed) reported with reselect guidance. - bash/zsh payload fetch reaches checksum parity with the powershell payload: fetches sha1sums.txt, locates the stored hash, skips when the local copy matches, downloads to .tmp and installs only on sha1 match; sha1 tool detection (sha1sum/shasum/sha1/openssl) with refusal of unverified downloads when none present; optional runtime-name argument added (fetch <name>) - fixes: powershell "stored hash from sha1sums.txt" printed an undefined variable ($storedhash -> $stored_sha1); bash MSYS branch invalid assignment (interp = ...); candidate listings for run/list/use exclude .tmp leftovers and non-runtime files (a stray .txt could previously be selected by run) - runtime scriptset sources relocated to src/scriptapps/bin (proper home alongside getzig.*); bin/runtime.cmd regenerated via scriptwrap from the new location - roundtrip test path updated, suite green on 9.0.3 (8 pass + unix-gated skip), runtime.bash syntax-checked under bash and zsh - verified live on windows: multiple-runtimes-no-active errors with candidates (previously silently launched tksfe-twapi-x64), use/list/run against tclsfe-x64 and env override to tclsh902z, fetch no-steal + first-fetch auto-set, checksum-match no-download path - docs: bin/AGENTS.md documents the fetch/use/run contract and updated generated-polyglot workflow paths; src/scriptapps/AGENTS.md scriptset-home wording updated Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 weeks ago |
|
|
b11f3e5946 |
tests + guidance for the MULTISHELL polyglot build machinery (scriptwrap)
- new src/tests/modules/punk/mix/testsuites/scriptwrap/multishell.test (9 tests, green on tcl 9.0.3 + 8.7, unix exec case constraint-gated): scriptset wrap via the module-provided punk.multishell.cmd template (payloads + _wrap.toml fixture) - output produced, MULTISHELL magic line, payloads embedded verbatim, configured win32 nextshell present, LF-only endings, byte-identical re-wrap determinism; checkfile 512-byte label/boundary validation reports no label location errors for a fresh wrap AND for the committed bin/runtime.cmd; the runtime scriptset ROUND-TRIP pin - re-wrapping src/scriptapps runtime.ps1+runtime.bash+runtime_wrap.toml reproduces bin/runtime.cmd byte for byte (verified identical before pinning), so hand-edits to the output or unregenerated payload changes both fail; execution smoke - cmd.exe runs the polyglot and dispatches the powershell payload (windows), sh payload execution gated to unix (on windows the shell layer deliberately relaunches via the win32 nextshell) - guidance strengthened so "fix bin/<name>.cmd" routes to sources: root AGENTS.md bin/ index entry now states the .cmd polyglots are scriptwrap-generated from src/scriptapps; bin/AGENTS.md gains a "Generated polyglot .cmd scripts - never edit in place" section with the 4-step fix workflow (edit payloads/toml, re-wrap with multishell -askme 0, heed checkfile ERRORs, commit source + regenerated output together); src/scriptapps/AGENTS.md documents the scriptset->bin/*.cmd relationship and regeneration command; tests index updated - context: the polyglot technique is deliberately maintained despite fragility (user direction 2026-07-10) until hiding techniques close in the underlying languages - these pins are the guardrails Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 weeks ago |
|
|
7448dcad8a |
add bin/AGENTS.md: launch package modes (src mode) and verification-shell contracts
The dash-delimited launch package modes of built punk shells (dev/os/src/ internal, implemented in src/vfs/_config/punk_main.tcl) had no agent-facing record. bin/AGENTS.md now documents the mode grammar and, in operational terms, the src mode that matters for verifying working-tree changes: exe-location-based project-root discovery, the source module paths it prepends, package prefer latest (dev 999999.0a1.0 modules beating kit-stamped snapshots), and how 'package present' distinguishes a src-mode session from a plain kit launch. Also records the both-Tcl-generations interactive verification convention (a Tcl 8.6-based shell plus the current Tcl 9-based incarnation, deliberately not version-pinned) and the role of the plain runtime kits under bin/runtime/ for punk-free probes. Root AGENTS.md Child DOX Index gains the bin/ entry, and .gitignore gains a !/bin/AGENTS.md negation alongside the other source-controlled bin items (the /bin/* ignore is why no doc lived there before). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |