Tree:
43973fa5fd
master
v0.1a
${ noResults }
1555 Commits (43973fa5fdbb68482fdaff9530e5ce7ff7fca73f)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
a58d0117f4 |
Add punkpath agent skill: PATH-executable resolution + Tcl-command clash diagnosis
A new .agents/skills/punkpath/SKILL.md (canonical) with a byte-identical
.claude/skills/punkpath/SKILL.md copy for Claude Code discovery (verified
sync with a plain diff). Models the tcl-whatis/tcl-nslist shape: a single
~0.7s side-effect-free punkshell invocation answering two questions agents
guess wrong:
1. Which PATH executable a bare command name actually runs, and what
shadows it (overshadowed/overshadowed_by entry-idx fields). This is
the diagnostic companion to the tcl-runtests warning that bare tclsh
from a Bash tool often resolves to the MSYS tclsh - the skill gets
the machine-readable verdict on which copy wins instead of guessing.
2. Whether a PATH executable clashes with a Tcl command (tcl_conflicts
command:match=exact|nocase) - the 'invalid command name X' where X is
X.exe on PATH (dir/sort/find/clip).
Documents the -return json/text/dict forms, the -pathglob/-conflicts
filters, and the -context lever (G-173: pass it for a stable conflict
verdict through a wrapper/one-liner; the default-caller namespace is for
interactive use). Scope kept tight to PATH-resolution and Tcl-command
clash; explicitly disclaims being a general 'what is installed' tool.
No root AGENTS.md index change (the .agents/skills/ entry is generic and
does not list individual skills, matching the tcl-whatis/tcl-nslist/
tcl-runtests handling).
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
3 days ago |
|
|
d4d70d3808 |
G-173 (achieved 2026-08-07): flip punk::path machine-parsable returns to achieved + archive
All acceptance criteria verified on tclsh9.0.5-punk (Tcl 9) and tclsh86ts (Tcl 8.6): existing path.test 67/67 green (table output byte-unchanged), pathcmd.test 7/7 (dict/json shape, ansi-freeness, round-trip parity, -context stability), full runner/testsuites/parser suite 23/23. Detail file moves to goals/archive/; GOALS.md entry moves to GOALS-archive.md (newest-first). Reference sweep: G-064 (proposed, the sibling lib.search -return dict/json goal) carried an open json-serialization-mechanism question that G-173's tcllib json::write decision resolves - added a pointer to G-064's Notes. Follow-on recorded (open): apply linecont_lint to the 46 remaining pre-existing line-continuation findings in punk-999999.0a1.0.tm (tech debt predating G-173, outside its edit sites). Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
f945bb12ca |
G-173 closeout: remove proc-body line-continuations; add linecont_lint + mandate -& doc blocks
The G-173 structured-renderer procs (path_conflicts_for_exe, path_entries, path_render_text, path_render_json, and the punk::path dispatch tail) were authored with \ line-continuation backslashes in proc bodies, violating src/modules/AGENTS.md (debug line-number matching). Refactor every G-173 helper to the dict-create + dict-set accumulator and json::write accumulator idioms so no proc body uses a trailing \. A stray continuation introduced at line 6752 (return [punk::path_machine_return ...]) is replaced with an lappend accumulator + expand. The user's doc-block edits convert the punk::path punk::args::define block from \ continuations to -& record- continuation markers with manually wrapped help text (table-width safe). Add scriptlib/developer/linecont_lint.tcl, a linter that flags \<newline> continuations outside punk::args doc blocks. It resolves a real Tcl parser (the C tclparser library, or punk::lib's pure-Tcl punk::tclparser fallback) and locates doc-block spans structurally (punk::args::define brace arg, lappend PUNKARGS command range) so the exemption is not a regex guess; comment-line trailing \ is also exempt. Sourceable linecont_lint_run proc with a script-mode guard; run as a script it exits 0 clean / 1 findings / 2 usage. 5 pinning tests in runner/testsuites/parser/linecontlint.test cover proc-body flagging, punk::args::define exemption, lappend PUNKARGS exemption, comment-line exemption, and a clean expand-style proc (pass Tcl 9 + 8.6). src/modules/AGENTS.md: the -& record-continuation marker is now REQUIRED for new and edited punk::args doc blocks (existing blocks may keep \ until touched; editing a \ block requires converting to -& in the same change); the closeout trailing-\ search is cross-referenced to the linter. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
50f20f1cab |
AGENTS.md: add huggingface to the Assisted-by api-location table
huggingface.co is a public provider endpoint (acts as a proxy to backing providers). Add it so the Assisted-by trailer api-location derivation resolves the huggingface provider prefix to huggingface.co instead of unknown. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
147f5104e7 |
G-173 (active): punk::path machine-parsable returns -return text/dict/json + -context + -conflicts
Activated per user direction; activated goal flipped proposed -> active (overlap survey re-run at activation; new Related: G-016 - sibling json round-trip consumer. G-042/G-019/G-061/G-110/G-167/G-171 deliberate non-overlap). ::punk::path gains three options: - -return text|dict|json (default table, byte-unchanged): the structured modes build an ordered entry list from the shared collect dicts (d_path_info/d_bin_info/d_index_executables) and serialise without ANSI/textblock. text is a fixed-key plain-ASCII layout; dict returns a Tcl dict; json is emitted via tcllib json::write (the preferred encoder settled by the runtests json_emit hardening) so booleans/counts are bare JSON numbers/1-0 and the decoded form equals the dict form byte-for-byte. - -context <namespace> (default the caller's namespace): makes the TCL-context conflict verdict stable for a machine consumer invoked through a wrapper. - -conflicts 0|1 (default 1): skip conflict computation for a small perf win. The table render is kept verbatim (byte-identical default output). The structured modes use a clean exact|nocase conflict classification (path_conflicts_for_exe) independent of the table render's ANSI path. A duplicate-path entry now reports the original's exe_count with an empty executables list (mirroring the table column). PUNKARGS argdoc updated; new options documented (whatis -doc punk::path shows the synopsis + per-option help + choices). Tests: src/tests/modules/punk/pathcmd/testsuites/tests/pathcmd.test (7 tests: dict shape, duplicate/overshadowed fields, json ansi-freeness + round-trip parity, text ansi-freeness, -context stability, -conflicts 0, default-table still ANSI). Passes on Tcl 9.0.5 and Tcl 8.6. Existing punk::path module tests (path.test, 67) unchanged/green. Versioning: punk module buildversion 0.2.8 -> 0.3.0 (minor - new user-visible options on ::punk::path); punkproject.toml 0.57.1 -> 0.58.0 (minor - new user-visible shell behaviour) + CHANGELOG entry. goals_lint clean; projectversion OK. Assisted-by: harness=pi; primary-model=zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
359a160f2c |
G-173 (proposed): punk::path machine-parsable returns (text/dict/json) with stable conflict verdict
Drafted per the proposal-first goals workflow (overlap survey run this session:
goals_xref.tcl paths over src/modules/punk-999999.0a1.0.tm,
src/tests/modules/punk/path, src/tests/testsupport/json_emit.tcl; cross-refs
recorded to G-064 sibling surface, G-049 established the -return dict pattern).
Status proposed; not activated.
The goal adopts tcllib json::write as the preferred JSON encoder for the
punk::path -return json mode - the decision surfaced by the runtests json_emit
hardening committed just prior (
|
3 days ago |
|
|
f70aa63245 |
runtests JSON emitter: harden number predicate + C0 control-char escaping; add pinning suite
The hand-rolled -report json emitter in runtests.tcl classified values as JSON numbers via `string is entier -strict`, which (a) is deprecated in Tcl 9.0 per TIP 514 (string is integer became the canonical unlimited-range form) and (b) accepted several forms that are NOT valid JSON numbers, emitting them bare: 007 (leading zeros), +5 (leading plus), 0x10/0o17/0b101 (hex/octal/binary). The G-093 work already patched one symptom (a "0\n" result embedded a raw newline) but left the rest of the class open. The string escaper (runtests_json_string) also left most C0 control chars (0x00-0x1F) raw, which RFC 8259 forbids in strings - a test whose result_was carries a bell or NUL corrupted the report the same way. Hardening (src/tests/testsupport/json_emit.tcl, extracted from runtests.tcl so the new suite can unit-test it without a child run): - runtests_json_int? replaces `string is entier -strict` with an RFC 8259 integer regex (^-?(0|[1-9][0-9]*)$) - version-independent, eliminates entier entirely (no Tcl-9 deprecation exposure), subsumes the G-093 whitespace guard via ^...$ anchoring. - runtests_json_string now escapes the whole C0 range: 0x08 -> \b, 0x0C -> \f, others -> \u00XX. The existing \n \r \t \ \" escapes are preserved byte-for-byte (the multilinebanner.test end-to-end suite probes exact substrings such as "result_was":"x\n"). Pinning suite (src/tests/runner/testsuites/parser/jsonemit.test, 8 tests): RFC 8259 number syntax (007/+5/0x10/0o17/0b101 emitted as quoted strings; valid integers bare), C0 control-char escaping (no raw 0x00-0x1F survives; \b \f short escapes; \u00XX for the rest), entier-deprecation hygiene (asserts the loaded predicate proc body uses regexp and mentions no entier), named-escape byte regression, and tcllib-json round-trip of a representative testdict array. DOX: src/tests/AGENTS.md testsupport bullet records json_emit.tcl; src/tests/runner/AGENTS.md parser description records jsonemit.test. Verification: jsonemit.test 8/8 on Tcl 9.0.5 and Tcl 8.6; multilinebanner.test 2/2 (no regression to the existing emitter output contract); full runner/ subtree 40/40; mode parity runtests_parity.tcl PARITY: ok on a broad real-data subset (modules/punk/args, 35 files / 341 tests, singleproc vs multiproc). Tests-only change - no punkproject.toml bump per the versioning policy. Assisted-by: harness=pi; primary-model=zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
8f446690c1 |
G-172 (active): record + surface + audit the distributed-binary CPU floor
Approach 3 (record floor field): build905.zig declares cpu_floor="baseline" beside the default_target pin and writes cpu_floor + cpu_model into each family member's embedded record [provenance] (= target.result.cpu.model.name, so "x86_64" for the default build, "znver5" for -Dcpu=native - the floor is a default, not a restriction). family_artifacts.tcl derives both from the embedded record (G-117 single-source-of-truth) into the sidecar [provenance], failing if absent; family_check.tcl asserts them non-empty. Approach 4 (audit tool): scriptlib/developer/cpufloor_audit.tcl disassembles a binary's .text via a located objdump (llvm-objdump preferred, GNU fallback) or audits a pre-disassembled excerpt, classifies by AVX register width (zmm=v4, ymm=v3; baseline/v2 forbid both, v3 forbids zmm, v4 allows all), reports out-of-floor count + first RVA + sample mnemonics, exit 0 PASS / 1 FAIL. Bundled fixtures in cpufloor_fixtures/ are real disassembly excerpts (avx512, avx2, clean); selftest 12/12 cases pass. Verified on real binaries: rebuilt bin/punkzip.exe PASS (zmm=0); a -Dcpu=native probe FAILs at baseline (123 zmm) and PASSes at v4. Approach 5 (punk-runtime surfacing): both .ps1 and .bash twins updated and re-wrapped. Host CPU level detection (PS via IsProcessorFeaturePresent PF SSE2=10/SSE4.2=38/AVX2=40/AVX512F=41; bash via /proc/cpuinfo flags) feeds a meets/below/unknown/norecord verdict. fetch prints cpu floor (UNGATED - a cross-platform fetch for another machine stays free); list annotates rows the host cannot run (!CPU-FLOOR:v<req>, local rows only); use/run gate on below with a named diagnosis instead of a silent STATUS_ILLEGAL_INSTRUCTION (0xC000001D) - the 2026-08-06 AVX-512 regression failure mode; info adds the fields. bin/punk-runtime.cmd re-wrapped (deterministic; scriptwrap_runtime_cmd_roundtrip_no_drift test PASSES). Activation: overlap survey re-run at activation (goals_xref score G-172) - no goals drafted in the interval; existing Related: notes cover every pair. Project version 0.57.0 -> 0.57.1 (patch - user-visible punk-runtime behaviour shipped in kits). Remaining for acceptance: rebuild + republish in-situ (per Approach 6's alpha dispensation) and audit the republished artifacts to confirm zmm=0 - a publication-time, user-owned step. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
4b221ed960 |
goals-system v5: two-path activation rule - explicit user instruction IS the confirmation; agent-initiated activation forbidden
Assisted-by: harness=opencode; primary-model=huggingface/moonshotai/Kimi-K3; api-location=unknown |
3 days ago |
|
|
ca51898470 |
G-035: update goal detail to reflect resolved mechanism investigation
The avoid-mixing rule is no longer folklore: both co-causes are now identified and pinned. Co-cause 1 is stock Tcl's $satisfied early return suppressing the library scan (silent older-version selection under prefer latest, order-dependent indexing). Co-cause 2 is the libunknown 0.2.2 namespace-context bug (fixed 0.2.3, pinned by pkgindex_relative_namespace_is_global). The rule is substantiated for stock Tcl and neutralised under the punkshell chain. Updates: - Goal: replaced open-ended 'substantiate or retire' framing with the resolved finding; remaining work is the crossform characterization suite and AGENTS.md guidance - Context: removed 'folklore' characterization; presented the mechanism as established knowledge with both co-causes - Restructured Questions into Resolved (identified-mechanism findings with reproduction table) and Still Open (same-version collisions, package forget crossing forms, packagepreference interaction) - Approach: references the new crossform suite complementing existing shadowing/ and discovery/ suites; guidance deliverables named - Notes: promoted the 0.2.3 bug fix from baseline note to co-cause alongside the $satisfied mechanism; both explain the original folklore - Identified mechanism section: restructured as two co-causes with explicit consequences replacing the either/or framing - Acceptance: tightened to enumerate the five characterization cases and name the specific guidance deliverables - Fixed typo: lllength -> llength in quoted stock Tcl source Assisted-by: harness=pi; primary-model=anthropic/claude-sonnet-4-20250514; api-location=anthropic.com |
3 days ago |
|
|
d949274f2b |
G-172: correct the zig-gate rebuild-blocker claim; Approach 6 -> in-situ; r2 family + tools republished at baseline floor
The drafting session recorded the recipes' required_zig gate as blocking any rebuild on this box (a prerelease sorts below 0.16.0; "newest zig otherwise present is 0.15.2"). Wrong: only the stray dev copy is rejected - the zigpin toolchain bin/tools/zig-x86_64-windows-0.16.0/zig.exe is a released 0.16.0, present and passing the gate (the zig-x86_64-windows-* naming family in bin/tools was missed and a removal back-inferred from the artifact records). Notes bullet and Progress corrected; nothing was removed and nothing blocks. Approach 6 rewritten per user decision: republication is in-situ replacement under existing artifact names/revisions - punkbin immutability deliberately violable during alpha (all consumers in-house, zero third-party users). Progress: Approach 6 executed for the r2 generation + tools (punkbin ab5611d pushed) - full bootstrap rebuild with the pinned zig, zmm=0 ymm=0 audits on all five binaries, family_check PASS, two consecutive core-gate PASS runs with identical totals (interp-36.7 bgerror-race jitter and a 4h httpProxy.test ThreadLevel-1 hang documented). Record-honesty residual noted: published tomls carry emission-time [tests] summaries - refresh folded into Approach 3. Remaining: floor field, audit tool, punk-runtime surfacing; r1 disposition + bin/punk9* kit rebake behind those. goals_lint: clean (81 active, 91 archived). Claude-Session: https://claude.ai/code/session_01WXribLxUjk3dZUsN3r6rKb Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 days ago |
|
|
946a32da19 |
G-172 drafted (proposed) + the four recipe pins: distributed binaries get a baseline CPU floor
The published tclsh9.0.5 runtime family is AVX-512-only. A flagless
bin/punk-runtime.cmd fetch hands a fresh checkout the curated win32-x86_64
default (tclsh9.0.5-punk-r2.exe), which on a CPU without AVX-512 raises #UD and
is killed with STATUS_ILLEGAL_INSTRUCTION (0xC000001D, errorlevel -1073741795)
before writing a byte - no message, no prompt, no error. First reported as a
Windows-version difference (25H2 works, 23H2 does not); it is not one.
Cause: the recipes called b.standardTargetOptions(.{}) and no build path passed
-Dtarget/-Dcpu, so zig resolved cpu_model .determined_by_arch_os by NATIVE
detection and ReleaseFast auto-vectorised to the Zen 5 build host. Measured: all
six published tclsh9.0.5-* artifacts (punk + plain, r1 + r2, both -bi- variants)
carry 2756 zmm-operand instructions each - real EVEX encodings, first site at the
front of .text, and Tcl has no runtime CPU dispatch - as do bin/punk905.exe,
punk9-dev.exe, punk9_beta.exe, punk9bi_beta.exe, punkdeclare.exe and
punkfiledemo.exe. bin/punkzip.exe carries 1724 and bin/punkres.exe 1423, so a
bake on such a machine fails too. An older generation (punk901*, punk9.exe,
xcritcl.exe, tclsh90s*) is AVX2-only from an earlier host: same defect, milder
floor. Confirmed across three machines - Zen 2 dies, Zen 4 and Zen 5 run.
Pins applied to all four in-repo recipes (suite_tcl90, suite_tcl86, punkzip,
punkres): standardTargetOptions gains .default_target = .{ .cpu_model =
.baseline }, so a flagless build is portable while -Dcpu=native remains the
developer opt-in and -Dtarget=<triple> is unaffected. Floor chosen as baseline
(x86-64 v1) - for a Tcl interpreter the codegen delta against v2/v3 is
negligible set against the default runtime failing to start. This has to be a
recipe DEFAULT rather than a build-command convention: "remember to pass -Dcpu=
when publishing" is precisely what failed silently for six artifacts.
Verified by zig ast-check on all four recipes, and by reproducing the mechanism
with the same toolchain and optimize level on an equivalent recipe (flagless ->
x86_64 baseline, zmm=0; -Dcpu=native -> znver5, zmm=805). No suite build was
run: all four recipes gate on required_zig = "0.16.0" with a .lt SemVer compare,
which rejects the bundled prerelease bin/tools/zig-0.16.0-dev.254 - a separate
pre-existing defect, recorded in the goal's Notes and deliberately not fixed
here.
Nothing is rebuilt or republished, and no shipped surface changes, so no project
version bump. Recording the floor in the artifact metadata record, an audit tool,
punk-runtime surfacing it on use/run (fetch stays ungated - fetching for another
platform is a normal workflow), and the rebuild/republish with the defaults.txt
repoint all remain open as G-172.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
3 days ago |
|
|
f103b90c3a |
G-166 achieved: cmdinfo/cmdhelp surface recognised-but-unavailable landings distinctly
Activated at user direction and achieved in the same session. On Tcl 8.6,
'i string is dict' (a class the runtime lacks) and 'i string is true' (a real
class) were indistinguishable to both eye and machine: cmdinfo reported
cmdtype 'doconly' with identical key sets, and cmdhelp's advisory parse of an
argument tail succeeded against the virtual docid, so 'i string is dict 5'
rendered exactly like a usable command line. Documentation REACHABILITY for
unavailable words is G-073's intent; the INDISTINGUISHABILITY was emergent -
nothing structural told a consumer the documented word is rejected here.
punk::ns 0.10.0
(a) cmdinfo gains an 'unavailable' key on EVERY result - empty, or the
canonical -choiceunavailable name the resolution addressed. It is a SECOND
AXIS beside cmdtype, never a cmdtype value: cmdtype answers what kind of
executable thing resolution landed on (both 'string is dict' and
'string is true' stay 'doconly'), availability answers whether the resolved
word is selectable in this runtime/context. Overloading cmdtype would have
broken every consumer switching on cmdtype eq "doconly", and the two only
co-occur incidentally. cmd_traverse's yielded/returned records carry a sixth
element for the attribution; cmdinfo keeps the final landing's value.
Population is nearly free - the level's choices-bearing first leader is
resolved once per level via the shared punk::args::choiceword_match, and both
the exact space-form landing and the prefix retry consult that one result
(the G-051 branch was restructured, not duplicated).
(b) PREFIX-LANDING DECIDED, enacting the G-073 doc-walk follow-on: a unique
prefix landing on an unavailable name now RESOLVES that name's virtual docid,
attributed - the conservative non-resolution was not kept. Encoding
availability as resolve-vs-don't-resolve conflated it with addressing and
made addressing inconsistent: 'i string is tr' resolved but 'i string is dic'
did not, while exact 'true' and 'dict' both did. Now every form of address
that names a documented word resolves it, and the availability key plus the
render marking carry the rejection story parse reports for the same word.
The choice traverse's G-040 parse-parity claim is untouched - an unavailable
word still identifies no SUBCOMMAND there, it is only attributed (the path
taken when the name has no space-form virtual docid).
(c) cmdhelp marks such subjects in every return form from one shared wording
(_cmdhelp_unavailable_marking, mirroring punk::args'
private::unavailable_choice_msg so a user meeting both reads one story):
-return dict carries the key, table/string render the message below the usage
under the non-info scheme, -return text leads with an 'UNAVAILABLE:' line.
The marking takes precedence over BOTH the ok-parse info render and any parse
failure message - the subject not existing here is the more fundamental
report, and it is the one a parse against a virtual id cannot make. Parse
status still passes through, so argument positions keep their marking.
punk::args::moduledoc::tclcore 0.4.1 - on a runtime lacking a curated forward
class, that class's per-class virtual id LEADS its help with the unavailability
statement (runtime patchlevel + the rejected call shape), then the unchanged
static description. The static version note existed but sat at the END of the
prose, so a reader met the full class documentation before learning the class
does not exist here. Runtimes where the class is live generate the id unchanged.
Tests: cmdflow.test gains the flowunavail / flowunavail_nodoc fixtures and 5
pins (key always present; exact landing attributed with cmdtype unchanged; the
prefix decision pinned against parse's choiceunavailable rejection;
choice-traverse attribution without addressing; attribution surviving an
argument tail). cmdhelp.test gains the helpstrua fixture and 5 pins (3 local
render, 2 tclcore-gated real-world) plus the two DELIBERATE key-list flips
(cmdhelp_cmdinfo_result_shape, cmdhelp_return_dict_valid). tclcoreparity.test
gains the virtual-id leading-note pin. All new pins are live-derived, so the
modern arm asserts the same shapes with an empty key.
Verified: cmdflow 25/25 + cmdhelp 50/50 on native 8.6.10 (THE AFFECTED ARM,
unavailable={dict}), 8.7a6 and 9.0.5; full punk/args subtree 341 total / 338
passed / 3 intended skips / 0 failed on all three; full punk/ns 125 green on
9.0.5 and green on 8.6/8.7 apart from two nsprimitives failures verified
PRE-EXISTING on both (confirmed with the module changes stashed); broad
src/tests/modules/*** sweep on 9.0.5 - 1257 tests, 108 files, 0 failed.
Consumer audit: every in-tree cmdinfo consumer reads named keys via dict get,
so the added key is inert for all of them. goals_lint and architecture_lint
clean.
Project 0.56.2 -> 0.57.0 (user-visible shell behaviour) with CHANGELOG entry.
Goal flipped to achieved and archived; four follow-ons recorded (to G-050,
G-044, G-055, G-167) with reference-sweep pointers pushed into those goals'
Notes, and the G-167 back-pointer added at activation - G-166 landing first
settles the marking-vocabulary ownership the two goals share. Also corrected
two pre-existing stale claims in src/tests/modules/AGENTS.md that this work
falsified: tclcoreparity's "version-note labels conditional on class presence"
(stale since G-073) and its "under 8.6 run the file directly via a plain
tclkit" note (stale since native 8.6 became a supported runner 2026-07-21).
Staged deliberately as this change-set only: the concurrent G-172 zig
CPU-floor lane (GOALS.md entry, goals/G-172-*.md, the four build.zig files)
is left uncommitted in the tree.
Claude-Session: https://claude.ai/code/session_01Y5vEJUZkD4p8jmEFEBVhLi
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
|
3 days ago |
|
|
5bf9c83103 |
G-170 follow-on landed: argsid formhint authoring note in punkboot moduledoc (0.3.2)
The registration definition's 'argsid' key text now notes that a multi-form project definition may carry its own '@cmd -formhint' template of the shape ' <punkexe> help <name> %formname%' - the launcher narrows 'help <name> <formword>' (exact form name or decimal ordinal) to that form's usage, so the hinted line names real navigation. Authored with NO trailing ellipsis per the display-hint honesty rule: words after the form word are not a continuation of the narrowed render - on a parse=1 registration they dry-run through argsid instead. Doc-only patch bump 0.3.1 -> 0.3.2; follow-on disposition flipped to landed in goals/archive/G-170-launcher-help-depth.md. Verified: live render probe via bin/punk91 src script (definition parses, note renders in the argsid column), goals_lint clean, goals_followons reports the item landed, make.tcl modules mint green (punkboot-0.3.2.tm). No project-version bump - the doc-only source edit ships at the user-owned promotion+bake, where the project-version gate covers the pending bump. Claude-Session: https://claude.ai/code/session_01SCqtCXT1q45sjjMFfwARRj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 days ago |
|
|
9678f710d4 |
G-171: fold in the mint-side thin-layout sync + the stage-verb gap it exposed
Investigation prompted by the 0.56.2 BAKE SUMMARY work, whose 'make.tcl modules' run silently refreshed the tracked layout copies: does the mint terminology cover that write? It does not, and the write is G-171's own class on the mint side. Finding. make.tcl's sync_layouts phase (modules/libs/packages/bakehouse) performs two different movements fused in one block. (a) It copies src/make.tcl, src/build.tcl, the root .gitignore and the bootsupport manifests into the tracked src/project_layouts store; (b) it copies that store into the templates modpod source tree. Neither is mint by make.tcl's own G-155 definition - nothing is version-stamped and nothing lands in the projectroot modules*/lib*/ trees. (a)'s target IS a VCS-tracked consumption tree - the store 'dev project.new' generates from - so it has promotion's shape, and release-sequence step (9) already commits it beside the two promotion targets. Of the three such trees only this one has no named command, no gate and no TERMINOLOGY entry: 'sync' appears there purely as a MECHANISM word, so the movement it performs was never assigned a stage and inherited mint by accident of which subcommands call it. (b) is the one genuinely mint-internal half - input preparation ordered deliberately before the source-modules mint that packs #modpod-* trees (verified: a modules run's freshly packed templates-0.2.0.tm carries the same run's make.tcl, so there is no one-run lag). Contract changes (user-approved wording, proposal-first per GOALS.md): - Goal: subject widened to (mint, bake/bakehouse/vfslibs ...); the deliberate- writes clause now covers tracked TREES incl. refreshing the thin-layout store. - Scope (both tiers, mirror verified identical): new element naming the sync_layouts phase, its two targets and the workflow_text TERMINOLOGY/DIAGRAM 1b stage-verb assignment. - Acceptance: new clause - the sync writes no tracked path from a mint or bakehouse run, refreshing store + modpod payload is an explicitly-invoked command, the mint commands report a stale store instead of silently refreshing it, and the vocabulary names the layout store as the third consumption tree. Non-contract: Context gains a fourth structural problem (incl. the bakehouse help claiming it does NOT run the promotion gates while writing a tracked consumption tree) plus the vocabulary finding; Approach gains step 10 (explicit command + stale_bootsupport-shaped check + the TERMINOLOGY/DIAGRAM/help corrections). Back-pointer sweep (goals_xref reported 14 goals G-171 references without one): added 'Related: G-171' to the eight it lists as genuinely related - G-004, G-006, G-065, G-141, G-147, G-156, G-157, G-162 - each worded from that goal's own side. Deliberately NOT added to G-089, G-114, G-131, G-019, G-020, G-116: G-171's own overlap survey records those as judged not related in substance, so a back-pointer would assert a relationship the survey ruled out. They remain the only flagged pairs, which is the intended state. G-171 stays 'proposed' - activation is the user's call. Verified: goals_lint clean (81 active, 90 archived); GOALS.md and detail-file Scope lines byte-identical; goals_xref score G-171 now surfaces G-156 at 1.28 on the two newly-added paths (the overlap the new Related line records, invisible before the fold). Claude-Session: https://claude.ai/code/session_017yWCebiNUVFtTrMA9GvsYd Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
3 days ago |
|
|
6953f751a8 |
G-171 drafted (proposed): routine builds never write tracked paths - explicit commands own VCS-visible changes
Index entry + detail file goals/G-171-bake-writes-land-untracked.md; goals_lint clean (81 live, 90 archived). Drafted at user direction from the 2026-08-06 consumer-machine incident: a stale untracked bin/punkzip.exe (pre-2.4.0) received the v2.4.0 -b flag, swallowed it as the archive-name positional (misdirected 90MB src/-b archive), the kit-container step failed and the died bake stranded half-replaced tracked src/vfs trees - the failure class this goal removes by construction. Contract: routine bake/bakehouse/vfslibs phases write only to VCS-ignored locations (declared payloads materialize into ignored staging; merge-time layering enacts drop-in-wins identically on records-free fresh clones); deliberate tracked-tree writes remain available only as explicit materialize/tidy commands whose output is an ordinary reviewable VCS change, with docs steering to declarations by default. Acceptance keys on a kill-probe (clean tree in, clean tree out at arbitrary kill points), phase write-target self-checks, and a 'bake -hold' inspection point whose completion must equal a single uninterrupted bake - staged assembly reused only under digest-confirmed currency (machinery shared with G-162), held staging machine-owned (inspection sanctioned, hand-edits redone, never shipped). Related: G-004 (write-side complement), G-157, G-162, G-065, G-141, G-147, G-006; deliberately revises archived G-115's operative-assembly-area stance and generalizes archived G-127's staging pattern. Claude-Session: https://claude.ai/code/session_01EukjNTv2r5msFgHzWgaCdS Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 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
|
3 days ago |
|
|
9d92c11bd7 |
agent skills: tcl-runtests added; whatis/nslist gain the script -e quick-probe line
tcl-runtests (new): agent quickstart for src/tests/runtests.tcl. Runner-interpreter policy: the zig-built suite tclsh (src/buildsuites/_build/suite_tcl90/out/bin/tclsh90s; tclsh86ts for 8.6 parity) or a bin/runtime store tclsh; a fresh checkout bootstraps via the no-tclsh 'zig build bootstrap' flow (pinned zig only, bin/punk-getzig) or by fetching prebuilt runtimes from punkbin via bin/punk-runtime - which path is the user's choice, not an agent default. Never bare 'tclsh' from an agent shell (commonly the MSYS/Git-for-Windows one - spurious failures); native tclsh preferred over punk kit exes (kit-stamped module shadowing). Plus canonical invocation/targeting forms, result-reading rules (status=warn = incomplete), agent-environment traps (NO_COLOR=1 breaks exact-SGR pins agent-side only; PowerShell-tool attached consoles; no mid-run .test edits; PUNK_SHELL_TEST_EXE for locked/stale kit exes) and .test authoring micro-traps (trailing 'set result', brace-in-comment parse death, \y-not-\b). Pointer-first: src/tests/AGENTS.md remains the authoritative harness contract. tcl-whatis/tcl-nslist: one sentence added to the Command section - the launcher one-liner form `bin/punk91 src script -e '<tcl>'` for RUNNING a snippet rather than introspecting it (behaviour checks, cross-version probes via the documented punk905/punksys kits). Facts verified live before writing: suite tclsh90s = Tcl 9.0.5 + Thread 3.0.7 and drove a focused runtests run (args dynamic.test 2/2 PASS, 5s); runtime-store tclsh9.0.5-punk/plain = 9.0.5 + Thread 3.0.7; -e forms on punk91/punk905/punksys; punk-runtime list output; PUNK_SHELL_TEST_EXE resolution in the punkexe suites. .claude/skills copies are byte-identical re-copies of the .agents canonicals (diff-verified) per the root AGENTS.md skill sync convention. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 days ago |
|
|
2a7fbafa77 |
tcl-whatis/tcl-nslist skills: kit Tcl-version note (punk91=9.1, punk905=9.0, punksys=8.6)
The skills pinned bin/punk91 but never stated which Tcl it embeds, and the "any punkshell kit works" fallback was unqualified - Tcl-version-sensitive introspection questions (e.g. 8.6-vs-9 builtin differences) left the agent to work out kit versions unaided, in a bin/ full of non-kit exes. Add one sentence to each skill's Command section: punk91 embeds Tcl 9.1; for Tcl-version-sensitive questions, or if punk91 is unavailable, use punk905 (Tcl 9.0) or punksys (Tcl 8.6) with the same command line. Stated versions smoke-verified against the live kits (9.1b0 / 9.0.5 / 8.6.13). Canonical .agents/skills copies edited; .claude/skills re-copied and diff-verified byte-identical per the root AGENTS.md sync convention. Frontmatter descriptions untouched, so skill firing is unchanged. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 days ago |
|
|
2dbf635b99 |
Project-version bake gate - bump-before-bake machine-enforced (punkshell 0.56.1)
The project version is a bake input (kit stamp punkkit-stamp.toml project_version + versioned-scheme output names), but nothing enforced the step (2) bump -> step (8) bake order; a 2026-08-06 session baked at 0.55.1, bumped to 0.56.0 and paid a full 11-kit re-bake. Every other release-sequence edge already had a mechanical gate (provenance, bootsupport staleness, boot precondition) - this was the un-gated one. - ::punkboot::get_projectversion_status: shared staleness/consistency computation (projectversion advisory, check report, gate); states ok/overdue/bump_uncommitted/unavailable. - project-version gate on bake/bakehouse/bin: a pending-looking bump (src/ commits since punkproject.toml last changed, none staged) prompts y/N on a terminal and aborts fast non-interactively unless -expect-projectversion asserts the intended version. -confirm 0 deliberately does not waive the gate. A staged-but-uncommitted bump passes (bake reads the working-tree value); degraded bootsupport reduces the gate to a NOTE. - -expect-projectversion <ver> (bake/bakehouse/bin argdocs + degraded scan): assertion verified in every state - a mismatch with punkproject.toml always aborts before any kit work; unavailable status aborts a supplied assertion as unverifiable rather than silently losing the requested strictness. - projectversion overdue warning now states the consequence and prints the ready-made assertion command; check reports the gate state and current staleness verdict; workflow text ([K2] bake-input + gate, [K6] no-waiver exception, steps (2)/(8)) and gethelp/HELPTEXTS/OPT_CONFIRM document it; root AGENTS.md gains "The version is a bake input (bump BEFORE bake)" + an Enforcement gate paragraph; src/AGENTS.md closeout bullet extended. - maketclprojectversion.test: piped characterization (8 tests) - check report, advisory read-only, and git-fixture verdicts for pending-abort, assert-match proceed, assert-mismatch abort, bump-staged proceed, no-git NOTE. maketclhelp.test bakehouse-synopsis pin updated for the new flag. - Thin-layout + templates-modpod make.tcl copies synced via make.tcl modules. Claude-Session: https://claude.ai/code/session_01EukjNTv2r5msFgHzWgaCdS Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
5e956f7419 |
G-169/G-170 follow-on landed: coherent-set promotion + bake - launcher help depth reaches the kits (punkshell 0.56.0)
Both goals' open coherent-set promotion follow-ons name the SAME
vfscommonupdate/bake event; this change-set is that event, so both flip to
landed 2026-08-06 in the same work unit (the sanctioned archived-file edit).
Promotion (canonical release-sequence steps 5-8, native tclsh90 driver):
- mint: 'make.tcl packages -confirm 0'.
- promote: 'make.tcl bootsupport -confirm 0' - punk::args 0.17.0 -> 0.18.0 and
punk::ansi 0.1.3 -> 0.2.0. The second pass copied zero modules (the gate's
own contract) and 'make.tcl check' no longer reports stale bootsupport.
- promote: 'make.tcl vfscommonupdate -confirm 0' - the same two modules plus
punkboot core 0.7.0 (byte-identical to src/vfs/_config/punkboot_core.tcl),
punkexe moduledoc 0.6.1 -> 0.9.0, punkboot moduledoc 0.3.0 -> 0.3.1, and
app-punkscript/app-punkscript-docs 1.1 -> 1.3 (pkgIndex + punkscript.tcl;
vfscommon never carried the intermediate 1.2). Every promoted copy verified
byte-identical to its mint output.
- bake: 'make.tcl bake -confirm 0' - INSTALLED KITS (11), no FAILED KITS. The
templates modpod payload (both bootsupport and vfscommon copies) regenerated
from the G-170 layout core edits.
What a deployed kit now does that it could not before, probed directly against
bin/punk902z.exe (no src package mode, no fake-main harness):
- 'help script oneliner' narrows to the oneliner form's argument table - the
'-e' row, which is absent from form 0's default table - exit 0.
- the multi-form synopsis lines carry the un-suppressed formhint labels
(' <punkexe> help script file' / ' <punkexe> help script oneliner'), G-170's
resolution of the 0.6.1 circularity objection, rendered from the app-owned
definition G-169 moved beside the code that implements it.
- 'help script somefile.tcl' dry-runs: the matched form plus the
punk::args::parse_report landing report (Argument|Source|Value carrying
'scriptfile received somefile.tcl') - G-151's render consumed by the core.
- 'help buildinfo bogus' rejects with exit 1, byte-empty stdout and the parse
diagnosis on stderr; 'help shell somearg' keeps the passthrough
accepted-and-ignored render at exit 0.
- 'help tclsh somefile somearg' now DRY-RUNS (accepted, exit 0) where the baked
0.6.1 moduledoc had kept the historic ignored-tail render: the G-170 fence
witness requires a -regexprefail row in the definition actually served, and
the promoted 0.9.0 moduledoc supplies it. That was the recorded
mixed-vintage state, now resolved in the deployed kits.
Verification:
- launcherhelp.test 38/38 against the freshly baked kits. The two direct-kit
trailing-word pins that G-170 re-described as VINTAGE-PROOF hold under the
depth core exactly as designed.
- Full source-tree suite (-jobs 16): 1560 passed / 20 skipped / 1 failed. The
single failure is core/tcl/testsuites/tests/exec.test exec-14.3, a vendored
Tcl core test asserting stock's 'exec -gorp' error text without -encoding -
a Tcl 9.0.3 core-vintage mismatch, unrelated to this change-set.
- punkexe subtree 162 passed / 4 skipped / 0 failed. The 10 failures recorded
as pre-existing through the G-168/G-169/G-170 sessions (maketclbakelist 2 +
maketcllibfetch 8) now ALL PASS - they were stale build-state artifacts, and
this mint/promote/bake refresh is precisely what they were waiting for. Worth
weighing against the G-139 libfetch-test reading still pending a user call.
- punk/args subtree 337 passed / 3 skipped / 0 failed, its recorded baseline.
- Bake warnings are the known set only: punkmagic skipped (runtime
tclsh90magic.exe absent from the store) and the zint.dll i386-in-x64 arch
mismatch in the tcl8 kits punkbi/punksys/punk86, the recorded pre-existing
payload defect. No configured kit exe was locked (the running punk901t.exe
instances are not a configured bake target).
Project version 0.55.1 -> 0.56.0 with a CHANGELOG entry: the G-151/G-168/G-169/
G-170 launcher-family behaviour becomes user-visible in a deployed kit for the
first time with this bake, and none of those source commits bumped the project
version - the source change alone shipped nothing to a user.
ARCHITECTURE.md's launch-surface paragraph still described trailing help words
as merely 'accepted', which is pre-G-170 semantics, so that clause now states
the narrowing / dry-run / passthrough split; architecture_lint clean (66 path
refs, 62 goal refs). goals_lint clean (80 active / 90 archived).
Deliberately untouched and still open: G-151's make.tcl interim-report
retirement (its bootsupport gate is satisfied by this promotion, but the
make.tcl edit is separate work), G-169's app-ownership extension to
shell/punk/shellspy, and G-170's punkboot moduledoc authoring-hint note.
Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
c1c27ea37c |
G-170 achieved: launcher help depth - form narrowing, parse-true dry-run, actionable form hints (core 0.7.0, punkexe moduledoc 0.9.0, app-punkscript 1.3)
User-directed activation and implementation in one arc ("Activate G-170 and
continue"; proposed -> active at the user's word with the activation-freshness
survey recorded - new Related lines both directions for G-167 and G-044 -
-> achieved + archived on acceptance). Completes the launcher family:
G-151 parse_report + G-168 selection-sound definitions + G-169 app-owned
docs + this goal's consumption of all three.
punkboot core 0.7.0 (both layout copies synced byte-identical: project-0.1 +
modpod-template): launcher_show_help gains a tailwords parameter and returns
the suggested exit code (0 for every render, 1 only for a rejected dry-run);
the dispatch help arm passes the words after the subject and exits with the
return. Three tail behaviours by subject:
- Narrowing (any multi-form definition, display-only, any vintage): a SINGLE
word exactly matching a form name, or a decimal ordinal below the form
count, renders 'punk::args::usage -form <sel> <id>' - the G-150 shape
(all-form synopsis retained, the selected form's argument table only).
Collision rule decided and documented: in this position the form word WINS
over argument interpretation (exact names + decimal ordinals only, no
prefix resolution - the tighter rule minimises the shadow over the
subject's own first-argument space); a file literally named like a form
stays dry-runnable via a path spelling (./oneliner - the same reachability
dodge G-168 recorded for a file named '-e').
- Dry-run (parse-true subjects): any other tail parses through the subject's
definition exactly as make.tcl help does (G-143 shape). Accepted lines
render the matched form's usage plus the punk::args::parse_report landing
report (G-151 consumed directly; guarded - an older punk::args without
parse_report renders the usage alone). Rejected lines emit the parse
diagnosis on stderr, exit 1. The complete '-encoding <name> <scriptfile>'
tclsh line raises the sanctioned two-form multipleformmatches diagnosis
(the recorded G-168 LIMIT - the honest answer for that line). Parse-true =
buildinfo + project parse=1 registrations (parity with dispatch BY
CONSTRUCTION - dispatch parses the same id, any vintage) plus script/tclsh
(declared passthrough surfaces whose G-168 definitions MODEL dispatch/app
reality - their dry-run additionally requires the fence witness: at least
one -regexprefail row in the definition actually served, so a pre-G-168
unfenced moduledoc snapshot - the real mixed promotion state - keeps the
historic ignored-tail render instead of misdiagnosing lines whose forms
double-match; probed live against the baked 0.6.1 stack). 'help' itself is
deliberately NOT parse-true (its tail handling IS this dispatch).
- Passthrough (shell/punk/shellspy, registrations without parse=1) and all
degraded contexts (PUNKBOOT_PLAIN, missing stack, render failure): the
historic accepted-and-ignored render, exit 0.
Formhint un-suppression at BOTH homes (the G-169-decided split): the interim
'@cmd -formhint ""' flips to the actionable template
' <punkexe> help <sub> %formname%' in the app-owned script definition
(src/lib/app-punkscript/punkscript.tcl, app-punkscript/app-punkscript-docs
1.3) and the moduledoc tclsh definition (punkexe moduledoc 0.9.0) - the
labels render beside each form's synopsis line and name real navigation,
resolving the 0.6.1 circularity objection. Deliberately NO trailing ellipsis,
diverging from make.tcl's hint shape: the display-hint honesty rule marks
accepted continuations of the SAME operation, and appending words to the
launcher's form word flips into the dry-run interpretation (a different
operation) - the exact hinted line is the complete narrowing command.
(script)::punkexe::help's @cmd/arg text documents the depth semantics (the
'accepted and ignored (reserved)' arg row cashed in as designed).
Engine fact recorded: punk::args::usage takes its options BEFORE the
positional id ('usage -form X $id'; the reversed order raises a values-count
error) - caught by probe; layout copies synced before the fix were re-synced
and cmp-verified after the last core edit.
Tests: launcherhelp.test 38/38 on BOTH tclsh90 and tclsh87 - 25 existing
pins unchanged (the two direct-kit trailing-word pins re-described as
VINTAGE-PROOF: their assertions hold under both the historic ignored-tail
core and the depth core, whatever the kit's bake vintage) + 13 new G-170
pins: narrowing by form name and ordinal, formhint labels, dry-run accept
(matched form + Argument|Source|Value report), reject, the -encoding LIMIT,
the ./oneliner collision dodge, passthrough ignored, buildinfo reject,
project parse=1 accept/reject parity (same words as the dispatch-half pins
launcherhelp_registration_parse_pass/_reject), the mixed-vintage fence
witness, and the PUNKBOOT_PLAIN degraded twin. args subtree 337 passed /
3 pre-existing skips / 0 failed on both runtimes; punkexe subtree at the
recorded baseline on both (152/4/10 - the 10 failures are the pre-existing
maketclbakelist(2)/maketcllibfetch(8) set, G-139 pending user decision;
maketclhelp 12/12 and scriptexec 27/27 green). A 12-probe live matrix
(args level via bin/punk91 src + fake-main harness via bin/punk902z tclsh,
src and no-src modes) recorded in the goal file. Minted punkexe-0.9.0.tm
via make.tcl modules (mint tree, not committed by design). Kits/bootsupport/
vfscommon remain stale until the user-owned promotion + bake.
Goals: G-170 entry moved to GOALS-archive.md, detail file to goals/archive/
with mechanism, decisions and verification evidence; two open Follow-ons
(the coherent-set promotion - the same vfscommonupdate/bake event as
G-169's line, now also carrying core 0.7.0 + punkexe 0.9.0 + app 1.3; a
punkboot-moduledoc authoring hint that project definitions may carry their
own formhint templates). Reference sweep: G-044 and G-167 back-pointers
updated to achieved; G-044 gains the xref-flagged G-167 mirror line.
src/vfs AGENTS.md launcher-help bullet and src/lib AGENTS.md app-punkscript
bullet extended. goals_lint clean (80 active / 90 archived);
goals_followons 74 structured lines, both new G-170 lines registered.
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
97e4aacd4f |
G-169 achieved: app-owned launch-subcommand documentation consumed by the launcher (app-punkscript 1.2, core 0.6.0, punkexe moduledoc 0.8.0)
User-directed activation and implementation in one arc (proposed -> active at the user's word with the activation-freshness survey recorded, -> achieved + archived on acceptance). Co-location kills the doc-drift class: the actual '-e' parsing and its punk::args documentation now live in the same file. app-punkscript 1.2 + new package app-punkscript-docs 1.2 (same file): src/lib/app-punkscript/punkscript.tcl carries the (script)::punkexe::script definition (the G-168 selection-sound shape moved VERBATIM - value strings byte-identical, renders match the pre-handover moduledoc) in ::app::punkscript::argdoc with an idempotent docs section - a plain namespace-variable set plus a membership-guarded lappend to ::punk::args::register::NAMESPACES; no package requires, no punk::args dependency, no definition evaluation (lazy on the first query naming the id - the docpackages mechanism pinned ahead in docpackages.test). pkgIndex.tcl provides app-punkscript-docs from the SAME file via an execution gate (::app::punkscript::docs_only set around the source; the file returns after the docs section when the gate is up, and 'package provide app-punkscript' sits below the gate) - requiring the docs NEVER runs a script, and a later app require re-sources with the gate down so the app runs normally (probed: docs-then-app in one process, file/'-e' one-liner/'-e'-alone usage error all behave identically through the new file). punkboot core 0.6.0: new launcher_builtin_docpackages map (script -> app-punkscript-docs); launcher_show_help's built-in arm does a guarded lazy 'package require' of the mapped docs package before the usage query - help-path only, never on boot/dispatch (ready-probe and dispatch untouched). The G-031 registration-model header comment now names the durable doc id and records the app-owned 'package'-key option. Copies synced byte-identical: project-0.1 layout + modpod-template layout. punkexe moduledoc 0.8.0 (single-definer handover): (script)::punkexe::script is no longer defined here - a pointer comment stands in its place and the Overview records the ownership rule (docs live with the owning code: app-owned for app-handled subcommands, this moduledoc for core-owned surfaces like tclsh/buildinfo/help and the top-level dispatch). Single definer verified: loading both sources raises no duplicate-definition (undefine) notices - the handover withdraws the moduledoc entry in the same change-set per the docpackages last-loaded-wins pre-test pin. Durable-doc decision (the acceptance's 'location decided in the work'): the registration definition id (script)::punkboot::registration IS the durable doc for the *_main.tcl declaration keys (summary/argsid/package/parse incl the parse=1 gate, all already documented there); punkboot moduledoc 0.3.1 extends its 'package' key text with the app-owned docs-package pattern (gate shape pointed at src/lib/app-punkscript/pkgIndex.tcl). Kit authors reach it from the core header contract, the punkexe moduledoc Overview and the project_main.tcl worked examples. Help-path load cost measured and recorded (goal file): the app-ownership marginal cost is the guarded docs require - 3.5 ms (inert). The ~396 ms first-render total is the one-time punk::ansi/textblock render-stack load + definition evaluation, incurred identically wherever the definition lives; boot/dispatch cost is zero. Tests: launcherhelp.test 25/25 - 24 existing pins unchanged plus new launcherhelp_appowned_script_docs: the fake-main harness (G-031 shape, no bake) run through the baked kit's tclsh subcommand in SRC package mode, where the source tree serves the nested boot with version precedence - the src moduledoc defines no script id, so the successful tabular render carrying the G-168-era scriptfile help text (line-break-safe markers; the oneliner form's rows are not in the default form-0 table) proves the app-owned lazy resolution; stderr asserted free of 'clearing existing data' notices. Harness lesson recorded: manual tm/auto_path prepends in a fake main are WIPED by the nested boot's path configuration - the src package mode is the correct lever. Full modules/punk/args subtree 337 passed / 3 pre-existing skips / 0 failed on BOTH tclsh90 and tclsh87 - the G-168 punkexemodel.test/formcheck.test pins now load the script id via app-punkscript-docs (src/lib derived from the test file location) and guard the handover shape at its new home. The 10 failures in maketclbakelist.test / maketcllibfetch.test are PRE-EXISTING (reproduced identically at HEAD with this change-set stashed; the G-139 libfetch-test reading is a recorded pending user decision). Degraded/plain path intact (PUNKBOOT_PLAIN pin unchanged; mixed promotion states degrade gracefully by construction). Minted punkexe-0.8.0.tm + punkboot-0.3.1.tm via make.tcl modules. Goals: G-169 entry moved to GOALS-archive.md, detail file to goals/archive/ with mechanism, decisions, measured costs and verification evidence; two open Follow-ons (the coherent-set vfscommonupdate/bake promotion carrying lib/app-punkscript 1.2 + core 0.6.0 + punkexe 0.8.0 together; extending app ownership to shell/punk/shellspy). Reference sweep: G-170's Related line updated (the defs' home now decided - its formhint un-suppression edits both homes). src/lib AGENTS.md app-punkscript bullet + src/tests/modules AGENTS.md punk/args bullet extended. goals_lint clean (81 active / 89 archived). Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
2339e4065e |
G-168 achieved: selection-sound launch definitions - script/tclsh forms match dispatch reality (punkexe moduledoc 0.7.0)
User-directed activation and implementation in one arc (proposed -> active at
the user's word with the activation-freshness survey recorded, -> achieved +
archived on acceptance). The declarations follow the 2026-08-05 pre-test
findings exactly - no engine change was needed.
(script)::punkexe::script: the file form fences scriptfile with
-regexprefail {^-e$} and a -regexprefailmsg naming the ./-e reachability
(word-1 '-e' is the ONLY fenced word - every other dash-led word remains a
file path, matching app-punkscript's word-1 test); the oneliner form declares
the '-e' word as a real element - a required -type none flag (the
auto_exec::hash -r/-d shape) ahead of the existing required script value, so
a bare {-e} reports noformmatch with the oneliner form verdicting
viable-incomplete via the G-164 re-probe (the app's "-e requires a script
argument" reality) and the file form invalid.
(script)::punkexe::tclsh: scriptfile gains -regexprefail {^-} (stock
tclMain.c: a dash-led word in script-file position means NO script) and the
stdin form's first word is a declared fenced element 'firstarg'
(-regexprefail {^[^-]} - a non-dash first word IS a script file; not an
option, stays in ::argv). Selection now matches stock classification on
every line except the recorded LIMIT: the complete
'-encoding <name> <scriptfile>' shape word-shape-matches both forms (a
dash-led encoding NAME included - the engine consumes dash-led option
values, matching stock's unconstrained argv[2]) and stock's arity-priority
rule is not expressible per-word - the pair is declared
@form -overlapallowed {scriptfile} on the stdin form (formcheck sanction)
while parse raises multipleformmatches naming both forms per the G-041
no-silent-preference contract. Dispatch never parses these ids, so the
ambiguity surfaces only in declaration-driven consumers (help dry-runs,
completion), where the two-form diagnosis is the honest answer.
Decisions recorded in the archived detail file: dispatch parse-gating NOT
adopted (punkboot_core.tcl untouched; script/tclsh stay declared passthrough
surfaces - boot-path parse cost, stock-parity conflict with the LIMIT, app
error surfaces already honest and pinned, and the declaration-driven
consumers get parse-trueness without gating; no latency delta applicable);
the <punkexe> @form -synopsis overrides KEPT (neither the raw (script) id
nor @cmd -name is an invocable name; the stdin override keeps the
user-facing '?arg ...?' line over the model's firstarg/arg split) - the
G-144 archived follow-on flipped to declined accordingly (make.tcl's own
override retirement had already landed in the 0.41.0 arc). A real-vs-model
probe matrix (G-055 method; bin/punk91 dispatch + app-punkscript real side)
is recorded in the detail file - model matches real classification on every
line except the two complete-'-encoding' rows (the sanctioned LIMIT).
Tests: new args/punkexemodel.test (6 - script/tclsh selection matrices
against the real ids with the real-side oracle referenced, the bare-'-e'
viable-incomplete verdict, the ./-e fence message, -encoding fall-through
statuses (scriptfile invalid vs incomplete, stdin selected), the LIMIT pins
naming {scriptfile stdin} for both complete shapes); formcheck.test punkexe
GAPs flipped deliberately per the acceptance:
formcheck_punkexe_script_forms_discriminated (zero findings),
formcheck_punkexe_tclsh_forms_sanctioned (unsanctioned empty + the stdin
form's -overlapallowed pinned via get_spec; the positional-chain witness
derivation misses option-dependent overlaps - formcheck's documented miss
direction - so the sanction also future-proofs improved derivation),
formcheck_punkexe_primary_inputs_selection_sound (dispatch-true forms for
every primary line; empty input still selects file/stdin uniquely). Full
modules/punk/args subtree 337 passed / 3 pre-existing skips / 0 failed on
BOTH native tclsh90 (9.0.3) and tclsh87;
src/tests/shell/testsuites/punkexe/launcherhelp.test 24/24 unchanged per
acceptance (its 'help script'/'help tclsh' pins glob only @cmd -name
strings - row additions verified safe post-bake as well). Minted
modules/punk/args/moduledoc/punkexe-0.7.0.tm via make.tcl modules;
kits/bootsupport carry 0.6.1 until the next promotion/bake cycle.
Goals: G-168 entry moved to GOALS-archive.md, detail file to goals/archive/
with the probe matrix, both decisions and verification evidence; one open
Follow-on (arity-priority expressibility would flip the LIMIT pins; the
broader selection-soundness sweep stays recorded in G-150's archive).
Activation survey Related: line added (G-169 back-pointer). Reference sweep:
G-169 coordination note updated (G-168 landed first - the re-homed
definitions carry this fencing shape), G-170 dependency marked satisfied
(its dry-run arm inherits the recorded LIMIT). src/tests/modules AGENTS.md
punk/args bullet extended. goals_lint clean (82 active / 88 archived).
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
b0c92567a3 |
G-151 achieved: punk::args::parse_report landing report + ansistring TRUNCATE (args 0.18.0, ansi 0.2.0)
User-directed activation and implementation in one arc (proposed -> active at
the user's word with the activation-freshness overlap survey recorded, ->
achieved + archived on acceptance).
punk::args 0.18.0 - new parse_report: the annotated SUCCESS render (the
arg_error usage table's success-side sibling). One row per value-holding
argument (received, or -default in effect) in declaration-section order
(leaders, opts, values), columns Argument | Source | Value; Source carries
received / received xN / default (the plain-mode twin of the colour marking:
CLR(check)/CLR(parsekey_hint)); absent optionals get no row. Entry forms per
acceptance: a punk::args::parse result dict, or '<arglist> withid <id>' (the
parse is performed first - a rejected line raises the same validation error
parse would; errorcode parity pinned). Returns: table (bordered textblock
block, default), tableobject, string (plain lines; also the degraded
no-textblock path), dict (machine form - never elided). The canonical
demonstration pinned: {build punk95 -confirm 0} lands
'args (received x2) = -confirm 0' - a flag-like word consumed as a VALUE
visibly attributed to its consuming argument (the make.tcl dry-run
'kitname = punk91 -confirm 0' class from the G-143 sessions).
Display elision is type-aware, deterministic, always marked: strings
single-line-ized (ansistring VIEW -lf 1 -vt 1 -sp 0 - controls and embedded
ANSI render visibly so a value cannot disturb the table, real spaces stay
real) then grapheme-capped with '...' + ' (len N)'; -multiple/-type list
values element-capped '(+N more)'; -type dict values pair-capped
'(+N pairs)'. Width cascade per the G-149 plumbing precedent: caller
-valuewidth > new @cmd directive key -reportvaluewidth (documented in
define -help) > built-in 48; 0 = no cap; never console-derived (the G-007
emit-then-query lesson). Row data rides the G-049
private::parse_status_build structure - no second status assembler;
display-level bridging recovers the value-in-effect across the parse
result's storage-key folds (-parsekey renames, aliased optionsets'
last-|-member finalopts fold) so received aliased args keep their row -
engine-level rationalization recorded as a G-084 follow-on disposition.
The registered two-form definition (parsed/withid) follows parse_status's
structure - per-form @leaders first, then the shared @opts via a re-widened
@form selection (the resolver rejects leaders declared after a form's
options).
punk::ansi 0.2.0 - new ansistring TRUNCATE ?-ellipsis marker? string
maxgraphemes (design lean 4: the ANSI/grapheme-safe truncate primitive
homes in ansistring beside RANGE/VIEW): fits => byte-identical passthrough
(trailing and non-SGR codes included); truncation => RANGE-extracted prefix
(merged SGR re-application per the contract documented at 0.1.4) + marker
totalling exactly maxgraphemes, with an SGR reset appended before the
marker when the prefix carries codes; the marker is charged against the
budget and itself truncated when it alone meets/exceeds it; maxgraphemes 0
=> empty string. Grapheme-count based (column-aware variant a recorded
follow-on). Strict option handling (deliberately unlike VIEW's pinned
silent tolerance). Ensemble export + PUNKARGS argdoc + doctools comment.
Tests: new args/parsereport.test (13 - canonical attribution, entry
parity, dict shape/row order/row policy, solo+multi xN multiplicity,
per-type elision markers, dict-never-elided, width cascade,
single-line-ization, alias bridging, bordered/tableobject renders, failure
parity, bad calls, own-definition render); ansi/ansistring.test +2
TRUNCATE pins (budget/passthrough/errors; ANSI-reset + CJK +
combining-cluster safety). Full punk/args subtree 331 passed / 3
pre-existing skips / 0 failed and punk/ansi subtree 73/73 - each on native
tclsh90 (9.0.3) AND tclsh87; failure-side rendering unchanged per
acceptance. Minted modules/punk/args-0.18.0.tm + ansi-0.2.0.tm via
make.tcl modules; bootsupport/vfscommon promotion left to the next cycle -
make.tcl keeps its interim one-line report (and its 4-copy 'no annotated
success render yet' comment) until the promotion-gated follow-on lands.
Goals: G-151 entry moved to GOALS-archive.md, detail file to goals/archive/
with verification evidence and 5 Follow-on lines (make.tcl interim-report
retirement open; arg_error value-truncation via the same helpers open;
storage-key rationalization => goal G-084; column-aware TRUNCATE open;
word-oriented inverse view open). Activation-survey Related: lines recorded
(G-166, G-084, G-167 back-pointer); reference sweep updated G-170
(sequencing lean honoured - its dry-run arm consumes this render), G-167
archive marker, G-084 back-pointer note. src/tests/modules AGENTS.md
punk/args + punk/ansi bullets extended. goals_lint clean (83 active / 87
archived).
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
e25537bb50 |
punk::ansi 0.1.4: ansistring RANGE argdoc states the pinned contract
Documentation-only bump. The RANGE punk::args -help (and the doctools comment) now document the behaviours pinned by the 2026-08-05 ansistring coverage survey (ansi/ansistring.test), replacing the underspecified "including the ANSI codes in effect" wording: - SGR codes re-applied at each plain-text run in merged (canonicalized) form - style-equivalent but NOT byte-identical to the original. - SGR-only carriage: other sequence types (cursor movement, OSC, charset shifts) are not re-emitted. - Codes after the last requested grapheme are not included; trailing SGR state is retrievable with ansistring INDEXCODE end+1. - Index semantics: end-relative expressions, one-sided clamping, empty-string returns for both-beyond-same-end and inverted ranges (tcl string range consistency). The @cmd -summary reworded from "ANSI codes preserved" (overclaimed) to "SGR styling re-applied". Open design questions stay deliberately undocumented as contract - trailing codes on literal end (the shared TODO with opunk::Str RANGE and its whole-span $this shortcut divergence), non-SGR retention, charset/gx0 handling - recorded in code comments and G-151 Notes. ansi subtree 71/71 green (tclsh90); usage render verified carrying the new content. Minted modules/punk/ansi-0.1.4.tm via make.tcl modules; bootsupport/vfscommon promotion left to the next promotion cycle. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
45d8de1f45 |
G-151 design leans recorded + ansistring pre-modification coverage survey
G-151 (annotated success render) Notes gain the six user-agreed design leans from the 2026-08-05 shape discussion: 1. compact landing table (Argument | Source | Value) - a separate small arg_error-styled bordered block stacked under the usage render, not annotation of the usage table; existing -parsedargs/goodchoice marking stays; no per-value subtables (the report itself is the bordered block; G-088 footer docking possible later); arg-oriented rows in declaration-section order. 2. deterministic width caps (value column ~48, total ~80), never console-queried; configurable via the G-149 caller-option/@cmd-key plumbing; machine returns untruncated. 3. type-aware always-marked elision: strings single-line-ized then char-capped with '...' + '(len N)'; lists/multis element-capped with '(+N more)'; dicts pair-capped; pre-elided at data-prep, not via table column -maxwidth. 4. the ANSI/grapheme-safe truncate primitive homes in punk::ansi::ansistring; punk::args layers element/pair-count elision on top. 5. serving arg_error's value-truncation todo with the same helper is a follow-on, not acceptance. 6. rows only for value-holding arguments (received or default-in-effect). Lean 4's precondition (user direction): survey ansistring test coverage against codebase usage before any modification. DONE - usage-weighted survey (VIEW ~250 sites incl 124 '-lf 1'; VIEWSTYLE/VIEWCODES/NEW ~40 interactive sites; RANGE 8) produced 8 new characterization pins in ansistring.test, green 71/71 on native tclsh90 (9.0.3) and tcl87: - VIEW -lf 0/1/2 single-line-ization modes, tab/cr defaults, no-arg empty return; always-on NUL substitution + silent unknown-option tolerance (load-bearing for overtype's '-nul 1' CRM sites) + unpaired-option error; 8-bit C1 CSI bracketed representation and ZWSP visible-tag visuals. - RANGE prefix/end-relative/clamping semantics, plus the truncate-relevant facts: merged code-stack re-emission (full-range extraction is ansistrip-identical but not byte-identical) and codes trailing the last grapheme DROPPED (matches the source TODO) - fetch trailing state via INDEXCODE end+1 when it matters. - COUNT (graphemes, combining accents cluster) vs length (stripped characters) divergence pinned on a decomposed-accent fixture. - KNOWN-DEFICIENCY pin: VIEWCODES/VIEWSTYLE raise invalid-command in a plain punk::ansi interp (class methods call the bare 'a+'/'a' interactive aliases) - pinned in a fresh child interp so the verdict is independent of runner mode; flip deliberately when the class renders alias-free. - NEW object basics: class identity, count/length/stripped/view parity with the ensemble surface, destroy. Survey outcome + implementation cautions recorded under lean 4 in the G-151 Notes; src/tests/modules AGENTS.md punk/ansi bullet extended. goals_lint clean (84 active, 86 archived). Environment note: agent-harness shells set NO_COLOR=1, which blanks the live highlight SGRs grepstr.test pins expect (the recorded tcl90-baseline grepstr(2)) - unset it for colour-dependent suite runs; the new pins are colour-state independent per suite convention. Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
fa483ec2e3 |
AGENTS docs: international-English idiom rule; tabled -> tabular in live agent docs
Root AGENTS.md User Preferences gains the idiom discipline bullet (user, 2026-08-05): agent-authored prose avoids idioms whose meaning differs or reverses across English variants (to table, momentarily, presently, moot, punt, luck out, out of pocket, bi-weekly, fortnight, knock back, on the nose, quite <adj>); table-formatted punk::args output is written 'tabular usage'/'tabular help', never 'tabled'. Established technical slang (dogfooding, spike testing) stays fine. Applied to the seven live agent-doc instances: ARCHITECTURE.md, bin/AGENTS.md, src/AGENTS.md, src/bootsupport/AGENTS.md (x2), src/vfs/AGENTS.md (x2); architecture_lint clean. Deliberately unchanged: archived goal records (historical wording), goals/G-168 Acceptance (contract prose - separate approval), and code-tier comments/strings plus their synced copies (undecided). Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
127ad36877 |
punk::args pre-tests for the G-168/G-169/G-170 family + G-170<->G-151 cross-links
Engine-primitive pins landed green ahead of activating the launcher definition/documentation/help-depth goals (args subtree 321 tests: 318 pass, 3 known-bug skips, 0 fail on native tclsh90 9.0.3 and tcl87): - forms.test: candidacy fencing/fall-through group (G-168 pre-work) - regexprefail-fenced autoselection fixture pin (args-tier twin of the G-150 cmdhelp.test pins), a -regexprefail rejection on an OPTIONAL value slot is form-fatal with NO re-landing on later permissive slots (contrast optional-choice rejection), unknown-option / dangling-option / option-satisfied-but-values-unmet failures fall through to sibling forms as successful parses, option-VALUE fences participate in candidacy, and the documented per-word limit: a complete '-encoding <name> <file>' line double-matches a fenced scriptfile form vs a dash-tolerant stdin form (stock's scriptfile-wins-when-complete priority is not expressible per-word - multipleformmatches per the G-041 contract). - formviability.test: dangling-OPTIONAL-option verdict conservatism - the G-164 re-probe re-seats only words naming missing REQUIRED options, so the tclsh '-encoding' dangling class stays invalid although completable. - errorselection.test: a dangling optional value-taking option word seats as a trailing value and overflows a zero-value window as plain toomanyarguments (no -badarg attribution). - formcheck.test: GAP before-state pins of the punkexe launch definitions - unsanctioned structural overlaps for script file/oneliner and tclsh scriptfile/stdin, and every primary launch line double-matching; flipped deliberately when G-168 lands per its Acceptance. - docpackages.test (new): registered-namespace lazy definition loading characterization (G-169 pre-work) - inert registration with scan-vs-load split, id_exists never triggers loading, real_id/usage lazily resolve tag-prefixed script-level id families, duplicate definers resolve last-loaded-wins with only a stderr undefine notice (the engine's recorded detect-duplicates todo), degraded paths clean. Goal notes (non-contract): pre-test findings recorded in G-168 (including the '-e'-must-be-a-required-flag declaration constraint and the residual-overlap design limit) and G-169 (handover must withdraw the moduledoc entry in the same change-set - no duplicate warning surface exists); G-170<->G-151 Related: cross-links added both ways - the dry-run arm renders G-151's punk::args-level landing report, a link the path-based overlap surveys could not surface. src/tests/modules AGENTS.md punk/args bullet extended for the new coverage. goals_lint clean (84 active, 86 archived). Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 days ago |
|
|
b0f206f53b |
G-168/G-169/G-170 drafted: launcher definition/documentation/help-depth family (user-approved)
Three [proposed] goals from the 2026-08-05 formhint-arc discussion of
why launcher help stops at the subject word:
G-168 selection-sound launch definitions - script/tclsh forms made
parse-discriminable with EXISTING vocabulary (file form -regexprefail
{^-e$} + oneliner '-e' element; tclsh scriptfile-vs-stdin via
candidacy fall-through matching stock semantics). Corrects the
discussion's earlier assumption that G-072 negation was required:
-regexprefail participates in form matching (G-143-arc verified; the
G-150 hash declaration is the dash-led precedent). Includes the
dispatch parse-gating decision (tabled vs app-plain errors, latency
measured if adopted).
G-169 app-owned launch-subcommand documentation - app-punkscript owns
(script)::punkexe::script via inert registration, launcher resolves
lazily (the existing argsid/package/docpackages machinery), single
definer per id, ownership rule recorded (app-owned for app-handled,
moduledoc for core-owned like tclsh), and the *_main.tcl declaration
surface (summary/package/argsid/parse) documented as the official
authoring mechanism.
G-170 launcher help depth - 'help <sub> <formname|index>' narrowing
(G-150 usage -form precedent), make.tcl-style dry-run gated on
parse-trueness (G-168 built-ins, project parse=1) with the
prepend-help idiom preserved for passthrough subcommands, and the
punkexe 0.6.1 interim -formhint suppression flipped to real
' <punkexe> help <sub> %formname%' templates.
Follow-on handling (user-approved leans): G-144's override-set
follow-on flipped => goal G-168 (the make.tcl half landed in the
G-143 arc; the punkexe-moduledoc half is now G-168's recorded
decision); G-150's selection-soundness sweep follow-on stays open
(broader than these two definitions - G-168's Notes record the
partial enactment). Overlap survey per the authoring workflow:
G-089/G-055/G-072/G-075/G-042/G-043/G-044 relationships recorded in
the detail files; app-punkscript intersects no live goals.
goals_lint clean (84 active, 86 archived).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
97fede0254 |
punkexe moduledoc 0.6.1: interim formhint suppression on the multi-form launcher definitions
(script)::punkexe::script and ::tclsh declare '@cmd -formhint ""'
(user direction 2026-08-05), suppressing the usage table's per-form
hint labels under punk::args 0.17.0+ (older snapshots ignore the key
and keep the ' i -form N ...' default - harmless). Rationale: the
repl-oriented default is not typeable at the CLI where these tables
render, and the (script) ids live in the boot interp - invisible to
the repl's 'i'. A make.tcl-style actionable replacement does not
exist: launcher help is deliberately subject-only (trailing words
ignored - the prepend-help idiom, G-032 single-mechanism revision),
so there is no per-form destination a hint could name, and a
' <punkexe> help <sub>' pointer would be circular on the help path
and redundant on the dispatch-error path (that table already shows
all forms). Auto-selection cannot substitute either: the oneliner
form's '-e' is dispatch-detected, not declared, and the file form's
optional string scriptfile legitimately accepts '-e' (a file so
named stays reachable as ./-e) - clean double-match, and expressing
"any string except -e" needs G-072-class negation.
Interim: if launcher help gains form-name narrowing ('help script
oneliner' via usage -form, the G-150 cmdhelp precedent - candidate
goal on request), the suppression becomes a real
' <punkexe> help <sub> %formname%' template. In-definition comments
+ the buildversion changelog record the decision. Verified on dev
modules: no hint labels, Synopsis section and all four @form
-synopsis lines intact for both ids. launcherhelp.test pins are
presence/exit-code only - unaffected pre- and post-rebake; no
kit-tier suppression pin added for an interim measure.
_vfscommon.vfs picks up punkexe-0.6.1.tm (mint + vfscommonupdate;
not in bootsupport's include list). Reaches kits at the user's
selective rebakes.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
818a39d349 |
vfscommonupdate: _vfscommon.vfs picks up punk::args 0.17.0, tclcore moduledoc 0.4.0, punk::ns 0.9.3, templates refresh
make.tcl vfscommonupdate -confirm 0 on the clean tree, mirroring the |
4 days ago |
|
|
57d3dec3b2 |
G-149 follow-on landed: make.tcl adopts @cmd -formhint - actionable per-action help hints with honest continuation ellipsis (punkshell 0.55.1)
The multi-form definitions (tool, buildsuite) each declare
'@cmd -formhint " make.tcl help <sub> %formname% …"', so
'make.tcl help tool' / 'help buildsuite' - and every dispatch usage
error for those subcommands - label each form's synopsis line with the
concrete dry-run-help invocation (' make.tcl help tool build ...'
rendered with U+2026) instead of the repl-oriented ' i -form N ...'
default, which is unreachable for (script) ids. Renders via the
promoted bootsupport punk::args 0.17.0; under older snapshots (e.g
generated projects) the key is ignored and the default labels render.
Design decisions (user direction 2026-08-05, recorded in the follow-on
disposition): the trailing ellipsis is required for honesty - help
DRY-RUNS the form's own command line after the action (G-143), so a
hint without it misrepresents the invocation as complete. The template
was kept over empty-string suppression because the labels also render
on dispatch usage errors ('make.tcl tool frobnicate'), where the user
never typed help and the hint is the discovery route to per-action
help; suppression would lose that teaching path.
maketclhelp.test: tool formhints pin flipped to the new labels with an
olddefaulthint-absent guard; buildsuite multiform test gains the same
pair; header + provenance comments updated. The ellipsis is matched as
its utf-8 byte triple (format %c%c%c 0xe2 0x80 0xa6) because
maketcl_run reads the child pipe -translation binary, so multibyte
chars arrive byte-wise - a real U+2026 char in the pattern can never
match (first-cut pin failed green-render for exactly this). 12/12
green on tclsh90; maketcltool.test 4/4.
Sync outputs batched per policy (make.tcl modules + bootsupport): the
basic + project-0.1 layout make.tcl copies, the modpod source-tree
copy, and the bootsupport templates-0.2.0.tm repack all carry the
identical +2-line change. The archived G-149 follow-on disposition
flipped => landed 2026-08-05 (the sanctioned same-work-unit edit);
goals_lint clean. punkshell 0.55.1 + CHANGELOG (make.tcl help output
is product surface - patch). Kits pick this up at the next
vfscommonupdate + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 days ago |
|
|
b8cbfe0cba |
bootsupport promotion: punk::args 0.17.0 (G-149 formhint + G-073 0.16.0), tclcore moduledoc 0.4.0, punk::ns 0.9.3, templates refresh
make.tcl modules + make.tcl bootsupport on the clean tree. The punk::args snapshot jumps 0.15.1 -> 0.17.0, carrying both pending minors: 0.16.0 (G-073 -choiceunavailable, committed |
4 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 |
4 days ago |
|
|
ac8e26ab20 |
G-167 drafted: punk::args version-delta availability - unavailable @forms for shape deltas, unavailable option names for flag deltas
New proposed goal (user-approved wording, from the post-G-073 design discussion 2026-08-05): version/context deltas of a command's interface become declarable and honestly surfaced without delta computation, layered by delta kind. An @form may be declared unavailable - participating in candidacy/diagnosis, displayed annotated, tailored formunavailable rejection when only unavailable forms match, silent resolution to the available form when both match (the first sanctioned exception to G-041's no-silent-preference rule: documentation never competes with reality), -form selection displays but refuses parse. Option NAMES may be declared unavailable (the G-073 mirror at the option-name level) with pointed tailored rejection. The default render stays on available forms plus an AUTOMATED note enumerating unavailable shapes (name + authored note + navigation hint - no computed delta; user display decision relaxing the strict G-073 display-among-peers principle for shape deltas only, since named things keep per-name display via the option/choice layers). formstatus gains an additive 'available' field (G-152 contract) as the machine surface, and authoring guidance prescribes -choiceunavailable for subcommand-shaped deltas so the same concept never surfaces through two inconsistent paths. Detail file records the layered-model rationale, the silent-preference exception scope, the two-paths trap prescription, era authoring via shared -form tags (one form per version era - linear), engine seams, and the relations/overlap survey (G-073 foundation, G-166 sibling surface, G-152/G-041/G-074/G-150/G-149/G-044/G-055). Acceptance and the lsearch -stride adoption candidate are agent-derived for user review; status proposed. goals_lint clean (82 active / 85 archived). Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
69927531a4 |
G-073 achieved: punk::args unavailable choices (-choiceunavailable) + G-166 drafted (punk::args 0.16.0, tclcore moduledoc 0.4.0, punk::ns 0.9.3)
New per-argument key -choiceunavailable <list>: names recognised but not
available in the current runtime/context. Entries display among the
choices under a dedicated "Unavailable (recognised, not selectable
here)" group (one rendering-side injection - both renderers,
choicelabels notes, choiceinfo markers, trie prefix marking and
value-in-effect exclusion all inherited) and join the prefix pools;
synopsis literals and goodchoice marking never include them. Resolve
-time validation: no collision with choices/alias names/reservelist,
-default may not be unavailable, requires -choices/-choicegroups.
choiceword_match gains an optional 8th argument and an 'unavailable'
result key (matched stays 0 - matched-only consumers unaffected):
exact, nocase and unique-prefix landings carry the name as canonical; a
prefix shared with an available choice stays plain-ambiguous.
Validation rejects a landing with the tailored PUNKARGS VALIDATION
{choiceunavailable <name> choices <list>} error (-badarg/-badval;
private::unavailable_choice_msg names the supplied word, the resolved
entry, its choicelabel note and the available values; shared by final
validation and both G-082 overflow raise sites via rejection kind
'unavailable' from the allocation screen). Ambiguity messages annotate
unavailable longer matches '(recognised but unavailable)';
-choicerestricted 0 keeps full passthrough.
tclcore 'string is' adoption: curated forward list {dict} ('unicode'
deliberately excluded) diffed against the define-time harvest; labels
and per-class virtual ids extend to unavailable classes. On Tcl 8.6:
dict displays with its "(class not present in Tcl 8.6)" note,
'string is dict' rejects informatively, 'string is di' is ambiguous
(deliberately stricter than real 8.6 - recorded as a user-sanctioned
parity exemption; full words parity-true), and 'i string is dict'
documents via the virtual id. punk::ns cmd_traverse passes the key at
both resolver sites (doc-walk parity; the choice-traverse comment now
documents the choice-resolution vs doc-addressing axes split). tclcore
moduledoc requires punk::args 0.16.0-.
Tests: new choiceunavailable.test (10 tests); usagemarking.test gains
the goodchoice-exclusion pin; tclcoreparity.test gains forward-class
adoption invariants and the sanctioned 'di' strictness exemption, with
the version_notes pin deliberately flipped (dict's label now renders on
every runtime). Green: the three suites 37/37 on native Tcl 8.6.10
(luck runtime), 8.7a6 and 9.0.3; punk/args subtree 293/290/3 skips/0
fail on 9.0.3 AND 8.7; modules/punk sweep green except the three
documented pre-existing box-baseline failures (grepstr x2, nslist x1);
ns cmdhelp/corp 58/58 after the comment clarification.
Goals: G-073 flipped achieved 2026-08-05 + archived (index record
moved, detail file to goals/archive with Progress/verification and 3
follow-ons). G-166 drafted [proposed] at user direction (approved
wording): cmdinfo availability key + cmdhelp marking + tclcore leading
note + prefix-landing decision; the enacted G-073 follow-on flipped
=> goal G-166, the G-055 pattern follow-on => goal G-055 with a Notes
pointer added there. goals_lint clean. punkshell 0.54.0 + CHANGELOG.
Bootsupport/vfscommon snapshots unchanged until promotion + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
d2094364a3 |
G-082 follow-on landed: required typed value/leader misreport -> pointed typemismatch (punk::args 0.15.2)
A REQUIRED typed value or leader whose present word fails the basic-type allocation screen (int/double/bool/number/dict) now reports the pointed typemismatch naming the word and argument (-badarg/-badval, same shape as the G-082 overflow-site selection) instead of the generic missingrequiredvalue/missingrequiredleader shortfall. The in-loop required-arg raise sites consult the rejection record returned by get_dict_can_assign_value; the leaders-loop edit mirrors the values loop per the MAINTENANCE contract. Unchanged by design: end-of-input shortages (valuemissing/count classes), literal-typed members, multi-member clause partials (no rejection record - conservatism preserved), and required-arg choice words (never screened - G-071 asymmetry, choiceviolation already pointed). parse_status: the shape now classifies invalid/typemismatch (the formstatus viability verdict was already invalid; one probe re-parse saved); argdoc status-key note updated. Pins deliberately flipped: parsestatus.test (renamed parsestatus_typed_value_screen_typemismatch), formviability.test (single-form top-status/formstatus split demo re-anchored on a required-option shape), punk/ns cmdhelp.test message match. New errorselection.test coverage: required value + leader typemismatch pins plus unchanged-shape guards. Verified tcl 9.0.3: punk/args subtree 280 total / 277 passed / 3 intended skips / 0 failed; punk/ns only the pre-existing nslist(1) box-baseline failure (stash-verified unrelated). tcl 8.7: touched args suites 38/38, cmdhelp 45/45. Follow-on disposition flipped => landed in goals/archive/G-082-punkargs-error-selection.md (goals_lint clean; ledger 23 open / 20 goal / 15 landed / 2 declined). punkshell 0.53.1 + CHANGELOG entry. Bootsupport/vfscommon args copies stay 0.15.1 until the next promotion + bake. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
621e57fd15 |
G-106 follow-on landed: raw-mode typing feel user-confirmed on the suite runtime
The one manual residue on G-106 - interactive typing-experience confirmation of raw mode where the pwsh consolemode fallback does the mode flipping - is confirmed by the user on tclsh9.0.5-punk.exe (the store-active twapi-less suite 9.0.5 runtime). Disposition flipped open -> landed 2026-08-05. Disposition-only edit per the goals/AGENTS.md Follow-ons contract. goals_lint clean; goals_followons now 24 open / 20 goal / 14 landed / 2 declined. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
99402a1e4d |
G-087 + G-139 follow-on dispositions: link_as landed in-goal, linux lib-tier became G-140
Evidence-checked continuation of the archive follow-on sweep: - G-087 fauxlink link_as encoder => landed 2026-07-17: implemented in fauxlink 0.2.0 (link_as + punk::args doc, upstream checkin 1e6b4ee8) within the goal's own stage 2; the '=> open' marker derived from Notes prose written earlier that same day, before stage 2 landed. - G-139 linux-x86_64 lib-tier emission for punk9linux's tcllibc siblings => goal G-140: G-140's delivered scope covers the item exactly (tcllibc-tcl9-r1 emission, sibling replacement/supersede, punkbin publication f94ffd2) and its record cites the G-139 flip note as its origin. Disposition-only edits per the goals/AGENTS.md Follow-ons contract. goals_lint clean; goals_followons now 25 open / 20 goal / 13 landed / 2 declined (count also reflects c7470dac's G-165 mkimg-retirement landing, committed independently of this pair). Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
c7470dac53 |
G-165 runtime-side follow-on landed: retire mkimg from the buildsuite wrap lane
zipfs_wrap.tcl (renamed from zipfs_mkimg.tcl, same CLI contract): payload zip written by the driving shell's builtin tcl::zipfs::mkzip - convention-stable across mkimg vintages (probed 8.7a6 vs 9.0.3: identical member tables/CRCs) - with the prefix executable concatenated OUTSIDE the writer, plus an EOCD archive-relative self-check per wrap (exit 9 on file-relative output). build905.zig wrap lane updated (3 call sites, identifiers zipwrap_*); suite README states the wrap contract; G-165 follow-on disposition => landed. Verified: standalone wraps under both vintages mount/boot identically (840 members, base=prefix); suite make-zipfs/smoke/kit-family green - all 5 products probe archive-relative and boot (family_check plain/punk/punk-bi, tclsh90szip smoke, tclsh90sprzip manual boot). Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
64a8916d36 |
G-122 follow-on dispositions: both open items were enacted by goals (G-124, G-125)
The G-159 retrofit recorded both of G-122's deferred items as '=> open', but each had already been enacted by a drafted goal that cites G-122 as its motivation: - pure-Tcl zip decoder for the zipfs-less bake path => goal G-124 (punk::zip::unzip/members/archive_info, achieved 2026-07-26; make.tcl extraction still consumes it and no zipfile::decode requirement remains in the tree) - refuse-to-deploy on missing tcl_library => goal G-125 (boot-precondition gate punkboot::utils::vfs_boot_library_report, achieved 2026-07-27) Disposition-only edit per the goals/AGENTS.md Follow-ons contract. goals_lint clean; goals_followons report now 28 open / 19 goal / 11 landed / 2 declined. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
62c596cec7 |
Single-help-mechanism outputs: core 0.5.0 delivered (vfscommon), moduledoc 0.6.0/0.3.0, pending module promotions swept
make.tcl modules + vfscommonupdate + bake ripple (native Tcl903 driver) from the single-mechanism change-set ac19df2a: _vfscommon punkboot/core.tcl regenerated from the 0.5.0 master; moduledoc::punkexe 0.5.0 -> 0.6.0 and moduledoc::punkboot 0.2.0 -> 0.3.0 version renames; punk::mix templates modpod repacked carrying the layout _config sweep (modpod-template copies + layout make.tcl copies via the established sync channels). The same vfscommonupdate swept in promotions pending from committed src work of the last sessions: commandstack 0.7.1, punk::args 0.15.1, punk::auto_exec 0.1.1, punk::ns 0.9.2, punk::tcltestrun 0.4.2, punk::zip 0.4.0. Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
ac19df2a24 |
Launcher/make.tcl single help mechanism (user direction; core 0.5.0, 0.53.0)
All -help/--help flag interception withdrawn from the kit launcher and
make.tcl: the leading 'help' word is the ONE help entry (the punkshell
'i <cmd> ...' idiom). It felt like too many ways to do the same thing
and was already colliding - the experimental shellspy processor's own
-help/--help handling was shadowed by the dispatch intercept; it is
reachable again.
Launcher (boot core 0.4.0 -> 0.5.0, moduledoc::punkexe 0.6.0,
moduledoc::punkboot 0.3.0):
- 'help <subcommand> ?arg ...?' accepts and IGNORES trailing words, so
'help' can be prepended to an existing command line ('punk9_beta help
tclsh somefile somearg' now shows the tclsh usage instead of
confusingly falling back to the top-level table).
- Subject validation parses ONLY the subject word against a new
required-subject clone (script)::punkexe.launcherhelpsubject
(resolved_def -antiglobs {arg} -override subject -optional 0): the
display-shape clone let punk::args SKIP a mistyped optional subject
into the unconstrained arg row, silently rendering the top table
where a tabled choice error is wanted (exit 1).
- A leading '-help' falls under the unknown-first-argument refusal
(stderr usage answers it, exit 1); '<subcommand> -help' is the
subcommand's own argument: tclsh regains exception-free stock dash
parity, buildinfo refuses it like any argument (exit 2), a
parse-declared registration rejects it like any undeclared flag.
make.tcl: the wants_help subargs scan ('<subcommand> ... -help') and
the top-level/degraded-scan help-flag branches are removed, along with
the help_flags variable - 'make.tcl bakelist -help' now fails the
kitname choice gate exactly like 'make.tcl bakelist nonexistant', and
'make.tcl -help' the subcommand choice gate (exit 1), the usage error
itself carrying the documentation. 'make.tcl help <sub> <cmdline>'
dry-run behaviour unchanged.
Tests re-pinned to the revised contract (launcherhelp.test with a
kit_nodashhelp probe gate + trailing-args coverage, maketclhelp.test,
maketclcolour.test); punkexe subtree 152/148/4skip/0fail against
freshly baked zipfs + metakit kits; core copies byte-identical across
master/_vfscommon/layout/modpod-template channels.
Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
caf7572c30 |
G-165 achieved 2026-08-04: driver-invariant kit assembly (single zip writer path, punkzip acceleration, file-relative opt-in) (punkshell 0.52.0)
- make.tcl: tcl::zipfs::mkimg retired from zip-kit assembly - every bake assembles via assemble_zipcat_image (punk::zip::mkzip + runtime prefix concatenated outside the writer), so kits are ARCHIVE-relative on every driving tcl (legacy file-relative mkimg in 8.7/9.0.0, fixed in 9.0.1+, or none). bake/bakehouse -force added (bypass the no-change skip). punkkit-stamp.toml written with pinned LF translation (was driver-dependent crlf/lf). G-134 pin warns only on UNDECLARED file-relative output and exempts kits declaring offsetstyle = "file". - punk::zip 0.4.0: write-path acceleration seam in mkzip (mirrors the G-126 read-path pattern) - punkzip build -b/-x when bin/punkzip resolves, pure-Tcl floor unchanged, produced archive verified against the walk result with silent fallback; -offsettype file and -runtime/-zipkit prefixes always floor. - punkzip 2.4.0 re-vendored (upstream 2599127): build -b root-strip and repeatable -x exclusion (mkzip semantics; zig build test green). - mapvfs.toml: offsetstyle key (zip-type kits, "file" only) documented and validated; [kit.punkfiledemo] declared opt-in specimen. - Tests: zipwriteaccel.test (accelerated-vs-floor parity incl. the _vfscommon.vfs payload); offsetstyle.test baseline exempts declared kits; maketclhelp bakehouse synopsis pin updated for -force. - Docs: src/AGENTS.md, bin/AGENTS.md, src/runtime/AGENTS.md single-writer contract; make.tcl workflow text. - Acceptance (reference machine): four driver classes (8.7a6, 9.0.3, native 8.6, msys2 8.6) all probe archive with identical member sets and CRCs; no-punkzip bake equivalent; opt-in kit probes file; suites green both runner modes. punkzip 2.4.0 published to the punkbin tools tier (punkbin a22e16b). punkproject 0.52.0. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
45fd5e7c87 |
G-165 proposed: driver-invariant kit assembly (single zip writer path, punkzip acceleration, file-relative opt-in)
Every make.tcl zip-kit bake is to emit an ARCHIVE-relative kit regardless of the driving interpreter's zipfs vintage (legacy file-relative mkimg in 8.7/9.0.0, fixed mkimg in 9.0.1+, or no mkimg at all): zip-kit assembly moves to a single writer layer - punkzip (zig) when its binary is present, punk::zip::mkzip (pure Tcl) as the always-available floor - with tcl::zipfs::mkimg retired from the pipeline, and file-relative output only via an explicit per-kit mapvfs.toml opt-in. Workstream order (user decision): upstream punkzip root-strip/exclude enabling changes first, then the punkshell seam. The detail file carries the driver-vintage probe evidence (8.7a6=file, 9.0.3=archive), the upstream fix provenance (ticket aaa84fbbc5, core 3d62ee540d 2024-12-05), the write-path benchmark (mkimg 11.4/35.9s vs mkzip 8.1/24.8s vs punkzip 6.7/20.0s at 132MB/396MB), the drafting-time overlap survey and Related lines. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
5ac0d4c0f0 |
punk::tcltestrun 0.4.2: closing-banner prefix match exact compare (G-161 follow-on landed) (0.51.2)
The closing-banner prefix check 'string match "$line_inner*"' treated the raw test name as a glob pattern, so a test NAME containing glob metacharacters (* ? [ ] backslash) never matched its own opening text: the closing banner failed to close the failure section and every later event including the summary line was swallowed (the G-161 wedge class; latent, unexercised in the corpus). The check is now an exact byte prefix compare (string equal -length) - identical semantics for ordinary names, and an empty line_inner keeps the historic match-everything behaviour. New parsetestrun-globname-7.0/7.1 pins: 8/8 green tclsh90 single+multi-process and tclsh86, parser dir 10/10. Landed directly at user direction from the archived G-161 Follow-ons - disposition flipped to landed in the same change-set (the sanctioned archived-file edit). runner/AGENTS.md parser coverage bullet updated. CHANGELOG + punkproject 0.51.2. Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
1605b97b37 |
G-164 achieved 2026-08-04: punk::args 0.15.1 viability probe alternative-allocation re-probe (punkshell 0.51.1)
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
f9ae712620 |
AGENTS.md: commit granularity + cadence guidance (user, 2026-08-04)
- User Preferences: lean towards larger commits when splitting adds complexity (a goal drafted from discussion during another goal''s implementation may land in the same commit or one goals-tier commit; no partial-hunk staging gymnastics for per-goal purity); corollary - agents OFFER to commit at seams (green test gate, coherent sub-change, before a new concern) rather than letting the uncommitted set grow past the natural split - Commit Conventions: pointer bullet to the new preference Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |
|
|
71b388e30a |
G-164 proposed: viability probe alternative-allocation re-probe (reservation-stolen flag words) + G-044 note
- new goal (user-drafted 2026-08-04): when the valmin reservation seats a word that literally names a declared required option into a required value slot and the resulting optionmissing stands in the G-152 viability probe, re-parse with the stolen word(s) consumed as the option they name; pure end-of-input exhaustion after that re-seating grants viable-incomplete. Runtime seating unchanged (the trailing-flag-as-value rule is load-bearing, pinned by flagvalues_plain_then_dash) - surfaced by the G-150 batch + independent second-session review: 'i hash -t' classes the test form '(not viable)' although 'hash -t foo' is valid - a false negative, GAP-pinned in cmdhelp.test (owned by this goal; the pin flips at achievement) - overlap survey in the detail file (G-044 consumer; G-152/G-150 archived relations; args/ns family anchors dismissed as unrelated mechanisms) - G-044 Notes: records G-164 as the probe-layer answer to G-152's "completion consumer lookahead" note for the valmin-reservation class - goals_lint clean (82 active, 82 archived) Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai |
5 days ago |