Browse Source
New goal (user-approved wording): 'make.tcl bakelist' gains per-kit payload/ runtime freshness verdicts answering "would a rebake change this kit?" without baking - punkkit-stamp.toml schema 2 records content digests of each kit's assembly inputs (payload vfs manifests via the assembler's existing per-entry CRCs, runtime artifact digest, resolved mapvfs declaration, bake schema) and bakelist compares them against the current tree. Verdicts degrade per kit to 'n/a (<reason>)' (pre-digest stamp, unreadable container, mk4 driver unavailable) without aborting the listing; zip kits read pure-Tcl via punk::zip, mk4 kits only where a metakit driver loads. Context records the existing deployed column's real (narrower) role: deploy-hop integrity for the locked-exe trap. Related: G-131, G-158, G-023, G-147, G-137. goals_lint clean; overlap survey (goals_xref paths + score) recorded in Notes. Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.commaster
2 changed files with 73 additions and 0 deletions
@ -0,0 +1,69 @@
|
||||
# G-162 bakelist input-freshness: content-digest kit stamps and would-a-rebake-differ verdicts |
||||
|
||||
Status: proposed |
||||
Scope: src/make.tcl (bake stamp writer, bakelist report, digest/cache helpers); src/modules/punk/buildinfo-999999.0a1.0.tm (surface new stamp fields); src/vfs/ (payload trees as digest inputs); src/runtime/ (runtime artifacts and mapvfs.toml as consumed inputs); src/tests/shell/testsuites/punkexe/ (freshness pin) |
||||
Goal: 'make.tcl bakelist' answers "would a rebake change this kit?" without baking: the bake records content digests of each kit's assembly inputs (payload vfs trees, runtime artifact, resolved mapvfs declaration, bake/assembler schema) in the deterministic punkkit-stamp.toml, and bakelist compares those against the current tree to report a per-kit input-freshness verdict (payload and runtime) alongside the existing deploy-state column - so a pulled or locally-promoted change to any input surfaces as 'stale' before anyone bakes. |
||||
Acceptance: on a checkout where payload content consumed by a kit changed since that kit's last bake (e.g. one file modified under src/vfs/_vfscommon.vfs), 'make.tcl bakelist' reports that kit's payload verdict as stale without performing a bake, and reports current after a rebake; a runtime-store artifact differing from the stamped runtime digest is reported stale on the same terms; verdicts degrade per kit to 'n/a (<reason>)' - no deployed copy, pre-digest stamp schema, unreadable container, container driver unavailable - and a single unreadable kit never aborts or blanks the rest of the listing; zip kits are read pure-Tcl (punk::zip, no mount) on all supported build tclsh runtimes, mk4 kits are read when a metakit driver is loadable in the build interp and report n/a otherwise; stamps stay deterministic (identical inputs yield byte-identical stamp content across rebakes); a punkexe pin covers stale-detect, rebake-to-current and n/a degradation for at least one zip kit. |
||||
|
||||
## Context |
||||
|
||||
The existing bakelist 'deployed' column (G-121, archived) byte-compares src/_bake/<kit> |
||||
against bin/<kit> - a deploy-hop integrity check whose real target is the locked-exe |
||||
trap (bake exits 0 but the bin copy is skipped while a running shell holds the exe). |
||||
It says nothing about whether the bake product itself is stale relative to the tree: |
||||
after a git pull or a local vfscommonupdate, nothing reports that a rebake would |
||||
produce a different kit (user question 2026-08-03). |
||||
|
||||
The inputs are already well-defined and mostly fingerprinted: mapvfs.toml declares each |
||||
kit's vfs set and runtime (G-024/G-115, archived); the zip assembler computes a CRC32 |
||||
for every payload entry during assembly, so a payload digest (hash over the sorted |
||||
{relpath size crc} manifest) is nearly free at bake time; runtime artifacts carry |
||||
sha1/size in their G-117 sidecars (archived); punkkit-stamp.toml (G-025, archived) is |
||||
the deterministic in-kit stamp seam and punk::buildinfo already reads it (its |
||||
live_vs_stamp verdict is project_version-granular only). Bake-side determinism work |
||||
(G-031, archived) deliberately keeps time facts out of payloads. |
||||
|
||||
Comparison must be manifest/digest-based, not whole-file byte comparison: zip entries |
||||
carry source mtimes, so a rebake after a pull can differ byte-wise even with identical |
||||
content. Current-side digest cost is a walk+CRC of the consumed vfs trees (sub-second |
||||
cold; a {path size mtime}->digest cache brings the warm path to milliseconds, computed |
||||
once per vfs and shared across kits). |
||||
|
||||
## Approach |
||||
|
||||
- punkkit-stamp.toml schema 2: add per-input digests (one per consumed vfs tree, |
||||
runtime artifact digest from/alongside the G-117 sidecar, resolved mapvfs declaration |
||||
digest, bake/assembler schema version). No volatile fields (determinism preserved). |
||||
- bakelist: compute current-side digests with a warm cache; read the deployed kit's |
||||
stamp per container type - zip via punk::zip central-directory member extraction |
||||
(pure Tcl, no zipfs mount, works on all build tclshs), mk4 via mk4vfs/Mk4tcl only |
||||
when loadable; anything else (or failure at any step) degrades that kit's verdict to |
||||
'n/a (<reason>)' without affecting other rows. |
||||
- New column semantics: payload current|stale|n/a, runtime current|stale|n/a; the |
||||
existing deployed column is unchanged. |
||||
- Out of scope (possible follow-ons): upstream pipeline-hop verdicts (mint-pending, |
||||
promotion-pending - derivable from punkcheck records); a -deep dry-run-assembly |
||||
oracle for assembler-behaviour changes (the stamped bake schema version covers the |
||||
common case); punk::buildinfo content-granular live-vs-source verdict (this goal |
||||
only surfaces the new stamp fields in its report). |
||||
|
||||
## Notes |
||||
|
||||
- Related: G-131 (one runtime, either payload - container autodetection) - shares the |
||||
zip/mk4 container axis; the stamp reader's per-container dispatch should align with |
||||
its detection conventions. |
||||
- Related: G-158 (punk86-kit parity on the suite-built mk4 head) - mk4 kits are the |
||||
live exercise of the driver-unavailable n/a path. |
||||
- Related: G-023 (version-named punk binaries) - sibling surface: both shape bakelist |
||||
rows and bin/ naming; no dependency either direction. |
||||
- Related: G-147 (libfetch revision check) - sibling read-only freshness-report |
||||
pattern (server revisions for lib artifacts vs local input digests for kits). |
||||
- Related: G-137 (kit version resources via punkres) - sibling bake-time kit-stamping |
||||
surface at the same make.tcl seam; its PE-resource stamping mutates the exe prefix |
||||
after assembly, which is compatible with this goal's determinism claim (stamp |
||||
content only, not whole-kit bytes). |
||||
- Overlap survey 2026-08-03: goals_xref paths src/make.tcl + buildinfo + src/runtime + |
||||
src/vfs, plus score G-162 unlinked review; live intersections named above. |
||||
Judged non-overlapping for this goal's mechanism: G-005/G-006/G-141 |
||||
(runtime provisioning) and G-065 (declarative vendoring - a producer of payload |
||||
changes this goal would report, no mechanism overlap). |
||||
Loading…
Reference in new issue