Commit Graph

25 Commits

Author SHA1 Message Date
Bastien Chanot
1f2c1cc6e7 fix(install-plugins): guarantee npm present, not just node>=22
BLK-013 fix-forward. Step 1 checked `node >=22` but never verified npm.
On a host where node was already recent, NODE_OK short-circuited the
installer and npm was never touched — yet GSD (gsd-pi) and ctx7 install
via `npm install -g`, so a missing npm made `make plugin` die Error 127
mid-run (distro `apt install nodejs` can ship npm as a separate package).

Add an unconditional npm guard right after the Node block:
corepack enable npm → distro package-manager install fallback → fatal
exit 1 with an actionable message if still absent. Happy path (npm
present) skips the whole block: zero behavior change on healthy machines.

shellcheck clean (only pre-existing SC1091 infos), bash -n OK. Fresh
npm-less apt host validation still pending. Closes TODO (a) 2026-06-30.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VeBXkDr74N9whdiJyjzyVN
2026-07-01 21:07:38 +02:00
Bastien Chanot
53bd7beee8 chore(memory): BDR-044 + LRN-083 + auto-skill-dispatch won't-build — capitalize
BDR-044: auto-skill-dispatch chantier retired won't-build — 3rd measured moot
of the session (after --help, darwin re-baseline). Cartography showed L1
(superpowers "1%->MUST invoke") already over-determines routing -> reframed
from "does it route" (yes) to DISCERNMENT; risk inverted under->over. Measured
in real fresh sessions (8 prompts/3 classes): clear->route, ambiguous->ask,
trivial->abstain — model discriminates, no over-routing. Adding L2 prose =
phantom value + degradation risk. LRN-083: subagents are an invalid instrument
for measuring main-loop spontaneous routing (SUBAGENT-STOP + delegated framing
pin to the no-route floor) — retired the 0/6 subagent RED. LRN-080 corroborated
(3-in-a-row). TODO -> won't-build. Claude composed all -> trailers (4th
application of LRN-081).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017KWG7sXg94LXX1gddCGBvM
2026-06-30 20:04:30 +02:00
Bastien Chanot
c09f2b2630 chore(memory): LRN-082 + TODO(b) moot — capitalize
LRN-082: a trigger-cleared on a multi-motif exclusion lifts only the named
motif. BDR-043 cleared BDR-015's broken-symlink ground (a) but not its
external-ownership ground (b) → the darwin re-baseline is phantom value
(would edit the gstack submodule, LRN-070; results.tsv gone anyway). TODO (b)
resolved-MOOT (not done, not open). Trailers present: Claude composed LRN-082
+ the moot note — LRN-081's own rule, 2nd application.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017KWG7sXg94LXX1gddCGBvM
2026-06-30 18:38:50 +02:00
Bastien Chanot
5d348a711f chore(memory): LRN-081 + TODO reconcile — close ritual
LRN-081: Claude commit trailers only on Claude-COMPOSED content; a commit merely staging user-authored text gets none (staging != authorship). TODO reconcile: checked L26 'Cleanup machine courante' DONE (make plugin EXIT=0 this session ran Step 8.5, fs-verified strays absent); added (a) harden install-plugins.sh Step 1 npm-via-corepack (BLK-013 fix-forward) + (b) darwin re-baseline of the 5 ex-broken skills (BDR-043). Trailers present here because Claude composed the LRN + TODO formulations (LRN-081's own rule) — unlike e591510 which staged raw user text.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-30 18:08:12 +02:00
Bastien Chanot
09200c5274 chore(memory): reconcile TODO — /release-candidate QUEUED→SHIPPED + 3 [branch] headers→DONE
/reconcile dogfood on a fresh declared↔real gap. Oracle-proven requalifications:
- /release-candidate: QUEUED→SHIPPED (SKILL.md d3d6ced, merged 0c0b748, released
  v4.0.0/tag v4.0.0); 4 subtasks [ ]→[x] (tag/SKILL.md/routing/test=real 4.0.0 fan-out).
- 3 stale [branch …] headers (minor-gate, blk-011-gsd, prune-memory-hardening)
  →[DONE]: all merged to develop + branches deleted (merge_done=YES).
Bodies left intact (historical 'why'). Registries untouched (read-only per skill).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017KWG7sXg94LXX1gddCGBvM
2026-06-30 17:43:22 +02:00
Bastien Chanot
e591510160 chore(todo): queue auto-skill-dispatch chantier (NEXT, measure-first)
Append the "Auto-déclenchement des skills par intention" chantier to TODO.md as NEXT — measure-first (twin of BDR-001 --help): behavioral RED before any design, scope bounded to clear/unambiguous intent signals. Design opens only if the RED proves value.
2026-06-30 17:20:26 +02:00
Bastien Chanot
c3ba540372 chore(memory): BDR-001 won't-build + LRN-080 + TODO requalify (--help measured non-rentable)
--help chantier ABANDONED after measurement (not built — nothing to build):
- BDR-001 append (won't-build 2026-06-30): behavioral RED, 6 reps (/web-validate
  + /harden, no instruction) → 6/6 already render help AND stop without dispatch;
  residual value = format consistency only → ROI insufficient on a solo repo.
  Original Decision/Why/Rejected intact (append-only); Index status cell updated.
- LRN-080: measure if the model already does X before adding an instruction to
  make it do X — the behavioral RED kills phantom-value additions. Links LRN-075.
- TODO: chantier requalified WON'T-BUILD (3rd state — not done, not open).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-30 16:27:04 +02:00
Bastien Chanot
01cf0a1a6e chore(memory): /reconcile shipped + queue /release-candidate
TODO: /reconcile chantier marked SHIPPED (merge aede7af, pushed); queued
/release-candidate orchestrator chantier (gitflow release verified wired
except the tag — lib/gitflow.sh L49 base, L108-111 fan-out, no git tag).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-30 14:10:18 +02:00
Bastien Chanot
6b512be9af chore(memory): capitalize /reconcile — BDR-041 + LRN-075/076/077 + EVAL-011
TODO write-back (chantier /reconcile subtasks ticked, S3 split honestly)
+ registry entries (body + Index rows) for the shipped skill.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-30 13:42:24 +02:00
Bastien Chanot
bdfa9bcbed chore(memory): reconcile TODO + queue /reconcile skill
Reconcile TODO.md against real git/fs state (not conversation memory):
- tick FINISH+PUSH prune-memory (merge 73e12be, develop==origin/develop)
- tick 3x stale [ ] Commit (working tree clean -> shipped)
- tick .gitmodules follow-up (a) (be1dcef); split (b) zenquality (other repo)
- tick doc-sync twin (BDR-036); requalify v2 Stop-hook deferred->REJECTED (BDR-037)
- keep line 26 cleanup-machine deferred (fs-verified: darwin-skill still present)
- flag --help chantier BLOCKED: contradicts BDR-001 (accepted, per-SKILL.md rejected)
Queue /reconcile skill: declared-vs-real reconciler, 4-category output, gated.
journal 2026-06-29 (cont. 4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-29 19:59:41 +02:00
Bastien Chanot
d7f76fcb45 chore(memory): LRN-073/074 + EVAL-010 — prune-memory chantier close
- LRN-073 — a skill's worked-example must use FICTIONAL ids, never live registry
  ids (they prime real-data behavior). The RED-7 root-cause lesson.
- LRN-074 — system grep/awk may be ugrep/mawk: don't assume flag-parsing, use
  /usr/bin/grep, watch the RED go red. 4th command-assumption miss this session →
  engraved as a recurring pattern-family (alongside fail-silent LRN-066/071).
- EVAL-010 — prune-memory hardening: RED-7 deterministic fix + RED-8 accept +
  34-row backfill; anomalies incl the real-time false-green catch and the near-
  collision with the existing EVAL-009 (caught by reading first).
- journal 2026-06-29 (cont. 3) + TODO chantier section; BLK-011 finish/push marked.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-29 19:29:15 +02:00
Bastien Chanot
52d4a66daa chore(memory): BLK-011 resolved + LRN-072 — fix-by-removal
- BLK-011 → resolved by REMOVAL (not by committing the orphan), with the TRUE
  reason engraved: speculatively auto-bootstrapping an unused multi-session engine
  at project creation is bad on its own terms. The initial "redundant with TODO"
  framing is explicitly marked WRONG (gsd >> roadmap; TODO != gsd ROADMAP) — a
  false reason that won't mislead a future reader. Reasoning trace kept: both
  premises refuted on read, conclusion held for the stronger reason.
- LRN-072 — a stranded-artifact bug can be fixed by NOT creating the artifact
  (negative diff), not by plumbing its commit; before building machinery, ask if
  the PRODUCING step is wanted. Speculative-at-creation -> remove; deliberate-on-
  demand -> keep. Family: BLK-010, BLK-011, BDR-036.
- journal 2026-06-29 (cont. 2) + TODO: BLK-011 line flipped, chantier section,
  MINOR-gate FINISH marked merged. Index rows updated (blockers + learnings).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-29 18:27:34 +02:00
Bastien Chanot
a335591c46 chore(memory): BDR-040 + LRN-071 + journal/TODO — MINOR-gate chantier
- BDR-040 — doc-syncer MINOR-shape oracle: deterministic floor under the LLM's
  MINOR call; engraved limit (structural/size, NOT semantic — reduction of
  RISK-1's gross cases, not elimination); option B (blocking gate) rejected
  (contradicts BDR-036); branch-guard deferred.
- LRN-071 — fail-loud must cover the helper's OWN commit, not just its inputs;
  named as the 3rd occurrence of the swallowed-commit pattern, linked to LRN-066
  + LRN-068/BLK-012; future application = audit every fallible op whose result
  gates a downstream "success".
- journal 2026-06-29 (cont.) + TODO chantier section + line-266 flip to done.
  Index rows added for both BDR-040 and LRN-071.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C6bUdvHnajCNzgVQefZowj
2026-06-29 17:41:24 +02:00
Bastien Chanot
eab4d2db3e chore(memory): BDR-039 (Option-1 protection) + TODO reconcile — gitflow chantier closed 2026-06-29 03:26:47 +02:00
Bastien Chanot
345e43731c chore(memory): BDR-036 + LRN-058..060 + EVAL-008 — doc-sync coupled close
Capitalize the doc-sync coupled chantier: BDR-036 (the invariant, 3 honesties engraved — built-not-reordered, MINOR non-gated surface-replaces-gate, init-project partial + sweep scope-expansion); LRN-058 (same bug-class != same fix — verify the twin's precondition); LRN-059 (swap flips meanings, sweep caught prior-chantier debt README:153 != letter-suffix insertion); LRN-060 (fail-closed guard proven by what it refuses, loudly; argv not separator-string); EVAL-008 (28/28 real-exec, anomalies surfaced). Journal 2026-06-27. BLK-010/011 flags + the frozen plan + TODO checkmarks. BLK-011 record left at STEP 13 (append-only); only the TODO locator moved to STEP 12 (live locator vs immutable record).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ho5EQCFTSvYamuRtVZpp2d
2026-06-27 03:22:12 +02:00
Bastien Chanot
07e846f0a6 chore(memory): BDR-034 + LRN-051/052 + EVAL-007 — coupled-capitalize v1 2026-06-26 13:27:57 +02:00
Bastien Chanot
a1cc753746 chore(tasks): annotate /validate → /web-validate in open --help pilot item
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W9sqAwZxBMZSynZoVrEJhd
2026-06-25 11:27:18 +02:00
Bastien Chanot
b03cb0b910 chore(memory): BDR-030 + LRN-042 + journal + TODO
Capitalize the install-self-sufficient / gstack-on-demand session:
- BDR-030: gstack skills activated on-demand per profile, OFF by default.
- LRN-042: npx skills add / setup resolve target relative to CWD — run
  from $HOME or artifacts land in the repo tree, unreachable by link.sh.
- journal 2026-06-23 line + TODO task block reconciled.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0169vjUD1sP9Nx4ZiCa8wvAw
2026-06-24 14:22:47 +02:00
Bastien Chanot
d4a5cfec93 chore(caveman): purge plugin + always-on integration
Disable + uninstall caveman@caveman and delete every repo dependency on
it: SessionStart/UserPromptSubmit hook blocks, standalone hook files,
settings.json enabledPlugins + marketplace entries, install-plugins.sh
STEP 5.5, update-all.sh refresh step, plugins.lock.json entry, doctor.sh
checks, lib/detect-plugins.sh helpers, lib/profile.sh + plugin-advisor +
skills/profile protected-list entries, .gitignore runtime-file block,
and README/USAGE docs. Dead /caveman:compress refs replaced with
manual/claude.ai guidance. Memory-registry terse-format convention kept
(separate subsystem). Version 3.4.0 -> 3.5.0.

On a subscription plan caveman's ~75% output-token compression has no
cost benefit, and the always-on hooks added friction on validation
gates and client deliverables.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 19:08:40 +02:00
Bastien Chanot
49a1a41b56 chore(memory): capitalize audit-delta build, darwin runs, CLAUDE.md refactor
Registry batch covering 2026-06-11/12:
- BDR-020 audit-delta design, BDR-021 CLAUDE.md restructure
- LRN-027 periodic-skill state file, LRN-028 baseline contamination,
  LRN-029 blind judges catch exception/blanket-rule contradictions
- EVAL-003 darwin run on audit-delta, EVAL-004 26-skill eval + 4-bug fix
- journal 06-11 + 06-12, TODO darwin-bugfix plan (all checked)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 16:51:13 +02:00
Bastien Chanot
f928a53ed9 fix(gstack): link spec skill, complete gitignore allowlist (BLK-007)
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) <noreply@anthropic.com>
2026-06-02 18:41:43 +02:00
Bastien Chanot
da4e6b9590 feat(profile): add gstack on|off verb to lib/profile.sh
Centralize gstack toggling in the `profile` command without losing the
active-profile label.

  - `gstack on`  re-enables ALL parked gstack skills (moves
    skills-disabled/gstack__* back) but does NOT touch .active-profile,
    so the user layers full gstack on top of their current profile and
    the statusline label is preserved. Unlike `reset`, which clears the
    label to "none".
  - `gstack off` disables gstack skills not listed in the active profile;
    errors cleanly when no profile is active (needs one to know what to
    keep).

Refactor (behavior-preserving): extract three shared helpers
`enable_all_gstack`, `disable_gstack_not_in`, `parked_gstack_count` and
rewire `cmd_reset` + `cmd_set` to reuse them instead of duplicating the
symlink-toggle loops. Wire `gstack` into main() dispatch, usage(), and the
header usage block.

Docs: SKILL.md argument-hint, examples, and output-policy updated. The
generic `make profile cmd="gstack on"` target already covers Make usage.

Verified: shellcheck CLEAN, `bash -n` OK, 6-case test (help, bad-action,
off-with-no-profile, on, off-trim, on-cycle) with final assertion that the
live symlink state was restored exactly to its pre-test value.

Memory: capitalize BDR-018 (decision), LRN-024 (DRY helper-extraction
pattern), BLK-007 (6 gstack source skills ios-*/spec unlinked post
submodule bump — open follow-up), EVAL-002 (self-eval, false "full.profile
bug" flag corrected pre-edit). Backfill index drift: BDR-017, BLK-005/006.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 18:31:48 +02:00
bastien
d694a9e0da chore(memory): capitalize BDR-007 + BDR-008 from profile system
- BDR-007: Skill profiles partition gstack by usage (v1, skill-only).
  Decision to ship lib/profile.sh + symlink-based toggle for skills,
  with plugin/MCP entries advisory in v1. Rationale: the existing
  toggle-external.sh enable|disable gstack is too coarse — it
  disables checkpoint/ship/learn alongside design skills. Profiles
  hide the irrelevant skills without uninstalling the gstack repo.
  Alternatives rejected: forking SKILL.md to strip the gstack
  preamble (re-fork on every upgrade — preamble already degrades
  gracefully via `|| true`); per-skill toggle via claude plugin
  enable/disable (gstack skills are not marketplace plugins);
  removing symlinks (lossy if user has local edits).

- BDR-008: Profile system v2 — extend to plugins + MCPs + CLIs.
  Reverses the "advisory only" stance from BDR-007 alternative #4.
  User feedback: pure-skill toggling left ui-ux-pro-max/magic always
  loaded regardless of profile, so passive token cost didn't drop
  enough on profile switch. Solution: real claude plugin enable/
  disable for an explicit MANAGED_PLUGINS allowlist (3 entries) +
  PROTECTED_PLUGINS denylist for always-on (caveman, security-
  guidance, superpowers). MCP magic delegated to toggle-external.sh.
  Other MCPs stay advisory because each needs specific config. Adds
  4 new profiles: web, seo, web-full, backend.

- Journal: 2026-05-04 entry summarizing the v1 ship, then a follow-up
  block for the v2 extension (new profiles, plugin auto-toggle, tie-
  breaker for `current`).

- TODO.md: marked done — v1 (Skill profiles) section and v2 (Profile
  system v2 — extension plugins/MCPs/CLIs) section, both with their
  full subtask lists.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 02:09:51 +02:00
bastien
f80f83ee77 feat(animation): auto-install motion lib + detection across init/onboard/advisor
Add lib/animation-lib-check.sh with detect_anim_eligibility,
is_anim_lib_installed and recommend_anim_install_cmd helpers.
Wire it into the framework:
- init-project STEP 5e: silent auto-install after scaffold validated
- onboard STEP 2.5: propose + wait for user confirmation (opt-in on
  existing projects)
- plugin-advisor PHASE 1/2/3: read-only detection only, never installs
- scaffolder PHASE 4: clarifies boundary (orchestrator owns motion install)
- design-gate filesystem signals: motion / motion-v / framer-motion /
  gsap / lottie-react / react-spring / popmotion / auto-animate

Recommends `motion` (rebranded from framer-motion in Nov 2024) for
React-family and Svelte stacks, `motion-v` for Vue 3 / Nuxt. Excludes
React Native (use react-native-reanimated), backend, embedded, Flutter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 15:32:46 +02:00
bastien
892de288fe feat(memory): introduce .claude/{tasks,memory,audits}/ governance layout
Move tasks/ into .claude/tasks/ and create .claude/memory/ with 5
persistent registries (decisions/learnings/blockers/journal/evals) plus
.claude/audits/ for audit reports. Also seed templates/memory/ for
onboarder to copy into user projects.

- tasks/TODO.md, tasks/rtk-upstream-issue.md → .claude/tasks/
- tasks/LESSONS.md deleted (empty template; superseded by learnings.md)
- .claude/memory/: 5 append-only registries with YAML schema + seed entries
- templates/memory/: 5 empty-index templates for new projects

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:06:00 +02:00