Tree:
2dbf635b99
master
v0.1a
${ noResults }
616 Commits (2dbf635b99a23f8fb151e06bdb68a471a1f781e6)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
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 |
5 days ago |
|
|
c1c27ea37c |
G-170 achieved: launcher help depth - form narrowing, parse-true dry-run, actionable form hints (core 0.7.0, punkexe moduledoc 0.9.0, app-punkscript 1.3)
User-directed activation and implementation in one arc ("Activate G-170 and
continue"; proposed -> active at the user's word with the activation-freshness
survey recorded - new Related lines both directions for G-167 and G-044 -
-> achieved + archived on acceptance). Completes the launcher family:
G-151 parse_report + G-168 selection-sound definitions + G-169 app-owned
docs + this goal's consumption of all three.
punkboot core 0.7.0 (both layout copies synced byte-identical: project-0.1 +
modpod-template): launcher_show_help gains a tailwords parameter and returns
the suggested exit code (0 for every render, 1 only for a rejected dry-run);
the dispatch help arm passes the words after the subject and exits with the
return. Three tail behaviours by subject:
- Narrowing (any multi-form definition, display-only, any vintage): a SINGLE
word exactly matching a form name, or a decimal ordinal below the form
count, renders 'punk::args::usage -form <sel> <id>' - the G-150 shape
(all-form synopsis retained, the selected form's argument table only).
Collision rule decided and documented: in this position the form word WINS
over argument interpretation (exact names + decimal ordinals only, no
prefix resolution - the tighter rule minimises the shadow over the
subject's own first-argument space); a file literally named like a form
stays dry-runnable via a path spelling (./oneliner - the same reachability
dodge G-168 recorded for a file named '-e').
- Dry-run (parse-true subjects): any other tail parses through the subject's
definition exactly as make.tcl help does (G-143 shape). Accepted lines
render the matched form's usage plus the punk::args::parse_report landing
report (G-151 consumed directly; guarded - an older punk::args without
parse_report renders the usage alone). Rejected lines emit the parse
diagnosis on stderr, exit 1. The complete '-encoding <name> <scriptfile>'
tclsh line raises the sanctioned two-form multipleformmatches diagnosis
(the recorded G-168 LIMIT - the honest answer for that line). Parse-true =
buildinfo + project parse=1 registrations (parity with dispatch BY
CONSTRUCTION - dispatch parses the same id, any vintage) plus script/tclsh
(declared passthrough surfaces whose G-168 definitions MODEL dispatch/app
reality - their dry-run additionally requires the fence witness: at least
one -regexprefail row in the definition actually served, so a pre-G-168
unfenced moduledoc snapshot - the real mixed promotion state - keeps the
historic ignored-tail render instead of misdiagnosing lines whose forms
double-match; probed live against the baked 0.6.1 stack). 'help' itself is
deliberately NOT parse-true (its tail handling IS this dispatch).
- Passthrough (shell/punk/shellspy, registrations without parse=1) and all
degraded contexts (PUNKBOOT_PLAIN, missing stack, render failure): the
historic accepted-and-ignored render, exit 0.
Formhint un-suppression at BOTH homes (the G-169-decided split): the interim
'@cmd -formhint ""' flips to the actionable template
' <punkexe> help <sub> %formname%' in the app-owned script definition
(src/lib/app-punkscript/punkscript.tcl, app-punkscript/app-punkscript-docs
1.3) and the moduledoc tclsh definition (punkexe moduledoc 0.9.0) - the
labels render beside each form's synopsis line and name real navigation,
resolving the 0.6.1 circularity objection. Deliberately NO trailing ellipsis,
diverging from make.tcl's hint shape: the display-hint honesty rule marks
accepted continuations of the SAME operation, and appending words to the
launcher's form word flips into the dry-run interpretation (a different
operation) - the exact hinted line is the complete narrowing command.
(script)::punkexe::help's @cmd/arg text documents the depth semantics (the
'accepted and ignored (reserved)' arg row cashed in as designed).
Engine fact recorded: punk::args::usage takes its options BEFORE the
positional id ('usage -form X $id'; the reversed order raises a values-count
error) - caught by probe; layout copies synced before the fix were re-synced
and cmp-verified after the last core edit.
Tests: launcherhelp.test 38/38 on BOTH tclsh90 and tclsh87 - 25 existing
pins unchanged (the two direct-kit trailing-word pins re-described as
VINTAGE-PROOF: their assertions hold under both the historic ignored-tail
core and the depth core, whatever the kit's bake vintage) + 13 new G-170
pins: narrowing by form name and ordinal, formhint labels, dry-run accept
(matched form + Argument|Source|Value report), reject, the -encoding LIMIT,
the ./oneliner collision dodge, passthrough ignored, buildinfo reject,
project parse=1 accept/reject parity (same words as the dispatch-half pins
launcherhelp_registration_parse_pass/_reject), the mixed-vintage fence
witness, and the PUNKBOOT_PLAIN degraded twin. args subtree 337 passed /
3 pre-existing skips / 0 failed on both runtimes; punkexe subtree at the
recorded baseline on both (152/4/10 - the 10 failures are the pre-existing
maketclbakelist(2)/maketcllibfetch(8) set, G-139 pending user decision;
maketclhelp 12/12 and scriptexec 27/27 green). A 12-probe live matrix
(args level via bin/punk91 src + fake-main harness via bin/punk902z tclsh,
src and no-src modes) recorded in the goal file. Minted punkexe-0.9.0.tm
via make.tcl modules (mint tree, not committed by design). Kits/bootsupport/
vfscommon remain stale until the user-owned promotion + bake.
Goals: G-170 entry moved to GOALS-archive.md, detail file to goals/archive/
with mechanism, decisions and verification evidence; two open Follow-ons
(the coherent-set promotion - the same vfscommonupdate/bake event as
G-169's line, now also carrying core 0.7.0 + punkexe 0.9.0 + app 1.3; a
punkboot-moduledoc authoring hint that project definitions may carry their
own formhint templates). Reference sweep: G-044 and G-167 back-pointers
updated to achieved; G-044 gains the xref-flagged G-167 mirror line.
src/vfs AGENTS.md launcher-help bullet and src/lib AGENTS.md app-punkscript
bullet extended. goals_lint clean (80 active / 90 archived);
goals_followons 74 structured lines, both new G-170 lines registered.
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
6 days ago |
|
|
97e4aacd4f |
G-169 achieved: app-owned launch-subcommand documentation consumed by the launcher (app-punkscript 1.2, core 0.6.0, punkexe moduledoc 0.8.0)
User-directed activation and implementation in one arc (proposed -> active at the user's word with the activation-freshness survey recorded, -> achieved + archived on acceptance). Co-location kills the doc-drift class: the actual '-e' parsing and its punk::args documentation now live in the same file. app-punkscript 1.2 + new package app-punkscript-docs 1.2 (same file): src/lib/app-punkscript/punkscript.tcl carries the (script)::punkexe::script definition (the G-168 selection-sound shape moved VERBATIM - value strings byte-identical, renders match the pre-handover moduledoc) in ::app::punkscript::argdoc with an idempotent docs section - a plain namespace-variable set plus a membership-guarded lappend to ::punk::args::register::NAMESPACES; no package requires, no punk::args dependency, no definition evaluation (lazy on the first query naming the id - the docpackages mechanism pinned ahead in docpackages.test). pkgIndex.tcl provides app-punkscript-docs from the SAME file via an execution gate (::app::punkscript::docs_only set around the source; the file returns after the docs section when the gate is up, and 'package provide app-punkscript' sits below the gate) - requiring the docs NEVER runs a script, and a later app require re-sources with the gate down so the app runs normally (probed: docs-then-app in one process, file/'-e' one-liner/'-e'-alone usage error all behave identically through the new file). punkboot core 0.6.0: new launcher_builtin_docpackages map (script -> app-punkscript-docs); launcher_show_help's built-in arm does a guarded lazy 'package require' of the mapped docs package before the usage query - help-path only, never on boot/dispatch (ready-probe and dispatch untouched). The G-031 registration-model header comment now names the durable doc id and records the app-owned 'package'-key option. Copies synced byte-identical: project-0.1 layout + modpod-template layout. punkexe moduledoc 0.8.0 (single-definer handover): (script)::punkexe::script is no longer defined here - a pointer comment stands in its place and the Overview records the ownership rule (docs live with the owning code: app-owned for app-handled subcommands, this moduledoc for core-owned surfaces like tclsh/buildinfo/help and the top-level dispatch). Single definer verified: loading both sources raises no duplicate-definition (undefine) notices - the handover withdraws the moduledoc entry in the same change-set per the docpackages last-loaded-wins pre-test pin. Durable-doc decision (the acceptance's 'location decided in the work'): the registration definition id (script)::punkboot::registration IS the durable doc for the *_main.tcl declaration keys (summary/argsid/package/parse incl the parse=1 gate, all already documented there); punkboot moduledoc 0.3.1 extends its 'package' key text with the app-owned docs-package pattern (gate shape pointed at src/lib/app-punkscript/pkgIndex.tcl). Kit authors reach it from the core header contract, the punkexe moduledoc Overview and the project_main.tcl worked examples. Help-path load cost measured and recorded (goal file): the app-ownership marginal cost is the guarded docs require - 3.5 ms (inert). The ~396 ms first-render total is the one-time punk::ansi/textblock render-stack load + definition evaluation, incurred identically wherever the definition lives; boot/dispatch cost is zero. Tests: launcherhelp.test 25/25 - 24 existing pins unchanged plus new launcherhelp_appowned_script_docs: the fake-main harness (G-031 shape, no bake) run through the baked kit's tclsh subcommand in SRC package mode, where the source tree serves the nested boot with version precedence - the src moduledoc defines no script id, so the successful tabular render carrying the G-168-era scriptfile help text (line-break-safe markers; the oneliner form's rows are not in the default form-0 table) proves the app-owned lazy resolution; stderr asserted free of 'clearing existing data' notices. Harness lesson recorded: manual tm/auto_path prepends in a fake main are WIPED by the nested boot's path configuration - the src package mode is the correct lever. Full modules/punk/args subtree 337 passed / 3 pre-existing skips / 0 failed on BOTH tclsh90 and tclsh87 - the G-168 punkexemodel.test/formcheck.test pins now load the script id via app-punkscript-docs (src/lib derived from the test file location) and guard the handover shape at its new home. The 10 failures in maketclbakelist.test / maketcllibfetch.test are PRE-EXISTING (reproduced identically at HEAD with this change-set stashed; the G-139 libfetch-test reading is a recorded pending user decision). Degraded/plain path intact (PUNKBOOT_PLAIN pin unchanged; mixed promotion states degrade gracefully by construction). Minted punkexe-0.8.0.tm + punkboot-0.3.1.tm via make.tcl modules. Goals: G-169 entry moved to GOALS-archive.md, detail file to goals/archive/ with mechanism, decisions, measured costs and verification evidence; two open Follow-ons (the coherent-set vfscommonupdate/bake promotion carrying lib/app-punkscript 1.2 + core 0.6.0 + punkexe 0.8.0 together; extending app ownership to shell/punk/shellspy). Reference sweep: G-170's Related line updated (the defs' home now decided - its formhint un-suppression edits both homes). src/lib AGENTS.md app-punkscript bullet + src/tests/modules AGENTS.md punk/args bullet extended. goals_lint clean (81 active / 89 archived). Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
2339e4065e |
G-168 achieved: selection-sound launch definitions - script/tclsh forms match dispatch reality (punkexe moduledoc 0.7.0)
User-directed activation and implementation in one arc (proposed -> active at
the user's word with the activation-freshness survey recorded, -> achieved +
archived on acceptance). The declarations follow the 2026-08-05 pre-test
findings exactly - no engine change was needed.
(script)::punkexe::script: the file form fences scriptfile with
-regexprefail {^-e$} and a -regexprefailmsg naming the ./-e reachability
(word-1 '-e' is the ONLY fenced word - every other dash-led word remains a
file path, matching app-punkscript's word-1 test); the oneliner form declares
the '-e' word as a real element - a required -type none flag (the
auto_exec::hash -r/-d shape) ahead of the existing required script value, so
a bare {-e} reports noformmatch with the oneliner form verdicting
viable-incomplete via the G-164 re-probe (the app's "-e requires a script
argument" reality) and the file form invalid.
(script)::punkexe::tclsh: scriptfile gains -regexprefail {^-} (stock
tclMain.c: a dash-led word in script-file position means NO script) and the
stdin form's first word is a declared fenced element 'firstarg'
(-regexprefail {^[^-]} - a non-dash first word IS a script file; not an
option, stays in ::argv). Selection now matches stock classification on
every line except the recorded LIMIT: the complete
'-encoding <name> <scriptfile>' shape word-shape-matches both forms (a
dash-led encoding NAME included - the engine consumes dash-led option
values, matching stock's unconstrained argv[2]) and stock's arity-priority
rule is not expressible per-word - the pair is declared
@form -overlapallowed {scriptfile} on the stdin form (formcheck sanction)
while parse raises multipleformmatches naming both forms per the G-041
no-silent-preference contract. Dispatch never parses these ids, so the
ambiguity surfaces only in declaration-driven consumers (help dry-runs,
completion), where the two-form diagnosis is the honest answer.
Decisions recorded in the archived detail file: dispatch parse-gating NOT
adopted (punkboot_core.tcl untouched; script/tclsh stay declared passthrough
surfaces - boot-path parse cost, stock-parity conflict with the LIMIT, app
error surfaces already honest and pinned, and the declaration-driven
consumers get parse-trueness without gating; no latency delta applicable);
the <punkexe> @form -synopsis overrides KEPT (neither the raw (script) id
nor @cmd -name is an invocable name; the stdin override keeps the
user-facing '?arg ...?' line over the model's firstarg/arg split) - the
G-144 archived follow-on flipped to declined accordingly (make.tcl's own
override retirement had already landed in the 0.41.0 arc). A real-vs-model
probe matrix (G-055 method; bin/punk91 dispatch + app-punkscript real side)
is recorded in the detail file - model matches real classification on every
line except the two complete-'-encoding' rows (the sanctioned LIMIT).
Tests: new args/punkexemodel.test (6 - script/tclsh selection matrices
against the real ids with the real-side oracle referenced, the bare-'-e'
viable-incomplete verdict, the ./-e fence message, -encoding fall-through
statuses (scriptfile invalid vs incomplete, stdin selected), the LIMIT pins
naming {scriptfile stdin} for both complete shapes); formcheck.test punkexe
GAPs flipped deliberately per the acceptance:
formcheck_punkexe_script_forms_discriminated (zero findings),
formcheck_punkexe_tclsh_forms_sanctioned (unsanctioned empty + the stdin
form's -overlapallowed pinned via get_spec; the positional-chain witness
derivation misses option-dependent overlaps - formcheck's documented miss
direction - so the sanction also future-proofs improved derivation),
formcheck_punkexe_primary_inputs_selection_sound (dispatch-true forms for
every primary line; empty input still selects file/stdin uniquely). Full
modules/punk/args subtree 337 passed / 3 pre-existing skips / 0 failed on
BOTH native tclsh90 (9.0.3) and tclsh87;
src/tests/shell/testsuites/punkexe/launcherhelp.test 24/24 unchanged per
acceptance (its 'help script'/'help tclsh' pins glob only @cmd -name
strings - row additions verified safe post-bake as well). Minted
modules/punk/args/moduledoc/punkexe-0.7.0.tm via make.tcl modules;
kits/bootsupport carry 0.6.1 until the next promotion/bake cycle.
Goals: G-168 entry moved to GOALS-archive.md, detail file to goals/archive/
with the probe matrix, both decisions and verification evidence; one open
Follow-on (arity-priority expressibility would flip the LIMIT pins; the
broader selection-soundness sweep stays recorded in G-150's archive).
Activation survey Related: line added (G-169 back-pointer). Reference sweep:
G-169 coordination note updated (G-168 landed first - the re-homed
definitions carry this fencing shape), G-170 dependency marked satisfied
(its dry-run arm inherits the recorded LIMIT). src/tests/modules AGENTS.md
punk/args bullet extended. goals_lint clean (82 active / 88 archived).
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
6 days ago |
|
|
b0c92567a3 |
G-151 achieved: punk::args::parse_report landing report + ansistring TRUNCATE (args 0.18.0, ansi 0.2.0)
User-directed activation and implementation in one arc (proposed -> active at
the user's word with the activation-freshness overlap survey recorded, ->
achieved + archived on acceptance).
punk::args 0.18.0 - new parse_report: the annotated SUCCESS render (the
arg_error usage table's success-side sibling). One row per value-holding
argument (received, or -default in effect) in declaration-section order
(leaders, opts, values), columns Argument | Source | Value; Source carries
received / received xN / default (the plain-mode twin of the colour marking:
CLR(check)/CLR(parsekey_hint)); absent optionals get no row. Entry forms per
acceptance: a punk::args::parse result dict, or '<arglist> withid <id>' (the
parse is performed first - a rejected line raises the same validation error
parse would; errorcode parity pinned). Returns: table (bordered textblock
block, default), tableobject, string (plain lines; also the degraded
no-textblock path), dict (machine form - never elided). The canonical
demonstration pinned: {build punk95 -confirm 0} lands
'args (received x2) = -confirm 0' - a flag-like word consumed as a VALUE
visibly attributed to its consuming argument (the make.tcl dry-run
'kitname = punk91 -confirm 0' class from the G-143 sessions).
Display elision is type-aware, deterministic, always marked: strings
single-line-ized (ansistring VIEW -lf 1 -vt 1 -sp 0 - controls and embedded
ANSI render visibly so a value cannot disturb the table, real spaces stay
real) then grapheme-capped with '...' + ' (len N)'; -multiple/-type list
values element-capped '(+N more)'; -type dict values pair-capped
'(+N pairs)'. Width cascade per the G-149 plumbing precedent: caller
-valuewidth > new @cmd directive key -reportvaluewidth (documented in
define -help) > built-in 48; 0 = no cap; never console-derived (the G-007
emit-then-query lesson). Row data rides the G-049
private::parse_status_build structure - no second status assembler;
display-level bridging recovers the value-in-effect across the parse
result's storage-key folds (-parsekey renames, aliased optionsets'
last-|-member finalopts fold) so received aliased args keep their row -
engine-level rationalization recorded as a G-084 follow-on disposition.
The registered two-form definition (parsed/withid) follows parse_status's
structure - per-form @leaders first, then the shared @opts via a re-widened
@form selection (the resolver rejects leaders declared after a form's
options).
punk::ansi 0.2.0 - new ansistring TRUNCATE ?-ellipsis marker? string
maxgraphemes (design lean 4: the ANSI/grapheme-safe truncate primitive
homes in ansistring beside RANGE/VIEW): fits => byte-identical passthrough
(trailing and non-SGR codes included); truncation => RANGE-extracted prefix
(merged SGR re-application per the contract documented at 0.1.4) + marker
totalling exactly maxgraphemes, with an SGR reset appended before the
marker when the prefix carries codes; the marker is charged against the
budget and itself truncated when it alone meets/exceeds it; maxgraphemes 0
=> empty string. Grapheme-count based (column-aware variant a recorded
follow-on). Strict option handling (deliberately unlike VIEW's pinned
silent tolerance). Ensemble export + PUNKARGS argdoc + doctools comment.
Tests: new args/parsereport.test (13 - canonical attribution, entry
parity, dict shape/row order/row policy, solo+multi xN multiplicity,
per-type elision markers, dict-never-elided, width cascade,
single-line-ization, alias bridging, bordered/tableobject renders, failure
parity, bad calls, own-definition render); ansi/ansistring.test +2
TRUNCATE pins (budget/passthrough/errors; ANSI-reset + CJK +
combining-cluster safety). Full punk/args subtree 331 passed / 3
pre-existing skips / 0 failed and punk/ansi subtree 73/73 - each on native
tclsh90 (9.0.3) AND tclsh87; failure-side rendering unchanged per
acceptance. Minted modules/punk/args-0.18.0.tm + ansi-0.2.0.tm via
make.tcl modules; bootsupport/vfscommon promotion left to the next cycle -
make.tcl keeps its interim one-line report (and its 4-copy 'no annotated
success render yet' comment) until the promotion-gated follow-on lands.
Goals: G-151 entry moved to GOALS-archive.md, detail file to goals/archive/
with verification evidence and 5 Follow-on lines (make.tcl interim-report
retirement open; arg_error value-truncation via the same helpers open;
storage-key rationalization => goal G-084; column-aware TRUNCATE open;
word-oriented inverse view open). Activation-survey Related: lines recorded
(G-166, G-084, G-167 back-pointer); reference sweep updated G-170
(sequencing lean honoured - its dry-run arm consumes this render), G-167
archive marker, G-084 back-pointer note. src/tests/modules AGENTS.md
punk/args + punk/ansi bullets extended. goals_lint clean (83 active / 87
archived).
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
6 days ago |
|
|
e25537bb50 |
punk::ansi 0.1.4: ansistring RANGE argdoc states the pinned contract
Documentation-only bump. The RANGE punk::args -help (and the doctools comment) now document the behaviours pinned by the 2026-08-05 ansistring coverage survey (ansi/ansistring.test), replacing the underspecified "including the ANSI codes in effect" wording: - SGR codes re-applied at each plain-text run in merged (canonicalized) form - style-equivalent but NOT byte-identical to the original. - SGR-only carriage: other sequence types (cursor movement, OSC, charset shifts) are not re-emitted. - Codes after the last requested grapheme are not included; trailing SGR state is retrievable with ansistring INDEXCODE end+1. - Index semantics: end-relative expressions, one-sided clamping, empty-string returns for both-beyond-same-end and inverted ranges (tcl string range consistency). The @cmd -summary reworded from "ANSI codes preserved" (overclaimed) to "SGR styling re-applied". Open design questions stay deliberately undocumented as contract - trailing codes on literal end (the shared TODO with opunk::Str RANGE and its whole-span $this shortcut divergence), non-SGR retention, charset/gx0 handling - recorded in code comments and G-151 Notes. ansi subtree 71/71 green (tclsh90); usage render verified carrying the new content. Minted modules/punk/ansi-0.1.4.tm via make.tcl modules; bootsupport/vfscommon promotion left to the next promotion cycle. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
97fede0254 |
punkexe moduledoc 0.6.1: interim formhint suppression on the multi-form launcher definitions
(script)::punkexe::script and ::tclsh declare '@cmd -formhint ""'
(user direction 2026-08-05), suppressing the usage table's per-form
hint labels under punk::args 0.17.0+ (older snapshots ignore the key
and keep the ' i -form N ...' default - harmless). Rationale: the
repl-oriented default is not typeable at the CLI where these tables
render, and the (script) ids live in the boot interp - invisible to
the repl's 'i'. A make.tcl-style actionable replacement does not
exist: launcher help is deliberately subject-only (trailing words
ignored - the prepend-help idiom, G-032 single-mechanism revision),
so there is no per-form destination a hint could name, and a
' <punkexe> help <sub>' pointer would be circular on the help path
and redundant on the dispatch-error path (that table already shows
all forms). Auto-selection cannot substitute either: the oneliner
form's '-e' is dispatch-detected, not declared, and the file form's
optional string scriptfile legitimately accepts '-e' (a file so
named stays reachable as ./-e) - clean double-match, and expressing
"any string except -e" needs G-072-class negation.
Interim: if launcher help gains form-name narrowing ('help script
oneliner' via usage -form, the G-150 cmdhelp precedent - candidate
goal on request), the suppression becomes a real
' <punkexe> help <sub> %formname%' template. In-definition comments
+ the buildversion changelog record the decision. Verified on dev
modules: no hint labels, Synopsis section and all four @form
-synopsis lines intact for both ids. launcherhelp.test pins are
presence/exit-code only - unaffected pre- and post-rebake; no
kit-tier suppression pin added for an interim measure.
_vfscommon.vfs picks up punkexe-0.6.1.tm (mint + vfscommonupdate;
not in bootsupport's include list). Reaches kits at the user's
selective rebakes.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
6 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
|
6 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 |
6 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
|
6 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 |
6 days ago |
|
|
62c596cec7 |
Single-help-mechanism outputs: core 0.5.0 delivered (vfscommon), moduledoc 0.6.0/0.3.0, pending module promotions swept
make.tcl modules + vfscommonupdate + bake ripple (native Tcl903 driver) from the single-mechanism change-set ac19df2a: _vfscommon punkboot/core.tcl regenerated from the 0.5.0 master; moduledoc::punkexe 0.5.0 -> 0.6.0 and moduledoc::punkboot 0.2.0 -> 0.3.0 version renames; punk::mix templates modpod repacked carrying the layout _config sweep (modpod-template copies + layout make.tcl copies via the established sync channels). The same vfscommonupdate swept in promotions pending from committed src work of the last sessions: commandstack 0.7.1, punk::args 0.15.1, punk::auto_exec 0.1.1, punk::ns 0.9.2, punk::tcltestrun 0.4.2, punk::zip 0.4.0. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
7 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
|
7 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 |
7 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 |
7 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 |
7 days ago |
|
|
665785d239 |
G-150: auto_exec 0.1.1 selection-sound hash declaration + ns 0.9.2 cmdhelp narrowing docs + pins
- auto_exec 0.1.1: hash's show_or_set name value carries -regexprefail {^-} - a bare punk::args::parse of a flag-led line now selects its flag form uniquely instead of 'Ambiguous arguments ... show_or_set, <flag form>' (show_or_set swallowed flag-like words as plain names), so cmdhelp 'i hash -r' narrows to the rehash form with no handler involvement; runtime behaviour unchanged (the handler's first-word switch already rejected dash-led names; at the declaration level they now need an explicit flag form - accepted cost). Help form tightened (user direction): -anyopts dropped so --help must lead, and @values -flagvalues 1 (punk::args 0.15.0) makes trailing words of any shape consume as ignored values - a flag-led line no longer marks the help form viable via adhoc-option seating. Handler fix (user-landed): the multi-name -t missing-name branch printed "$hash: nm: not found" (undefined variable) - now "hash: $nm: not found"
- ns 0.9.2: documentation-only - cmdhelp's subcommand argdoc now states the multi-form narrowing contract explicitly (no code change; the G-041 advisory-parse candidacy already narrowed on a unique selection)
- cmdhelp.test: G-150 pins - flag-led narrowing on -r/-d, bare-parse selection incl -t/plain/empty lines, the dash-led-name noformmatch cost, no-word/unknown-flag/ambiguity whole-render fallbacks, runtime-unchanged hash behaviour, help-form narrowing and dashword swallow, and the no-false-viable-help pin; plus a GAP pin of the valmin-reservation false negative in the G-152 viability verdict (owned by G-164, proposed) - 45/45 green
- src/tests/modules/AGENTS.md: index clause for the new coverage
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
|
7 days ago |
|
|
7ad110dde6 |
punk::args 0.15.0: @values -flagvalues - unmatched dash-led words seat as trailing values (G-150 follow-on)
- a @values section may declare -flagvalues 1: an unmatched dash-led word in option position is consumed as a trailing value instead of raising invalidoption (declared options still match first; the '--' end-of-options marker is unaffected; off by default) - VAL_FLAGVALUES on the form dict (template default false; @values compiler key, boolean-validated at resolve time) short-circuits the unmatched-dash-word fallback in the parse engine - motivation: '--help'-style forms robustly swallowing ignored trailing words of any shape - previously such a word seated as a value only positionally (at end-of-input via the valmin reservation, or within a bounded valmax) and errored 'Unexpected option' otherwise ('{--help -t foo}' on the unconstrained shape) - in-tree consumer: punk::auto_exec::hash's help form (next commit); documented in the module header notes - tests: new flagvalues.test (9 tests - seating matrix, declared-option precedence, off-by-default contrast, optionmissing after value seating, key validation); args subtree 271/271 green Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
7 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 |
1 week 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 |
1 week ago |
|
|
8cc7d42634 |
punkexe moduledoc layout fixes and -& record continuations
|
1 week 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 |
1 week 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 |
1 week ago |
|
|
08804abfc4 |
punk::tcltestrun 0.4.0: G-161 multi-line failure-banner parsing + result_expected capture fix
parse_testrun previously required a failing test's opening banner '==== <name> <description> FAILED' to be one physical line: a description with embedded newlines spans lines (single tcltest puts, ends-only trim), the opener never matched, the closing banner was misread as an opener and the parser wedged in failure-capture state - every later event including the summary line was swallowed and the file degraded to warn/missing-cleanupTests with no failure detail. Now (G-161, settled on start-event anchoring + bounded banner buffering): - '---- <name> start' lines (-verbose start - runtests.tcl always passes it) track the current test name. - A line '==== <name> ...' for the current test that does not end ' FAILED' opens a banner-continuation stage (exact prefix compare, no glob), buffered until the ' FAILED'-terminated line completes the banner; recognisable event lines (took/PASSED/SKIPPED/start/summary) or a 100-line bound abandon capture and reprocess the line normally, and a stray '==== Contents of test case:' completes the banner instead of wedging. - Streams without start events, and every single-line parse path (including the emulated-banner confounder heuristics), behave exactly as before - pinned by the new characterization suite. Also fixes result_expected capture (G-161 acceptance surface): the '---- Result should have been' opener always arrives while the result_was capture is active, and the active-capture reset branch fell through past the opener elseif - result_expected was absent from every FAILED report (verified in the current full-suite baselines) and the expected-value lines leaked into test_body. The active branch now transitions result_was -> result_expected directly. New synthetic characterization suite src/tests/runner/testsuites/parser/parsetestrun.test (6 tests: multi-line fidelity incl summary flow, single-line regression shape, multi-line ERROR capture, anchored false-open abandonment, historic confounder pin, no-start-events fallback pin) green on tclsh90 (9.0.3) and native tclsh 8.6. Streams mirror real tcltest emission (verified against a live tcltest 2.5 capture). E2E fixture suite + bootsupport promotion follow in this arc. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week 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
|
1 week 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 |
1 week ago |
|
|
d5c9959b4d |
G-160 follow-through: promote commandstack 0.6.0 + packagepreference 0.2.1 to bootsupport and _vfscommon
make.tcl bootsupport: commandstack-0.6.0.tm now pulled from minted root modules per the repointed manifest; superseded bootsupport copies removed - packagepreference-0.2.0 auto-pruned (punkcheck DELETE), commandstack-0.3/0.4 removed by hand (their punkcheck lineage names the departed src/vendormodules source, so the prune conservatively left them; the manifest is non-glob single-version intent). make.tcl modules sync: layout manifest copies (basic, project-0.1) and the templates-modpod copy pick up the repointed commandstack entry. make.tcl vfscommonupdate: _vfscommon.vfs modules commandstack 0.4.1 -> 0.6.0, punk/packagepreference 0.2.0 -> 0.2.1 (next bake carries the fixed pair into kits). Stale .punkcheck.lock from the completed run removed (dead pid 128656, not committed). Verified post-promotion: commandstack suite 33/33 on punk86, packagepreference 6/6 on tclsh90 (bootsupport snapshots on the runtests tm path). Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
23077dc15e |
G-160: commandstack 0.6.0 hygiene pass + packagepreference guard fix
commandstack 0.6.0:
- tokenid unique+monotonic per (renamer,command): counter increments the
real namespace variable (was an apply-local copy stuck at 1). Same-
renamer re-renames chain through the full stack, are removable by
exact token, and a third rename no longer collides on the parked name.
- get_next_command resolves via a maintained token->implementation dict
(O(1) dispatch, no lsearch stack scan; parked stacks keep dispatching).
- get_IMPLEMENTOR: ::tcl::info::cmdtype qualified in guard and call -
the builtin classification branch is reachable (undetermined on 8.6).
- debug validates its argument with a clean error naming on_off.
- Channel discipline: informational warnings debug-gated on stderr,
stray bare 'puts stderr' removed, errors stay errors.
- Records carry trailing did_rename 0|1 (leading token/renamer key order
contract unchanged); no-rename returns {implementation {} did_rename 0}.
- rename_command errors when -renamer appears in a non-leading position.
- get_stack raw-key-first (Rename_stack-parked stacks retrievable);
Rename_stack returns 1/0; Delete_stack errors while records are live.
- New delegation helper commandstack::next (PUNKARGS-documented, in help).
- known_renamers defaults reconciled to the vendored packages' actual
renamer strings (packagetrace packagesuppress).
punk::packagepreference 0.2.1: install re-install guard reads record key
'renamer' (was 'rename' - a second install threw instead of returning 0).
Tests: the five _GAP_ defect pins flipped to fixed-behaviour pins; new
pins for did_rename/key-order + token-map consistency, silent cycle with
debug off, -renamer misplacement, commandstack::next delegation incl
caller context, Rename_stack/get_stack parking, Delete_stack guard;
new packagepreference installguard.test (double-install returns 0,
uninstall/re-install cycle with fresh tokenid). commandstack suite 33/33,
packagepreference 6/6 - green on tclsh90 (9.0.3) and punk86 (8.6).
Live punk91 src smoke: packagepreference/auto_execok/cd renames working.
Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week 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
|
1 week 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
|
1 week ago |
|
|
1eae726035 |
punk::tcltestrun 0.3.1 + runtestmodules: _mint staging excluded from unbuilt-modpod scan
tm_path_additional_ifneeded (punk::tcltestrun) and its inline equivalent in
src/modules/test/runtestmodules.tcl called punk::path::subfolders with
-exclude {**/_build/** **/_build} - the G-155 _build -> _mint staging rename
never reached these call sites, so staged pods in <srcdir>/_mint were being
registered as bogus modules (e.g punk::mix::_mint::templates 0.2.0; measured
99 leaked _mint subfolder entries under src/modules across the two staging
trees src/modules/_mint + src/modules/punk/mix/_mint).
Both call sites now use the full option name and the pruning ***-tail form:
-exclude-paths {**/_build/*** **/_mint/***} (_build kept for legacy
checkouts). The ***-tail form prunes descent per punk::path 0.5.0, and
kit-baked punk::path 0.4.0 already accepts both the literal -exclude-paths
name and *** segments (G-093), so kit-child shadowing scenarios stay
compatible.
Verified: direct probe shows 0 _mint/_build subfolder entries and only
legitimate pods registered; runtests.tcl path.test 67/67 with no _mint
registrations in the harness startup.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
4d481e42a4 |
punk::path globmatchpath argdoc: indent -nocase help continuations +2 (doc block consistency)
Continuation lines of the -nocase option help now carry the standard 2-extra-space indent used by argument -help blocks (per the src/modules/AGENTS.md Procedure Documentation Template guide). Indentation-only; render verified on punk91. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week 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
|
1 week ago |
|
|
1a45efaa6a |
G-032 outputs: templates repack carries punkboot-core punk::lib guard (modpod sync + promotes, stale bootsupport catch-up)
Machine-generated propagation of the guarded punk::lib require that landed
in punkboot core with a5f60ce4: thin-layout sync copied the fix into the
punk::mix::templates modpod source (punkboot_core.tcl, punkboot/core.tcl),
and the templates-0.2.0.tm repack was promoted byte-identical to vfscommon
and bootsupport. The bootsupport copy was two repacks stale and also picks
up the G-032 thin-mains content (project_main.tcl, punk_main.tcl) already
delivered to vfscommon in
|
1 week ago |
|
|
fbd6cd6a93 |
kettle tilde fix: punk::mix::cli 0.6.1 + vendored kettle app.tcl local patch (tcl9)
Tcl 9 removed tilde expansion: kettle_call's lib-mode 'file mkdir ~/.kettle' created a literal ./~/.kettle dir in the cwd - littering every tcl9-driven 'dev project.new' target via the kettledoc step (found during the modpod checkout structure refresh). Home is now resolved explicitly ([file home] on 8.7+/9, native ~ expansion on 8.6); no resolvable home skips the optional dotfile config; the mkdir is catch-guarded. Same-shape local patch in src/vendorlib/kettle1/app.tcl (kettle's own dotfile read silently ignored ~/.kettle/config under tcl9), comment-marked for reapply-on-vendor-upgrade. Verified by scratch-cwd repro: kit cli 0.6.0 creates ./~ (TILDEDIR=1), working-tree 0.6.1 does not (TILDEDIR=0), real HOME/.kettle used. Propagated bootsupport + vfscommon (modules cli-0.6.1, lib kettle1). No bake in this commit - the tree carries unrelated in-flight work, so kits keep the litter behaviour until the next bake. Project-version bullet left to fold into the pending 0.48.0 CHANGELOG entry. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
155157e3db |
G-032 outputs: core 0.3.0 delivered (vfscommon), moduledoc 0.4.0/0.2.0 promoted, templates repack
make.tcl vfscommonupdate + modules ripple from the G-032 change-set (driven with native Tcl903 per the recorded mkimg trap - kits assembled archive-relative, no G-134 warnings): _vfscommon punkboot/core.tcl regenerated from the 0.3.0 master; moduledoc::punkexe 0.3.0 -> 0.4.0 and moduledoc::punkboot 0.1.0 -> 0.2.0 version renames; punk::mix templates modpod repacked carrying the layout _config sweep (synced copies under the #modpod-templates tree - punkcheck-managed, never hand-edited). Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week 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 |
|
|
a39c63d113 |
G-031 outputs: core 0.2.1 delivered (vfscommon), modpod mirror + templates repack promoted
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
6616287828 |
G-025/G-031 outputs: minted + promoted (bootsupport, vfscommon) buildinfo 0.1.0, aliascore 0.2.0, repl 0.5.4, moduledoc punkexe 0.3.0 + punkboot 0.1.0; core 0.2.0 delivered; layout syncs
make.tcl modules/bootsupport/vfscommonupdate regeneration: old aliascore 0.1.0 / repl 0.5.3 / punkexe-moduledoc 0.2.0 replaced; punk::buildinfo and punkboot moduledoc join both promotion targets (bootsupport also via the new include_modules.config entry); _vfscommon punkboot/core.tcl at 0.2.0; templates modpod repack + layout make.tcl / include_modules.config sync ripple (basic, project-0.1, modpod mirror). 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 |
|
|
4808842b56 |
G-031 outputs: boot core delivered to _vfscommon (punkboot/core.tcl); layout make.tcl sync + templates repack
make.tcl modules/vfscommonupdate/bootsupport regeneration for increment 2: _vfscommon.vfs/punkboot/core.tcl regenerated from the committed _config master (every kit's merge now carries the boot core); layout copies of src/make.tcl (basic, project-0.1, templates modpod source) pick up the vfscommonupdate boot-core delivery step via the modules-step sync, with the repacked punk::mix templates-0.2.0.tm promoted to _vfscommon and bootsupport. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
452a007663 |
G-031 outputs: punkboot::utils 0.7.0 minted + promoted (bootsupport, vfscommon); layout make.tcl gate sync
make.tcl modules/bootsupport/vfscommonupdate regeneration for increment 1: utils-0.7.0.tm replaces 0.6.2 in src/bootsupport/modules and src/vfs/_vfscommon.vfs/modules - the collision gate is now live for make.tcl's guarded require (probed: a bootsupport-only tm path serves 0.7.0 and a collision fixture reports ok=0 status=collision). Layout copies of src/make.tcl (basic, project-0.1, templates modpod source + repacked punk::mix templates-0.2.0.tm in bootsupport/vfscommon) carry the same gate hunks via the modules-step sync channel. 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 |
|
|
2aadd55a4f |
0.43.0 outputs: punkexe moduledoc 0.2.0 minted + promoted to vfscommon; templates modpod resync (layout _config minted copies)
Batched punkcheck-managed outputs per src/AGENTS.md carve-out. 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 |
|
|
fd4fa2bf80 |
G-155: output trees - bootsupport promotion (punk::mix base 0.2.0 / cli 0.6.0, punkboot::utils 0.6.2, punk::lib 0.6.0 rider) + thin-layout sync (make.tcl copies, gitignore.in with _mint/_bake globs) + templates modpod repack
Batched punkcheck-managed outputs per src/AGENTS.md carve-out. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
b0e5ef4745 |
G-155: punkboot::utils 0.6.2 - dirty-tree warning + argdoc say 'produced', not 'built'
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
c4908d9bd9 |
G-155 increment A: stage vocabulary landed - mint/promote/bake strict, BAKE-WARNING, _mint/_bake workdirs (payload-frozen)
make.tcl: TERMINOLOGY block in workflow_text + charter now "one mint stage, two promotion gates, one bake"; release-sequence rows mint/promote/bake; SUMMARIES/HELPTEXTS/plain-help mint phrasing; SUBGROUPS "mint & bake"; BUILD-WARNING -> BAKE-WARNING (emit+recap+prose, internals renamed); bakelist nobuild -> nobake + "bake product:"; workdir src/_build -> src/_bake with guarded get_bake_workdir call (inline fallback for stale punk::mix snapshots); producing-commands gate wording (also fixed stale project/vfs alias names in check output); internal vars bakefolder/baking_runtime/ kit_bakedir/bake_vfs etc. punk::mix::base 0.2.0: get_build_workdir -> get_bake_workdir (src/_bake) with legacy delegating alias; antipatterns + _mint/_bake; RETIRED the never-called vfs-cksums quartet (store_vfs_build_cksums called an undefined proc + unset var - dead code, zero callers repo-wide). punk::mix::cli 0.6.0: modpod/tarjar staging <srcdir>/_build -> <srcdir>/_mint (mintfolder), antidir/reserved lists + _mint/_bake, src/_bake running-check, mint-verb error text, dead 'build' assignment removed; build_modules_from_source_to_base name KEPT (punkcheck installer identity). punkboot::utils 0.6.1: argdoc names BAKE-WARNING. Ignore rules: **/_mint/ + **/_bake/ added in .gitignore and derived ignore-glob (**/_build/ retained for buildsuites + stale checkouts); extras|check-ignore verification empty. Docs swept (root+src AGENTS, ARCHITECTURE incl heading "Mint, bake, provenance and kits", READMEs, modules/vfs/runtime/bootsupport/buildsuites/ tools AGENTS, tests/modules AGENTS); archived goals + CHANGELOG untouched. Tests: BAKE-WARNING/nobake/src/_bake pins updated (offsetstyle, maketclpayloadcheck, maketclbakelist, kitlocations, platform, help, binaryarch, bootlibrary); punkcheck install.test fixtures untouched (they characterize punkcheck's own default excludes). Payload deliberately frozen this increment (no vfs/_config or vfscommon changes) so the byte-compare bake can prove the plumbing. architecture_lint clean; workflow renders in tabled + PUNKBOOT_PLAIN modes. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |