User-directed follow-on to G-155 (2026-08-02): with punkshell alpha,
single-machine build infra and no evidenced third-party users, the
identifier keep-list becomes a candidate work-list while renames are cheap.
- goals/G-156-alpha-window-identifier-alignment.md: contract (proposed) -
punkcheck installer-identity migration (mint-named surface + ledger
strategy: rewrite vs rebuildable-cache re-record), BUILDCOPY -> BAKECOPY,
buildversion.txt disposition; census tool (fossil config-db lane per
G-016 caveats + bounded scan of user-confirmed roots, punkorigin.toml
primary marker + pre-G-087 fallbacks) with committed reconcile/freeze/
retire report; reconciliation honours G-027 docs-ownership split and
feeds its requirements; window-expiry condition recorded
- GOALS.md: G-156 index entry appended (activation is a user decision)
- goals/G-155-mint-stage-vocabulary.md: Related pointer to G-156 (Notes,
non-contract)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Pure-rename move goals/G-101-tcl86-kit-container-strategy.md ->
goals/archive/ (content edits landed in the prior commit); GOALS.md entry
-> GOALS-archive.md record (acceptance as achieved). Live-tier sweep:
G-131 Depends-on rewritten (the metakit arm now EXISTS - kithead step,
kithead.c/boot.tcl = the mk4 half of its detection; zipfs-backport open
items move there); G-130 both pending-tense sites updated (mk4 decided,
ix86 head = follow-on parity item 4); G-110 gains the measured
dll-from-vfs temp-copy fact; G-141/G-147 survey mentions gain achieved
markers; archived G-153 record+detail Scope path fixed (goals/ ->
goals/archive/, the sanctioned broken-path fix). xref report: no
unlinked pair loses its only bridge (annotated pairs are one-directional
with live links). goals_lint clean (82 active / 72 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Increment 3 - the kit-head (opt-in suite step "kithead"):
- build_kithead86/kithead.c: static Mk4tcl+vfs registration, preinit
reading boot.tcl from the exe's own mk4 file, post-init main.tcl pivot
(kbskit kitInit.c reduced to the 8.6 mk4 case; the 8.6.18 headers have
no Tcl_StaticLibrary - stock tclAppInit.c's file-local compat define
mirrored).
- build_kithead86/boot.tcl: kbskit boot.tcl mk4-only/8.6-only (tclInit
override, raw mk::select hand-eval of vfsUtils/vfslib/mk4vfs, mount +
encoding remount, in-kit init.tcl, auto_path reset).
- tools/mk4kit_attach.tcl: setupvfs role under the suite dynamic shell
(mount rw, lib trees + lf-normalized boot.tcl, tclvfs scripts with the
pkgIndex vfs entry rewritten to "load {} vfs").
- build86.zig: kithead exe (core+reg/dde+stubs as tclsh86ts, two-anchor
tclAppInit overlay, engine+binding via build_mk4tcl86 pub lists, static
tclvfs w/ STATIC_BUILD); artifact bin/tclsh8.6.18-mk4-r1.exe; smoke
asserts info library INSIDE the exe. No rechan needed (vfslib memchan
rides 8.6 reflected channels).
Increment 4 - the demonstration (hermetic env, PATH=System32, bare dir):
- head boots with library inside itself on a Tcl-free path;
- the RUNNING head ran sdx and wrapped a SEPARATE COPY of itself
(self-mount rider as specified);
- the starpack runs main.tcl from inside, reads vfs data, loads a
kit-only package, and loads thread2813t.dll FROM the vfs (dll clause
measured, not inherited).
Goal detail: Progress 3+4, Assessment (four candidates vs the four kit
expectations), Decision (mk4 = the 8.6 container and punk86 default;
zipfs backport stays the recorded G-131 second arm), Follow-on-to-parity
list; Status -> achieved 2026-08-02. Archive move follows separately.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
sdx.kit runs under the suite-built tclsh86t with NO tclkit in the chain:
starkit 1.3.3 + vfs::mk4 1.10.1 resolve from the suite-installed
lib/vfs1.4.2 (tclvfs trunk ships both scripts - the fact the 2026-07-26
survey missed), Mk4tcl 2.4.9.8 is the increment-1 fork-built battery, and
the wrap surface is proven not just the launch: qwrap WROTE an mk4 kit,
lsk/unwrap read it back, and the wrapped kit itself runs under tclsh86t
mounted at its own path. Goal detail: sdx-section RESOLVED marker +
Progress increment 2 with follow-on items (make.tcl suite-shell rung;
-runtime path waits on the kit-capable head).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Land the ready-to-land fork records in both flows and build the mk4
candidate's loadable shape as a suite battery:
- sources.config: source metakit git (gitea jn/metakit) pinned at
6a92b479 (the G-153-verified tree); matching build.zig.zon .metakit
lazy record (url+hash re-verified live via zig fetch at landing).
- build_mk4tcl86/: new extension module (build_tclvfs86 conventions) -
engine static lib (q4_UNIV set, -fno-exceptions -fno-rtti) + Mk4tcl.dll
(mk4tcl.cpp + bundled mk4too.cpp, USE_TCL_STUBS + BUILD_Mk4tcl) against
the suite stub lib; package version parsed from the staged
Tcl_PkgProvide; installs lib/mk4tcl2.4.9.8/{Mk4tcl.dll,pkgIndex.tcl}.
- build86.zig: build-mk4tcl step + install hook, pkg_smoke gains Mk4tcl,
bootstrapMode source_dirs/recipe_items rows; suite.tcl required-source
+ staged recipe item lists; README deliverable + selection records.
- goal detail: Progress increment record with the verification transcript
facts.
VERIFIED: suite.tcl build -steps {install install-libraries smoke} clones
the fork from the record, builds the dll, and pkg_smoke reports
Mk4tcl:2.4.9.8 in BOTH shells (tclsh86t dynamic AND tclsh86ts static).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Flip G-101 (kit container strategy for zig-built Tcl 8.6 runtimes) to
active in both tiers per the user's activation instruction. SEQUENCING
prose updated to record the activation; goals_xref score re-run at
activation per the freshness rule - one new relationship recorded: a
Related: G-130 back-pointer (its ix86 runtimes are the second platform
the container decision must fit; G-153 delivered mk4 dual-arch).
goals_lint clean (83 active / 71 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Stale 'unimplemented stub' parenthetical replaced with the achieved
dispatch semantics (c preferred, parity-tested pure-Tcl fallback
automatic, scan runs on any tclsh - G-070); the interim Context flag
noting the stale contract wording removed.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
punk::lib 0.6.0: tclparser_tcl stub replaced by delegation to
punk::tclparser; new tclparser_prefer (memoized auto c|tcl dispatch via
namespace-local parse aliases, forcible); tclscript_info and
tclword_to_scriptlist route through it; a+ -using debug puts commented
out (crashed plain tclsh); tclword_to_scriptlist PUNKARGS argdoc added.
New suites: tclparser_engine.test (20 oracle-verified pins + dispatch,
runs everywhere) and tclparser_parity.test (77-case recorded corpus +
range-walk + entry-point parity, capability-gated, oracle dir via
PUNK_TCLPARSER_ORACLE_DIR). 23/23 under tclsh 8.7a6 and 9.0.3; lib
subtree green (8.7 compat.test lpop failure proven pre-existing).
Real 8.6.13 (punksys kit): corpus parity clean; \xHH model corrected -
TIP 388 2-hex cap holds on 8.6 too, version-conditional removed from
the engine. Plain-tclsh fallback demo green both gens (auto_path
cleared): prefer->tcl, tclword_to_scriptlist correct incl nested
array-index command substitutions, output identical to the c path.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New module punk::tclparser 0.1.0 (zero-dependency): parse
command/getstring/countnewline over byte-view scanning (modified utf-8),
same result shapes and error messages as the tclparser C library.
Deliberately does not provide package 'parser' (capability probe).
Parity vs fork oracle dlls: edge corpus 234 comparisons clean per gen;
recursive organic sweep over lib/args/ansi/textblock/tclparser sources =
50005 (Tcl 8.7a6) and 49928 (Tcl 9.0.3) command-parses, 0 fails, all
~330 error-parses per gen message-identical. Generation differences
modelled version-conditionally: \xHH 2-hex cap (8.7+), Tcl 9 bare '('
rejection in array indexes, Tcl 9 nested-brace ${name} scanning.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation freshness survey (goals_xref score G-070) found no new
overlaps; strong hit G-019 already Related in G-070 - reciprocal
back-pointer added to G-019 Notes. goals_lint clean (84 active / 70
archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Static-embed experiment (untracked build86_mk4embed.zig variant in the
suite _build staging, preserved at TEMP_REFERENCE/metakit-mk4embed/):
tclsh86ts-mk4.exe = kit-class static shell + engine + Mk4tcl + mk4too
via Tcl_StaticLibrary registration; increment-4 smoke transcript passes
identically; import table measured IDENTICAL to stock (zero new dll
deps from C++ embed - G-130 prediction now measured). Acceptance
resolution recorded at fork pin 6a92b479; remaining list EMPTY; Status
flipped achieved 2026-08-02. Archive move + index swap + reference
sweep follow in the companion commit (pure-rename discipline).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Content-identical move per the Doc Restructures rule; all flip content
edits landed in the adjacent previous commit (8683fe70).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Completion increment: fork pushed by the user; pin
16d2f460b89dfd819aa08ceb97dfebf37b9fa55a; ready-to-land
sources.config/zon records made concrete for both suites (zig-fetch
hash tclparser_punk-0.1.0-aKPixmovFABEMo61xgv1YjUqdgqe41ZiB-EucAgmM-We);
'zig build dual' re-verified via the lazy zon pins alone; kit-shell
load + parse round trips recorded (punk902z Tcl 9.0.2, punksys Tcl
8.6.13) PLUS beyond-acceptance ix86 runtime verification under the
32-bit verification kits (punkluck86 8.6.10, punk91ix86 9.1b0, WoW64)
- combined dll coverage Tcl 8.6.10/8.6.13/8.6.18 + 9.0.2/9.0.5/9.1b0,
x64 and ix86.
Achieved flip per the GOALS.md maintenance rules (acceptance met in
full, judged against the detail file; flagged in the session report -
the goal went proposed->achieved without an active phase): index entry
moved to GOALS-archive.md; reference sweep applied - G-070 (Scope both
tiers, Context, Related line gain the achieved/archive marker),
G-069/G-101/G-130 Notes gain pointers to the archived file (G-130's
also records the ix86 runtime verification its verification kits
enabled). The detail-file move goals/ -> goals/archive/ lands as the
adjacent pure-rename commit.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
metakit_punk pushed by user; origin/master verified == local ==
6a92b479 (all increment-1..4 verifications ran at exactly this tree).
zig 0.16.0 package hash computed for the gitea archive pin; the
sources.config and build.zig.zon READY-TO-LAND records in Notes are now
concrete (landing them stays G-101-era consumption per Scope).
Remaining for acceptance: static-embed shape only.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance parenthetical amended eight -> nine patches per user
approval; Notes inventory updated to the completed-audit state.
Increment 4 (metakit_punk a714cda/fbbeaf3/6a92b47): binding ported
byte-identical + single own-commit fork edit (univ.h include); 'zig
build mk4tcl' stubs-linked dll vs the suite tcl pin (lazy zon dep +
-Dtcl-src both verified); tclsh86t 8.6.18 smoke transcript recorded
(package require 2.4.9.8 + mk::file round trip + mk4too surface +
read-back) - PLUS the ix86 dll passing the same smoke under the luck
8.6.10 win32-ix86 shell. Version policy recorded: package provide
stays 2.4.9.8, fork versions the repo. Remaining: static-embed shape,
pin capture (push pending).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-154 (proposed): fork-as-upstream tclparser build lane at
c:/repo/jn/tclparser_punk - tcltk-depot parser 1.9 porting baseline
with the aspect chiselapp fossil lineage as a second byte-frozen
snapshot, dual-generation stubs dlls (tcl9tclparser19.dll /
tclparser19t.dll) dual-arch under the pinned zig 0.16.0, upstream
114-case testsuite gate. Seed increment verified green 2026-08-02
(fork commits 7c18555 + 16d2f46): builds via suite-matching lazy zon
tcl pins AND standalone, dual step, gate transcript Total 114
Passed 112 Skipped 2 Failed 0 both generations. Detail file carries
the upstream-landscape survey, draft suite consumption records, and
remaining acceptance items (push+pin, kit-shell load transcript).
G-070: Scope (both tiers), Acceptance reference clause and Context
repointed from the never-materialised TEMP_REFERENCE tclparser tree
to the fork repo (snapshots + dll oracle + corpus seed); Related
note to G-154 added.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
metakit_punk 07ca657 + e8ae8a3. All nine KitCreator mk4tcl patches
dispositioned vs the 2.4.9.8 baseline (table in the fork's
src/reference/AGENTS.md): zero to port - live lineages already
absorbed, compilewithcvs superseded (CONST86 + guarded
Tcl_GetErrorLine), three autoconf rejects. Count correction flagged:
the set is nine, not the Acceptance parenthetical's eight (audited
superset; wording amendment is a user call). mk4too decision recorded
(user): the fork Mk4tcl dll bundles mk4too - both upstream builds do,
oomk depends on the surface, and mk4tcl.cpp does not even link without
it (unguarded MkView in mk::view open/new). oomk 0.3.5 wayback-
recovered (final 2008-2018 artifact) and vendored as fork consumer
reference. Remaining: Mk4tcl dll + smoke, static-embed, pin capture.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
metakit_punk 07ca657: all nine KitCreator mk4tcl patches dispositioned
vs the 2.4.9.8 baseline (table in the fork's src/reference/AGENTS.md);
zero to port - live lineages already absorbed, compilewithcvs
superseded, three autoconf rejects. Count correction flagged: the set
is nine, not the eight in the Acceptance parenthetical (audited
superset; wording amendment is a user call). Second mk4too-bundling
data point (KitCreator matches upstream CMake) recorded for the dll
milestone. Remaining: Mk4tcl dll + smoke, static-embed, pin capture.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Multiform per-form failure statuses (formstatus records, noformmatch errorcode
classes + -formerrors) are now sound suffix-viability verdicts: 'incomplete'
(viable) iff every supplied word was validly consumed as a prefix of the form
and the failure is pure exhaustion at end-of-input; anything already supplied
contradicting the form reports 'invalid'. Mechanism: viability-probe mode on
private::get_dict_form suppressing only the position-guarded pure-exhaustion
raises (count min-shortfalls, missing-required checks, adhoc option value at
end) while final validation of the consumed words stands as the soundness
backstop; multiform candidacy and parse_status's single-form formstatus record
confirm each classify-'incomplete' failure with one probe re-parse. Rendered
noformmatch form lines marked '(viable - needs more arguments)'/'(not viable)'
after the stable "form '<fid>':" anchor. Consumer contract documented in the
parse ('Multiform failure contract') and parse_status argdocs. Documented
conservatism: input ending inside a multi-member type clause reports invalid.
New testsuite formviability.test (acceptance scenarios, option position
guards, single-form record soundness, clause conservatism, message marking);
forms.test verdict pins deliberately updated (ms/idle incomplete->invalid for
type-screen rejections). punkshell 0.41.3 (patch: refined multiform error
classification/reporting at the shell surface).
Goal G-152 activated (user-directed) and flipped achieved 2026-08-02 with
acceptance verified via runtests (args subtree green; full-suite parity with
stashed baseline); entry archived to GOALS-archive.md, detail file to
goals/archive/ with verification evidence; consumer pointers pushed to
G-044/G-150 notes.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
metakit_punk 9b1befa: demo/dump/struct ported as the interchange
vehicles (user-approved fold-in); 'zig build interchange' green -
read-back identity both directions (dump + struct) + writer parity
under zig 0.16.0, transcript recorded in the detail file. One-byte
physical writer difference (offset 169 varint continuation bit) carried
as a patch-audit observation; mk4too-in-dll upstream fact recorded for
the binding milestone. Remaining acceptance list updated.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation-freshness overlap survey (goals_xref score G-153) re-run at
activation: all high-scoring pairs already carried as Related: notes
(G-101, G-130, G-131, G-105, G-116, G-110, G-063, G-026, G-108); no
goals drafted since G-153, no new relationships to record.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-153 [proposed]: fork-as-upstream metakit port under the pinned zig -
standalone core + Mk4tcl dll/static shapes, win32-x86_64 + win32-ix86
from day one, KitCreator patch audit vs the 2.4.9.8 baseline, dll smoke
under suite-built tclsh86t (the sdx-circularity probe enabler), mk4
x64<->ix86 interchange check, and ready-to-land sources.config/zon
record text for suite consumption. Non-contract Notes: G-101 records
metakit_punk as the mk4 porting vehicle superseding the TEMP_REFERENCE
metakit trees; G-130 gains the measured UCRT linkage + OS-floor
statement (Win10 zero-prereq, Win7/8.x need KB2999226, XP/2000
structurally out), the Windows 2000 placement with the luck-specimen
Win2k-clean import measurement, the SSE2 (pentium4) cpu-baseline rider,
and the lane-mechanics inventory (standardTargetOptions present;
critcl/baselines/punkres-PE32/punkbin-folder/twapi-x86 gaps); G-131
points at G-153 for its metakit arm. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-152 punk::args form-failure suffix-viability verdict: a candidate form
is marked viable iff every supplied word is a valid prefix and the
failure is pure exhaustion - fixing the witnessed false positive
(parse {frobnicate} classes the info form 'incomplete' identically to
parse {info}), documenting the noformmatch errorcode/formstatus class
vocabulary as a stable consumer contract, and marking viability in the
rendered per-form report. Enabler for G-044 completion; runtime
counterpart of the achieved G-074 static formcheck. Probe evidence in
the detail file. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
G-149 punk::args configurable multi-form synopsis hint labels (the
hard-coded ' i -form N ...' column, repl-centric and unreachable for
(script) ids - identified during G-143).
G-150 punk::ns cmdhelp form narrowing + selection-sound auto_exec::hash
declaration (-regexprefail {^-} on the plain name value - the verified
fix for the latent 'Ambiguous arguments' on bare parse-withid; brings
the make.tcl help dry-run contract to 'i').
G-151 punk::args annotated success render (received-args landing
report - the punk::args-level supersession of make.tcl's interim
'dry-run: line accepted' line).
All proposed status; overlap surveys recorded per goal (punkargs family
via goals_xref; G-044/G-050/G-056 named as related, G-149<->G-151
cross-linked). goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
User-directed: the bare-action carve-out is removed - 'make.tcl help
buildsuite build' now falls through to the punk::args diagnosis like any
other incomplete line (exit 1). Empirically the error table carries the
form's argument rows alongside the all-forms synopsis and per-form
reasons, so the diagnosis IS the form documentation and the carve-out
bought nothing but an exit code. Accepted lines gain a one-line
received-args report after the usage table, built from the parse
result's 'received' key (defaulted opts omitted):
'dry-run: line accepted (form build) - action = build | -test = 0 |
toolname = punkzip'. This makes punk::args' value-swallow visible
('kitname = punk91 -confirm 0' for the out-of-order line) - an interim
make.tcl-side clue until punk::args grows an annotated success render.
bake/bakelist kitname -choicerestricted 0 confirmed deliberate
(discoverability-only choices; handler validation authoritative;
define-time mapvfs parse best-effort). maketclhelp.test pins updated;
help/tool/colour suites 20/20. punkshell 0.40.3.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
User-directed second refinement: 'make.tcl help <subcommand> ?arg ...?'
(and '<subcommand> ?arg ...? -help') now parses the words through the
subcommand's punk::args declaration exactly as dispatch would (form
auto-selection, choice prefixes). An accepted line renders the matched
action's single-form usage ('help tool build -test 0 punkzip', 'help
tool bu'); a rejected line (unknown action, option-first line, unknown
flag in option position) emits the same punk::args noformmatch
diagnosis dispatch gives - all-forms synopsis plus per-form reasons -
on stderr, exit 1: the error table is itself usage documentation, so
help verdicts mirror dispatch verdicts. Carve-out: a bare action
word/prefix renders its form directly, since forms with required
values ('buildsuite build' needs a suitename) would fail a strict
dry-run. Replaces 0.40.1's leading-word-only selection and option-first
whole-usage fallback. Empirical punk::args findings recorded (archived
goal file + probes): flag-like words at/after the first value position
parse as values; -regexprepass/-regexprefail are honoured during form
matching (a '-regexprefail {^-}' value disambiguates flag-led lines -
the punk::auto_exec::hash latent selection ambiguity). maketclhelp.test
pins updated; help/tool/colour suites 20/20. punkshell 0.40.2.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
User-directed reshape of the help-depth interface: 'make.tcl help
<subcommand> ?arg ...?' (and '<subcommand> ?arg ...? -help') now accepts
the subcommand's command line as typed and renders the usage most
specific to it - 'make.tcl help tool build -test 0 punkzip' shows the
tool build form via its leading action word (the same literal-leader
word punk::args form auto-selection keys on at dispatch). Words after
the action are tolerated and ignored; an option-first line falls back to
the whole subcommand's usage; single-form subjects (e.g 'help bake
punk91 -confirm 0') ignore the words entirely; an unknown action word on
a multi-form subject stays a pointed exit-1 usage error. The 0.40.0
numeric form-index acceptance ('help tool 2') is withdrawn as
unintuitive. Probe recorded: the repl 'i' (punk::ns::cmdhelp) tolerates
trailing argument words but does not form-narrow flat multi-form
commands - make.tcl help now exceeds it there. maketclhelp.test pins
updated (12 tests, all green + tool/colour suites); punkshell 0.40.1.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
tool/buildsuite/help are multi-form punk::args definitions (one @form per
action, literal single-choice action leaders + choicelabels): 'help tool' /
'help buildsuite' render one synopsis line per action; 'make.tcl help
<subcommand> <action>' - equivalently '<subcommand> <action> -help', or a
0-based form index ('help tool 2') - renders that action's single-form
usage; unknown actions and out-of-range indexes are pointed punk::args
errors (exit 1). tool dispatch parses through the definition (unknown
actions/flags: exit-1 usage errors). User-approved deviation: the declared
positional model puts options before tool names ('tool build -test 0
<name> ...'); docs/agent guidance updated to match and a flag-shaped tool
name earns a stderr hint; the PUNKBOOT_PLAIN degraded scan keeps the
historic flag-anywhere parse. buildsuite driver-arg passthrough unchanged.
G-144 consumer follow-through: all 17 per-subcommand @form -synopsis
overrides retired (automatic @cmd -name bracket-notation synopses;
top-level make.tcl override kept deliberately). Pinned by new
punkexe/maketclhelp.test (12 tests); full punkexe subtree green (114
tests, 0 fail). Goal flipped to achieved and archived; punkshell 0.40.0.
Assisted-by: harness=claude; primary-model=claude-opus-5[1m]; api-location=anthropic.com
Auto-generated synopses for (script)-prefixed constructed definition ids
now lead with the declared @cmd -name (the invocation name - e.g
'make.tcl modules' for (script)::punkboot::modules) instead of the raw
id, across punk::args::synopsis full/summary renders and the
usage/arg_error synopsis sections that funnel through them (punk::args
0.12.7 -> 0.13.0).
The fallback is gated on the (script) prefix only (user-confirmed
narrowing): (autodef) ids are excluded - their id-minus-tag IS the
invocation (arg_error's existing tag strip surfaces it) while their
@cmd -name is a display label ('destroy', 'Object: ::x');
(shared)/(package)/(default)/(widgetcommand) doc ids declare no
invocation-style -name today and render the id as before. Real command
ids render byte-identical (full args testsuite passes with no pin
updates). Six new synopsis.test pins: (script) full/summary/multiform/
surfaces, no-name constructed id, autodef unchanged, real-id
byte-identical.
Goal tiers: index entry archived to GOALS-archive.md, detail file moved
to goals/archive/ (G-143's pending-tense Related line rewritten to
reflect achievement + follow-through pointer: make.tcl's @form
-synopsis overrides are now optional, retirement under G-143 or a
follow-on edit). Docs: @form -synopsis directive known-case text,
synopsis -help, src/modules/AGENTS.md ergonomics bullet. Project
0.39.5 -> 0.39.6 (patch: latent capability, no shipped definition
renders differently today).
Bootsupport refresh (make.tcl modules + bootsupport): snapshot gains
args-0.13.0.tm and picks up two lagging source syncs -
mix/commandset::layout 0.2.0 -> 0.3.0, mix/commandset::project
0.4.0 -> 0.4.1, and the shellfilter 0.2.4 G-145 comment; superseded
copies pruned.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
G-146 [proposed] Fossil binary-glob seeding for generated projects:
the trailing fossil initial commit of a generated project aborts on
binary payload (layout bin/sdx.kit, injected zip-based .tm modules,
incoming G-136 .ico) because thin layouts ship no binary-glob setting.
Deferred twice already (G-087 -> G-012 territory); scoped as its own
goal with the glob-value and seeding-path decisions recorded as open
options and relationships to G-136/G-086/G-027/G-114/G-047 surveyed.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
Layout .gitignore payloads are now stored inert as gitignore.in and
materialized to .gitignore at project generation, ending the
self-censoring-template hazard (live nested .gitignore files silently
untracked template content in git while fossil managed it fine):
- punk::mix::commandset::layout 0.3.0: layout_materialize_renames map;
layout_stage_chain renames inert payloads after composing all overlay
layers (.anti markers keep targeting store names); layout_materialize
withholds the in-place fast path from inert-payload folders so the
store is never renamed; inert+live name conflict errors loudly
- make.tcl thin-layout sync refreshes every vendor/punk layout's
gitignore.in from the canonical repo-root .gitignore (punkcheck-tracked
sync_layouts events); workflow text updated
- the four vintage payload variants eliminated as drift: all payloads
now byte-identical mirrors of root; modpod copy carried and its stale
.gitignore pruned
- materialize.test +5 G-012 characterization tests (25/25; mix subtree
71 pass / 1 known skip)
Verified end-to-end: generation from each affected layout yields a
byte-identical .gitignore (othersample .anti case yields none); root
edits propagate to payloads via make.tcl libs in both directions; the
fc1c474c force-added template files are back to ordinary git tracking
with no ignore rule matching them; modpod payload README trees are now
visible as ordinary trackable files.
Goal flipped achieved 2026-08-01 (user-confirmed; the custom/_project
acceptance clause is stale - that store level was retired by G-087
stage 5 after drafting; recorded in the archive record and detail
evidence). Reference sweep + archive moves per the flip protocol.
Project version 0.39.5.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
The Tcl core delivers 'clear' to a transform stack before EVERY write op
(output-buffer flush-down; tclIORTrans.c ReflectOutput, gated on METH_CLEAR -
intentional and test-pinned, but under-documented: doc/transchan.n and TIP 230
scope clear to seek/read-side buffers). ::punkboot::ansistrip::transchan's
clear handler ran 'dict unset carry $chanid', discarding a split sequence's
held ESC tail at every write-chunk boundary: the next chunk's ESC-less
remainder ('0;1m', '1m') passed through unstripped as orphan fragment text in
piped usage tables, while the dropped ESC bytes kept the G-113 zero-ESC pin
green. The transform is write-only with no read-side state, so its
contract-conformant clear is a no-op - it no longer declares the op, the
per-write calls never fire, and the split-sequence carry survives every chunk
boundary. finalize still drops an end-of-stream partial sequence. No change in
textblock/punk::ansi (pre-transform stream verified well-formed during
diagnosis; exonerated).
Pin: maketclcolour.test gains maketcl_colour_help_tables_zero_remnants -
piped 'tclsh src/make.tcl help' for all 20 declared SUMMARIES subjects plus
bare 'help'/'-help', asserting exit 0, zero ESC bytes, zero orphan fragments
(two-step detector: strip complete sequences, then scan for [0-9;]+m not
preceded by ESC or an open bracket - a raw scan false-positives on ';1m' inside complete
multi-parameter SGR). Failing-first evidence: pre-fix the pin names exactly
the 5 fragmenting invocations (help, -help, help libs, help info, help
bootsupport); the 22-invocation NO_COLOR+PUNK_FORCE_COLOR pre-transform
corpus carries no legit text matching the detector.
Verified (tclsh 8.7a6, win32-x86_64): all 22 invocations byte-level clean;
PUNK_FORCE_COLOR=1 output intact (1177 complete sequences, 0 orphans); the 3
G-113 colour-policy pins pass unchanged; shell/testsuites/punkexe family (15
files, 102 tests) and shell/*** (127 tests) green, warnings pre-existing only;
'make.tcl packages' verified, layout + modpod make.tcl copies synced by the
build (punkcheck-managed outputs batched here per the carve-out).
Bookkeeping: goal flipped active -> achieved 2026-08-01, detail file archived
(goals/archive/G-145-piped-usage-ansi-remnants.md), G-056 Notes gains the
exoneration pointer; src/AGENTS.md colour bullet + src/tests/shell/AGENTS.md
suite description updated; project version 0.39.4 (patch) with CHANGELOG
entry.
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
Investigation record only - no fix yet (goal remains proposed).
Root cause: the Tcl core delivers the transform 'clear' op before every
write (output-buffer flush-down; tclsh 8.7 and 9.0.3), and
::punkboot::ansistrip's transchan handles 'clear' with 'dict unset carry'
- discarding a split sequence's held tail at every chunk boundary. The
tail's remainder (e.g. 0;1m) passes through unstripped while the held
ESC[ bytes are never emitted, so the zero-ESC pin (maketclcolour.test)
stays green while fragments leak. Evidence: pre-transform stream captured
via NO_COLOR+PUNK_FORCE_COLOR is fully well-formed (textblock/punk::ansi
exonerated; G-056 not the mechanism); the verbatim strip proc is correct
for every possible 2-chunk split and 512..8192 block sizes; an identity
logging transform under ansistrip captured the boundary byte-exactly;
minimal isolated repro on a bare file channel reproduces both the
per-write 'clear' op sequence and a fragment. Deterministic per table
geometry, matching the observed intermittency.
Upstream (TEMP_REFERENCE/tcl9 survey): per-write 'clear' is intentional,
test-pinned core behavior (ioTrans.test iortrans-7.1 "chan write, write
clears read buffers") but transchan.n and TIP 230 document it as
seek-only and read-side-scoped - an upstream documentation gap, not an
implementation bug; no existing Tcl ticket found. A write-only
transform's contract-conformant 'clear' is a no-op; fix layer recorded
in the goal file (drop 'clear' from the supported-methods list or make
it a no-op; 'finalize' keeps dropping the carry).
- goals/G-145-piped-usage-ansi-remnants.md: root cause, evidence chain,
upstream documentation status, fix layer, encoding note, repro recipes
- shellfilter: G-145 warning comment over the commented-out 'clear'
method so future refactors don't discard o_encbuf/stream state there
goals_lint clean (83 active-index goals, 62 archived).
Assisted-by: harness=opencode; primary-model=opencode/kimi-k3; api-location=unknown
G-143 make.tcl help depth: multi-form tool/buildsuite definitions and
per-action usage - @form sections with literal action leaders so help
shows which actions take <toolname>/-test, 'help <sub> <action>' renders
the single form, tool dispatch becomes fully declared, buildsuite keeps
its passthrough driver-args contract.
G-144 punk::args auto-synopsis @cmd -name fallback for non-command ids -
unblocks dropping make.tcl's hand-written ?...? @form -synopsis lines in
favour of the automatic bracket notation (retires the G-030 workaround
for (script):: ids).
G-145 remnant-free piped usage tables - root-cause and eliminate the
orphan CSI fragments ([0;1m / [0m / lone m) observed beside table borders
in piped help output; extends the G-113 zero-ESC guarantee to zero
sequence-fragment text.
All three born from the 2026-08-01 argdoc restyle evaluation (mechanisms
verified live on bootsupport punk::args 0.12.7). Overlap surveys recorded
in each detail file; goals_lint clean (83 active-index goals); xref score
reviewed per goal - the top term-scored unlinked pairs for G-143 (G-085,
G-021) checked and judged lexical-only, no relation recorded.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com