User-approved draft from the publication-session design exchanges:
embed a copy of the artifact record in the attached image (embed-then-
hash ordering; sidecar + sha1sums stay the integrity authority) with a
punk-runtime 'info' action for stray/renamed binaries (zip-central-
directory read preferred over executing the target), AND harden the
record as schema v1: schema, build_id (embedded+sidecar correlation
uuid), origin (canonical repo built FOR - the timing-safe reframe of
first-published-on; mirrors preserve it), packager (declarative;
minisign noted as the verification complement), project/project_url,
license summary, build_host_platform. Emitted records gain brief toml
'#' comments for non-obvious fields (line-based consumers ignore them
by construction). Lifecycle fields deliberately rejected as repo-level
curation. Next emission after landing = r2; published r1 immutable.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft giving the tcltls battery line a live goal home after
G-103's archive: backend choice (LibreSSL-portable vs no-asm OpenSSL) is
an in-goal decision, static link mirrors the tcllibc/tk shape, loopback
self-signed handshake + G-107 record-mode testsuite as verification, and
vendored prebuilt removal explicitly scoped OUT (recorded disposition
only - G-004-era work).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Final acceptance item closed by the punk9_beta/punk9bi_beta kit-wrap
trial (user go-ahead; quiet tree): make.tcl project wrapped both kits
over the family runtimes (the user's own earlier same-day build agreed -
punkcheck no-change), and probes UNDER each kit verified 9.0.5,
//zipfs:/app/tcl_library, PIPEREPL MACHINERY PRESENT, Thread 3.0.7
winning over the vfs payload's legacy thread3.0.1, vfs/tcllib/tcllibc
engaged, punk::args from the vfs side, and Tk create/destroy in both -
punk9bi_beta's Tk necessarily from the runtime's attached image
(punk9win_for_tkruntime.vfs carries none). Every acceptance clause is
now met; evidence recorded in the detail file.
Flip mechanics: Status achieved 2026-07-22; detail file to
goals/archive/ (content-identical move after edits); index entry to
GOALS-archive.md; reference sweep across 13 live goal files (archive
markers per the G-058 precedent - non-contract text only, Scope lines
untouched; pending-tense updates in G-099 arc-unblocked, G-108 family
production landed, G-018/G-023 naming-authority pointers). Forward
pointers pushed to live goals: G-101 (8.6-family deferral target),
G-067 (family -rN artifacts exist; publication user-gated with the
defaults.txt flip process).
Flagged (completion report): tcltls bi-battery line loses its goal home
with this archive - candidate goal on request; punk9wintk905.vfs legacy
thread3.0.1 payload cleanup can ride a future payload refresh; beta
promotion is the user's interactive trial per the *_beta convention.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the binary-policy framing discussion: per-.vfs
toml declarations materialize payload from suite build products, punkbin
artifact classes (consent-gated) and vendor trees, making kit payloads
buildable on a clean binary-free tree (G-004) - while the folder remains
the operative assembly area: declarations optional, undeclared drop-ins
preserved (permissive derived projects and gitignored test .vfs keep
drop-in simplicity). Context records the precedents (vendorlib_vfs.toml,
G-087 layout_materialize, vendored tomlish), the relationship to the
punkbin third-class question, and precedence design as the core work.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the platform-canon survey discussion: binary
modpod .tm are one-platform-per-file under per-platform TM ROOTS the boot
registers for the running platform only (punk::platform canon names).
Context records the motivating fat-tm evidence (oversized downloads;
same-version shadowing with no drop-in path), the subdirs-are-namespace-
components constraint forcing sibling roots, and the division of labour
with G-109 (manifest target-platform field stays there). Deliberately
dormant until binary-.tm distribution starts - no speculative structure.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Content-identical detail-file move; the flip's content edits (Status,
evidence, recipe) landed in the previous commit per the doc-restructure
move/edit separation rule. Index entry relocated with Scope verbatim and
the detail file's Acceptance per the archive record format.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Next in the user-confirmed sequence after G-097 (achieved 2026-07-21),
ahead of the 8.6 arc (G-099/G-100/G-101). Contract untouched - the
naming decision, piperepl default-on policy, tcltls battery line and
TIP-741 temp-dll characterization were already recorded in the detail
file while proposed.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved goal from the modpod characterization session. The modpod module
carries broken tar-era code (undefined tar::readHeader connect path,
::tarjar::connected reference, con/connected + versionpart typos, malformed
set/lindex constructs, debug stderr, unimplemented wrapped get) while the live
zip surface (make_zip_modpod + self-mount stub) has ZERO automated tests
anywhere - the detail file inventories both with line refs.
Preservation-aware by design: tarjar-system artifacts (vendored tarjar-2.4.3.tm
carrying the G-110 .TclSoCache prior art, the _build #tarjar tree, cli
#tarjar-* build branch, libunknown skip-globs) are assess-only with
per-item user-confirmed dispositions - old tarjar material at
c:/tclmodules/main (incl the intermediate tarpack generation) is preserved and
migrated manually by the user, outside this goal.
Acceptance: defects dispositioned + recorded, tarjar grep clean-or-deliberate,
testsuite (wrap -> require from disk + zipfs paths, binary payload, unwrapped
redirect, both -offsettype forms) passing on tcl9 kit + 8.6 (or recorded G-034
limitation), re-vendored into shellspy.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Two goals split out of the modpod/TIP-741 characterization work, user-approved.
G-109 (libunknown manifest-declared multi-name discovery): a zip-based .tm
declares case-variant and sub-package require names in a manifest at a
well-known internal location, discovered by libunknown at scan time - with
real-disk scan performance preserved (worst-case parity with plain tclsh's
builtin tm handler; libunknown exists to fix slow-drive/large-tree scan cost).
Multi-name .tm are punkshell-only (documented); TIP 590 lowercase single-name
stays the plain-tclsh happy path; extensive-tests bar recorded.
G-110 (extraction cache investigation): whether per-run fresh-temp-dir copies
are necessary or replaceable by a single per-user content-addressed cache
(hash-keyed parent dir). Carries the 2026-07-21 sniff evidence: concurrent
sharing of one copy works; classic Win32 delete refused while mapped; POSIX-
semantics delete succeeds with mappings unharmed (a third option next to TIPs
741/709: unlink-after-load on modern NTFS). Fallback requirement recorded:
punkshell wants a win32/old-Windows fallback (industrial systems on isolated
VMs/old hardware) - capability-probe, classic-safe GC degradation. Precedents
(.NET single-file, critcl cache), sibling-dll sets, AV interplay, and the
cheapest-first implementation surfaces (modpod stub -> suite core patch ->
upstream) recorded.
G-066 note pointed at the new goals.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
All six acceptance clauses satisfied (suite tclsh90s.exe 9.0.5, zig 0.16.0,
machine superbee): thread 143/0 + tclvfs 51/7 GATED with tracked dispositioned
baselines, deterministic across consecutive full runs; tcllib 62328/54 WITH
tcllibc accelerators engaged + tklib 796/18 RECORDED with artifact paths in the
detail file; tk opt-in step with a recorded first census (9865/27, native-
dialog files excluded by default); per-library policy/testargs/notfiles
overridable at invocation; no-totals fails the step in gate AND record mode
(verified); evidence-summary shape documented for the G-103 metadata consumer.
Flips G-107 active -> achieved and archives it (index entry to GOALS-archive.md,
detail file to goals/archive/). Reference sweep: G-103 Notes gain the thread-
payload-refresh forward-pointer (the suite now derives thread naming from the
checkout; the punk905 kit payload still carries the old 3.0.1 copy) and the
evidence-summary-shape pointer; G-108 Notes record that its constrained-test
runs reuse G-107's test_gate generalization + -notfiles knob.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Index entry + detail file for a debug tier of suite_tcl90: build debug-flavoured
runtimes (NDEBUG off / tcl::test compiled in; deeper tier adds TCL_MEM_DEBUG for
the script-level memory command), named with a trailing -dbg<n> suffix, and run
the core suite's normally skipped C-test-command-constrained tests in record
mode (never gated). Kit-family debug members coordinate with G-103; the
TCL_MEM_DEBUG all-or-nothing linking constraint drives the feasibility item.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New goal from the 2026-07-21 discussion: the libraries the buildsuites compile
and ship (thread, tclvfs, tcllib+tcllibc, tklib, tk) get their own testsuites
run under the suite-built shell as named recipe steps with per-library policy -
gate (core test-gate mechanism, dispositioned baselines), record (report
artifacts under out/testreports/), or opt-in (tk). Context carries the source
survey, test_gate.tcl generalization notes, G-102 cost knowns, and the G-103
metadata / 8.6-arc relationships.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Layout fold ("fold stale layout fixes into this"): both layout stores
(src/project_layouts/vendor/punk/project-0.1/bin and the modpod-templates
equivalent) had shipped a stale 2025-era runtime.cmd and a pre-G-096
getzig.cmd - the getzig rename had missed this channel entirely, so
generated projects still received old-named, stale utilities. Both renamed
via git mv AND refreshed to byte-copies of the current bin/punk-runtime.cmd
+ bin/punk-getzig.cmd; the layout src/runtime/Readme.md references updated
in both stores (the layout bin/runtime/ data-dir READMEs are gitignored -
updated on disk only, like the root bin/runtime/README.md); residual
old-name scan of the layout trees clean. The built modpod zips (root
modules/ + bootsupport templates-0.2.0.tm) carry old names until their
normal re-vendor cycles. Layout paths join the goal Scope per the approved
fold.
Flip mechanics: detail file to goals/archive with Status achieved
2026-07-21 (verification in its Progress section: full rename sweep, pins
retargeted and passing 26/25/1/0, drift findings recorded), GOALS.md entry
removed, GOALS-archive record appended (amended Scope + Acceptance
verbatim), reference sweep: G-103 scope parenthetical (both tiers) +
Relationships and the G-099/G-103 sequencing notes annotated with the
achievement; G-096's archive gains a note recording the layout-channel gap
and its closure. goals_lint clean (75 active-index goals, 31 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
First of the confirmed sequence G-097 -> G-103 -> 8.6 arc: the bits/runtime/
tclargs scriptsets and selfsign experiment scripts take the punk- prefix per
the bin/AGENTS.md policy, ahead of G-103 extending the runtime scriptset.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance verified in full (evidence in the detail file's Progress
section): concurrency suite green on Windows Tcl 9.0.3 (runtests) and
Tcl 8.6.17 (direct tcltest drive) plus a linux WSL tclsh 8.6.14 run
from a native-filesystem staging - two-writer no-corruption/no-loss
with a clean polling reader, lock timeout naming the holder, dead-pid
and age stale-breaks, non-interactive duplicate-INSTALLER recovery.
Real builds under the re-vendored 0.6.0 run with zero lock timeouts,
zero tripwire warnings and unchanged decisions.
Index entry moved to GOALS-archive.md; reference sweep: G-027's
punkcheck note updated to achieved tense, G-028 gains the
advisory-lock name-the-blocker precedent pointer. Detail file moves to
goals/archive/ in the adjacent commit (pure rename).
punkproject.toml 0.17.3 + CHANGELOG entry.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance evidence recorded in the archived detail file: PATH-scrubbed
clean-clone demonstration (c:/T/g102, env probed tclsh/fossil/git-free) ran
'zig build bootstrap' end-to-end - zon-pinned sources materialized, runtime +
piperepl variants built, smokes green (static/zip shells, Tk tooltip, tcllib,
tcllibc accelerators via critcl+zig cc), demo shell's tcl::build-info identical
to the fossil-flow build; scrubbed test gate 69552/56075/13468/9 with 8
baselined + fCmd-30.3 proven a SystemDrive scrub artifact (single-file rerun
with the var: GATE PASS), matching the same-day fossil-flow delegated gate
(69552/56040/13503/9 GATE PASS). Environment findings (critcl target probing,
windows Run-step stdio, testsuite base-env needs, firewall consent on first
socket listen) recorded in the detail file for future suite work.
Flip mechanics: detail file to goals/archive with Status achieved 2026-07-21,
GOALS.md entry removed, GOALS-archive record appended (Scope+Acceptance
verbatim), pending-tense G-102 references in G-099/G-103/G-104/G-105 annotated
with the achievement and the settled driver shape. goals_lint clean (77
active-index goals, 29 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Follows straight from G-094's landing: the single save chokepoint
(installtrack save_working_recordset) is in place and the G-094
verification itself logged a transient concurrent-save failure with a
second session active in this checkout - the exact exposure this goal
closes.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Acceptance verified in full (evidence in the detail file's Progress
section): characterization suites pass with one recorded pin flip,
lifecycle.test pins batch/OO field equivalence (-targets_cksums incl)
and o_record_list coherence across sequential events, the retired-trio
grep is clean, and a full make.tcl build completes with skip/copy
decisions unchanged against pre-refactor .punkcheck state.
Index entry moved to GOALS-archive.md; reference sweep: G-095 notes gain
the chokepoint-achieved pointer, the transient concurrent-save evidence
observed during verification, and the inherited MAX_PATH rider pointer
(G-087/G-094, unaddressed); G-027's punkcheck note updated to achieved
tense. Detail file moves to goals/archive/ in the adjacent commit (pure
rename per the doc-restructure rules).
punkproject.toml 0.17.2 + CHANGELOG entry (punkcheck ships in kits; the
in-shell punkcheck API surface changed with the retirement).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-102 continues in a parallel session; this session takes the punkcheck
arc. G-094 is the unification prerequisite for G-095 (concurrent-writer
safety): one lifecycle implementation with an explicit eager/deferred
persistence policy and a single save chokepoint.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Sequencing per the recorded plan: suite_tcl90 arc closed (G-096/G-098
achieved, punk905 promoted 2026-07-21), so the driver-shape work starts
now, ahead of the 8.6 arc (G-099 born onto the chosen shape).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
All acceptance items met and recorded in the goal file: clean-checkout +
punk-getzig-pinned-zig build PASS (shallow-path/longpaths MAX_PATH caveat
recorded; c:/T available as a shallow test base per user), recovered +
rebased piperepl patch set with the G-103 opt-out gate policy and full
behaviour matrix (automated rows + user interactive verification),
tclsh90spr/tclsh90sprzip products, per-version punk-getzig into versioned
dirs (all four paths verified), both-VCS tracking + samplesuite1/
vendorbuild reconciliation, bin/AGENTS.md naming policy + punk-getzig
rename. Flipped to achieved 2026-07-20 and archived; GOALS/GOALS-archive
updated; achieved markers added to the six referencing goals flagged by
the lint reference sweep (G-097, G-100, G-102, G-103, G-104, G-106).
goals_lint clean (79 active, 27 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User verified tclsh90spr 2026-07-20: interactive sessions normal with and
without TCLSH_PIPEREPL=0 (closes the G-096 matrix's residual user-level
check), and basic punk features work on the bare pr shell via repo tm
paths (raw mode twapi-reliant). Via './tclsh90spr src/make.tcl shell' the
powershell console-mode fallback engaged and raw mode worked - modulo
consolemode_server_async.ps1 noise and an early server shutdown.
New G-106 captures the requested direction: maintain the fallback as a
dependable raw-mode path for twapi-less runtimes (suite shells/kits),
hardening the known weak points recorded at creation - argv0-derived
pstooldir resolution (works for make.tcl shell by construction, little
else; kits need G-089 scriptlib delivery), server early-shutdown +
startup noise, and the unmarked experiment variants beside the canonical
script in scriptlib/utils/pwsh. Priority rises if G-103's zig-built twapi
investigation proves impractical - cross-noted there.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User decision 2026-07-20: other build systems/distributions already
provide completely-plain tclsh executables - not a punkshell product role.
G-103's 'plain' family member (no piperepl patch, batteries attached) is
plain enough for our purposes; the truly bare bootstrap-intermediate
tclsh (tclsh90szip-class, which already satisfies G-018's substance:
stock invocations, no punk namespaces, self-contained) remains readily
accessible as an ordinary suite build product under _build/<suite>/out
but is deliberately not showcased or published.
G-018 closing note records all of this; G-103 gains the plain-niche
boundary paragraph (scope's subsumption-review item resolved and
removed, GOALS.md mirror updated); G-102's relationship line updated.
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User requirements batch 2026-07-20 integrated:
- G-103 runtime kit family: buildsuites produce self-contained kits whose
info library and batteries live in the initially attached zip - PLAIN
tclsh kit (Thread + tclvfs/vfs::* + tcllib/tcllibc), PUNK kit (piperepl
applied, ENABLED BY DEFAULT with env opt-out - gating review agreed; the
plain kit serves stock semantics), BI kits adding libraries we build (Tk
now; sqlite3/tdom easy/moderate futures; twapi flagged needs-investigation
under the zig-only policy). tcllib+tcllibc in all members (user lean,
agreed). Artifact metadata in punkbin (+compatible repos) surfaced by the
runtime scriptset list/use. G-018 flagged as substantially subsumed. 8.6
variant deferred through G-101 (static-vfs/metakit questions noted there).
- G-104 make.tcl buildsuite surface: list / info <suite> / build <suite>
with suites SELF-describing (info contract survives the G-102 driver
migration; copied trees appear automatically). mapvfs single-kit/list
wishes noted as sibling ergonomics.
- G-105 cross-target builds: -target as an invocation dimension (suite
folders stay version-named), linux x86_64 first verified via local WSL
with its own test baseline; zig tier findings VERIFIED and recorded -
the freebsd asymmetry suspicion is inverted (freebsd AS TARGET was the
gap, closed in zig 0.16 for FreeBSD 14+ with CI-tested x86_64/aarch64;
building FROM freebsd was already fine); macOS-as-target (SDK/frameworks)
recorded as the hard case; fully-static-musl dlopen limitation drives a
dynamic first linux target.
Cross-edits: G-096 piperepl matrix gains the kit-default policy update
(punk kits opt-out not opt-in); G-101 records the 8.6 kit-family
dependency; G-102 notes the family/target/surface as build-graph products.
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Direction agreed 2026-07-20: the whole buildsuite pipeline becomes
drivable with only the pinned zig toolchain present. Pre-tclsh phases
(fetch, configure-product generation, compile) move into the zig build
layer with sources in a content-hashed zon-shaped manifest (fossil
sources pin as per-checkin tarballs - '-refresh' becomes 'bump the pin';
fossil-checkout flow retained as the dev alternative); post-tclsh phases
(tcllib/tklib installers, critcl, parsed-totals test gate) stay Tcl
scripts run by the FRESHLY BUILT suite tclsh as build steps. Acceptance
includes a PATH-scrubbed no-tclsh end-to-end demonstration, preservation
of the copy-and-tweak retargeting property, and the recorded rejection of
a bash+powershell polyglot for this layer (polyglot craft remains the
acquisition layer's mechanism - punk-getzig/getpunk first contact).
Cross-references: G-096 direction note marked RESOLVED -> G-102 (its
remaining items close on the current suite.tcl shape regardless); G-099
sequencing now weighs birthing suite_tcl86 onto the chosen driver shape.
goals_lint clean (76 active, 26 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
G-098 (suite_tcl90 Tk+tklib, tcllib/tcllibc via critcl, test gating)
flipped to achieved 2026-07-20 and archived - all acceptance items
recorded in the goal file across increments 1-7 (Tk 9.0.2 + tklib,
tcllib+tcllibc ~248x hashing speedup, parsed-totals test gate with
dispositioned baseline, full punkshell runtests parity with the Tcl903
baseline including Tk suites unskipped, kit-hosted runs fixed).
New proposed goals mirror the arc for fossil core-8-6-branch (8.6 stays
punkshell's real Tcl 8 target; current punk86-class kits ride prebuilt
third-party tclkits - a provenance gap):
- G-099: suite_tcl86 core - zig-only 8.6 runtime + thread 2.8-branch +
tclvfs + parsed-totals core-test gate with its own dispositioned
baseline. Records expected differences (no zipfs, entry-point/bundled
lib divergences, no tcl::process).
- G-100: Tk 8.6 + tklib + tcllib/tcllibc via critcl on the 8.6 runtime +
punkshell runtests census against a native 8.6 kit baseline.
- G-101: kit container strategy without zipfs (metakit/tclkit lineage vs
cookfs vs zipvfs boot; TEMP_REFERENCE/metakit + KitCreator guidance) -
separated so the well-understood ports stay incrementally landable.
Sequencing recorded in each goal: recommendation is to close G-096's
remainder and run the punk905_beta trial to promotion before activating
the 8.6 arc, so shared suite scaffolding settles before it is forked.
goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Per user direction and draft refinements 2026-07-20: matching tklib alongside
Tk (pure-tcl, own installer.tcl where it does more than straight copy);
tcllib installed via its installer machinery (installer.tcl/sak.tcl checked
for non-copy behaviour) with critcl-built tcllibc driving zig cc; the
totals-parsing test gate owns the 72-failure triage. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Blanket /src/buildsuites ignores removed from .gitignore and
.fossil-settings/ignore-glob; retired /vendorbuilds/ ignores removed with
them. src/buildsuites/_build remains ignored via the existing _build globs.
samplesuite1 sketch marked as such, buildprefix moved to the _build
convention (vendorbuild concept retired per user decision 2026-07-20).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Sweep: G-096 detail and the punk::lib gate comment now point at the archived
path with achieved phrasing. goals_lint clean (72 active, 25 archived).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Content-identical rename (flip edits landed in the previous commit); GOALS.md
entry removed and the summary record (amended *** acceptance) appended to
GOALS-archive.md per the achieved flip workflow. Rides along: CHANGELOG.md
gains the required [0.17.1] entry matching the punkproject.toml bump from the
previous commit (punk::path 0.4.0 *** pathglob + separable lattice; runtests
targeting rework).
Claude-Session: https://claude.ai/code/session_01BNUVVkYq9vHa6G3S9a3XTZ
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Root cause (recorded in the goal file): punk::path::treefilenames matches
-include-paths against the DIRECTORY containing files, and its documented
X/** boundary semantics exclude files directly in X - so suites keeping
.test files at the subtree root (scriptwrap, binscripts, punkexe) were
silently missed by X/** targeting: the G-092 four-pattern (2/13 files) and
repeated-flag (zero files) failures. punk::args -multiple accumulation
probed healthy - repeated flags and a single space-separated value reach
discovery identically; no punk change was needed or made.
runtests.tcl now filters the tailbase-relative FILE paths after an
unrestricted walk (new testsupport/discovery.tcl: globmatchpath,
any-include-match, exclusion wins): X/** includes files directly in X, an
exact relative path targets a single file, a bare directory path matches
nothing (append /**). -exclude-paths exposed (same syntax and accumulation,
exclusion wins over inclusion). -discover-only prints the discovered list
plus a RUNTESTS_FILES tcl-list line and exits before any run machinery -
subsecond via a two-stage boot (discovery phase loads only punk::args +
punk::path; punk/Thread/shellrun/punk::tcltestrun and the testinterp/child
path assembly load after the exit).
New regression suite runner/testsuites/discovery/pathdiscovery.test
(23 tests: pure filter, fixture-tree walk+filter, end-to-end -discover-only
children including both G-092 characterization forms; ~7s wall,
parallel-safe). src/tests/AGENTS.md targeting wording reconciled; new
src/tests/runner/AGENTS.md. G-093 index status proposed -> active
(user-directed).
Verification (native tclsh 9.0.3, piped Bash context): pre-change baseline
default -jobs 16 (93 files / 1010 tests / failed=1 exec-14.3 only) vs
post-change -jobs 16 with -exclude-paths runner/**: PARITY ok; post-change
default run differs from baseline only by the added suite (+23 passing);
mode parity -jobs 16 vs singleproc sequential: PARITY ok (94/1033/1).
Claude-Session: https://claude.ai/code/session_01BNUVVkYq9vHa6G3S9a3XTZ
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Content-identical rename (edits landed in the previous commit); GOALS.md entry
removed and the summary record appended to GOALS-archive.md per the achieved
flip workflow.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Outcomes of the 2026-07-19 punkcheck module review:
- G-094 [proposed]: single OO record lifecycle - installtrack/installevent
becomes the sole implementation with an eager|deferred persistence policy,
punkcheck::install rebuilt as an OO consumer in deferred mode, the
zero-caller installfile_begin/finished/skipped trio retired to shims, and
the o_record_list staleness fixed. The single save chokepoint is G-095's
attachment point.
- G-095 [proposed]: concurrent-writer safety - atomic temp+rename saves,
advisory EXCL lockfile serializing whole installer events per punkcheck
root, merge-on-flush for deferred mode, non-interactive-safe
duplicate-INSTALLER recovery. SQLite recorded as rejected for now (TDL
human readability/debugability overriding; three-part reconsideration bar).
- G-027: acceptance reframed - .punkcheck records demoted from sole
provenance basis to acceleration layer; safe-overwrite classification
survives record loss via a committed baseline record (origin identity +
pulled version, pristine content re-derivable from the origin's VCS),
degrading conservatively (report/confirm - never silent overwrite, never a
wedged pull). Approach classification bullet extended to match.
- G-095 notes carry the tiered expendability taxonomy (build trees: recopies
only; synced-targets bin/ deploy: non-self-healing skip wedge; derived
projects: G-027 baseline) and the cross-tier invariant: absent records
degrade to skip/confirm, never to overwrite.
- (The G-087 cross-pointer to G-094/G-095 already landed with the stage-3
sources commit.)
goals_lint clean (73 active-index goals, 22 archived).
Claude-Session: https://claude.ai/code/session_01L7MfuYBfYpUFpVafo5JowC
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Title broadened in both tiers; Goal/Acceptance gain the -exclude-paths
clauses: expose treefilenames' existing capability on runtests (or an
equivalent post-discovery globmatchpath filter), accumulate semantics
matching -include-paths, exclusion winning over inclusion, a
subtree-exclusion run discovering exactly default-discovery minus that
subtree, and both options pinned by the same regression-suite
combination matrix. Notes record the bundling and the middle-ground
motivation examples.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-directed from the G-092 measurement findings: a single
-include-paths value with four deep patterns matched only one subtree,
and repeated -include-paths flags matched zero files, both under the
default *.test tail glob - contradicting the documented accumulate
semantics. Context records the full repro matrix (multi-pattern forms
with explicit tails worked; standalone globmatchpath matched the same
patterns, implicating the treefilenames walk/prune or option-value
shape), the candidate root causes, and the tail-glob workaround. Notes
record that treefilenames already implements -exclude-paths unexposed
by runtests - the planned middle-ground option should be pinned by the
same regression suite.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
multishell.test (10 tests, ~105s solo child - the -jobs floor) split five
ways along shared-fixture boundaries, every test moved verbatim with its
provenance lines: multishell.test keeps wrap + structure/LF-only + exec
smoke (incl WSL); multishell_wrapverify.test (fresh-wrap checkfile) and
multishell_wrapdeterminism.test (byte-identical re-wrap) each re-pay the
wrap fixture; runtimecmd_checkfile.test and runtimecmd_roundtrip.test
guard the committed bin/runtime.cmd and its source round-trip with no
wrap fixture at all. argparsingtest.test (17 tests, ~32s) split into
timeit/discover/contract/first_call (11) + argparsingtest_compare.test
(compare_*, 6). Assessed and left unsplit: dtplite.test (24.6s solo),
scriptexec.test (12s); exec.test excluded as imported core material.
File headers point at the src/tests/modules/AGENTS.md punk/mix bullet
for the sibling map; the runtests longest-first weight table carries
measured post-split weights.
runtests_parity.tcl gains a -names mode: multiset comparison of
'- testname:' lines from '-report markdown -show-passes 1' captures,
file attribution ignored - verbatim moves compare identical, lost/
duplicated/renamed tests are reported.
Verified (native tclsh 9.0.3): repeated -jobs 8 full-suite runs 1m26.3s
/ 1m26.8s (was 2m16s at G-091, ~5m40s sequential - 4.07x vs the
pre-parallel baseline, 36.6% vs the G-091 reference); slowest child
30.7s / 31.3s (bound 45s); NAMES identical (989 occurrences) vs the
pre-split sequential capture; tallies identical in every run (989/973/
15/1, exec-14.3 sole failure, files 87 -> 92); PARITY ok -jobs 8 vs
-jobs 1 and between repeats; repo clean after runs. Notable finding
recorded in the goal file: child-wall contention inflation (~45% with
50s+ dominant children present) collapsed to ~15% once the work
distribution was flattened - splitting reduced both the critical path
and the contention itself.
G-092 flipped to achieved 2026-07-19 and archived (GOALS-archive.md
record, detail file with full verification evidence to goals/archive/).
goals_lint clean. Also noted in the goal file, out of scope: runtests
-include-paths multi-pattern/repeated-flag matching misbehaved during
measurement (single value with four deep patterns matched one; repeated
flags matched zero) - contradicts documented semantics, needs its own
investigation.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the G-091 verification data: multishell.test's
~2m child wall is the -jobs floor (full-suite -jobs 8 = 2m16s); splitting
the long suites (multishell, dtplite, argparsingtest, scriptexec if
worthwhile; exec.test excluded as imported core material) along
shared-fixture boundaries targets no child wall above 45s and at least a
25% full-suite improvement, with name-level test conservation, provenance
lines travelling with moved tests, weight-table updates, and parity
gating. Context records the fixture-duplication tradeoff (total CPU up,
wall down) and the complementary lean-children candidate.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
-jobs N (implies -singleproc 0; explicit -singleproc 1 conflicts) runs
test files through a tpool of N concurrent child processes with
per-child capture files and tcltest -tmpdir subdirs, longest-first
static-weight submission, and a -serial-paths serial tail (default: the
console-state suites modules/punk/console/** + modules/opunk/console/**;
piped-child-driven suites proved parallel-safe and each serial file
costs its full child boot strictly after the parallel phase). Cached
results feed the unchanged processing loop in discovery order, so
reports are identical in shape and order to sequential runs. Watch mode
emits file-collected events (completion order, output relayed there);
file-end (tallies) stays discovery-order. The runner now reports jobs
phase times and the ten slowest child WALL times (child wall includes
boot + file-level fixture cost that per-test usec misses).
Two Tcl-core-level behaviours found and worked around in the child
spawn (see the verification record in the archived goal file):
- concurrent BLOCKING execs from worker threads convoy on Windows (all
return at the longest concurrent child's exit; plain sleepers 2-12s
from 8 workers all walled at 12.0s) -> spawn via 'exec ... &' and
poll per-pid tcl::process status; blocking fallback retained for
runtimes without tcl::process (tcl 8.6).
- Tcl_ReapDetachedProcs runs on every exec and purges finished
background children process-wide, racing the poll (nondeterministic
'key <pid> not known in dictionary') -> tcl::process autopurge false
+ explicit per-pid purge after the status read.
Verified on native tclsh 9.0.3: repeated -jobs 8 full-suite runs
2m16.2s / 2m15.6s with PARITY ok vs -jobs 1, between repeats, and vs
the pre-parallel baseline (987-test identity, exec-14.3 sole expected
failure); 2.58x vs the ~350s sequential baseline (2.41x vs one
cooler-machine 5m28.8s sequential run - recorded in the goal file);
repo clean after every run.
G-091 flipped to achieved 2026-07-19 and archived (entry to
GOALS-archive.md, detail file to goals/archive/ with the verification
record; reference sweep updated runtests.tcl comments and the
src/tests/AGENTS.md marker). goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Both user-approved 2026-07-18 from the runx -teelog / runtests watch-mode
work (a65f9e5b) and the -singleproc 0 completion (218fbb1c).
G-090 records the probe evidence deliberately not addressed in that work:
float-placement starvation of a tee under the float-locked capture
junction, insert_transform re-instantiation churn, parked-worker adoption
never re-applying settings (silent cross-target log misrouting), the
per-file teehandle worker-thread leak in unwatched singleproc runs, and
the tcludp Tcl 9 receive-fileevent first-datagram-only behaviour.
G-091 is the phase-2 parallel test plan over the phase-1 child spawn:
tpool -jobs N, per-child tmpdirs, serial group for console-sensitive
suites, parity + >=2.5x acceptance (floor ~90s, multishell.test bound).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New goal (user-approved wording): make.tcl bakes a curated scriptlib into
kit vfs app/scriptlib so standalone binaries have working lib: scripts, with
precedence following the packagemode mental model - kit-internal-wins only
for the default 'internal' launch, src/dev modes putting the live project
scriptlib first, and proj: (G-033) adding the visited project's scriptlib.
Context records the 2026-07-18 findings: kit-internal resolver branch never
exercised (no build path exists), not-overridable policy scoped to default
mode per user direction, missing boot->runtime packagemode hint, cookfs
mount-root gap, and the out-of-scope app-shellspy mapping. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Goal for embedding a short marker in the usage/error table's bottom frame edge
(bottom-right @examples indicator, counterpart of the top 'Usage' title). Two
severable deliverables: frame-parity -subtitle/-subtitlealign on
textblock::class::table (must work with or without footer rows), and footer
rows with column spans independent of the body via configure_footer mirroring
the header API (the -show_footer/-ansibase_footer/-ansiborder_footer styling
knobs already exist but no footer-row methods do). arg_error's interim
'Example:' header row retires when this lands.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
New goal from the 2026-07-16 layout-system review: thin layouts with
generation-time infrastructure injection, fauxlink layout refs, and a working
overlay merge primitive. Detail file carries the review findings (unimplemented
merge, dead module-pathtype refs, stale fat snapshots, latent bugs), the staged
approach (hygiene first), and the hygiene-stage completion record.
Activated at user direction 2026-07-17.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
The punk9win.vfs kit was split into punk9wintk90b2.vfs and
punk9wintk903.vfs; the treectrl/Img/twapi/cffi payloads G-020 relies on
live in punk9wintk903.vfs/lib_tcl9 (the actively mapped tclsfe/punk91
kit). Path-only update, user-approved; goal contract otherwise
unchanged. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved from the serversecretsync tm-path-shadowing incident
(8.6 require-before-path-setup silently selected a stale tomlish from the
machine-default tm paths over the project's vendored copy). Default
mechanism per user: vendor punk::libunknown + punk::packagepreference as
the light layout's bootstrap minimum. Related: G-012/G-027/G-029/G-035.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved wording (drafted from the 2026-07-14 cmdtrace investigation):
an attribution option (live|sourcefile|auto - sourcefile mode doubling as a
practical workaround for the upstream nested-switch mis-attribution, tcl
tktview 5d5b1052280c976ea3d4) and a documented machine dict return for
future hotspot-analysis/repl consumers (implies no interactive pause).
Context records the unexplored regime boundary (module .tm procs trace
relative, plain sourced procs absolute) as goal groundwork. goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
A word rejected by an OPTIONAL argument's allocation screen (G-071
restricted-choice screen, or the basic int/double/bool/number/dict type
screen) that subsequently overflows the argument list now reports the
specific rejection instead of "Received more values than can be assigned":
- choiceviolation naming the word and allowed choices, with -badarg/-badval
and the final-validation message template (Leading/Trailing argument
attribution), for choice-screen rejections
- typemismatch naming the declared (normalized) type, with -badarg/-badval,
for basic-type screen rejections
Mechanism: private::get_dict_can_assign_value returns a 'rejection' record
(single-member clauses only; literal-category mismatches deliberately not
recorded); get_dict_form collects first-rejection-per-word from the three
allocation call sites (leader/value split trial, leaders loop, values loop)
into a per-form store; the two toomanyarguments raise sites prefer a
recorded rejection for the unassignable word. Genuinely-surplus words still
report toomanyarguments; words consumed by later slots parse unchanged;
multiform selection (rank_form_failures) untouched.
errorselection.test _GAP pins flipped to the pointed expectations (pre-fix
behaviour pinned in the previous commit). punk::args buildversion
0.12.0 -> 0.12.1.
Closeout: G-082 flipped achieved + archived (index -> GOALS-archive.md,
detail -> goals/archive/ with mechanism/verification/residue recorded);
G-073 note updated to point at the new rejection-record seam;
src/modules/AGENTS.md authoring-ergonomics bullet re-documented (-optional 0
workaround no longer needed on >= 0.12.1; make.tcl keeps it - it runs
against the bootsupport 0.12.0 snapshot). Project version 0.12.28 +
CHANGELOG.
Verified: full punk/args suite 228/224/0-failed (4 intended skips) and
punk/ns 57/57 under Tcl 9.0.3; errorselection.test 7/7 under Tcl 8.7;
make.tcl frobnicate still pointed; goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com