Tree:
43973fa5fd
master
v0.1a
${ noResults }
523 Commits (43973fa5fdbb68482fdaff9530e5ce7ff7fca73f)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
43973fa5fd |
goals: draft G-179 punk::args discriminator shadowing (opt-in -formselection literalshadow)
Follow-through from G-174: with the walk conserving the tail, 'i a? web
green' honestly reports the web/sample ambiguity - but a?'s implementation
is literal-first else-branch dispatch, so the loose sample form can never
receive a sibling form's literal discriminator word. The declaration
over-admits, and per-type exclusion lists would be cross-referential drift.
G-179 (proposed): definition-level opt-in (-formselection literalshadow) -
among clean matches, a form whose leading discriminator run (literal/
literalprefix alternates or restricted choice sets, form_literal_affinity's
notion) agreed with the supplied words shadows forms accepting the same word
positions only via loose types. Loose-vs-loose ambiguity stays honest,
noformmatch ranking untouched, undeclared definitions byte-identical,
shadowed forms stay introspectable in formstatus; punk::ansi::a? adoption
plus the three cmdhelp.test G-174 presentation-pin flips are in the
acceptance. Related: G-041 (opt-in carve-out from its no-preference
default), G-167 (sibling candidacy filter at the same seam), G-152/G-164,
G-150, G-083, G-174, G-175, G-177, G-072.
Collateral: the G-174 archived follow-on ("tighten a?'s loose sample form"
=> declined) re-dispositioned to => goal G-179 - this goal enacts its intent
by declaration-level means rather than the type-exclusion approach the
decline was about.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
15 hours ago |
|
|
6cc7e8751c |
punk::ns 0.11.1: G-174 cmd_traverse word accounting - doc-lookup walk never drops argument words (project 0.66.3)
The walk behind cmdinfo dropped all but the last trailing word for commands
whose definition's first form is zero-arg with no leaders (the punk::ansi::a?
class): the empty-leader position fell through to the outer per-word loop,
whose exhaustion return reported only the last tail snapshot - dropped words
landed in neither args_resolved nor args_remaining, so cmdhelp's advisory
parse cleanly mis-narrowed 'i a? web green' to the loose sample form with no
failure signal anywhere.
- cmd_traverse: the empty-leader position returns new lane 11 with the
unconsumed tail (remaining shape mirrors the code-3 lane); word-accounting
contract stated at the record comment (conservation; sanctioned exceptions:
ensemble-parameter re-presentation, alias/script currying; first-form-only
inspection recorded as a limit); stale code-7 witness comment corrected
('i namespace which -v x' actually terminates in the code-8 lane).
- cmdflow.test: traverse_final/word_accounting helpers, fixtures
flowmultiform (a?-shaped) / flowmultilead / flownomap / flowplainlead,
lane-code + conservation battery across return lanes 0a,2,X,3,4,6,7,8,9,10,11
(code-7 and code-10 witnessed for the first time), multi-word no-drop pins,
the real-world a? witness, and the first-form-only recorded-limit pin.
- cmdhelp.test: 'a? web green' -return dict (multipleformmatches, formstatus
keys {web sample}) and -return text (web's argument section before sample's)
presentation pins, plus the punk::ns::synopsis underline-marking pin.
- Witness: pre-fix, 8 of the 9 new tests fail (5 cmdflow + 3 cmdhelp);
post-fix punk/ns subtree green on canonical tclsh90s (138 pass, 2
pre-existing gated skips), cmdflow+cmdhelp green on tclsh86ts (86/86).
- G-174 activated on user direction, flipped achieved 2026-08-09 and archived
(entry to GOALS-archive.md, detail to goals/archive/ with Follow-ons);
suite-index DOX updated; project 0.66.3 + CHANGELOG entry.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
15 hours ago |
|
|
2655f278f1 |
make.tcl dry-run help: parse_report landing table (G-151 follow-on; project 0.66.2)
An accepted 'make.tcl help <subcommand> <cmdline...>' line now stacks punk::args::parse_report's annotated success render - the Argument|Source|Value landing table (received args plus defaults-in-effect) - under the usage render, after the unchanged 'dry-run: line accepted (form N)' line. The interim hand-assembled one-line received-args clue remains only as the catch-guarded degrade fallback (G-030 rule: stale pre-0.18.0 bootsupport punk::args or broken render stack). The gating bootsupport promotion (args 0.25.2 + ansi 0.2.1) already landed, so the render is live. - src/make.tcl: parse_report call + degrade fallback; the two layout copies and the modpod template copy refreshed via the thin-layout sync (make.tcl modules run from src/) - maketclhelp.test: accepted-line pins flipped to landing-row regexps, new reporthdr/default2b pins; 12/12 green (the 10 maketclbakelist/maketcllibfetch failures are the pre-existing non-interactive root-launch staleness-gate baseline - source punk::args 0.26.0 vs bootsupport 0.25.2 - not regressions) - src/AGENTS.md: help bullet now describes the landing table + degrade path - punkproject.toml 0.66.2 + CHANGELOG entry (make.tcl help output is product surface) - goals/archive/G-151-punkargs-annotated-success-render.md: make.tcl follow-on disposition => landed 2026-08-09 Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
3abfe674fa |
punk::args 0.26.0: bound received-value display in validation error messages (G-151 follow-on)
Serves the engine's 'truncate/summarize values in error messages' todo (G-151 lean 5, explicitly deferred from that goal's acceptance). New private::error_display_value wraps the G-151 report_display_value / ansistring TRUNCATE machinery (string mode: single-line-ize with visible control/ANSI rendering, then grapheme-cap with '...' plus ' (len N)') and is applied at every site interpolating a received word into a validation error message: the check_clausecolumn type/size/range/regexprefail reports, the leaders/values allocation-rejection and choiceviolation/ ambiguous-prefix sites, the multi-value clause echo, the -allow_ansi character-view (previously unbounded ansistring VIEW), and the Unexpected-option unknown-flag word. Width cascade: definition-level '@cmd -reportvaluewidth' > built-in 48; 0 = no cap (define -help documents the extension). Display-only: -badarg/-badval errorcode fields keep the raw words. Safety properties: a short plain value (within budget, no C0/C1/DEL content) displays byte-identical via a cheap fast path - important both for the existing message pins (all held unchanged) and because check_clausecolumn builds candidate messages for type alternatives that may never be raised; and the helper catches-and-degrades to the plain non-ansistring fallbacks, since punk::ansi loaded without punk::lib dies in ansistring TRUNCATE (RANGE calls punk::lib::lindex_resolve) - an error message must never die on its display helper. parse_report's own value cells retain that uncaught exposure (pre-existing, success-side). validation.test +4 pins (long-value truncation with raw -badval retention, multiline single-line-ization, @cmd -reportvaluewidth cap, unexpected-option word truncation with raw -badarg retention). Args subtree 415/0 on tclsh90s (9.0.5) and tclsh86ts; full suite at the recorded 13-failure environment baseline (maketclhelp re-verified 12/12 with a real tclsh on PATH). Minted modules/punk/args-0.26.0.tm. Project version 0.66.1 (patch: kit-shipped error-display behaviour) with CHANGELOG entry; G-151 archive follow-on disposition flipped to landed. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 day ago |
|
|
05638877d3 |
G-171 note: publish command owns artifact-revision derivation
Extends the dirty-bake provenance follow-on's publish-command endpoint with the -r<N> derivation duty (user question 2026-08-08: must -Dlibrev be manual?): the build recipe cannot safely self-derive (deliberate-publish discipline, no configure-time mutable-state inputs, rev-inside-artifact means comparison must build AT the published rev and sha1-compare); publish verdicts current / bump to max+1 / alpha in-situ replace, asserted on a checked claim. Records the recipe-default-as-published-state convention (familyrev precedent) and librev's observed drift as the manual failure mode - default+comment repair due at the r2 publish. goals_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
988c7868fd |
G-171 amendment follow-up: GOALS.md Scope mirror sync + G-176 archive marker
goals_lint caught both: the index Scope mirror must match the amended detail Scope (index carries a mirror the amendment commit missed), and the new alternatives bullet's G-176 reference needed its achieved/archive marker. Lint now fully clean, no findings or warnings. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
e42587cd79 |
G-171 amendment: runtime-content masks (declared kit-level battery demotion)
Extends the proposed goal with Approach 11 + matching Goal/Scope/Acceptance clauses and a Context assembly finding (2026-08-08): zip-kit bake EXTRACTS the runtime's attached vfs into the per-kit merge tree, so runtime batteries are structurally maskable - but supersedes/replace run in the VFSPAYLOAD phase before extraction and never reach them, so a bi-runtime kit with a lower-versioned payload battery ships both copies and highest-wins picks the runtime's. The amendment: mapvfs.toml kit-entry runtime_excludes applied at merge time after extraction - the payload version wins by absence of competition. Guardrails (boot-critical refusal, smokerequire proof), provenance (mask = declared config, punkkit-stamp runtime_masks key, no-volatile-fields safe; runtime's own record never edited), zip-lane first. Alternatives recorded: require-time pinning via the managed ::package override, runtime-variant proliferation. goals_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
5c47f3b97f |
bootsupport promotion: G-176 coherent set + make.tcl libunknown guard follow-on
Release-step-(9) commit of the src/bootsupport refresh (user-run 'make.tcl
bootsupport'): commandstack 0.7.1->0.8.0, punk 0.2.8->0.3.0, ansi
0.2.0->0.2.1, args 0.18.0->0.25.2, moduledoc tclcore 0.4.0->0.4.2,
libunknown 0.2.4->0.3.1, ns 0.9.3->0.11.0 - all seven verified
byte-identical to the minted modules/ tree. make.tcl regains committed
provenance for the tooling it boots from; the staleness gate is satisfied
by committed content again.
With it, at the G-176 follow-on's own due point ("before or with the
bootsupport/kit promotion"): the libunknown skip-guard swapped from 'info
commands ::punk::libunknown::package' (a proc the 0.3.x
commandstack-managed install no longer creates) to a 'package provide
punk::libunknown' probe - satisfied by every vintage's boot-site source
(verified in 0.2.4 and 0.3.1; tclsh-driven boot smoke green). Disposition
flipped to landed in the archived goal; goals_lint clean. No project bump:
promoted content already versioned (0.63.0-0.65.0 arc), guard swap is
interface/output-unchanged make tooling internals.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
2ec08535a8 |
G-171 note: dirty-bake provenance indication - follow-on candidate
Records the 2026-08-08 assessment as a live-tier Notes item (becomes a Follow-on line at the flip, per goals/AGENTS.md - live goals carry no Follow-ons section): near-term tree_state field in the advisory kit sidecar surfaced by bakelist/BAKE SUMMARY/buildinfo; endpoint a publication-side content-addressed manifest (kit sha1 -> producing commit, absence IS the indication) sequenced after G-171's records-free-clone reproducibility lands; stamp/payload and filename homes rejected (determinism principle, name-keyed machinery). goals_lint clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
c8b51bc49a |
G-171 note: staleness-message emitter seam for Approach 10
Records that the stale_bootsupport gate cited as the layout-store report's
shape template now emits via the shared punkboot::lib::bootsupport_stale_warning
helper (
|
2 days ago |
|
|
71e3c96387 |
G-177 + G-178 drafted (proposed): punk::args scalability - cost decoupling and multi-provider safety
Drafted from a measured scalability review asking what breaks if every command - including third-party libraries - carries punk::args documentation. Baseline probes (punk91, 58 registered namespaces / 693 definitions) found three cost centres and one governance gap; the two goals split them by kind. G-177 (engine, measurable): the resolved-spec caches key on the whole raw definition text (~args:2152, the author's own todo), so ~4 full-text hashes ride every parse call - an isolation probe shows the ENTIRE per-call growth with documentation size sits in those keys (220 B definition 28.8us vs 9776 B definition of identical argument shape 56.8us; resolve 1.5 -> 29.6us). Registry membership is lists with a nested-loop ldiff behind a length-equality early-out that never fires in a stock session (registered=58 loaded=60 - argdoc namespaces enter loaded_packages un-registered and registration is not deduped), so update_definitions costs 9.3us at R=100 and 2515us at R=2000 while being called per ensemble subcommand. The scan phase is eager and global (15us per definition). Acceptance is six machine-independent ratio pins (1.15x doc-size independence, 2x registry-size independence, early-out liveness plus its false-positive, O(1) scan, 40% raw-text residency drop, byte-identical corpus renders) rather than absolute times, so the suite pins the complexity class and survives hardware changes. G-178 (governance, policy): flat global id namespace with silent collisions (the "last will silently win" todo at ~args:5137), non-idempotent registration into a foreign namespace variable, no definition format-level declaration, and third-party help text that is tstr-evaluated with -allowcommands at resolve time - documentation that runs code. Split from G-177 per the goals/AGENTS.md rule that a goal must be summarizable by title and Scope alone. Overlap survey (goals_xref paths + score): Related lines to G-175 (disjoint - it owns how many times a render resolves, G-177 owns what one resolve costs), G-044/G-050 (latency consumers), G-075 (shared id-lookup path), G-167 + G-056 (both deliberately change render output, which G-177 pins byte-identical - whichever lands second re-baselines the characterization), G-046 (archived predecessor whose display-field deferral is why the residual doc-size tax is purely the cache keys). No archived follow-on disposition required flipping. goals_lint clean (81 active-index goals / 97 archived). Claude-Session: https://claude.ai/code/session_01Y5vEJUZkD4p8jmEFEBVhLi Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com |
2 days ago |
|
|
7787f0e06e |
G-176 archive: Follow-ons section brought to contract (single-line items, last section) - the two open items now enumerate in goals_followons
The achieved flip's step (c) was written non-conformant: the two deferred
items were multi-line prose bullets with trailing '=> open' markers, and
the '## Follow-ons' section sat before '## Notes'. The Follow-ons
contract (goals/AGENTS.md, goals-system v4) requires one item per line at
column 0 ('Follow-on: <item text> => open') in a '## Follow-ons' section
that is the LAST section of the archived detail file -
goals_followons.tcl enumerates only grammar-conformant lines, so the
items were invisible to the report (and goals_lint only validates lines
that BEGIN with 'Follow-on:', so nothing flagged them).
Both items (boot-site commandstack pre-sourcing; make.tcl skip-guard
modernization) now appear in the goals_followons OPEN section. Item
content unchanged in substance - compressed to single lines, with the
now-moot scope-amendment caveats dropped (an archived goal's follow-ons
are enacted via new goals or direct landing per the disposition
vocabulary).
Flip-guidance audit against goals/AGENTS.md prompted by the miss: Status
grammar, Progress evidence, pure-rename archive moves, index/archive
records and the live-tier reference sweep (no G-176 references exist in
goals/*.md or GOALS.md) all check out; the Follow-ons grammar was the
one non-conformance.
goals_lint clean (79 active-index / 97 archived); goals_followons
enumerates both G-176 items as open.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
8fa716b62b |
G-176 achieved: override hints + 'package epoch' documented via stack-tied doc block (punk::ns 0.11.0, punk::libunknown 0.3.1; project 0.65.0)
Increment 4 (the final increment) + the achieved flip.
punk::ns 0.11.0: cmdinfo gains an 'overridden' result key - a second axis
beside cmdtype/unavailable (the G-166 pattern) reporting the LIVE
commandstack override state of the base command: one {renamer <string>
docids <list>} dict per stack record (bottom-up), docids being the
punk::args ids of doc blocks the record attached via 'rename_command
-punkargs' (derived with punk::args::rawdef_id). Guarded live query - no
hard commandstack dependency, empty when commandstack is not loaded,
never cached so it is correct as stacks change. cmdhelp surfaces it: the
table/string renders lead with a plain "note: '<cmd>' is currently
overridden/extended via commandstack by: <renamers> (override-attached
docs: '<ids>')" line, -return text leads with an OVERRIDDEN: line (below
UNAVAILABLE when both apply), -return dict carries the key on all return
shapes incl the undocumented fallback.
punk::libunknown 0.3.1 (renamed from 0.3.0): the 'package epoch'
subcommand is now DOCUMENTED - a substitution-free doc block with the
space-form id {::package epoch} rides the override's commandstack record
via -punkargs: mirrored for lazy pickup when punk::args loads after init
(normal early boot), defined immediately when punk::args is present, and
removed with the record by any removal path. 'i package epoch' renders
real usage (all six grammar forms) - the doc gap that motivated the whole
arc, retired. init's require tightened to 'commandstack 0.8-': a
pre-mechanism stable copy fails pointedly at init instead of mid-call
with a usage error (found via shadowing.test, whose require-based
children needed 'package prefer latest' - the default stable preference
picks a stale stable bootsupport commandstack over the alpha-versioned
dev copy).
End-to-end verified: 'i package epoch' renders the epoch doc; 'i package'
leads with the note naming punk::libunknown and '::package epoch';
-return text/-return dict carry OVERRIDDEN:/the structured key;
restore_original ::package removes doc and note.
Tests: cmdhelp.test gains 2 hint pins (documented-command note incl docs
clause + dict axis; doc-less-proc autodef render leading with the note,
OVERRIDDEN: text lead, note clearing on unwind) and its two key-list pins
(cmdhelp_cmdinfo_result_shape, cmdhelp_return_dict_valid) flip
deliberately with the new key - exactly as they did for G-166's
'unavailable'. packageoverride.test gains the flagship pending-path pin
(epoch doc mirrored pre-punk::args in path-cleared children, lazily
defined on punk::args arrival, removed on unwind) and its pko_probe
injects ::PKO_SRCMODULES. shadowing.test children set 'package prefer
latest'. src/tests/modules/AGENTS.md punk/ns + punk/libunknown bullets
updated.
G-176 flipped ACHIEVED 2026-08-08: every acceptance clause met across the
four increments (characterise -> migrate -> -punkargs mechanism -> hint +
flagship docs). Detail file archived to
goals/archive/G-176-commandstack-doc-integration.md with its two
boot-site Follow-ons kept open (commandstack pre-sourcing at the
libunknown-style boot sites; make.tcl skip-guard modernization - due by
the 0.3.x/0.8.0 bootsupport promotion). GOALS.md entry removed;
GOALS-archive.md record added; the one tree reference
(packageoverride.test header) swept to the archive path.
Project 0.64.0 -> 0.65.0 + CHANGELOG.
Suites: libunknown+ns+commandstack+loadedlib 216/216; full modules tree
1354 total / 1343 pass / 11 constraint-skipped / 0 fail (zig-built
tclsh90s 9.0.5); testbody_lint 1707 clean; goals_lint clean (79
active-index / 97 archived); make.tcl projectversion consistency OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
ad0489b881 |
commandstack 0.8.0: rename_command -punkargs stack-tied doc blocks (G-176 increment 3; project 0.64.0)
rename_command accepts a new leading option '-punkargs
<list-of-definitionlists>' attaching punk::args doc blocks to the
rename's stack record - e.g documenting a subcommand the override adds,
with space-form ids such as {::package epoch}. Each element is one
definitionlist exactly as given to punk::args::define (the same shape as
a PUNKARGS variable element).
Lifecycle: docs attach only when the rename lands (aborted renames
return early) and are LIVE while the record is on the stack. The detach
hook sits at remove_rename's doomed-record site - pop_rename,
remove_renamer and restore_original all funnel through it - so every
removal path removes the docs with the record.
Works whether or not punk::args is loaded at rename time: deflists are
mirrored in a new ::commandstack::stackdocs namespace registered inert
into ::punk::args::register::NAMESPACES at module load (punk::args need
not be present - the early-boot renames precede it), so a later-loading
punk::args picks them up lazily; when punk::args is already present they
are ALSO defined immediately (a namespace already consumed into
loaded_packages never lazy-loads later appends; redefinition is
idempotent). Detach removes one mirror occurrence per deflist and
undefines via punk::args::undefine_deflist (deflist-keyed - commandstack
never parses ids; never-defined deflists skip silently). Supported
shape: one live record per doc id (same-id declarations in two records
shadow; removing either removes the doc).
The record carries the deflists under a trailing 'punkargs' key - the
append-only key-order contract is preserved (token idx 0-1, renamer idx
2-3). The leading-option parse is generalised: -renamer/-punkargs in
either order, both leading-only, non-dash word ends option scanning so
misplaced options raise the pointed error. stackdocs state follows the
0.7.1 reload contract (info-exists guarded; registration idempotent
across re-source). commandstack::help and the rename_command argdoc
document the mechanism; the In-tree users line gains punk::libunknown
(the increment-2 migration).
commandstack.test: 5 new pins (docs live with the record incl key-order
assertions, all four removal paths detach, the pre-punk::args pending
path in a bare child that loads punk::args afterwards and lazily
consumes the registered mirror, reload contract on mirror + single
registration, option positions in either order + pointed misplacement) +
2 existing G-160 message pins updated to the generalised
usage/misplacement wording (behaviour contracts unchanged). Suite 46/46.
src/tests/modules/AGENTS.md commandstack bullet updated; goal Progress
entry added. Project 0.63.0 -> 0.64.0 + CHANGELOG.
Suites: commandstack 46/46; full modules tree 1351 total / 1340 pass /
11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5);
testbody_lint 1704 clean; goals_lint clean (80 active-index / 96
archived); make.tcl projectversion consistency OK.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
a7bc62c3fb |
punk::libunknown 0.3.0: ::package override installs via commandstack (G-176 increment 2; project 0.63.0)
The ::package override (the 'epoch' subcommand and controlled 'forget') now installs via commandstack::rename_command -renamer punk::libunknown instead of the former 'rename ::package :📦:' + namespace-import mechanism. Both live ::package overrides (this and punk::packagepreference's) now share one managed stack whatever the install order - stack removals and third-party renames re-link correctly instead of operating on the wrong command (previously commandstack's ::package stack believed the packagepreference wrapper was live while libunknown's unmanaged import actually was; restore_original would have stranded :📦:). Migration deltas (exactly the set enumerated in the goal Context): - the override body runs at :: - the four bare epoch_incr_pkg/epoch_incr_tm calls are fully qualified (the old namespace-import execution context is gone) - the dead 'variable has_package_files' declaration dropped (its only use was already commented out; the module-load probe stays) - the two :📦: delegation sites (forget arm, default arm) now delegate via COMMANDSTACKNEXT; :📦: no longer exists (nothing in the tree called it) - init does 'package require commandstack' (a no-op when already provided - e.g whenever punk::packagepreference::install ran first, as in punkshell boot; resolvable via tm paths in every other real init context - bootsupport and the common vfs both carry commandstack-0.7.1) - re-entry guard is now a stack query for the punk::libunknown record (same 'already done' notice; the old ::punk::libunknown::package proc-existence check tested a proc that no longer exists) - init argdoc reworded; file renamed libunknown-0.2.4.tm -> libunknown-0.3.0.tm (git mv + fossil mv) with Meta/manpage/provide-block version updates and a changelog entry per the in-file bump procedure. Behaviour of every subcommand arm is unchanged: all increment-1 BEHAVIOUR pins in packageoverride.test passed byte-identically; only its four MARKED-TO-FLIP install-shape pins flipped as fenced (origin ::package, no :📦: residue, managed stack records - 1 solo, 2 in both packagepreference interop orders). discovery.test and packageoverride.test child interps now pre-source the source-tree commandstack by path (their tm paths are cleared); libsearch/shadowing children resolve commandstack via inherited parent paths and needed no changes. Two out-of-scope items recorded as open Follow-ons in the goal (Scope amendment needed if pursued): boot-site commandstack pre-sourcing (punkboot core.tcl / make.tcl / punk::repl / punk::lib child-seeding - to preserve the minimal-untracked epoch intent exactly) and make.tcl's 'info commands ::punk::libunknown::package' skip-guard modernization (old kits still satisfy it; switch to a package-provide check before or with the 0.3.0 bootsupport/kit promotion). Goal Scope mirrors updated to the new filename (rename anticipated in the Scope text). Project 0.62.2 -> 0.63.0 + CHANGELOG. Suites: libunknown tree + loadedlib 42/42; full modules tree 1346 total / 1335 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5); testbody_lint 1699 clean; goals_lint clean (80 active-index / 96 archived); make.tcl projectversion consistency OK (and that run itself exercised the bootsupport-0.2.4 transition path live). Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
642fb265ea |
G-176 increment 1 + active flip: ::package override characterisation - the pre-migration safety net (packageoverride.test, 11 pins)
G-176 marked active (user-directed). New src/tests/modules/punk/libunknown/testsuites/discovery/packageoverride.test pins the CURRENT punk::libunknown ::package override ahead of the increment-2 migration onto commandstack::rename_command. BEHAVIOUR pins (must stay green byte-identically through the migration): 'package epoch tm|pkg' single-arg forms, indexed '<which> <index> ?key?' queries, the four error arms, the filtered forget arm (real-ifneeded forgotten, no-ifneeded filtered out, tcl/Tcl/tcl::oo/tk denied, mixed lists partially applied), abbreviation acceptance (ep/epo/epoc + fo routing, with the parked builtin's rejection of 'ep' pinned as the override's deliberate delta), delegation pass-through, and the re-init no-op contract (stderr notice captured via a child ::puts shim). MARKED-TO-FLIP pins (comment-fenced to the increment-2 commit and no other): the install shape (::package origin = the ::punk::libunknown::package namespace import; :📦: parked and functional) and the two-override packagepreference interop children in BOTH real-world install orders (punkshell's pkgpref-first: stack count 1 + import origin; make.tcl's libunknown-first: stack count 1 + ::package proc origin). Children are fresh interps sourcing the source-tree libunknown/commandstack/packagepreference by path via a shared highest-version locator (discovery.test pattern). All 11 pins green on the first run against the live implementation. Tests AGENTS.md index updated; goal file gains its Progress entry. testbody_lint 1699 clean; goals_lint clean (80 active-index / 96 archived); modules tree 1346 total / 1335 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5). Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
b10abcbae0 |
G-176 drafted (proposed): commandstack doc integration - stack-tied overrider argdocs, override hints, libunknown package-override migration
Four-increment arc from the 2026-08-08 feasibility investigation:
(1) characterise the untested arms of the current punk::libunknown
::package override (epoch single-arg/indexed forms + error arms, the
entire forget arm, abbreviation acceptance, delegation, re-init guard,
packagepreference interop in both install orders; install-shape pins
marked to flip), (2) migrate that override onto
commandstack::rename_command (one managed stack for both live ::package
overrides - cures the restore_original/wrong-command latent hazard of
the current unmanaged mix), (3) rename_command -punkargs stack-tied doc
blocks (attach at the single rename site, detach at the remove_rename
choke point every removal path funnels through; stackdocs registered
namespace covers renames performed before punk::args loads), (4)
cmdhelp/cmdinfo override-in-place hint (G-166-style second axis, live
get_stack query, no hard dependency) + the flagship {::package epoch}
doc attachment and the commandstack::help how-to.
Investigation evidence embedded in the goal Context: probe-verified
space-form doc define/resolve/undefine/fallback cycle ('i package
epoch' resolves despite the parent's restricted choices - G-051
space-form jump), record-key append contract, undefine_deflist
primitive, no external :📦: callers, the dead
has_package_files declaration, both real-world install orders.
goals_lint clean (80 active-index goals / 96 archived).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 days ago |
|
|
b82827d837 |
punk::args 0.25.2 + tclcore moduledoc 0.4.2: qualify ensemble names into ensemble_subcommands_definition - 'i ::tcl::prefix' unqualified-ns warnings gone; G-175 drafted (project 0.62.2)
'i ::tcl::prefix' emitted 12x "warning: update_definitions received unqualified ns: tcl" on stderr (6x for subcommand renders). Root cause: the tclcore moduledoc's @dynamic ::tcl::prefix definition passed the ensemble name to punk::args::ensemble_subcommands_definition UNQUALIFIED ('tcl::prefix'). The generator's space-form id_checks derive namespaces via 'namespace qualifiers' - for a relative multi-component name that yields a non-empty UNQUALIFIED namespace ('tcl') which the empty-qualifier guard ('' -> ::) never catches - and update_definitions warned once per subcommand per resolve. @dynamic definitions re-expand on every resolve and the cmdhelp pipeline resolves the id four times (parse_status spec fetch + its internal parse, cmdhelp's get_spec, arg_error/synopsis), so 4 resolves x 3 subcommands = the reported 12. tcl::prefix was the ONLY affected ensemble: all tclcore ensemble docs pass unqualified names, but the single-component ones (info/dict/file/ namespace/array/encoding/zipfs) derive an empty qualifier which was already mapped to ::. Both fixes: - tclcore call site now passes ::tcl::prefix. - ensemble_subcommands_definition normalizes its ensemble argument to fully-qualified in the CALLER's context (uplevel namespace which, :: prepend fallback) before deriving anything - covering any future relative multi-component caller. Verified: zero warnings at both depths; rendered help byte-identical (6301/5585 chars); generator snippet identical for qualified vs unqualified input. New pin ensembledef.test ensembledef_unqualified_ensemble_name_no_warnings (fixture two-component ensemble called relatively under stderr capture; capture_stderr helper added to the file). src/tests/modules/AGENTS.md index updated (ensembledef.test now listed). G-175 drafted (proposed): goals/G-175-punkargs-dynamic-resolve-multiplicity.md - the warning was the only signal of the 4x-per-render @dynamic resolve multiplicity; the goal records the verdict question (render-scoped single resolution vs pinned accept), the attributed resolve sites, the measured cost floor (redundant builder calls ~3ms on 'i ::tcl::prefix', ~22ms on 'i ::dict' steady-state; the full argdata re-processing share is unmeasured - first investigation step), and candidate mechanisms smallest-first. GOALS.md indexed. punk::args 0.25.1 -> 0.25.2, punk::args::moduledoc::tclcore 0.4.1 -> 0.4.2, project 0.62.1 -> 0.62.2 + CHANGELOG (user-visible repl stderr noise fix). Suites: testbody_lint 1688 clean; goals_lint clean (79 active / 96 archived); modules tree 1335 total / 1324 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5); make.tcl projectversion consistency + staleness OK. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
39e0ec2ba7 |
G-084 achieved: settled cross-member -multiple rejection + value-parsekey integrity + storage-key attribution (punk::args 0.24.0, project 0.61.0)
G-084 increment 2 + achieved flip - parsekey completeness closed: Cross-member -multiple on a shared-parsekey option group is now a DEFINE-TIME error unless ALL members belong to one @opts group marked -parsekeymode error (G-083 mutual exclusivity makes per-member collection well-defined; a single -multiple member with its own parsekey is unrestricted). This settles the G-084 cross-member accumulation decision as rejection rather than accumulate-in-received-order: collection on one storage key is ambiguous (collect-vs-replace undefined), and rejection eliminates the silent loss without new collection semantics. The check runs AFTER the G-053 canonicalisation so range forms verdict correctly ({0 1} replace-shape allowed; a pre-canonicalisation placement would raise a raw non-boolean error for any range form). Value -parsekey integrity settled at define time: duplicate value parsekeys rejected (trailing values consume positionally - the shared slot silently overwrote), dash-led value parsekeys rejected (they landed in the options namespace of result/received and aborted parse with an internal error in the option-shaped validation paths; every option storage key is dash-led, so this one rule also removes all cross-class collisions). parse_status/parse_report storage-key attribution: parse_status_build now resolves a storage key claimed by exactly ONE argument (value -parsekey, declared option -parsekey, '='-suffixed optset tail) back to that argument, so argstatus/Source report received with the value-in-effect instead of default/0. Shared-parsekey groups stay unresolved - the remaining recorded display gap (engine-level per-member tracking; archived as the goal's open Follow-on). undefine/undefine_deflist now return "" (previously the whole internal cache dict to any caller capturing the value). define -help documents -parsekey for the first time (rename semantics for options and values, leader rejection, shared groups and -parsekeymode, last-defined-member defaults precedence, the -multiple rule, value-key uniqueness/non-dash). Moduledoc tclcore comment corrected (leader -parsekey settled as rejection, not pending). Internal sweep: dead values-loop identifiers removed (val_ident/val_ident_is_parsekey/values-side seen_pks), leader reverse map removed (VAL_NAMES-driven build), dead parsekey-from--default derivation removed, stale pre-G-084 comments corrected. Tests: parsekey_shared_key_multiple_rejected strengthened (message pins, {0 1}/{0 4} range coverage, the -parsekeymode error escape hatch incl collection and optionconflict); new parsekey_value_parsekey_integrity, parsereport_storagekey_attribution, parsestatus_storagekey_attribution; inc-1 comment damage repaired (duplicated block, eaten G-083 provenance lines, stale GAP-era comment); 2026-08-08 future-dating normalized to 2026-08-07 in touched files (CHANGELOG 0.59.0/0.60.0 headers corrected likewise; the underlying commits landed 2026-08-07 AEST). Goal flip (user-approved): the Goal line's accumulate wording amended to the settled define-time-rejection design; G-084 flipped achieved 2026-08-07 and archived (detail -> goals/archive/, index -> GOALS-archive.md, reference sweep applied - G-167 survey note gains achieved markers for G-053/G-083/G-084; Follow-on recorded: shared-group per-member received attribution => open). Detail file gains ## Progress (inc 1 + inc 2 + flip evidence). src/tests/modules/AGENTS.md punk/args index updated to the settled-pin state. Project 0.60.0 -> 0.61.0 + CHANGELOG (value -parsekey support and the define-time integrity rules are user-visible shell behaviour; G-053 precedent). punk::args 0.23.0 -> 0.24.0. Suites: punk/args 401/0; modules tree 1313 pass / 11 constraint-skipped / 0 fail (zig-built tclsh90s 9.0.5); testbody_lint clean; goals_lint clean; punkboot version-parsing 81/81; make.tcl projectversion consistency OK. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 days ago |
|
|
abd8616f3c |
G-084 inc 1: value -parsekey support + leader -parsekey define-time rejection + defaults precedence
G-084 (punk::args 0.23.0) increment 1 - parsekey completeness part 1:
Value -parsekey is now supported (was: accepted at define time but aborted
parse). A value record declaring -parsekey renames its result `values` slot
and its `received` key to the parsekey (e.g `@values {v1 -parsekey renamed
-type string}` parses `hello` to `values={renamed hello}`, `received` keyed
by `renamed`), and -multiple value members collect under the parsekey (the
`variable` setvalues form `?name value...?` pairs collect under `name_value`
- the motivating caller that carried the `#todo - fix -parsekey for leaders
and values` moduledoc comment).
Implementation: VAL_DEFAULTS and the values_dict init/storage are keyed by
parsekey (matching the already-parsekey-keyed VAL_REQUIRED); a new
api_valnames_received list tracks the parsekey (the internal valnames_received
stays argname-keyed for the -multiple first/continuation gate and G-053
occurrence enforcement); api_valnames_received drives the
required-satisfaction check and the received dict; a per-form
val_pk2name/leader_pk2name reverse map lets the valmin clause-length fallback
and the post-parse validation loop resolve a parsekey back to its argname
for ARG_INFO/arg_checks lookups.
-parsekey on a leader is now REJECTED at define time with a clear message
(was: silently ignored) - no live caller uses a leader -parsekey, so the
goal's no-silent-ignore contract is met by rejection rather than parallel
hot-path surgery; the dead req_name derivation in the leaders resolve branch
is removed. The @values directive line still rejects -parsekey (a
group-default parsekey is not a feature; per-arg value -parsekey is).
The defaulted-members precedence rule for a shared-parsekey group (none
received) is now documented as last-defined-member-wins (deterministic in
definition order) and the in-code `? review` is removed.
parsekey.test: the value GAP flipped to parsekey_value_result_key_settled,
the leader GAP flipped to parsekey_leader_parsekey_rejected, the @values-line
GAP split to parsekey_values_line_rejects_parsekey; the defaults GAP flipped
to a settled pin (parsekey_shared_key_member_defaults).
dev/parsekey-knownbugs.test: the value and leader disabled pins retired
(settled in parsekey.test); the cross-member -multiple accumulation pin
remains (increment 3, pending the design decision).
Full punk/args suite 399/0 (1 skipped), punk/ns 125/125, broader punk sweep
989/0. Cross-member -multiple collection (inc 3) and the parse_report/
parse_status received-attribution display gap (inc 2) remain.
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
2 days ago |
|
|
c1f64ca0ab |
G-174 drafted (proposed): cmd_traverse word accounting - the doc-lookup walk never drops argument words
Root-caused from 'i a? web green' presenting the loose sample form (ordinal 5) instead of web (ordinal 3): punk::args form narrowing is sound (parse_status on the full tail reports the web/sample ambiguity correctly); punk::ns::cmd_traverse drops all but the last trailing word for commands whose definition's first form is zero-arg (a?'s sgr_overview) - the dropped words land in neither args_resolved nor args_remaining, so cmdhelp's advisory parse narrows on a one-word tail and cleanly selects the wrong form with no failure signal. The goal records the probe evidence, the four-step drop mechanism (first-form-only inspection, ensemble-shape test, the '#todo - return?' empty-leader break, the code-10 last-snapshot fallthrough), the consumer sensitivity split (docid-only vs args_remaining-sensitive), and the coverage determination: cmdflow/cmdhelp pin the choice-walk parity and post-resolution narrowing arcs, but nothing asserts the conservation invariant, no fixture has the zero-arg-first-form shape, and the code-7/code-10 lanes are unwitnessed. Approach: characterise first (defect witnesses pinned, flipped by the fix commit), minimal fix at the annotated sites, consumer verification, with first-form-only inspection and the ansi-side sample-form tightening held as recorded decision items. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 days ago |
|
|
2aad4d1777 |
G-053 achieved: punk::args range-valued -multiple occurrence arity (punk::args 0.22.0, project 0.60.0)
-multiple now accepts a {min max} range (max -1 = unbounded) alongside the
legacy booleans 0/1, so a definition can declare at most once ({0 1}, a second
occurrence is a parse error), bounded repetition ({2 4}), or one-or-more
({1 -1}) instead of choosing between silent last-wins (0) and unbounded
collection (1).
The spec compiler canonicalises once at resolve: the stored -multiple becomes
the computed boolean (list-shape collect: true for max>1 or -1, false for
legacy 0 and max==1) so every existing collect-vs-replace / scalar-vs-list /
leader-value-single-multiple hot-path truth-test stays correct, and the range
companions (min/max/maxbounded) live in a separate per-form MULTIPLE_RANGES
dict - NOT in ARG_INFO, so they do not ride along when ARG_INFO is round-tripped
as a spec via resolved_def copyfrom. Legacy 0/1 and boolean strings
(true/false/yes/no) are coerced to the boolean and stay byte-unchanged (no
MULTIPLE_RANGES entry for unlimited cases, so {0 -1} is equivalent to legacy 1).
Resolve validation: max positive or -1, min <= max, and the -optional/range-min
reconciliation (non-zero min forces presence, contradicts -optional -> reject
with a clear message; declare -optional 0). The value-shape rule: max==1 forms
stay scalar, max>1 or -1 yield the occurrence list.
Parse enforcement: a new PUNKARGS VALIDATION occurrencecount failure class
(payload <argname> count <n> min <m> | max <m>) fires in a single post-loop pass
per section (opts/leaders/values) via a private::multiple_range_enforce
helper. Over-max is a hard contradiction (fires in both normal and
viability-probe modes; parse_status_classify maps it to invalid); under-min is
pure end-of-input exhaustion (SUPPRESSED in the G-152 viability probe via the
viabilitycheck arg, classified incomplete so a viable form reports incomplete
not invalid). Legacy -multiple 1 required with 0 occurrences still reports
trailingvaluecount (byte-unchanged, not occurrencecount).
Rendering: the usage-table Multi column reflects the range (0-1 / 2-4 / 1+ for
unbounded-with-floor; the greencheck stays for legacy 1), the string renderer
emits MULTI:0-1 etc., and the synopsis distinguishes at-most-once (?arg?, no
ellipsis) from repeating (arg...). -multipleunique/-multipleuniqueset compose
with max>1 ranges unchanged. define -help documents the range form and the
-optional/range-min rule.
New testsuite multipleranges.test (28 tests: 13 define-time
canonicalisation+validation, 12 parse-time enforcement incl parse_status
verdicts and a legacy-required-still-trailingvaluecount guard, 3 rendering).
Legacy untouched by default confirmed: full punk/args suite 399/0 (3 skipped),
punk/ns 125/125. All G-053 acceptance criteria met; goal flipped to achieved
2026-08-08 and archived (detail -> goals/archive/, index -> GOALS-archive.md,
reference sweep applied to G-072/G-084, deferred G-084 cross-member -multiple
collection decision recorded as a Follow-on => goal G-084).
Project version 0.59.0 -> 0.60.0 (minor: backward-compatible behaviour
addition). punk::args module 0.21.0 -> 0.22.0.
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
3 days ago |
|
|
35008f7338 |
G-084 notes: record the shared-parsekey received-attribution display gap
parse_report's Source column and parse_status's per-arg `received` count both
report default/0 for an explicitly-supplied shared-parsekey member (e.g
parse_report {-exact ...} withid ::lsearch shows every MATCHSTYLE member as
(default) though the value is correctly bridged) - parse_status_build keys
the positions dict by the storage key, so no per-member received attribution
survives the fold. Pre-existing (G-151 bridge, G-049 attribution loop), not
introduced by G-083. Flip when the engine-level storage-key model G-084 owns
lands (the same follow-on that retires the value-bridge).
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
3 days ago |
|
|
9125d56237 |
G-083 increment 3 achieved: punk::args argument-relations usage rendering + lsearch moduledoc adoption (punk::args 0.21.0, project 0.59.0)
The -conflicts and -parsekeymode error vocabulary (inc 1, 0.19.0) and its parse-time optionconflict enforcement (inc 2, 0.20.0) now surface in usage/arg_error and synopsis output, and the lsearch tclcore moduledoc models its documented option incompatibilities with the new vocabulary. Rendering: - A per-arg -conflicts list appends a "conflicts with: <targets>" hint to the argument's help text in the usage table (targets resolved to display names via lookup_optset, so a parsekey target shows its member flag, not the raw parsekey). - A named @opts group marked -parsekeymode error is annotated "mutually exclusive (distinct members may not be combined)" in its group header; override (default) groups carry no such annotation. - The synopsis one-line form carries no conflict detail. lsearch moduledoc (tclcore): - -sorted gains -conflicts {-glob -regexp} and -bisect gains -conflicts {-all -not} (per-arg conflicts; the whole group stays -parsekeymode override so -glob/-regexp remain last-wins). - The "(documentation incomplete - punk::args fixes required for grouped mutually exclusive options and prefix calculation)" caveat is dropped from the @cmd -help. clock clicks left unchanged - its active positional-choice definition already models exclusivity (exactly-one-of) and the acceptance clause names lsearch only. relations.test extended with 8 increment-3 pins: 4 rendering (conflicts_usage_hint, parsekeymode_error_usage_group_header, parsekeymode_override_no_header_annotation, conflicts_synopsis_no_hint) and 4 lsearch adoption (lsearch_sorted_conflicts_glob + lsearch_bisect_conflicts_all raise optionconflict via errorcode substring match, lsearch_glob_regexp_last_wins stays last-wins, lsearch_caveat_dropped). Legacy untouched by default (no -conflicts/parsekeymode-error definition carries no new rendering). Full punk/args suite 371/0 (3 skipped); tclcoreparity 10/10; punk/ns 125/125. All G-083 acceptance criteria met; goal flipped to achieved 2026-08-08 and archived (detail -> goals/archive/, index -> GOALS-archive.md, reference sweep applied to G-053/G-084, deferred -requires/-implies dependency relations recorded as an open Follow-on). Project version 0.58.0 -> 0.59.0 (minor: backward-compatible behaviour additions, following the G-173 punk::path precedent). punk::args module 0.20.0 -> 0.21.0. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
43f009ed80 |
G-083 increment 2: punk::args optionconflict parse-time enforcement (0.20.0)
The -conflicts and -parsekeymode error vocabulary declared at define time
(0.19.0) is now enforced at parse. A new optionconflict failure class joins the
PUNKARGS VALIDATION errorcode vocabulary, mirroring optionmissing's shape:
{optionconflict <arg_a> <arg_b> received <receivednames>} - it names both
offending received arguments, for both per-arg -conflicts violations (any
pair, cross-group) and -parsekeymode error group co-occurrence (distinct
members of a shared-parsekey group).
The check runs in a single post-resolution site in get_dict_form (after the
optionmissing/valuemissing block), so the ordinary option path and the mash
(short-flag bundling) path share it - both raise identically. Checked against
RECEIVED arguments only (defaults never conflict), after prefix/abbreviation
resolution, on optset identity (a new optsets_received tracker for options,
since flagsreceived collapses shared-parsekey members onto one api_opt). Runs
unconditionally - a received conflict is a hard contradiction in any mode, not
end-of-input exhaustion, so parse_status_classify maps optionconflict to invalid
(not incomplete) and the candidacy/viability probe reports it.
Define-time check added: a group marked -parsekeymode error must also declare a
non-empty -parsekey (the strict mode only applies to a shared-parsekey group).
relations.test extended with 7 enforcement pins (raise cases for -conflicts
and -parsekeymode error, defaults-never-conflict, cross-group conflicts,
one-received-ok, override-legacy last-wins, parse_status invalid). buildversion
0.19.0 -> 0.20.0.
Bug found and fixed during the increment: the group-co-occurrence dedup check
initially used `ni` (not-in) where `in` was meant - `ni` returns true on an
empty list, so it skipped every member and the check never fired. Corrected
to `in`.
Legacy untouched by default: -parsekeymode override is the default and absent
-conflicts means no check runs, so the full existing suite (including the
pinned parsekey_repeat_ordering last-wins / prepend-defaults idiom) passes
unchanged.
Verification: full punk/args suite via canonical tclsh90s - 363 total / 360
passed / 3 skipped (punkargsKnownBug) / 0 failed; punk/ns suite 125/125 clean.
goals_lint clean. No punkproject.toml bump (module API addition, not shell-
level user-visible behaviour yet - the lsearch moduledoc adoption that ships
user-visible behaviour lands in increment 3).
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
3 days ago |
|
|
055f4bbf2f |
G-083 increment 1: punk::args argument-relations define-time vocabulary (0.19.0)
Spec compiler (resolve) accepts and stores the new relation keys: - per-argument -conflicts <list>: parsekeys or flag names that must not be RECEIVED together with this argument; checked against received args only at parse time (defaults never conflict) - parse-time optionconflict enforcement lands in a later G-083 increment. - @opts-level -parsekeymode override|error: per named OPT_GROUPS group; error = distinct-member co-occurrence within a shared-parsekey group raises optionconflict at parse; override = legacy last-wins, the default. Both keys are cross-validated at resolve: -conflicts targets must name a defined argname or declared -parsekey; -parsekeymode requires -group and a value of override|error. Define-time integrity hole closed: a -parsekey colliding with a distinct defined argument's name (one not sharing that -parsekey) is now a resolve error instead of silently forming an implicit shared-key group (parsekey_collides_with_defined_optname_GAP flipped in parsekey.test to a define-time error pin, plus redundant-self-name and deliberate-shared-group guards). Design settled (recorded in the goal detail): -parsekeymode is per named group (OPT_GROUPS entry, keyed by the @opts line's -group), not form-wide. Rationale: lsearch uses per-arg -conflicts only (partial conflicts, groups stay default override); clock clicks uses -parsekeymode error on its single named group (full pairwise exclusivity). Unnamed shared-parsekey groups default override. Legacy untouched by default: -parsekeymode override is the default and absent -conflicts means no check runs; the pinned parsekey_repeat_ordering last-wins / prepend-defaults idiom and the full existing suite pass unchanged. New testsuite relations.test pins the define-time vocabulary (7 tests, matching the longopts.test/mashopts.test error-pin style). buildversion 0.18.0 -> 0.19.0. Verification: full punk/args suite via canonical tclsh90s - 356 total / 353 passed / 3 skipped (punkargsKnownBug) / 0 failed. goals_lint clean. No punkproject.toml bump (define-time only; no shell-level user-visible behaviour yet - the module change, not the shell product). Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co |
3 days ago |
|
|
f48bf78900 |
G-083: activate (proposed -> active) - punk::args argument relations
Activation-freshness overlap survey (goals_xref score G-083) confirmed the existing Notes already record the real relationships (G-053, G-072, G-084 - all linked). G-167's back-pointer explicitly declares a deliberate non-overlap with no sequencing constraint; remaining unlinked pairs are low-score term-only siblings with no path overlap. No new Related: lines warranted. This work is a prerequisite for G-084 (parsekey completeness), whose cross-member -multiple combination decision should be made with this goal's relations vocabulary in hand. G-053 (occurrence arity) is slotted before G-084 in the same sequence at the user's direction. Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=unknown |
3 days ago |
|
|
3450a9d3cb |
Refresh stale punkbin commit-hash pins in archived goals (punkbin shellspy->punkshell sweep)
The punkbin artifact repo carried the wrong project token ("shellspy" - the
experimental subcommand, not the project name per root AGENTS.md) in 10 commit
messages (subjects AND bodies) back to the repo's earliest scaffolding. A
message-only `git filter-branch --msg-filter 'sed s/shellspy/punkshell/g'` over
the whole shellspy-bearing history rewrote all 10 (20 commits replayed, trees
byte-identical - --msg-filter cannot alter content), force-pushed to
origin/master (now 63f5e558). punkbin is git-only (no fossil).
The rewrite changed every commit hash in the swept range, so punkbin commit-hash
pins in archived goal detail files went stale. Refreshed all of them to the new
hashes so the records stay honest pointers rather than dangling references:
- G-172 (3 pins): ab5611d -> a73d862e; 59e7475 -> 63f5e558 (this goal's two
in-situ republish commits - my session's defect; the earlier 2-commit amend
had already left these pins stale and this refresh clears them).
- G-128 (3 pins): 1b471fc -> 2d2bf48 (punkres stamper publication).
- G-139 (1 pin): ee571ed -> e5c86eb (lib tier r1 publication).
- G-123 (2 pins): 1f10390 -> 0d49aa7 (retroactive schema-v2 sidecars).
- G-165 (1 pin): a22e16b -> a8303c4 (punkzip root-strip/exclude build options).
Per goals/AGENTS.md archived files are frozen except Follow-on dispositions;
this refresh is a sanctioned exception under explicit user permission to make
archived goals honest regarding hashes. Pure hash-token substitutions - no
prose, Scope, Goal or Acceptance text changed. The dated achievement-time
qualifiers around the pins (e.g "LOCAL ONLY - not pushed", "STAGED", "REMAINS
for acceptance") are point-in-time history and stay untouched. goals_lint clean.
Assisted-by: harness=pi; primary-model=huggingface/zai-org/GLM-5.2; api-location=huggingface.co
|
3 days ago |
|
|
2954d08f84 |
G-172 achieved: flip to achieved + archive (distributed-binary CPU floor)
Rebuild + in-situ republish (Approach 6) completed the acceptance. Full `zig build bootstrap` (pinned 0.16.0) rebuilt the r2 family WITH the G-172 cpu_floor field now in the embedded [provenance] record (re-stage picked up the build905.zig floor-field edit; zig-cached C compiles, only the wrap + emit re-ran). family_check passed for all three members (the new embed_cpu_floor/embed_cpu_model assertions green). Audit of the rebuilt r2 exes: all three PASS at the baseline floor (zmm=0 ymm=0 out-of-floor=0). Published in-situ to punkbin (git 59e7475, pushed origin/master): the three r2 exes + three r2 tomls replaced under existing names/revisions; each toml [provenance] now carries cpu_floor="baseline" + cpu_model="x86_64"; the [tests] tclcore line refreshed to the shipped-codegen gate evidence (passed=56041 failed=8, the Aug-06 baseline-rebuild test-gate - was 56039/9); library [tests] lines unchanged; sha1sums.txt: the 6 r2 lines updated. build_id unchanged per artifact (the floor field does not enter the identity digest); sha1/size/built updated. Every acceptance conjunct verified on this Zen 5 / v4 host: audit zmm=0 on the republished artifacts; -Dcpu=native still host-tuned (probe: native zmm=123 FAIL at baseline, PASS at v4 - the floor is a default, not a restriction); the republished tomls state the floor; punk-runtime surfaces it (info/list/use/fetch); use/run produce a named 0xC000001D diagnosis on a below-floor recorded cpu_model (verified by mocked-host tests - not end-to-end demonstrable here: every published artifact is baseline/v1 which every host meets, and no x86-64 level exceeds v4); fetch stays ungated. DOX closeout: detail file -> goals/archive/ (pure rename; Status achieved 2026-08-07; verification evidence + ## Follow-ons recorded). Index entry -> GOALS-archive.md (removed from GOALS.md). Reference sweep: only the GOALS.md index entry mentioned G-172 in the live tier (no pending-tense rewrites); design- decision Notes pointers added to G-105 (inherits the settled default_target cpu_model shape) and G-130 (consumes the baseline floor decision on its i686 axis). goals_lint clean (80 active, 93 archived); goals_followons parses the 2 open Follow-ons (r1-generation disposition; bin/ punk9* kit rebake). 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 |
|
|
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 |
|
|
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 |
|
|
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 |
4 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 |
4 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 |
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 |
|
|
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 |
|
|
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 |
5 days ago |
|
|
b0f206f53b |
G-168/G-169/G-170 drafted: launcher definition/documentation/help-depth family (user-approved)
Three [proposed] goals from the 2026-08-05 formhint-arc discussion of
why launcher help stops at the subject word:
G-168 selection-sound launch definitions - script/tclsh forms made
parse-discriminable with EXISTING vocabulary (file form -regexprefail
{^-e$} + oneliner '-e' element; tclsh scriptfile-vs-stdin via
candidacy fall-through matching stock semantics). Corrects the
discussion's earlier assumption that G-072 negation was required:
-regexprefail participates in form matching (G-143-arc verified; the
G-150 hash declaration is the dash-led precedent). Includes the
dispatch parse-gating decision (tabled vs app-plain errors, latency
measured if adopted).
G-169 app-owned launch-subcommand documentation - app-punkscript owns
(script)::punkexe::script via inert registration, launcher resolves
lazily (the existing argsid/package/docpackages machinery), single
definer per id, ownership rule recorded (app-owned for app-handled,
moduledoc for core-owned like tclsh), and the *_main.tcl declaration
surface (summary/package/argsid/parse) documented as the official
authoring mechanism.
G-170 launcher help depth - 'help <sub> <formname|index>' narrowing
(G-150 usage -form precedent), make.tcl-style dry-run gated on
parse-trueness (G-168 built-ins, project parse=1) with the
prepend-help idiom preserved for passthrough subcommands, and the
punkexe 0.6.1 interim -formhint suppression flipped to real
' <punkexe> help <sub> %formname%' templates.
Follow-on handling (user-approved leans): G-144's override-set
follow-on flipped => goal G-168 (the make.tcl half landed in the
G-143 arc; the punkexe-moduledoc half is now G-168's recorded
decision); G-150's selection-soundness sweep follow-on stays open
(broader than these two definitions - G-168's Notes record the
partial enactment). Overlap survey per the authoring workflow:
G-089/G-055/G-072/G-075/G-042/G-043/G-044 relationships recorded in
the detail files; app-punkscript intersects no live goals.
goals_lint clean (84 active, 86 archived).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
57d3dec3b2 |
G-149 follow-on landed: make.tcl adopts @cmd -formhint - actionable per-action help hints with honest continuation ellipsis (punkshell 0.55.1)
The multi-form definitions (tool, buildsuite) each declare
'@cmd -formhint " make.tcl help <sub> %formname% …"', so
'make.tcl help tool' / 'help buildsuite' - and every dispatch usage
error for those subcommands - label each form's synopsis line with the
concrete dry-run-help invocation (' make.tcl help tool build ...'
rendered with U+2026) instead of the repl-oriented ' i -form N ...'
default, which is unreachable for (script) ids. Renders via the
promoted bootsupport punk::args 0.17.0; under older snapshots (e.g
generated projects) the key is ignored and the default labels render.
Design decisions (user direction 2026-08-05, recorded in the follow-on
disposition): the trailing ellipsis is required for honesty - help
DRY-RUNS the form's own command line after the action (G-143), so a
hint without it misrepresents the invocation as complete. The template
was kept over empty-string suppression because the labels also render
on dispatch usage errors ('make.tcl tool frobnicate'), where the user
never typed help and the hint is the discovery route to per-action
help; suppression would lose that teaching path.
maketclhelp.test: tool formhints pin flipped to the new labels with an
olddefaulthint-absent guard; buildsuite multiform test gains the same
pair; header + provenance comments updated. The ellipsis is matched as
its utf-8 byte triple (format %c%c%c 0xe2 0x80 0xa6) because
maketcl_run reads the child pipe -translation binary, so multibyte
chars arrive byte-wise - a real U+2026 char in the pattern can never
match (first-cut pin failed green-render for exactly this). 12/12
green on tclsh90; maketcltool.test 4/4.
Sync outputs batched per policy (make.tcl modules + bootsupport): the
basic + project-0.1 layout make.tcl copies, the modpod source-tree
copy, and the bootsupport templates-0.2.0.tm repack all carry the
identical +2-line change. The archived G-149 follow-on disposition
flipped => landed 2026-08-05 (the sanctioned same-work-unit edit);
goals_lint clean. punkshell 0.55.1 + CHANGELOG (make.tcl help output
is product surface - patch). Kits pick this up at the next
vfscommonupdate + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
5 days ago |
|
|
7cdf5b2323 |
G-149 achieved: punk::args configurable multi-form synopsis hint labels (punk::args 0.17.0)
The per-form hint labels rendered beside a multi-form definition's synopsis lines in the usage/arg_error table (hard-coded ' i -form N ...' previously) are now a template substituted per form: %formindex% is replaced with the form's 0-based ordinal, %formname% with its name, and an empty template suppresses the labels entirely (the cell keeps just the Synopsis: label, as single-form renders always have). Both acceptance arms landed. Definition side: new '@cmd -formhint <template>' key - rides the existing arbitrary-key cmd_info merge (no resolver change), round-trips through resolved_def, not display -deferred; documented in the define -help directive-options. Caller side: new -formhint option on arg_error (manual parser + PUNKARGS block) pulled into usage via its existing resolved_def opts pull; supplied-empty (suppress) is distinct from not-supplied (the option declares no -default, so an unsupplied usage call passes nothing through). Precedence: caller > definition > built-in default, whose template substitutes to the exact prior bytes. Motivation (G-143 origin): script-level (script) ids - make.tcl's - are unreachable from any repl, so the repl-oriented 'i' hint was not actionable there. Scope decisions pinned: single-form renders never carry hint labels; the -return string renderer has no hint column and is unchanged. Byte-identity for unconfigured definitions proven by pre/post capture diff of 'punk::args::usage ::punk::args::parse' (identical bytes, through the usage pass-through path). Tests: new formhint.test (9 tests - default labels, directive/caller/suppression matrix, parse -error path, single-form + string-renderer scope); full punk/args subtree 302/0-fail on BOTH tclsh90 9.0.3 and the punk86 kit (8.6); punk/ns subtree 115/115 (cmdhelp consumer). make.tcl help untouched until promotion (maketclhelp.test still pins the bootsupport hint). Goals: G-149 activated at user direction then flipped achieved 2026-08-05 + archived (index record newest-first, detail file to goals/archive with Progress evidence and 1 follow-on: make.tcl adoption after a bootsupport promotion => open). Activation-freshness survey recorded the G-167 relationship (same renderer surface - composition note both sides); reference sweep updated G-151/G-167 mentions; goals_lint clean, no orphaned xref pairs. punkshell 0.55.0 + CHANGELOG. Bootsupport/vfscommon snapshots unchanged until promotion + bake. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |