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
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
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
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
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
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
New proposed goal (user-approved wording, from the post-G-073 design
discussion 2026-08-05): version/context deltas of a command's interface
become declarable and honestly surfaced without delta computation,
layered by delta kind. An @form may be declared unavailable -
participating in candidacy/diagnosis, displayed annotated, tailored
formunavailable rejection when only unavailable forms match, silent
resolution to the available form when both match (the first sanctioned
exception to G-041's no-silent-preference rule: documentation never
competes with reality), -form selection displays but refuses parse.
Option NAMES may be declared unavailable (the G-073 mirror at the
option-name level) with pointed tailored rejection. The default render
stays on available forms plus an AUTOMATED note enumerating unavailable
shapes (name + authored note + navigation hint - no computed delta;
user display decision relaxing the strict G-073 display-among-peers
principle for shape deltas only, since named things keep per-name
display via the option/choice layers). formstatus gains an additive
'available' field (G-152 contract) as the machine surface, and
authoring guidance prescribes -choiceunavailable for subcommand-shaped
deltas so the same concept never surfaces through two inconsistent
paths.
Detail file records the layered-model rationale, the silent-preference
exception scope, the two-paths trap prescription, era authoring via
shared -form tags (one form per version era - linear), engine seams,
and the relations/overlap survey (G-073 foundation, G-166 sibling
surface, G-152/G-041/G-074/G-150/G-149/G-044/G-055). Acceptance and
the lsearch -stride adoption candidate are agent-derived for user
review; status proposed. goals_lint clean (82 active / 85 archived).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New per-argument key -choiceunavailable <list>: names recognised but not
available in the current runtime/context. Entries display among the
choices under a dedicated "Unavailable (recognised, not selectable
here)" group (one rendering-side injection - both renderers,
choicelabels notes, choiceinfo markers, trie prefix marking and
value-in-effect exclusion all inherited) and join the prefix pools;
synopsis literals and goodchoice marking never include them. Resolve
-time validation: no collision with choices/alias names/reservelist,
-default may not be unavailable, requires -choices/-choicegroups.
choiceword_match gains an optional 8th argument and an 'unavailable'
result key (matched stays 0 - matched-only consumers unaffected):
exact, nocase and unique-prefix landings carry the name as canonical; a
prefix shared with an available choice stays plain-ambiguous.
Validation rejects a landing with the tailored PUNKARGS VALIDATION
{choiceunavailable <name> choices <list>} error (-badarg/-badval;
private::unavailable_choice_msg names the supplied word, the resolved
entry, its choicelabel note and the available values; shared by final
validation and both G-082 overflow raise sites via rejection kind
'unavailable' from the allocation screen). Ambiguity messages annotate
unavailable longer matches '(recognised but unavailable)';
-choicerestricted 0 keeps full passthrough.
tclcore 'string is' adoption: curated forward list {dict} ('unicode'
deliberately excluded) diffed against the define-time harvest; labels
and per-class virtual ids extend to unavailable classes. On Tcl 8.6:
dict displays with its "(class not present in Tcl 8.6)" note,
'string is dict' rejects informatively, 'string is di' is ambiguous
(deliberately stricter than real 8.6 - recorded as a user-sanctioned
parity exemption; full words parity-true), and 'i string is dict'
documents via the virtual id. punk::ns cmd_traverse passes the key at
both resolver sites (doc-walk parity; the choice-traverse comment now
documents the choice-resolution vs doc-addressing axes split). tclcore
moduledoc requires punk::args 0.16.0-.
Tests: new choiceunavailable.test (10 tests); usagemarking.test gains
the goodchoice-exclusion pin; tclcoreparity.test gains forward-class
adoption invariants and the sanctioned 'di' strictness exemption, with
the version_notes pin deliberately flipped (dict's label now renders on
every runtime). Green: the three suites 37/37 on native Tcl 8.6.10
(luck runtime), 8.7a6 and 9.0.3; punk/args subtree 293/290/3 skips/0
fail on 9.0.3 AND 8.7; modules/punk sweep green except the three
documented pre-existing box-baseline failures (grepstr x2, nslist x1);
ns cmdhelp/corp 58/58 after the comment clarification.
Goals: G-073 flipped achieved 2026-08-05 + archived (index record
moved, detail file to goals/archive with Progress/verification and 3
follow-ons). G-166 drafted [proposed] at user direction (approved
wording): cmdinfo availability key + cmdhelp marking + tclcore leading
note + prefix-landing decision; the enacted G-073 follow-on flipped
=> goal G-166, the G-055 pattern follow-on => goal G-055 with a Notes
pointer added there. goals_lint clean. punkshell 0.54.0 + CHANGELOG.
Bootsupport/vfscommon snapshots unchanged until promotion + bake.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Every make.tcl zip-kit bake is to emit an ARCHIVE-relative kit regardless
of the driving interpreter's zipfs vintage (legacy file-relative mkimg in
8.7/9.0.0, fixed mkimg in 9.0.1+, or no mkimg at all): zip-kit assembly
moves to a single writer layer - punkzip (zig) when its binary is present,
punk::zip::mkzip (pure Tcl) as the always-available floor - with
tcl::zipfs::mkimg retired from the pipeline, and file-relative output only
via an explicit per-kit mapvfs.toml opt-in. Workstream order (user
decision): upstream punkzip root-strip/exclude enabling changes first,
then the punkshell seam. The detail file carries the driver-vintage probe
evidence (8.7a6=file, 9.0.3=archive), the upstream fix provenance (ticket
aaa84fbbc5, core 3d62ee540d 2024-12-05), the write-path benchmark (mkimg
11.4/35.9s vs mkzip 8.1/24.8s vs punkzip 6.7/20.0s at 132MB/396MB), the
drafting-time overlap survey and Related lines.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
- new goal (user-drafted 2026-08-04): when the valmin reservation seats a word that literally names a declared required option into a required value slot and the resulting optionmissing stands in the G-152 viability probe, re-parse with the stolen word(s) consumed as the option they name; pure end-of-input exhaustion after that re-seating grants viable-incomplete. Runtime seating unchanged (the trailing-flag-as-value rule is load-bearing, pinned by flagvalues_plain_then_dash)
- surfaced by the G-150 batch + independent second-session review: 'i hash -t' classes the test form '(not viable)' although 'hash -t foo' is valid - a false negative, GAP-pinned in cmdhelp.test (owned by this goal; the pin flips at achievement)
- overlap survey in the detail file (G-044 consumer; G-152/G-150 archived relations; args/ns family anchors dismissed as unrelated mechanisms)
- G-044 Notes: records G-164 as the probe-layer answer to G-152's "completion consumer lookahead" note for the valmin-reservation class
- goals_lint clean (82 active, 82 archived)
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
Acceptance met in full (evidence in the archived detail file's Progress): 'i ::punk::auto_exec::hash -r' renders only the rehash form's usage and '-d <name>' only the delete form, driven by the declaration (bare punk::args::parse withid selects flag-led forms uniquely via the show_or_set name's -regexprefail {^-}; no hash-handler involvement); runtime behaviour otherwise unchanged (dash-led name needs an explicit flag form - accepted cost); ensembles/single-form/no-word invocations render as today. The goal reduced to its declaration half - cmdhelp's G-041 advisory-parse candidacy already narrowed on a unique selection.
- index entry -> GOALS-archive.md; detail file -> goals/archive/ with Progress evidence and Follow-ons (handler multi-name -t missing-name defect => landed 2026-08-04 by user fix; selection-soundness sweep of other definitions => open)
- activation-freshness xref re-run at activation recorded; reference sweep at archive: no live-tier mentions, no xref bridges lost; goals_lint clean
- code/tests landed in the preceding commits (auto_exec 0.1.1, ns 0.9.2, cmdhelp.test 45/45); punkshell 0.51.0
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
Acceptance met in full (evidence in the archived detail file's Progress): the named invocations punksys -e {puts hi} / punk902z script -e {puts hi} and the full matrix (piped and unpiped stdin, no-arg usage error on both surfaces, errorInfo + exit 1, argv0/argv, result echo, tclsh -e stock-parity boundary) verified by hand on the baked kits; scriptexec.test + launcherhelp.test 49/49 green. Index entry -> GOALS-archive.md, detail file -> goals/archive/ with Progress evidence and a (none) Follow-ons section; G-141/G-158 reference-sweep achieved markers; no xref bridges lost. goals_lint clean.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
Acceptance met in full (evidence in the archived detail file's Progress):
synthetic + e2e parser suites committed and green both runner modes and
both Tcl generations; full-suite parity PARITY ok in both modes;
src/tests/AGENTS.md relaxed to style guidance. Index entry ->
GOALS-archive.md, detail file -> goals/archive/ with Progress evidence
and three structured open Follow-ons (single-line banner anchoring,
glob-metachar closing-banner match, errorInfo/errorCode leading space).
Reference sweep: no pending-tense live-tier references existed;
goals_lint clean (83 active / 80 archived); goals_followons registers
the three open items; goals_xref reports no lost bridges.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-directed activation (proposed -> active, index + detail mirror).
Activation-freshness survey (goals_xref score G-161) recorded in the detail
file Notes: no related live goals - every overlap pair is unlinked with zero
path intersection (lexical noise only; interval-drafted G-163 unrelated).
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New goal (user-approved wording): punkshell exit paths on unix ttys restore
blocking on the shared tty file description and drain pending stdout/stderr
(bounded best-effort) before teardown - closing the tclIO behaviour where
stdin's non-blocking read windows make stdout non-blocking underneath,
'flush' silently no-ops once a background flush is scheduled, and TclInExit
discards EAGAIN'd buffers (measured 2026-08-03: 161/5000 lines survive exit
on a throttled WSL pty; ~498KB pending after a 'successful' flush). Guard
homes in punk::console, invoked after the G-038 eof-restart decision point;
acceptance includes complete delivery under a slow reader, bounded exit under
a dead reader, unchanged windows/piped behaviour, ARCHITECTURE.md exit-section
documentation, and a unix-pty-gated pin. Related: G-038, G-013, G-011, G-090
(+ archived G-036 lineage).
goals_lint clean; overlap survey recorded in Notes.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New goal (user-approved wording): 'make.tcl bakelist' gains per-kit payload/
runtime freshness verdicts answering "would a rebake change this kit?" without
baking - punkkit-stamp.toml schema 2 records content digests of each kit's
assembly inputs (payload vfs manifests via the assembler's existing per-entry
CRCs, runtime artifact digest, resolved mapvfs declaration, bake schema) and
bakelist compares them against the current tree. Verdicts degrade per kit to
'n/a (<reason>)' (pre-digest stamp, unreadable container, mk4 driver
unavailable) without aborting the listing; zip kits read pure-Tcl via
punk::zip, mk4 kits only where a metakit driver loads. Context records the
existing deployed column's real (narrower) role: deploy-hop integrity for the
locked-exe trap. Related: G-131, G-158, G-023, G-147, G-137.
goals_lint clean; overlap survey (goals_xref paths + score) recorded in Notes.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation survey re-run per the freshness rule: no goals drafted since
G-160's drafting commit; top overlap remains G-035 (already Related:).
G-108/G-090 next scores are lexical-only (debug/stack vocabulary), no
new Related: lines. Survey note recorded in the detail file.
Claude-Session: https://claude.ai/code/session_01TNn3C58Cpekt3CsZNLCqvR
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
goals/AGENTS.md: Follow-ons contract - ## Follow-ons section as the last
section of archived detail files, line grammar with closed disposition
vocabulary (open | goal G-<id> | landed YYYY-MM-DD (<where>) | declined
YYYY-MM-DD (<why>)), disposition-only updates sanctioned as the one edit
to archived files (same work unit that acts on the item), archive-flip
reference sweep gains step (c) emitting the section. GOALS.md: v4 front
matter + version entry, achieved-flip and acting-on-a-follow-on
maintenance rules, authoring-workflow disposition-flip duty.
GOALS-archive.md: frozen-file carve-out wording. goals_lint.tcl: grammar
findings (malformed column-0 Follow-on line, disposition naming a goal in
neither index) - fixture-verified both fire. New goals_followons.tcl:
advisory disposition report grouping open items first + vocabulary-
without-section flags; real-archive baseline 30 flagged files (retrofit
is the next change-set).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation survey re-run per the freshness rule: G-160/G-161 (drafted in
the interval) show no scope overlap; standing relationships unchanged
(Related: G-156). Survey note recorded in the detail file.
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Two user-approved proposed goals from the 2026-08-03 commandstack
characterisation arc (git 145e785c):
- G-160 commandstack hygiene pass: fix the suite-pinned defects (tokenid
stuck at 1 with duplicate-token dispatch bypass, unreachable
get_IMPLEMENTOR builtin branch, debug arg validation, stray bare puts,
Delete_stack live-rename recursion, packagepreference rename/renamer
guard key) and land the ergonomics items (did_rename record key appended,
-renamer placement errors, O(1) token dispatch, delegation helper,
Rename_stack/get_stack parking retrievability, known_renamers defaults
reconciliation). Acceptance keyed to the _GAP_ test flips; overlap survey
surfaced only G-035 (sibling surface on packagepreference, related-noted).
- G-161 tcltestrun failure parsing robust to multi-line test descriptions:
the parser currently misses multi-line opening banners, misreads the
closing banner as an opener and swallows all later events including the
summary line; goal makes it tolerant so the src/tests/AGENTS.md
single-line-description contract can stand down to style guidance.
Overlap survey: no intersecting live goals.
goals_lint: clean (84 active-index goals, 77 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The kit launch surface dogfoods punk::args. Boot core 0.2.1 -> 0.3.0:
new built-in 'help' subcommand + '-help' / '<subcommand> -help' render
tabled usage from the moduledoc::punkexe ids plus live registrations
(per-kit resolved_def clones (script)::punkexe.launcher/.launcherhelp);
unknown first arg naming no existing file (and no lib:* reference) is
refused with usage (stderr exit 1) instead of a silent script attempt;
buildinfo enforces its no-arguments contract through punk::args (pinned
one-liner + tabled usage, exit 2 unchanged). Registration extension
::punkboot::project_subcommand_info (summary/argsid/package/parse -
documented by moduledoc::punkboot 0.2.0): project subcommands appear in
help by registration alone and may opt arguments into declared parsing.
Carve-outs: tool-style kits keep help flags routed to their processor
(tomlish parity); tclsh intercepts a help flag only as sole argument
(stock dash parity); argsid-less registrations keep -help passthrough.
G-030 degradation doctrine: lazy guarded requires (normal boots never
load punk::args), PUNKBOOT_PLAIN=1 hook, plain-list fallback, rendering
degrades independently of parsing. 8.6 trap fixed en route: punk::args
choices-grid render needs punk::lib's lpop shim - guarded require added
(verified tabled help on metakit punk86).
moduledoc::punkexe 0.4.0: (script)::punkexe::help definition; top-level
refusal rule + help discovery; per-subcommand -help notes; buildinfo
rejection shape; passthrough-vs-parsed decision recorded.
Verified on zipfs (punk902z, punk91) and metakit (punk86) kits;
launcherhelp.test 22/22 (incl fake-thin-main registration harness +
metakit leg); punkexe subtree 140/136/4skip/0fail; full suite failures
(4) are pre-existing in untouched subsystems. Goal flipped achieved +
archive record + live-tier sweep (G-038 rewrite, pointers to G-077 and
G-089); detail-file move to goals/archive follows as a pure rename.
Layout _config trio + _vfscommon core seed hand-swept (byte-identical
to masters). GOALS.md staged as the G-032-removal hunk only - the
uncommitted G-159 draft entry is left to its author.
Claude-Session: https://claude.ai/code/session_01Y1diJnhjUxKgEG6EwYAzxj
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance fully met: per-defect dispositions recorded, module tarjar-free,
suite green (punk91 7/7, tclsh90 7/7, punk86 6/7 with the 8.6 zipfs
limitation recorded per G-034), 0.1.6 re-vendored with suite passing,
tarjar-artifact dispositions user-confirmed (all five keeps, none deleted).
Index entry moved to GOALS-archive.md; sweep updates pending-tense mentions
in G-029/G-109/G-157 and pushes actionable findings to G-034 (redirect =
zero-dep load path; 8.6 vfs::zip dll-load measured) and G-110 (8.6
copy-to-temp datapoint). Detail-file rename to goals/archive/ follows as a
pure-move commit.
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Tar-era connection API removed from modpod (connect/disconnect/get,
system::connect_if_not/myname/myfullname - broken since the tarjar era, no
callers anywhere); is_valid_tm_version fixed (versionparts substitution
error); make_mountable_zip debug output removed (the undeclared ansistring
dependency made -offsettype file error under the module's declared deps;
stray ::last_header global gone); struct::set dependency dropped; module
greps tarjar-free. The load stub gains the unwrapped #modpod-<pkg>-<ver>
redirect: an extracted folder beside the .tm is sourced directly - loads
with neither zipfs nor vfs::zip available.
Re-vendored 0.1.6 through the established channels (modpod checkout mint ->
vendormodules -> bootsupport -> modules staging -> vfscommon). First modpod
testsuite at src/tests/modules/modpod/testsuites/modpod/roundtrip.test:
wrap/load round-trips - real-disk + zipfs module paths, both -offsettype
forms, unwrapped redirect, probe-discovered binary payload (no committed
binaries). Green: punk91 tcl9.1 kit 7/7, native tclsh90 7/7, punk86 8.6.17
6/7 (zipfs-container test skips on 8.6 - recorded per G-034).
G-111 activated at user request (activation overlap survey recorded);
per-defect dispositions, run evidence and tarjar-artifact assessment
proposals in goals/G-111-modpod-tidy-tests.md - artifact dispositions
await user confirmation. GOALS.md G-111 Scope version reference repaired
to glob form per goals-system v3 drift rule.
Claude-Session: https://claude.ai/code/session_0156PuejSCGjgeGb7jiABrDU
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New proposed goal consuming G-101 follow-on items 1-3: punkshell 8.6
kits bake on the suite-built mk4 head via make.tcl (sdx ladder
suite-shell rung as a shared seam with G-157 step 4, bi-class head
variant, parity bakes for kit.punk86/kit.punkbi passing existing gates,
clean-path boot comparison vs tclkit-baked siblings, no new committed
binary, third-party-tclkit disposition record). Detail file carries the
2026-08-03 overlap survey (strongest: G-157; G-131/G-130/G-110/G-116/
G-137 related; libfetch/bin siblings judged not related) and the
drafting decisions approved at review.
GOALS.md staged hunk-scoped: the concurrent uncommitted G-111
activation + modpod re-vendor working state is left untouched for its
own commit.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Follow-on to G-004, extending the commit ban from executables to
opaque-container VFS artifacts (metakit/cookfs and similar non-zip
containers), executable-headed or not. Index entry + detail file with
overlap survey; tracked instances inventoried (bin/sdx.kit,
src/bin/sdx.kit, layout-shipped project-0.1 copy); goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Both goals flip achieved with full acceptance verification recorded in their
detail files (G-031: componentized boot proven on punkshell kits, a generated
project and tomlish; G-025: buildinfo stamp/report verified across kit,
renamed-copy, code-interp, tclsh-hosted and unstamped contexts). Detail files
move to goals/archive/ (pure renames; flip edits committed with the move);
index entries move GOALS.md -> GOALS-archive.md records. Reference sweep per
goals/AGENTS.md Archive rules: pending-tense mentions rewritten with archive
markers and actionable outcomes pushed to G-018, G-023, G-026, G-032
(registration model + buildinfo now concrete render sources), G-038 (piped
exitinfo quirk re-measured and recorded as its territory), G-089
(boot_state IS the packagemode hint surface), G-131 (mains collapsed - land
detection in the core), G-137 (stamp exists - reconcile RT_VERSION against
it). goals_lint clean (81 active, 75 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Scope adds src/vfs/README.md (boot-entry guidance), the punk::args moduledoc
home and the make.tcl collision gate. Goal/Acceptance now require:
project_main.tcl reborn as the commented thin-main sample, README boot-entry
sections (repo + project-0.1 layout via sync channels), a punk::args::moduledoc
package for the boot-core API shipped via _vfscommon, and per-kit bake refusal
when a source .vfs carries both a root main.tcl and a main.tcl fauxlink
(today silently traversal-order-dependent - merge_over fauxlink branch
overwrites unwarned). Approach/Alternatives/Notes record the 2026-08-02
evidence: project_main.tcl unmapped in mapvfs.toml (layout-template-only),
tomlish shared-_config + sample.vfs drop-in exhibits, moduledoc::punkexe
delivery precedent. Status remains proposed - activation is a separate flip.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
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
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
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
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
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
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