From f928a53ed91b3cc7276025ab920f19daf60f31bf Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Tue, 2 Jun 2026 18:41:43 +0200 Subject: [PATCH] fix(gstack): link spec skill, complete gitignore allowlist (BLK-007) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A gstack submodule bump added `spec` (v1.47) and the iOS device-farm 5-skill set (v1.43) but gstack `./setup` was never re-run, leaving all 6 as source-only — unlinked, invisible to Claude and untouched by reset/`gstack on`. - Link `spec` only, surgically: skills/spec/SKILL.md symlink matching gstack setup's per-skill pattern (real dir + absolute SKILL.md link). Platform-agnostic, useful planning skill. Added to full + web-full profiles (must be in the active `full` profile or `set full` would re-disable it). - iOS skills deliberately NOT linked: this is a Linux host, and the iOS device-farm needs a Mac daemon + Tailscale + physical iOS devices. Linking them would add 5 dead skills plus passive token cost. - Complete the .gitignore gstack allowlist: add the 12 entries missing from it — `spec`, the 5 `ios-*` (so they stay ignored if a future setup on a Mac materializes them), and 6 already-parked skills (document-generate, landing-report, scrape, setup-gbrain, skillify, sync-gbrain). The parked ones matter because `gstack on` moves parked skills into skills/, where any allowlist gap becomes untracked git noise. Also drop the stale `skills/checkpoint` entry (renamed to context-save). Verified: `profile show full`/`web-full` report spec enabled; the source-vs-allowlist drift check is now empty; profile.sh still parses. The gstack submodule pointer bump itself is left uncommitted (separate pending work). Memory: BLK-007 -> resolved; LRN-025 (gitignore allowlist must cover all toggleable skills incl. parked, else enabling one = git noise). Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/memory/blockers.md | 7 ++++--- .claude/memory/journal.md | 2 ++ .claude/memory/learnings.md | 12 ++++++++++++ .claude/tasks/TODO.md | 2 +- .gitignore | 16 +++++++++++++++- lib/profiles/full.profile | 1 + lib/profiles/web-full.profile | 1 + 7 files changed, 36 insertions(+), 5 deletions(-) diff --git a/.claude/memory/blockers.md b/.claude/memory/blockers.md index 54fa7db..e2203bb 100644 --- a/.claude/memory/blockers.md +++ b/.claude/memory/blockers.md @@ -26,7 +26,7 @@ rules: | BLK-004 | 2026-05-20 | `/ship-feature` wrapper at `~/.claude/commands/` points to deleted agent files post-refactor | resolved | | BLK-005 | 2026-05-21 | gstack submodule rename (checkpoint→context-save) breaks profile entries | resolved | | BLK-006 | 2026-05-21 | `profile.sh current` false-negative via `~/.claude` symlink (`cd` not `cd -P`) | resolved | -| BLK-007 | 2026-06-02 | 6 gstack source skills (ios-*, spec) unlinked post-bump — invisible to profiles + `gstack on` | open | +| BLK-007 | 2026-06-02 | 6 gstack source skills (ios-*, spec) unlinked post-bump — invisible to profiles + `gstack on` | resolved | --- @@ -91,5 +91,6 @@ rules: - **Date**: 2026-06-02 - **Friction**: `skills-external/gstack/` has 53 source skills; 6 (`ios-clean`, `ios-design-review`, `ios-fix`, `ios-qa`, `ios-sync`, `spec`) exist ONLY as source — NOT symlinked into `skills/` (enabled) nor `skills-disabled/gstack__*` (parked). So invisible to Claude AND untouched by `reset`/`gstack on` (both operate on parked `gstack__*` only). Surfaced while adding `gstack on|off`: `comm` of gstack source vs `full.profile`. - **Real cause**: gstack submodule bump added new skills; gstack's own `./setup` (source of truth for per-skill symlinks per link.sh) not re-run → symlinks never created. Same lifecycle gap class as [[toggle-external-source-only-state]] (LRN-007). NOT a `full.profile` bug — full curated by design (BDR-017 caveat: "full excludes rarely-used gstack skills"). Initial "full omits ios = bug" flag was WRONG, self-corrected (see EVAL-002). -- **Solution**: re-run gstack setup to link new skills, then reconcile profiles (decide if iOS skills belong in web/dev profiles — likely NOT). Per [[gstack-rename-profile-audit]] (LRN-022): diff `skills-external/gstack/` vs `lib/profiles/*.profile` after every submodule bump. NOT auto-fixed — gstack installer domain + iOS-in-web judgment call. -- **Status**: open. Low impact (skills unused today, never linked). Next: run gstack `./setup`, audit profile membership. +- **Solution applied** (NOT full `./setup` — surgical, no side effects): (1) Linked `spec` only — `mkdir skills/spec` + `ln -snf /skills-external/gstack/spec/SKILL.md skills/spec/SKILL.md`, matching gstack setup:440-476 (per-skill real dir + SKILL.md symlink, name from frontmatter). (2) Added `spec` to `full.profile` + `web-full.profile` planning sections (must be in active profile `full` else `set full` re-disables it). (3) iOS 5 skills deliberately NOT linked — Linux host, device-farm needs Mac daemon + Tailscale + iOS devices = dead skills + token cost. (4) Completed `.gitignore` gstack allowlist: added all 12 missing (`spec`, 5 `ios-*`, 6 parked `document-generate/landing-report/scrape/setup-gbrain/skillify/sync-gbrain`), removed stale `checkpoint` (BLK-005 rename). Reason: `gstack on` (BDR-018) moves parked skills into `skills/` — any gstack skill missing from allowlist = untracked git noise on enable. +- **Verified**: `profile show full`+`web-full` → spec enabled; allowlist drift recheck EMPTY; spec skill now visible to Claude. +- **Status**: resolved. iOS = intentional exclusion (re-linkable via gstack `./setup` on a Mac). See [[gstack-gitignore-allowlist-completeness]] (LRN-025). diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index dbab82b..cd749b9 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -137,3 +137,5 @@ rules: - Corrected own false flag: full.profile omitting ios-*/spec is curation by design (BDR-017 caveat), NOT a bug — caught before any edit. Surfaced real gap: 6 gstack source skills unlinked post-submodule-bump → BLK-007 (open, gstack ./setup domain, not auto-fixed). - Backfilled index drift: decisions (BDR-017), blockers (BLK-005/006). - BDR-018 + LRN-024 + BLK-007 + EVAL-002 capitalized. +- Treated BLK-007 (resolved). Root: gstack submodule bump added `spec` (v1.47) + iOS device-farm 5 skills (v1.43); gstack `./setup` not re-run → 6 source-only, unlinked. Decision: linked `spec` only (surgical symlink matching setup:440-476), added to `full`+`web-full` profiles; iOS NOT linked (Linux host, needs Mac daemon+Tailscale = dead skills). Completed `.gitignore` gstack allowlist (12 missing added incl. 6 parked that would noise on `gstack on`, stale `checkpoint` removed). Verified: spec enabled, allowlist drift EMPTY, profile.sh parses. +- LRN-025 capitalized — `.gitignore` allowlist must cover ALL toggleable gstack skills (parked too), else `gstack on` surfaces untracked symlinks; reconcile profiles + gitignore + link/no-link per platform after every submodule bump. diff --git a/.claude/memory/learnings.md b/.claude/memory/learnings.md index 879ae6a..3934183 100644 --- a/.claude/memory/learnings.md +++ b/.claude/memory/learnings.md @@ -41,6 +41,7 @@ rules: | LRN-018 | 2026-05-12 | Darwin eval subagents drift on total math — recompute in main thread | any subagent-driven SKILL.md rescore | | LRN-019 | 2026-05-15 | Deployable-project doc split: README dev-quickstart + DEPLOY 14-section prod-VPS topology | any onboard/doc-syncer/scaffold producing docs for a deployable project | | LRN-024 | 2026-06-02 | New sibling command sharing logic → extract helper + refactor existing caller, never copy-paste; assert pre/post state equality | adding a subcommand/branch reusing logic inline in a peer command | +| LRN-025 | 2026-06-02 | `.gitignore` gstack allowlist must cover ALL toggleable skills (incl. parked) — else enabling one = untracked git noise | any toggle that moves local-symlink skills into a tracked dir; post-submodule-bump reconcile | --- @@ -371,3 +372,14 @@ rules: - **Key trick**: when mutating shared resource (symlinks, files, db), verify refactor by asserting `final_state == original_state` after a round-trip, not just "command exited 0". - **Applies to**: any new subcommand/branch reusing logic inline in a peer command — extract first, refactor existing caller, then add new caller. shellcheck after. - **Reference**: BDR-018, `lib/profile.sh` enable_all_gstack/disable_gstack_not_in/parked_gstack_count. Linked to [[gstack-on-off-verb]] (BDR-018). + +--- + +## LRN-025 — gstack `.gitignore` allowlist must cover ALL toggleable skills, not just currently-enabled ones + +- **Date**: 2026-06-02 +- **Pattern**: gstack per-skill symlinks are local (regenerated by gstack `./setup`), kept out of git by an explicit `.gitignore` allowlist (`skills/` per skill). Parked skills hide in `skills-disabled/` (blanket-ignored), so a skill missing from the allowlist looks harmless — UNTIL `profile reset` / `gstack on` (BDR-018) moves it into `skills/`, where it surfaces as an untracked symlink (git noise, risk of accidental commit). Found 6 parked skills (`document-generate`, `landing-report`, `scrape`, `setup-gbrain`, `skillify`, `sync-gbrain`) + 6 new unlinked (`spec`, 5 `ios-*`) all absent from the allowlist. +- **Why matters**: allowlist completeness is invisible until a toggle exercises it. The `skills-disabled/` blanket-ignore masks the gap for parked skills. +- **Applies to**: any system where a local-only (gitignored) artifact gets MOVED into a tracked dir by a toggle. Allowlist/ignore rules must enumerate the artifact's BOTH states (parked + active). After a gstack submodule bump, reconcile THREE surfaces, not two: `lib/profiles/*.profile` (LRN-022) **AND** `.gitignore` skills allowlist **AND** decide link/no-link per skill (platform relevance — iOS skills are Mac-only). +- **Detect**: `comm -23 <(gstack source skill names) <(grep '^skills/' .gitignore | sed 's#skills/##')` should be empty after any bump. +- **Reference**: BLK-007, `.gitignore` gstack section. Linked to [[gstack-rename-profile-audit]] (LRN-022), [[gstack-on-off-verb]] (BDR-018). diff --git a/.claude/tasks/TODO.md b/.claude/tasks/TODO.md index 52b2c79..6f78e27 100644 --- a/.claude/tasks/TODO.md +++ b/.claude/tasks/TODO.md @@ -10,7 +10,7 @@ - [x] Doc : SKILL.md argument-hint + exemples + output-policy (Makefile générique suffit) - [x] shellcheck propre + tests (help/bad-action/none-error/on/off cycle) — état live restauré exact - [x] Investigué "fix" full.profile : PAS un bug — curation par design (BDR-017 caveat). Aucun fix code. -- [ ] FOLLOW-UP (BLK-007) : 6 skills gstack source (ios-*, spec) unlinkés post-bump → re-run gstack ./setup + reconcilier profils (iOS dans profils web ? probablement non) +- [x] FOLLOW-UP (BLK-007 résolu) : linké `spec` (symlink chirurgical) + ajouté à full/web-full ; iOS NON linké (Linux, besoin Mac+Tailscale) ; `.gitignore` allowlist gstack complété (12 ajouts + checkpoint stale retiré) → `gstack on` git-clean ; LRN-025 capitalisé - [x] Capitalize : BDR-018, LRN-024, BLK-007, EVAL-002, journal 2026-06-02 + backfill index (BDR-017, BLK-005/006) ## README.md overhaul diff --git a/.gitignore b/.gitignore index 03f22ea..3691037 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ skills/benchmark skills/browse skills/canary skills/careful -skills/checkpoint skills/codex skills/connect-chrome skills/cso @@ -45,6 +44,21 @@ skills/context-restore skills/context-save skills/make-pdf skills/plan-tune +skills/spec +skills/document-generate +skills/landing-report +skills/scrape +skills/setup-gbrain +skills/skillify +skills/sync-gbrain +# iOS device-farm skills (need a Mac daemon + Tailscale + iOS devices) — +# not linked on this Linux host; ignored so they stay out of git if a +# future gstack setup on a Mac host materializes the symlinks. +skills/ios-clean +skills/ios-design-review +skills/ios-fix +skills/ios-qa +skills/ios-sync # External skill symlinks — auto-created by link.sh skills/emil-design-eng diff --git a/lib/profiles/full.profile b/lib/profiles/full.profile index 4cf7b1e..7c5168b 100644 --- a/lib/profiles/full.profile +++ b/lib/profiles/full.profile @@ -10,6 +10,7 @@ plan-eng-review plan-design-review plan-devex-review autoplan +spec # === Design pipeline ================================================= design-shotgun diff --git a/lib/profiles/web-full.profile b/lib/profiles/web-full.profile index 7be1836..836d263 100644 --- a/lib/profiles/web-full.profile +++ b/lib/profiles/web-full.profile @@ -18,6 +18,7 @@ setup-browser-cookies # === Plan-mode reviews ================================================ plan-ceo-review plan-eng-review +spec # === Code work ======================================================== feat personal