Tree:
176f2ad702
master
v0.1a
${ noResults }
275 Commits (176f2ad70296b98a7aed6c514b1fcc73cfb82611)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
12f9f16097 |
G-045 increment 2: punk 0.2.4 - i help renders aligned via -unindentedfields (project 0.12.5)
::punk::helptopic::define_docs now authors its help text at the left
margin and declares -unindentedfields {-help} on the generated @cmd line
(honoured as of punk::args 0.6.1, increment 1) and on the topic argument
line (a gate that existed all along but was never applied here).
Previously: the @cmd -help braced literal carried ~16 spaces of source
indent into the constructed definition (constructed defs get no
whole-block normalization, pinned P4 characterization), so the
Description block rendered continuations +12 right of the first line;
the \n-relative topic -help rendered its first line +4 (the injected
display prefix). Both blocks now render flush. Help text content
unchanged (manual ~70-col folding retained).
Verified in punk902z src (arg_error render + i help end-to-end);
punk::ns suite 53/53; make.tcl modules builds clean. Planning note
recorded in the goal detail file: the constructed-def normalization
increment picks its consumer proof (define_docs re-conversion vs
ensemble_subcommands_definition) when it lands.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
bb9ff66f51 |
G-045 increment 1: punk::args 0.6.1 - @cmd honours -unindentedfields for -help (project 0.12.4)
arg_error's cmd-help display transform (undent " "+help, max 4 - the '#unindentedfields ?' todo site) is now gated by "-help" membership in the @cmd line's -unindentedfields list, mirroring the existing per-argument gate. The single transform site feeds both the table and string renderers, so left-margin-authored @cmd help renders its first line flush with continuations in both. @cmd -summary carries no indent transform in any renderer, so -unindentedfields for -summary is vacuously honoured. No in-tree definitions set -unindentedfields on @cmd - existing rendering is unchanged. define doc for -unindentedfields now states where the option is valid. Tests: rendering_unindentedfields_cmd_help_GAP flipped to rendering_unindentedfields_cmd_help (aligned expectation, both renderers measured). Full punk::args suite 175 pass / 1 pre-existing skip / 0 fail; punk::ns suite 53/53 (arg_error consumer); make.tcl modules builds clean (tclsh 9.0.3). Also: G-045 flipped proposed -> active (user direction 2026-07-12); progress and remaining-work recorded in the detail file. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
bac122da9f |
G-039 achieved: punk::repl 0.5.0 dead-console watchdog stops orphaned-shell CPU spin (project 0.12.2)
An interactive shell orphaned by its hosting console dying (killed conhost/terminal) previously spun ~2 cores forever: the Tcl 9 windows console driver never delivers the dead-console state to the script as a fileevent (tclWinConsole.c ConsoleEventProc only notifies on buffered data) while its reader thread busy-loops on the persistent channel error, so the script level is completely blind and nothing ever closes the channel. Fix: repl::console_watchdog - a self-rescheduling liveness poll (default 5s, repl::console_watchdog_ms; read-only GetConsoleMode probe via chan configure -inputmode) armed by repl::start only for a tcl9 console input channel serving the process-default console on windows. On probe failure it closes the input channel (stopping the driver's reader thread) and finishes the repl via the normal eof done-path; app-punkshell then finds no console reopenable and exits cleanly. Piped, foreign-console and tcl 8.6 inputs never arm it. repl::start's post-vwait reader deregistration now tolerates a watchdog-closed channel. Verification (2026-07-12): kill procedure post-fix exits the orphan in 1.5-2.0s with no traceback (src mode and rebuilt kits punkbi/punk91/ punk902z); 25s live-console soak shows no spurious trigger, CPU delta 0; piped stdin unaffected; repl consolebackends 3/3 and punk::console suites 88 pass / 1 skip; root cause verified against plain tclsh 9.0.3. Upstream ticket filed: https://core.tcl-lang.org/tcl/tktview/f10d91c2d3 Included: - goals: G-039 flipped achieved 2026-07-12 and archived (index entry to GOALS-archive.md, detail file to goals/archive/ with full root-cause, repro and verification record); reference sweep adds the eof done-value producer note to G-038 - src/modules/punk/AGENTS.md: watchdog contract documented - project version 0.12.1 -> 0.12.2 + CHANGELOG entry - vfs payload sync: _vfscommon.vfs punk/repl 0.4.0 -> 0.5.0 Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
fde2f77be3 |
goals: vendoring goal cluster G-065..G-068; G-063 license verification provenance
New goals (user-approved drafts, all proposed) covering the declarative vendoring direction: - G-065 declarative vendoring: toml-declared external packages with version/commit pinning, retrieval provenance, binary-scan gating with punkproject.toml override; manual drop-ins stay supported (surfaced as undeclared); agent-free by design - G-066 pkgIndex.tcl-to-.tm repackaging: lib.copyasmodule expansion with embedded LICENSE/metadata datafile and distribution-unit tracking for multi-package upstreams (tcllib-style) - G-067 module artifact channel: publish/retrieve prepared .tm modules against configurable artifact servers, sharing the G-006 consent-gating and source-override pattern - G-068 agent-assisted moduledoc generation workflow for vendored third-party libraries (G-055 pattern generalized), decoupled from basic vendoring G-063 contract extended (user-approved): vendored-package license indications additionally carry verification provenance (method, verifier, date), reported by the audit surface. Proving case recorded in G-065 notes: the hand-trimmed tcl_oauth2_library copy was load-tested then removed before ever being committed, so the first vendoring of it runs end-to-end through the declaration; the TEMP_REFERENCE clone remains the upstream stand-in. goals_lint: clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
456fa80500 |
goals: G-021 fold in capture-privacy model (Tier 1)
Contract update (user-approved): Goal/Acceptance now make capture disposition policy-governed - snapshots yield an opaque capture token by default (no path or pixels in output), analysis relays token+prompt to user-policy-permitted endpoints (local-only or allowlist) returning text only, raw-image release (path/base64) is gated on explicit user config with the default refusing, and every capture/disposition is audit-logged. New "Privacy model (capture disposition)" section specifies the mechanism: opaque tokens, mechanism-side endpoint checking, expose_pixels policy (default analyze-only), policy config in user-profile scope outside the repo, audit trail, AGENTS.md guidance as an additional layer rather than the gate, and the honest enforcement ceiling (unrestricted same-user exec can capture outside punk; target is private-by-default sanctioned path + deliberate/auditable circumvention). Notes record further hardening as a potential future task: separate- principal broker with admin-owned config, and consent prompts - including the trap that G-020 input injection can click an ordinary consent dialog, so any prompt mode needs a surface SendInput cannot reach. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
99af43c8be |
goals: G-062 achieved archival + archive-loss prevention (sweep rules, backlink markers, goals_lint)
Finalises the G-062 achieved flip staged by the prior session (punkshell 0.12.1): LICENSE.txt (BSD-2-Clause, Julian Marcel Noble 2023-2026) at the repo root, README/punkproject.toml/AGENTS.md license declarations, index record to GOALS-archive.md and detail file to goals/archive/. Archive-loss prevention, from the G-015 incident (its achieved-status verification parenthetical was silently dropped by the 2026-07-11 two-tier restructure's Status-line normalisation; the text is restored to the G-015 archive file's Notes with provenance): - root AGENTS.md 'Doc Restructures': deleted-line conservation check before committing bulk doc migrations, structured-field-normalisation hazard (relocate prose to body sections first), moves separated from edits - goals/AGENTS.md: lintable header field grammar (one line per field, bare Status values), flip-time verification evidence recorded in the body, the archive move content-identical, and a new archive-time reference sweep: pending-tense mentions of the archived goal updated in the live tier, and actionable archived notes pointed to from the affected live goal's Notes - GOALS.md maintenance rules: achieved-flip clause extended to require the evidence write-up and the reference sweep Retroactive reference sweep over all 12 archived goals (25 live detail files): pending-tense fixes (G-002 G-008 G-013 G-016 G-017 G-021 G-022 G-031 G-042 G-044 G-050 - G-017's Goal/Acceptance annotated as gate-satisfied, contract meaning unchanged), forward pointers pushed from archived notes (G-062 license-seeding follow-on -> G-012/G-027, G-037 vendorlib/vfs drift semantics -> G-024, G-058 static-baseline mechanism -> G-005), and one 'Archived-goal references' Notes bullet per remaining referencing file so every live mention of an archived goal is resolvable without consulting the archive index. scriptlib/developer/goals_lint.tcl (new, plain tclsh): validates detail-file header grammar, strict status values in both tiers, orphan rules in both directions, Status/Scope mirror consistency, plus an informational (never fatal) warning for live files referencing an archived goal with no achieved/archive marker - baseline now zero warnings. Root AGENTS.md scriptlib/developer ownership note widened to cover developer utilities. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
3d14721d42 |
goals: G-001 achieved 2026-07-11 - archive entry + detail; project 0.11.0
Acceptance verified (consolebackends.test child-process drivers): repls run interactively through ssh-socket and tk-widget ::opunk::Console subclasses with size/at_eof/can_respond answered by the overrides, base class and punk::console unchanged. Detail file records increment 2 and the non-gating residue (per-run output batching, punk/0-only junction wiring, raw-mode untested on foreign consoles, process-global console state -> G-008). Project version 0.10.3 -> 0.11.0 with changelog entry (new user-visible shell capability: repl::init -console). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
331e894c03 |
goals: add G-062/G-063/G-064 licensing and lib.search machine-output goals
G-062: canonical project license - root BSD-2-Clause LICENSE.txt with SPDX-identified references in README.md, root AGENTS.md and a machine-readable license field in punkproject.toml. G-063: per-package license tracking - SPDX-normalized Meta license indications via a friendly-name mapping module (authors need not know SPDX ids), copyleft/viral-license flagging audit surface, and fixing the literal %license% template placeholder seeding. G-064: dev lib.search machine-parsable returns - ansi-free -return dict/json with documented structure (G-049 pattern) plus an option surfacing per-package license indications in table and machine returns. All three proposed with user-approved wording (2026-07-11). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
1d6a24f642 |
AGENTS.md + G-016 notes: fossil config-db pollution from throwaway repos
A scratchpad test repo (fossil-init/opened 2026-07-06 while probing ignore-glob semantics) registered repo:/ckout: rows in the global _fossil config-db and persisted as row 1 of dev projects.work. Instance cleaned up (fossil all ignore + dir removal + ckout prune). - root AGENTS.md User Preferences: throwaway fossil repos must use a scratch FOSSIL_HOME so registration lands in a disposable config-db; includes the remediation recipe. - G-016 Notes: the staleness concern applies to fossil's own central config-db, not just a punk-maintained registry; the shipped enumeration design needs a staleness story for both VCS sources, especially the -return dict|json machine forms. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
ae04b3f8c9 |
GOALS: two-tier index restructure - summary-only GOALS.md, canonical Goal/Acceptance in detail files, archive-on-flip
- GOALS.md collapsed to summary entries (ID/status/title/Scope/detail pointer): 104.6KB -> 23KB so a full read stays cheap; Scope lines kept verbatim so path-grep goal discovery still works - canonicality split: index canonical for ID/status/title/Scope, detail file canonical for Goal:/Acceptance:; all 61 detail-file headers reconciled from the index (fixes stale copies, e.g. G-036 detail acceptance predated the achieved rework), bodies preserved untouched - detail files created for the three index-only goals G-017, G-034, G-054; every goal now has one - 10 achieved goals (G-007 G-015 G-036 G-037 G-040 G-046 G-049 G-054 G-058 G-059) archived: summary records appended to GOALS-archive.md, detail files moved to goals/archive/; archive-on-flip replaces the ~30-achieved-entries trigger - GOALS.md preamble/rules reworked: read workflow (read index in full, then detail files of scope-intersecting goals before editing), contract spans both tiers with proposal-first unchanged, next-free-ID counts the archive, achieved flip judged against the detail-file Acceptance and includes archiving - progress convention codified from G-001 increment-1 practice: index entries carry status only, never progress; incremental progress lives in the detail file's ## Progress section (landed/remaining); achieved flip requires the remaining-work list resolved - a partial increment never flips a goal - goals/AGENTS.md rewritten for the split (required 4-field header, one detail file per goal, orphan rules covering archive/); root AGENTS.md Child DOX Index + Repo-wide Notes updated; GOALS-archive.md preamble updated - stale detail-file paths updated to goals/archive/ in src/lib/app-punkscript/punkscript.tcl (comment), runtimebash_wsl.test, wslprobe.tcl and the G-042 detail file; propagated copies (root lib/, src/vfs/_vfscommon.vfs, src/_build) left to refresh via normal build steps - no project version bump: governance docs and source comments only, no user-visible shell behaviour Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
aec77ca0d1 |
G-001 increment 1: pluggable ::opunk::Console backends - test double, ssh-channel, tk-widget (punkshell 0.9.0)
- three new backend modules under src/modules/opunk/console/, base ::opunk::Console and punk::console UNCHANGED (the G-001 acceptance constraint - verified diff-clean): * opunk::console::test / ::opunk::TestConsole - deterministic channel-pair test double: fixed size via -columns/-rows, is_console_or_tty/can_respond 1 (settled value wins), at_eof = plain chan eof with NO probe (pending bytes never consumed - pinned). The console seam identified by the G-044 repl characterization work * opunk::console::ssh / ::opunk::SshConsole - socket-carried terminal sessions: construction-time capability (detection is the wrong tool - per goal detail), chan-eof without byte-consuming probes, size via the registered ANSI size-query provider over the connection. Flagship test: a scripted remote terminal answers CSI 6n over a socket pair and size resolves 100x30 through punk::console machinery querying the socket * opunk::console::tk / ::opunk::TkConsole - Tk text widget as terminal: widget path in the inherited in/out slots (documented non-channel reuse), terminal_class tk-text, size from widget char dims, at_eof via backend marker (opunk::console::tk::set_eof) or widget destruction; no Tk require at module load. Verified live under punk91 src (the tk-loading experiment kit) - voo -extends subclassing pattern recorded in opunk/AGENTS.md: children inherit public accessors + field INDEX variables (not parent-private my.* accessors) - constructors initialise inherited private fields via index vars, method bodies use parent public accessor methods; virtual dispatch via the slot-0 tag needs no base changes - tests: modules/opunk/console backends.test (8 tests: dispatch, spec_resolve acceptance of subclass values, probe-free eof, settled-capability precedence, ssh capability/eof/size-over-socket/settled-0-no-emission, tk gated behind env PUNK_TEST_TK=1) - 7 green + tk skip on tcl 9.0.3 and 8.7; tk case verified standalone under punk91 - goal detail records progress + remaining work (repl -console launch wiring, output-channel parameterization, interactive acceptance verification); goal stays active Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
e8ef639793 |
G-016 detail: record the -return design decisions (completes 222886c0)
The prior commit message described these detail-file notes but the file edit had not landed (tool sequencing miss) - this commit adds them: dict-first assembly with table rendered from it, suggested per-checkout record shape, json via tcllib json::write as the G-017 parse target, markdown deliberately not offered as a machine form. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
89daa99269 |
GOALS: add G-061 [proposed] pseudoconsole expect-alternative for interactive shell testing
- ConPTY (windows) + pty (unix) expect-like harness: spawn a built punkshell on a size-controlled pseudo-terminal, send keys incl control/arrow sequences, await patterns in the rendered ANSI byte stream with timeouts and forced teardown, full transcript capture
- the durable byte-accurate tier of the repl verification model recorded in goals/G-044 detail: pure layer (commandcomplete.test, done), console-seam unit tier (G-001 as enabling refactor), rendered tiers (G-020 screen capture near-term windows bridge; this goal headless + cross-platform)
- first verification targets = preserve-list behaviours: the in-proc {set x "{*}{"} continuation-hint sequence, raw-mode tab-marker rendering/deletion, up-arrow recall + edit of a multiline history entry
- detail file records open implementation questions (driving ConPTY from tcl: twapi surface vs helper exe; harness/shell synchronisation incl the inter-subshell beep-protocol idea vs prompt sentinels) and the G-059 WSL / G-060 QEMU-guest execution extensions
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
8c65fe9d6f |
repl pre-refactor: characterize command-completeness engine + record preserve-list and testability findings
- new commandcomplete.test (6 tests, green 9.0.3 + 8.7): punk::lib::system::incomplete pure-function characterization - the info-complete quoting quirk (a quoted word with unbalanced braces e.g set x "{*}{" is complete standalone but needs extra closers inside a proc body; the pending-opener stack { " { " shrinks per typed closer), single openers, tabs in open braces, escapes, and an incomplete<->info-complete parity property over a case battery
- goals/G-044 detail: the user-specified preserve-list any repl refactor must honour (info-complete parity + quirk, closing-prompt hints incl the accepted single-candidate limitation pinned-not-fixed, raw-mode colour staging in-progress vs submitted, literal tab acceptance with raw-mode marker edit smarts, dim space dots display-only never leaking into submitted strings/history, up/down navigation of MULTILINE editbuf history with recalled entries editable) + testability findings: class_editbuf is console-coupled at its core (add_chunk renders via overtype::renderline against live terminal metrics - cursor-position size probing, DECRQPSR tabstops) so items 3-6 are not unit-characterizable until a console seam exists - G-001 (pluggable console backends / ::opunk::Console test double) is the enabling refactor, not just a feature goal
- goals/G-020 detail: repl interactive-behaviour verification recorded as a driving use case (near-term windows harness: keystroke injection + capture) pending the durable pseudoconsole expect-alternative
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
3a5a68ec9b |
G-059 achieved: WSL capability probing + native-filesystem staging for unix-side tests from windows
- new src/tests/testsupport/wslprobe.tcl (::punktest::wsl): memoized capability probe for the wsllinux constraint - default distro launches and unames as Linux, tools present (bash/mktemp/wslpath + sha1 tool), native tempdir file round trip; any failure -> skip with reason, so wsl.exe-present-but-unusable installs cannot false-positive. Staging helpers (staging_create/copy_in/run_in/cleanup) enforce the design: execution on the distro NATIVE filesystem only, shared /mnt used for one-way copy-in/out, the windows checkout never operated on from inside WSL (DrvFs slowness + cross-boundary stat differences that make git re-hash its index and fossil see phantom changes). Probe uses wsl -e invocations only (wsl --status/-l emit UTF-16) - multishell.test: scriptwrap_multishell_exec_wsl_sh - the polyglot sh payload produces its marker under the distro bash from native staging (the direct isunix twin still skips on windows) - new shell/testsuites/binscripts/runtimebash_wsl.test (8 tests): runtime.bash first-ever execution on real unix - multi-candidate run errors listing candidates, use/list/run round trip with argument passing, PUNK_ACTIVE_RUNTIME override, unknown/unselectable use errors, stale-active guidance, single-candidate fallback, offline list -remote (crafted cached sha1sums.txt + PUNKBIN_URL forced fetch failure), and the checkout-untouched guard (git status --porcelain identical before/after per acceptance) - green on tcl 9.0.3 + 8.7 against Ubuntu-24.04/WSL2; suites skip cleanly when the probe fails; enablement/limitations in src/tests/AGENTS.md (known limitation: a present-but-HANGING wsl can stall the probe) - GOALS.md G-059 flipped to achieved 2026-07-11; detail file records the outcome incl the UTF-16 discovery and the 512-byte label regression this work surfaced (caught by the guardrail suite as designed) Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
9a39320117 |
GOALS: add G-059 WSL test driving + G-060 QEMU cross-platform matrix (both proposed)
- G-059: capability-probed WSL constraint for driving unix-side tests from Windows (multishell sh-payload execution, runtime.bash behaviour). Native-filesystem execution is a design constraint: per-test artifacts staged into a WSL-native tempdir with one-way copy-in/out, no repo checkout inside WSL for these cases, future full-suite mode via a separate native clone - the Windows checkout is never operated on via /mnt (DrvFs slowness + cross-boundary stat differences force git index re-hashing and fossil phantom changes; two VCS clients must not share a working tree). Acceptance includes verifying the Windows checkout git/fossil state is untouched by a WSL-gated run. - G-060: QEMU guests as strictly external tooling behind a hypervisor-agnostic guest-driving contract (provision/stage/run/collect, push-based - same pattern as G-059; guests never share a working tree with the host). GPL-safe posture recorded: external-process invocation only, no QEMU binaries or derived code in punkshell or punkbin, guest OS images not redistributed - fetched/built per machine. First target FreeBSD x86_64; config home deferred to the buildsuites toml direction. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
d3d81c1c39 |
G-058 achieved: boot honours statically-linked runtime packages (punk::lib 0.4.0, punk::repl 0.3.0, punk::packagepreference 0.2.0, shellthread 1.7.0)
- punk_main.tcl captures the runtime static baseline at kit boot: empty-filename [info loaded] prefixes probe-loaded in a throwaway interp (configurable denylist tk*/vfs/mk4tcl/vlerq/tdbc* for side-effecting/composite inits), recording only packages a load actually PROVIDES (diff on provides, not package names - probe loads can trigger index scans) into ::punkboot::static_packages/static_prefixes; the boot interp is seeded with ifneeded {load {} <prefix>} mappings
- punk::lib interp_sync_package_paths/snapshot_package_paths propagate the baseline and seed fabricated interps/threads; punk::repl codethread init (new %staticprefixes%/%staticpackages% scriptmap) and shellthread worker init do the same - the repl code interp on a static runtime resolves Thread again (punk91 = tclsfe-x64 + punk9win.vfs failed with "can't find package Thread"; the appended vfs replaces the stub's //zipfs:/app mount taking its static pkgIndex files with it, and the tclsfe PostInit hook seeds per-interp auto_path only)
- punk::packagepreference static-vs-bundled policy: requiring a baseline package ensures the static mapping and triggers the package unknown scan BEFORE resolution so bundled copies register and the highest version wins (newer bundled reachable, static not masked by older bundled); static registrations excluded from the loaded-shared-object same-version pinning
- composite statics defer correctly: static twapi provides nothing under the probe (script layer lived in the replaced stub zip) so the bundled complete twapi is the resolution; punk91 vfs/vfs::zip warning re-diagnosed as kit content (tclsfe bundles no tclvfs) - recorded in the goal detail, not a seeding defect
- tests: staticseed.test (4) + staticpolicy.test (4) un-gated simulated-baseline units (green 9.0.3 + 8.7); staticruntime.test (4) kit integration behind the capability-probed statickitavailable constraint (probes ::punkboot baseline incl Thread; env PUNK_STATICKIT_TEST_EXE override, default bin/punk91.exe) - 4/4 against the rebuilt punk91; punk902z/full shell tree/full source-tree suite baselines unchanged (exec-14.3 only)
- verification runtime tclsfe-x64.exe pinned in the punkbin artifact repo (separate repo, commit b2dbbe6) with sha1sums + new AGENTS.md scaffolding
- punkshell 0.6.0: CHANGELOG entry; AGENTS updates (src/vfs capture contract, tests indexes incl new punk/lib + punk/packagepreference entries, shell staticruntime contract)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
40f3ef2bca |
GOALS: add G-058 [proposed] boot honours statically-linked runtime packages
- diagnosis from the punk91 tk-loading experiment (tclsfe-x64 + punk9win.vfs): plain tclsfe stub worker threads resolve static Thread 3.0.5 fine, but punkshell boot replaces package search paths wholesale and discards the runtime seeding - the repl code interp cannot find Thread ("failed to load punk::console"); punk902z unaffected only because its vfs bundles a thread dll
- fix shape: capture the static baseline (empty-filename info loaded entries + versions) before path replacement, seed fabricated interps/threads with 'load {} <pkg>' ifneeded scripts, and make punk::packagepreference resolve static-vs-bundled by a documented version-aware policy (punk91 loaded the OLDER bundled twapi 5.0.2 dll over the newer static Twapi)
- testing: un-gated unit tests against simulated baselines + kit-boot integration tests behind a capability-probed constraint (static-entries-incl-Thread kit present) - skips cleanly, extends to zig-era static runtimes (G-005)
- artifacts: verification runtimes (tclsfe-x64.exe at minimum) to be pinned in the punkbin artifact repo (win32-x86_64 + sha1sums.txt) so the constraint is satisfiable off this machine; .vfs folders already git-tracked
- detail file records probe evidence, the runtests-testinterp precedent (same bug class, directory flavour), the suspected quiet thread-over-builtin instance on punk902z, and the vfs/vfs::zip re-diagnosis follow-up
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
72d7fa80b2 |
GOALS: add G-057 [proposed] Windows kit icon embedding (twapi resource replacement, per-vfs override)
- default icon src/runtime/punk1.ico, per-kit override from the kit's .vfs; mechanism per tcl-sfe (TEMP_REFERENCE/tcl-sfe, Ashok P. Nadkarni): RT_ICON/RT_GROUP_ICON replacement via twapi resource-update APIs, ordered so the appended vfs payload stays intact (icon stub before append, or sfe-style split/update/reattach) - detail file records the _vfscommon.vfs override-detection wrinkle (common punk1.ico merges into every built vfs - consult the custom pre-merge folder or an explicit mapvfs.config element), idempotence via delete-then-write, twapi/non-Windows skip path, and resource-inspection acceptance - follow-on candidate flagged (detail file only): RT_VERSION stamping - copyright defaulting to the input runtime's own version-resource copyright, Product Name indicating the core Tcl version by default, both configurable via punkproject.toml and/or per-vfs config Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
6ef0693432 |
GOALS: G-049 achieved; new goals G-054 tclcore string-is parity, G-055 moduledoc regen workflow, G-056 punk::args word wrapping
- G-049 flipped to achieved 2026-07-10 (acceptance verified on Tcl 9.0.3 + 8.7); detail file records the shipped design, the incomplete-vs-invalid classification judgement call, and verification results - G-054 [proposed]: ::tcl::string::is class choices harvested from the running interpreter at define time + cross-version behavioural parity pins (probing showed the static 9.0 list wrongly accepts dict on 8.6 - the real Tcl 8 target - and the hand model is otherwise behaviourally accurate incl the last-word-is-str C semantics) - G-055 [proposed]: agent-driven tclcore moduledoc regeneration workflow - Tcl source tree + version as input (TEMP_REFERENCE/tcl9 interim; retrieval deferred to buildsuites toml/G-005 era), verbatim text policy with two exceptions (synopsis notation translated to punkshell syntax; line re-folding while punk::args lacks word wrapping), real-vs-model parity probe as the verification gate, provenance recording, modelability gap scan; proving set = whole ::string ensemble + selected others incl multi-form ::after; tkcore (shared-section reuse a la tk_standardoptions) and core.tcl-lang.org projects (tcludp) to follow later - G-056 [proposed]: display-time word wrapping for punk::args help content (split-only never-join, ANSI/grapheme/double-width aware, paramindent-aligned continuations) - retires the G-055 folding exception for new work when shipped Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
02da46eb74 |
punk::args 0.4.2 + punk::ns 0.1.4: G-046 achieved - deferred display-field expansion, rendering/value-shape fixes
Argument resolution no longer tstr-expands display-only content (-help on @cmd/@examples/argument records, @formdisplay bodies): ${...} there is masked with inert tokens (spec key DISPLAY_DEFERRED) and expanded at display time via private::expand_display_fields (hooks in arg_error/eg/resolved_def/@default copyfrom; separate display cache for non-dynamic defs; @dynamic re-expands per render preserving provider refresh; reentrancy guard substitutes raw sources when expansion of the same id re-enters). First parse of heavily documented commands drops accordingly (punk::ansi::mark_columns first call ~4.3s -> ~12ms; tclcore ::lseq resolve ~184ms -> ~2ms) and -help content that calls punk::args-parsing commands - including against its own definition id - resolves cleanly instead of stalling or looping. -choicelabels stays eager (punk::ns reads it from parse specs in the subcommand walk). Record splitter factored to private::split_definition_records. Also per G-046 acceptance: - @dynamic multiline -help substitutions align at the insertion column (rendering_atdynamic_multiline_help_insertion GAP flipped) - prefix/alias choice normalization keeps single-element-clause values plain-string ({\Deleted} list-wrap shape bug; choicegroups_imap_prefix_shape GAP flipped) - -return string renderer aligns cmd-help continuations under the Description: label (characterization updated) and its Example: line shows the example, not the doc url - punk::ns cmdhelp shows plain info-scheme usage when no argument words are supplied for a leader/value-requiring definition ('i string is', 'i punk::args::define') - advisory parse runs -errorstyle minimal so the discarded error no longer renders a second usage table (timing parity with pre-change: ~5.3s/4.1s on punk91 src) Tests: deferredhelp.test (new); suites green on tcl903 + tcl87; full source-tree run baseline-clean (exec-14.3 only). GOALS.md: G-046 -> achieved 2026-07-10 (activated this session at user direction); design + verification evidence in the detail file. Project 0.4.15. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
ae72dffd91 |
G-049..G-053 proposed: parse-status model, synopsis marking, cmdinfo doconly+prefix parity, oo method autodef, range-valued -multiple
Five user-approved proposed goals with detail files, grounded in the 2026-07-10
characterization work (GAP pins in usagemarking.test/cmdhelp.test map to these):
- G-049 punk::args parse-status data model with machine-parsable cmdhelp returns:
documented per-argument status structure consumed by both arg_error renderers,
cmdhelp -return dict; fixes badarg coverage (type/allocation failures), scheme
honoured on failure path, caller attribution, and the stateful shared
colour-array scheme handling (nocolour fallthrough + dash-spelling leak).
- G-050 synopsis argument-validity marking and status-aware returns: 's' gains the
goodarg/badarg marking via the G-049 structure; replaces the curried-alias
excess-args length arithmetic with a parse against the resolved definition.
- G-051 cmdinfo truthful cmdtype for doc-only pseudo-commands + space-form docid
prefix parity via the shared choiceword_match resolver ('i string is tr').
- G-052 TclOO method-level autodef: undocumented methods get an (autodef) from the
introspected parameter list instead of the class-summary-only fallback.
- G-053 punk::args range-valued -multiple: {min max} occurrence ranges alongside
the legacy booleans, expressing "at most once, repeat is an error" without a
separate duplicates flag (mirrors the -choicemultiple precedent; motivated by
the runtests -include-paths last-wins incident).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
b7dc51e2c0 |
G-048 proposed: textblock::table punk::args parsing with inline constructor define blocks
textblock::table uses an unvalidated dict merge with no choice validation; its PUNKARGS is incomplete and the -return -choiceprefix documentation mismatch is the last open item from the punk::args -choices audit. This goal proposes refactoring textblock::class::table's constructor to carry inline punk::args define blocks (the class_ansi pattern) so the constructor's documented option set becomes the single source of truth that textblock::table's PUNKARGS references rather than a parallel hand-typed list. Assisted-by: harness=opencode; primary-model=openrouter/z-ai/glm-5.2; api-location=openrouter.ai |
4 weeks ago |
|
|
a012142512 |
G-047 refined: per-developer commit-target override + fossil machinery carve-out
Rework the proposed G-047 for mixed git/fossil-preferring teams: committed [workflow] vcs in punkproject.toml declares the team primary (authoritative interchange); the same key in an uncommitted punkproject.local.toml redirects an individual developer's unqualified commit instructions. Resolution order: local override > project field > filesystem detection. Drops the one-directional batched-checkin claim (developer committing granularly to the secondary owns batching up to the primary) and records that punk internal machinery (punkcheck related-project tracking, G-027 pull, G-016 discovery) stays standardized on fossil regardless of the declared field. New detail file records rejected alternatives and rationale. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
4 weeks ago |
|
|
675aa22701 |
G-045, G-046 proposed: punk::args authoring ergonomics; deferred -help resolution + rendering/value-shape fixes
Both user-approved, drafted from the 2026-07-09 characterization findings with their acceptance criteria anchored to the pinned GAP tests. - G-045 (authoring ergonomics): parser-recognised record continuation (candidate: unquoted trailing -& with collision rules and an element-count disambiguation alternative recorded), @cmd honouring -unindentedfields, constructed (string-built) definitions able to opt into the whole-block indent normalization file-style definitions get (de-hacking ::punk::helptopic::define_docs as the consumer proof), and the braced-vs-quoted container quoting rules promoted from defquoting.test into the define documentation. - G-046 (deferred -help + fixes): headline item per user emphasis at approval - argument resolution stops processing -help/display-only fields, deferring their tstr expansion to display time with separate parse-vs-display caching (per the existing in-source review note), for measurable first-parse gains and fixing the reentrancy class reproduced with punk::ansi::mark_columns (~3.94s first call: its -help calls a proc that calls mark_columns, whose parse resolves the same still-resolving definition). Plus: @dynamic second-round multiline paramindent alignment, prefix-normalization value shape (list-wrap of backslash-containing choices), -return string renderer cmd-help continuation alignment, and the misleading goodargs 'Bad number of leading values...' prefix in 'i <cmd> <args>' output. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
850b7f23cc |
G-040 achieved: punk::args -choicealiases with shared choiceword_match resolver; doc-lookup parity; punk::help topic collapse
Activated and completed under user direction (2026-07-08). Aliases for choice
values are now first-class: accepted at parse, normalized to their canonical
choice in results, folded into the canonical entry in usage display, and
resolved identically by the punk::ns doc-lookup walk.
- punk::args 0.3.0:
* -choicealiases {alias canonical ...} on argument lines; dict shape
validated in the option switch, alias->existing-choice and no-collision
cross-validated after spec merge (surfaces at resolve time - define is
lazy)
* the choice-word matching chain extracted from get_dict into the shared
resolver punk::args::choiceword_match {word nocase allchoices
choicealiases choiceprefix denylist reservelist} -> {matched exact
canonical}; get_dict delegates to it (writeback/lset logic stays at the
call site) - one implementation for parser and doc walk
* exact aliases match under any -choiceprefix/-nocase setting; alias names
join the prefix-calculation pool when -choiceprefix is true; deny applies
to the matched NAME (denied alias requires the full alias; a canonical
reached via its alias is exempt from the canonical's own deny entry)
* display: aliases fold into the canonical entry as an '(alias: x)' /
'(aliases: x|y)' label note (single convergence point covers all render
paths); alias names join the display prefix calculation so highlighted
minimal prefixes stay truthful
* define doc gains the -choicealiases section
- punk::ns 0.1.2: cmd_traverse resolves subcommand words via choiceword_match
- -choiceprefixdenylist/-choiceprefixreservelist now honoured in doc lookup
(the two pinned parity GAP tests flipped to agreement), aliases normalize
before choiceinfo lookup, -nocase honoured in the walk
- punk 0.2.3: punk::help adopts the feature - 'i help' lists one entry per
registered topic (topics+help, tcl, env+environment, console+term|terminal);
topic words accept aliases and unique prefixes with the user-decided
minimum-prefix policy recorded in ::punk::helptopic: denylist {help}
(h/he/hel stay command words), reservelist {c to tc} (fall through to
command lookup; e/en and te/ter fall through naturally as ambiguous).
Argless 'help' output byte-identical to the strict-80 baseline.
- tests: choices.test +5 (alias exact/prefix normalization, noprefix exact-
only, nocase, the punk::help policy matrix, resolve-time validation);
cmdflow.test parity tests flipped from GAP to agreement + alias-traverse and
display-fold assertions (+flowaliased fixture)
- suites: punk/args 98 pass + 1 skip, punk/ns 28 pass, punk/lib 21 pass
- G-040 flipped active -> achieved 2026-07-08; detail file records
implementation and verification
- project 0.4.10 (CHANGELOG entry)
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 month ago |
|
|
0505397590 |
G-037 achieved: make.tcl vfslibs propagates vendorlib packages into kit vfs lib_tcl trees; 8.6 kits to tcludp 1.0.13
New 'make.tcl vfslibs' step (also run inside 'make.tcl project' before kit vfs assembly): propagates declared vendored platform-library packages into kit vfs lib_tcl<N> trees, ending the hand-copying that let kits ship a known-buggy tcludp through three make invocations (the G-036/G-037 motivating case). - declaration: src/runtime/vendorlib_vfs.toml, parsed with bootsupport tomlish (no ad-hoc parsing; G-024's mapvfs toml conversion NOT required first - this file is recorded as a candidate for absorption into it). [install.<name>] entries: source (relative to src/), targets (kit vfs lib folders relative to src/vfs/), optional supersedes (folder names removed from each target before install - explicit, no silent mixed-version provision per G-035 concerns). - participation is per-package per-kit; authority is the declaration - nothing syncs undeclared, so the known vendorlib/kit twapi drift is deliberately untouched (resolves the direction/authority design question). - punkcheck provenance at src/vfs/.punkcheck (gitignored, outside kit payloads); skip-if-unchanged proven (rerun: 0 copied, 9 skipped per target); malformed/unresolvable entries fail the build naming the entry (exit 3). - 8.6 kits upgraded (the G-036 loose-end decision, recorded): tcludp 1.0.13 is dual-generation (pkgIndex selects tcl9udp1013.dll on 9+, udp1013t.dll on 8.5+) so the single vendorlib_tcl9 source serves punk8win.vfs/lib_tcl8; superseded udp1.0.12 removed. - verified on rebuilt kits: punksys/punkbi (8.6.13) and punk902z (9.0.2) all report package require udp == 1.0.13 loading the generation-appropriate dll from their vfs; no udp1.0.12 remains under src/vfs; punksys piped-shell exit smoke clean. - G-037 flipped proposed -> achieved 2026-07-08 under user direction (no intermediate active stop). - includes project-build byproducts via established channels: bootsupport snapshots refreshed to punk-0.2.1 / punk::lib-0.3.0 (from today's version bumps) and make.tcl synced into layout copies. - project 0.4.8 (CHANGELOG entry) Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
48dccbe8c1 |
G-036 achieved: tcludp thread-exit bug detection (punk::lib 0.3.0 has_libbug_udp_threadexit, surfaced via 'help tcl')
Completes G-036's remaining acceptance item - version-based detection of the vulnerable combination (tcludp < 1.0.13 on Tcl 9 Windows: the per-thread exit handler closes the process-global sockListLock/waitForSock events, silently freezing every other udp-using thread's event loop after any udp-loaded thread exits; root-caused and fixed-by-upgrade in 0.4.3). - punk::lib 0.3.0: has_libbug_udp_threadexit gathers live facts (loaded udp version, else best available registered version discovered without loading the binary via an unsatisfiable package require triggering the index scan) and delegates the verdict to the pure classifier libbug_udp_threadexit_applies (facts in, verdict out - testable). has_libbug_* is the new check family for bundled/vendored library bugs; buginfo dicts may carry a full 'url' reference key for non tcl-core trackers. - punk 0.2.1: 'help tcl' scans has_libbug_* alongside has_tclbug_*, renders the url key when present, and no longer errors on a triggered check carrying a reference without a description (latent unset-indent fix). - new checkbugs.test: classifier combination matrix, live-check dict shape and classifier consistency, and a buginfo-contract test across all existing check procs. - verified: current kit (udp 1.0.13) reports bug=0 with no warning; a simulated triggered has_libbug_* check renders description + url in the help tcl warning block. Suites: punk/lib 21 pass, punk/ns 26 pass. - G-036 flipped to achieved 2026-07-08 (index acceptance REMAINING annotated DONE; detail file gains the Detection section). Open non-gating decisions recorded in the detail file: punk8win (8.6) kit udp 1.0.12 swap; optional upstream tickets for residual tcludp trunk weaknesses. - project 0.4.7 (CHANGELOG entry) Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
687c0113d1 |
G-044 proposed: punk::args-driven repl command completion/hinting; cross-goal weaves
User-approved goal for interactive command completion and hinting in the repl (raw mode primary), driven by the punk::args documentation corpus: - command-word resolution via the same doc-lookup flow as 'i' (ensembles, subcommands, ensemble parameters - characterized in cmdflow.test), argument position via the definitions (options, choices with parse-consistent prefix/deny/reserve matching, literals, multi-form awareness per G-041) - activation preserves the editbuf's literal-tab support (tab is content in this shell - completion cannot exclusively claim plain Tab; trigger scheme decided and recorded at implementation) - per-subshell completion-provider seam: the punk::args completer is the default provider; a subshell can declare an alternative or none - minimum bar is a clean disable for language subshells such as an interactive xtal session (full xtal completion out of scope, not precluded) - introspection must not execute candidate commands (arginfo principle); no per-keystroke terminal queries added when idle (G-013 approach note) Detail-file weaves from the same direction: - G-041: form candidacy should be exposed as an API accepting PARTIAL argument lists (per-form compatibility while typing) for the G-044 hinting consumer - G-043: subshell definitions gain a repl-behaviour composition aspect (completion/syntax provider); xtal-style language subshells recorded as the motivating scenario, an actual xtal session deferred to its own future goal - G-013: raw editor essentials noted as G-044's prerequisite; the editbuf literal-tab constraint recorded as a standing approach note Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
9948810b9b |
G-042, G-043 proposed: subshell help topics via punk::config; subshell definition plugins (punk.subshell capability)
Both user-approved after a review of the intended plugin facility (punk::mix::init pluginmgr todos, the punk::pluginmgr 0.5.1 tcllib fork, punk::cap provider/handler system, punk::cap::handlers::templates pathtype resolution, punk::overlay commandset composition and its toml-CLI todo). - G-042: a named subshell declares help topics (name/aliases/summary/text) in punk::config stored configuration, registered into the ::punk::helptopic registry on entry and restored on exit, with an explicit shadowing policy. Text-content only - config is data; code-bearing topics belong to the plugin path where the trust story lives. Detail file records the registry seam (punk 0.2.0), dependencies (hard on G-014; beneficial G-040/G-008/G-009), and the plugin-facility relationship from the review. - G-043: the umbrella for that plugin path - a punk.subshell capability whose providers supply commandset bindings (punk::overlay import), help topics (G-042's registry API) and config defaults per named subshell, with a validating punk::cap handler, an equivalent data-only stored-config declaration path (absorbing punk::overlay's ".toml configuration files for defining CLI configurations" todo), and punk::pluginmgr as the discovery/ safe-interp trust layer for untrusted providers. Also absorbs punk::cap housekeeping found in the review: pkg_unregister api-object cleanup and unhandled-capability discoverability (the deliberate punk.isbogus silence). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
91bd14e138 |
G-041 proposed: punk::args multi-form matching - automated form selection for parsing and documentation
User-approved goal recording the multi-form feature gap characterized 2026-07-08
with an after-like fixture:
- punk::args::parse without -form (default *) does not attempt non-zero forms -
input matching only a later form (e.g. 'cancel after#1') fails with form 0's
type/arity error, so the appropriate form must currently be specified manually
- -form is documented as accepting a set/list of forms but accepts only a single
form name or integer index
- the documentation surface does not determine/mark the closest form
('i after cancel <id>' presents the default form; 's after cancel someid'
lists all synopses unmarked)
Detail file records the probe findings, an approach sketch (form candidacy with
a leading-literal fast path, -form list support, doc-surface marking), the
requirement that explicit single-form restriction remains available, and the
test-first sequencing (forms.test GAP pins flip when this goal is implemented).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 month ago |
|
|
e45fea9b16 |
G-040 proposed (punk::args -choicealiases); choice-flow characterization tests; -choice* doc clarifications
- GOALS.md: G-040 punk::args choice aliasing with parse normalization, display folding, and doc-lookup parity (user-approved); detail file records the prefix/deny/reserve collapse analysis from the punk::help work, the cmd_traverse divergence, the c/to/tc minimum-prefix policy question, and the test-first sequencing - new punk/ns cmdflow.test (10 tests): cmdwhich/cmdinfo/cmd_traverse docid flow - direct, via-alias and subhelp-choiceinfo resolution (exact + unique prefix), unknown-word fallback to parent docid, -choiceprefix 0 exact-only, space-delimited ids, cmdhelp -return string smoke; the parse-vs-doc-walk divergence (deny/reserve lists honoured by punk::args::parse, ignored by the cmd_traverse walk) pinned as GAP tests pending G-040 - choices.test: 4 new unrestricted-mode (-choicerestricted 0) tests - prefix normalization to the canonical choice, unknown/ambiguous passthrough, denylist and reservelist passthrough, and the punk::help collapse recipe (prefix+deny+reserve on a -multiple leader) - punk::args 0.2.2 (doc-only): define doc -choice* fields now state the -choicerestricted 0 passthrough semantics, -choiceprefix result normalization + minimal-prefix display highlighting, denylist behaviour for shorter prefixes in both restricted modes, and the reservelist phantom-entry idiom for per-choice minimum-prefix control - suites: punk/args 74 pass + 1 skip (was 70+1), punk/ns 18 pass (was 8) Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
9ad1a35adc |
goal-editing policy: proposal-first with user approval; G-038 console-anchor finding + acceptance clause
Policy (GOALS.md maintenance rules, mirrored in root AGENTS.md and goals/AGENTS.md):
- agents apply goal-entry adds/edits only on user request, proposal-first: show the
proposed wording and get explicit approval before writing (replaces "only the user
adds or edits goals" - the user was applying agent-drafted edits by hand anyway)
- suggesting candidate goals is welcome and encouraged when grounded in the work at
hand; a suggestion is a flagged proposal, never a file edit; bulk goal surveys stay
out of bounds
- detail-file updates from user-directed work on a goal proceed without pre-approval,
reported in the completion summary; index stays canonical
- unchanged: achieved-flip on met acceptance (reported), no proposed->active flips
G-038 (user-approved):
- Acceptance gains a post-restart terminal-query clause: a code-interp query (e.g.
'help console') must succeed instead of being refused by the stale settled
can_respond=0 anchor
- detail file records the proven mechanism for the post-restart console failure
(piped phase settles can_respond=0; punkshell.tcl opens CONIN$ as a new channel
leaving the repl thread's stdin as the exhausted pipe; the anchored default console
keeps the dead pair; forced resettle honestly re-settles 0 via layer-1 eof), the
rebind requirements (re-point {in out} AND unsettle), and the hidden-console
repro/regression harness
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 month ago |
|
|
b219488e64 |
G-039 orphan-console-spin goal; G-036 acceptance reworked; AGENTS.md cmd.exe PATH note
- G-039 (proposed): investigate/reproduce the orphaned-shell one-core spin observed 2026-07-08 (single hard-looping thread after the hosting terminal went away); detail file records the observation, repro/diagnosis approach (reusing the G-036 dump tooling pipeline) and the G-038 coordination point (dead console = failure branch of the console-EOF restart decision). - G-036 acceptance reworked per user: standalone minimal repro waived as moot (root cause proven and fixed upstream); remaining actionable is a has_bug-style check reporting tcludp < 1.0.13 on Tcl 9 Windows through the existing check/help machinery (simple version test, no behavioural probe). Index and detail-file acceptance kept in sync. - AGENTS.md User Preferences: cmd.exe truncates a heavily populated PATH - tools resolvable in PowerShell may be not-found under cmd /c; use absolute exe paths there and suspect truncation before absence. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
6d96819ccb |
goal detail housekeeping: embed trap script, record reopen_stdin races, note twapi drift
G-036: the CloseHandle trap script is embedded in the detail file (was a dangling reference to session-ephemeral scratchpad). G-038: the repl::reopen_stdin race analysis from the G-036 investigation is written in (the prior cross-reference pointed at content that existed only in conversation), and the goal now explicitly owns that path's fate - it runs for real on console-EOF at an interactive prompt, and the caller-driven restart should cover that scenario so reopen_stdin can be retired. G-037: twapi vendorlib(5.0b1)/kit-vfs(5.2.0) drift recorded - divergence exists in both directions, so the sync step needs explicit authority semantics. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
b0f5911da0 |
G-038 detail: subshell continuity note - piped `subshell <name>` landing interactive
User note recorded: with per-subshell configs (G-008/G-009), piping `subshell <name>` then going interactive should reasonably land IN that subshell (quit unwinding to the initial shell). Does not fall out of the continuity changes automatically - the subshell stack is repl control flow and unwinds at pipe-EOF under the current nested model. Options recorded: re-enter captured subshell stack on restart (fights nesting) vs the natural fit under G-002 non-nested subshells with console targeting (reattach reopened console to innermost active subshell). Also noted: a -subshell flag on the shell subcommand as the primary entry (G-032 launcher-args candidate). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
b134b514d1 |
G-038 reworked (proposed): piped-to-interactive restart continues the same session
User identified the general least-surprise violation beyond the original error-retention draft: `'set ::jjj blah' | punkexe` reaches an interactive prompt where ::jjj does not exist - the piped-EOF restart silently swaps in a fresh codethread/code interp, discarding variables, procs, packages, cwd and errorInfo. Goal reworked to session continuity via the caller-driven restart identified during G-036 (repl::start eof-restart done-mode without codethread teardown; app-punkshell restarts on the reopened console without repl::init). Error inspectability becomes an acceptance criterion that likely falls out free (no re-init means no boot-noise re-stamping of errorInfo); the standalone error-record mechanism is demoted to a recorded fallback. Detail file renamed to match (slug change, ID preserved). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
330fcbb356 |
add goal G-038 (proposed): piped-phase errors inspectable in restarted interactive shell
Motivating transcript: piped `error xxxx` then interactive `set errorInfo` shows tcllib virtchannel boot noise (caught `unset timer`) instead - the restart boundary discards run-1's code interp, and bare ::errorInfo is clobbered by internal caught errors anyway. Detail file records the two mechanisms and design points (capture at the repl error-reporting site, tsv/exitinfo handover, punk-owned record + one-line first-prompt notice, quiet on clean pipes). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
b9179c6a77 |
G-037 detail file: current make.tcl coverage, design points, interim state
Records what libs/vfscommonupdate/project actually cover today (verified: vendorlib -> projectroot lib trees only; _vfscommon.vfs modules+lib only; kit vfs lib_tcl<N> hand-maintained), the design points to settle (per-kit declarative participation - candidate home G-024 mapvfs toml; supersession semantics per G-035; vendorlib/vfs folder-name mismatch; lib_tcl8 coverage), rejected alternatives, and the interim hand-copied tcludp state. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
a1b232dc0d |
vendored tcludp 1.0.12 -> 1.0.13 in tcl9 kit vfs folders - G-036 wedge remedy - 0.4.3
tcludp 1.0.13 (user-placed in src/vendorlib_tcl9/win32-x86_64) copied into punk9win.vfs/lib_tcl9 and punk9win_for_tkruntime.vfs/lib_tcl9, udp1.0.12 removed (no mixed-version provision). 1.0.12's Windows per-thread exit handler UDP_ExitProc closed the process-global tcludp synchronization events at every udp-loaded thread exit - the G-036 wedge root cause, fixed upstream in 1.0.13 (UdpThreadExitProc + ExitSockets split). Verified: rebuilt punk902z reports package require udp = 1.0.13; G-036 regression batch under wedge conditions (hidden console, syslog-forced runtag logger, mid-session udp worker death) shows run-2 syslog workers all alive - baseline on 1.0.12 was wedged 4/4. The manual vfs copy was required because make.tcl libs/vfscommonupdate/ project do not propagate vendorlib_tcl<N> platform libraries into kit vfs lib_tcl<N> trees (goal G-037). punk8win.vfs (8.6) still bundles udp 1.0.12 - same code, immunity unexplained, swap pending decision. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
3ed9e2af6e |
G-036 round 3: ROOT CAUSE - bundled tcludp 1.0.12 closes process-global events at thread exit
Live CloseHandle breakpoint (WinDbgX conditional bp on the sockListLock
handle value) caught the closer: Tcl thread-exit-handler walk in a dying
Thread-extension worker, tail-calling CloseHandle. The tcludp fossil diff
1.0.12 -> current names it: 1.0.12 Windows UDP_ExitProc ("called at thread
exit") closes the process-global waitForSock and sockListLock events, so the
first udp-loaded thread to die destroys the lock for every other udp-loaded
thread. Recycled handle values turn subsequent INFINITE waits into permanent
blocks (unrecycled values fail fast - why standalone probes stayed green
while punkshell run-2 startup churn wedged 4/4). Upstream already fixed in
1.0.13/trunk (UdpThreadExitProc per-thread + ExitSockets at process exit).
Remedy: upgrade bundled tcludp to 1.0.13+; loose ends recorded (punksys 8.6
udp version check, residual trunk weaknesses as optional upstream tickets).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
1 month ago |
|
|
281357dd89 |
G-036 round 2: wedge mechanism proven - tcludp global event handles closed mid-session
Instrumented traffic-enabled specimen: wedged workers blocked (not spinning) in WaitForSingleObject(sockListLock, INFINITE) inside tcludp event-source procs (disassembly maps both wait sites to the sockListLock static; the SocketThread released properly and parked on waitForSock). Handle-table data from the full dump proves both tcludp global event objects were CloseHandle`d mid-session: the statics still hold handle values now recycled to an IoCompletion object and a manual-reset event (tcludp only creates auto-reset events). Waiters starve forever on unsignalable objects. Only ExitSockets closes these handles; the sole udp-loaded thread that died mid-session (run-1 shellfilter-run worker, terminated in the run transition) is the prime trigger suspect. Console dependence dissolved - the CONIN$ restart was simply the only mid-session udp-thread-death scenario. Minimal-repro die-variants (release / terminate-mimic / full punk env) do not yet reproduce; next candidates recorded (resultvar-terminate, thread::cancel, live CloseHandle breakpoint). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
f0c00014c0 |
G-036 round 1: native stack census + tcludp Windows architecture findings
Dump pipeline proven (procdump + WinDbgX scripted -z/-c/-logo). Uninstrumented specimen stacks: workers indistinguishable wedged-vs-idle without heartbeat timers (all in notifier MsgWait) - round 2 needs the instrumented build to map wedged tids to dump threads. Structural finds: tcludp runs a global helper thread (observed parked in WaitForSingleObjectEx inside tcl9udp1012.dll); udp_tcl.c uses an auto-reset event as a pseudo-lock taken INFINITE in every udp-owning thread's event-loop setup/check procs; checkProc recvfroms non-blocking sockets per pass but does not decrement packetNum on the error path (WSAECONNRESET from ICMP port-unreachable), while setupProc forces zero block-time poll mode whenever packetNum>0 - a stuck packetNum locks the owning thread's event loop into permanent poll mode. Blocking-recvfrom theory ruled out (FIONBIO at open). Round-2 plan recorded (wedged-tid stack, MsgWait timeout argument, per-thread CPU to discriminate spin vs block). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
1765004709 |
G-036 progress: upstream recon, adopt-stdin probe null result, native-stacks next
TEMP_REFERENCE checkouts confirmed current (Tcl core 2026-07-07, tcludp 2026-07-05). core-9-0-branch carries no tclWinConsole.c fix since 9.0.2, so the wedge - if in the console driver - is likely still present upstream. Current driver architecture recorded (process-global gConsoleLock, console handle list shared across all Tcl threads, per-handle SRWLOCKs, reader/writer threads with CONDITION_VARIABLE wakeups + Tcl_ThreadAlert fan-out) as the credible wedge surface. Worker-side hypothesis sharpened: std-channel init on a worker's first channel creation (udp_open / log-file open) attaches it to the shared console machinery when the process stdin handle is the console - fits which workers wedge vs survive, though probes have not yet reproduced. Probe 'adopt' variant added (main thread closes stdin, CONIN$ adopted into the stdin slot, SetStdHandle, active reader) - clean, ruling out the last easy stdin-arrangement candidate. Approach reordered: native thread stacks of a wedged in-context specimen promoted to step 1 (no debugger installed yet - tool options noted). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
421ba92273 |
add goal G-036: tcl9 console+udp worker event-loop wedge root-cause + minimal repro
Index entry recorded active per user. The detail file carries the full investigation record: diagnosis chain of the piped-stdin exit/quit hang, evidence and scoring caveats, ruled-out repro ingredients, remaining candidates, and inline tooling listings (standalone probe script and the hidden-console batch scorer with its 2026-07-08 baseline: punk902z run-2 syslog workers wedged 4/4, punksys 8.6 alive 4/4). Upstream reporting is the user's manual step, gated on re-verifying against a Tcl 9 built from current core sources. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
5d25e2d972 |
shadowing pin-tests for tm tie-break rules; goal G-035 mixed-provision
New suite src/tests/modules/punk/libunknown/testsuites/shadowing/ (7 tests, all pass) pins the .tm same-version shadowing rules verified experimentally 2026-07-06/07: tcl:™️:add PREPENDS each argument (last arg ends at the head of tcl:™️:list); the head of tcl:™️:list wins exact-version ties (single and separate add calls); a higher version wins from any position (order only arbitrates exact ties); and punk::libunknown preserves all of it (scanner parity). Shipped behaviour depends on these rules - the runtests testinterp tm ordering (bootsupport over vendormodules) and punk_main''s package-mode block precedence that G-033''s proj:/kit-first design builds on - so a Tcl or libunknown change that shifts the tie-break now goes red here instead of silently mis-resolving. Goal G-035 (proposed): characterise mixed .tm / pkgIndex.tcl provision of the same package - same or differing versions, under standard package unknown, punk::libunknown and punk::packagepreference, across scan-trigger orderings, forget/re-require crossing forms, and 8.6/9. Converts the standing informal rule ("avoid mixing provision forms for one package - unexpected behaviour even with libunknown''s improvements") from folklore into either substantiated AGENTS.md guidance with named failure modes, or retirement if mixing proves predictable. Discovery work, so goal-specified rather than written now; extends the shadowing suite when implemented. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
062ec6fe93 |
G-033 revised: proj: scope prefix, kit-first canonical, help text persisted
Design review outcomes (2026-07-07): - Syntax: proj is not a fifth ordered token (category error - the dash list is an ordered sequence of path blocks whose order IS the same-version tie-break dial, per the verified tm rules and punk_main''s own comment). Decided form: [proj:]<block>[-<block>...] - the prefix scopes WHICH project root dev/src resolve against (cwd walk-up to the nearest VCS repo root vs exe-relative), staying outside the ordered list whose semantics are untouched. Explicit prefix = no silent rebind on cd. Rejected: auto-detection, an explicit flag (less convenient), token-attached qualifiers. - Shadowing: visitor mode makes cross-lineage same-version-different-code ties structurally expected (binary and visited project snapshots are different vintages by definition). Order only arbitrates exact ties - dev-versioned, higher-versioned and kit-absent modules come from the project in either order. Canonical documented invocation is proj:internal-src (kit-first: the visiting shell''s infrastructure survives ties; for a standalone downloaded binary the kit is its only trustworthy lineage and internal is location-independent); proj:src documented as the faithful-vintage variant. Trimmed kits (G-019) compose gracefully - kit-first only arbitrates ties. - Required boot notice: detected root + effective precedence. - packagemode help text drafted and persisted in the detail file as the designated G-032 source (live only when the prefix ships); G-032 detail cross-references it. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
0540c3c19b |
add goals G-033 (proj cwd-project mode) and G-034 (8.6 shell modpod mount)
G-033: an explicit `proj` package-mode token lets an installed (visitor) punkshell binary detect the punk project containing the cwd - walking up to the nearest VCS repo root, the marker punk::repo::is_project_root already uses - and set up source/dev library resolution against THAT project, so `punkshell proj shell` explores a project interactively even when the project builds no shell-capable binary (or no binary at all). History check recorded: cwd project-structure detection was never active in the boot modes (src/dev are exe-relative; os is shallow cwd-only), but the runtime detector find_project already exists and dev commands use it - so the marker question (VCS repo root, not punkproject.toml which tomlish lacks) is already answered; this aligns boot modes with it. Explicit token gates it per user decision (no silent rebind on cd); boot chicken-and-egg (find_project is in punk::repo, not loadable at the package-mode phase) handled by a lean inline VCS-root walk-up or post-boot deferral. Reuses the existing src-mode path machinery, parameterised on the detected root. Not gated on the module.templates/punk::cap plugin machinery. G-034: zip-based #modpod modules (e.g. punk::mix::templates) fail to mount in the shell subcommand's code interp on Tcl 8.6 - `dev module.templates` errors with `invalid command name vfs::RegisterMount` / no template providers - while the same call works via the script subcommand / main interp (reproduced 2026-07-07). The code interp lacks the vfs::zip library that supplies zip mounting for pre-zipfs Tcl. Tcl 9 (zipfs) unaffected. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
63089c7f43 |
script subcommand: match tclsh Tk main-loop behaviour for GUI scripts - 0.4.1
Root cause: Tk registers a main loop (Tcl_SetMainLoop); tclsh''s Tcl_Main services it after the script, so `tclsh gui.tcl` behaves like wish. The script subcommand sourced-then-exited, so a Tk script''s after-callbacks never ran (scriptlib/tktimer.tcl flashed and died; shell was the workaround). Confirmed: native tclsh tktimer 1 blocks ~1.35s; script did 0.38s. Fix: after the script body (success paths only), if a Tk main loop is registered (info exists ::tk_version && winfo exists .), tkwait window . services the event loop until the main window closes, then exit - the script-level equivalent of Tcl_Main. A script that exits from a callback (tktimer countdown) terminates directly. Console scripts have no main loop and exit at once; a script error exits at once (no hanging window). Verified both generations: tktimer via script now blocks the countdown (punk902z 1.49s, punksys 1.57s - Tk present in both) exit 0; tkhello_exit immediate; tk-script-that-errors exit 1 in 0.37s (no hang); tkhello (no self-close) blocks like wish; console script unaffected. Enables G-020 GUI automation via `script` instead of `shell` (noted in G-020 detail). Project version 0.4.1. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |
|
|
9316a2f17d |
G-015 achieved: punk executable script subcommand (app-punkscript) - 0.3.0
New lean app package src/lib/app-punkscript behind the (previously stub) script subcommand in punk_main.tcl: - `<commands> | <punkexe> script` runs piped stdin to EOF - no trailing exit needed; `<punkexe> script <file> ?args?` runs a file with conventional ::argv0/::argv (bare non-subcommand first arg still reclassifies to the file form). Script may itself read stdin in the file form. - Default punk shell environment via shared definitions (package punk registers deck aliases e.g dev; punk::aliascore::init adds the utility aliases) - no local alias lists, no boilerplate in piped one-liners. - Honest exit codes: 0 success, 1 on error with errorInfo on stderr, script''s own exit honoured. No shellfilter stacks/transforms, no logging side effects, no interactive fallback (terminal stdin with no scriptname is a usage error, never a blocking read or shell). - Stdin form echoes the script''s final result when non-empty (one-shot eval ergonomics: return-value commands like `dev projects.work <glob>` emit their table without a puts wrapper); file form keeps pure script semantics. Verified on both generations (punk902z/tcl9 from _build - bin deploy was file-locked; punksys/tcl8.6 from bin): piped success/error/exit-code, file form with args and stdin passthrough, missing-file error, motivating one-liner `dev projects.work *tomlish*` emitting the project table with exit 0, `src` mode combination (dev modules load), and `shell` subcommand regression smoke. G-015 flipped to achieved 2026-07-07 per GOALS.md rules; goal detail records the verification and the manual console spot-check item. Project version 0.3.0 (new user-visible shell capability - minor bump). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 month ago |