Tree:
9f56dcb3e8
master
v0.1a
${ noResults }
562 Commits (9f56dcb3e8c4d1c3bac6c707a4a73ecf108f326c)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
8b5d662178 |
Build outputs: thin-layout make.tcl sync (overview single-column)
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
7d15dbe257 |
Build outputs: thin-layout make.tcl sync (top-level overview)
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
d5eff0f2f7 |
Build outputs: thin-layout make.tcl sync (kitname choice gate + mapvfs_model)
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
6f41c73324 |
Build outputs: thin-layout make.tcl sync (help pure dry-run + received report)
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
ed23941b03 |
Build outputs: thin-layout make.tcl sync (help dry-run refinement)
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
b3666c655a |
Build outputs: thin-layout make.tcl sync (help command-line refinement)
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
56a0567a0d |
Build outputs: thin-layout make.tcl sync (G-143 argdoc/help + G-144 synopsis retirement)
punkcheck-managed copies refreshed by 'make.tcl modules' - vendor layouts basic + project-0.1 and the modpod-shipped template payload, all byte-identical to src/make.tcl. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
543dd1df40 |
G-144 achieved: punk::args auto-synopsis @cmd -name fallback for (script) ids
Auto-generated synopses for (script)-prefixed constructed definition ids now lead with the declared @cmd -name (the invocation name - e.g 'make.tcl modules' for (script)::punkboot::modules) instead of the raw id, across punk::args::synopsis full/summary renders and the usage/arg_error synopsis sections that funnel through them (punk::args 0.12.7 -> 0.13.0). The fallback is gated on the (script) prefix only (user-confirmed narrowing): (autodef) ids are excluded - their id-minus-tag IS the invocation (arg_error's existing tag strip surfaces it) while their @cmd -name is a display label ('destroy', 'Object: ::x'); (shared)/(package)/(default)/(widgetcommand) doc ids declare no invocation-style -name today and render the id as before. Real command ids render byte-identical (full args testsuite passes with no pin updates). Six new synopsis.test pins: (script) full/summary/multiform/ surfaces, no-name constructed id, autodef unchanged, real-id byte-identical. Goal tiers: index entry archived to GOALS-archive.md, detail file moved to goals/archive/ (G-143's pending-tense Related line rewritten to reflect achievement + follow-through pointer: make.tcl's @form -synopsis overrides are now optional, retirement under G-143 or a follow-on edit). Docs: @form -synopsis directive known-case text, synopsis -help, src/modules/AGENTS.md ergonomics bullet. Project 0.39.5 -> 0.39.6 (patch: latent capability, no shipped definition renders differently today). Bootsupport refresh (make.tcl modules + bootsupport): snapshot gains args-0.13.0.tm and picks up two lagging source syncs - mix/commandset::layout 0.2.0 -> 0.3.0, mix/commandset::project 0.4.0 -> 0.4.1, and the shellfilter 0.2.4 G-145 comment; superseded copies pruned. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
1 week ago |
|
|
24bc272c93 |
G-012 achieved: inert VCS-config template payloads + layout gitignore refresh
Layout .gitignore payloads are now stored inert as gitignore.in and
materialized to .gitignore at project generation, ending the
self-censoring-template hazard (live nested .gitignore files silently
untracked template content in git while fossil managed it fine):
- punk::mix::commandset::layout 0.3.0: layout_materialize_renames map;
layout_stage_chain renames inert payloads after composing all overlay
layers (.anti markers keep targeting store names); layout_materialize
withholds the in-place fast path from inert-payload folders so the
store is never renamed; inert+live name conflict errors loudly
- make.tcl thin-layout sync refreshes every vendor/punk layout's
gitignore.in from the canonical repo-root .gitignore (punkcheck-tracked
sync_layouts events); workflow text updated
- the four vintage payload variants eliminated as drift: all payloads
now byte-identical mirrors of root; modpod copy carried and its stale
.gitignore pruned
- materialize.test +5 G-012 characterization tests (25/25; mix subtree
71 pass / 1 known skip)
Verified end-to-end: generation from each affected layout yields a
byte-identical .gitignore (othersample .anti case yields none); root
edits propagate to payloads via make.tcl libs in both directions; the
|
1 week ago |
|
|
15a7e27acb |
G-145 achieved: ansistrip transform drops 'clear' op - remnant-free piped help
The Tcl core delivers 'clear' to a transform stack before EVERY write op
(output-buffer flush-down; tclIORTrans.c ReflectOutput, gated on METH_CLEAR -
intentional and test-pinned, but under-documented: doc/transchan.n and TIP 230
scope clear to seek/read-side buffers). ::punkboot::ansistrip::transchan's
clear handler ran 'dict unset carry $chanid', discarding a split sequence's
held ESC tail at every write-chunk boundary: the next chunk's ESC-less
remainder ('0;1m', '1m') passed through unstripped as orphan fragment text in
piped usage tables, while the dropped ESC bytes kept the G-113 zero-ESC pin
green. The transform is write-only with no read-side state, so its
contract-conformant clear is a no-op - it no longer declares the op, the
per-write calls never fire, and the split-sequence carry survives every chunk
boundary. finalize still drops an end-of-stream partial sequence. No change in
textblock/punk::ansi (pre-transform stream verified well-formed during
diagnosis; exonerated).
Pin: maketclcolour.test gains maketcl_colour_help_tables_zero_remnants -
piped 'tclsh src/make.tcl help' for all 20 declared SUMMARIES subjects plus
bare 'help'/'-help', asserting exit 0, zero ESC bytes, zero orphan fragments
(two-step detector: strip complete sequences, then scan for [0-9;]+m not
preceded by ESC or an open bracket - a raw scan false-positives on ';1m' inside complete
multi-parameter SGR). Failing-first evidence: pre-fix the pin names exactly
the 5 fragmenting invocations (help, -help, help libs, help info, help
bootsupport); the 22-invocation NO_COLOR+PUNK_FORCE_COLOR pre-transform
corpus carries no legit text matching the detector.
Verified (tclsh 8.7a6, win32-x86_64): all 22 invocations byte-level clean;
PUNK_FORCE_COLOR=1 output intact (1177 complete sequences, 0 orphans); the 3
G-113 colour-policy pins pass unchanged; shell/testsuites/punkexe family (15
files, 102 tests) and shell/*** (127 tests) green, warnings pre-existing only;
'make.tcl packages' verified, layout + modpod make.tcl copies synced by the
build (punkcheck-managed outputs batched here per the carve-out).
Bookkeeping: goal flipped active -> achieved 2026-08-01, detail file archived
(goals/archive/G-145-piped-usage-ansi-remnants.md), G-056 Notes gains the
exoneration pointer; src/AGENTS.md colour bullet + src/tests/shell/AGENTS.md
suite description updated; project version 0.39.4 (patch) with CHANGELOG
entry.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
|
1 week ago |
|
|
c7229739c3 |
G-145 root cause: ansistrip 'clear' op drops the split-sequence carry (record + shellfilter warning)
Investigation record only - no fix yet (goal remains proposed). Root cause: the Tcl core delivers the transform 'clear' op before every write (output-buffer flush-down; tclsh 8.7 and 9.0.3), and ::punkboot::ansistrip's transchan handles 'clear' with 'dict unset carry' - discarding a split sequence's held tail at every chunk boundary. The tail's remainder (e.g. 0;1m) passes through unstripped while the held ESC[ bytes are never emitted, so the zero-ESC pin (maketclcolour.test) stays green while fragments leak. Evidence: pre-transform stream captured via NO_COLOR+PUNK_FORCE_COLOR is fully well-formed (textblock/punk::ansi exonerated; G-056 not the mechanism); the verbatim strip proc is correct for every possible 2-chunk split and 512..8192 block sizes; an identity logging transform under ansistrip captured the boundary byte-exactly; minimal isolated repro on a bare file channel reproduces both the per-write 'clear' op sequence and a fragment. Deterministic per table geometry, matching the observed intermittency. Upstream (TEMP_REFERENCE/tcl9 survey): per-write 'clear' is intentional, test-pinned core behavior (ioTrans.test iortrans-7.1 "chan write, write clears read buffers") but transchan.n and TIP 230 document it as seek-only and read-side-scoped - an upstream documentation gap, not an implementation bug; no existing Tcl ticket found. A write-only transform's contract-conformant 'clear' is a no-op; fix layer recorded in the goal file (drop 'clear' from the supported-methods list or make it a no-op; 'finalize' keeps dropping the carry). - goals/G-145-piped-usage-ansi-remnants.md: root cause, evidence chain, upstream documentation status, fix layer, encoding note, repro recipes - shellfilter: G-145 warning comment over the commented-out 'clear' method so future refactors don't discard o_encbuf/stream state there goals_lint clean (83 active-index goals, 62 archived). Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown |
1 week ago |
|
|
320add60ad |
make.tcl argdoc restyle: braced -& definitions with tstr placeholders; centred Descriptions
Convert every ::punkboot::argdoc punk::args::define to the braced file-style
block form established for the shell/tool definitions in 7ec7da4a: -& record
continuations, -summary/-help pulled from SUMMARIES/HELPTEXTS via tstr
placeholders, shared OPT_* option fragments interpolated as ${$OPT_...}
records. The SUBOPTS/OPT_SYNOPSES/VALUES_SYNOPSES/SUBVALUES tables and the
define loop are unrolled into 16 per-subcommand blocks; buildsuite/help and
the top-level definition follow the same idiom (help gains a HELPTEXTS entry;
the top-level body moves to argdoc's TOPLEVEL_HELP variable). @normalize is
dropped: -help bodies are display fields (punk::args G-046 deferred
expansion), so the HELPTEXTS block indentation now reaches the rendered
Description verbatim - every 'make.tcl help <subcommand>' Description renders
centred like 'make.tcl help tool' instead of left-aligned.
No parsing or interface changes: option/values specs, synopses, exit codes,
prefix resolution, unknown-flag/subcommand errors, PUNKBOOT_PLAIN degraded
mode and the capability probes all verified unchanged (before/after usage
captures diffed for all 20 help subjects; shell/tool byte-identical). Narrow
usage tables widen slightly to fit the indented Description.
KITNAME_CHOICEPART persists as a namespace variable because the kitname
records interpolate it at (lazy) definition resolve time.
Docs: src/AGENTS.md make.tcl bullets updated (braced-def contract, per-block
maintenance rule); src/modules/AGENTS.md G-045 subsection re-points the
@normalize exemplar to punk.tm only and records argdoc as the braced -& +
tstr exemplar. punkshell 0.39.3 + CHANGELOG entry. Thin-layout make.tcl
copies resynced via 'make.tcl libs -confirm 0' (basic, project-0.1, modpod
templates copy - byte-identical).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
7ec7da4a5a |
make.tcl tool build: stamp installed exe mtime so the bin freshness state can clear
tool_install_state judges bin/<tool>.exe current/stale by comparing its
mtime against the newest file anywhere in the tool tree. Two layers kept
that exe mtime frozen at the original link time: a zig cache-hit rebuild
does not rewrite the zig-out artifact, and Tcl's 'file copy -force'
preserves the source mtime (Windows CopyFile semantics). Once any
non-build-input file (e.g. PROVENANCE.md, edited after the G-128/G-135
doc passes) was newer than that link time, the tool was reported 'stale'
permanently - repeated 'make.tcl tool build' runs (field-observed
2026-08-01) reinstalled a timestamp-identical artifact and never cleared
it.
Fix: after the install copy, stamp the installed exe with the install
time ('file mtime $exe [clock seconds]'), making the state measure what
it means - installed since the last change in the tree. Also self-heals
mtime churn from branch switches/fresh clones on the next build.
punkshell 0.39.2 + CHANGELOG entry (patch: build-tooling bug fix).
Thin-layout make.tcl copies resynced via 'make.tcl libs -confirm 0'
(basic, project-0.1, modpod templates copy - byte-identical).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
7cb0dc1333 |
make.tcl: remove deprecated 'project'/'vfs' aliases (G-112 transition window closed)
The G-112 stage-true rename (0.23.0) kept 'project' -> bakehouse and
'vfs' -> bake as transitional aliases until the 8.6 arc completed; that
arc landed with G-099 and the new shape is settled. All alias plumbing
is removed from src/make.tcl: known_commands, the pre-dispatch mapping
switch, the punk::args definitions (SUMMARIES/HELPTEXTS/SUBOPTS/
SUBVALUES/VALUES_SYNOPSES), the "deprecated aliases" help group, the
plain-help block, the workflow-text mention and the degraded-mode
kitname collection. 'vfs' now gets an unknown-subcommand usage error;
'project' prefix-resolves to the read-only 'projectversion' check under
punk::args unambiguous-prefix matching (PUNKBOOT_PLAIN degraded mode
rejects both). Also trimmed a pre-existing trailing space (line 8990)
surfaced by git diff --check via the verbatim layout copies.
Docs: src/README.md, ARCHITECTURE.md, src/AGENTS.md (alias mentions
removed; also corrected the stale layout-sync trigger claim - the
thin-layout sync runs in modules/libs/packages/bakehouse, not
bootsupport), root AGENTS.md sync-step subcommand list ('project' ->
'bakehouse'). Historical records (CHANGELOG 0.23.0 entry, goals
archives, GOALS-archive) deliberately untouched.
punkshell 0.39.1 + CHANGELOG entry (make.tcl interface change - patch
per root AGENTS.md versioning policy).
Build outputs batched per src/AGENTS.md: thin-layout make.tcl copies
resynced via 'make.tcl libs -confirm 0' (basic, project-0.1, modpod
templates copy - all byte-identical to src/make.tcl), plus the lagging
store->modpod catch-up the same run performed (modpod layout copy:
mapvfs.config removed, mapvfs.toml + vfs/README.md added).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
a8f402e274 |
thin-layout sync catch-up: G-139-era make.tcl copies + samplesuite1 retirement
make.tcl modules regeneration of punkcheck-managed outputs: the layout
src/make.tcl sync copies (basic, project-0.1, modpod payload) pick up
the G-139-era libfetch/vfslibs help + workflow text, and the modpod
layout payload mirror-prunes the samplesuite1 sketch retired in
|
1 week ago |
|
|
a71d7bd377 |
buildsuite artifact identity fields default from punkproject.toml (punkshell 0.37.0)
G-117/G-123 lineage: project, project_url and packager in emitted punkbin-artifact.toml records (runtime family + library tier, both suites) now default from the enclosing project's punkproject.toml [project] table via a bounded walk-up from the build root (common.punkprojectField) - a copied suite reads its own project's manifest. Chains: project: -Dproject > manifest name > "punkshell" (was hardcoded); project_url: -Dprojecturl > manifest url > "unrecorded"; packager: -Dpackager > PUNKBIN_PACKAGER > manifest packager > git identity > fossil user default (new fossil-only fallback) > "unrecorded". Verified end-to-end: suite_tcl90 kit-family + library emissions and the suite_tcl86 library emission carry the manifest values, -D overrides win, family_check green. Root punkproject.toml gains an active url; dev project.new's seeded manifest now carries commented url/packager placeholders documenting the consumption site (punk::mix::commandset::project 0.4.1). Assisted-by: harness=opencode; primary-model=huggingface/moonshotai/Kimi-K3; api-location=unknown |
1 week ago |
|
|
e7e2ec81f4 |
G-139 phase 2 increment 1: PACKAGES_tcl<N> deployment + vfslibs packages-root declarations (0.31.1)
make.tcl libs/packages/bakehouse gain the PACKAGES_tcl<N> phase: materialized punkbin lib-tier packages under bin/packages/<target>/tcl<N>/ deploy into lib_tcl<N>/allplatforms + lib_tcl<N>/<this platform> with punkcheck provenance, mirroring the VENDORLIB_tcl<N> shape (embedded punkbin-artifact.toml records ride into the deployed trees; absent tier = silent per-item no-op with a libfetch pointer). vfslibs declaration schema extended (vendorlib_vfs.toml header documents both): source_root = "packages" resolves an entry's source against the bin/packages tier (missing source errors name 'make.tcl libfetch'); replace = true clean-slates a SAME-NAMED existing target folder before install (supersedes deliberately cannot name the folder being installed - needed because the pre-G-139 tcl9 hand-drops nested md5c + tcllibc INSIDE tcllib2.0). Declarations added for the switchover set (per-kit, never blanket - the trees that carried hand-drops at 2026-07-30): 8 win32 tcl9 kit vfs trees get tcllib2.0-tcl9 + tcllibc-tcl9 (supersedes the stray-named tcllibc2.0); punk9linux (linux target) gets only platform-neutral tcllib2.0 (its linux-built tcllibc siblings stay - a linux lib-tier emission is future work); punk86/punk8win/punk8_statictwapi upgrade tcllib1.21 (+nested tcllibc 0.4 + md5c, removed with it via supersedes) to tcllib2.0-tcl8 + tcllibc-tcl8; punk86bawt refreshes its bare tcllibc only. Verified: make.tcl libs deployed the tier into lib_tcl8|9 (allplatforms + win32-x86_64) with embedded records present; vendored mirrors coexist in the deployed trees until the sequenced retirement. Thin-layout make.tcl sync copies updated by the run (punkcheck-managed outputs, batched per the carve-out). Project 0.31.1 + CHANGELOG. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
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 |
2 weeks 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 weeks ago |
|
|
2c1dec100e |
CRLF hygiene ahead of the fossil catch-up: glob the vendored sdx patches, LF two strays
The catch-up checkin aborted on CRLF in files outside crlf-glob. Five real offenders, in two classes needing opposite treatment: - src/buildsuites/suite_tcl86/patches/* (three files) is vendored sdx source by Matt Newman and Jean-Claude Wippler plus the patch derived from it. Upstream CRLF, and the patch must stay byte-exact to apply. Added to crlf-glob, which is what .fossil-settings/AGENTS.md prescribes for a payload tree that trips the prompt - explicitly in preference to reaching for --no-warnings. - src/modules/oolib-buildversion.txt and src/buildsuites/suite_tcl86/src/main.zig are authored punkshell files (4 lines each, fully CRLF) that the root AGENTS.md LF preference governs. Converted rather than globbed; globbing src/modules would suppress the warning across authored territory. punkzip's hamlet.txt was a false positive in the first scan - already covered by the crlf-glob entry for its fixtures directory, where it is deliberately CRLF byte-exact test data. Converted in git first so the fossil checkin records identical content; a content fix applied only fossil-side would desynchronise the two mirrors in the middle of a catch-up. Note oolib-buildversion.txt is build-generated, so a future regeneration may reintroduce CRLF there. Claude-Session: https://claude.ai/code/session_01YNjnq6oDzecknLg7AuWZgU Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
2 weeks ago |
|
|
03306be068 |
argparsingtest 1.3.0: opt, cmdline and tepam are optional, not module-level requires
The module hard-required opt, cmdline and tepam at load time, so on a punkshell build
without tcllib 'package require argparsingtest' died outright with "can't find package
opt". A harness whose whole job is comparing parser libraries is useless precisely on the
runtime you wanted to measure, and the module already had the right pattern for this:
argp, parse_args and argparse degrade to a not_loaded row rather than taking the module
down with them. The three tcllib parsers were the odd ones out. Reproduced before the
change with punk module paths only and an emptied auto_path, which is where tcllib's
pkgIndex-based packages come from.
Every parser this module compares is now optional. Their roster entries become
{optional opt}, {optional cmdline} and {optional tepam}, so discover_parsers reports
not_loaded when the package is absent and nothing in the harness calls them. punk::args
and Tcl 8.6- remain hard requires - the harness itself is built on those.
The guard differs by package because the dependency does:
cmdline is only ever called INSIDE proc bodies, so the catch-guarded require at the top
is the whole story - the wrapper procs stay defined and are simply never invoked.
opt and tepam are used at DEFINITION time: tcl::OptProc and tepam::procedure are the
commands that create the wrapper procs. Their seven definition sites (four opt, across
opts/tkstyle/tclstyle/sandwich; three tepam) are each additionally guarded, so with the
package absent the proc does not exist at all.
Those sites test 'package present' rather than wrapping the definition in a bare catch.
Both tolerate absence, but a presence test still lets a genuine error in a spec raise
loudly on a runtime that does have the package, where a catch would swallow it. The
pre-existing argp registration site keeps its original catch idiom - working code, not
part of this change.
Pinned by module_loads_without_optional_parser_packages: a child interp with an emptied
auto_path that asserts the module loads, that each absent package's parser reports
not_loaded, and that the opt and tepam wrapper procs genuinely do not exist. Where a
runtime supplies one of the three as a .tm on a module path the test degrades to
asserting the module still loads, which is the main claim anyway.
Tests that name parsers explicitly (first_call_library_backed, first_call_positional_styles,
sandwich_strictness) now filter through a loaded_parsers helper, and the tclstyle
cmdline_typed status assertion derives its expectation from package presence: those
parsers can now legitimately be missing.
Verification: 26/26 pass under the 32-bit luck-test2 runtime with no skips, 24 pass +
2 skip under native Tcl 9.0.3. With opt and tepam hidden, the built 1.3.0 module loads,
reports both as not_loaded, and compare lists them in its "not loaded:" footer instead of
the whole module failing to load.
Claude-Session: https://claude.ai/code/session_01Q82VuBXzgeKsAwMYHrbpP1
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
2 weeks ago |
|
|
df6642e189 |
punk::zip 0.3.0: punkzip extraction accelerator + parity suite (G-126); 0.28.4
The final G-126 acceptance clauses:
- punk::zip::accelerator (auto|none|<path>): auto probes
env(PUNKZIP_EXE) then a punkzip beside [info nameofexecutable];
resolution cached until reconfigured
- unzip hands whole-archive member WRITING to the accelerator only when
the call is one it serves identically (globs {*}, no excludes,
default -overwrite/-mtime/-verify, ascii member names) and re-stamps
mtimes with punk::zip's local-time convention afterwards, so the two
engines produce identical trees; preflight refusals, member selection
and the returned names always come from punk::zip's own reader (the
G-124 floor, unchanged); accelerator failure falls back to pure Tcl
silently; last_unzip_engine/last_accelerator_note expose the per-call
decision
- parity suite zipaccel.test (9 tests): identical names, bytes and
mtimes through both engines over the G-124 shapes and whole-kit
extraction of the file-relative tclsh90b4_piperepl.exe (841 members);
listings engine-independent; punkzip porcelain agrees with punk::zip
member dicts on every shared field (mtime excluded by design - UTC vs
local convention); pure path proven when the binary is absent;
selective calls proven to run pure. Implicit directories (kits store
no dir entries) are excluded from mtime comparison - neither engine
stamps them
- recorded benchmark (in the goal detail): accelerator fixed cost
~9-13ms, crossover ~15-20 members, material (>= x1.7) from ~50;
x2.3-2.6 at kit scale under a native tclsh and x3.8-4.9 kit-hosted
(punk91.exe 21.9s -> 5.7s) - the bake-from-kit case the goal
motivated
- full runtests at recorded baseline under tclsh9.0.5-punk: 1186/1211,
1 failed = the pre-existing exec-14.3 baseline
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 weeks ago |
|
|
25b3dcc667 |
make.tcl-generated outputs: layout sync copies of the tool subcommand
Thin-layout sync (part of the bootsupport run): the project-layout
make.tcl copies (vendor/punk/basic, vendor/punk/project-0.1, and the
punk::mix::templates modpod source tree) pick up the G-126 'tool'
subcommand from
|
2 weeks ago |
|
|
91d3594570 |
punkcheck 0.6.1: installtrack self-heals damaged persisted event history
Field failure (2026-07-27, second dev machine): 'make.tcl bake
punk9_beta' died in the vfslibs phase with
eventcollection ... key '$eventid' already exists in collection
because that machine's src/vfs/.punkcheck predates punkcheck 0.3.2.
The 0.3.2 note fixed the WRITER (a braced template wrote the literal
strings '$eventid' etc into event headers) but files written before it
keep the damage, and the modern installtrack constructor - which
reloads persisted events into a collection keyed by -id - collided on
the duplicate literals and aborted the whole bake.
- punkcheck 0.6.1: the constructor reload now self-heals instead of
aborting: an EVENT record with a missing or duplicate -id is
reconstructed under a synthesized unique id ('damaged-id-...') with
a stderr warning naming the file and the offending id. Synthesized
ids match no INSTALL record's -eventid reference, so healed events
age out through normal -keep_events pruning. Reload also tolerates
missing -source/-targets keys.
- oolib 0.1.4: the collection duplicate-key error no longer misnames
the object as 'col_processors' (stray copy-paste in the generic
class).
- regression test installtrack_damaged_event_history_selfheal seeds a
real two-event file, rewrites both -id values to the braced literal
{$eventid} (as the damaged files carry it - the record loader
evaluates records, so only a braced literal survives as the string),
and asserts the reload succeeds with both events kept under distinct
keys (one healed). Suite: 30/30.
- before/after proof against the released artifacts: punkcheck 0.6.0
(exact-pinned) reproduces the field abort on the crafted file;
0.6.1 heals it. Bootsupport promoted to punkcheck-0.6.1 + oolib-0.1.4
(superseded copies pruned), so make.tcl bakes get the fix.
Remedy already applied on the affected machine (file deletion); with
this fix, remaining old .punkcheck files anywhere self-heal with a
warning instead of failing builds.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 weeks ago |
|
|
d2f7dc6f0e |
make.tcl-generated outputs: punkboot::utils 0.5.0 propagation (bootsupport + _vfscommon) + layout make.tcl sync
Batched punkcheck-managed build outputs from make.tcl modules/bootsupport/ vfscommonupdate for the G-133 change-set: bootsupport and _vfscommon.vfs gain utils-0.5.0.tm (0.4.0 pruned), thin-layout make.tcl copies and the modpod templates payload re-synced. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks 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
|
2 weeks 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
|
2 weeks ago |
|
|
8a2e216490 |
build outputs: mapped-file replace helpers into bootsupport, _vfscommon and the thin layouts
Regenerated by 'make.tcl modules' + 'bootsupport' + 'vfscommonupdate'. The thin-layout make.tcl copies and the templates modpod carry ::punkboot::replace_possibly_mapped_file and ::punkboot::mapped_file_hint, so generated projects get the same behaviour - a project whose own bootsupport carries a zip-based .tm meets exactly the same windows constraint. Note the templates modpod copy in this commit was itself replaced by the new delete-then- place path: the bootsupport run reported "in-place overwrite refused - replaced by delete-then-place" and completed, where the previous three runs this session failed and needed a hand copy. The fix was exercised by the change-set that introduced it. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
2 weeks 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 |
2 weeks 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 |
2 weeks 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
|
2 weeks 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 |
2 weeks 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
|
2 weeks 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
|
2 weeks 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
|
2 weeks 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
|
2 weeks 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
|
2 weeks 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 |
2 weeks 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 |
2 weeks 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 |
2 weeks 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 |
2 weeks 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 |
2 weeks 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 |
2 weeks 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 |
2 weeks 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 |
2 weeks ago |
|
|
f5deb4d1b8 |
G-118 item 10: launch subcommand family docs as punk::args definitions (moduledoc punkexe)
New punk::args::moduledoc::punkexe 0.1.0: (script)::punkexe dispatch definition (package modes, subcommand enumeration, default reclassification) + (script)::punkexe::tclsh full contract (stock arg-form parity incl the deliberate no -e boundary (G-077), lib: refusal, piperepl ::tclsh state array + env gates, intended divergences recorded per item decisions 2/6/8) + summary definitions for script/shell/punk/shellspy. G-032-compatible: the launcher help/parse wiring renders from these ids later. punk::args 0.12.7: update_definitions handles tag-prefixed id namespaces first-class - namespace_docpackages consulted with the tagged key (usage/ real_id on registered-but-unloaded (script)::* ids no longer no-such-id), generic tag strip for the real-namespace probes, unqualified-ns warning no longer fires for tag ids. args/ns/repl suites 352 pass 0 fail. punk::repl 0.5.3: code-interp setup catch-requires the punkexe moduledoc beside tclcore (both sites) so the docs are queryable in any punk shell. ARCHITECTURE.md: tclsh subcommand bullet in the boot/launch chain (architecture_lint clean). punkproject 0.20.1 + CHANGELOG. Verified: fresh-interp usage-first render (real_id path); rebuilt punk902z kit self-carries 0.1.0 (5298-char tclsh render); piped punk session renders (script)::punkexe with no manual require. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
e04aac6585 |
templates modpod: punk_main.tcl sync copy (completes 81eba3ef - add pathspec typo dropped it)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
81eba3efab |
templates modpod: build-synced _config dispatch copies (G-118 parity era)
punkcheck-managed layout-payload sync from src/project_layouts (make.tcl project run) picking up the punk_main/project_main tclsh dispatch parity. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
78d21c5de1 |
templates modpod: build-synced punk-runtime.cmd (toml-aware list -remote era)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 weeks ago |
|
|
cf8449e4c9 |
punk::mod 0.1.2: version-aware punk::apps latest selection (audit fix)
User-requested audit of naive [package versions] selection: punk::apps'
appinfo 'latest' used a plain lexical lsort (misorders 1.10 vs 1.9) AND
took lindex 0 - the LOWEST version - as latest (the '#todo - natsort!'
site). Now lsort -command {package vcompare} taking the highest, with
empty (unversioned-main) entries excluded before comparison since
vcompare errors on empty operands; only-unversioned yields latest "".
Audit sweep results: every other punk-owned consumer already sorts with
vcompare (punk::lib repl/udp checks, libunknown, repl autocomplete,
loadedlib copy/promote, punk_main/project_main starkit selection - the
latter even carries the 'package versions does not always return
versions in increasing order!' warning comment); packagepreference's
uses are mappings/exact-pins, not max-picks. Naive sorts remain only in
VENDORED third-party code (tcllib doctools docidx/doctoc/doctools.tcl,
vendormodules pattern-1.2.8.tm:267) - flagged, not edited, per the
vendorlib no-edit policy. Project 0.18.9.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
3 weeks ago |