Tree:
8cbdf86fff
master
v0.1a
${ noResults }
1169 Commits (8cbdf86fff744f9d16837af68ab924e3bc4e1d1d)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
8cbdf86fff |
G-129 drafted (user-approved): kit boot finds its payload wherever the archive mounted
Arising from the third-party 32-bit kit investigation. src/vfs/_config/punk_main.tcl decides whether the running kit has an attached zipfs image with two assumptions that held for every runtime punkshell had until now: it probes with 'info commands tcl::zipfs::root' and then looks for the mount at a compiled-in //zipfs:/app. Christian Werner's androwish / undroidwish backport gives Tcl 8.6 a working zipfs but no 'root', and mounts the executable's attached archive at the EXECUTABLE'S OWN PATH, so [info library] reads <exe>/tcl8.6. Against such a runtime punkshell concludes "no zipfs", neither the zipfs nor the kitpath branch runs, and the kit silently gets no internal module or lib paths at all - the failure surfaces later as packages that cannot be found. project_main.tcl carries the identical code, so the same defect ships into every generated project; both files are in Scope. Two third-party 32-bit runtimes now in the win32-ix86 tier bracket the problem and are named as the verification pair: tclsh8.6.10-luck-zip.exe (Lean Undroidwish Construction Kit - no 'root', no ::zipfs ensemble, mounts at the exe path, library at tcl8.6/, and no zipfs at all in child or thread interps) and tclsh9.1b0-tclsfe.exe (apnadkarni/tcl-sfe - the modern //zipfs:/app convention on the same architecture). The Acceptance requires both: the tclsfe kit proves the 32-bit target itself needs nothing special and that the derivation did not regress the ordinary case, the LUCK kit is the actual work. Both are untracked per G-004, so tests naming them self-gate on presence as the G-124 piperepl pin does; the LUCK build is reproducible from its .cfg build request. Approach settled in the draft: derive the mount point from tcl::zipfs::mount itself, whose entries pair mountpoint with mounted file - the entry naming this executable is this kit's archive wherever it landed. Detect zipfs by a command the backport also provides rather than by 'root'. Leave the kitpath and cookfs branches alone. Report on stderr when an archive is attached but no mount entry matches this executable, because silence is today's failure shape and is what made this expensive to diagnose. Overlap survey named G-031 (restructures this same file into a thin main plus shared boot core - whichever lands second adopts the other's shape, and the derivation belongs in the core), G-101 (its candidate container list already includes zipvfs-over-tclvfs boot, and the LUCK runtime is a ready-made specimen carrying zipfs, vfs 1.4.2 and starkit together), G-123 (these are punkbin candidates; kit-wrappability decides whether a runtime publishes as a usable tier), G-125 (achieved - its gate learned the tcl<M>.<m>/ library convention so such a kit can now be BUILT; making it BOOT is this goal), plus G-114 and G-127 as deliberate non-overlaps - same file, different axes. Also records in G-024 a design direction from the developer (non-contract Notes): the toml move is where NAMED GROUPINGS of mapvfs entries should be considered, prompted by wanting verification kits active but obviously not shipped products. Grouping would also give bake and bakelist a name to select on beyond per-kit names, and the commented-out historical entries somewhere honest to live. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
4 days ago |
|
|
57b73d9f98 |
build outputs: punkboot::utils 0.4.0 + gate wording into bootsupport, _vfscommon and the thin layouts
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate'. make.tcl reaches the predicate through a guarded require against the bootsupport snapshot, so the third tcl-library convention only takes effect for a bake once this lands; 'make.tcl check' confirms the gate ACTIVE and now names all three locations. The thin-layout make.tcl copies and the templates modpod carry the reworded K10 key note, so generated projects describe the gate the same way. The bootsupport templates modpod again failed to copy in place with 'invalid argument' and again succeeded on retry seconds later - the transient lock noted in the previous two build-output commits, not a make.tcl mount this time. Copied by hand, then 'make.tcl bootsupport' and 'vfscommonupdate' re-run to reconcile; all three copies share one sha1. 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 |
|
|
b549198cba |
build outputs: punk::libunknown 0.2.3 into bootsupport and _vfscommon
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate'. punkshell's own boot paths load punk::libunknown from bootsupport, so the pkgIndex namespace fix only reaches a running shell once the snapshot carries it. Two catch-ups ride along, neither authored here: argparsingtest 1.0.0 -> 1.2.0 in _vfscommon (from commit |
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 |
|
|
de049fbad4 |
build outputs: punkboot::utils 0.3.0 + G-125 make.tcl into bootsupport, _vfscommon and the thin layouts
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate' for the G-125 change. make.tcl loads punkboot::utils from bootsupport through a guarded require, so the boot-precondition gate only becomes ACTIVE once the snapshot carries vfs_boot_library_report - before this propagation 'make.tcl check' correctly reported the gate UNAVAILABLE. The thin-layout make.tcl copies and the templates modpod pick up the gate and the K10 workflow key note, so generated projects get the same refusal behaviour. The bootsupport templates modpod again could not be replaced in place - 'BOOTSUPPORT module update FAILED: ... templates-0.2.0.tm (invalid argument)'. Unlike the G-124 occurrence a plain tclsh failed on the first attempt too and succeeded on a retry moments later, which points at a transient lock by one of the running shells rather than at make.tcl having the file mounted. Copied by hand, then 'make.tcl bootsupport' re-run to reconcile the punkcheck record. 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 |
|
|
4bd0ab1354 |
argparsingtest 1.2.0: parse_args/argparse timing wrappers, plus a sandwich calling style
compare's tables listed parse_args and argparse under "not loaded:" on the one runtime
carrying both - bin/runtime/win32-ix86/tclsh8.6.10-luck-test2.exe (argparse 0.61,
parse_args 0.5.1). Neither was missing. Both sat in optional_externals, the probe-only
list whose entries can never be better than not_wrappable, and compare bucketed
not_wrappable into the same footer line as not_loaded - so a package that was present and
working read as absent.
Timing wrappers now exist for both, and they move out of optional_externals into the
style rosters under a new {optional <pkg>} marker that generalises the former hardcoded
argp case: loaded when the package was present at module load, not_loaded otherwise.
getopt and cmdr stay probe-only. compare now reports not_wrappable separately - a
"no timing wrapper:" table line, and a not_wrappable key in the dict and json forms - so
the two conditions cannot be conflated again.
Availability is per-runtime and the two do not travel together (surveyed 2026-07-26): the
32-bit luck-test2 kit has both, the native Tcl 9.0.3 install has argparse only, punk902z
and punk91 have parse_args only, punk905 has neither. The tests constrain them separately
for that reason.
Style support was measured rather than assumed. argparse reaches tk style only via -mixed
(its default mode rejects leading positionals as excess arguments) and its switches need
an explicit -argument in the element spec or their values fall through as positionals.
parse_args cannot consume leading positionals at all, so tkstyle parse_args is
unsupported. Both wrappers call their library by fully qualified name: the procs
deliberately share the package name, so an unqualified call would resolve to the wrapper
itself - infinite recursion in argparse's case.
The fourth calling style, sandwich, is 2 mandatory leading positionals, THEN the 10 keyed
options, THEN 3 mandatory trailing positionals. The 2/3 split is asymmetric on purpose -
an even split could be satisfied by a parser that merely halves the positional block. All
three candidates support a valueless flag, so the argvec exercises -join as a solo flag
alongside the -flag value pairs. Wrappers: manual_switch, punkargs, punkargs_by_id,
punkargs_parsecache, opt and argparse, returning {{p1 p2} {p3 p4 p5} optsdict} - grouped
rather than the flat {p1 p2 opts} of the other positional styles, because positionals now
sit on both sides of the options.
punk::args and opt model that arrangement - @leaders/@opts/@values are three separate
sections, and tcl::OptProc fills positional slots in declaration order - and both reject
options placed ahead of the leaders, as does the hand-rolled baseline. argparse reaches
the style only through -mixed, which permits switches ANYWHERE, so it parses the argvec
correctly without being able to enforce it: the identical spec also accepts all five
positionals trailing. It is timed for the parse, not credited with expressing the
constraint, and both halves of that are pinned by tests (sandwich_strictness,
sandwich_argparse_is_permissive) rather than left as a silent difference. Its flag
convention differs too, opts being reported in each parser's natural form: a supplied
bare flag yields an empty-string value and an omitted one is absent from the dict, where
the others report -join as 1 or 0.
cmdline, tepam, argp and parse_args are unsupported N/A rows in this style, each verified
to fail on its argvec. cmdline is the one worth naming: cmdline::getoptions returns
WITHOUT error having parsed nothing at all - every option left at its default and the
whole argument list untouched - so a check that only looks for a raised error would
wrongly credit it.
Verification: 25/25 pass under the 32-bit runtime with no skips, which is the only
configuration that exercises every new test; 23 pass + 2 skip under native Tcl 9.0.3,
where parse_args is absent. first_call times the new parsers in fresh child interps,
confirming these binary extensions load a second time in-process.
Built artifacts are not in this commit - modules/ is git-ignored. modules/
argparsingtest-1.2.0.tm was deployed via 'make.tcl modules' so the dev shell can see it:
a plain 'package require argparsingtest' there resolves a deployed stable version in
preference to the 999999.0a1.0 source module, so source edits are invisible until built.
Claude-Session: https://claude.ai/code/session_01Q82VuBXzgeKsAwMYHrbpP1
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
39c6e9a025 |
build outputs: punk::zip 0.2.0 into bootsupport + _vfscommon, thin-layout make.tcl sync
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate' for the G-124
change. make.tcl loads punk::zip from bootsupport, so the reader only reaches the
zipfs-less bake path once the snapshot carries it.
Also carries two version propagations pending from earlier work, not authored here:
punk 0.2.7 -> 0.2.8 and punk::platform 0.1.0 -> 0.2.0 (the latter was added to
include_modules.config in
|
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 |
|
|
78b6f47805 |
G-127/G-128 drafted + G-057 amended (user-approved): cross-target vfs bake, portable PE stamping, icon sidecar and mechanism seam
Follow-on goals from the G-122 host/target split, each drafted with its overlap survey
and approved before writing. The G-057 contract edit (title, Scope, Goal, Acceptance) was
shown clause-by-clause and approved per the proposal-first rule.
G-057 amended - the goal was drafted before G-122 separated host from target, so its skip
condition read as one host-shaped test ("non-Windows platform skips") while its Notes used
target language. Split in two: a target with no PE resources is NOT APPLICABLE, a windows
target on a host that cannot run twapi is a distinct shortcoming. Both still emit a text
sidecar, now produced for every kit on every target and defined so the parked RT_VERSION
follow-on extends the same file rather than adding a second. Embedding sits behind a
single mechanism seam, and the twapi arm is explicitly PERMANENT - the seam selects
between mechanisms, it does not replace one: twapi is vendored and git-tracked
(src/vendorlib_tcl8|9/win32-x86_64/twapi-5.0b1) and reachable from make.tcl's auto_path,
so a fresh windows checkout that fetches a runtime and bakes gets icons with no build
toolchain (probed under a stock tclsh 9.0.3 and a fetched plain family runtime). The
per-vfs override is settled as shared across a kit definition's targets with no target
dimension.
G-127 - cross-target bake of a custom .vfs. G-122 made the build READ the right runtime
for a target; this makes it WRITE the right kit for one. Three measured gaps: output is
flat, so two POSIX targets of one kit collide (within a run the duplicate guard renames by
RUNTIME not platform; across selective runs exe_names_seen resets and the second
overwrites the first); the payload model is one hand-curated folder per target
(punk9linux.vfs, not a vfslibs participant, with vendorlib_vfs.toml hardcoding the
platform into its source path - a shape inherited from G-037 when there was one target);
and nothing verifies payload against target. Non-native kits go to bin/kits/<platform>/
with native staying at bin/<name>; /bin/* already ignores it so no dual-track ignore work.
Records that G-114 and G-115 overlap yet never reference each other - the platform axis
and the payload axis have never been connected.
G-128 - portable PE resource stamping via a vendored zig tool, plugging into G-057's seam
without retiring its twapi arm. Feasibility measured: zig rc (resinator, bundled in the
0.16 toolchain) is a resource COMPILER supplying the RT_GROUP_ICON/RT_ICON structure
reference, not a patcher - we never link these runtimes, so patching an existing PE is the
work. In our runtimes .rsrc is not the last section (.reloc follows), so the
implementation appends a section and repoints the resource data directory, which shifts
the overlay: safe for an archive-relative zip, not for a file-relative one, so the unsafe
case is refused rather than corrupted. The payoff beyond portability is post-hoc stamping
of a finished kit, which removes G-057's icon-before-append ordering constraint. Its
distribution is settled as buildable from vendored source AND publishable as a punkbin
artifact, so the no-toolchain route need not depend on the committed twapi (the G-004
tension).
Also adds non-contract Related back-pointers in G-057 to G-122/G-127/G-128.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
e1711a7b2a |
G-124/G-125/G-126 drafted (user-approved): punk::zip reader, unbootable-kit deploy gate, vendored punkzip accelerator
Three goals arising from the G-122 work, each drafted with its overlap survey and approved before writing. G-124 - dependency-free zip reading in punk::zip. Nothing in the tree can READ a zip without zipfs, vfs::zip or tcllib's zipfile::decode, which is a system package punkshell does not vendor and which has exactly one consumer: make.tcl's zipfs-less kit extraction. The goal removes that requirement outright (not as an optional fallback), adds an introspection surface so punk::zip is useful to script programmers, and gives the writer its first round-trip coverage. Measured motivation recorded in the detail file: msys2's tclsh8.6 has no tcllib and so bakes an unbootable kit, and extract_preamble's live '#todo - need to adjust offsets' means a FILE-relative prefixed executable (tclsh90b4_piperepl.exe) splits into a .zip tcllib rejects with "Bad closure" - reading the original file at its derived base offset removes that failure mode by construction. G-125 - a kit that cannot boot is not deployed. Today a failed extraction emits a recapped BUILD-WARNING and then deletes and replaces the deployed kit anyway; field- observed 2026-07-26 replacing a working punk91.exe with one that dies on init.tcl. The gate tests the boot precondition on the assembled vfs, so a kit whose payload legitimately supplies its own tcl library still builds. G-126 - punkzip as a VENDORED zip accelerator behind G-124's pure-Tcl floor, with zig kept optional (a tclsh-only clean checkout must still build and bake). Feasibility measured and recorded: the source builds clean under its declared zig 0.15.2, and under 0.16 fails on one surfaced error (std.process.argsAlloc), with the OS-facing surface confined to 3 of ~20 files while the ~10k-line compression core is untouched; zig 0.16.0 is already unpacked in bin/tools. Benchmarks captured for the speedup claim. Non-contract Notes back-pointers added to G-034 (the reader is a candidate for its own Acceptance's "alternative modpod mount path" branch) and G-101 (an 8.6 container has no zipfs, so it needs a reader that works without one). Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
5 days ago |
|
|
5c1e692700 |
build outputs: thin-layout make.tcl sync + include_modules.config punk::platform entry
Regenerated by 'make.tcl modules'/'packages' after the G-122 make.tcl changes - the
punkcheck-managed thin-layout copies (src/project_layouts/vendor/punk/{basic,project-0.1}
and the punk.project payload inside the punk::mix templates modpod) plus the pending
punk::platform entry in the bootsupport include_modules.config copies.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
5 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 |
|
|
a5edfe17b6 |
G-101 Scope: sync both tiers on the survey-extended wording
The pre-activation survey (
|
5 days ago |
|
|
f4031b209f |
G-101 pre-activation survey: reference inventory + sdx wrap.tcl provenance capture
Notes-only on the goal; the new tracked material is the sdx patch capture. G-101 gains four sections and an extended Scope line naming the surveyed trees and bin/sdx.kit: a reference-material inventory giving the metakit boot chain in reading order with file:line anchors (kbskit kitInit.c pre-init -> boot.tcl raw mk::select bootstrap -> setupvfs.tcl -> mk4tcl.cpp Mk4tcl_Init, with KitCreator's storage-switch variant as the comparison reference for scoping cookfs/zipvfs); sdx provenance; the self-mount shadowing gotcha; and metakit-under-Tcl-9 feasibility. Two findings bear on the container choice: 8.6's core zlib cannot do mk4vfs streaming (kbskit boot.tcl states it - forces whole-blob decompression, relevant to a battery-carrying kit), and TEMP_REFERENCE/metakit is UNPATCHED upstream while KitCreator carries eight 8.x-era fixes. Self-mount shadowing verified live rather than inferred: inside a running tclkit [file type [info nameofexecutable]] is 'directory', so a kit cannot read or copy itself as a file and cannot be handed to sdx as -runtime (wrap.tcl LoadHeader is a plain file read). make.tcl:4995-5005 already works around this with _BUILDCOPY; recorded as a requirement to preserve. Container-agnostic - zipfs has the same shape via its /app anchor. src/buildsuites/suite_tcl86/patches/ captures the bin/sdx.kit delta into tracked form. bin/sdx.kit is tracked and is what make.tcl resolves for the 'kit' wrap path, but it is NOT stock sdx: unwrapping it and stock 2011-03-17 sdx gives 64 identical files except lib/app-sdx/wrap.tcl, whose entire difference is a two-line binary-mode read of tclkit.inf before stringfileinfo patches the PE version resource. That evidence previously existed only in gitignored scratch/ and TEMP_REFERENCE/ copies - one git clean from gone. Stock baseline, patched file and diff are all byte-exact (hashes in the README); the patch round-trips to the patched file byte for byte under 'patch --binary'. The stock baseline is kept in full because upstream (svn://svn.equi4.com/sdx/trunk) no longer exists. Both .tcl files are CRLF and must stay CRLF - vendored fidelity artifacts, exempt from the repo's LF-on-edit preference. Scope-limiting facts recorded rather than assumed: the patched path is DORMANT for present builds (fires only with -runtime + a .exe runtime + a tclkit.inf in the source .vfs, and no tclkit.inf exists in this repo), and the fix itself is UNVERIFIED - plausible as a CRLF-corruption fix but no reproducer was recorded with it. Confirming or retiring it is part of this goal's characterization work, alongside the bootstrap circularity noted in the goal (sdx.kit is itself a metakit starkit, so wrapping a suite-built 8.6 runtime currently needs a prebuilt third-party tclkit of exactly the kind G-101 exists to replace). Of the two proposed acceptance riders, this commit discharges the first (capture the patch before any sdx rebuild). The second stands: the end-to-end demonstration must wrap a SEPARATE COPY of the runtime so the shadowing path is exercised rather than accidentally avoided. A back-pointer to these findings was added to TEMP_REFERENCE/AGENTS.md so the survey is not repeated; that tree is VCS-ignored, so it is not part of this commit. Claude-Session: https://claude.ai/code/session_014UkdFjhuEdfCNDp4f8V6Xe Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
5 days ago |
|
|
f89bd58c31 |
G-100 achieved: suite_tcl86 dependency set (Tk 8.6, tklib, tcllib + tcllibc) and an 8.6 runtests census
Extends the 8.6 buildsuite with the remaining pieces punkshell's Tcl 8 testing
depends on, all built from source with the pinned zig 0.16.0 toolchain only.
Tk 8.6.17 (build_tk86/build_tk86.zig) is a RE-DERIVATION from the staged 8.6
win/makefile.vc + rules.vc, not a port of suite_tcl90's build_tk.zig:
- no generic/tkPkgConfig.c in 8.6 -> no CFG_* defines at all
- rules.vc TCL_MAJOR_VERSION==8 arm -> tk86t.dll + lib/tk8.6 (vs tcl9tk90.dll)
- @TK_WIN_VERSION@ substitutes $(DOTVERSION).0.0, not the tcl-style
<dotversion>.<releaselevel>.<patchlevel> formula
- 8.6 TKOBJS carries no tkIcu/tkImgListFormat/tkImgSVGnano/tkWinGDI/tkWinIco/
tkWinSysTray; XLIBOBJS is a first-class makefile macro here (the 9.0
derivation had to recover those files by hand)
USE_TCL_STUBS + USE_TCLOO_STUBS against libtclstub86.a is the stock rules.vc
arrangement and keeps the dll loadable by both suite shells. tkMain.c is
compiled twice per makefile.vc, the ansi copy forced with -UUNICODE/-U_UNICODE
(verified the pinned zig cc defines neither for x86_64-windows-gnu, so the 8.6
core's ANSI/TCHAR arrangement is matched exactly).
tklib 0.9 and tcllib 2.0 install via their own installer.tcl (batch, packages
only, explicit -pkg-path so the installer's tcl_pkgPath-derived default can
never write off-tree); tcllibc is built by critcl 3.3.1 driving zig cc (tracked
critcl_zig.config, target pinned win32-x86_64-zig - critcl otherwise probes PATH
and falls back to its builtin msvc target). critcl compiles against its own
bundled headers chosen by the driving shell's version, which is why one config
serves both generations.
New evidence tools, run on every build:
tools/tk_smoke.tcl maps a real toplevel with classic + themed widgets,
updates, then destroys it - a load-only check passes
even with no usable display
tools/accel_bench.tcl same payload through sha1's critcl and pure-Tcl
implementations with the digests compared:
4MB -> critcl 5.7ms vs pure-tcl 2736ms = 477x
Test tiers (G-107 policy pattern): test-tcllib/test-tklib on the record tier
inside test-libraries, plus an opt-in test-tk (winDialog/winMsgbox excluded by
default - their message-injection automation blocks on a human under a batch
shell). First censuses on tclsh86ts.exe 8.6.18:
thread 142 run / 0 failed GATE PASS
tklib 796 run / 0 failed record
tcllib 64259 run / 41 failed record (names in the summary artifact)
tclvfs 51 run / 4 failed GATE PASS after baseline extension
The tclvfs baseline grew vfsFtp-1.1..1.3: they sit behind an 'ftp' constraint
needing tcllib's ftp package - absent at the G-099 capture, satisfied now that
the suite installs tcllib - so they run and reach the retired ftp.tcl.tk, the
same external-service class already baselined for vfsUrl-1.2/2.1.
punkshell runtests census (both runs 2026-07-26, identical flags, default
single-process sequential - 8.6 has no tcl::process so -jobs re-convoys):
native Tcl 8.6.17 1003 total / 986 passed / 10 skipped / 7 failed
suite tclsh86ts 1003 total / 987 passed / 10 skipped / 6 failed
runtests_parity.tcl finds exactly ONE difference: punkcheck
concurrency_two_writers_no_corruption failed in the BASELINE run and passed on
the suite runtime - a full-suite-load flake (6/6 twice in isolation on both
runtimes). Zero suite-runtime-only failures. Tk-dependent suites ran unskipped
(repl consolebackends 3/3, including the tkconsole backend on the suite Tk).
Two defects fixed in passing:
- scrubTclEnv never cleared TCL<major>_<minor>_TM_PATH, so suite shells
silently preferred machine/repo tm modules over what the suite had just
installed (a repo-built sha1-2.0.4.tm shadowed tcllib's 2.0.5, md5 2.0.8
shadowed 2.0.9) - any census through such a shell measures the machine. The
scrub list now covers TCL8_0..8_7 + TCL9_0/9_1 in all three sites (per-step,
suite.tcl process-level, bootstrap nested build). suite_tcl90 has the same
exposure via TCL9_0_TM_PATH and is deliberately untouched here (out of this
goal's scope) - pointers recorded in G-108 and G-116.
- build.zig.zon's .fingerprint was hand-authored, so 'zig build' from the
tracked suite dir died with 'invalid fingerprint' - the no-tclsh bootstrap
flow could never have run. Corrected to zig's computed value (its low half
is a checksum of the package name); 'zig build stage' now verified.
Goal flipped to achieved 2026-07-26 and archived; reference sweep updated G-005,
G-101, G-105 and ARCHITECTURE.md, and the archive-time xref pair G-101 <-> G-116
(whose only bridges were the archived G-100/G-103) gained a direct Related
pointer. No project-version bump - arm's-length build tooling, not shipped shell
behaviour.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
5 days ago |
|
|
a20a64a2a1 |
G-099 achieved: suite_tcl86 zig buildsuite for Tcl 8.6 (runtime, thread 2.8, tclvfs, core-test gate)
Builds a Tcl 8.6.18 windows runtime from core-8-6-branch sources with the
pinned zig 0.16.0 toolchain only (no MS toolchain), forked from suite_tcl90
(duplication-with-a-note posture). Products (stock threaded-release naming -
rules.vc keeps the 't' SUFX on 8.6):
bin/tcl86t.dll + tcl86t.lib shared core (static zlib compiled in; no zlib1.dll)
bin/tclsh86ts.exe static shell (kit-class; dde/registry static)
bin/tclsh86t.exe dynamic shell against the dll
lib/libtclstub86.a stub lib for extensions
lib/tcl8.6/... script library tree (dde/reg dlls inside)
lib/tcl8/{8.5,8.6}/... tm modules; lib/thread2.8.13, lib/vfs1.4.2
Companions: thread 2.8.13 (thread2813t.dll, TEA installed shape from the
checkout's own pkgIndex.tcl.in) and tclvfs 1.4.2 (vfs142t.dll) build and load;
registry 1.3.5 / dde 1.4.6. No zipfs in 8.6 - exe+dll+on-disk lib tree only,
resolved hermetically (exe/dll-relative, TCLLIBPATH/TCL_LIBRARY unset in all
child runs).
Recipe: build86.zig + build_common.zig + build_zlib86/build_tclthread86/
build_tclvfs86 helpers; tools/ and src/main.zig copied verbatim (suite-agnostic).
Two load-bearing 8.6 findings recorded in the README DERIVATION and recipe
comments: MP_FIXED_CUTOFFS (the in-core libtommath ships no bn_cutoffs.c) and
TCL_BROKEN_MAINARGS + console subsystem for the gcc-class main() entry.
Test gates (suite.tcl test -> zig build test-gate/test-libraries) parse all.tcl
totals (exit codes untrusted) and gate against tracked dispositioned baselines.
First census + two-consecutive-run deterministic PASS (machine SuperBee):
core 46525 run / 2 failed (filename-16.12/16.13 admin-share self-globbing)
thread 142 run / 0 failed (empty baseline)
tclvfs 51 run / 2 failed (vfsUrl-1.2/2.1 external ftp.tcl.tk dependency)
Goal flipped to achieved 2026-07-26 and archived; reference sweep updated G-005,
G-100 (now unblocked), G-101 and ARCHITECTURE.md. No project-version bump
(arm's-length build tooling, not shipped shell behaviour).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
b887a61349 |
G-123 drafted (user-approved): third-party runtime tiers via artifact servers
Index entry + detail file with the two user-directed amendments over the
presented draft: consent keyed to SERVER TRUST (trusted set defaults to the
canonical punkbin origin - no new prompts in existing flows incl. the
unattended tclsfe-x64 constraint fetch; untrusted/alternative servers gate
with a G-006-pattern acknowledgement surfacing the provenance class), and
retroactive schema-v2 provenance sidecars for the existing punkbin
third-party artifacts (additive only - bytes, bare pre-family names,
sha1sums.txt authority unchanged). Signing deliberately deferred per user
("down the track") with the minisign anticipation noted. Depends on G-122;
Related G-006/G-067/G-105/G-101; extends archived G-103/G-119 machinery under
a G-117 schema-v1 -> v2 bump. G-122's follow-on note now cites G-123 by id.
Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
917916c5be |
G-122 drafted (user-approved): make.tcl host/target platform split
Index entry + detail file per the approved wording: bake/bakelist keyed by an explicit target platform (store folder, exe suffixing, kit naming, presence, process-sweep tooling) with host personality only selecting defaults; stable punk::platform canon tags for cygwin-family hosts (MSYSTEM variance documented); per-entry mapping target as a minimal extension ceding schema to G-024; zipfs-less zip-type assembly via split + punk::zip::mkzip + cat (archive-start-relative offsets - user's correction); third-party tier REPRESENTATION in scope, publication/fetch flagged as a follow-on candidate; FreeBSD linuxulator expectation recorded with verification deferred to the planned linux-kit trial. Overlap survey run; Related notes name G-024, G-105, G-114, G-101, G-057, G-023. G-013's msys raw-mode note now cites G-122 by id. Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
5c34951441 |
build outputs: bootsupport punk::platform-0.1.0.tm + templates-0.2.0.tm modpod sync
make.tcl bootsupport pulled the newly-included punk::platform; the templates
modpod refresh used the established virgin-tclsh direct copy (
|
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 |
|
|
3a52f02773 |
G-121 detail file -> goals/archive/ (pure rename)
Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
c172912f4b |
G-121 achieved 2026-07-26: flip + archive record + reference sweep
Acceptance verified in full (evidence recorded in the detail file's Progress section): bakelist under plain tclsh + punk902z with per-entry presence and deployed state; selective 'bake punk91' refreshing only that kit's _build/bin artifacts and punkcheck records (stat + punkcheck diffs, negative grep clean); unknown-name no-build errors; bare bake kit-set parity; help/workflow contract updates; maketclbakelist.test 4 PASS; punkshell 0.24.0 minor bump. Index entry moved to GOALS-archive.md. Reference sweep: no pending-tense live-tier mentions existed; mapvfs.config pointer updated to the archive path; forward-pointing notes pushed as back-pointers to the live goals they serve (G-024 parsed-model reader swap, G-023 scheme-expansion entry point, G-115 per-kit payload detail, G-057 single-kit icon verification, G-028 deployed -state reporting sibling, G-101 kit-type non-assumption). Detail-file move to goals/archive/ follows in the adjacent commit as a pure rename (root AGENTS.md Doc Restructures). Claude-Session: https://claude.ai/code/session_01Jz7wkUsknJzyuJ3tgMaL2t Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
7d56aa00ff |
build outputs: thin-layout make.tcl sync copies (G-121 bakelist + selective bake)
make.tcl packages run after the G-121 make.tcl change - punkcheck-recorded sync of src/make.tcl into the vendor layouts (basic, project-0.1) and the punk::mix::templates modpod payload copy, per the established sync channels. 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 |
|
|
5f3cea1954 |
G-121 activated (user-directed): bakelist + selective bake implementation begins
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 |
|
|
17e541f6e1 |
G-121: archive markers on archived-goal mentions (goals_lint informational sweep)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
eedcd57ad2 |
G-121 drafted (user-approved): make.tcl bakelist + selective bake
New proposed goal: 'bakelist ?kitname...?' informational lister (mapping + runtime presence + deployed state; name filter doubles as per-kit detail) and 'bake ?kitname...?' selective baking with bare bake unchanged. Both defined against the parsed mapping model so the G-024 toml conversion slides underneath. Ergonomics decision record in Alternatives (bake -list and action-grouped bake rejected per the G-112 stage-true principle; bare 'kits' already rejected in the G-112 name-selection record). Overlap survey recorded: substantive relations G-024/G-023/G-115/G-057/G-028/G-101 + archived G-104/G-098 precedent. Delivers the mapvfs.config todo (comment retires when the goal lands). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
232f2f6096 |
contextual sweep: deprecated make.tcl subcommand references (user-directed, incl. contract lines)
Each site read in context, not grep-replaced; bakehouse vs bake chosen per meaning, and missing invocation arguments supplied where the reference describes an unattended flow: - G-005 Approach + Notes, G-006 Acceptance + body: 'make.tcl project' -> 'make.tcl bakehouse' (the full consumer build these goals integrate with; no flags - conceptual references on a clean checkout, not recipes). - G-057 Acceptance: 'make.tcl project' -> 'make.tcl bake' (icon embedding lives in the kit-wrap stage and must hold for a bare bake; bakehouse inherits). - G-028 Context DELIBERATELY UNCHANGED: dated 2026-07-07 incident narrative - the command actually run; history stays verbatim (alias keeps it readable). - src/runtime/mapvfs.config todo: 'vfs' -> 'bake' wish, re-annotated - G-104 achieved WITHOUT the single-kit-by-name/list-kits item (still open). - src/runtime/vendorlib_vfs.toml header: vfslibs now runs as a phase of bake (G-112 fold), not 'as part of project'. - shellexit.test + staticruntime.test rebuild comments: 'project' -> 'bake' AND stale '(interactive y confirmation)' / bare vfscommonupdate corrected to '-confirm 0' (piped y retired since G-030) - the missing-arguments class. - punk.project layout store vfs READMEs (lib + modules): 'make.tcl vfs' -> 'make.tcl bake'; modpod template twins propagated via the punkcheck layout->modpod sync (make.tcl modules run), never hand-edited. Variant-phrasing sweep confirmed non-hits: G-115 '(vfs assembly)' names the src/vfs payload tier (name retained), G-047 'make.tcl/project.new' is the dev project.new command. Archive tier + CHANGELOG history untouched. goals_lint + goals_xref refs clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
c6909c3c02 |
goals-system v3: goals_lint stale-versioned-reference warning + Scope version-reference guidance
New informational pass in goals_lint (stem-sibling repair heuristic): a live-tier reference to a version-suffixed filename that is MISSING while a same-stem sibling exists on disk warns, naming the sibling(s) - the drift signature of manually-versioned module bumps (libunknown), magic-scheme conversions (config) and stamped bootsupport/vendored renames (fauxlink), exactly the classes fixed in the preceding hygiene commit. References with no stem-sibling stay quiet (proposed goals legitimately name future artifacts); archive tier, globs, URLs, absolute paths and 999999.0a1.0 exempt; warnings never fatal (Scope is contract text - the fix stays a directed edit). Verified: clean on the current tree (incl. correctly-silent existing legacy artifacts) and against a synthetic fixture exercising warn + all five silent classes with per-file dedupe. GOALS.md: front matter bumped v2 -> v3; version-section policy broadened per user direction - bump for ANY change that could affect how an LLM interprets or uses the system (contract, grammar, tooling behaviour, output shape); liberal bumping endorsed. Format section gains Scope version-reference guidance (glob or magic-version filename for stamped files; exact versions only in dated prose). goals/AGENTS.md Verification describes the new check; src/modules/AGENTS.md manual-versioning bullet gains bump step (4): the doc reference sweep. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
eb9359757f |
goals version-reference hygiene: libunknown 0.2.2 in G-109/G-035, config magic-version path, fauxlink 0.2.0, tomlish 1.1.12
User-directed sweep of version-specific file references across the live goals tier and AGENTS docs, each verified against the tree: - G-109 + G-035 Scope (index + detail mirrors): libunknown-0.1/-0.2.1.tm -> libunknown-0.2.2.tm - G-014/G-042/G-043 Scope (both tiers): src/modules/punk/config-0.1.tm -> config-999999.0a1.0.tm (module converted to the magic-version scheme; real version 0.2.0 per buildversion.txt) - G-012 (Scope both tiers + two body notes): fauxlink bootsupport 0.1.1 -> 0.2.0 (fauxlink-0.2.0.tm on disk) - G-014 Context: vendored tomlish 1.1.8 -> 1.1.12 (bootsupport copy confirms current; older vendored versions coexist in the series) Verified still-accurate and left unchanged: modpod-0.1.5.tm, pluginmgr-0.5.1.tm, promise-1.2.0.tm, tarjar-2.4.3.tm + #tarjar-tarjar-2.3, template_module-0.0.4.tm, voo-1.0.0.tm; example names (foo/bar-1.0.tm, foobazzer-1.1.tm) and external reference material (tcl-sfe sfe-0.2.tm) untouched. Archived tier untouched (point-in-time records). goals_lint + goals_xref refs + architecture_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
81f69d913f |
G-099 active: suite_tcl86 born on the G-104 contract - sources pinned, staging live, derivation started
Activation gated on the G-112 rename core + G-104 contract (both achieved
today); score re-run recorded. First increment:
- suite_tcl86/: sources.config (source + self-description records - lists and
describes itself via 'make.tcl buildsuite list/info' with no make.tcl
edits), suite.tcl fork (folder-derived naming, {tcl tclthread tclvfs}
requireds, build86.zig recipe file), build86.zig pending-derivation skeleton
(staging succeeds, recipe fails with a clear message), build.zig.zon with
real zig-fetch hashes, README with the DERIVATION record.
- Thread 2.8 selection: thread-2-8-branch @ e14fa771ae (tagged thread-2-8-13,
2.8.13); configure.ac TCL_MAJOR_VERSION==8 guard confirms the pairing.
- 8.6 source records in BOTH flows: dev refs (core-8-6-branch -> tcl86,
thread-2-8-branch, tclvfs trunk 1.4.2-era) + zon per-checkin pins
(tcl 1d1d5cbd91 = 8.6.18 era).
- First staging run through 'make.tcl buildsuite build suite_tcl86' (a real
driver run through the G-104 surface): checkouts staged from the shared
hermetic store, TCL_PATCH_LEVEL 8.6.18 read from the tree.
- makefile.vc derivation findings recorded incl. two Context corrections:
8.6.18 DOES generate tclUuid.h; zlib is prebuilt-import in stock nmake
(zig-only recipe will compile compat/zlib statically).
Core-test census + baseline deliberately pending until a built tclsh86 exists
(recorded in Progress).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
6 days ago |
|
|
b3a86ec766 |
make.tcl window achieved: G-113 + G-112 + G-104 flips, archives, reference sweep
Acceptance evidence recorded in each detail file before the content-identical archive moves: - G-112: fresh-rebuild bake products BYTE-IDENTICAL to pre-rename vfs products (punk91 zip-wrap + punk86 kit-wrap; vacuous punkcheck-skip pass caught and redone), vfslibs phase runs inside bake, aliases + bakehouse dirty-refusal verified live, docs/layout copies swept, punkexe suites 54/0 green. - G-113: zero-ESC piped on tclsh90 + punk kit + 8.6, force overrides, real Windows-console and WSL-pty mode=tty evidence, maketclcolour.test green; manual-visual note recorded. - G-104: list/info/build + self-description contract verified incl. a copied tree; punk-kit hosting; docs in place. Sweep: G-005/G-018/G-035/G-047/G-099 pending-tense references rewritten with archive pointers; forward-notes pushed to G-108/G-061/G-105; G-099<->G-108 re-bridged with a direct Related line (their bridges were all archived). Also: tclsh9.0.5-punk working runtime re-materialized to r2 (stale local materialization exposed by the window's bake - G-118 piperepl pins green again). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
a04979eb38 |
build outputs: thin-layout make.tcl copies synced (bake/bakehouse era)
The bakehouse acceptance run's thin-layout sync refreshed the three layout make.tcl copies (basic, project-0.1, templates modpod payload) with the G-112/G-113/G-104 make.tcl - punkcheck-managed, batched per the build-output commit carve-out. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
a949414bf8 |
make.tcl window doc sweep: bake/bakehouse vocabulary across workflow references
Root README, src/README, src/AGENTS.md (full-build guidance, provenance command list incl. bakehouse's default-on dirty gate, punk-exe-hosted builds, verification), src/modules + src/lib + src/vfs + src/tests + src/tests/shell + src/runtime AGENTS.md workflow references, and the rebuild-instruction comments in scriptexec.test/tclshcmd.test. G-104's G-058 mention gains its archive marker. Historical CHANGELOG entries untouched; goal-file contract texts (G-005/G-006/G-057 Acceptance mention 'make.tcl project') left for proposal-first user approval - the deprecated alias keeps them executable. Layout make.tcl copies are punkcheck-synced build outputs - they refresh via the normal sync channels in the acceptance build, never hand-edited. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
889d3cd1c7 |
G-104: make.tcl buildsuite list/info/build + sources.config self-description contract
buildsuite group added as a declared passthrough (punk::args + fallback paths): list discovers suites (dirs carrying suite.tcl; _build excluded), info renders the manifest-derived detail, build forwards driver args untouched streaming output and exiting with the driver's status (punk-kit-hosted runs launch the driver via the kit's script subcommand, selected by the G-058 marker). Self-description = manifest option: sources.config gains description/product/ doc/zigpin records parsed by both suite.tcl (strict; pinned-zig default now reads zigpin - one source of truth) and make.tcl (tolerant). suite_tcl90 seeded with its records. Copied trees appear automatically (verified with a throwaway copy). Contract documented in new src/buildsuites/README.md + AGENTS.md, indexed from src/AGENTS.md. CHANGELOG extended under 0.23.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 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 |
|
|
3fe688135f |
make.tcl window active: G-112 + G-104 + G-113 flips (user-confirmed)
Activation-freshness scores re-run per the maintenance rules and recorded in each detail file's Notes; new Related lines: G-104 -> G-108 (debug-tier variants ride the same driver/self-description contract), G-113 -> G-061 (ConPTY could automate the interactive-colour verification). G-112 open decisions resolved at activation (user-directed): vfslibs folds into bake (standalone-narrowing survival decided in-session), project/vfs alias deprecation window = until the 8.6 arc completes. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
e1c2c952e4 |
G-120 achieved: flip, archive, reference sweep (std-slot recycling restored)
Acceptance verified on the rebuilt punk91 kit (plain script mode): recipe 'chan close stderr; open NUL w' yields a channel auto-named stderr with working puts stderr; console+repl+libunknown suites 105/105. Detail file archived content-identically with evidence recorded; GOALS-archive record appended; sweep: G-101 launch-ladder item (2) rewritten to reflect achievement (in-place stdio repair now available on the 9.1 kit), G-011 gains a recycled-stderr consumer pointer. goals_xref report shows no orphaned shared-archived-ref bridges for G-120; goals_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
3808ec0914 |
build outputs: libunknown 0.2.2 promoted (bootsupport + _vfscommon payload)
make.tcl modules + bootsupport + vfscommonupdate after the G-120 fix; punkcheck managed copies batched per src/AGENTS.md build-output commit carve-out. 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 |
|
|
d96da53646 |
G-119 achieved: flip, archive, reference sweep (freshness verdict complete)
Acceptance verified in full against the fixture punkbin server (PUNKBIN_URL override): ahead/behind verdicts naming both revisions (behind with fetch+use guidance), current annotation preserved, pre-family no-basis note + sha1 hash-identity, no-name-fetch one-line divergence note; ps1/bash verdict-line parity asserted per scenario; runtimecmd roundtrip pin green; bin/AGENTS.md runtime-manager contract records the surface. Suite evidence in the detail file's flip record. Activation and flip both 2026-07-25 (user-directed activation; overlap survey re-run at activation - only G-033 related, already recorded; no new Related lines). Detail file: status achieved + activation/flip evidence records (the goals/ -> goals/archive/ move itself rode the previous commit as a pure 100% rename; this commit carries the flip's content edits). Index entry moved to GOALS-archive.md. Reference sweep: G-033's G-119 note updated to landed-state wording with the archive path (its package-mode docs must not contradict the shipped freshness contract on naming); goals_lint clean (83 active / 37 archived); goals_xref report carries no G-119-bridged unlinked pairs. 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 |
|
|
46af2a74c0 |
G-118 achieved: flip, archive, reference sweep (tclsh subcommand review complete)
Acceptance verified in full: all 11 issue-list items dispositioned (2026-07-24) with decided fixes landed (items 3/4/5/9 in 0.20.0, items 1/7 via the G-117-cycle patch rev, item 10 docs in 0.20.1, item 11 console test) and items 2/6/8 documented-as-intended in the item-10 definitions; durable doc home = punk::args::moduledoc::punkexe; tclshcmd.test 19 piped tests green vs punk902z + punk9_beta; dorepl console-reopen path console-driven (punkconsole gate, 21/21 with PUNK_TEST_CONSOLE=1). Flip: detail file status achieved 2026-07-25 + flip evidence record; entry moved to GOALS-archive.md; detail file to goals/archive/. Reference sweep: ARCHITECTURE.md tclsh bullet marked achieved + G-118 removed from the in-flux launch-surface list; G-031/G-032/G-077/G-120 notes updated with archive markers and landed-state wording (G-032 now points at the shipped punkexe moduledoc ids as its source material; G-077 notes the boundary text to update when -e lands). goals_lint clean, architecture_lint clean, goals_xref report carries no G-118-bridged unlinked pairs. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |