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
@ -222,4 +222,4 @@ Increments land as separate commits, each leaving all suites green:
## Follow-ons
Follow-on: boot-site commandstack pre-sourcing - punkboot core.tcl, make.tcl, punk::repl's two boot blocks and punk::lib's interp_sync child-seeding all pre-source LIBUNKNOWN by path expressly to avoid triggering the old package unknown pre-init; libunknown 0.3.x init's 'package require commandstack 0.8-' resolves in all of them but performs one ordinary unknown-path resolution pre-init when commandstack is not yet provided (a root-depth sibling scan lands in 'untracked' - functional, marginally looser epoch bookkeeping; in punkshell app boot packagepreference::install provides commandstack first so the require is a no-op there); extending the same glob+source technique to commandstack-*.tm at those sites would preserve the minimal-untracked intent exactly => open
Follow-on: make.tcl skip-guard modernization - the 'info commands ::punk::libunknown::package' check that skips re-load when make.tcl is driven by a built punk shell tests a proc the 0.3.x commandstack install no longer creates; old kits (0.2.4) still satisfy it so nothing breaks today, but once kits carry 0.3.x the check never fires and make.tcl re-sources libunknown into the driving shell (harmless - init's stack-query guard no-ops - but noisy and wasteful); switch it to a package-provide check before or with the bootsupport/kit promotion of libunknown 0.3.x + commandstack 0.8.0 => open
Follow-on: make.tcl skip-guard modernization - the 'info commands ::punk::libunknown::package' check that skips re-load when make.tcl is driven by a built punk shell tests a proc the 0.3.x commandstack install no longer creates; old kits (0.2.4) still satisfy it so nothing breaks today, but once kits carry 0.3.x the check never fires and make.tcl re-sources libunknown into the driving shell (harmless - init's stack-query guard no-ops - but noisy and wasteful); switch it to a package-provide check before or with the bootsupport/kit promotion of libunknown 0.3.x + commandstack 0.8.0 => landed 2026-08-08 (make.tcl guard swapped to 'package provide punk::libunknown' in the same commit as the bootsupport promotion of libunknown 0.3.1 + commandstack 0.8.0; both vintages' boot-site source executes the provide, verified against 0.2.4 and 0.3.1)
#todo: consider -forcebase 1 or similar to allow this rename to point to bottom of stack (original command) bypassing existing renames
# - need to consider that upon removing, that any remaining rename that was higher on the stack should not also be diverted to the base - but rather to the next lower in the stack
#
if {[lindex $args 0] eq "-renamer"} {
set renamer [lindex $args 1]
set arglist [lrange $args 2 end]
} else {
set renamer ""
set arglist $args
set renamer ""
set punkargs_defs [list]
set arglist $args
while {[llength $arglist] > 3 && [string match -* [lindex $arglist 0]]} {
error "commandstack::rename_command -renamer is recognised only as the leading argument. usage: rename_command ?-renamer <string>? command procargs procbody"
foreach opt {-renamer -punkargs} {
if {$opt in $arglist} {
error "commandstack::rename_command $opt is recognised only in the leading option positions. usage: rename_command ?-renamer <string>? ?-punkargs <list-of-definitionlists>? command procargs procbody"
#G-166: the virtual ids for forward classes THIS runtime lacks lead their help
#with the unavailability statement. The static class description already carries
#a version annotation, but it sits at the END of the prose (dict's "(class not
#present in Tcl 8.6)" is the twelfth line) - a reader of 'i string is dict' on 8.6
#met the full class documentation before learning the class does not exist here.
#Runtimes that HAVE the class generate the id unchanged (the loop's condition is
#empty there, since string_is_unavailable is computed per-runtime above).
if {$sclass in $string_is_unavailable} {
set sclass_help " NOT AVAILABLE in this Tcl\n runtime ([info patchlevel]).\n Recognised forward class:\n the name is known and its\n prefix reserved here, but\n 'string is $sclass' is\n rejected by this\n interpreter.\n\n$slabel"
#(private::unavailable_choice_msg, G-073) - a user who meets both reads one story.
#The runtime-specific WHY is not repeated here: it belongs to the definition, and the
#unavailable subject's own help leads with it (the tclcore virtual ids do since G-166).
proc _cmdhelp_unavailable_marking {name} {
#(wording stays position-neutral: the table/string renderers place the message
#below the usage, the text form leads with it)
return "'$name' is a recognised name here, but is not available in this runtime/context - this command line is not usable here and the usage shown is reference documentation only."
}
#G-176: one-line override-in-place notice from cmdinfo's 'overridden' axis.
#basecmd is the command the records belong to (the cmdhelp subject);
#overridden is the list of {renamer .. docids ..} dicts (bottom-up). Returns
#the bare notice - the table render prefixes 'note: ', -return text prefixes