Tree:
2dbf635b99
master
v0.1a
${ noResults }
1486 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 |
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 |
|
|
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
|
4 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 |
4 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
|
4 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
|
4 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 |
4 days ago |
|
|
45d8de1f45 |
G-151 design leans recorded + ansistring pre-modification coverage survey
G-151 (annotated success render) Notes gain the six user-agreed design leans from the 2026-08-05 shape discussion: 1. compact landing table (Argument | Source | Value) - a separate small arg_error-styled bordered block stacked under the usage render, not annotation of the usage table; existing -parsedargs/goodchoice marking stays; no per-value subtables (the report itself is the bordered block; G-088 footer docking possible later); arg-oriented rows in declaration-section order. 2. deterministic width caps (value column ~48, total ~80), never console-queried; configurable via the G-149 caller-option/@cmd-key plumbing; machine returns untruncated. 3. type-aware always-marked elision: strings single-line-ized then char-capped with '...' + '(len N)'; lists/multis element-capped with '(+N more)'; dicts pair-capped; pre-elided at data-prep, not via table column -maxwidth. 4. the ANSI/grapheme-safe truncate primitive homes in punk::ansi::ansistring; punk::args layers element/pair-count elision on top. 5. serving arg_error's value-truncation todo with the same helper is a follow-on, not acceptance. 6. rows only for value-holding arguments (received or default-in-effect). Lean 4's precondition (user direction): survey ansistring test coverage against codebase usage before any modification. DONE - usage-weighted survey (VIEW ~250 sites incl 124 '-lf 1'; VIEWSTYLE/VIEWCODES/NEW ~40 interactive sites; RANGE 8) produced 8 new characterization pins in ansistring.test, green 71/71 on native tclsh90 (9.0.3) and tcl87: - VIEW -lf 0/1/2 single-line-ization modes, tab/cr defaults, no-arg empty return; always-on NUL substitution + silent unknown-option tolerance (load-bearing for overtype's '-nul 1' CRM sites) + unpaired-option error; 8-bit C1 CSI bracketed representation and ZWSP visible-tag visuals. - RANGE prefix/end-relative/clamping semantics, plus the truncate-relevant facts: merged code-stack re-emission (full-range extraction is ansistrip-identical but not byte-identical) and codes trailing the last grapheme DROPPED (matches the source TODO) - fetch trailing state via INDEXCODE end+1 when it matters. - COUNT (graphemes, combining accents cluster) vs length (stripped characters) divergence pinned on a decomposed-accent fixture. - KNOWN-DEFICIENCY pin: VIEWCODES/VIEWSTYLE raise invalid-command in a plain punk::ansi interp (class methods call the bare 'a+'/'a' interactive aliases) - pinned in a fresh child interp so the verdict is independent of runner mode; flip deliberately when the class renders alias-free. - NEW object basics: class identity, count/length/stripped/view parity with the ensemble surface, destroy. Survey outcome + implementation cautions recorded under lean 4 in the G-151 Notes; src/tests/modules AGENTS.md punk/ansi bullet extended. goals_lint clean (84 active, 86 archived). Environment note: agent-harness shells set NO_COLOR=1, which blanks the live highlight SGRs grepstr.test pins expect (the recorded tcl90-baseline grepstr(2)) - unset it for colour-dependent suite runs; the new pins are colour-state independent per suite convention. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
fa483ec2e3 |
AGENTS docs: international-English idiom rule; tabled -> tabular in live agent docs
Root AGENTS.md User Preferences gains the idiom discipline bullet (user, 2026-08-05): agent-authored prose avoids idioms whose meaning differs or reverses across English variants (to table, momentarily, presently, moot, punt, luck out, out of pocket, bi-weekly, fortnight, knock back, on the nose, quite <adj>); table-formatted punk::args output is written 'tabular usage'/'tabular help', never 'tabled'. Established technical slang (dogfooding, spike testing) stays fine. Applied to the seven live agent-doc instances: ARCHITECTURE.md, bin/AGENTS.md, src/AGENTS.md, src/bootsupport/AGENTS.md (x2), src/vfs/AGENTS.md (x2); architecture_lint clean. Deliberately unchanged: archived goal records (historical wording), goals/G-168 Acceptance (contract prose - separate approval), and code-tier comments/strings plus their synced copies (undecided). Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
127ad36877 |
punk::args pre-tests for the G-168/G-169/G-170 family + G-170<->G-151 cross-links
Engine-primitive pins landed green ahead of activating the launcher definition/documentation/help-depth goals (args subtree 321 tests: 318 pass, 3 known-bug skips, 0 fail on native tclsh90 9.0.3 and tcl87): - forms.test: candidacy fencing/fall-through group (G-168 pre-work) - regexprefail-fenced autoselection fixture pin (args-tier twin of the G-150 cmdhelp.test pins), a -regexprefail rejection on an OPTIONAL value slot is form-fatal with NO re-landing on later permissive slots (contrast optional-choice rejection), unknown-option / dangling-option / option-satisfied-but-values-unmet failures fall through to sibling forms as successful parses, option-VALUE fences participate in candidacy, and the documented per-word limit: a complete '-encoding <name> <file>' line double-matches a fenced scriptfile form vs a dash-tolerant stdin form (stock's scriptfile-wins-when-complete priority is not expressible per-word - multipleformmatches per the G-041 contract). - formviability.test: dangling-OPTIONAL-option verdict conservatism - the G-164 re-probe re-seats only words naming missing REQUIRED options, so the tclsh '-encoding' dangling class stays invalid although completable. - errorselection.test: a dangling optional value-taking option word seats as a trailing value and overflows a zero-value window as plain toomanyarguments (no -badarg attribution). - formcheck.test: GAP before-state pins of the punkexe launch definitions - unsanctioned structural overlaps for script file/oneliner and tclsh scriptfile/stdin, and every primary launch line double-matching; flipped deliberately when G-168 lands per its Acceptance. - docpackages.test (new): registered-namespace lazy definition loading characterization (G-169 pre-work) - inert registration with scan-vs-load split, id_exists never triggers loading, real_id/usage lazily resolve tag-prefixed script-level id families, duplicate definers resolve last-loaded-wins with only a stderr undefine notice (the engine's recorded detect-duplicates todo), degraded paths clean. Goal notes (non-contract): pre-test findings recorded in G-168 (including the '-e'-must-be-a-required-flag declaration constraint and the residual-overlap design limit) and G-169 (handover must withdraw the moduledoc entry in the same change-set - no duplicate warning surface exists); G-170<->G-151 Related: cross-links added both ways - the dry-run arm renders G-151's punk::args-level landing report, a link the path-based overlap surveys could not surface. src/tests/modules AGENTS.md punk/args bullet extended for the new coverage. goals_lint clean (84 active, 86 archived). Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
b0f206f53b |
G-168/G-169/G-170 drafted: launcher definition/documentation/help-depth family (user-approved)
Three [proposed] goals from the 2026-08-05 formhint-arc discussion of
why launcher help stops at the subject word:
G-168 selection-sound launch definitions - script/tclsh forms made
parse-discriminable with EXISTING vocabulary (file form -regexprefail
{^-e$} + oneliner '-e' element; tclsh scriptfile-vs-stdin via
candidacy fall-through matching stock semantics). Corrects the
discussion's earlier assumption that G-072 negation was required:
-regexprefail participates in form matching (G-143-arc verified; the
G-150 hash declaration is the dash-led precedent). Includes the
dispatch parse-gating decision (tabled vs app-plain errors, latency
measured if adopted).
G-169 app-owned launch-subcommand documentation - app-punkscript owns
(script)::punkexe::script via inert registration, launcher resolves
lazily (the existing argsid/package/docpackages machinery), single
definer per id, ownership rule recorded (app-owned for app-handled,
moduledoc for core-owned like tclsh), and the *_main.tcl declaration
surface (summary/package/argsid/parse) documented as the official
authoring mechanism.
G-170 launcher help depth - 'help <sub> <formname|index>' narrowing
(G-150 usage -form precedent), make.tcl-style dry-run gated on
parse-trueness (G-168 built-ins, project parse=1) with the
prepend-help idiom preserved for passthrough subcommands, and the
punkexe 0.6.1 interim -formhint suppression flipped to real
' <punkexe> help <sub> %formname%' templates.
Follow-on handling (user-approved leans): G-144's override-set
follow-on flipped => goal G-168 (the make.tcl half landed in the
G-143 arc; the punkexe-moduledoc half is now G-168's recorded
decision); G-150's selection-soundness sweep follow-on stays open
(broader than these two definitions - G-168's Notes record the
partial enactment). Overlap survey per the authoring workflow:
G-089/G-055/G-072/G-075/G-042/G-043/G-044 relationships recorded in
the detail files; app-punkscript intersects no live goals.
goals_lint clean (84 active, 86 archived).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 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
|
5 days ago |
|
|
818a39d349 |
vfscommonupdate: _vfscommon.vfs picks up punk::args 0.17.0, tclcore moduledoc 0.4.0, punk::ns 0.9.3, templates refresh
make.tcl vfscommonupdate -confirm 0 on the clean tree, mirroring the |
5 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 |
|
|
b8cbfe0cba |
bootsupport promotion: punk::args 0.17.0 (G-149 formhint + G-073 0.16.0), tclcore moduledoc 0.4.0, punk::ns 0.9.3, templates refresh
make.tcl modules + make.tcl bootsupport on the clean tree. The punk::args snapshot jumps 0.15.1 -> 0.17.0, carrying both pending minors: 0.16.0 (G-073 -choiceunavailable, committed |
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 |
|
|
ac8e26ab20 |
G-167 drafted: punk::args version-delta availability - unavailable @forms for shape deltas, unavailable option names for flag deltas
New proposed goal (user-approved wording, from the post-G-073 design discussion 2026-08-05): version/context deltas of a command's interface become declarable and honestly surfaced without delta computation, layered by delta kind. An @form may be declared unavailable - participating in candidacy/diagnosis, displayed annotated, tailored formunavailable rejection when only unavailable forms match, silent resolution to the available form when both match (the first sanctioned exception to G-041's no-silent-preference rule: documentation never competes with reality), -form selection displays but refuses parse. Option NAMES may be declared unavailable (the G-073 mirror at the option-name level) with pointed tailored rejection. The default render stays on available forms plus an AUTOMATED note enumerating unavailable shapes (name + authored note + navigation hint - no computed delta; user display decision relaxing the strict G-073 display-among-peers principle for shape deltas only, since named things keep per-name display via the option/choice layers). formstatus gains an additive 'available' field (G-152 contract) as the machine surface, and authoring guidance prescribes -choiceunavailable for subcommand-shaped deltas so the same concept never surfaces through two inconsistent paths. Detail file records the layered-model rationale, the silent-preference exception scope, the two-paths trap prescription, era authoring via shared -form tags (one form per version era - linear), engine seams, and the relations/overlap survey (G-073 foundation, G-166 sibling surface, G-152/G-041/G-074/G-150/G-149/G-044/G-055). Acceptance and the lsearch -stride adoption candidate are agent-derived for user review; status proposed. goals_lint clean (82 active / 85 archived). 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 |
|
|
621e57fd15 |
G-106 follow-on landed: raw-mode typing feel user-confirmed on the suite runtime
The one manual residue on G-106 - interactive typing-experience confirmation of raw mode where the pwsh consolemode fallback does the mode flipping - is confirmed by the user on tclsh9.0.5-punk.exe (the store-active twapi-less suite 9.0.5 runtime). Disposition flipped open -> landed 2026-08-05. Disposition-only edit per the goals/AGENTS.md Follow-ons contract. goals_lint clean; goals_followons now 24 open / 20 goal / 14 landed / 2 declined. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
99402a1e4d |
G-087 + G-139 follow-on dispositions: link_as landed in-goal, linux lib-tier became G-140
Evidence-checked continuation of the archive follow-on sweep: - G-087 fauxlink link_as encoder => landed 2026-07-17: implemented in fauxlink 0.2.0 (link_as + punk::args doc, upstream checkin 1e6b4ee8) within the goal's own stage 2; the '=> open' marker derived from Notes prose written earlier that same day, before stage 2 landed. - G-139 linux-x86_64 lib-tier emission for punk9linux's tcllibc siblings => goal G-140: G-140's delivered scope covers the item exactly (tcllibc-tcl9-r1 emission, sibling replacement/supersede, punkbin publication f94ffd2) and its record cites the G-139 flip note as its origin. Disposition-only edits per the goals/AGENTS.md Follow-ons contract. goals_lint clean; goals_followons now 25 open / 20 goal / 13 landed / 2 declined (count also reflects c7470dac's G-165 mkimg-retirement landing, committed independently of this pair). Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
c7470dac53 |
G-165 runtime-side follow-on landed: retire mkimg from the buildsuite wrap lane
zipfs_wrap.tcl (renamed from zipfs_mkimg.tcl, same CLI contract): payload zip written by the driving shell's builtin tcl::zipfs::mkzip - convention-stable across mkimg vintages (probed 8.7a6 vs 9.0.3: identical member tables/CRCs) - with the prefix executable concatenated OUTSIDE the writer, plus an EOCD archive-relative self-check per wrap (exit 9 on file-relative output). build905.zig wrap lane updated (3 call sites, identifiers zipwrap_*); suite README states the wrap contract; G-165 follow-on disposition => landed. Verified: standalone wraps under both vintages mount/boot identically (840 members, base=prefix); suite make-zipfs/smoke/kit-family green - all 5 products probe archive-relative and boot (family_check plain/punk/punk-bi, tclsh90szip smoke, tclsh90sprzip manual boot). Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
64a8916d36 |
G-122 follow-on dispositions: both open items were enacted by goals (G-124, G-125)
The G-159 retrofit recorded both of G-122's deferred items as '=> open', but each had already been enacted by a drafted goal that cites G-122 as its motivation: - pure-Tcl zip decoder for the zipfs-less bake path => goal G-124 (punk::zip::unzip/members/archive_info, achieved 2026-07-26; make.tcl extraction still consumes it and no zipfile::decode requirement remains in the tree) - refuse-to-deploy on missing tcl_library => goal G-125 (boot-precondition gate punkboot::utils::vfs_boot_library_report, achieved 2026-07-27) Disposition-only edit per the goals/AGENTS.md Follow-ons contract. goals_lint clean; goals_followons report now 28 open / 19 goal / 11 landed / 2 declined. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 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 |
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 |
|
|
45fd5e7c87 |
G-165 proposed: driver-invariant kit assembly (single zip writer path, punkzip acceleration, file-relative opt-in)
Every make.tcl zip-kit bake is to emit an ARCHIVE-relative kit regardless of the driving interpreter's zipfs vintage (legacy file-relative mkimg in 8.7/9.0.0, fixed mkimg in 9.0.1+, or no mkimg at all): zip-kit assembly moves to a single writer layer - punkzip (zig) when its binary is present, punk::zip::mkzip (pure Tcl) as the always-available floor - with tcl::zipfs::mkimg retired from the pipeline, and file-relative output only via an explicit per-kit mapvfs.toml opt-in. Workstream order (user decision): upstream punkzip root-strip/exclude enabling changes first, then the punkshell seam. The detail file carries the driver-vintage probe evidence (8.7a6=file, 9.0.3=archive), the upstream fix provenance (ticket aaa84fbbc5, core 3d62ee540d 2024-12-05), the write-path benchmark (mkimg 11.4/35.9s vs mkzip 8.1/24.8s vs punkzip 6.7/20.0s at 132MB/396MB), the drafting-time overlap survey and Related lines. 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 |
5 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 |
|
|
f9ae712620 |
AGENTS.md: commit granularity + cadence guidance (user, 2026-08-04)
- User Preferences: lean towards larger commits when splitting adds complexity (a goal drafted from discussion during another goal''s implementation may land in the same commit or one goals-tier commit; no partial-hunk staging gymnastics for per-goal purity); corollary - agents OFFER to commit at seams (green test gate, coherent sub-change, before a new concern) rather than letting the uncommitted set grow past the natural split - Commit Conventions: pointer bullet to the new preference Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
71b388e30a |
G-164 proposed: viability probe alternative-allocation re-probe (reservation-stolen flag words) + G-044 note
- new goal (user-drafted 2026-08-04): when the valmin reservation seats a word that literally names a declared required option into a required value slot and the resulting optionmissing stands in the G-152 viability probe, re-parse with the stolen word(s) consumed as the option they name; pure end-of-input exhaustion after that re-seating grants viable-incomplete. Runtime seating unchanged (the trailing-flag-as-value rule is load-bearing, pinned by flagvalues_plain_then_dash) - surfaced by the G-150 batch + independent second-session review: 'i hash -t' classes the test form '(not viable)' although 'hash -t foo' is valid - a false negative, GAP-pinned in cmdhelp.test (owned by this goal; the pin flips at achievement) - overlap survey in the detail file (G-044 consumer; G-152/G-150 archived relations; args/ns family anchors dismissed as unrelated mechanisms) - G-044 Notes: records G-164 as the probe-layer answer to G-152's "completion consumer lookahead" note for the valmin-reservation class - goals_lint clean (82 active, 82 archived) Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
2cc0568dc7 |
G-150 achieved 2026-08-04: flip + archive (punk::ns cmdhelp form narrowing + selection-sound auto_exec::hash declaration)
Acceptance met in full (evidence in the archived detail file's Progress): 'i ::punk::auto_exec::hash -r' renders only the rehash form's usage and '-d <name>' only the delete form, driven by the declaration (bare punk::args::parse withid selects flag-led forms uniquely via the show_or_set name's -regexprefail {^-}; no hash-handler involvement); runtime behaviour otherwise unchanged (dash-led name needs an explicit flag form - accepted cost); ensembles/single-form/no-word invocations render as today. The goal reduced to its declaration half - cmdhelp's G-041 advisory-parse candidacy already narrowed on a unique selection.
- index entry -> GOALS-archive.md; detail file -> goals/archive/ with Progress evidence and Follow-ons (handler multi-name -t missing-name defect => landed 2026-08-04 by user fix; selection-soundness sweep of other definitions => open)
- activation-freshness xref re-run at activation recorded; reference sweep at archive: no live-tier mentions, no xref bridges lost; goals_lint clean
- code/tests landed in the preceding commits (auto_exec 0.1.1, ns 0.9.2, cmdhelp.test 45/45); punkshell 0.51.0
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
|
6 days ago |
|
|
d9d840b990 |
bootsupport: promote args 0.15.0 + auto_exec 0.1.1 + ns 0.9.2 + commandstack 0.7.1
make.tcl modules + bootsupport outputs (punkcheck-managed): - punk/args 0.14.0 -> 0.15.0 - REQUIRED by the tracked-bump staleness discipline (src/bootsupport/AGENTS.md): the minor bump tripped the staleness gate, which aborts bare non-interactive make.tcl invocations (exit 1) - briefly broke maketclbakelist/maketcllibfetch (10 pins) until this promotion; both suites green again (9/9, 8/8) - punk/auto_exec 0.1.0 -> 0.1.1, punk/ns 0.9.1 -> 0.9.2 (the G-150 batch) - commandstack 0.6.0 -> 0.7.1 (swept - the 0.50.1 deferral's next cycle) - superseded snapshots pruned per include_modules.config 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 |
|
|
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
|
6 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 |
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 |
|
|
5cc488d132 |
G-077 achieved 2026-08-04: flip + archive (punkexe -e one-liner support)
Acceptance met in full (evidence in the archived detail file's Progress): the named invocations punksys -e {puts hi} / punk902z script -e {puts hi} and the full matrix (piped and unpiped stdin, no-arg usage error on both surfaces, errorInfo + exit 1, argv0/argv, result echo, tclsh -e stock-parity boundary) verified by hand on the baked kits; scriptexec.test + launcherhelp.test 49/49 green. Index entry -> GOALS-archive.md, detail file -> goals/archive/ with Progress evidence and a (none) Follow-ons section; G-141/G-158 reference-sweep achieved markers; no xref bridges lost. goals_lint clean.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
|
6 days ago |
|
|
c8fd165189 |
vfscommonupdate: promote app-punkscript 1.1 + boot core 0.4.0 + moduledoc punkexe 0.5.0 (G-077); swept commandstack 0.7.0 + tcltestrun 0.4.1
make.tcl packages + vfscommonupdate outputs (punkcheck-managed): - app-punkscript 1.0 -> 1.1 and punkboot/core.tcl 0.3.0 -> 0.4.0 (the G-077 -e one-liner surfaces) - punk/args/moduledoc/punkexe 0.4.0 -> 0.5.0 (G-077 documented forms) - swept promotions recorded as left-to-next-cycle by their commits: commandstack 0.6.0 -> 0.7.0 (git |
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 |
|
|
8cc7d42634 |
punkexe moduledoc layout fixes and -& record continuations
|
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 |
|
|
6e79ab5769 |
bootsupport: promote tcltestrun 0.4.1 (errorInfo/errorCode capture normalization)
make.tcl modules + bootsupport outputs (punkcheck-managed): punk/tcltestrun 0.4.0 -> 0.4.1. The runner parent loads this copy - promotion puts the normalized errorInfo/errorCode capture in front of runtests.tcl. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
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 |
|
|
d9398dc250 |
G-161 achieved 2026-08-04: flip + archive (tcltestrun multi-line banner parsing)
Acceptance met in full (evidence in the archived detail file's Progress): synthetic + e2e parser suites committed and green both runner modes and both Tcl generations; full-suite parity PARITY ok in both modes; src/tests/AGENTS.md relaxed to style guidance. Index entry -> GOALS-archive.md, detail file -> goals/archive/ with Progress evidence and three structured open Follow-ons (single-line banner anchoring, glob-metachar closing-banner match, errorInfo/errorCode leading space). Reference sweep: no pending-tense live-tier references existed; goals_lint clean (83 active / 80 archived); goals_followons registers the three open items; goals_xref reports no lost bridges. 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 |
|
|
11dbe02d02 |
bootsupport: promote tcltestrun 0.4.0 (G-161) + sweep pending console 0.8.1 / shellfilter 0.2.5
make.tcl modules + make.tcl bootsupport outputs batch (punkcheck-managed): - punk/tcltestrun 0.3.1 -> 0.4.0 (the G-161 multi-line banner parser - runtests.tcl's parent loads the bootsupport copy, so this promotion is what puts the tolerant parser in front of the runner) - punk/console 0.8.0 -> 0.8.1 and shellfilter 0.2.4 -> 0.2.5: already committed in src/modules and already promoted into _vfscommon (ac032b96/8864e5ce); this bootsupport run swept the snapshots current - punk/mix/templates-0.2.0.tm re-packed by the mint (modpod payload refresh, no source change) Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days 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 |
6 days ago |
|
|
5bf057a3d8 |
G-161 activation: multi-line banner parsing goal goes active
User-directed activation (proposed -> active, index + detail mirror). Activation-freshness survey (goals_xref score G-161) recorded in the detail file Notes: no related live goals - every overlap pair is unlinked with zero path intersection (lexical noise only; interval-drafted G-163 unrelated). goals_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
a9c5c9228e |
G-163 proposed: unix tty exit-path output drain (shared-description O_NONBLOCK tail loss)
New goal (user-approved wording): punkshell exit paths on unix ttys restore blocking on the shared tty file description and drain pending stdout/stderr (bounded best-effort) before teardown - closing the tclIO behaviour where stdin's non-blocking read windows make stdout non-blocking underneath, 'flush' silently no-ops once a background flush is scheduled, and TclInExit discards EAGAIN'd buffers (measured 2026-08-03: 161/5000 lines survive exit on a throttled WSL pty; ~498KB pending after a 'successful' flush). Guard homes in punk::console, invoked after the G-038 eof-restart decision point; acceptance includes complete delivery under a slow reader, bounded exit under a dead reader, unchanged windows/piped behaviour, ARCHITECTURE.md exit-section documentation, and a unix-pty-gated pin. Related: G-038, G-013, G-011, G-090 (+ archived G-036 lineage). goals_lint clean; overlap survey recorded in Notes. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |