Acceptance verified on the rebuilt punk91 kit (plain script mode): recipe
'chan close stderr; open NUL w' yields a channel auto-named stderr with
working puts stderr; console+repl+libunknown suites 105/105. Detail file
archived content-identically with evidence recorded; GOALS-archive record
appended; sweep: G-101 launch-ladder item (2) rewritten to reflect
achievement (in-place stdio repair now available on the 9.1 kit), G-011
gains a recycled-stderr consumer pointer. goals_xref report shows no
orphaned shared-archived-ref bridges for G-120; goals_lint clean.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Activation: proposed->active flip (user-confirmed), goals_xref score re-run
recorded in detail Notes (nothing beyond the drafting survey).
Holder named: punk::libunknown zipfs_tm_UnknownHandler's builtin-static
shortcircuit leaked its version-probe child interp 'ptest' whenever an
UNVERSIONED package require of a true static reached the handler -
'package vsatisfies $v' with zero requirement args throws wrong#args,
skipping both interp-delete lines. The leaked non-safe child holds
registrations on the process std channels, so 'chan close stderr' left the
OS handle alive and the slot occupied; the next open got a fileN name and
puts stderr failed (punk91/tclsfe-9.1b0 only: Thread is a true static there,
punk905 loads it from a dll so the block never fires).
Fix (0.2.2): auto-named probe interp deleted in try/finally; zero-requirement
requires accept any provided static version; probe errors fall through to the
normal tm search. Disposition recorded in the goal detail: leak, fixed - not
console-ownership machinery.
Verified: bin/punk91 src script recipe yields channel auto-named stderr with
working puts stderr; libunknown+console+repl suites 105/105 pass (tclsh90).
punkproject 0.22.1 + CHANGELOG.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
Acceptance verified in full against the fixture punkbin server
(PUNKBIN_URL override): ahead/behind verdicts naming both revisions
(behind with fetch+use guidance), current annotation preserved,
pre-family no-basis note + sha1 hash-identity, no-name-fetch one-line
divergence note; ps1/bash verdict-line parity asserted per scenario;
runtimecmd roundtrip pin green; bin/AGENTS.md runtime-manager contract
records the surface. Suite evidence in the detail file's flip record.
Activation and flip both 2026-07-25 (user-directed activation; overlap
survey re-run at activation - only G-033 related, already recorded; no
new Related lines). Detail file: status achieved + activation/flip
evidence records (the goals/ -> goals/archive/ move itself rode the
previous commit as a pure 100% rename; this commit carries the flip's
content edits). Index entry moved to GOALS-archive.md. Reference sweep:
G-033's G-119 note updated to landed-state wording with the archive
path (its package-mode docs must not contradict the shipped freshness
contract on naming); goals_lint clean (83 active / 37 archived);
goals_xref report carries no G-119-bridged unlinked pairs.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
Acceptance verified in full: all 11 issue-list items dispositioned
(2026-07-24) with decided fixes landed (items 3/4/5/9 in 0.20.0, items 1/7
via the G-117-cycle patch rev, item 10 docs in 0.20.1, item 11 console test)
and items 2/6/8 documented-as-intended in the item-10 definitions; durable
doc home = punk::args::moduledoc::punkexe; tclshcmd.test 19 piped tests
green vs punk902z + punk9_beta; dorepl console-reopen path console-driven
(punkconsole gate, 21/21 with PUNK_TEST_CONSOLE=1).
Flip: detail file status achieved 2026-07-25 + flip evidence record; entry
moved to GOALS-archive.md; detail file to goals/archive/. Reference sweep:
ARCHITECTURE.md tclsh bullet marked achieved + G-118 removed from the
in-flux launch-surface list; G-031/G-032/G-077/G-120 notes updated with
archive markers and landed-state wording (G-032 now points at the shipped
punkexe moduledoc ids as its source material; G-077 notes the boundary text
to update when -e lands). goals_lint clean, architecture_lint clean,
goals_xref report carries no G-118-bridged unlinked pairs.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
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
New punk::args::moduledoc::punkexe 0.1.0: (script)::punkexe dispatch
definition (package modes, subcommand enumeration, default reclassification)
+ (script)::punkexe::tclsh full contract (stock arg-form parity incl the
deliberate no -e boundary (G-077), lib: refusal, piperepl ::tclsh state
array + env gates, intended divergences recorded per item decisions 2/6/8)
+ summary definitions for script/shell/punk/shellspy. G-032-compatible: the
launcher help/parse wiring renders from these ids later.
punk::args 0.12.7: update_definitions handles tag-prefixed id namespaces
first-class - namespace_docpackages consulted with the tagged key (usage/
real_id on registered-but-unloaded (script)::* ids no longer no-such-id),
generic tag strip for the real-namespace probes, unqualified-ns warning no
longer fires for tag ids. args/ns/repl suites 352 pass 0 fail.
punk::repl 0.5.3: code-interp setup catch-requires the punkexe moduledoc
beside tclcore (both sites) so the docs are queryable in any punk shell.
ARCHITECTURE.md: tclsh subcommand bullet in the boot/launch chain
(architecture_lint clean). punkproject 0.20.1 + CHANGELOG.
Verified: fresh-interp usage-first render (real_id path); rebuilt punk902z
kit self-carries 0.1.0 (5298-char tclsh render); piped punk session renders
(script)::punkexe with no manual require.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- GOALS.md: "Goals-system: v2" front matter; canonical "Goals system versions"
section; Scope structure rule (elements separated by '; ' at top level,
commas only inside parens/braces); Child DOX Index note in root AGENTS.md
- goals_lint.tcl: new finding for top-level commas in Scope lines
(paren/brace depth-aware)
- goals_xref.tcl: repo-local configuration via goals/xref.conf (path roots,
stop words, file extensions, reference containers, module dirs,
bare_path_roots, prefix_anchors); defaults byte-identical to previous
behaviour (verified on this tree)
- goals/AGENTS.md: cross-repo goal references drop the G- prefix; xref.conf
documented in Verification
- Scope delimiter normalisation across GOALS.md, GOALS-archive.md and all
detail files, live and archived: 224 lines, top-level commas only;
conservation verified (goals_xref report byte-identical pre/post, diff
hunks are Scope lines only). Archived tier converted under explicit user
approval; sanctioned exception recorded in GOALS-archive.md.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
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
Both payloads + rewrapped bin/punk-runtime.cmd (roundtrip pin green 9/0/1skip).
Embedded read WITHOUT executing the target: bash uses unzip's central-directory
read; ps1 uses .NET System.IO.Compression with a manual EOCD scan + prepend
offset fixup (.NET does not apply the self-extractor fixup - the pure-zip tail
is copied to a temp file and read there; delta 0 = plain zip also fine). The
cooperative probe (piping a reader into the EXECUTED target) is printed as the
documented fallback when no zip reader exists, execution caveat stated.
Report: field-by-field embedded/sidecar columns, !DISAGREE flags on shared-field
mismatches, file sha1 checked against the sidecar (!SHA1-MISMATCH), stray
renamed copies identified embedded-only, pre-v1 artifacts report sidecar-only
(schema-tolerant parsing; new Get-PunkRuntimeRecordFields helper). Verified on
the emitted v1 r2 artifacts: sidecar-agree case, renamed-stray case, pre-v1
case - ps1/bash output parity, wrapped cmd smoke under Windows PowerShell 5.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
family_artifacts.tcl: reads the embedded record back out of each finished kit
(exec with a piped //zipfs:/app/punkbin-artifact.toml reader - another
executes-self-contained proof), verifies it against the invocation (schema/
name/variant/working_name/revision/target/tcl_patchlevel/batteries - stale-
staging tripwire), and derives the sidecar's identity fields from it
(build_id/origin/packager/project/project_url/license/build_host_platform -
identical build_id by construction). Sidecar carries schema = 1, '#' comments
on the non-obvious fields, and keeps sha1/size/built as its finished-binary
additions.
family_check.tcl: new embedrecord probe (record exists in the attached image;
schema/variant/patchlevel/working_name/piperepl/batteries MATCH probed facts;
v1 fields present; -expectrev asserts revision + the -r<N> artifact name) and
the gate probe now asserts ::tclsh(reopened) publication (0 at gate-open
start, absent on plain/opt-out - G-118 item 7 patch-rev verification).
build905.zig passes -expectrev; configure-compiles clean, both tools parse.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
build905.zig kit-family: 2 shared payload trees wrap 3 kits via zipfs_mkimg.tcl,
so the per-member embedded record needs a per-kit embed argument on the wrap
tool; -Doriginurl/-Dpackager join familyrev as b.option()s. build_id fork to
decide: random-per-configure (cache-busting) vs uuid-shaped digest of stable
identity inputs (reproducible, cache-friendly) - leaning the digest.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
family_artifacts.tcl runs after kits are built, so the embed lands at kit-family
staging and emission mounts each kit exe to READ the embedded record back -
sidecar fields derive from it (identical build_id by construction; emission
inherently verifies the embed exists). sha1/size stay sidecar-only; embedded
filename namespaced per the G-025 reconciliation.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
In-source rev of tclMain_piperepl_905.c, effective at the next suite rebuild
(the G-117 cycle): the '? reopen stdin from console' notice prints only when
TCLSH_PIPEREPL_DEBUG is set truthy; all reopen-path messages (gated notice +
genuine failure messages) move from stdout to stderr; ::tclsh(reopened)
published as an unlinked fact (0 at gate-open startup, republished 1 after a
successful console reopen). 2024-era artifacts (tclMain_piperepl.c, .patch)
stay unmodified per the recovery policy.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Cross-references recorded after user-prompted overlap review (none of the four
files referenced its counterpart): G-117 embedded runtime record vs G-025
kit-layer stamp (record expected to survive kit wrap - two-layer provenance,
build_id linkage for the stamp's runtime field, namespaced filenames); G-118
item 10 refined to G-032-COMPATIBLE punk::args definitions as the docs home
(rendering/parsing/degradation stay with G-032; item-4 file-exists precedent
noted for G-032's reclassification rule); item 9 duplication interim pending
G-031; G-077 tclsh -e boundary note. G-118 Progress records items 3/4/5/9
landed (0.20.0) with verification evidence.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
- 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
New root ARCHITECTURE.md: descriptive, pointer-first map of boot/launch, interp/thread topology, console abstraction, module loading, build/provenance/kits and the test harness - own lane beside DOX (what you must do) and the goals system (what changed and why). In-flux subsystems documented as goal pointers only.
scriptlib/developer/architecture_lint.tcl validates the doc's reference contract: backticked repo paths exist, G-<id> references resolve against both goal indexes, 400-line size budget. Plain tclsh, no deps, mutation-tested.
Root AGENTS.md: Child DOX Index entry, Closeout item 5 (update-or-prune described mechanisms + run the linter), scriptlib/developer inventory.
Assisted-by: harness=opencode; primary-model=openrouter/moonshotai/kimi-k3; api-location=openrouter.ai
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
- 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
- a leading '-' argument is no longer treated as a script name: all args stay in
::argv and the subcommand proceeds to the repl (tty) or stdin evaluation
(piped), matching stock tclsh
- '-encoding name fileName' sources the script with the named encoding;
incomplete -encoding forms fall through to the argv path as stock does
- lib: scriptlib names are refused with a pointer to the 'script' subcommand
(exit 1): the tclsh subcommand keeps plain-tclsh semantics, no punk modules
- also carries the piperepl dispatch work-in-progress this session's review
validated: TCLSH_PIPEREPL gate default enabled-unless-0 (G-103 patched-runtime
policy) and the no-arg branch (tty -> tclsh repl via dorepl; piped -> read
stdin + eval with tcl_interactive/dorepl 0)
- punkproject 0.19.0 + changelog entry
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
Field report (jcross1, Windows PowerShell 5): Get-FileHash not
recognized during list -remote while Write-Host/Invoke-WebRequest
worked. Root cause class: Get-FileHash is a SCRIPT-defined function in
PS 5.1's Microsoft.PowerShell.Utility, resolved via PSModulePath
autoload - a damaged PSModulePath (pwsh7 path pollution, overridden env,
redirected user module dirs) removes it while the module's compiled
cmdlets keep working. Effects were wrong results, not just noise:
spurious UPDATE AVAILABLE rows (null local hash) and fail-closed fetch
verification.
New Get-PunkFileSha1 computes sha1 via .NET (SHA1.Create over a stream,
lowercase hex) at all three former Get-FileHash sites; works on any
PowerShell edition/state incl FIPS, and emits a one-time informational
note when the damaged condition is detected (chosen over
detect-and-offer-install/env-repair: nothing to install once the
dependency is gone, and persistent environment mutation from a fetch
tool is disproportionate). Bash payload already probes
sha1sum/shasum/sha1/openssl - unchanged. bin/AGENTS.md records the
no-script-module-cmdlets payload rule.
Verified: hash parity with Get-FileHash under powershell 5 and pwsh 7;
list -remote via the rewrapped .cmd (correct Same-version rows);
damaged-PS simulation (probe forced unresolvable): note printed once,
zero errors, hashing correct; scriptwrap roundtrip pin
runtimecmd_roundtrip PASS (payload + regenerated bin output committed
together). CHANGELOG bullet added under the in-flight 0.19.0 entry
(rides the user's pending release-notes commit).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User direction: the BAWT-shipped tclvfs 1.5.0 comes from the forTcl9
branch of the same core.tcl-lang.org/tclvfs repo our trunk ref trailed
at 1.4.2 - tcl9 suites move to it (a future suite_tcl86 keeps trunk;
recorded in sources.config). Both flows updated: sources.config ref +
build.zig.zon per-checkin tarball pin (75a2672991).
build_tclvfs_shared.zig gets the G-107 derivation treatment: every
version-derived name (package dir, dlls, rc fields, configured
vfs.tcl/pkgIndex.tcl) now follows the checkout's AC_INIT via
versionInfo() - the hardcoded 1.4.2 was the same stamped-mismatch class
as the thread 3.0.1 case. build905 consumers use the derived info
(szip staging, family staging, family_check args, artifact metadata).
forTcl9 build glue: export guard is now lowercase BUILD_vfs;
HAVE_SYS_STAT_H defined; and an include-order shim TU works around
zig's mingw headers defining __stat64 as a MACRO for _stat64 - tcl.h's
'typedef struct __stat64 Tcl_StatBuf' parsed before <sys/stat.h> binds
a forever-incomplete tag and forTcl9's direct Tcl_StatBuf field access
fails (MSVC has a real tag; upstream never sees this; -include trips
zig cc CacheCheckFailed, hence the generated-TU overlay).
Verification: all three family members PASS self-containment with vfs
1.5.0 incl the functional zip-mount round-trip; tclvfs test gate PASS
51/42/9/0 twice-deterministic - the branch CLEARED the whole 1.4.2-era
baseline (glob-nomatch drift entries now pass, network vfsFtp/vfsUrl
now skip) - baseline re-established empty. familyrev default bumped to
2 (r1 published+immutable; r2 emitted locally + staged to the runtime
store; r2 publication is a user decision). Wrapped kits confirm the
resolution skew the user found is gone: punk9bi_beta script-mode
'package require vfs' now 1.5.0 (boot loads the runtime's copy - both
tiers now agree).
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-requested audit of naive [package versions] selection: punk::apps'
appinfo 'latest' used a plain lexical lsort (misorders 1.10 vs 1.9) AND
took lindex 0 - the LOWEST version - as latest (the '#todo - natsort!'
site). Now lsort -command {package vcompare} taking the highest, with
empty (unversioned-main) entries excluded before comparison since
vcompare errors on empty operands; only-unversioned yields latest "".
Audit sweep results: every other punk-owned consumer already sorts with
vcompare (punk::lib repl/udp checks, libunknown, repl autocomplete,
loadedlib copy/promote, punk_main/project_main starkit selection - the
latter even carries the 'package versions does not always return
versions in increasing order!' warning comment); packagepreference's
uses are mappings/exact-pins, not max-picks. Naive sorts remain only in
VENDORED third-party code (tcllib doctools docidx/doctoc/doctools.tcl,
vendormodules pattern-1.2.8.tm:267) - flagged, not edited, per the
vendorlib no-edit policy. Project 0.18.9.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
User-approved draft from the publication-session design exchanges:
embed a copy of the artifact record in the attached image (embed-then-
hash ordering; sidecar + sha1sums stay the integrity authority) with a
punk-runtime 'info' action for stray/renamed binaries (zip-central-
directory read preferred over executing the target), AND harden the
record as schema v1: schema, build_id (embedded+sidecar correlation
uuid), origin (canonical repo built FOR - the timing-safe reframe of
first-published-on; mirrors preserve it), packager (declarative;
minisign noted as the verification complement), project/project_url,
license summary, build_host_platform. Emitted records gain brief toml
'#' comments for non-obvious fields (line-based consumers ignore them
by construction). Lifecycle fields deliberately rejected as repo-level
curation. Next emission after landing = r2; published r1 immutable.
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com