Tree:
2655f278f1
master
v0.1a
${ noResults }
222 Commits (2655f278f1428733ffc94c50fa690128e5de90c0)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
2655f278f1 |
make.tcl dry-run help: parse_report landing table (G-151 follow-on; project 0.66.2)
An accepted 'make.tcl help <subcommand> <cmdline...>' line now stacks punk::args::parse_report's annotated success render - the Argument|Source|Value landing table (received args plus defaults-in-effect) - under the usage render, after the unchanged 'dry-run: line accepted (form N)' line. The interim hand-assembled one-line received-args clue remains only as the catch-guarded degrade fallback (G-030 rule: stale pre-0.18.0 bootsupport punk::args or broken render stack). The gating bootsupport promotion (args 0.25.2 + ansi 0.2.1) already landed, so the render is live. - src/make.tcl: parse_report call + degrade fallback; the two layout copies and the modpod template copy refreshed via the thin-layout sync (make.tcl modules run from src/) - maketclhelp.test: accepted-line pins flipped to landing-row regexps, new reporthdr/default2b pins; 12/12 green (the 10 maketclbakelist/maketcllibfetch failures are the pre-existing non-interactive root-launch staleness-gate baseline - source punk::args 0.26.0 vs bootsupport 0.25.2 - not regressions) - src/AGENTS.md: help bullet now describes the landing table + degrade path - punkproject.toml 0.66.2 + CHANGELOG entry (make.tcl help output is product surface) - goals/archive/G-151-punkargs-annotated-success-render.md: make.tcl follow-on disposition => landed 2026-08-09 Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
3abfe674fa |
punk::args 0.26.0: bound received-value display in validation error messages (G-151 follow-on)
Serves the engine's 'truncate/summarize values in error messages' todo (G-151 lean 5, explicitly deferred from that goal's acceptance). New private::error_display_value wraps the G-151 report_display_value / ansistring TRUNCATE machinery (string mode: single-line-ize with visible control/ANSI rendering, then grapheme-cap with '...' plus ' (len N)') and is applied at every site interpolating a received word into a validation error message: the check_clausecolumn type/size/range/regexprefail reports, the leaders/values allocation-rejection and choiceviolation/ ambiguous-prefix sites, the multi-value clause echo, the -allow_ansi character-view (previously unbounded ansistring VIEW), and the Unexpected-option unknown-flag word. Width cascade: definition-level '@cmd -reportvaluewidth' > built-in 48; 0 = no cap (define -help documents the extension). Display-only: -badarg/-badval errorcode fields keep the raw words. Safety properties: a short plain value (within budget, no C0/C1/DEL content) displays byte-identical via a cheap fast path - important both for the existing message pins (all held unchanged) and because check_clausecolumn builds candidate messages for type alternatives that may never be raised; and the helper catches-and-degrades to the plain non-ansistring fallbacks, since punk::ansi loaded without punk::lib dies in ansistring TRUNCATE (RANGE calls punk::lib::lindex_resolve) - an error message must never die on its display helper. parse_report's own value cells retain that uncaught exposure (pre-existing, success-side). validation.test +4 pins (long-value truncation with raw -badval retention, multiline single-line-ization, @cmd -reportvaluewidth cap, unexpected-option word truncation with raw -badarg retention). Args subtree 415/0 on tclsh90s (9.0.5) and tclsh86ts; full suite at the recorded 13-failure environment baseline (maketclhelp re-verified 12/12 with a real tclsh on PATH). Minted modules/punk/args-0.26.0.tm. Project version 0.66.1 (patch: kit-shipped error-display behaviour) with CHANGELOG entry; G-151 archive follow-on disposition flipped to landed. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
de4c69b68e |
project 0.66.0: repaired tcllib in kits + tdom in 905 kits + G-176 arc deployed
Pre-bake version bump (release step 2; the bake asserts it via -expect-projectversion). The 0.66.0 CHANGELOG entry covers what the rebaked kits ship: pkgindex_gate-repaired tcllib with the self-describing punkbin-upstream-repairs.toml manifest (upstream tkt 523f7e0556 - rest and four siblings finally requirable), tdom 0.9.6 restored to the 905-era punk kits, and the G-176 command-documentation arc arriving in deployed shells via the promoted coherent set. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
cc92078c44 |
make.tcl launch-site steering (red) + countdown to 4 (project 0.65.2)
The staleness fix block now ends with a red-highlighted steer back to the project root for the remaining steps (vfscommonupdate/bake are canonically root-launched on the refreshed bootsupport snapshot, which also re-arms the staleness check), and the src/-launch banner carries the same red canonical-mode steer plus a repair/testing-is-fine line - so the mode is self-describing however the user arrived in src/. Early-site colour via the ::punkboot::sgr gate (NO_COLOR/force/tty precedence, piped output ESC-free; verified forced-colour and NO_COLOR renders). Dirty-src proceed countdown extended to 4 seconds (user change). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
b729ce07d7 |
make.tcl staleness-gate message: explain launch-site module precedence (project 0.65.1)
The recommended fix (rerun modules && bootsupport from src/) read as circular when the gated command was itself modules or bootsupport. The warning now names the launch directory, contrasts src/ vs elsewhere module precedence (the stale bootsupport copies are the code executing the current run), special-cases the repair commands with a NOTE, and prints the resolved src path as a copy-pasteable fix line. Shared emitter (punkboot::lib::bootsupport_stale_warning) for the pre-dispatch gate and the check report tail. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
8fa716b62b |
G-176 achieved: override hints + 'package epoch' documented via stack-tied doc block (punk::ns 0.11.0, punk::libunknown 0.3.1; project 0.65.0)
Increment 4 (the final increment) + the achieved flip.
punk::ns 0.11.0: cmdinfo gains an 'overridden' result key - a second axis
beside cmdtype/unavailable (the G-166 pattern) reporting the LIVE
commandstack override state of the base command: one {renamer <string>
docids <list>} dict per stack record (bottom-up), docids being the
punk::args ids of doc blocks the record attached via 'rename_command
-punkargs' (derived with punk::args::rawdef_id). Guarded live query - no
hard commandstack dependency, empty when commandstack is not loaded,
never cached so it is correct as stacks change. cmdhelp surfaces it: the
table/string renders lead with a plain "note: '<cmd>' is currently
overridden/extended via commandstack by: <renamers> (override-attached
docs: '<ids>')" line, -return text leads with an OVERRIDDEN: line (below
UNAVAILABLE when both apply), -return dict carries the key on all return
shapes incl the undocumented fallback.
punk::libunknown 0.3.1 (renamed from 0.3.0): the 'package epoch'
subcommand is now DOCUMENTED - a substitution-free doc block with the
space-form id {::package epoch} rides the override's commandstack record
via -punkargs: mirrored for lazy pickup when punk::args loads after init
(normal early boot), defined immediately when punk::args is present, and
removed with the record by any removal path. 'i package epoch' renders
real usage (all six grammar forms) - the doc gap that motivated the whole
arc, retired. init's require tightened to 'commandstack 0.8-': a
pre-mechanism stable copy fails pointedly at init instead of mid-call
with a usage error (found via shadowing.test, whose require-based
children needed 'package prefer latest' - the default stable preference
picks a stale stable bootsupport commandstack over the alpha-versioned
dev copy).
End-to-end verified: 'i package epoch' renders the epoch doc; 'i package'
leads with the note naming punk::libunknown and '::package epoch';
-return text/-return dict carry OVERRIDDEN:/the structured key;
restore_original ::package removes doc and note.
Tests: cmdhelp.test gains 2 hint pins (documented-command note incl docs
clause + dict axis; doc-less-proc autodef render leading with the note,
OVERRIDDEN: text lead, note clearing on unwind) and its two key-list pins
(cmdhelp_cmdinfo_result_shape, cmdhelp_return_dict_valid) flip
deliberately with the new key - exactly as they did for G-166's
'unavailable'. packageoverride.test gains the flagship pending-path pin
(epoch doc mirrored pre-punk::args in path-cleared children, lazily
defined on punk::args arrival, removed on unwind) and its pko_probe
injects ::PKO_SRCMODULES. shadowing.test children set 'package prefer
latest'. src/tests/modules/AGENTS.md punk/ns + punk/libunknown bullets
updated.
G-176 flipped ACHIEVED 2026-08-08: every acceptance clause met across the
four increments (characterise -> migrate -> -punkargs mechanism -> hint +
flagship docs). Detail file archived to
goals/archive/G-176-commandstack-doc-integration.md with its two
boot-site Follow-ons kept open (commandstack pre-sourcing at the
libunknown-style boot sites; make.tcl skip-guard modernization - due by
the 0.3.x/0.8.0 bootsupport promotion). GOALS.md entry removed;
GOALS-archive.md record added; the one tree reference
(packageoverride.test header) swept to the archive path.
Project 0.64.0 -> 0.65.0 + CHANGELOG.
Suites: libunknown+ns+commandstack+loadedlib 216/216; full modules tree
1354 total / 1343 pass / 11 constraint-skipped / 0 fail (zig-built
tclsh90s 9.0.5); testbody_lint 1707 clean; goals_lint clean (79
active-index / 97 archived); make.tcl projectversion consistency OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
ad0489b881 |
commandstack 0.8.0: rename_command -punkargs stack-tied doc blocks (G-176 increment 3; project 0.64.0)
rename_command accepts a new leading option '-punkargs
<list-of-definitionlists>' attaching punk::args doc blocks to the
rename's stack record - e.g documenting a subcommand the override adds,
with space-form ids such as {::package epoch}. Each element is one
definitionlist exactly as given to punk::args::define (the same shape as
a PUNKARGS variable element).
Lifecycle: docs attach only when the rename lands (aborted renames
return early) and are LIVE while the record is on the stack. The detach
hook sits at remove_rename's doomed-record site - pop_rename,
remove_renamer and restore_original all funnel through it - so every
removal path removes the docs with the record.
Works whether or not punk::args is loaded at rename time: deflists are
mirrored in a new ::commandstack::stackdocs namespace registered inert
into ::punk::args::register::NAMESPACES at module load (punk::args need
not be present - the early-boot renames precede it), so a later-loading
punk::args picks them up lazily; when punk::args is already present they
are ALSO defined immediately (a namespace already consumed into
loaded_packages never lazy-loads later appends; redefinition is
idempotent). Detach removes one mirror occurrence per deflist and
undefines via punk::args::undefine_deflist (deflist-keyed - commandstack
never parses ids; never-defined deflists skip silently). Supported
shape: one live record per doc id (same-id declarations in two records
shadow; removing either removes the doc).
The record carries the deflists under a trailing 'punkargs' key - the
append-only key-order contract is preserved (token idx 0-1, renamer idx
2-3). The leading-option parse is generalised: -renamer/-punkargs in
either order, both leading-only, non-dash word ends option scanning so
misplaced options raise the pointed error. stackdocs state follows the
0.7.1 reload contract (info-exists guarded; registration idempotent
across re-source). commandstack::help and the rename_command argdoc
document the mechanism; the In-tree users line gains punk::libunknown
(the increment-2 migration).
commandstack.test: 5 new pins (docs live with the record incl key-order
assertions, all four removal paths detach, the pre-punk::args pending
path in a bare child that loads punk::args afterwards and lazily
consumes the registered mirror, reload contract on mirror + single
registration, option positions in either order + pointed misplacement) +
2 existing G-160 message pins updated to the generalised
usage/misplacement wording (behaviour contracts unchanged). Suite 46/46.
src/tests/modules/AGENTS.md commandstack bullet updated; goal Progress
entry added. Project 0.63.0 -> 0.64.0 + CHANGELOG.
Suites: commandstack 46/46; full modules tree 1351 total / 1340 pass /
11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5);
testbody_lint 1704 clean; goals_lint clean (80 active-index / 96
archived); make.tcl projectversion consistency OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
a7bc62c3fb |
punk::libunknown 0.3.0: ::package override installs via commandstack (G-176 increment 2; project 0.63.0)
The ::package override (the 'epoch' subcommand and controlled 'forget') now installs via commandstack::rename_command -renamer punk::libunknown instead of the former 'rename ::package :📦:' + namespace-import mechanism. Both live ::package overrides (this and punk::packagepreference's) now share one managed stack whatever the install order - stack removals and third-party renames re-link correctly instead of operating on the wrong command (previously commandstack's ::package stack believed the packagepreference wrapper was live while libunknown's unmanaged import actually was; restore_original would have stranded :📦:). Migration deltas (exactly the set enumerated in the goal Context): - the override body runs at :: - the four bare epoch_incr_pkg/epoch_incr_tm calls are fully qualified (the old namespace-import execution context is gone) - the dead 'variable has_package_files' declaration dropped (its only use was already commented out; the module-load probe stays) - the two :📦: delegation sites (forget arm, default arm) now delegate via COMMANDSTACKNEXT; :📦: no longer exists (nothing in the tree called it) - init does 'package require commandstack' (a no-op when already provided - e.g whenever punk::packagepreference::install ran first, as in punkshell boot; resolvable via tm paths in every other real init context - bootsupport and the common vfs both carry commandstack-0.7.1) - re-entry guard is now a stack query for the punk::libunknown record (same 'already done' notice; the old ::punk::libunknown::package proc-existence check tested a proc that no longer exists) - init argdoc reworded; file renamed libunknown-0.2.4.tm -> libunknown-0.3.0.tm (git mv + fossil mv) with Meta/manpage/provide-block version updates and a changelog entry per the in-file bump procedure. Behaviour of every subcommand arm is unchanged: all increment-1 BEHAVIOUR pins in packageoverride.test passed byte-identically; only its four MARKED-TO-FLIP install-shape pins flipped as fenced (origin ::package, no :📦: residue, managed stack records - 1 solo, 2 in both packagepreference interop orders). discovery.test and packageoverride.test child interps now pre-source the source-tree commandstack by path (their tm paths are cleared); libsearch/shadowing children resolve commandstack via inherited parent paths and needed no changes. Two out-of-scope items recorded as open Follow-ons in the goal (Scope amendment needed if pursued): boot-site commandstack pre-sourcing (punkboot core.tcl / make.tcl / punk::repl / punk::lib child-seeding - to preserve the minimal-untracked epoch intent exactly) and make.tcl's 'info commands ::punk::libunknown::package' skip-guard modernization (old kits still satisfy it; switch to a package-provide check before or with the 0.3.0 bootsupport/kit promotion). Goal Scope mirrors updated to the new filename (rename anticipated in the Scope text). Project 0.62.2 -> 0.63.0 + CHANGELOG. Suites: libunknown tree + loadedlib 42/42; full modules tree 1346 total / 1335 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5); testbody_lint 1699 clean; goals_lint clean (80 active-index / 96 archived); make.tcl projectversion consistency OK (and that run itself exercised the bootsupport-0.2.4 transition path live). Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
b82827d837 |
punk::args 0.25.2 + tclcore moduledoc 0.4.2: qualify ensemble names into ensemble_subcommands_definition - 'i ::tcl::prefix' unqualified-ns warnings gone; G-175 drafted (project 0.62.2)
'i ::tcl::prefix' emitted 12x "warning: update_definitions received unqualified ns: tcl" on stderr (6x for subcommand renders). Root cause: the tclcore moduledoc's @dynamic ::tcl::prefix definition passed the ensemble name to punk::args::ensemble_subcommands_definition UNQUALIFIED ('tcl::prefix'). The generator's space-form id_checks derive namespaces via 'namespace qualifiers' - for a relative multi-component name that yields a non-empty UNQUALIFIED namespace ('tcl') which the empty-qualifier guard ('' -> ::) never catches - and update_definitions warned once per subcommand per resolve. @dynamic definitions re-expand on every resolve and the cmdhelp pipeline resolves the id four times (parse_status spec fetch + its internal parse, cmdhelp's get_spec, arg_error/synopsis), so 4 resolves x 3 subcommands = the reported 12. tcl::prefix was the ONLY affected ensemble: all tclcore ensemble docs pass unqualified names, but the single-component ones (info/dict/file/ namespace/array/encoding/zipfs) derive an empty qualifier which was already mapped to ::. Both fixes: - tclcore call site now passes ::tcl::prefix. - ensemble_subcommands_definition normalizes its ensemble argument to fully-qualified in the CALLER's context (uplevel namespace which, :: prepend fallback) before deriving anything - covering any future relative multi-component caller. Verified: zero warnings at both depths; rendered help byte-identical (6301/5585 chars); generator snippet identical for qualified vs unqualified input. New pin ensembledef.test ensembledef_unqualified_ensemble_name_no_warnings (fixture two-component ensemble called relatively under stderr capture; capture_stderr helper added to the file). src/tests/modules/AGENTS.md index updated (ensembledef.test now listed). G-175 drafted (proposed): goals/G-175-punkargs-dynamic-resolve-multiplicity.md - the warning was the only signal of the 4x-per-render @dynamic resolve multiplicity; the goal records the verdict question (render-scoped single resolution vs pinned accept), the attributed resolve sites, the measured cost floor (redundant builder calls ~3ms on 'i ::tcl::prefix', ~22ms on 'i ::dict' steady-state; the full argdata re-processing share is unmeasured - first investigation step), and candidate mechanisms smallest-first. GOALS.md indexed. punk::args 0.25.1 -> 0.25.2, punk::args::moduledoc::tclcore 0.4.1 -> 0.4.2, project 0.62.1 -> 0.62.2 + CHANGELOG (user-visible repl stderr noise fix). Suites: testbody_lint 1688 clean; goals_lint clean (79 active / 96 archived); modules tree 1335 total / 1324 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5); make.tcl projectversion consistency + staleness OK. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
661418b732 |
punk::ansi 0.2.1 + punk::args 0.25.1: add missing -- to 'regexp -about' sites - dash-led grepstr patterns and -type regexp values work again (project 0.62.1)
grepstr regression report (user, 2026-08-08): 'grepstr -h underline
-group test-group' errored 'bad option "-group": must be -all, -about,
-indices, ...' - regexp's own option list - with or without the --
end-of-options marker, where an old punk901t.exe kit worked.
Diagnosis: the punk::args parse layer was never at fault. A live probe
seats the dash-led word as the pattern value in both invocation forms
(without a marker via the starved-values/valmin reservation rule). The
failure was the body's capture-group probe 'regexp -about $pattern' in
punk::ansi::grepstr - no -- guard, so any dash-led PATTERN VALUE was
read as a regexp option. Present since the proc's introduction
(
|
2 days ago |
|
|
df74c3b2db |
punk::args 0.25.0: bounded -multiple ranges participate in leader/value allocation (directed work post-G-053; project 0.62.0)
Bounded -multiple occurrence ranges now PARTICIPATE in positional allocation
for leaders and values instead of being post-loop enforcement only.
Previously greedy collection overran a bounded max unless a type screen
happened to stop it - untyped {3 3} followed by a -multiple tail collected 4
words and occurrencecount then reported the overrun the allocation itself
created (and typed {3 3} with four consecutive ints failed identically) -
and a later REQUIRED ranged argument was starved to a single reserved
clause.
Three cooperating sites:
(a) get_dict_can_assign_value caps a satisfied -multiple argument at its
bounded max: the word is yielded (no-consume) so the caller's retreat
advances to the next argument - one proc serving both the leaders and
values loops. The yield carries a G-082 rejection record of new kind
'occurrence', and both loops' overflow selection sites render it as the
pointed occurrence-limit report with the G-053 occurrencecount errorcode
(count = the attempted occurrence) instead of the generic toomanyarguments,
so genuine over-supply keeps its pointed class - now describing an overflow
the allocator refused rather than one it created.
(b) Reservations are min-occurrence aware: the allocator's tail_needs and
the derived valmin floor (leader/value split + option-scan reservation)
reserve min-occurrences x min-clause-length for a required ranged argument
- a following required -multiple {3 3} reserves 3 clauses, {2 2} pair
clauses reserve 4 words - so earlier greed cannot starve it. An explicit
'@values -min' still overrides the derived floor; legacy boolean -multiple
(no MULTIPLE_RANGES entry) reserves exactly as before.
(c) The greedy leader scan caps a bounded -multiple last leader at max
occurrences (via the leader_posn_names_assigned counter), so remaining
words flow to the opts/values sections. (The split is a separate pre-loop
scan - capping only the loops left over-provided leader words raising
toomanyarguments.)
First occurrences are never capped (resolve guarantees range max >= 1);
{0 1} at-most-once scalars are unaffected (no collection); bounded-variable
ranges take greedy-up-to-max deterministically; legacy boolean greed is
byte-unchanged (pinned). define -help -multiple documents the allocation
semantics.
multipleranges.test gains 7 allocation pins: untyped/typed {3 3} cap incl
the cap-beats-type-screen four-ints case, greedy-up-to-max {1 2},
required-range and pair-clause reservations, the leaders-side scan cap +
split floor, the pointed over-supply report, and a legacy-greed-unchanged
guard. src/tests/modules/AGENTS.md index updated.
Project 0.61.0 -> 0.62.0 + CHANGELOG (allocation behaviour is user-visible
shell parsing). punk::args 0.24.0 -> 0.25.0.
Suites: punk/args 408/0; modules tree 1320 pass / 11 constraint-skipped /
0 fail (zig-built tclsh90s 9.0.5); testbody_lint clean; make.tcl
projectversion consistency OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
39e0ec2ba7 |
G-084 achieved: settled cross-member -multiple rejection + value-parsekey integrity + storage-key attribution (punk::args 0.24.0, project 0.61.0)
G-084 increment 2 + achieved flip - parsekey completeness closed: Cross-member -multiple on a shared-parsekey option group is now a DEFINE-TIME error unless ALL members belong to one @opts group marked -parsekeymode error (G-083 mutual exclusivity makes per-member collection well-defined; a single -multiple member with its own parsekey is unrestricted). This settles the G-084 cross-member accumulation decision as rejection rather than accumulate-in-received-order: collection on one storage key is ambiguous (collect-vs-replace undefined), and rejection eliminates the silent loss without new collection semantics. The check runs AFTER the G-053 canonicalisation so range forms verdict correctly ({0 1} replace-shape allowed; a pre-canonicalisation placement would raise a raw non-boolean error for any range form). Value -parsekey integrity settled at define time: duplicate value parsekeys rejected (trailing values consume positionally - the shared slot silently overwrote), dash-led value parsekeys rejected (they landed in the options namespace of result/received and aborted parse with an internal error in the option-shaped validation paths; every option storage key is dash-led, so this one rule also removes all cross-class collisions). parse_status/parse_report storage-key attribution: parse_status_build now resolves a storage key claimed by exactly ONE argument (value -parsekey, declared option -parsekey, '='-suffixed optset tail) back to that argument, so argstatus/Source report received with the value-in-effect instead of default/0. Shared-parsekey groups stay unresolved - the remaining recorded display gap (engine-level per-member tracking; archived as the goal's open Follow-on). undefine/undefine_deflist now return "" (previously the whole internal cache dict to any caller capturing the value). define -help documents -parsekey for the first time (rename semantics for options and values, leader rejection, shared groups and -parsekeymode, last-defined-member defaults precedence, the -multiple rule, value-key uniqueness/non-dash). Moduledoc tclcore comment corrected (leader -parsekey settled as rejection, not pending). Internal sweep: dead values-loop identifiers removed (val_ident/val_ident_is_parsekey/values-side seen_pks), leader reverse map removed (VAL_NAMES-driven build), dead parsekey-from--default derivation removed, stale pre-G-084 comments corrected. Tests: parsekey_shared_key_multiple_rejected strengthened (message pins, {0 1}/{0 4} range coverage, the -parsekeymode error escape hatch incl collection and optionconflict); new parsekey_value_parsekey_integrity, parsereport_storagekey_attribution, parsestatus_storagekey_attribution; inc-1 comment damage repaired (duplicated block, eaten G-083 provenance lines, stale GAP-era comment); 2026-08-08 future-dating normalized to 2026-08-07 in touched files (CHANGELOG 0.59.0/0.60.0 headers corrected likewise; the underlying commits landed 2026-08-07 AEST). Goal flip (user-approved): the Goal line's accumulate wording amended to the settled define-time-rejection design; G-084 flipped achieved 2026-08-07 and archived (detail -> goals/archive/, index -> GOALS-archive.md, reference sweep applied - G-167 survey note gains achieved markers for G-053/G-083/G-084; Follow-on recorded: shared-group per-member received attribution => open). Detail file gains ## Progress (inc 1 + inc 2 + flip evidence). src/tests/modules/AGENTS.md punk/args index updated to the settled-pin state. Project 0.60.0 -> 0.61.0 + CHANGELOG (value -parsekey support and the define-time integrity rules are user-visible shell behaviour; G-053 precedent). punk::args 0.23.0 -> 0.24.0. Suites: punk/args 401/0; modules tree 1313 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5); testbody_lint clean; goals_lint clean; punkboot version-parsing 81/81; make.tcl projectversion consistency OK. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
2aad4d1777 |
G-053 achieved: punk::args range-valued -multiple occurrence arity (punk::args 0.22.0, project 0.60.0)
-multiple now accepts a {min max} range (max -1 = unbounded) alongside the
legacy booleans 0/1, so a definition can declare at most once ({0 1}, a second
occurrence is a parse error), bounded repetition ({2 4}), or one-or-more
({1 -1}) instead of choosing between silent last-wins (0) and unbounded
collection (1).
The spec compiler canonicalises once at resolve: the stored -multiple becomes
the computed boolean (list-shape collect: true for max>1 or -1, false for
legacy 0 and max==1) so every existing collect-vs-replace / scalar-vs-list /
leader-value-single-multiple hot-path truth-test stays correct, and the range
companions (min/max/maxbounded) live in a separate per-form MULTIPLE_RANGES
dict - NOT in ARG_INFO, so they do not ride along when ARG_INFO is round-tripped
as a spec via resolved_def copyfrom. Legacy 0/1 and boolean strings
(true/false/yes/no) are coerced to the boolean and stay byte-unchanged (no
MULTIPLE_RANGES entry for unlimited cases, so {0 -1} is equivalent to legacy 1).
Resolve validation: max positive or -1, min <= max, and the -optional/range-min
reconciliation (non-zero min forces presence, contradicts -optional -> reject
with a clear message; declare -optional 0). The value-shape rule: max==1 forms
stay scalar, max>1 or -1 yield the occurrence list.
Parse enforcement: a new PUNKARGS VALIDATION occurrencecount failure class
(payload <argname> count <n> min <m> | max <m>) fires in a single post-loop pass
per section (opts/leaders/values) via a private::multiple_range_enforce
helper. Over-max is a hard contradiction (fires in both normal and
viability-probe modes; parse_status_classify maps it to invalid); under-min is
pure end-of-input exhaustion (SUPPRESSED in the G-152 viability probe via the
viabilitycheck arg, classified incomplete so a viable form reports incomplete
not invalid). Legacy -multiple 1 required with 0 occurrences still reports
trailingvaluecount (byte-unchanged, not occurrencecount).
Rendering: the usage-table Multi column reflects the range (0-1 / 2-4 / 1+ for
unbounded-with-floor; the greencheck stays for legacy 1), the string renderer
emits MULTI:0-1 etc., and the synopsis distinguishes at-most-once (?arg?, no
ellipsis) from repeating (arg...). -multipleunique/-multipleuniqueset compose
with max>1 ranges unchanged. define -help documents the range form and the
-optional/range-min rule.
New testsuite multipleranges.test (28 tests: 13 define-time
canonicalisation+validation, 12 parse-time enforcement incl parse_status
verdicts and a legacy-required-still-trailingvaluecount guard, 3 rendering).
Legacy untouched by default confirmed: full punk/args suite 399/0 (3 skipped),
punk/ns 125/125. All G-053 acceptance criteria met; goal flipped to achieved
2026-08-08 and archived (detail -> goals/archive/, index -> GOALS-archive.md,
reference sweep applied to G-072/G-084, deferred G-084 cross-member -multiple
collection decision recorded as a Follow-on => goal G-084).
Project version 0.59.0 -> 0.60.0 (minor: backward-compatible behaviour
addition). punk::args module 0.21.0 -> 0.22.0.
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
3 days ago |
|
|
9125d56237 |
G-083 increment 3 achieved: punk::args argument-relations usage rendering + lsearch moduledoc adoption (punk::args 0.21.0, project 0.59.0)
The -conflicts and -parsekeymode error vocabulary (inc 1, 0.19.0) and its parse-time optionconflict enforcement (inc 2, 0.20.0) now surface in usage/arg_error and synopsis output, and the lsearch tclcore moduledoc models its documented option incompatibilities with the new vocabulary. Rendering: - A per-arg -conflicts list appends a "conflicts with: <targets>" hint to the argument's help text in the usage table (targets resolved to display names via lookup_optset, so a parsekey target shows its member flag, not the raw parsekey). - A named @opts group marked -parsekeymode error is annotated "mutually exclusive (distinct members may not be combined)" in its group header; override (default) groups carry no such annotation. - The synopsis one-line form carries no conflict detail. lsearch moduledoc (tclcore): - -sorted gains -conflicts {-glob -regexp} and -bisect gains -conflicts {-all -not} (per-arg conflicts; the whole group stays -parsekeymode override so -glob/-regexp remain last-wins). - The "(documentation incomplete - punk::args fixes required for grouped mutually exclusive options and prefix calculation)" caveat is dropped from the @cmd -help. clock clicks left unchanged - its active positional-choice definition already models exclusivity (exactly-one-of) and the acceptance clause names lsearch only. relations.test extended with 8 increment-3 pins: 4 rendering (conflicts_usage_hint, parsekeymode_error_usage_group_header, parsekeymode_override_no_header_annotation, conflicts_synopsis_no_hint) and 4 lsearch adoption (lsearch_sorted_conflicts_glob + lsearch_bisect_conflicts_all raise optionconflict via errorcode substring match, lsearch_glob_regexp_last_wins stays last-wins, lsearch_caveat_dropped). Legacy untouched by default (no -conflicts/parsekeymode-error definition carries no new rendering). Full punk/args suite 371/0 (3 skipped); tclcoreparity 10/10; punk/ns 125/125. All G-083 acceptance criteria met; goal flipped to achieved 2026-08-08 and archived (detail -> goals/archive/, index -> GOALS-archive.md, reference sweep applied to G-053/G-084, deferred -requires/-implies dependency relations recorded as an open Follow-on). Project version 0.58.0 -> 0.59.0 (minor: backward-compatible behaviour additions, following the G-173 punk::path precedent). punk::args module 0.20.0 -> 0.21.0. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
147f5104e7 |
G-173 (active): punk::path machine-parsable returns -return text/dict/json + -context + -conflicts
Activated per user direction; activated goal flipped proposed -> active (overlap survey re-run at activation; new Related: G-016 - sibling json round-trip consumer. G-042/G-019/G-061/G-110/G-167/G-171 deliberate non-overlap). ::punk::path gains three options: - -return text|dict|json (default table, byte-unchanged): the structured modes build an ordered entry list from the shared collect dicts (d_path_info/d_bin_info/d_index_executables) and serialise without ANSI/textblock. text is a fixed-key plain-ASCII layout; dict returns a Tcl dict; json is emitted via tcllib json::write (the preferred encoder settled by the runtests json_emit hardening) so booleans/counts are bare JSON numbers/1-0 and the decoded form equals the dict form byte-for-byte. - -context <namespace> (default the caller's namespace): makes the TCL-context conflict verdict stable for a machine consumer invoked through a wrapper. - -conflicts 0|1 (default 1): skip conflict computation for a small perf win. The table render is kept verbatim (byte-identical default output). The structured modes use a clean exact|nocase conflict classification (path_conflicts_for_exe) independent of the table render's ANSI path. A duplicate-path entry now reports the original's exe_count with an empty executables list (mirroring the table column). PUNKARGS argdoc updated; new options documented (whatis -doc punk::path shows the synopsis + per-option help + choices). Tests: src/tests/modules/punk/pathcmd/testsuites/tests/pathcmd.test (7 tests: dict shape, duplicate/overshadowed fields, json ansi-freeness + round-trip parity, text ansi-freeness, -context stability, -conflicts 0, default-table still ANSI). Passes on Tcl 9.0.5 and Tcl 8.6. Existing punk::path module tests (path.test, 67) unchanged/green. Versioning: punk module buildversion 0.2.8 -> 0.3.0 (minor - new user-visible options on ::punk::path); punkproject.toml 0.57.1 -> 0.58.0 (minor - new user-visible shell behaviour) + CHANGELOG entry. goals_lint clean; projectversion OK. Assisted-by: harness=pi; primary-model=zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
8f446690c1 |
G-172 (active): record + surface + audit the distributed-binary CPU floor
Approach 3 (record floor field): build905.zig declares cpu_floor="baseline" beside the default_target pin and writes cpu_floor + cpu_model into each family member's embedded record [provenance] (= target.result.cpu.model.name, so "x86_64" for the default build, "znver5" for -Dcpu=native - the floor is a default, not a restriction). family_artifacts.tcl derives both from the embedded record (G-117 single-source-of-truth) into the sidecar [provenance], failing if absent; family_check.tcl asserts them non-empty. Approach 4 (audit tool): scriptlib/developer/cpufloor_audit.tcl disassembles a binary's .text via a located objdump (llvm-objdump preferred, GNU fallback) or audits a pre-disassembled excerpt, classifies by AVX register width (zmm=v4, ymm=v3; baseline/v2 forbid both, v3 forbids zmm, v4 allows all), reports out-of-floor count + first RVA + sample mnemonics, exit 0 PASS / 1 FAIL. Bundled fixtures in cpufloor_fixtures/ are real disassembly excerpts (avx512, avx2, clean); selftest 12/12 cases pass. Verified on real binaries: rebuilt bin/punkzip.exe PASS (zmm=0); a -Dcpu=native probe FAILs at baseline (123 zmm) and PASSes at v4. Approach 5 (punk-runtime surfacing): both .ps1 and .bash twins updated and re-wrapped. Host CPU level detection (PS via IsProcessorFeaturePresent PF SSE2=10/SSE4.2=38/AVX2=40/AVX512F=41; bash via /proc/cpuinfo flags) feeds a meets/below/unknown/norecord verdict. fetch prints cpu floor (UNGATED - a cross-platform fetch for another machine stays free); list annotates rows the host cannot run (!CPU-FLOOR:v<req>, local rows only); use/run gate on below with a named diagnosis instead of a silent STATUS_ILLEGAL_INSTRUCTION (0xC000001D) - the 2026-08-06 AVX-512 regression failure mode; info adds the fields. bin/punk-runtime.cmd re-wrapped (deterministic; scriptwrap_runtime_cmd_roundtrip_no_drift test PASSES). Activation: overlap survey re-run at activation (goals_xref score G-172) - no goals drafted in the interval; existing Related: notes cover every pair. Project version 0.57.0 -> 0.57.1 (patch - user-visible punk-runtime behaviour shipped in kits). Remaining for acceptance: rebuild + republish in-situ (per Approach 6's alpha dispensation) and audit the republished artifacts to confirm zmm=0 - a publication-time, user-owned step. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
f103b90c3a |
G-166 achieved: cmdinfo/cmdhelp surface recognised-but-unavailable landings distinctly
Activated at user direction and achieved in the same session. On Tcl 8.6,
'i string is dict' (a class the runtime lacks) and 'i string is true' (a real
class) were indistinguishable to both eye and machine: cmdinfo reported
cmdtype 'doconly' with identical key sets, and cmdhelp's advisory parse of an
argument tail succeeded against the virtual docid, so 'i string is dict 5'
rendered exactly like a usable command line. Documentation REACHABILITY for
unavailable words is G-073's intent; the INDISTINGUISHABILITY was emergent -
nothing structural told a consumer the documented word is rejected here.
punk::ns 0.10.0
(a) cmdinfo gains an 'unavailable' key on EVERY result - empty, or the
canonical -choiceunavailable name the resolution addressed. It is a SECOND
AXIS beside cmdtype, never a cmdtype value: cmdtype answers what kind of
executable thing resolution landed on (both 'string is dict' and
'string is true' stay 'doconly'), availability answers whether the resolved
word is selectable in this runtime/context. Overloading cmdtype would have
broken every consumer switching on cmdtype eq "doconly", and the two only
co-occur incidentally. cmd_traverse's yielded/returned records carry a sixth
element for the attribution; cmdinfo keeps the final landing's value.
Population is nearly free - the level's choices-bearing first leader is
resolved once per level via the shared punk::args::choiceword_match, and both
the exact space-form landing and the prefix retry consult that one result
(the G-051 branch was restructured, not duplicated).
(b) PREFIX-LANDING DECIDED, enacting the G-073 doc-walk follow-on: a unique
prefix landing on an unavailable name now RESOLVES that name's virtual docid,
attributed - the conservative non-resolution was not kept. Encoding
availability as resolve-vs-don't-resolve conflated it with addressing and
made addressing inconsistent: 'i string is tr' resolved but 'i string is dic'
did not, while exact 'true' and 'dict' both did. Now every form of address
that names a documented word resolves it, and the availability key plus the
render marking carry the rejection story parse reports for the same word.
The choice traverse's G-040 parse-parity claim is untouched - an unavailable
word still identifies no SUBCOMMAND there, it is only attributed (the path
taken when the name has no space-form virtual docid).
(c) cmdhelp marks such subjects in every return form from one shared wording
(_cmdhelp_unavailable_marking, mirroring punk::args'
private::unavailable_choice_msg so a user meeting both reads one story):
-return dict carries the key, table/string render the message below the usage
under the non-info scheme, -return text leads with an 'UNAVAILABLE:' line.
The marking takes precedence over BOTH the ok-parse info render and any parse
failure message - the subject not existing here is the more fundamental
report, and it is the one a parse against a virtual id cannot make. Parse
status still passes through, so argument positions keep their marking.
punk::args::moduledoc::tclcore 0.4.1 - on a runtime lacking a curated forward
class, that class's per-class virtual id LEADS its help with the unavailability
statement (runtime patchlevel + the rejected call shape), then the unchanged
static description. The static version note existed but sat at the END of the
prose, so a reader met the full class documentation before learning the class
does not exist here. Runtimes where the class is live generate the id unchanged.
Tests: cmdflow.test gains the flowunavail / flowunavail_nodoc fixtures and 5
pins (key always present; exact landing attributed with cmdtype unchanged; the
prefix decision pinned against parse's choiceunavailable rejection;
choice-traverse attribution without addressing; attribution surviving an
argument tail). cmdhelp.test gains the helpstrua fixture and 5 pins (3 local
render, 2 tclcore-gated real-world) plus the two DELIBERATE key-list flips
(cmdhelp_cmdinfo_result_shape, cmdhelp_return_dict_valid). tclcoreparity.test
gains the virtual-id leading-note pin. All new pins are live-derived, so the
modern arm asserts the same shapes with an empty key.
Verified: cmdflow 25/25 + cmdhelp 50/50 on native 8.6.10 (THE AFFECTED ARM,
unavailable={dict}), 8.7a6 and 9.0.5; full punk/args subtree 341 total / 338
passed / 3 intended skips / 0 failed on all three; full punk/ns 125 green on
9.0.5 and green on 8.6/8.7 apart from two nsprimitives failures verified
PRE-EXISTING on both (confirmed with the module changes stashed); broad
src/tests/modules/*** sweep on 9.0.5 - 1257 tests, 108 files, 0 failed.
Consumer audit: every in-tree cmdinfo consumer reads named keys via dict get,
so the added key is inert for all of them. goals_lint and architecture_lint
clean.
Project 0.56.2 -> 0.57.0 (user-visible shell behaviour) with CHANGELOG entry.
Goal flipped to achieved and archived; four follow-ons recorded (to G-050,
G-044, G-055, G-167) with reference-sweep pointers pushed into those goals'
Notes, and the G-167 back-pointer added at activation - G-166 landing first
settles the marking-vocabulary ownership the two goals share. Also corrected
two pre-existing stale claims in src/tests/modules/AGENTS.md that this work
falsified: tclcoreparity's "version-note labels conditional on class presence"
(stale since G-073) and its "under 8.6 run the file directly via a plain
tclkit" note (stale since native 8.6 became a supported runner 2026-07-21).
Staged deliberately as this change-set only: the concurrent G-172 zig
CPU-floor lane (GOALS.md entry, goals/G-172-*.md, the four build.zig files)
is left uncommitted in the tree.
Claude-Session: https://claude.ai/code/session_01Y5vEJUZkD4p8jmEFEBVhLi
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
f05a2857a3 |
make.tcl bake: end-of-run BAKE SUMMARY + exit 4 on failed kits (punkshell 0.56.2)
A full 'make.tcl bake' scrolls its per-kit work far out of reach, so the run
ended with no answer to "what actually baked?" - the INSTALLED KITS / FAILED
KITS blocks named only the kits the kit machinery touched and said nothing
about the rest. Every run now ends with a BAKE SUMMARY block: a counts
headline (deployed/unchanged/not-built/failed, plus the number of
BAKE-WARNINGs recapped after it) and one line per kit with its reason, under
NOT BUILT / UNCHANGED / INSTALLED KITS / FAILED KITS.
It covers the WHOLE configured matrix, not just the kits the run touched. An
absent runtime, bake_default=false, a release-gated scheme output or a missing
.vfs folder each keep a kit out of the kit machinery entirely, and on a
part-populated runtime store those are most of the rows: on a second punkshell
checkout 16 of 20 configured kits never enter the loop - three of them (the
punk8-* scheme outputs) previously silent, since the parse-time
missing-runtime BAKE-WARNING only covers default entries.
Mechanism: a per-kit ledger (::punkboot::bake_outcomes, fed by
record_bake_outcome at every point that settles a kit's fate, including the
parse-time skips) keyed by the kit's path relative to bin/ and src/_bake/
(kits/<platform>/<kit> for cross-target outputs - G-127) so same-named kits
for different targets keep distinct rows, plus a completeness pass over
mapvfs_kit_outputs for anything the loop never reached. Selective bakes
summarise only the kits they were asked for. The block is stdout so it stays
contiguous under redirection; the failure list is echoed to stderr from the
same ledger, so the two renderings cannot drift apart.
Exit status: a run that completed with FAILED kits now exits 4. make.tcl's
existing non-zero codes all mean "refused to do the work" (1 usage/gate
refusal, 2 structural abort, 3 config error), so a run that DID the work and
had kits fail exited 0 like a clean one - and punk::mix::cli::make ('dev make',
the in-tree caller that branches on the exit code) reported "OK make finished"
and returned true for a bake in which every kit failed. 4 keeps "could not
run" distinguishable from "ran, produced failures". The not-built bucket
deliberately never affects the exit code: an absent runtime, bake_default=false
or a release-gated output are normal states, and a part-populated runtime store
is the common case.
Verified: all five outcome buckets exercised through the PUNK_MAPVFS_CONFIG
fixture seam (deployed, unchanged, parse-time notbuilt, completeness-pass
notbuilt, failed) plus selective-bake narrowing; exit 4 measured end-to-end
under a direct tclsh; 59/59 punkexe maketcl* tests pass, including the five
real fixture bakes in maketclprojectversion.test and the exitcode pins in
maketclbakelist.test.
Known gap, pre-existing and untouched: bin/punk-runtime.cmd 'run <script>'
flattens every child exit code to 0 (measured with a probe script exiting 7),
so exit 4 is invisible through that wrapper until its run action propagates.
Layout copies (src/project_layouts/vendor/punk/{basic,project-0.1}/src/make.tcl
and the modpod templates copy) synced by 'make.tcl modules'.
Claude-Session: https://claude.ai/code/session_017yWCebiNUVFtTrMA9GvsYd
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
2dbf635b99 |
Project-version bake gate - bump-before-bake machine-enforced (punkshell 0.56.1)
The project version is a bake input (kit stamp punkkit-stamp.toml project_version + versioned-scheme output names), but nothing enforced the step (2) bump -> step (8) bake order; a 2026-08-06 session baked at 0.55.1, bumped to 0.56.0 and paid a full 11-kit re-bake. Every other release-sequence edge already had a mechanical gate (provenance, bootsupport staleness, boot precondition) - this was the un-gated one. - ::punkboot::get_projectversion_status: shared staleness/consistency computation (projectversion advisory, check report, gate); states ok/overdue/bump_uncommitted/unavailable. - project-version gate on bake/bakehouse/bin: a pending-looking bump (src/ commits since punkproject.toml last changed, none staged) prompts y/N on a terminal and aborts fast non-interactively unless -expect-projectversion asserts the intended version. -confirm 0 deliberately does not waive the gate. A staged-but-uncommitted bump passes (bake reads the working-tree value); degraded bootsupport reduces the gate to a NOTE. - -expect-projectversion <ver> (bake/bakehouse/bin argdocs + degraded scan): assertion verified in every state - a mismatch with punkproject.toml always aborts before any kit work; unavailable status aborts a supplied assertion as unverifiable rather than silently losing the requested strictness. - projectversion overdue warning now states the consequence and prints the ready-made assertion command; check reports the gate state and current staleness verdict; workflow text ([K2] bake-input + gate, [K6] no-waiver exception, steps (2)/(8)) and gethelp/HELPTEXTS/OPT_CONFIRM document it; root AGENTS.md gains "The version is a bake input (bump BEFORE bake)" + an Enforcement gate paragraph; src/AGENTS.md closeout bullet extended. - maketclprojectversion.test: piped characterization (8 tests) - check report, advisory read-only, and git-fixture verdicts for pending-abort, assert-match proceed, assert-mismatch abort, bump-staged proceed, no-git NOTE. maketclhelp.test bakehouse-synopsis pin updated for the new flag. - Thin-layout + templates-modpod make.tcl copies synced via make.tcl modules. Claude-Session: https://claude.ai/code/session_01EukjNTv2r5msFgHzWgaCdS Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
5e956f7419 |
G-169/G-170 follow-on landed: coherent-set promotion + bake - launcher help depth reaches the kits (punkshell 0.56.0)
Both goals' open coherent-set promotion follow-ons name the SAME
vfscommonupdate/bake event; this change-set is that event, so both flip to
landed 2026-08-06 in the same work unit (the sanctioned archived-file edit).
Promotion (canonical release-sequence steps 5-8, native tclsh90 driver):
- mint: 'make.tcl packages -confirm 0'.
- promote: 'make.tcl bootsupport -confirm 0' - punk::args 0.17.0 -> 0.18.0 and
punk::ansi 0.1.3 -> 0.2.0. The second pass copied zero modules (the gate's
own contract) and 'make.tcl check' no longer reports stale bootsupport.
- promote: 'make.tcl vfscommonupdate -confirm 0' - the same two modules plus
punkboot core 0.7.0 (byte-identical to src/vfs/_config/punkboot_core.tcl),
punkexe moduledoc 0.6.1 -> 0.9.0, punkboot moduledoc 0.3.0 -> 0.3.1, and
app-punkscript/app-punkscript-docs 1.1 -> 1.3 (pkgIndex + punkscript.tcl;
vfscommon never carried the intermediate 1.2). Every promoted copy verified
byte-identical to its mint output.
- bake: 'make.tcl bake -confirm 0' - INSTALLED KITS (11), no FAILED KITS. The
templates modpod payload (both bootsupport and vfscommon copies) regenerated
from the G-170 layout core edits.
What a deployed kit now does that it could not before, probed directly against
bin/punk902z.exe (no src package mode, no fake-main harness):
- 'help script oneliner' narrows to the oneliner form's argument table - the
'-e' row, which is absent from form 0's default table - exit 0.
- the multi-form synopsis lines carry the un-suppressed formhint labels
(' <punkexe> help script file' / ' <punkexe> help script oneliner'), G-170's
resolution of the 0.6.1 circularity objection, rendered from the app-owned
definition G-169 moved beside the code that implements it.
- 'help script somefile.tcl' dry-runs: the matched form plus the
punk::args::parse_report landing report (Argument|Source|Value carrying
'scriptfile received somefile.tcl') - G-151's render consumed by the core.
- 'help buildinfo bogus' rejects with exit 1, byte-empty stdout and the parse
diagnosis on stderr; 'help shell somearg' keeps the passthrough
accepted-and-ignored render at exit 0.
- 'help tclsh somefile somearg' now DRY-RUNS (accepted, exit 0) where the baked
0.6.1 moduledoc had kept the historic ignored-tail render: the G-170 fence
witness requires a -regexprefail row in the definition actually served, and
the promoted 0.9.0 moduledoc supplies it. That was the recorded
mixed-vintage state, now resolved in the deployed kits.
Verification:
- launcherhelp.test 38/38 against the freshly baked kits. The two direct-kit
trailing-word pins that G-170 re-described as VINTAGE-PROOF hold under the
depth core exactly as designed.
- Full source-tree suite (-jobs 16): 1560 passed / 20 skipped / 1 failed. The
single failure is core/tcl/testsuites/tests/exec.test exec-14.3, a vendored
Tcl core test asserting stock's 'exec -gorp' error text without -encoding -
a Tcl 9.0.3 core-vintage mismatch, unrelated to this change-set.
- punkexe subtree 162 passed / 4 skipped / 0 failed. The 10 failures recorded
as pre-existing through the G-168/G-169/G-170 sessions (maketclbakelist 2 +
maketcllibfetch 8) now ALL PASS - they were stale build-state artifacts, and
this mint/promote/bake refresh is precisely what they were waiting for. Worth
weighing against the G-139 libfetch-test reading still pending a user call.
- punk/args subtree 337 passed / 3 skipped / 0 failed, its recorded baseline.
- Bake warnings are the known set only: punkmagic skipped (runtime
tclsh90magic.exe absent from the store) and the zint.dll i386-in-x64 arch
mismatch in the tcl8 kits punkbi/punksys/punk86, the recorded pre-existing
payload defect. No configured kit exe was locked (the running punk901t.exe
instances are not a configured bake target).
Project version 0.55.1 -> 0.56.0 with a CHANGELOG entry: the G-151/G-168/G-169/
G-170 launcher-family behaviour becomes user-visible in a deployed kit for the
first time with this bake, and none of those source commits bumped the project
version - the source change alone shipped nothing to a user.
ARCHITECTURE.md's launch-surface paragraph still described trailing help words
as merely 'accepted', which is pre-G-170 semantics, so that clause now states
the narrowing / dry-run / passthrough split; architecture_lint clean (66 path
refs, 62 goal refs). goals_lint clean (80 active / 90 archived).
Deliberately untouched and still open: G-151's make.tcl interim-report
retirement (its bootsupport gate is satisfied by this promotion, but the
make.tcl edit is separate work), G-169's app-ownership extension to
shell/punk/shellspy, and G-170's punkboot moduledoc authoring-hint note.
Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
57d3dec3b2 |
G-149 follow-on landed: make.tcl adopts @cmd -formhint - actionable per-action help hints with honest continuation ellipsis (punkshell 0.55.1)
The multi-form definitions (tool, buildsuite) each declare
'@cmd -formhint " make.tcl help <sub> %formname% …"', so
'make.tcl help tool' / 'help buildsuite' - and every dispatch usage
error for those subcommands - label each form's synopsis line with the
concrete dry-run-help invocation (' make.tcl help tool build ...'
rendered with U+2026) instead of the repl-oriented ' i -form N ...'
default, which is unreachable for (script) ids. Renders via the
promoted bootsupport punk::args 0.17.0; under older snapshots (e.g
generated projects) the key is ignored and the default labels render.
Design decisions (user direction 2026-08-05, recorded in the follow-on
disposition): the trailing ellipsis is required for honesty - help
DRY-RUNS the form's own command line after the action (G-143), so a
hint without it misrepresents the invocation as complete. The template
was kept over empty-string suppression because the labels also render
on dispatch usage errors ('make.tcl tool frobnicate'), where the user
never typed help and the hint is the discovery route to per-action
help; suppression would lose that teaching path.
maketclhelp.test: tool formhints pin flipped to the new labels with an
olddefaulthint-absent guard; buildsuite multiform test gains the same
pair; header + provenance comments updated. The ellipsis is matched as
its utf-8 byte triple (format %c%c%c 0xe2 0x80 0xa6) because
maketcl_run reads the child pipe -translation binary, so multibyte
chars arrive byte-wise - a real U+2026 char in the pattern can never
match (first-cut pin failed green-render for exactly this). 12/12
green on tclsh90; maketcltool.test 4/4.
Sync outputs batched per policy (make.tcl modules + bootsupport): the
basic + project-0.1 layout make.tcl copies, the modpod source-tree
copy, and the bootsupport templates-0.2.0.tm repack all carry the
identical +2-line change. The archived G-149 follow-on disposition
flipped => landed 2026-08-05 (the sanctioned same-work-unit edit);
goals_lint clean. punkshell 0.55.1 + CHANGELOG (make.tcl help output
is product surface - patch). Kits pick this up at the next
vfscommonupdate + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
7cdf5b2323 |
G-149 achieved: punk::args configurable multi-form synopsis hint labels (punk::args 0.17.0)
The per-form hint labels rendered beside a multi-form definition's synopsis lines in the usage/arg_error table (hard-coded ' i -form N ...' previously) are now a template substituted per form: %formindex% is replaced with the form's 0-based ordinal, %formname% with its name, and an empty template suppresses the labels entirely (the cell keeps just the Synopsis: label, as single-form renders always have). Both acceptance arms landed. Definition side: new '@cmd -formhint <template>' key - rides the existing arbitrary-key cmd_info merge (no resolver change), round-trips through resolved_def, not display -deferred; documented in the define -help directive-options. Caller side: new -formhint option on arg_error (manual parser + PUNKARGS block) pulled into usage via its existing resolved_def opts pull; supplied-empty (suppress) is distinct from not-supplied (the option declares no -default, so an unsupplied usage call passes nothing through). Precedence: caller > definition > built-in default, whose template substitutes to the exact prior bytes. Motivation (G-143 origin): script-level (script) ids - make.tcl's - are unreachable from any repl, so the repl-oriented 'i' hint was not actionable there. Scope decisions pinned: single-form renders never carry hint labels; the -return string renderer has no hint column and is unchanged. Byte-identity for unconfigured definitions proven by pre/post capture diff of 'punk::args::usage ::punk::args::parse' (identical bytes, through the usage pass-through path). Tests: new formhint.test (9 tests - default labels, directive/caller/suppression matrix, parse -error path, single-form + string-renderer scope); full punk/args subtree 302/0-fail on BOTH tclsh90 9.0.3 and the punk86 kit (8.6); punk/ns subtree 115/115 (cmdhelp consumer). make.tcl help untouched until promotion (maketclhelp.test still pins the bootsupport hint). Goals: G-149 activated at user direction then flipped achieved 2026-08-05 + archived (index record newest-first, detail file to goals/archive with Progress evidence and 1 follow-on: make.tcl adoption after a bootsupport promotion => open). Activation-freshness survey recorded the G-167 relationship (same renderer surface - composition note both sides); reference sweep updated G-151/G-167 mentions; goals_lint clean, no orphaned xref pairs. punkshell 0.55.0 + CHANGELOG. Bootsupport/vfscommon snapshots unchanged until promotion + bake. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
69927531a4 |
G-073 achieved: punk::args unavailable choices (-choiceunavailable) + G-166 drafted (punk::args 0.16.0, tclcore moduledoc 0.4.0, punk::ns 0.9.3)
New per-argument key -choiceunavailable <list>: names recognised but not
available in the current runtime/context. Entries display among the
choices under a dedicated "Unavailable (recognised, not selectable
here)" group (one rendering-side injection - both renderers,
choicelabels notes, choiceinfo markers, trie prefix marking and
value-in-effect exclusion all inherited) and join the prefix pools;
synopsis literals and goodchoice marking never include them. Resolve
-time validation: no collision with choices/alias names/reservelist,
-default may not be unavailable, requires -choices/-choicegroups.
choiceword_match gains an optional 8th argument and an 'unavailable'
result key (matched stays 0 - matched-only consumers unaffected):
exact, nocase and unique-prefix landings carry the name as canonical; a
prefix shared with an available choice stays plain-ambiguous.
Validation rejects a landing with the tailored PUNKARGS VALIDATION
{choiceunavailable <name> choices <list>} error (-badarg/-badval;
private::unavailable_choice_msg names the supplied word, the resolved
entry, its choicelabel note and the available values; shared by final
validation and both G-082 overflow raise sites via rejection kind
'unavailable' from the allocation screen). Ambiguity messages annotate
unavailable longer matches '(recognised but unavailable)';
-choicerestricted 0 keeps full passthrough.
tclcore 'string is' adoption: curated forward list {dict} ('unicode'
deliberately excluded) diffed against the define-time harvest; labels
and per-class virtual ids extend to unavailable classes. On Tcl 8.6:
dict displays with its "(class not present in Tcl 8.6)" note,
'string is dict' rejects informatively, 'string is di' is ambiguous
(deliberately stricter than real 8.6 - recorded as a user-sanctioned
parity exemption; full words parity-true), and 'i string is dict'
documents via the virtual id. punk::ns cmd_traverse passes the key at
both resolver sites (doc-walk parity; the choice-traverse comment now
documents the choice-resolution vs doc-addressing axes split). tclcore
moduledoc requires punk::args 0.16.0-.
Tests: new choiceunavailable.test (10 tests); usagemarking.test gains
the goodchoice-exclusion pin; tclcoreparity.test gains forward-class
adoption invariants and the sanctioned 'di' strictness exemption, with
the version_notes pin deliberately flipped (dict's label now renders on
every runtime). Green: the three suites 37/37 on native Tcl 8.6.10
(luck runtime), 8.7a6 and 9.0.3; punk/args subtree 293/290/3 skips/0
fail on 9.0.3 AND 8.7; modules/punk sweep green except the three
documented pre-existing box-baseline failures (grepstr x2, nslist x1);
ns cmdhelp/corp 58/58 after the comment clarification.
Goals: G-073 flipped achieved 2026-08-05 + archived (index record
moved, detail file to goals/archive with Progress/verification and 3
follow-ons). G-166 drafted [proposed] at user direction (approved
wording): cmdinfo availability key + cmdhelp marking + tclcore leading
note + prefix-landing decision; the enacted G-073 follow-on flipped
=> goal G-166, the G-055 pattern follow-on => goal G-055 with a Notes
pointer added there. goals_lint clean. punkshell 0.54.0 + CHANGELOG.
Bootsupport/vfscommon snapshots unchanged until promotion + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
d2094364a3 |
G-082 follow-on landed: required typed value/leader misreport -> pointed typemismatch (punk::args 0.15.2)
A REQUIRED typed value or leader whose present word fails the basic-type allocation screen (int/double/bool/number/dict) now reports the pointed typemismatch naming the word and argument (-badarg/-badval, same shape as the G-082 overflow-site selection) instead of the generic missingrequiredvalue/missingrequiredleader shortfall. The in-loop required-arg raise sites consult the rejection record returned by get_dict_can_assign_value; the leaders-loop edit mirrors the values loop per the MAINTENANCE contract. Unchanged by design: end-of-input shortages (valuemissing/count classes), literal-typed members, multi-member clause partials (no rejection record - conservatism preserved), and required-arg choice words (never screened - G-071 asymmetry, choiceviolation already pointed). parse_status: the shape now classifies invalid/typemismatch (the formstatus viability verdict was already invalid; one probe re-parse saved); argdoc status-key note updated. Pins deliberately flipped: parsestatus.test (renamed parsestatus_typed_value_screen_typemismatch), formviability.test (single-form top-status/formstatus split demo re-anchored on a required-option shape), punk/ns cmdhelp.test message match. New errorselection.test coverage: required value + leader typemismatch pins plus unchanged-shape guards. Verified tcl 9.0.3: punk/args subtree 280 total / 277 passed / 3 intended skips / 0 failed; punk/ns only the pre-existing nslist(1) box-baseline failure (stash-verified unrelated). tcl 8.7: touched args suites 38/38, cmdhelp 45/45. Follow-on disposition flipped => landed in goals/archive/G-082-punkargs-error-selection.md (goals_lint clean; ledger 23 open / 20 goal / 15 landed / 2 declined). punkshell 0.53.1 + CHANGELOG entry. Bootsupport/vfscommon args copies stay 0.15.1 until the next promotion + bake. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
ac19df2a24 |
Launcher/make.tcl single help mechanism (user direction; core 0.5.0, 0.53.0)
All -help/--help flag interception withdrawn from the kit launcher and
make.tcl: the leading 'help' word is the ONE help entry (the punkshell
'i <cmd> ...' idiom). It felt like too many ways to do the same thing
and was already colliding - the experimental shellspy processor's own
-help/--help handling was shadowed by the dispatch intercept; it is
reachable again.
Launcher (boot core 0.4.0 -> 0.5.0, moduledoc::punkexe 0.6.0,
moduledoc::punkboot 0.3.0):
- 'help <subcommand> ?arg ...?' accepts and IGNORES trailing words, so
'help' can be prepended to an existing command line ('punk9_beta help
tclsh somefile somearg' now shows the tclsh usage instead of
confusingly falling back to the top-level table).
- Subject validation parses ONLY the subject word against a new
required-subject clone (script)::punkexe.launcherhelpsubject
(resolved_def -antiglobs {arg} -override subject -optional 0): the
display-shape clone let punk::args SKIP a mistyped optional subject
into the unconstrained arg row, silently rendering the top table
where a tabled choice error is wanted (exit 1).
- A leading '-help' falls under the unknown-first-argument refusal
(stderr usage answers it, exit 1); '<subcommand> -help' is the
subcommand's own argument: tclsh regains exception-free stock dash
parity, buildinfo refuses it like any argument (exit 2), a
parse-declared registration rejects it like any undeclared flag.
make.tcl: the wants_help subargs scan ('<subcommand> ... -help') and
the top-level/degraded-scan help-flag branches are removed, along with
the help_flags variable - 'make.tcl bakelist -help' now fails the
kitname choice gate exactly like 'make.tcl bakelist nonexistant', and
'make.tcl -help' the subcommand choice gate (exit 1), the usage error
itself carrying the documentation. 'make.tcl help <sub> <cmdline>'
dry-run behaviour unchanged.
Tests re-pinned to the revised contract (launcherhelp.test with a
kit_nodashhelp probe gate + trailing-args coverage, maketclhelp.test,
maketclcolour.test); punkexe subtree 152/148/4skip/0fail against
freshly baked zipfs + metakit kits; core copies byte-identical across
master/_vfscommon/layout/modpod-template channels.
Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
caf7572c30 |
G-165 achieved 2026-08-04: driver-invariant kit assembly (single zip writer path, punkzip acceleration, file-relative opt-in) (punkshell 0.52.0)
- make.tcl: tcl::zipfs::mkimg retired from zip-kit assembly - every bake assembles via assemble_zipcat_image (punk::zip::mkzip + runtime prefix concatenated outside the writer), so kits are ARCHIVE-relative on every driving tcl (legacy file-relative mkimg in 8.7/9.0.0, fixed in 9.0.1+, or none). bake/bakehouse -force added (bypass the no-change skip). punkkit-stamp.toml written with pinned LF translation (was driver-dependent crlf/lf). G-134 pin warns only on UNDECLARED file-relative output and exempts kits declaring offsetstyle = "file". - punk::zip 0.4.0: write-path acceleration seam in mkzip (mirrors the G-126 read-path pattern) - punkzip build -b/-x when bin/punkzip resolves, pure-Tcl floor unchanged, produced archive verified against the walk result with silent fallback; -offsettype file and -runtime/-zipkit prefixes always floor. - punkzip 2.4.0 re-vendored (upstream 2599127): build -b root-strip and repeatable -x exclusion (mkzip semantics; zig build test green). - mapvfs.toml: offsetstyle key (zip-type kits, "file" only) documented and validated; [kit.punkfiledemo] declared opt-in specimen. - Tests: zipwriteaccel.test (accelerated-vs-floor parity incl. the _vfscommon.vfs payload); offsetstyle.test baseline exempts declared kits; maketclhelp bakehouse synopsis pin updated for -force. - Docs: src/AGENTS.md, bin/AGENTS.md, src/runtime/AGENTS.md single-writer contract; make.tcl workflow text. - Acceptance (reference machine): four driver classes (8.7a6, 9.0.3, native 8.6, msys2 8.6) all probe archive with identical member sets and CRCs; no-punkzip bake equivalent; opt-in kit probes file; suites green both runner modes. punkzip 2.4.0 published to the punkbin tools tier (punkbin a22e16b). punkproject 0.52.0. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
5ac0d4c0f0 |
punk::tcltestrun 0.4.2: closing-banner prefix match exact compare (G-161 follow-on landed) (0.51.2)
The closing-banner prefix check 'string match "$line_inner*"' treated the raw test name as a glob pattern, so a test NAME containing glob metacharacters (* ? [ ] backslash) never matched its own opening text: the closing banner failed to close the failure section and every later event including the summary line was swallowed (the G-161 wedge class; latent, unexercised in the corpus). The check is now an exact byte prefix compare (string equal -length) - identical semantics for ordinary names, and an empty line_inner keeps the historic match-everything behaviour. New parsetestrun-globname-7.0/7.1 pins: 8/8 green tclsh90 single+multi-process and tclsh86, parser dir 10/10. Landed directly at user direction from the archived G-161 Follow-ons - disposition flipped to landed in the same change-set (the sanctioned archived-file edit). runner/AGENTS.md parser coverage bullet updated. CHANGELOG + punkproject 0.51.2. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
1605b97b37 |
G-164 achieved 2026-08-04: punk::args 0.15.1 viability probe alternative-allocation re-probe (punkshell 0.51.1)
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
0db6b9e8ba |
punkshell 0.51.0: G-150 form narrowing + @values -flagvalues batch
- 'i <command> ?word ...?' form narrowing for flat multi-form commands (G-150): punk::auto_exec::hash's declaration is selection-sound, so 'i hash -r' renders only the rehash form's usage and 'i hash -d <name>' only the delete form, driven by the declaration through cmdhelp's G-041 advisory-parse candidacy; no-word, ambiguous and no-match lines keep the whole-command render - punk::args 0.15.0 @values -flagvalues (G-150 follow-on): opt-in dash-led-words-as-values seating; consumed by hash's tightened help form - known issue recorded in the entry: the test form's '(not viable)' for 'i hash -t' is a false negative (valmin reservation steals the flag word into the required value slot) - GAP-pinned, owned by G-164 - modules: auto_exec 0.1.1, ns 0.9.2 (documentation-only), args 0.15.0; pins: cmdhelp.test 45/45, flagvalues.test 9/9 Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
8ed9cc33fe |
commandstack 0.7.1: reload contract state guards (G-160 follow-on landed) (0.50.1)
- known_renamers and debug are now info-exists guarded like the rest of the module state (all_stacks, renamer_command_tokens, token_implementations) - a module re-source refreshes proc definitions only, no longer resetting them while stacks/tokens survive - previously the reset stranded live stacks: the removal forms gate on known_renamers membership, so surviving records' renamers became unknown and removal errored - contract documented in commandstack::help; pinned by commandstack_reload_preserves_state - suite 41/41 on tclsh90 (9.0.3) + punk86 (8.6); packagepreference consumer suites 6/6 on both; minted modules/commandstack-0.7.1.tm (bootsupport/vfscommon promotion left to the next cycle, as with 0.6.0/0.7.0) Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
5a24503544 |
punkexe -e one-liner support (G-077): app-punkscript 1.1 + boot core 0.4.0 top-level carve-out + moduledoc 0.5.0 (0.50.0)
- app-punkscript 1.0 -> 1.1: 'script -e <script> ?args...?' - ::argv0 '-e', trailing args in ::argv, errorInfo to stderr + exit 1 on error, usage error + exit 1 when no script follows (never interactive fall-through, never stock's argv-swallow + stdin-read misparse); stdin never read by the form itself; a non-empty final result is echoed (stdin-form one-shot ergonomics, so return-valued one-liners like 'dev projects.work *x*' emit) - boot core 0.3.0 -> 0.4.0: a top-level first argument of exactly '-e' reclassifies to 'script -e' ahead of the G-032 unknown-first-arg refusal on script-default kits (tool-style kits keep '-e' routed to their processor; '<punkexe> tclsh -e ...' keeps deliberate stock parity per G-118); the unknown-first refusal hint and the degraded plain help now name the -e forms - moduledoc punkexe 0.4.0 -> 0.5.0: (script)::punkexe::script declares the oneliner @form (both forms explicitly named - punk::args renames _default to the FIRST named @form args-included); top-level prose documents the reclassification; tclsh boundary text points at the live forms - tests: scriptexec.test gains 10 -e pins (both surfaces, argv0/argv, piped stdin read+unread, no-arg usage error on both surfaces, errorInfo+exit 1, result echo, tclsh -e stock-parity boundary); launcherhelp.test pins the refusal hint's -e pointer; 49/49 green on the rebaked punk902z/punksys/punk86 (stamps boot_core=0.4.0); the named acceptance invocations and the full matrix also run by hand on the baked kits - DOX: -e bullets in src/vfs, src/lib, src/tests/shell and bin AGENTS.md; root AGENTS.md tclsh -e pitfall parenthetical now records the live punk-kit forms + the ad-hoc 'src script -e' option; README script-subcommand bullet; ARCHITECTURE.md entry-point/script/tclsh sections (G-077 leaves the in-flux list) - CHANGELOG + punkproject 0.50.0 Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
31c0cd0477 |
commandstack 0.7.0: remove_rename convenience forms (G-160 follow-on landed) (0.49.8)
- pop_rename renamer ?command? - pop the renamer's topmost stack entry and return the removed record (searched across live stacks when no command given; entries on multiple commands are an ambiguity error) - remove_renamer renamer - remove ALL of a renamer's entries across every live stack (the unload-my-package form); returns removed records keyed by command - restore_original command - unwind the whole stack to the original implementation regardless of renamer; registers stack-evidenced renamers into known_renamers so it is not gated by state loss (module re-source) - all three route through remove_rename's re-linking/token-map machinery; Rename_stack-parked stacks are invisible to the renamer-wide forms - suite 40/40 on tclsh90 (9.0.3) + punk86 (8.6); packagepreference consumer suites 6/6 on both; minted modules/commandstack-0.7.0.tm (bootsupport/vfscommon promotion left to the next cycle, as with 0.6.0) Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown |
6 days ago |
|
|
977eade569 |
punk::tcltestrun 0.4.1: normalize errorInfo/errorCode capture (G-161 follow-on landed) (0.49.7)
The '---- errorInfo: ' / '---- errorCode: ' prefixes are 16 characters; parse_testrun captured from index 15, so every captured value led with the prefix's trailing space. Capture now starts at index 16 - report-shape normalization only (continuation errorInfo lines were always raw and are unchanged). parsetestrun-multiline-error-3.0 pins the normalized shape (errorcode exact, errorinfo anchored) instead of trimming/tolerating; 6/6 green tclsh90 + native tclsh 8.6. Landed directly at user direction from the archived G-161 Follow-ons - disposition flipped to landed in the same change-set (the sanctioned archived-file edit). CHANGELOG + punkproject 0.49.7. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
e6ed4bb5b4 |
G-161 e2e + runner floor + docs: multi-line-description failures verified through runtests.tcl both modes (0.49.6)
- runner/testsuites/parser/multilinebanner.test + fixtures/ multilinedesc.testfixture: the deliberately failing fixture (multi-line description; non-.test extension so default *.test discovery never sees it) is run through real child runtests.tcl invocations in BOTH modes and the json report asserted as exact-text probes: failure entry FAILED with result_was/result_expected populated, trusted summary (summaryline_detected 1, totals 2/1/0/1). 2/2 green on tclsh90 and native tclsh 8.6; runner subtree 30/30 under -jobs 4. - runtests.tcl: punk::tcltestrun require floored at 0.4.0- (tolerant parser + result_expected capture; kit-fossil rejection floor). - parsetestrun.test: explicit punk::args + punk::lib requires - the lean -jobs child exposed tcltestrun's load-time punk::args dependency (about section calls punk::args::lib::tstr/resolved_def at source time; every other context preloads punk::args). Declared at test level per the established lean-children convention. - src/tests/AGENTS.md: single-line-description rule relaxed to STYLE guidance (multi-line tolerated since punk::tcltestrun 0.4.0, boundary documented); floors bullet gains punk::tcltestrun 0.4.0-; runner index line mentions output parsing. - runner/AGENTS.md: parser characterization pair documented (fixture extension convention, two-children cost note). - modules/AGENTS.md commandstack bullet + commandstack.test NOTE comment: hard contract wording updated to style guidance (G-161). - CHANGELOG.md + punkproject.toml: 0.49.6. Full-suite parity before/after the parser change verified in BOTH modes with scriptlib/developer/runtests_parity.tcl (new parser dir excluded from the after-runs to keep the file set identical): PARITY ok, 126 files, 1422/1400/20/2 both sides. Inclusive full run: 1430 total, same two pre-existing failing files (core exec.test, punkboot offsetstyle.test), 0 warnings. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
c2629f2631 |
punk::console 0.8.1: fix get_size 'columns {}' regression on unix (tput multi-capname variance)
get_size_using_tput invoked tput once with two capnames ('tput lines cols').
Multi-capname support varies by tput implementation: ncurses >= 6.1 and the
BSD tputs emit one value per capname, but older ncurses treats the second
capname as an (ignored) parameter of the first and emits only the first
value - lassign then set cols to "" and the mechanism returned
'columns {} rows <n>' without erroring. Because size_via_query_mechanisms
caches mechanisms fastest-first after a first-call timing probe, and a tput
fork outpaces the ANSI cursor round-trips on unix, the malformed tput result
won every call after the first (first call returns the probe pass's
cursorrestore result - hence 'worked first time' on WSL, then
'columns {} rows 66' and dependent failures e.g punk::ansi::example).
- get_size_using_tput: autodetect multi-capname support by result shape on
first use, cached per tput path (capable tputs stay single-fork;
single-cap-only tputs settle into two forks); results validated as
positive integers, else the mechanism errors and drops out.
- new get_size_using_sttysize mechanism: 'stty size' on the input tty -
single fork, fixed '<rows> <cols>' output shape (GNU/busybox/BSD),
slotted ahead of tput in the probe order; errors cleanly on non-tty input.
- size_via_query_mechanisms hardened with size_result_valid: mechanism
results must be well-formed {columns <int> rows <int>} dicts in the probe
pass, vt52 branch and cached loop - covers this regression class and the
ANSI mechanisms' {columns {} rows {}} timeout results (previously a
no-responder tty's first get_size returned that malformed dict).
- get_size_using_chanconfigure: note that tcl 9.0.2 unix tty channels expose
no -winsize (windows console channels do) and stacked/reflected stdout
masks the underlying tty's options.
Verified on WSL pty (266x66): sttysize/tput (multi-cap and forced two-fork
paths) all return columns 266 rows 66; get_size x3 consistent (pre-fix same
harness: first call malformed, user-reported columns {} thereafter). Windows
piped smoke: sttysize errors cleanly, tput fallback accepted, get_size
consistent 80x24 defaults, no errors. make.tcl modules mint OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
6 days ago |
|
|
3cd6808c73 |
shellfilter 0.2.5: fix transchan clear/flush defects corrupting unix repl output
tee_to_pipe declared the transchan 'clear' op; the Tcl core delivers 'clear' before every write when declared (the G-145 defect class - see goals/archive/G-145-piped-usage-ansi-remnants.md) and the handler discarded o_encbuf, the held partial multi-byte character. The following chunk then began with orphan continuation bytes and could never decode (the tail-backoff only trims the end), so whole chunks accumulated in o_encbuf and successive clears discarded them - eating contiguous multi-KB ranges of multibyte-dense output on the unix repl console stack: 'i <cmd>' help tables displayed with missing paragraphs, fused mid-word seam lines, or truncated bottom rows (WSL and native linux ttys; windows unaffected). Isolation repro: 393/600 lines lost with clear-per-write vs 0/600 without. - tee_to_pipe: 'clear' no longer declared in initialize, so the core never delivers it (same shape as the G-145 fix in ::punkboot::ansistrip); the method is kept as a state-preserving no-op with a warning comment. - flush repaired in tee_to_pipe, tee_to_log and logonly: all three referenced an undeclared o_buffered variable (copy-paste from the o_buffered-bearing ansiwrap/ansistrip classes) and threw on every invocation. Each now holds an undecodable partial char in o_encbuf for the next write and emits any decodable remainder per its class semantics. - Verified: transform isolation harnesses clean at all chunk sizes with clear-per-write; WSL end-to-end (linux kit visitor mode on a script(1) pty) shows all previously-missing define/list table content present; 'make.tcl modules' mint OK. - shellfilter-buildversion 0.2.4 -> 0.2.5; punkproject 0.49.3 -> 0.49.4 with CHANGELOG entry; G-090 Context records the finding as audit evidence (no characterization tests exist yet for these transforms - G-090 scope). Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
40283ca082 |
G-160: closeout evidence + DOX + punkshell 0.49.3
Detail-file Progress section records the settled decisions (tokenid mechanism + seeding removal, token-map O(1) dispatch with source-level verification note and parked-dispatch side effect, Delete_stack error semantics, Rename_stack 1/0 returns, channel-discipline scope incl the gated remove_rename anomaly warning, known_renamers reconciliation rationale, did_rename shape, commandstack::next design, the pins-updated-minimally interpretation) and the verification evidence (33/33 + 6/6 on tclsh90/punk86, live punk91 src smoke, mint). src/tests/modules/AGENTS.md: commandstack entry rewritten for the 0.6.0 fixed-behaviour contract (GAP language retired); packagepreference entry gains installguard.test. punkshell 0.49.3 + CHANGELOG (commandstack 0.6.0, packagepreference 0.2.1). Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
7 days ago |
|
|
145e785c42 |
commandstack 0.5.0: help overview + PUNKARGS docs; first characterisation suite
Module (src/modules/commandstack-999999.0a1.0.tm, 0.4.1 -> 0.5.0):
- commandstack::help now returns a real dependency-free API overview (was
an empty string): rename/remove workflow, COMMANDSTACKNEXT delegation
contract, inspection commands, in-tree users.
- PUNKARGS documentation blocks added for every API proc (help, debug,
get_stack, get_next_command, basecall, rename_command, remove_rename,
show_stack, Delete_stack, Rename_stack, util::get_IMPLEMENTOR,
lib::splitx, lib::split_body), registered lazily via
::punk::args::register::NAMESPACES - no punk::args dependency added.
Tests (new src/tests/modules/commandstack/testsuites/commandstack/commandstack.test,
29 tests, green on tclsh90 9.0.3 + punk86 8.6):
- usage-driven characterisation of the behaviours in-tree consumers rely on
(punk::packagepreference, packagetrace, packagesuppress, punk auto_execok,
punk::nav::fs cd): record shape/key-order contract, implementation {} as
the no-rename signal, COMMANDSTACKNEXT/COMMANDSTACKNEXT_ORIGINAL
delegation, multi-renamer stacking with removal in any order, builtin
renames, remove_rename argument forms, show_stack fallback render,
get_IMPLEMENTOR/split_body/splitx, help, lazy punk::args registration.
- known defects pinned as _GAP_ tests: per-renamer tokenid stuck at 1
(apply-local counter var) so same-renamer re-renames stack duplicate
tokens whose dispatch bypasses intermediate layers, and a third rename
collides on the parked-implementation name; get_IMPLEMENTOR builtin
branch unreachable (unqualified info commands pattern inside
commandstack::util); Delete_stack under a live rename self-delegates to
recursion; stray bare puts stderr writes literal stderr to stdout.
- behavioural tests run in fresh child interps (module sourced by path,
::puts shim captures module warnings for assertion).
Docs:
- src/tests/AGENTS.md: new contract - test descriptions must be single
content line (multi-line descriptions make tcltest failure banners
multi-line; punk::tcltestrun parser then swallows all later events
including the summary line - discovered authoring this suite).
- src/tests/modules/AGENTS.md: commandstack child index entry.
- punkproject.toml 0.49.2 + CHANGELOG entry.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
7 days ago |
|
|
1c7f10c1b5 |
punk::libunknown 0.2.4 + punkshell 0.49.1: deep tm discovery skips _mint/_bake workdirs
register_all_tm (deep .tm discovery at every namespace depth, used by
'dev lib.search') knew only the pre-G-155 _build workdir name: the
filesystem directory walk skipped _build dirs and the tm-file filter
dropped */_build/* paths, but the renamed staging area <srcdir>/_mint
(and the src/_bake kit workdir) were scanned - loose staged .tm files
were registered as junk modules (measured against src/modules: 9 junk
registrations - _mint::gridplus, punk::mix::_mint::templates,
test::punk::_mint::* etc).
Both sites now skip _build, _mint and _bake (the tm-file filter also
guards the zipfs whole-tree listing branch); register_all_tm help text
updated. Manual-version bump mechanics applied per src/modules/AGENTS.md
(file rename, Meta line, manpage_begin, provide block, version-history
entry).
punkshell 0.49.1 (punkproject.toml + CHANGELOG.md - libunknown ships in
kits; the tcltestrun 0.3.1 test-tooling fix from
|
7 days ago |
|
|
ed17fb6c34 |
punk::path 0.5.0 + punkshell 0.49.0: subfolders1 removed, ***-tail excludes prune, glob-doc consistency, coverage 40->67; PUNKARGS -& layout
punk::path 0.5.0:
- subfolders1 REMOVED - no call sites repo-wide; subfolders is the reviewed implementation
- subfolders ***-tail -exclude-paths patterns now classify as pruning subtree rules: X/*** is handled as the equivalent pair {X/** X} - identical results (the *** descend test alone omits and prunes the boundary), walk no longer descends excluded subtrees (~250x measured on a 1110-dir excluded subtree); bare *** exclude short-circuits like bare **
- strip_prefixdepth fixed: called the nonexistent 'norm' since its 2024-08-12 copy from punk::repo::path_strip_prefixdepth (kettle::path::strip lineage) - now uses the textual punk::path::normjoin; depth-only no-content-compare contract kept; prefix-exhausts-path boundary still errors (zero-arg file join), characterised not changed
- missing punk::winpath dependency declared (normjoin calls is_dos_device_path on every input - errored in a minimal interp that required only punk::path)
- PUNKARGS consistency pass: *|**|***|? path glob syntax centralised in argdoc::PATHGLOB_SEGMENT_SYNTAX (tstr placeholder fragment) shared across pathglob_as_re/globmatchpath/subfolders/treefilenames help; new argdocs for pathglob_as_re, normjoin and strip_prefixdepth; globmatchpath summary corrected (*** added) and doctools [fun] markup removed from punk::args help; treefilenames no longer claims unsorted results (-sort and zipfs dispatch documented), -exclude-paths/-exclude-files/-include-paths typed -type list, tail globs documented as ordinary Tcl globs
- path.test 40->67: coverage for previously-untested in-use functions (relative, normjoin, pathtype, scriptlib_resolve, treefilenames_zipfs with zipfs mkzip/mount fixture) plus globmatchpath ?/-nocase variants, treefilenames -exclude-files and -sort order pins, subfolders ***-tail/pair-equivalence/guard/classifier pins, strip_prefixdepth characterisation
Docs/conventions:
- src/modules/AGENTS.md: PUNKARGS Procedure Documentation Template converted to the -& record-continuation layout; -& stated as preferred for new work (existing blocks may keep backslash continuations)
- punk::path argdoc blocks converted to the aligned -& layout
- src/modules/punk/AGENTS.md: shared glob-syntax fragment mechanism (flush-left authoring rule, resolved_def consumer caveat) + subfolders1 removal recorded
punkshell 0.49.0 (punkproject.toml + CHANGELOG.md entry).
Verified: path.test 67/67 under tclsh90; all 10 documented punk::path ids render clean on punk91 (tcl9) and punk86 (8.6); punk::LOC resolved_def consumer of treefilenames -exclude-paths intact.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
7 days ago |
|
|
a5f60ce4b1 |
G-032 ACHIEVED 2026-08-03: launcher help + parsed subcommands (core 0.3.0, 0.48.0)
The kit launch surface dogfoods punk::args. Boot core 0.2.1 -> 0.3.0: new built-in 'help' subcommand + '-help' / '<subcommand> -help' render tabled usage from the moduledoc::punkexe ids plus live registrations (per-kit resolved_def clones (script)::punkexe.launcher/.launcherhelp); unknown first arg naming no existing file (and no lib:* reference) is refused with usage (stderr exit 1) instead of a silent script attempt; buildinfo enforces its no-arguments contract through punk::args (pinned one-liner + tabled usage, exit 2 unchanged). Registration extension ::punkboot::project_subcommand_info (summary/argsid/package/parse - documented by moduledoc::punkboot 0.2.0): project subcommands appear in help by registration alone and may opt arguments into declared parsing. Carve-outs: tool-style kits keep help flags routed to their processor (tomlish parity); tclsh intercepts a help flag only as sole argument (stock dash parity); argsid-less registrations keep -help passthrough. G-030 degradation doctrine: lazy guarded requires (normal boots never load punk::args), PUNKBOOT_PLAIN=1 hook, plain-list fallback, rendering degrades independently of parsing. 8.6 trap fixed en route: punk::args choices-grid render needs punk::lib's lpop shim - guarded require added (verified tabled help on metakit punk86). moduledoc::punkexe 0.4.0: (script)::punkexe::help definition; top-level refusal rule + help discovery; per-subcommand -help notes; buildinfo rejection shape; passthrough-vs-parsed decision recorded. Verified on zipfs (punk902z, punk91) and metakit (punk86) kits; launcherhelp.test 22/22 (incl fake-thin-main registration harness + metakit leg); punkexe subtree 140/136/4skip/0fail; full suite failures (4) are pre-existing in untouched subsystems. Goal flipped achieved + archive record + live-tier sweep (G-038 rewrite, pointers to G-077 and G-089); detail-file move to goals/archive follows as a pure rename. Layout _config trio + _vfscommon core seed hand-swept (byte-identical to masters). GOALS.md staged as the G-032-removal hunk only - the uncommitted G-159 draft entry is left to its author. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
bba10012a0 |
G-111: modpod 0.1.6 tidy + first test baseline (0.47.2)
Tar-era connection API removed from modpod (connect/disconnect/get, system::connect_if_not/myname/myfullname - broken since the tarjar era, no callers anywhere); is_valid_tm_version fixed (versionparts substitution error); make_mountable_zip debug output removed (the undeclared ansistring dependency made -offsettype file error under the module's declared deps; stray ::last_header global gone); struct::set dependency dropped; module greps tarjar-free. The load stub gains the unwrapped #modpod-<pkg>-<ver> redirect: an extracted folder beside the .tm is sourced directly - loads with neither zipfs nor vfs::zip available. Re-vendored 0.1.6 through the established channels (modpod checkout mint -> vendormodules -> bootsupport -> modules staging -> vfscommon). First modpod testsuite at src/tests/modules/modpod/testsuites/modpod/roundtrip.test: wrap/load round-trips - real-disk + zipfs module paths, both -offsettype forms, unwrapped redirect, probe-discovered binary payload (no committed binaries). Green: punk91 tcl9.1 kit 7/7, native tclsh90 7/7, punk86 8.6.17 6/7 (zipfs-container test skips on 8.6 - recorded per G-034). G-111 activated at user request (activation overlap survey recorded); per-defect dispositions, run evidence and tarjar-artifact assessment proposals in goals/G-111-modpod-tidy-tests.md - artifact dispositions await user confirmation. GOALS.md G-111 Scope version reference repaired to glob form per goals-system v3 drift rule. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
3cf37a1674 |
G-031 boot core 0.2.1: graceful missing-app-package subcommand arms (0.47.1)
shellspy/punk/script/shell report the missing package by subcommand name and exit 1 instead of a raw package-require trace - found adopting the shared core in the tomlish kits (app-tomlish only; proven there first, master replay identical by diff). Layout _config/_vfscommon copies refreshed. tomlish adoption itself is committed in its own fossil (bbc68a3f) - the G-031 derived-project proof. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
169f064621 |
G-025 landed + G-031 moduledoc: buildinfo self-report (stamp/live/source/runtime-record) + runtime-queryable boot-core API doc (0.47.0)
New punk::buildinfo 0.1.0 = the single implementation (dependency-free; works in kit shells, the script env, repl code interp and tclsh-hosted shells): punkkit-stamp.toml kit stamp + live facts + governing punkproject.toml version (live_vs_stamp=same|differs) + inherited G-117 punkbin-artifact.toml record, emitted as key=value lines; absence explicit (stamp_present=0), never fabricated. make.tcl bake writes the stamp at the payload root after the G-125 gate - deterministic (NO time-of-bake field, per the G-117 embedded-record precedent; identical inputs stamp byte-identically). Boot core 0.2.0: buildinfo builtin (exit 2 on args, exit 1 unavailable, else prints report + exit 0) and publishes ::punkboot::boot_state (core_version, main_script, package_modes, proj_scope, proj_root, kit_payload_base, src_project_root) - the single boot running-state surface G-089 anticipated. Wiring: aliascore 0.2.0 buildinfo alias, repl 0.5.4 preloads punk::buildinfo (bootsupport include_modules.config gains punk::buildinfo - a repl 0.5.4 snapshot without it broke tclsh-hosted shells, caught and fixed), moduledoc::punkexe 0.3.0 documents the subcommand. New punk::args::moduledoc::punkboot 0.1.0 (G-031): thin-main contract + registration model + live defs for the persistent ::punkboot procs - all six ids resolve in-kit via punk::args::get_ids after update_definitions. Verified: module fixtures 8/8 (report.test); punkexe suite 118 total 114 pass 0 fail incl new buildinfo.test (stdout-only + exit 0, stamp fields, RENAMED-COPY reports its stamp, args rejected exit 2); punk902z + punk9_beta bakes stamped (punk9_beta cites runtime build_id 635e7951... + r2 artifact name from the inherited record); tclsh-hosted 'make.tcl shell' reports stamp_present=0 with real host exe + live project version; double-bake stamp sha1-identical. Layout _config/_vfscommon core copies refreshed 0.2.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
c1b7359c28 |
G-031 increment 3: project_main.tcl thin sample + layout _config sweep + boot-entry guidance (0.46.0)
project_main.tcl reborn as the heavily commented thin-main sample (1132-line 2025-vintage monolith retired): ==CUSTOMIZE== blocks for project_subcommands and launch_defaults with worked tool-style examples, fauxlink/rename guidance, boot-core do-not-fork note, opt-out story incl the collision rule. Layout project-0.1 _config hand-swept (outside sync channels per the 0.43.0 lesson): thin punk_main.tcl + sample + punkboot_core.tcl master, punkboot/core.tcl seeded in the layout _vfscommon.vfs; templates modpod mirror synced by the modules step. Boot-entry guidance sections added to src/vfs/README.md (repo and layout voices) covering the recommended _config-behind-the-fauxlink path, plain root main.tcl alternative, one-startup-script rule, _config inertness; src/vfs/AGENTS.md refreshed (ownership split, collision gate, G-129 derivation now consolidated in the core). E2E on a freshly generated punk.project project (punk902z src script recipe, FOSSIL_HOME diverted, shallow c:/T dir): generation completes incl fossil initial commit; the project boots through its own _config trio via the sibling master (core 0.1.0); a 'demo' subcommand added by editing ONLY the generated thin main at its customization points dispatches in all three launch forms (explicit args, bare via noargs, unknown-first via unknownfirst). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
adeb3e9f29 |
G-031 increment 2: componentized kit boot - thin main + shared boot core (0.45.0)
punk_main.tcl is now the thin project-owned main: publishes launch_args + main_script, declares (empty) project_subcommands and launch_defaults at ==CUSTOMIZE== points, locates the boot core and sources it. Core candidates: <vfsroot>/punkboot/core.tcl (in-kit via the _vfscommon merge), parent-dir punkboot/core.tcl (nested app/main.tcl, undroidwish G-129), sibling punkboot_core.tcl master (source-tree execution - the kitmountpoint characterization shape). punkboot_core.tcl carries the boot machinery extracted verbatim from the monolith; delta beyond extraction: contract preamble with serviceable defaults, normscript from ::punkboot::main_script instead of [info script], registration-model subcommand selection (project additions merge in, built-ins cannot be shadowed, declared noargs/unknownfirst defaults) with a dispatching default arm, ::punkboot::core_version 0.1.0. make.tcl vfscommonupdate now regenerates _vfscommon.vfs/punkboot/core.tcl from the _config master. Parity evidence: full punkexe suite 110 pass / 0 fail against freshly baked punk902z; kitmountpoint 4/4 across 8.6-backport / 32-bit-modern / 64-bit runtimes incl the unattributed-mount stderr pin; registration model exercised end-to-end via a scratch kit; 11-kit default bake with only known-baseline warnings; punk86 (metakit/starkit, tcl 8.6.17) smoke green. cookfs branch carried verbatim - no cookfs kit is currently mapped in mapvfs.toml to exercise it (stale bin/punk9cook.exe is an old vintage, untouched). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
1d08333721 |
G-031 increment 1: startup-script collision gate - bake refuses two root-level main.tcl suppliers (0.44.0)
A source .vfs carrying an actual root main.tcl AND a root fauxlink resolving to main.tcl (or several such fauxlinks) baked whichever boot script merge traversal met last - merge_over's fauxlink branch overwrites without warning. New punkboot::utils::vfs_startup_script_report (0.7.0) censuses root startup-script suppliers by RESOLVED fauxlink name (empty-nominalname links included; nested app/main.tcl exempt per G-129). make.tcl consumes it with the same guarded-require degradation as the G-125/G-133/G-134 checks and refuses affected kits per-kit under FAILED KITS before any build product is written - kits from other folders proceed, deployed binaries untouched. Fixture characterization: startupscript.test (12 tests incl. a real-source-tree sweep proving today's folders are collision-free); bootlibrary.test re-run green. Outputs (mint 0.7.0 + bootsupport/vfscommon promotion) follow in a separate commit. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
731532fdb5 |
package_mode 'dev' -> 'minted' (clean break, no alias) - punkshell 0.43.0
Stage-true mode set: src / minted / internal / os. Both _config mains (all_package_modes, mode gates, proj: rebind, comments; unix /dev path and 'dev modules' magic-version prose untouched), punkexe moduledoc 0.2.0, bin/ARCHITECTURE/vfs AGENTS docs, make.tcl K7 + guidance. Layout _config copies hand-swept incl the previously-missed G-155 _bake comment fixes (_config is outside the thin-layout sync channel - G-027/G-156 note). Also fixed a stray _build residue in src/AGENTS.md bakelist prose. Versioning: minor by deliberate alpha exception despite changed launch invocation (user-directed). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
9d1ece3dca |
G-155 achieved flip (edits): status + final evidence, index entry -> GOALS-archive record, G-156/G-131 reference sweep, punkproject.toml 0.42.0 + CHANGELOG, bake-product test-pin fixes, layout make.tcl sync riders
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
0817343f84 |
Goals: G-146 activated + achieved 2026-08-02 (user-directed) -> archive; punkshell 0.41.4
Single-session lifecycle: user-directed activation (activation-freshness xref survey recorded in the detail file), implementation, acceptance verification. Acceptance met: punk.project + punk.basic (plus minimal/sample-0.1) trailing fossil initial commits complete cleanly with FOSSIL_HOME diverted; generated projects carry versioned binary-glob; seeding path decided (hand-authored per-layout payload, derivation rejected as semantic coupling) and documented; G-136 relationship recorded. Companion crlf-glob finding and decisions in the detail file. Index entry archived to GOALS-archive.md; the detail file's goals/ -> goals/archive/ move follows as a pure rename. punkproject.toml + CHANGELOG 0.41.4 (patch: generated-project fix). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |