Tree:
359a160f2c
master
v0.1a
${ noResults }
204 Commits (359a160f2c759e823b4d3c3077b0725dd4ab6dab)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
8f446690c1 |
G-172 (active): record + surface + audit the distributed-binary CPU floor
Approach 3 (record floor field): build905.zig declares cpu_floor="baseline" beside the default_target pin and writes cpu_floor + cpu_model into each family member's embedded record [provenance] (= target.result.cpu.model.name, so "x86_64" for the default build, "znver5" for -Dcpu=native - the floor is a default, not a restriction). family_artifacts.tcl derives both from the embedded record (G-117 single-source-of-truth) into the sidecar [provenance], failing if absent; family_check.tcl asserts them non-empty. Approach 4 (audit tool): scriptlib/developer/cpufloor_audit.tcl disassembles a binary's .text via a located objdump (llvm-objdump preferred, GNU fallback) or audits a pre-disassembled excerpt, classifies by AVX register width (zmm=v4, ymm=v3; baseline/v2 forbid both, v3 forbids zmm, v4 allows all), reports out-of-floor count + first RVA + sample mnemonics, exit 0 PASS / 1 FAIL. Bundled fixtures in cpufloor_fixtures/ are real disassembly excerpts (avx512, avx2, clean); selftest 12/12 cases pass. Verified on real binaries: rebuilt bin/punkzip.exe PASS (zmm=0); a -Dcpu=native probe FAILs at baseline (123 zmm) and PASSes at v4. Approach 5 (punk-runtime surfacing): both .ps1 and .bash twins updated and re-wrapped. Host CPU level detection (PS via IsProcessorFeaturePresent PF SSE2=10/SSE4.2=38/AVX2=40/AVX512F=41; bash via /proc/cpuinfo flags) feeds a meets/below/unknown/norecord verdict. fetch prints cpu floor (UNGATED - a cross-platform fetch for another machine stays free); list annotates rows the host cannot run (!CPU-FLOOR:v<req>, local rows only); use/run gate on below with a named diagnosis instead of a silent STATUS_ILLEGAL_INSTRUCTION (0xC000001D) - the 2026-08-06 AVX-512 regression failure mode; info adds the fields. bin/punk-runtime.cmd re-wrapped (deterministic; scriptwrap_runtime_cmd_roundtrip_no_drift test PASSES). Activation: overlap survey re-run at activation (goals_xref score G-172) - no goals drafted in the interval; existing Related: notes cover every pair. Project version 0.57.0 -> 0.57.1 (patch - user-visible punk-runtime behaviour shipped in kits). Remaining for acceptance: rebuild + republish in-situ (per Approach 6's alpha dispensation) and audit the republished artifacts to confirm zmm=0 - a publication-time, user-owned step. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
4 days ago |
|
|
f103b90c3a |
G-166 achieved: cmdinfo/cmdhelp surface recognised-but-unavailable landings distinctly
Activated at user direction and achieved in the same session. On Tcl 8.6,
'i string is dict' (a class the runtime lacks) and 'i string is true' (a real
class) were indistinguishable to both eye and machine: cmdinfo reported
cmdtype 'doconly' with identical key sets, and cmdhelp's advisory parse of an
argument tail succeeded against the virtual docid, so 'i string is dict 5'
rendered exactly like a usable command line. Documentation REACHABILITY for
unavailable words is G-073's intent; the INDISTINGUISHABILITY was emergent -
nothing structural told a consumer the documented word is rejected here.
punk::ns 0.10.0
(a) cmdinfo gains an 'unavailable' key on EVERY result - empty, or the
canonical -choiceunavailable name the resolution addressed. It is a SECOND
AXIS beside cmdtype, never a cmdtype value: cmdtype answers what kind of
executable thing resolution landed on (both 'string is dict' and
'string is true' stay 'doconly'), availability answers whether the resolved
word is selectable in this runtime/context. Overloading cmdtype would have
broken every consumer switching on cmdtype eq "doconly", and the two only
co-occur incidentally. cmd_traverse's yielded/returned records carry a sixth
element for the attribution; cmdinfo keeps the final landing's value.
Population is nearly free - the level's choices-bearing first leader is
resolved once per level via the shared punk::args::choiceword_match, and both
the exact space-form landing and the prefix retry consult that one result
(the G-051 branch was restructured, not duplicated).
(b) PREFIX-LANDING DECIDED, enacting the G-073 doc-walk follow-on: a unique
prefix landing on an unavailable name now RESOLVES that name's virtual docid,
attributed - the conservative non-resolution was not kept. Encoding
availability as resolve-vs-don't-resolve conflated it with addressing and
made addressing inconsistent: 'i string is tr' resolved but 'i string is dic'
did not, while exact 'true' and 'dict' both did. Now every form of address
that names a documented word resolves it, and the availability key plus the
render marking carry the rejection story parse reports for the same word.
The choice traverse's G-040 parse-parity claim is untouched - an unavailable
word still identifies no SUBCOMMAND there, it is only attributed (the path
taken when the name has no space-form virtual docid).
(c) cmdhelp marks such subjects in every return form from one shared wording
(_cmdhelp_unavailable_marking, mirroring punk::args'
private::unavailable_choice_msg so a user meeting both reads one story):
-return dict carries the key, table/string render the message below the usage
under the non-info scheme, -return text leads with an 'UNAVAILABLE:' line.
The marking takes precedence over BOTH the ok-parse info render and any parse
failure message - the subject not existing here is the more fundamental
report, and it is the one a parse against a virtual id cannot make. Parse
status still passes through, so argument positions keep their marking.
punk::args::moduledoc::tclcore 0.4.1 - on a runtime lacking a curated forward
class, that class's per-class virtual id LEADS its help with the unavailability
statement (runtime patchlevel + the rejected call shape), then the unchanged
static description. The static version note existed but sat at the END of the
prose, so a reader met the full class documentation before learning the class
does not exist here. Runtimes where the class is live generate the id unchanged.
Tests: cmdflow.test gains the flowunavail / flowunavail_nodoc fixtures and 5
pins (key always present; exact landing attributed with cmdtype unchanged; the
prefix decision pinned against parse's choiceunavailable rejection;
choice-traverse attribution without addressing; attribution surviving an
argument tail). cmdhelp.test gains the helpstrua fixture and 5 pins (3 local
render, 2 tclcore-gated real-world) plus the two DELIBERATE key-list flips
(cmdhelp_cmdinfo_result_shape, cmdhelp_return_dict_valid). tclcoreparity.test
gains the virtual-id leading-note pin. All new pins are live-derived, so the
modern arm asserts the same shapes with an empty key.
Verified: cmdflow 25/25 + cmdhelp 50/50 on native 8.6.10 (THE AFFECTED ARM,
unavailable={dict}), 8.7a6 and 9.0.5; full punk/args subtree 341 total / 338
passed / 3 intended skips / 0 failed on all three; full punk/ns 125 green on
9.0.5 and green on 8.6/8.7 apart from two nsprimitives failures verified
PRE-EXISTING on both (confirmed with the module changes stashed); broad
src/tests/modules/*** sweep on 9.0.5 - 1257 tests, 108 files, 0 failed.
Consumer audit: every in-tree cmdinfo consumer reads named keys via dict get,
so the added key is inert for all of them. goals_lint and architecture_lint
clean.
Project 0.56.2 -> 0.57.0 (user-visible shell behaviour) with CHANGELOG entry.
Goal flipped to achieved and archived; four follow-ons recorded (to G-050,
G-044, G-055, G-167) with reference-sweep pointers pushed into those goals'
Notes, and the G-167 back-pointer added at activation - G-166 landing first
settles the marking-vocabulary ownership the two goals share. Also corrected
two pre-existing stale claims in src/tests/modules/AGENTS.md that this work
falsified: tclcoreparity's "version-note labels conditional on class presence"
(stale since G-073) and its "under 8.6 run the file directly via a plain
tclkit" note (stale since native 8.6 became a supported runner 2026-07-21).
Staged deliberately as this change-set only: the concurrent G-172 zig
CPU-floor lane (GOALS.md entry, goals/G-172-*.md, the four build.zig files)
is left uncommitted in the tree.
Claude-Session: https://claude.ai/code/session_01Y5vEJUZkD4p8jmEFEBVhLi
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
f05a2857a3 |
make.tcl bake: end-of-run BAKE SUMMARY + exit 4 on failed kits (punkshell 0.56.2)
A full 'make.tcl bake' scrolls its per-kit work far out of reach, so the run
ended with no answer to "what actually baked?" - the INSTALLED KITS / FAILED
KITS blocks named only the kits the kit machinery touched and said nothing
about the rest. Every run now ends with a BAKE SUMMARY block: a counts
headline (deployed/unchanged/not-built/failed, plus the number of
BAKE-WARNINGs recapped after it) and one line per kit with its reason, under
NOT BUILT / UNCHANGED / INSTALLED KITS / FAILED KITS.
It covers the WHOLE configured matrix, not just the kits the run touched. An
absent runtime, bake_default=false, a release-gated scheme output or a missing
.vfs folder each keep a kit out of the kit machinery entirely, and on a
part-populated runtime store those are most of the rows: on a second punkshell
checkout 16 of 20 configured kits never enter the loop - three of them (the
punk8-* scheme outputs) previously silent, since the parse-time
missing-runtime BAKE-WARNING only covers default entries.
Mechanism: a per-kit ledger (::punkboot::bake_outcomes, fed by
record_bake_outcome at every point that settles a kit's fate, including the
parse-time skips) keyed by the kit's path relative to bin/ and src/_bake/
(kits/<platform>/<kit> for cross-target outputs - G-127) so same-named kits
for different targets keep distinct rows, plus a completeness pass over
mapvfs_kit_outputs for anything the loop never reached. Selective bakes
summarise only the kits they were asked for. The block is stdout so it stays
contiguous under redirection; the failure list is echoed to stderr from the
same ledger, so the two renderings cannot drift apart.
Exit status: a run that completed with FAILED kits now exits 4. make.tcl's
existing non-zero codes all mean "refused to do the work" (1 usage/gate
refusal, 2 structural abort, 3 config error), so a run that DID the work and
had kits fail exited 0 like a clean one - and punk::mix::cli::make ('dev make',
the in-tree caller that branches on the exit code) reported "OK make finished"
and returned true for a bake in which every kit failed. 4 keeps "could not
run" distinguishable from "ran, produced failures". The not-built bucket
deliberately never affects the exit code: an absent runtime, bake_default=false
or a release-gated output are normal states, and a part-populated runtime store
is the common case.
Verified: all five outcome buckets exercised through the PUNK_MAPVFS_CONFIG
fixture seam (deployed, unchanged, parse-time notbuilt, completeness-pass
notbuilt, failed) plus selective-bake narrowing; exit 4 measured end-to-end
under a direct tclsh; 59/59 punkexe maketcl* tests pass, including the five
real fixture bakes in maketclprojectversion.test and the exitcode pins in
maketclbakelist.test.
Known gap, pre-existing and untouched: bin/punk-runtime.cmd 'run <script>'
flattens every child exit code to 0 (measured with a probe script exiting 7),
so exit 4 is invisible through that wrapper until its run action propagates.
Layout copies (src/project_layouts/vendor/punk/{basic,project-0.1}/src/make.tcl
and the modpod templates copy) synced by 'make.tcl modules'.
Claude-Session: https://claude.ai/code/session_017yWCebiNUVFtTrMA9GvsYd
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
4 days ago |
|
|
2dbf635b99 |
Project-version bake gate - bump-before-bake machine-enforced (punkshell 0.56.1)
The project version is a bake input (kit stamp punkkit-stamp.toml project_version + versioned-scheme output names), but nothing enforced the step (2) bump -> step (8) bake order; a 2026-08-06 session baked at 0.55.1, bumped to 0.56.0 and paid a full 11-kit re-bake. Every other release-sequence edge already had a mechanical gate (provenance, bootsupport staleness, boot precondition) - this was the un-gated one. - ::punkboot::get_projectversion_status: shared staleness/consistency computation (projectversion advisory, check report, gate); states ok/overdue/bump_uncommitted/unavailable. - project-version gate on bake/bakehouse/bin: a pending-looking bump (src/ commits since punkproject.toml last changed, none staged) prompts y/N on a terminal and aborts fast non-interactively unless -expect-projectversion asserts the intended version. -confirm 0 deliberately does not waive the gate. A staged-but-uncommitted bump passes (bake reads the working-tree value); degraded bootsupport reduces the gate to a NOTE. - -expect-projectversion <ver> (bake/bakehouse/bin argdocs + degraded scan): assertion verified in every state - a mismatch with punkproject.toml always aborts before any kit work; unavailable status aborts a supplied assertion as unverifiable rather than silently losing the requested strictness. - projectversion overdue warning now states the consequence and prints the ready-made assertion command; check reports the gate state and current staleness verdict; workflow text ([K2] bake-input + gate, [K6] no-waiver exception, steps (2)/(8)) and gethelp/HELPTEXTS/OPT_CONFIRM document it; root AGENTS.md gains "The version is a bake input (bump BEFORE bake)" + an Enforcement gate paragraph; src/AGENTS.md closeout bullet extended. - maketclprojectversion.test: piped characterization (8 tests) - check report, advisory read-only, and git-fixture verdicts for pending-abort, assert-match proceed, assert-mismatch abort, bump-staged proceed, no-git NOTE. maketclhelp.test bakehouse-synopsis pin updated for the new flag. - Thin-layout + templates-modpod make.tcl copies synced via make.tcl modules. Claude-Session: https://claude.ai/code/session_01EukjNTv2r5msFgHzWgaCdS Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 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
|
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 |
|
|
7cdf5b2323 |
G-149 achieved: punk::args configurable multi-form synopsis hint labels (punk::args 0.17.0)
The per-form hint labels rendered beside a multi-form definition's synopsis lines in the usage/arg_error table (hard-coded ' i -form N ...' previously) are now a template substituted per form: %formindex% is replaced with the form's 0-based ordinal, %formname% with its name, and an empty template suppresses the labels entirely (the cell keeps just the Synopsis: label, as single-form renders always have). Both acceptance arms landed. Definition side: new '@cmd -formhint <template>' key - rides the existing arbitrary-key cmd_info merge (no resolver change), round-trips through resolved_def, not display -deferred; documented in the define -help directive-options. Caller side: new -formhint option on arg_error (manual parser + PUNKARGS block) pulled into usage via its existing resolved_def opts pull; supplied-empty (suppress) is distinct from not-supplied (the option declares no -default, so an unsupplied usage call passes nothing through). Precedence: caller > definition > built-in default, whose template substitutes to the exact prior bytes. Motivation (G-143 origin): script-level (script) ids - make.tcl's - are unreachable from any repl, so the repl-oriented 'i' hint was not actionable there. Scope decisions pinned: single-form renders never carry hint labels; the -return string renderer has no hint column and is unchanged. Byte-identity for unconfigured definitions proven by pre/post capture diff of 'punk::args::usage ::punk::args::parse' (identical bytes, through the usage pass-through path). Tests: new formhint.test (9 tests - default labels, directive/caller/suppression matrix, parse -error path, single-form + string-renderer scope); full punk/args subtree 302/0-fail on BOTH tclsh90 9.0.3 and the punk86 kit (8.6); punk/ns subtree 115/115 (cmdhelp consumer). make.tcl help untouched until promotion (maketclhelp.test still pins the bootsupport hint). Goals: G-149 activated at user direction then flipped achieved 2026-08-05 + archived (index record newest-first, detail file to goals/archive with Progress evidence and 1 follow-on: make.tcl adoption after a bootsupport promotion => open). Activation-freshness survey recorded the G-167 relationship (same renderer surface - composition note both sides); reference sweep updated G-151/G-167 mentions; goals_lint clean, no orphaned xref pairs. punkshell 0.55.0 + CHANGELOG. Bootsupport/vfscommon snapshots unchanged until promotion + bake. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
69927531a4 |
G-073 achieved: punk::args unavailable choices (-choiceunavailable) + G-166 drafted (punk::args 0.16.0, tclcore moduledoc 0.4.0, punk::ns 0.9.3)
New per-argument key -choiceunavailable <list>: names recognised but not
available in the current runtime/context. Entries display among the
choices under a dedicated "Unavailable (recognised, not selectable
here)" group (one rendering-side injection - both renderers,
choicelabels notes, choiceinfo markers, trie prefix marking and
value-in-effect exclusion all inherited) and join the prefix pools;
synopsis literals and goodchoice marking never include them. Resolve
-time validation: no collision with choices/alias names/reservelist,
-default may not be unavailable, requires -choices/-choicegroups.
choiceword_match gains an optional 8th argument and an 'unavailable'
result key (matched stays 0 - matched-only consumers unaffected):
exact, nocase and unique-prefix landings carry the name as canonical; a
prefix shared with an available choice stays plain-ambiguous.
Validation rejects a landing with the tailored PUNKARGS VALIDATION
{choiceunavailable <name> choices <list>} error (-badarg/-badval;
private::unavailable_choice_msg names the supplied word, the resolved
entry, its choicelabel note and the available values; shared by final
validation and both G-082 overflow raise sites via rejection kind
'unavailable' from the allocation screen). Ambiguity messages annotate
unavailable longer matches '(recognised but unavailable)';
-choicerestricted 0 keeps full passthrough.
tclcore 'string is' adoption: curated forward list {dict} ('unicode'
deliberately excluded) diffed against the define-time harvest; labels
and per-class virtual ids extend to unavailable classes. On Tcl 8.6:
dict displays with its "(class not present in Tcl 8.6)" note,
'string is dict' rejects informatively, 'string is di' is ambiguous
(deliberately stricter than real 8.6 - recorded as a user-sanctioned
parity exemption; full words parity-true), and 'i string is dict'
documents via the virtual id. punk::ns cmd_traverse passes the key at
both resolver sites (doc-walk parity; the choice-traverse comment now
documents the choice-resolution vs doc-addressing axes split). tclcore
moduledoc requires punk::args 0.16.0-.
Tests: new choiceunavailable.test (10 tests); usagemarking.test gains
the goodchoice-exclusion pin; tclcoreparity.test gains forward-class
adoption invariants and the sanctioned 'di' strictness exemption, with
the version_notes pin deliberately flipped (dict's label now renders on
every runtime). Green: the three suites 37/37 on native Tcl 8.6.10
(luck runtime), 8.7a6 and 9.0.3; punk/args subtree 293/290/3 skips/0
fail on 9.0.3 AND 8.7; modules/punk sweep green except the three
documented pre-existing box-baseline failures (grepstr x2, nslist x1);
ns cmdhelp/corp 58/58 after the comment clarification.
Goals: G-073 flipped achieved 2026-08-05 + archived (index record
moved, detail file to goals/archive with Progress/verification and 3
follow-ons). G-166 drafted [proposed] at user direction (approved
wording): cmdinfo availability key + cmdhelp marking + tclcore leading
note + prefix-landing decision; the enacted G-073 follow-on flipped
=> goal G-166, the G-055 pattern follow-on => goal G-055 with a Notes
pointer added there. goals_lint clean. punkshell 0.54.0 + CHANGELOG.
Bootsupport/vfscommon snapshots unchanged until promotion + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
d2094364a3 |
G-082 follow-on landed: required typed value/leader misreport -> pointed typemismatch (punk::args 0.15.2)
A REQUIRED typed value or leader whose present word fails the basic-type allocation screen (int/double/bool/number/dict) now reports the pointed typemismatch naming the word and argument (-badarg/-badval, same shape as the G-082 overflow-site selection) instead of the generic missingrequiredvalue/missingrequiredleader shortfall. The in-loop required-arg raise sites consult the rejection record returned by get_dict_can_assign_value; the leaders-loop edit mirrors the values loop per the MAINTENANCE contract. Unchanged by design: end-of-input shortages (valuemissing/count classes), literal-typed members, multi-member clause partials (no rejection record - conservatism preserved), and required-arg choice words (never screened - G-071 asymmetry, choiceviolation already pointed). parse_status: the shape now classifies invalid/typemismatch (the formstatus viability verdict was already invalid; one probe re-parse saved); argdoc status-key note updated. Pins deliberately flipped: parsestatus.test (renamed parsestatus_typed_value_screen_typemismatch), formviability.test (single-form top-status/formstatus split demo re-anchored on a required-option shape), punk/ns cmdhelp.test message match. New errorselection.test coverage: required value + leader typemismatch pins plus unchanged-shape guards. Verified tcl 9.0.3: punk/args subtree 280 total / 277 passed / 3 intended skips / 0 failed; punk/ns only the pre-existing nslist(1) box-baseline failure (stash-verified unrelated). tcl 8.7: touched args suites 38/38, cmdhelp 45/45. Follow-on disposition flipped => landed in goals/archive/G-082-punkargs-error-selection.md (goals_lint clean; ledger 23 open / 20 goal / 15 landed / 2 declined). punkshell 0.53.1 + CHANGELOG entry. Bootsupport/vfscommon args copies stay 0.15.1 until the next promotion + bake. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 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
|
6 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 |
6 days ago |
|
|
5ac0d4c0f0 |
punk::tcltestrun 0.4.2: closing-banner prefix match exact compare (G-161 follow-on landed) (0.51.2)
The closing-banner prefix check 'string match "$line_inner*"' treated the raw test name as a glob pattern, so a test NAME containing glob metacharacters (* ? [ ] backslash) never matched its own opening text: the closing banner failed to close the failure section and every later event including the summary line was swallowed (the G-161 wedge class; latent, unexercised in the corpus). The check is now an exact byte prefix compare (string equal -length) - identical semantics for ordinary names, and an empty line_inner keeps the historic match-everything behaviour. New parsetestrun-globname-7.0/7.1 pins: 8/8 green tclsh90 single+multi-process and tclsh86, parser dir 10/10. Landed directly at user direction from the archived G-161 Follow-ons - disposition flipped to landed in the same change-set (the sanctioned archived-file edit). runner/AGENTS.md parser coverage bullet updated. CHANGELOG + punkproject 0.51.2. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
1605b97b37 |
G-164 achieved 2026-08-04: punk::args 0.15.1 viability probe alternative-allocation re-probe (punkshell 0.51.1)
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
0db6b9e8ba |
punkshell 0.51.0: G-150 form narrowing + @values -flagvalues batch
- 'i <command> ?word ...?' form narrowing for flat multi-form commands (G-150): punk::auto_exec::hash's declaration is selection-sound, so 'i hash -r' renders only the rehash form's usage and 'i hash -d <name>' only the delete form, driven by the declaration through cmdhelp's G-041 advisory-parse candidacy; no-word, ambiguous and no-match lines keep the whole-command render - punk::args 0.15.0 @values -flagvalues (G-150 follow-on): opt-in dash-led-words-as-values seating; consumed by hash's tightened help form - known issue recorded in the entry: the test form's '(not viable)' for 'i hash -t' is a false negative (valmin reservation steals the flag word into the required value slot) - GAP-pinned, owned by G-164 - modules: auto_exec 0.1.1, ns 0.9.2 (documentation-only), args 0.15.0; pins: cmdhelp.test 45/45, flagvalues.test 9/9 Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
6 days ago |
|
|
8ed9cc33fe |
commandstack 0.7.1: reload contract state guards (G-160 follow-on landed) (0.50.1)
- known_renamers and debug are now info-exists guarded like the rest of the module state (all_stacks, renamer_command_tokens, token_implementations) - a module re-source refreshes proc definitions only, no longer resetting them while stacks/tokens survive - previously the reset stranded live stacks: the removal forms gate on known_renamers membership, so surviving records' renamers became unknown and removal errored - contract documented in commandstack::help; pinned by commandstack_reload_preserves_state - suite 41/41 on tclsh90 (9.0.3) + punk86 (8.6); packagepreference consumer suites 6/6 on both; minted modules/commandstack-0.7.1.tm (bootsupport/vfscommon promotion left to the next cycle, as with 0.6.0/0.7.0) Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
7 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 |
7 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 |
7 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 |
7 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 |
7 days ago |
|
|
c2629f2631 |
punk::console 0.8.1: fix get_size 'columns {}' regression on unix (tput multi-capname variance)
get_size_using_tput invoked tput once with two capnames ('tput lines cols').
Multi-capname support varies by tput implementation: ncurses >= 6.1 and the
BSD tputs emit one value per capname, but older ncurses treats the second
capname as an (ignored) parameter of the first and emits only the first
value - lassign then set cols to "" and the mechanism returned
'columns {} rows <n>' without erroring. Because size_via_query_mechanisms
caches mechanisms fastest-first after a first-call timing probe, and a tput
fork outpaces the ANSI cursor round-trips on unix, the malformed tput result
won every call after the first (first call returns the probe pass's
cursorrestore result - hence 'worked first time' on WSL, then
'columns {} rows 66' and dependent failures e.g punk::ansi::example).
- get_size_using_tput: autodetect multi-capname support by result shape on
first use, cached per tput path (capable tputs stay single-fork;
single-cap-only tputs settle into two forks); results validated as
positive integers, else the mechanism errors and drops out.
- new get_size_using_sttysize mechanism: 'stty size' on the input tty -
single fork, fixed '<rows> <cols>' output shape (GNU/busybox/BSD),
slotted ahead of tput in the probe order; errors cleanly on non-tty input.
- size_via_query_mechanisms hardened with size_result_valid: mechanism
results must be well-formed {columns <int> rows <int>} dicts in the probe
pass, vt52 branch and cached loop - covers this regression class and the
ANSI mechanisms' {columns {} rows {}} timeout results (previously a
no-responder tty's first get_size returned that malformed dict).
- get_size_using_chanconfigure: note that tcl 9.0.2 unix tty channels expose
no -winsize (windows console channels do) and stacked/reflected stdout
masks the underlying tty's options.
Verified on WSL pty (266x66): sttysize/tput (multi-cap and forced two-fork
paths) all return columns 266 rows 66; get_size x3 consistent (pre-fix same
harness: first call malformed, user-reported columns {} thereafter). Windows
piped smoke: sttysize errors cleanly, tput fallback accepted, get_size
consistent 80x24 defaults, no errors. make.tcl modules mint OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
7 days ago |
|
|
3cd6808c73 |
shellfilter 0.2.5: fix transchan clear/flush defects corrupting unix repl output
tee_to_pipe declared the transchan 'clear' op; the Tcl core delivers 'clear' before every write when declared (the G-145 defect class - see goals/archive/G-145-piped-usage-ansi-remnants.md) and the handler discarded o_encbuf, the held partial multi-byte character. The following chunk then began with orphan continuation bytes and could never decode (the tail-backoff only trims the end), so whole chunks accumulated in o_encbuf and successive clears discarded them - eating contiguous multi-KB ranges of multibyte-dense output on the unix repl console stack: 'i <cmd>' help tables displayed with missing paragraphs, fused mid-word seam lines, or truncated bottom rows (WSL and native linux ttys; windows unaffected). Isolation repro: 393/600 lines lost with clear-per-write vs 0/600 without. - tee_to_pipe: 'clear' no longer declared in initialize, so the core never delivers it (same shape as the G-145 fix in ::punkboot::ansistrip); the method is kept as a state-preserving no-op with a warning comment. - flush repaired in tee_to_pipe, tee_to_log and logonly: all three referenced an undeclared o_buffered variable (copy-paste from the o_buffered-bearing ansiwrap/ansistrip classes) and threw on every invocation. Each now holds an undecodable partial char in o_encbuf for the next write and emits any decodable remainder per its class semantics. - Verified: transform isolation harnesses clean at all chunk sizes with clear-per-write; WSL end-to-end (linux kit visitor mode on a script(1) pty) shows all previously-missing define/list table content present; 'make.tcl modules' mint OK. - shellfilter-buildversion 0.2.4 -> 0.2.5; punkproject 0.49.3 -> 0.49.4 with CHANGELOG entry; G-090 Context records the finding as audit evidence (no characterization tests exist yet for these transforms - G-090 scope). Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
7 days ago |
|
|
40283ca082 |
G-160: closeout evidence + DOX + punkshell 0.49.3
Detail-file Progress section records the settled decisions (tokenid mechanism + seeding removal, token-map O(1) dispatch with source-level verification note and parked-dispatch side effect, Delete_stack error semantics, Rename_stack 1/0 returns, channel-discipline scope incl the gated remove_rename anomaly warning, known_renamers reconciliation rationale, did_rename shape, commandstack::next design, the pins-updated-minimally interpretation) and the verification evidence (33/33 + 6/6 on tclsh90/punk86, live punk91 src smoke, mint). src/tests/modules/AGENTS.md: commandstack entry rewritten for the 0.6.0 fixed-behaviour contract (GAP language retired); packagepreference entry gains installguard.test. punkshell 0.49.3 + CHANGELOG (commandstack 0.6.0, packagepreference 0.2.1). Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
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 |
|
|
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 |
|
|
a5f60ce4b1 |
G-032 ACHIEVED 2026-08-03: launcher help + parsed subcommands (core 0.3.0, 0.48.0)
The kit launch surface dogfoods punk::args. Boot core 0.2.1 -> 0.3.0: new built-in 'help' subcommand + '-help' / '<subcommand> -help' render tabled usage from the moduledoc::punkexe ids plus live registrations (per-kit resolved_def clones (script)::punkexe.launcher/.launcherhelp); unknown first arg naming no existing file (and no lib:* reference) is refused with usage (stderr exit 1) instead of a silent script attempt; buildinfo enforces its no-arguments contract through punk::args (pinned one-liner + tabled usage, exit 2 unchanged). Registration extension ::punkboot::project_subcommand_info (summary/argsid/package/parse - documented by moduledoc::punkboot 0.2.0): project subcommands appear in help by registration alone and may opt arguments into declared parsing. Carve-outs: tool-style kits keep help flags routed to their processor (tomlish parity); tclsh intercepts a help flag only as sole argument (stock dash parity); argsid-less registrations keep -help passthrough. G-030 degradation doctrine: lazy guarded requires (normal boots never load punk::args), PUNKBOOT_PLAIN=1 hook, plain-list fallback, rendering degrades independently of parsing. 8.6 trap fixed en route: punk::args choices-grid render needs punk::lib's lpop shim - guarded require added (verified tabled help on metakit punk86). moduledoc::punkexe 0.4.0: (script)::punkexe::help definition; top-level refusal rule + help discovery; per-subcommand -help notes; buildinfo rejection shape; passthrough-vs-parsed decision recorded. Verified on zipfs (punk902z, punk91) and metakit (punk86) kits; launcherhelp.test 22/22 (incl fake-thin-main registration harness + metakit leg); punkexe subtree 140/136/4skip/0fail; full suite failures (4) are pre-existing in untouched subsystems. Goal flipped achieved + archive record + live-tier sweep (G-038 rewrite, pointers to G-077 and G-089); detail-file move to goals/archive follows as a pure rename. Layout _config trio + _vfscommon core seed hand-swept (byte-identical to masters). GOALS.md staged as the G-032-removal hunk only - the uncommitted G-159 draft entry is left to its author. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
bba10012a0 |
G-111: modpod 0.1.6 tidy + first test baseline (0.47.2)
Tar-era connection API removed from modpod (connect/disconnect/get, system::connect_if_not/myname/myfullname - broken since the tarjar era, no callers anywhere); is_valid_tm_version fixed (versionparts substitution error); make_mountable_zip debug output removed (the undeclared ansistring dependency made -offsettype file error under the module's declared deps; stray ::last_header global gone); struct::set dependency dropped; module greps tarjar-free. The load stub gains the unwrapped #modpod-<pkg>-<ver> redirect: an extracted folder beside the .tm is sourced directly - loads with neither zipfs nor vfs::zip available. Re-vendored 0.1.6 through the established channels (modpod checkout mint -> vendormodules -> bootsupport -> modules staging -> vfscommon). First modpod testsuite at src/tests/modules/modpod/testsuites/modpod/roundtrip.test: wrap/load round-trips - real-disk + zipfs module paths, both -offsettype forms, unwrapped redirect, probe-discovered binary payload (no committed binaries). Green: punk91 tcl9.1 kit 7/7, native tclsh90 7/7, punk86 8.6.17 6/7 (zipfs-container test skips on 8.6 - recorded per G-034). G-111 activated at user request (activation overlap survey recorded); per-defect dispositions, run evidence and tarjar-artifact assessment proposals in goals/G-111-modpod-tidy-tests.md - artifact dispositions await user confirmation. GOALS.md G-111 Scope version reference repaired to glob form per goals-system v3 drift rule. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
3cf37a1674 |
G-031 boot core 0.2.1: graceful missing-app-package subcommand arms (0.47.1)
shellspy/punk/script/shell report the missing package by subcommand name and exit 1 instead of a raw package-require trace - found adopting the shared core in the tomlish kits (app-tomlish only; proven there first, master replay identical by diff). Layout _config/_vfscommon copies refreshed. tomlish adoption itself is committed in its own fossil (bbc68a3f) - the G-031 derived-project proof. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
169f064621 |
G-025 landed + G-031 moduledoc: buildinfo self-report (stamp/live/source/runtime-record) + runtime-queryable boot-core API doc (0.47.0)
New punk::buildinfo 0.1.0 = the single implementation (dependency-free; works in kit shells, the script env, repl code interp and tclsh-hosted shells): punkkit-stamp.toml kit stamp + live facts + governing punkproject.toml version (live_vs_stamp=same|differs) + inherited G-117 punkbin-artifact.toml record, emitted as key=value lines; absence explicit (stamp_present=0), never fabricated. make.tcl bake writes the stamp at the payload root after the G-125 gate - deterministic (NO time-of-bake field, per the G-117 embedded-record precedent; identical inputs stamp byte-identically). Boot core 0.2.0: buildinfo builtin (exit 2 on args, exit 1 unavailable, else prints report + exit 0) and publishes ::punkboot::boot_state (core_version, main_script, package_modes, proj_scope, proj_root, kit_payload_base, src_project_root) - the single boot running-state surface G-089 anticipated. Wiring: aliascore 0.2.0 buildinfo alias, repl 0.5.4 preloads punk::buildinfo (bootsupport include_modules.config gains punk::buildinfo - a repl 0.5.4 snapshot without it broke tclsh-hosted shells, caught and fixed), moduledoc::punkexe 0.3.0 documents the subcommand. New punk::args::moduledoc::punkboot 0.1.0 (G-031): thin-main contract + registration model + live defs for the persistent ::punkboot procs - all six ids resolve in-kit via punk::args::get_ids after update_definitions. Verified: module fixtures 8/8 (report.test); punkexe suite 118 total 114 pass 0 fail incl new buildinfo.test (stdout-only + exit 0, stamp fields, RENAMED-COPY reports its stamp, args rejected exit 2); punk902z + punk9_beta bakes stamped (punk9_beta cites runtime build_id 635e7951... + r2 artifact name from the inherited record); tclsh-hosted 'make.tcl shell' reports stamp_present=0 with real host exe + live project version; double-bake stamp sha1-identical. Layout _config/_vfscommon core copies refreshed 0.2.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
c1b7359c28 |
G-031 increment 3: project_main.tcl thin sample + layout _config sweep + boot-entry guidance (0.46.0)
project_main.tcl reborn as the heavily commented thin-main sample (1132-line 2025-vintage monolith retired): ==CUSTOMIZE== blocks for project_subcommands and launch_defaults with worked tool-style examples, fauxlink/rename guidance, boot-core do-not-fork note, opt-out story incl the collision rule. Layout project-0.1 _config hand-swept (outside sync channels per the 0.43.0 lesson): thin punk_main.tcl + sample + punkboot_core.tcl master, punkboot/core.tcl seeded in the layout _vfscommon.vfs; templates modpod mirror synced by the modules step. Boot-entry guidance sections added to src/vfs/README.md (repo and layout voices) covering the recommended _config-behind-the-fauxlink path, plain root main.tcl alternative, one-startup-script rule, _config inertness; src/vfs/AGENTS.md refreshed (ownership split, collision gate, G-129 derivation now consolidated in the core). E2E on a freshly generated punk.project project (punk902z src script recipe, FOSSIL_HOME diverted, shallow c:/T dir): generation completes incl fossil initial commit; the project boots through its own _config trio via the sibling master (core 0.1.0); a 'demo' subcommand added by editing ONLY the generated thin main at its customization points dispatches in all three launch forms (explicit args, bare via noargs, unknown-first via unknownfirst). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
adeb3e9f29 |
G-031 increment 2: componentized kit boot - thin main + shared boot core (0.45.0)
punk_main.tcl is now the thin project-owned main: publishes launch_args + main_script, declares (empty) project_subcommands and launch_defaults at ==CUSTOMIZE== points, locates the boot core and sources it. Core candidates: <vfsroot>/punkboot/core.tcl (in-kit via the _vfscommon merge), parent-dir punkboot/core.tcl (nested app/main.tcl, undroidwish G-129), sibling punkboot_core.tcl master (source-tree execution - the kitmountpoint characterization shape). punkboot_core.tcl carries the boot machinery extracted verbatim from the monolith; delta beyond extraction: contract preamble with serviceable defaults, normscript from ::punkboot::main_script instead of [info script], registration-model subcommand selection (project additions merge in, built-ins cannot be shadowed, declared noargs/unknownfirst defaults) with a dispatching default arm, ::punkboot::core_version 0.1.0. make.tcl vfscommonupdate now regenerates _vfscommon.vfs/punkboot/core.tcl from the _config master. Parity evidence: full punkexe suite 110 pass / 0 fail against freshly baked punk902z; kitmountpoint 4/4 across 8.6-backport / 32-bit-modern / 64-bit runtimes incl the unattributed-mount stderr pin; registration model exercised end-to-end via a scratch kit; 11-kit default bake with only known-baseline warnings; punk86 (metakit/starkit, tcl 8.6.17) smoke green. cookfs branch carried verbatim - no cookfs kit is currently mapped in mapvfs.toml to exercise it (stale bin/punk9cook.exe is an old vintage, untouched). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
1d08333721 |
G-031 increment 1: startup-script collision gate - bake refuses two root-level main.tcl suppliers (0.44.0)
A source .vfs carrying an actual root main.tcl AND a root fauxlink resolving to main.tcl (or several such fauxlinks) baked whichever boot script merge traversal met last - merge_over's fauxlink branch overwrites without warning. New punkboot::utils::vfs_startup_script_report (0.7.0) censuses root startup-script suppliers by RESOLVED fauxlink name (empty-nominalname links included; nested app/main.tcl exempt per G-129). make.tcl consumes it with the same guarded-require degradation as the G-125/G-133/G-134 checks and refuses affected kits per-kit under FAILED KITS before any build product is written - kits from other folders proceed, deployed binaries untouched. Fixture characterization: startupscript.test (12 tests incl. a real-source-tree sweep proving today's folders are collision-free); bootlibrary.test re-run green. Outputs (mint 0.7.0 + bootsupport/vfscommon promotion) follow in a separate commit. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
731532fdb5 |
package_mode 'dev' -> 'minted' (clean break, no alias) - punkshell 0.43.0
Stage-true mode set: src / minted / internal / os. Both _config mains (all_package_modes, mode gates, proj: rebind, comments; unix /dev path and 'dev modules' magic-version prose untouched), punkexe moduledoc 0.2.0, bin/ARCHITECTURE/vfs AGENTS docs, make.tcl K7 + guidance. Layout _config copies hand-swept incl the previously-missed G-155 _bake comment fixes (_config is outside the thin-layout sync channel - G-027/G-156 note). Also fixed a stray _build residue in src/AGENTS.md bakelist prose. Versioning: minor by deliberate alpha exception despite changed launch invocation (user-directed). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
9d1ece3dca |
G-155 achieved flip (edits): status + final evidence, index entry -> GOALS-archive record, G-156/G-131 reference sweep, punkproject.toml 0.42.0 + CHANGELOG, bake-product test-pin fixes, layout make.tcl sync riders
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
0817343f84 |
Goals: G-146 activated + achieved 2026-08-02 (user-directed) -> archive; punkshell 0.41.4
Single-session lifecycle: user-directed activation (activation-freshness xref survey recorded in the detail file), implementation, acceptance verification. Acceptance met: punk.project + punk.basic (plus minimal/sample-0.1) trailing fossil initial commits complete cleanly with FOSSIL_HOME diverted; generated projects carry versioned binary-glob; seeding path decided (hand-authored per-layout payload, derivation rejected as semantic coupling) and documented; G-136 relationship recorded. Companion crlf-glob finding and decisions in the detail file. Index entry archived to GOALS-archive.md; the detail file's goals/ -> goals/archive/ move follows as a pure rename. punkproject.toml + CHANGELOG 0.41.4 (patch: generated-project fix). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
f4e23418d5 |
G-152 punk::args 0.14.0: sound suffix-viability verdicts (achieved + archived)
Multiform per-form failure statuses (formstatus records, noformmatch errorcode
classes + -formerrors) are now sound suffix-viability verdicts: 'incomplete'
(viable) iff every supplied word was validly consumed as a prefix of the form
and the failure is pure exhaustion at end-of-input; anything already supplied
contradicting the form reports 'invalid'. Mechanism: viability-probe mode on
private::get_dict_form suppressing only the position-guarded pure-exhaustion
raises (count min-shortfalls, missing-required checks, adhoc option value at
end) while final validation of the consumed words stands as the soundness
backstop; multiform candidacy and parse_status's single-form formstatus record
confirm each classify-'incomplete' failure with one probe re-parse. Rendered
noformmatch form lines marked '(viable - needs more arguments)'/'(not viable)'
after the stable "form '<fid>':" anchor. Consumer contract documented in the
parse ('Multiform failure contract') and parse_status argdocs. Documented
conservatism: input ending inside a multi-member type clause reports invalid.
New testsuite formviability.test (acceptance scenarios, option position
guards, single-form record soundness, clause conservatism, message marking);
forms.test verdict pins deliberately updated (ms/idle incomplete->invalid for
type-screen rejections). punkshell 0.41.3 (patch: refined multiform error
classification/reporting at the shell surface).
Goal G-152 activated (user-directed) and flipped achieved 2026-08-02 with
acceptance verified via runtests (args subtree green; full-suite parity with
stashed baseline); entry archived to GOALS-archive.md, detail file to
goals/archive/ with verification evidence; consumer pointers pushed to
G-044/G-150 notes.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
72d6815492 |
make.tcl overview: interim single-column layout (cell-wrap revisit noted)
User decision: -choicecolumns back to 1 on both the rich overview and the lean dispatch definition - the long one-line summaries make the two-column layout too wide without table cell wrapping. Revisit -choicecolumns 2 when cell wrapping is implemented; the '## FORM' header-line dropping in the overview cells is accepted. Max render width drops ~250 -> 168 columns. help/colour suites 16/16. punkshell 0.41.2. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
157715fadd |
make.tcl: rich top-level help overview (i info style)
User-directed: bare 'make.tcl help' / 'make.tcl' / '-help' now render a per-subcommand overview in the repl 'i info' style - each cell carries the subcommand's one-line summary plus its own auto-generated bracket-notation synopsis line(s) (per-form lines for the multi-form tool/buildsuite), grouped by the existing SUBGROUPS in two columns. Stock punk::args machinery: rich -choicelabels built at lazy resolve time by ::punkboot::argdoc::overview_labels (punk::args::synopsis -noheader per subcommand id, '## FORM' headers dropped for compactness) + -choicecolumns 2, hung on the separate (script)::punkboot.overview id so the label cost (a few ms) is paid only when the top-level help renders - the lean (script)::punkboot definition remains the dispatch surface (now also -choicecolumns 2 for its unknown-subcommand error render) and is deliberately excluded from the capability probe. Plain PUNKBOOT_PLAIN fallback help unchanged. maketclhelp toplevel test updated to pin the overview (tool/buildsuite form synopsis lines, ESC-free); help/colour/bakelist suites 25/25. punkshell 0.41.1. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
13dc78191b |
make.tcl: restricted kitname choices + single memoized mapvfs read
User-directed pair completing the declaration-authoritative arc: 1. bake/bakelist kitnames are -choicerestricted 1: the configured kit names + @group selectors (computed into the declaration when the mapping parses at definition time) now GATE at dispatch - an unknown kit is a punk::args choice error before any build (the no-build guarantee moves to the gate), unambiguous prefixes resolve to canonical names, and the dry-run help mirrors the verdict ('help bake punk91 -confirm 0' is now a pointed choice error naming '-confirm' rather than a value-swallow). The handlers' own validation remains the backstop where declarations cannot gate: PUNKBOOT_PLAIN degraded mode, and a definition-time mapping-read failure (the choices clause is omitted entirely - no gate). 2. All kit-mapping consumers share ONE memoized parse per invocation: new punkboot::lib::mapvfs_model front door (locate+parse, keyed by resolved mapfile/rtbase/sourcefolder/target - a PUNK_MAPVFS_CONFIG override keys its own entry) consumed by the definition-time choices (now passing the real bin/runtime rtbase - mapvfs_parse is pure, so the models are interchangeable) and the five handler sites (selective bake, main bake, bakelist, vfslibs %platform% derivation, check smoke listing). Success is cached; a throwing parse deliberately is not, so each caller diagnoses fresh. maketclbakelist.test: unknown-name pins updated to the dispatch choice error + PUNKBOOT_PLAIN backstop variants (runner gains envoverrides); maketclhelp.test: bake dry-run case now pins the choice-gate rejection and 'help bake punk91' acceptance. Full punkexe subtree 114 tests, 0 fail. punkshell 0.41.0. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
120ca92b49 |
make.tcl help: pure dry-run + received-args report (G-143 follow-up)
User-directed: the bare-action carve-out is removed - 'make.tcl help
buildsuite build' now falls through to the punk::args diagnosis like any
other incomplete line (exit 1). Empirically the error table carries the
form's argument rows alongside the all-forms synopsis and per-form
reasons, so the diagnosis IS the form documentation and the carve-out
bought nothing but an exit code. Accepted lines gain a one-line
received-args report after the usage table, built from the parse
result's 'received' key (defaulted opts omitted):
'dry-run: line accepted (form build) - action = build | -test = 0 |
toolname = punkzip'. This makes punk::args' value-swallow visible
('kitname = punk91 -confirm 0' for the out-of-order line) - an interim
make.tcl-side clue until punk::args grows an annotated success render.
bake/bakelist kitname -choicerestricted 0 confirmed deliberate
(discoverability-only choices; handler validation authoritative;
define-time mapvfs parse best-effort). maketclhelp.test pins updated;
help/tool/colour suites 20/20. punkshell 0.40.3.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
1 week ago |
|
|
0604d23729 |
make.tcl help dry-runs the supplied command line through the declaration (G-143 follow-up)
User-directed second refinement: 'make.tcl help <subcommand> ?arg ...?'
(and '<subcommand> ?arg ...? -help') now parses the words through the
subcommand's punk::args declaration exactly as dispatch would (form
auto-selection, choice prefixes). An accepted line renders the matched
action's single-form usage ('help tool build -test 0 punkzip', 'help
tool bu'); a rejected line (unknown action, option-first line, unknown
flag in option position) emits the same punk::args noformmatch
diagnosis dispatch gives - all-forms synopsis plus per-form reasons -
on stderr, exit 1: the error table is itself usage documentation, so
help verdicts mirror dispatch verdicts. Carve-out: a bare action
word/prefix renders its form directly, since forms with required
values ('buildsuite build' needs a suitename) would fail a strict
dry-run. Replaces 0.40.1's leading-word-only selection and option-first
whole-usage fallback. Empirical punk::args findings recorded (archived
goal file + probes): flag-like words at/after the first value position
parse as values; -regexprepass/-regexprefail are honoured during form
matching (a '-regexprefail {^-}' value disambiguates flag-led lines -
the punk::auto_exec::hash latent selection ambiguity). maketclhelp.test
pins updated; help/tool/colour suites 20/20. punkshell 0.40.2.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
1 week ago |
|
|
77485434ef |
make.tcl help takes the subcommand's own command line (G-143 refinement)
User-directed reshape of the help-depth interface: 'make.tcl help
<subcommand> ?arg ...?' (and '<subcommand> ?arg ...? -help') now accepts
the subcommand's command line as typed and renders the usage most
specific to it - 'make.tcl help tool build -test 0 punkzip' shows the
tool build form via its leading action word (the same literal-leader
word punk::args form auto-selection keys on at dispatch). Words after
the action are tolerated and ignored; an option-first line falls back to
the whole subcommand's usage; single-form subjects (e.g 'help bake
punk91 -confirm 0') ignore the words entirely; an unknown action word on
a multi-form subject stays a pointed exit-1 usage error. The 0.40.0
numeric form-index acceptance ('help tool 2') is withdrawn as
unintuitive. Probe recorded: the repl 'i' (punk::ns::cmdhelp) tolerates
trailing argument words but does not form-narrow flat multi-form
commands - make.tcl help now exceeds it there. maketclhelp.test pins
updated (12 tests, all green + tool/colour suites); punkshell 0.40.1.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
1 week ago |
|
|
6711302b5c |
G-143 achieved: make.tcl multi-form tool/buildsuite definitions + per-action help depth
tool/buildsuite/help are multi-form punk::args definitions (one @form per action, literal single-choice action leaders + choicelabels): 'help tool' / 'help buildsuite' render one synopsis line per action; 'make.tcl help <subcommand> <action>' - equivalently '<subcommand> <action> -help', or a 0-based form index ('help tool 2') - renders that action's single-form usage; unknown actions and out-of-range indexes are pointed punk::args errors (exit 1). tool dispatch parses through the definition (unknown actions/flags: exit-1 usage errors). User-approved deviation: the declared positional model puts options before tool names ('tool build -test 0 <name> ...'); docs/agent guidance updated to match and a flag-shaped tool name earns a stderr hint; the PUNKBOOT_PLAIN degraded scan keeps the historic flag-anywhere parse. buildsuite driver-arg passthrough unchanged. G-144 consumer follow-through: all 17 per-subcommand @form -synopsis overrides retired (automatic @cmd -name bracket-notation synopses; top-level make.tcl override kept deliberately). Pinned by new punkexe/maketclhelp.test (12 tests); full punkexe subtree green (114 tests, 0 fail). Goal flipped to achieved and archived; punkshell 0.40.0. Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
1 week ago |
|
|
543dd1df40 |
G-144 achieved: punk::args auto-synopsis @cmd -name fallback for (script) ids
Auto-generated synopses for (script)-prefixed constructed definition ids now lead with the declared @cmd -name (the invocation name - e.g 'make.tcl modules' for (script)::punkboot::modules) instead of the raw id, across punk::args::synopsis full/summary renders and the usage/arg_error synopsis sections that funnel through them (punk::args 0.12.7 -> 0.13.0). The fallback is gated on the (script) prefix only (user-confirmed narrowing): (autodef) ids are excluded - their id-minus-tag IS the invocation (arg_error's existing tag strip surfaces it) while their @cmd -name is a display label ('destroy', 'Object: ::x'); (shared)/(package)/(default)/(widgetcommand) doc ids declare no invocation-style -name today and render the id as before. Real command ids render byte-identical (full args testsuite passes with no pin updates). Six new synopsis.test pins: (script) full/summary/multiform/ surfaces, no-name constructed id, autodef unchanged, real-id byte-identical. Goal tiers: index entry archived to GOALS-archive.md, detail file moved to goals/archive/ (G-143's pending-tense Related line rewritten to reflect achievement + follow-through pointer: make.tcl's @form -synopsis overrides are now optional, retirement under G-143 or a follow-on edit). Docs: @form -synopsis directive known-case text, synopsis -help, src/modules/AGENTS.md ergonomics bullet. Project 0.39.5 -> 0.39.6 (patch: latent capability, no shipped definition renders differently today). Bootsupport refresh (make.tcl modules + bootsupport): snapshot gains args-0.13.0.tm and picks up two lagging source syncs - mix/commandset::layout 0.2.0 -> 0.3.0, mix/commandset::project 0.4.0 -> 0.4.1, and the shellfilter 0.2.4 G-145 comment; superseded copies pruned. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
1 week ago |
|
|
24bc272c93 |
G-012 achieved: inert VCS-config template payloads + layout gitignore refresh
Layout .gitignore payloads are now stored inert as gitignore.in and
materialized to .gitignore at project generation, ending the
self-censoring-template hazard (live nested .gitignore files silently
untracked template content in git while fossil managed it fine):
- punk::mix::commandset::layout 0.3.0: layout_materialize_renames map;
layout_stage_chain renames inert payloads after composing all overlay
layers (.anti markers keep targeting store names); layout_materialize
withholds the in-place fast path from inert-payload folders so the
store is never renamed; inert+live name conflict errors loudly
- make.tcl thin-layout sync refreshes every vendor/punk layout's
gitignore.in from the canonical repo-root .gitignore (punkcheck-tracked
sync_layouts events); workflow text updated
- the four vintage payload variants eliminated as drift: all payloads
now byte-identical mirrors of root; modpod copy carried and its stale
.gitignore pruned
- materialize.test +5 G-012 characterization tests (25/25; mix subtree
71 pass / 1 known skip)
Verified end-to-end: generation from each affected layout yields a
byte-identical .gitignore (othersample .anti case yields none); root
edits propagate to payloads via make.tcl libs in both directions; the
|
1 week ago |
|
|
15a7e27acb |
G-145 achieved: ansistrip transform drops 'clear' op - remnant-free piped help
The Tcl core delivers 'clear' to a transform stack before EVERY write op
(output-buffer flush-down; tclIORTrans.c ReflectOutput, gated on METH_CLEAR -
intentional and test-pinned, but under-documented: doc/transchan.n and TIP 230
scope clear to seek/read-side buffers). ::punkboot::ansistrip::transchan's
clear handler ran 'dict unset carry $chanid', discarding a split sequence's
held ESC tail at every write-chunk boundary: the next chunk's ESC-less
remainder ('0;1m', '1m') passed through unstripped as orphan fragment text in
piped usage tables, while the dropped ESC bytes kept the G-113 zero-ESC pin
green. The transform is write-only with no read-side state, so its
contract-conformant clear is a no-op - it no longer declares the op, the
per-write calls never fire, and the split-sequence carry survives every chunk
boundary. finalize still drops an end-of-stream partial sequence. No change in
textblock/punk::ansi (pre-transform stream verified well-formed during
diagnosis; exonerated).
Pin: maketclcolour.test gains maketcl_colour_help_tables_zero_remnants -
piped 'tclsh src/make.tcl help' for all 20 declared SUMMARIES subjects plus
bare 'help'/'-help', asserting exit 0, zero ESC bytes, zero orphan fragments
(two-step detector: strip complete sequences, then scan for [0-9;]+m not
preceded by ESC or an open bracket - a raw scan false-positives on ';1m' inside complete
multi-parameter SGR). Failing-first evidence: pre-fix the pin names exactly
the 5 fragmenting invocations (help, -help, help libs, help info, help
bootsupport); the 22-invocation NO_COLOR+PUNK_FORCE_COLOR pre-transform
corpus carries no legit text matching the detector.
Verified (tclsh 8.7a6, win32-x86_64): all 22 invocations byte-level clean;
PUNK_FORCE_COLOR=1 output intact (1177 complete sequences, 0 orphans); the 3
G-113 colour-policy pins pass unchanged; shell/testsuites/punkexe family (15
files, 102 tests) and shell/*** (127 tests) green, warnings pre-existing only;
'make.tcl packages' verified, layout + modpod make.tcl copies synced by the
build (punkcheck-managed outputs batched here per the carve-out).
Bookkeeping: goal flipped active -> achieved 2026-08-01, detail file archived
(goals/archive/G-145-piped-usage-ansi-remnants.md), G-056 Notes gains the
exoneration pointer; src/AGENTS.md colour bullet + src/tests/shell/AGENTS.md
suite description updated; project version 0.39.4 (patch) with CHANGELOG
entry.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
|
1 week ago |
|
|
320add60ad |
make.tcl argdoc restyle: braced -& definitions with tstr placeholders; centred Descriptions
Convert every ::punkboot::argdoc punk::args::define to the braced file-style
block form established for the shell/tool definitions in 7ec7da4a: -& record
continuations, -summary/-help pulled from SUMMARIES/HELPTEXTS via tstr
placeholders, shared OPT_* option fragments interpolated as ${$OPT_...}
records. The SUBOPTS/OPT_SYNOPSES/VALUES_SYNOPSES/SUBVALUES tables and the
define loop are unrolled into 16 per-subcommand blocks; buildsuite/help and
the top-level definition follow the same idiom (help gains a HELPTEXTS entry;
the top-level body moves to argdoc's TOPLEVEL_HELP variable). @normalize is
dropped: -help bodies are display fields (punk::args G-046 deferred
expansion), so the HELPTEXTS block indentation now reaches the rendered
Description verbatim - every 'make.tcl help <subcommand>' Description renders
centred like 'make.tcl help tool' instead of left-aligned.
No parsing or interface changes: option/values specs, synopses, exit codes,
prefix resolution, unknown-flag/subcommand errors, PUNKBOOT_PLAIN degraded
mode and the capability probes all verified unchanged (before/after usage
captures diffed for all 20 help subjects; shell/tool byte-identical). Narrow
usage tables widen slightly to fit the indented Description.
KITNAME_CHOICEPART persists as a namespace variable because the kitname
records interpolate it at (lazy) definition resolve time.
Docs: src/AGENTS.md make.tcl bullets updated (braced-def contract, per-block
maintenance rule); src/modules/AGENTS.md G-045 subsection re-points the
@normalize exemplar to punk.tm only and records argdoc as the braced -& +
tstr exemplar. punkshell 0.39.3 + CHANGELOG entry. Thin-layout make.tcl
copies resynced via 'make.tcl libs -confirm 0' (basic, project-0.1, modpod
templates copy - byte-identical).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
7ec7da4a5a |
make.tcl tool build: stamp installed exe mtime so the bin freshness state can clear
tool_install_state judges bin/<tool>.exe current/stale by comparing its
mtime against the newest file anywhere in the tool tree. Two layers kept
that exe mtime frozen at the original link time: a zig cache-hit rebuild
does not rewrite the zig-out artifact, and Tcl's 'file copy -force'
preserves the source mtime (Windows CopyFile semantics). Once any
non-build-input file (e.g. PROVENANCE.md, edited after the G-128/G-135
doc passes) was newer than that link time, the tool was reported 'stale'
permanently - repeated 'make.tcl tool build' runs (field-observed
2026-08-01) reinstalled a timestamp-identical artifact and never cleared
it.
Fix: after the install copy, stamp the installed exe with the install
time ('file mtime $exe [clock seconds]'), making the state measure what
it means - installed since the last change in the tree. Also self-heals
mtime churn from branch switches/fresh clones on the next build.
punkshell 0.39.2 + CHANGELOG entry (patch: build-tooling bug fix).
Thin-layout make.tcl copies resynced via 'make.tcl libs -confirm 0'
(basic, project-0.1, modpod templates copy - byte-identical).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
7cb0dc1333 |
make.tcl: remove deprecated 'project'/'vfs' aliases (G-112 transition window closed)
The G-112 stage-true rename (0.23.0) kept 'project' -> bakehouse and
'vfs' -> bake as transitional aliases until the 8.6 arc completed; that
arc landed with G-099 and the new shape is settled. All alias plumbing
is removed from src/make.tcl: known_commands, the pre-dispatch mapping
switch, the punk::args definitions (SUMMARIES/HELPTEXTS/SUBOPTS/
SUBVALUES/VALUES_SYNOPSES), the "deprecated aliases" help group, the
plain-help block, the workflow-text mention and the degraded-mode
kitname collection. 'vfs' now gets an unknown-subcommand usage error;
'project' prefix-resolves to the read-only 'projectversion' check under
punk::args unambiguous-prefix matching (PUNKBOOT_PLAIN degraded mode
rejects both). Also trimmed a pre-existing trailing space (line 8990)
surfaced by git diff --check via the verbatim layout copies.
Docs: src/README.md, ARCHITECTURE.md, src/AGENTS.md (alias mentions
removed; also corrected the stale layout-sync trigger claim - the
thin-layout sync runs in modules/libs/packages/bakehouse, not
bootsupport), root AGENTS.md sync-step subcommand list ('project' ->
'bakehouse'). Historical records (CHANGELOG 0.23.0 entry, goals
archives, GOALS-archive) deliberately untouched.
punkshell 0.39.1 + CHANGELOG entry (make.tcl interface change - patch
per root AGENTS.md versioning policy).
Build outputs batched per src/AGENTS.md: thin-layout make.tcl copies
resynced via 'make.tcl libs -confirm 0' (basic, project-0.1, modpod
templates copy - all byte-identical to src/make.tcl), plus the lagging
store->modpod catch-up the same run performed (modpod layout copy:
mapvfs.config removed, mapvfs.toml + vfs/README.md added).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 week ago |
|
|
d953ce5c07 |
G-127 increment 4: docs + records; punkshell 0.39.0
- bin/AGENTS.md: "Cross-target kit outputs (bin/kits/<platform>/)" contract section (locations, coexistence, ignore coverage, relocations + orphan note) - src/AGENTS.md: target-keyed output bullet beside the G-122 host/target material (locations, name-spanning selection, %platform% payload axis) - make.tcl workflow text per its update contract: [K9] output split, [K8] untracked additions, .vfs.toml %platform% line; bakelist helptext + report header name the kits/<platform>/ tier (both renders verified, width ok) - punkproject.toml 0.38.0 -> 0.39.0 + CHANGELOG entry (minor bump: new declaration capability + relocated cross-target outputs) - goal detail Progress: G-023 reconciliation stated (versioned outputs compose with the platform tier; release gate checks per-kit deploy dir), punkshell902 + verify-ix86 relocation records finalized, punk9linux migration decision recorded (declared where a governed tier exists, hand-curated tcltls/tdom/ thread drop-ins pending G-116/G-004) Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |