Tree:
eedcd57ad2
master
v0.1a
${ noResults }
23 Commits (eedcd57ad23811c78f31830a272095b43706ada1)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
232f2f6096 |
contextual sweep: deprecated make.tcl subcommand references (user-directed, incl. contract lines)
Each site read in context, not grep-replaced; bakehouse vs bake chosen per meaning, and missing invocation arguments supplied where the reference describes an unattended flow: - G-005 Approach + Notes, G-006 Acceptance + body: 'make.tcl project' -> 'make.tcl bakehouse' (the full consumer build these goals integrate with; no flags - conceptual references on a clean checkout, not recipes). - G-057 Acceptance: 'make.tcl project' -> 'make.tcl bake' (icon embedding lives in the kit-wrap stage and must hold for a bare bake; bakehouse inherits). - G-028 Context DELIBERATELY UNCHANGED: dated 2026-07-07 incident narrative - the command actually run; history stays verbatim (alias keeps it readable). - src/runtime/mapvfs.config todo: 'vfs' -> 'bake' wish, re-annotated - G-104 achieved WITHOUT the single-kit-by-name/list-kits item (still open). - src/runtime/vendorlib_vfs.toml header: vfslibs now runs as a phase of bake (G-112 fold), not 'as part of project'. - shellexit.test + staticruntime.test rebuild comments: 'project' -> 'bake' AND stale '(interactive y confirmation)' / bare vfscommonupdate corrected to '-confirm 0' (piped y retired since G-030) - the missing-arguments class. - punk.project layout store vfs READMEs (lib + modules): 'make.tcl vfs' -> 'make.tcl bake'; modpod template twins propagated via the punkcheck layout->modpod sync (make.tcl modules run), never hand-edited. Variant-phrasing sweep confirmed non-hits: G-115 '(vfs assembly)' names the src/vfs payload tier (name retained), G-047 'make.tcl/project.new' is the dev project.new command. Archive tier + CHANGELOG history untouched. goals_lint + goals_xref refs clean. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
5 days ago |
|
|
a949414bf8 |
make.tcl window doc sweep: bake/bakehouse vocabulary across workflow references
Root README, src/README, src/AGENTS.md (full-build guidance, provenance command list incl. bakehouse's default-on dirty gate, punk-exe-hosted builds, verification), src/modules + src/lib + src/vfs + src/tests + src/tests/shell + src/runtime AGENTS.md workflow references, and the rebuild-instruction comments in scriptexec.test/tclshcmd.test. G-104's G-058 mention gains its archive marker. Historical CHANGELOG entries untouched; goal-file contract texts (G-005/G-006/G-057 Acceptance mention 'make.tcl project') left for proposal-first user approval - the deprecated alias keeps them executable. Layout make.tcl copies are punkcheck-synced build outputs - they refresh via the normal sync channels in the acceptance build, never hand-edited. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
e03ce1d64a |
G-113: make.tcl terminal-aware colour policy (tty probe, force overrides, zero-ESC piped)
Startup policy: NO_COLOR > PUNK_FORCE_COLOR/FORCE_COLOR > stdout -winsize tty probe (Tcl 8.7+/9); Tcl 8.6 fails OFF. Piped/unknown non-forced runs push an ansistrip transform on stdout+stderr - zero ESC bytes from every emitter incl. module-side (punk::ansi's colour_disabled deliberately keeps non-colour effects; design finding recorded in the goal file). shell pops the transform. sgr_cache cleared for punk-exe-hosted pre-loaded interps per the punk::ansi contract. define_global_ansi fully gated; raw-SGR literals routed through new ::punkboot::sgr gate (fixes a malformed \x1b\31m). check reports the policy. make.tcl converted CRLF->LF. Verified: tclsh90 + punk91 kit piped zero-ESC (check/help/workflow/modules); force overrides re-colour piped output; NO_COLOR always suppresses colour; 8.6 tcl86-plain; real Windows console mode=tty (hidden-console evidence); WSL pty mode=tty vs piped-plain (tclkit-902-Linux64). New suite punkexe/maketclcolour.test 3/3. src/AGENTS.md bullet revised; punkshell 0.22.2. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
19c63ac60e |
punk-runtime list -remote identity columns (G-119 follow-on, user-directed)
The starred active row previously never changed across 'use' switches (every -rN materializes to the same working name) and carried the name-keyed dead end '(not listed on server)' - true of the name, unexplanatory for a working copy whose bytes match a server artifact. Rows the server listing does not name now carry an untitled identity middle column: from=<artifact> for materialized working copies (the beside-toml source; content verified against that artifact's server sha1 so the Remote cell shows a real status - Same version, CONTENT DIFFERS for the immutable-artifact anomaly, or '(artifact not listed on server)'), sha1=<name> for tomlless byte-copies (default-first- then-ordinal pick, the same rule as the freshness fallback so row identity and freshness verdict always name the same artifact). '(not listed on server)' remains only for genuinely unknown files; the (server default) row annotation follows artifact identity onto working copies of the default. Table header/rules widened to the three-column layout, payload row formats now column-aligned across ps1/bash; help text updated; bin/punk-runtime.cmd rewrapped (checkfile clean). Chosen shape (user-approved from mockup variants): untitled middle column with self-keyed from=/sha1= tags - consistent with the plain list metadata summary's from= vocabulary and self-describing when a row is pasted without its header. runtimecmd_freshness.test +3 row-shape tests (identity columns, the identity-following default annotation, anomaly statuses) with ps1/bash parity: 10/10 pass; scriptwrap + binscripts battery 35 pass / 1 pre-existing skip / 0 fail (roundtrip + checkfile pins green, WSL row pins unaffected). bin/AGENTS.md + shell tests AGENTS updated. punkshell 0.22.0. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
f562d13d2e |
G-119: punk-runtime freshness verdict - active vs server default (both payloads)
list -remote now states the relationship between the ACTIVE runtime and the SERVER DEFAULT whenever both are known: explicit freshness: AHEAD/ BEHIND verdicts naming both revisions (BEHIND adds a fetch+use update guidance line), an equivalent current verdict where the (= server default) identity annotation did not fire, a different-series incomparable note, and a stated no-revision-basis note for pre-family actives - with sha1 VALUE-matching against the server sha1sums identifying a byte-copy of a server artifact by content (support-file rows excluded; first ordinal/C-collation match in both payloads). A NO-NAME fetch prints the same verdict as a one-line note when the active diverges from the resolved default (BEHIND carries an inline 'use <default>' hint - the artifact was just fetched). Revision basis: -r<N> parsed from artifact-named actives, else the beside-toml revision field (materialized working copies); the default's revision parses from its defaults.txt name. Verdict lines are byte-identical across the payloads; guidance lines keep each payload's program-name convention. Help text (list/fetch sections) mentions the new surface; bin/punk-runtime.cmd rewrapped (checkfile clean, no spacer resize). New fixture-server suite shell/testsuites/binscripts/runtimecmd_freshness.test: a child-process http file server (new src/tests/testsupport/httpfixture.tcl) serves a crafted punkbin layout behind the PUNKBIN_URL override; the ps1 payload runs as the staged committed .cmd via cmd.exe (wrap-pinned path), the bash payload directly under a probed msys/git bash (on windows the polyglot routes unix shells to the powershell payload; WSL bash rejected - WSL2 cannot reach a 127.0.0.1 fixture server). Covers the five G-119 acceptance scenarios with per-scenario ps1/bash verdict-line parity plus bash-side extras (different-series incomparable, fetch-mode BEHIND hint): 7/7 pass; scriptwrap + binscripts subtrees 32 pass / 1 pre-existing skip / 0 fail (roundtrip, checkfile, WSL, dtplite unaffected). bin/AGENTS.md runtime-manager contract records the verdict surface; src/tests + src/tests/shell AGENTS docs cover the new suite and helper. punkshell 0.21.0 + CHANGELOG entry. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
83d2c6f44c |
G-118 item 11: env-gated hidden-console test for the dorepl console-reopen path
New src/tests/testsupport/consoleinject.ps1: the G-106 recipe's injection half as a committed helper - FreeConsole/AttachConsole to a target pid's console, open CONIN$, type lines as WriteConsoleInput key events. tclshcmd.test: constraint punkconsole (windows + PUNK_TEST_CONSOLE=1; normal runs skip) gates two tests driving the reopen path end-to-end in the child's OWN hidden console (outer Start-Process -WindowStyle Hidden wrapper owns a fresh console; wrapper runs '<kit> tclsh' there with std handles redirected to files; piped code sets dorepl; injected lines + exit 0 finish it). Pinned: reopened flips 0 -> 1 at reopen with istty immutable at 0, inputbuffer published empty, reopen notice silent by default and STDERR-only under TCLSH_PIPEREPL_DEBUG=1, injected exit completes with code 0 - closing the item-1/7 console-side residue. Deadlines + wrapper-tree kill keep the tests hang-proof; the piped-harness HANG RULE stands for everything else. Verified: PUNK_TEST_CONSOLE=1 run 21/21 against punk9_beta; normal run 19 pass + 2 console skips; shell/*** suite 64 pass / 4 skips / 0 fail. AGENTS updates: src/tests/shell (tclshcmd bullet - coverage now exists, refined hang rule), src/tests (testsupport index + .ps1 helpers wording). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
6 days ago |
|
|
a015ada542 |
G-117 achieved: flip, archive, reference sweep; reopened pin; G-118 items 1+7 verified
Acceptance evidence in the archived detail file: embed verified in all three family members (family_check), sidecar derived from embed with identical build_id, 'info' identifies sidecar-paired/renamed-stray/pre-v1 files without execution and flags doctored-sidecar disagreements, punkbin AGENTS.md schema docs, roundtrip pin green, record survives make.tcl kit wrapping (punk9_beta reads its runtime's r2 record in-kit), r2 re-emitted with full v1 records. Sweep: achieved markers in G-025/G-057/G-108/G-116/G-118/G-119 (G-025's survival expectation updated to confirmed). tclshcmd.test pins ::tclsh(reopened) publication on the rebuilt patched kits (G-118 items 1+7 landed+verified; Progress updated). build905.zig: packager git-identity leg judges success by output not out_code (resolved 'unrecorded' on this host - effective at next emission). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
17250a8c97 |
tclsh subcommand G-118 items 3/4/5/9: argv0 stock parity, clean not-found, console fail-fast, project_main parity (0.20.0)
- no-script forms set ::argv0 to the executable path (was the kit boot script) - missing script file: file-exists pre-check, clean message, exit 1 (existing-file source errors keep their full trace) - no piperepl machinery (unpatched runtime or TCLSH_PIPEREPL=0): terminal stdin fails fast with usage guidance (app-punkscript probe) instead of blocking in a raw read; piped degraded eval unchanged; patch-missing notice now 'note:' and a deliberate TCLSH_PIPEREPL=0 opt-out is quiet (old debug lines deleted) - project_main.tcl mirrors the full tclsh dispatch (script-arg/dash/-encoding/ lib: forms; was single-arg-only with stale gate default 0); layout _config copies byte-synced (interim duplication pending G-031) - tclshcmd.test 17 -> 19 (tclsh_noscript_argv0, tclsh_script_notfound); shell subtree 64 pass / 2 goal-gated skips / 0 fail against rebuilt kits Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
f3a9067cbf |
runtimebash_wsl.test: tolerate G-103 metadata-era list row format (stale glob)
Local 'list' rows are column-padded '* <name %-35s> (active) <metadata>' since 61cf903d; the test's single-space '* fakert_beta (active)' glob predates that and failed. Assertion intent unchanged: the row is starred AND active-marked. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
e61411c19a |
tclsh subcommand review: tclshcmd.test suite + contract doc corrections
- new punkexe suite (17 tests): dispatch contract (script-arg argv0/argv/ info-script state, honest exit codes, piped no-arg eval, stock arg forms, lib: refusal) plus the piperepl launch-state contract on patched kits (istty/dorepl/evalinput published, piped script-arg state all-zero, unconsumed-piped-input safety default, evalinput opt-in ordering, script consuming stdin itself) and the unpatched degraded-mode notice - hang rule baked in: no test or fixture may set ::tclsh(dorepl) (the console-reopen path blocks under a piped harness; G-106-recipe territory) - patched-kit resolution: env PUNK_PIPEREPL_TEST_EXE, else the punkexe if it probes patched, else bin/punk9_beta.exe / punk9bi_beta.exe - encoding coverage is byte-level (utf-8 vs iso8859-1 fixture; [format %c 233] keeps the .test file pure ascii, runner-encoding-proof) - patches/README.md: corrected the tcl_interactive divergence note (console script-arg runs READ 1 where stock reads 0 - piped launches identical; the early link stays load-bearing for the piped prompt opt-in) and recorded the '? reopen stdin from console' stdout residue as known - shell/AGENTS.md: tclshcmd bullet; stale runtime.bash names corrected to punk-runtime.bash/punk-runtime.cmd Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
099ac699e3 |
G-097: bin utility naming sweep - punk-bits, punk-runtime, punk-tclargs, selfsign
The remaining pre-policy punkshell-own bin utilities take the punk- prefix (bin/AGENTS.md policy, G-096); external-tool wrappers (dtplite/sdx/kettle) and getpunk stay unprefixed. No behaviour changes ride along. - runtime scriptset: sources/toml renamed (src/scriptapps/bin/punk-runtime.*), the eight ps1 usage/guidance messages now say punk-runtime.cmd, the bash payload's filename-derivation comment example updated; REWRAPPED -> bin/punk-runtime.cmd (checkfile clean) with the .ps1 twin regenerated as a byte-copy. The roundtrip + checkfile pins retarget the new names and pass. - tclargs + bits: sources/tomls renamed; bin artifacts moved BYTE-FAITHFULLY (git mv, no rewrap): a pre-rename drift check showed both carry pre-template-refresh wraps (477-byte delta = the template's 2025 wmic-deprecation timestamp fix; runtime was in sync). Regenerating them is a behaviour change and is deliberately not smuggled into the rename - recorded in the goal. Fresh .ps1 twins cut from the current .cmds; stale untracked bits.bat/bits.ps1/tclargs.ps1/runtime.ps1 removed. - selfsign experiments: SELFSIGN.PS1 -> punk-selfsign.ps1 (case normalized), wrap toml + cert-create script renamed; the four untracked bin experiment scripts renamed on disk; the exported .cer is not a script and keeps its name. - runtimebash_wsl.test: functional staged-filename sites updated (bash ./punk-runtime.bash; solo-fixture cp) along with comments. - Docs: bin/AGENTS.md (examples, policy paragraph records the sweep, runtime contract section, pin pointer corrected to runtimecmd_roundtrip.test), src/scriptapps/AGENTS.md, root AGENTS.md, README.md, src/README.md, untracked bin/runtime/README.md, G-060 reference, libunknown comment (src copy; root modules/ + bootsupport copies catch up on their re-vendor cycles). Suites green: scriptwrap + binscripts 26 run / 25 passed / 1 constraint-skip / 0 failed - the roundtrip pin passes against the renamed artifact. Discovered and recorded for user decision (goal Progress): the project LAYOUT stores ship stale utility copies - runtime.cmd (2025-era payload) and getzig.cmd (the G-096 rename missed this channel) - so generated projects still receive old-named utilities; folding the layout channel into this goal's scope vs a layout-sync mechanism is flagged. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
1 week ago |
|
|
bc958300b1 |
G-093 rework: punk::path *** pathglob + separable lattice; runtests passthrough targeting
User-approved contract amendment replacing the day-1 file-relpath filter: one
directory-oriented pathglob semantics at every layer, with the ergonomics gap
closed in the syntax itself.
punk::path 0.4.0:
- *** as a whole segment matches ZERO or more segments (join-aware regex in
pathglob_as_re: an adjacent separator is absorbed into an optional group),
so X/*** = X and everything below - the subtree spelling; ***/f.txt matches
at any depth including the root.
- include separability fix: an exact or single-segment-glob full match no
longer sets allbelow (the deep walk previously dragged the whole subtree in
for X and X/* patterns; the zipfs walk was already separable).
- exclude separability fix (new exclude_state classifier, both walks): only
**|***-tail patterns prune the matched subtree; other matches exclude just
that directory's files - the **/_aside vs **/_aside/** argdoc distinction is
now real. Dead _path_matches_any removed.
- legacy bare-* include collapse removed (a * in -include-paths is the
one-below lattice form, not a match-everything alias; no caller used it).
- globmatchpath default-nocase driveletter exception rewritten as a direct
regex-head rewrite (the regex-text file-split broke on c:/***'s glued group
and accepted non-alpha drives).
- path.test +5 lattice/*** pins (40 total).
runtests.tcl:
- -include-paths/-exclude-paths pass through to treefilenames unchanged;
argdocs teach the separable X | X/* | X/** | X/*** lattice; directory and
file-name axes independent (tails); single-file targeting = exact dir
pattern + file tail.
- -serial-paths reconciled to the same directory-of-file reading (default now
modules/punk/console/*** modules/opunk/console/*** via
runtests_discovery::dir_matches_any) - the pre-existing file-path serial
matching was the other same-option-different-referent divergence.
- per-pattern zero-match stderr advisory (the X/**-for-subtree foot-gun points
at X/***).
- json report emitter: whitespace-padded entier-looking values now take the
quoted-escaped path ('string is entier -strict' accepts surrounding
whitespace - a failed test's "0\n" result_was embedded a raw newline and
truncated the parseable report line).
- testsupport/discovery.tcl now a thin passthrough (requires punk::path
0.4.0-); pathdiscovery.test rewritten to the directory-semantics contract
(22 tests incl. the X/** zero-match advisory characterization); AGENTS.md
targeting guidance swept to /*** across src/tests and src/modules/opunk.
Verification (native tclsh 9.0.3, piped, serialized): 45-probe matrix, path
suite 40/40, runner suite 22/22; vs the pre-G-093 baseline the default
discovery FILE SET differs by exactly the added runner suite and result
parity only by the five new path tests (+ that suite); mode parity -jobs 16
vs singleproc: PARITY ok (94/1037/failed=1 exec-14.3). Goal contract amended
in the detail file; full record there.
Claude-Session: https://claude.ai/code/session_01BNUVVkYq9vHa6G3S9a3XTZ
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 weeks ago |
|
|
1eb9dc690b |
punk::path 0.3.0: extensionless tcl scripts via lib: (first-line identification)
scriptlib_resolve now lets an extensionless (or unknown-extension) lib:<name>
call match a file named exactly <name> when its first lines identify it as
tcl: a leading '# tcl' comment (prefix, case-insensitive), a shebang naming
tclsh/tclkit/wish, or the portable sh-trampoline ('#!/bin/sh' with a
commented 'exec tclsh' continuation - detected within the first 4 lines).
New internal punk::path::system::scriptfile_is_tcl does the bounded sniff
(512 bytes, UTF-8 BOM and CRLF tolerated, directories/unreadable files
rejected). When both <name> and <name>.tcl exist, the spelling matching the
call wins, checked per scriptlib location so kit-internal directory
precedence is never crossed by a spelling preference.
.kit joins the known extensions: lib:<name>.kit previously had .tcl appended
(searched <name>.kit.tcl), which made the shell subcommand's do_tclkit
dispatch arms unreachable - lib: kit dispatch is now restored. Result dict
reworked: scripttype (tcl/kit/py/pl/ps1/sh or empty) + notes keys added,
scriptname is now the matched relative name, and matches require file isfile.
app-punkshell and app_shellrun lib: handling refactored onto the shared
resolver (previously independent inline copies of the policy), fixing two
silent-failure bugs in that copy: no message at all when a scriptlib dir
existed but lacked the script, and the error listing showing
<kit>/scriptlib rather than the <kit>/app/scriptlib actually checked.
app-punkscript's post-resolve gate now uses scripttype and its not-found
report includes the identification skip notes. The unused has_globchars
vestige is dropped.
Fixtures scriptlib/_punktest/{extless,dual,dual.tcl,shebang_sh,notatcl} and
5 new scriptexec.test cases (extensionless resolve, both precedence
directions, trampoline shebang + argv, non-tcl skip note on not-found);
suite passes 17/17 against a freshly built punk902z kit. Sniff helper unit
checks pass under tclsh 9.0.3 and 8.6. punkshell project 0.13.0 -> 0.14.0.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
2 weeks ago |
|
|
2b46e2d86a |
shell tests: E3 piped-session proof of n/ namespace continuity and subshell carry-over (shellnavns.test)
New shell/testsuites/punkexe/shellnavns.test - one hang-proof punk_run piped session against the built executable in src launch mode (dev modules, so current punk::repl/nav source is exercised without a rebuild): PROVEN end-to-end: - n/ sets ::punk::nav::ns::ns_current in the running shell - the current namespace continues into `subshell punk` and back out, and the 0.5.2 stray-namespace seeding fix holds live (no phantom ns_current namespace in the subshell context) - navigation inside the subshell takes effect; the session exits cleanly (exitcode 0, no timeout, exit unwinds subshell -> parent -> terminate) FINDINGS from the E3 probes (pinned in the test with markers): - the FIRST subshell evaluates in the SAME code interp as the parent shell - the "first subshell asymmetry" already TODO-documented in repl::init. Continuity therefore manifests via shared state at shell level (SHARED marker: a variable set in the subshell is visible to the parent after exit, and the parent adopts the subshell''s final namespace). The repl::start seeding template - the carry-over mechanism for genuinely separate code interps - is proven at module level in punk/repl nscurrent.test. A G-002-style isolated subshell would flip these pins. - KNOWN GAP: piped-session submissions evaluate at :: even after n/ sets ns_current - the inscope application proven interactively and at module level does not take effect for subsequent piped submissions in this spawn shape. Root cause undetermined (piped-path evaluation vs kit/codethread interplay); flagged for investigation alongside G-038 session-context work. Verified: shell/** suite 42 total / 40 passed / 0 failed (2 gated skips) under Tcl 9.0.3. AGENTS updated (shell contracts bullet; punk/repl module index E3 reference). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
7ea1deaae5 |
G-030 achieved: make.tcl dogfoods punk::args - tabled usage, declared subcommands, -confirm prompt policy
All 15 make.tcl subcommands are punk::args-declared ((script)::punkboot + (script)::punkboot::<sub>, built from single-source summary/help/opt dicts with shared option fragments and explicit @form -synopsis). Bare make.tcl / -help, 'help ?subcommand?' and '<subcommand> -help' render tabled usage; invalid flags/subcommands raise punk::args usage errors (exit 1) with unambiguous prefix resolution; 'shell' is a declared passthrough. Prompt policy: new -confirm 0|1 (default 1) on every confirmation point (bootsupport minor-staleness gate, vfscommonupdate REPLACE, kit-type mismatch). Default prompts only on an interactive terminal and aborts fast with guidance on non-interactive stdin (::punkboot::lib::stdin_is_interactive; Tcl 8.6 lacks the -inputmode probe and is assumed interactive). -confirm 0 proceeds (staleness, REPLACE) or skips the mismatched kit. The piped-y agent workflow is retired; the old vfscommonupdate decline half-abort (printed done, exit 0) now exits 1. Degrade rule: punk::args/punk::ansi/textblock boot requires guarded; definition load caught with fallback to a self-contained scan (-k/-dirty-abort/-confirm supported) + plain punkboot_gethelp (availability NOTE factored into punkboot_availability_note, shared by both paths); rendering degrades independently of parsing (errorstyle minimal / plain help when the ANSI stack is unhealthy); PUNKBOOT_PLAIN=1 forces degraded mode. punk::args joins the bootstrap-tracked _runtime_deps staleness set (parsing contract only - the rendering stack degrades instead; contract docs updated in src/bootsupport/AGENTS.md + src/modules/AGENTS.md, workflow docs in src/AGENTS.md + src/tests/shell/AGENTS.md). Verified: usage/help/error paths, vfscommonupdate fail-fast and -confirm 0 runs with closed stdin, staleness flag route live (args 0.5.0->0.12.0 tripped the gate), degraded-mode help/check/info, full 'project -k -confirm 0' kit build. Dogfooding finding recorded in the goal file: punk::args 0.12.0 reports generic overflow where 0.5.0 reported choiceviolation for optional-choice mismatches (worked around with required leaders; candidate error-selection improvement). Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 weeks ago |
|
|
49ec22a928 |
doc: restore 'dev doc.validate' - wrap tcllib dtplite as bin/dtplite.cmd
'dev doc.validate' invokes a bare dtplite command which the repl unknown-handler resolves via auto_execok on PATH - no dtplite executable existed (only the legacy misnamed bin/dtplite_run.bat), giving "invalid command name dtplite". - src/scriptapps/dtplite.tcl: LF-converted (polyglot payloads are embedded verbatim into the LF-only multishell output); fall back to the project-vendored tcllib (src/vendorlib_tcl9/<arch>/tcllib*) when the invoking tclsh lacks the dtplite package - src/scriptapps/dtplite_wrap.toml: new scriptset config (tclsh nextshell on all platforms) - bin/dtplite.cmd: generated polyglot via punk::mix::commandset::scriptwrap::multishell (checkfile-clean, LF-only) - src/tests/shell/testsuites/binscripts/dtplite.test: artifact pins (LF-only, checkfile, byte-identical round-trip re-wrap) + execution usecases (usage error, validate good/bad file, validate directory tree, html generation) - 8/8 pass under runtests - AGENTS.md (bin, src/scriptapps): record the dtplite scriptset, its test pin and the LF-only payload requirement - punkproject.toml: 0.12.22 -> 0.12.23 Verified: 'dev doc.validate' in punk902z src validates all 64 src/doc .man files clean. The doctools pipeline remains interim - punk::args is the intended doc source of truth. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
2 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 |
3 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 |
3 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
|
3 weeks ago |
|
|
25e45e0cce |
tests: scriptexec.test for the script subcommand; scriptlib/_punktest fixtures
Adds src/tests/shell/testsuites/punkexe/scriptexec.test (12 tests, all pass) covering app-punkscript / the script subcommand (G-015): piped execution and honest exit codes, error->exit 1, exitcode propagation, stdin result echo, default-env dev alias present without boilerplate, file-form argv passing, the lib:<name> scriptlib mechanism (subpath, extensionless, bare-arg reclassification, not-found location listing), and the tclsh-matching Tk main-loop behaviour (0.4.1): a serviced after-callback runs and exits, a no-exit GUI script stays alive, an errored GUI script exits promptly without hanging. Reuses the shellexit.test built-exe harness pattern (pipe stdin, half-close for EOF, timeout+force-kill) so runs are hang-proof; Tk cases gated by an auto-detected punktk constraint (probes whether the kit loads Tk). Full shell suite: 19 pass / 2 skip (console-only punkgoals) / 0 fail. lib:/Tk cases resolve committed fixtures under scriptlib/_punktest/ - a lib:-resolvable fixture cannot live in a tcltest temp dir since resolution only searches scriptlib locations relative to the exe. The subfolder is test-owned (README + do-not-edit fixture headers); root AGENTS.md carves it out as the one agent-manageable exception to scriptlib being user-only. No project version bump - tests/docs/fixtures only, no shipped shell behaviour change. Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com |
3 weeks ago |
|
|
f0c712543a |
repl shutdown/eof fixes, PUNK_PIPE_EOF policy, console query guards, opunk::console voo class, test framework fixes
punk::repl (0.1.4):
- cancel the deferred (after idle) stdin reader registration when the repl finishes - a stale
registration could re-attach a reader to a completed repl (piped stdin racing shutdown produced
'error2 in repl_process_data: invalid thread handle ""')
- repl_process_data drops input arriving after codethread teardown instead of erroring
- repl::init constructs the process-default console object (anchored opunk::console instance
'default') and settles can_respond 1 for interactive stdin
app-punkshell:
- eof on the input channel now follows env(PUNK_PIPE_EOF): exit | interactive | unset=heuristic
(reopen console if available, else terminate) - replaces the unconditional CONIN$/dev-tty repl
restart that hung automated callers forever; documented in punk::config punk_env_vars_config
('help env')
punk::console (0.1.4):
- input_at_eof (certainty, with non-blocking probe read for deferred pipe eof) and
is_input_console_or_tty (heuristic incl. mintty-without-winpty env hints)
- get_size skips ANSI cursor-report mechanisms for non-terminal input (tput then 80x24 default)
- removed erroneous repl-restart attempts from get_ansi_response_payload eof handling (re-entrancy,
bypassed eof policy; one call was a typo repl::reopen)
- console_spec_resolve: -console (and legacy positional inoutchannels) accepts a channel pair, an
anchored opunk::console instance name, or an ::opunk::Console object value; settled can_respond 0
refuses query emission and supplies the object's default size; default_console proc + auto-attach
of the anchored 'default' instance for matching channel pairs
opunk::console (new, 0.1.0):
- voo-based -virtual class ::opunk::Console: console as an in/out channel pair with settled
capability facts; canonical instances anchored at ::opunk::console::instances::<name> with
value semantics as snapshots; subclass dispatch via slot-0 tag for future channel-environment
consoles (ssh, tk-widget terminals); added to bootsupport (with voo) for boot-level use
tests:
- src/tests/shell/testsuites/punkexe: hang-proof punk_run/punk_run_expect_alive harness; termination
guards, exitcode propagation, help-env render with piped stdin, default-console smoke test,
PUNK_TEST_GOALS-gated interactive drop-in goal tests
- src/tests/modules/punk/console: probe helper and console-spec/integration suites
- src/tests/modules/opunk/console: Console class suite incl. virtual dispatch
- runtests.tcl testinterp: 'package prefer latest' (dev 999999 alpha modules no longer shadowed by
stable bootsupport copies) and src/vendormodules on the module path (voo etc resolvable)
AGENTS: punk::args usage policy, -console migration contract, bootsupport update workflow
correction, opunk voo conventions, testinterp contracts
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
|
4 weeks ago |
|
|
43e9aee128 |
cleaner src/tests/runtests.tcl output for agents based on new -report option etc
|
1 month ago |
|
|
7fd42ff68c |
src/tests framework
|
1 month ago |