# G-146 Fossil binary-glob seeding for generated projects (initial commit completes) Status: achieved 2026-08-02 Scope: src/project_layouts/ (.fossil-settings payloads); src/make.tcl (thin-layout sync, if derivation chosen); src/modules/punk/mix/commandset/project-999999.0a1.0.tm (generation-time fossil commit path) Goal: a project generated from any punkshell layout completes its trailing fossil initial commit with no binary-content prompt or abort - the layout's .fossil-settings payload carries a binary-glob setting covering the binary content generation injects (layout-carried bin/sdx.kit, injected zip-based .tm modules, seeded assets). Acceptance: dev project.new from each binary-affected layout (project-0.1, plus one injection-only layout e.g basic) completes its trailing fossil initial commit cleanly (FOSSIL_HOME diverted, no binary prompt/abort); the generated project's versioned .fossil-settings carries binary-glob with the recorded value; the seeding path (hand-authored per layout vs derived via the make.tcl template refresh) is decided and documented in this file; the G-136 relationship (icon payload is binary - same abort class) is recorded. ## Context G-087's generation verifications (stages 3 and 4, 2026-07-19 - see goals/archive/G-087-thin-project-layouts.md): the trailing fossil initial commit of a punk.project-generated project aborts on binary payload content (bin/sdx.kit from the layout plus injected zip-based modpod .tm modules) because thin layouts ship no binary-glob settings; layouts without binaries commit cleanly. Deferred twice since (G-087 -> G-012 as "designated fix"; G-012 correctly scoped .fossil-settings payloads out of its inert-storage treatment - they are inert by nature, fossil reads them only at a checkout root; the missing SETTING is a different problem class). Binary sources in generated projects: bin/sdx.kit carried by the punk.project layout (project-0.1); zip-based .tm modules injected into EVERY generated project by bootsupport_inject (zip content reads as binary to fossil); the G-136 icon seed (.ico) when that goal lands. punkshell's own repo already runs binary-glob=* (versioned in .fossil-settings/, workflow-policy-only per root AGENTS.md) so binary checkins proceed without prompts. ## Approach (options - decision recorded in the work) - Value: binary-glob=* (mirror punkshell's own - generated projects own their binary policy) vs a narrow glob (*.tm, bin/*.kit, *.ico - tighter, but maintained as payload classes grow). - Seeding path: hand-authored per-layout .fossil-settings payload vs derived from punkshell's own .fossil-settings/binary-glob via the G-012 template-refresh machinery (a second derived payload class after gitignore.in). ## Decisions (2026-08-02) - Value: binary-glob=* (with an explanatory comment header). A narrow glob would need maintenance every time a payload class grows, and the failure mode of a stale narrow glob is exactly the generation-time abort this goal removes; * also pre-covers the G-136 icon seed (.ico is binary-class). Generated projects own their policy and can tighten later. - Seeding path: hand-authored per-layout payload. Derivation from punkshell's own .fossil-settings/binary-glob (the G-012 gitignore.in pattern) was REJECTED as semantically wrong, not just unnecessary: punkshell's own glob is repo policy that may legitimately narrow in a G-004-era binary-free tree, while the generated-project value must keep covering the binary content generation injects regardless - the two values only coincidentally agree today. No make.tcl change (the Scope's "if derivation chosen" arm was not taken; the existing modpod payload sync already carries .fossil-* as layout content unchanged - make.tcl sync_layouts, exclude override). - Coverage: all four vendor/punk layouts seeded uniformly (project-0.1 and minimal already had .fossil-settings/ dirs; basic and sample-0.1 gained them, carrying only the two new glob files). Derived (name@base) and custom-tier layouts inherit via the overlay chain, so every layout the store can compose generates with the settings. - CRLF companion (finding): with the binary abort fixed, a SECOND abort class surfaced behind it - fossil's CRLF prompt on injected bootsupport content (src/bootsupport/modules/voo-1.0.0.tm arrives with the generating shell's CRLF endings; binary-glob=* does NOT suppress the CRLF warning class - measured, consistent with the 2026-07-15 tablelist observation in punkshell's own tree). The layouts' crlf-glob (previously src/embedded/* only, and absent from basic/sample-0.1) is now a uniform payload covering src/embedded/*, src/bootsupport/* and bin/* - the trees whose content the project owner does not author. crlf-glob=* was considered and rejected: unlike the binary case, keeping fossil's CRLF warning on owner-authored files is useful (punkshell's own posture is the same: narrow crlf-glob, wide binary-glob), and the covered payload trees are structurally confined (injection targets bootsupport only; bin/ carries layout-shipped utilities). ## Progress - 2026-08-02 baseline reproduced (pre-fix): dev project.new g146p1 -layout punk.project with HOME/FOSSIL_HOME diverted ends with 'Commit anyhow (a=all/y/N)?' EOF-aborting: "Abandoning commit due to binary data in ./bin/sdx.kit" -> "fossil commit ... FAILED"; generated project had no .fossil-settings/binary-glob. (First-of-N abort: with binary covered, the voo-1.0.0.tm CRLF abort was next - see Decisions.) - 2026-08-02 landed: .fossil-settings/binary-glob (commented *) in all four vendor/punk layouts + uniform crlf-glob (src/embedded/*, src/bootsupport/*, bin/*) replacing the two src/embedded/*-only copies and absent-in-basic/sample files. No code changes: project.new already installs layout .fossil-settings into generated projects (project-999999.0a1.0.tm, exclude-override install), and make.tcl's store->modpod sync already carries .fossil-* (verified: modpod punk.project copy received both files byte-identical on the next 'make.tcl modules'). - 2026-08-02 acceptance verification (bin/punk91 src script driver, fresh scratch base per run under c:/T/g146/ with exactly one .fossils subdir, HOME+FOSSIL_HOME diverted, piped stdin so any prompt aborts): - punk.project -> g146p1: "fossil commit ... OK", '-done-' reached; 342 files in the initial commit including bin/sdx.kit and injected zip-based src/bootsupport/modules/modpod-0.1.5.tm; all five .fossil-settings files tracked; post-commit 'fossil changes' and 'fossil extras' both empty. - punk.basic (injection-only layout) -> g146b1: commit OK; 251 files including the injected zip-based modpod-0.1.5.tm (confirming basic is binary-affected through injection alone); binary-glob + crlf-glob tracked; changes/extras empty. - punk.minimal and punk.sample-0.1: commit OK, binary-glob present, changes/extras empty (beyond-acceptance coverage). - 'fossil test-commit-warning' in the interim (binary-glob-only) punk.project checkout enumerated exactly one remaining would-warn file - voo-1.0.0.tm CRLF - confirming the seeded binary-glob silences the whole binary class. - MEASURED: fossil honours the checkout-root versioned settings files at the very first commit while they are still uncommitted adds - the seeding works with no ordering caveat. - Layout machinery unaffected: materialize testsuite 25/25 PASS (runtests materialize.test, native tclsh90); goals_lint clean. - Agent E2E driver traps (recorded for reuse; driver in the session scratchpad): scratch base path must be [file normalize]d - a lowercase c:/ drive letter presents the same .fossils folder as two repodb candidates and the chooser prompt aborts under piped stdin; the script must package require punk::mix::commandset::module as well (default -modules creates a project module) alongside cap/templates/cli/layout/project. - G-136 relationship (per acceptance): the icon seed is binary-class payload; the seeded binary-glob=* covers it the moment G-136 lands - its acceptance no longer hits the abort class this goal removed. - 2026-08-02 acceptance met in full; flipped achieved and archived (index entry to GOALS-archive.md, detail file to goals/archive/). Live-tier reference sweep: no pending-tense G-146 references existed outside the index entry itself. ## Related - G-136 (icon seeding injects binary .ico assets - its acceptance hits the same abort without this goal's setting; coordinate) - G-086 (light layout - generated light projects carry the same injected-.tm binary class; its .fossil-settings needs the setting too) - G-027 (pull updates - the seeded setting becomes pull-updatable infrastructure payload once the pull channel exists) - G-114 (per-platform tm roots - binary .tm segregation shares the "zip .tm reads as binary" classification fact) - G-047 (deliberate non-overlap: seeds punkproject.toml workflow defaults, not .fossil-settings; recorded because both seed layout payload) - G-087, G-012 (archived - origin of the finding; inert-payload machinery this goal's derivation option rides) Overlap survey 2026-08-01 (goals_xref paths src/project_layouts .fossil-settings src/make.tcl src/modules/punk/mix/commandset/project-999999.0a1.0.tm + report unlinked list): relationships as above; G-031 (layout payload, no binary content) and the project-commandset path-anchor hits (G-016 G-014 G-066 G-063 G-067 G-022) surveyed - no relationship. Activation-freshness survey 2026-08-02 (goals_xref score G-146, re-run at the user-directed activation): all pairs at/above 0.35 already carried in Related above; the remaining hits (G-034, G-089, G-101, G-065, G-020) are path-anchor/term-only coincidences (shared project.tm path or the bare term 'binary') with no goal relationship - nothing new to record. No goal drafted since the 2026-08-01 survey scores against this one.