Commit Graph

230 Commits

Author SHA1 Message Date
Bastien Chanot
493b6b904e docs(claude-md): consolidate design routing
Design routing was split across 3 places (Skill-routing entries, the
Design gate paragraph, and the Design work section). Collapse the 3
skill-routing design entries to one renvoi; move the Design gate into
"## Design work — full toolchain"; mark that section the single source.
No rule lost — gate preserved verbatim, just relocated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 20:09:00 +02:00
Bastien Chanot
a06b6d718f chore(memory): capitalize LRN-032 + LRN-033 + BDR-024
LRN-032: rule has a domain — applying it out-of-domain = category error;
check artifact class before invoking (80-char rule = source-code, not CLI
output). Cross-ref LRN-031 (paired meta-lessons on not applying mechanically).
LRN-033: multibyte separator breaks printf %-Ns byte-padding; pad via ${#}.
BDR-024: show --plain = claude-free parse contract for the upcoming design gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 20:03:34 +02:00
Bastien Chanot
5776195eb6 feat(profile): list counters + grouped show + --plain parse mode
list: ITEMS column with compact per-category counts (e.g. 12s·1p·1m·1c),
left block aligned; full descriptions kept (CLI output, not 80-strict).
show: grouped by type (gstack/external/personal/plugin/mcp/cli) with
status; redundant per-line TYPE column and plugin marketplace suffix dropped.
show --plain: parsable "type<TAB>name" list, no status, zero claude calls —
the contract for the upcoming design gate. All derived from .profile files.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 19:59:19 +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
7403c658d2 chore(memory): capitalize BDR-023 + LRN-031
BDR-023 — merge /close into /capitalize (2 modes + TODO reconcile), /close
now a thin alias. LRN-031 — a skill earns complexity only on gate +
anti-noise + determinism, not by re-coding what a capable agent does free;
if the RED baseline passes, harden the fixture. Journal 2026-06-19.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 18:48:13 +02:00
Bastien Chanot
765e9d78b1 refactor(capitalize): trim PASS A to the restraint rule + flag untested gate
PASS A done-detection was ~60% machinery a capable agent already does for
free (the baseline checked done tasks and left the umbrella task alone
unaided). Cut the git-command how-to and worked example; keep only the
load-bearing restraint rule (flip only on a clean task<->commit map;
partial/umbrella/vague stay unchecked; never guess).

Add a Red flag: the STEP 3 gate STOP was never exercised (non-interactive
build harness printed the gate then proceeded as approved) — confirm it
halts before any write on first real use. TDD note records the same caveat.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 18:17:45 +02:00
Bastien Chanot
be0f047f04 docs: sync routing after merge
Reflect the /close → /capitalize --ritual merge in the session-loaded routing
table (CLAUDE.md) and the README/USAGE command tables: capitalize now also
reconciles .claude/tasks/TODO.md, --ritual adds the end-of-session reflection,
and /close is documented as an alias. Does not touch the in-progress caveman
purge edits in these files (left unstaged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 18:05:05 +02:00
Bastien Chanot
9dc2b83f0e feat(capitalize): merge /close into /capitalize + TODO reconcile
Two-mode capitalize: default pre-wipe flush, --ritual adds the 3-question
end-of-session reflection (now deduped, unlike legacy /close). New STEP 2B
reconciles .claude/tasks/TODO.md — PASS A done-detection (only on an
unambiguous task<->commit map), PASS B explicit-only capture with an
anti-noise filter (never track commit/deploy/push/release/tag) and BDR
routing for orientation directives. STEP 3 gate gains a separate TODO block;
journal/handoff report TODO ops. /close becomes a thin alias for
/capitalize --ritual (zero duplicated logic).

Built via superpowers:writing-skills TDD: RED baseline (no skill) folded a
push/tag parasite into the TODO, invented a subtask, and wrote with no gate;
GREEN re-run on the same fixture stops at the gate, drops both dups (footer
shows existing IDs), logs one learning, checks only the cleanly-done task,
ignores the parasite, and routes the GraphQL directive to BDR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 18:00:51 +02:00
Bastien Chanot
a4e0425581 docs: sync README/USAGE/CHANGELOG (doc-syncer clean run)
- README: make-update comment, +6 skill rows (/close /harden /validate
  /geo /client-handover /profile), scope note corrected
- USAGE: caveman in always-on, /geo split in decision tree + tables,
  +6 skill rows, /ship-feature 8→9 steps
- CHANGELOG: doc-syncer ROADMAP sync-only note
- CLEAN proposals rejected: Standard-Readme is a public-lib convention,
  not fit for a personal config repo distributed by clone

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3e8LaH2vymmxyh36h3jFU
2026-06-19 15:15:21 +02:00
Bastien Chanot
35536bf1ed feat(doc-syncer): sync-only ROADMAP handling + shipped reconciliation
Teach doc-syncer to sync an existing ROADMAP.md without ever creating one.

- ROADMAP absent → propose nothing; never bootstrapped (creation belongs
  to init/onboard skills). Never enters DOC_MISSING, never a CREATE
  candidate.
- ROADMAP present → standard drift detection plus 'shipped reconciliation':
  a planned/unchecked item proven delivered by CODE + git is proposed for
  the shipped/done section (or checkbox), preserving wording. [AUTO] when
  the item-to-code mapping is obvious, [HUMAN] when it needs judgment.
  One direction only (planned -> shipped); never invent planned items.
- Forbid reading .claude/tasks/ (or any .claude/) to populate or check
  ROADMAP; shipped status is deduced from code/git only.
- Numeric incoherence (e.g. a '22/22' milestone matching no code counter)
  is surfaced as a [HUMAN] question, never overwritten with a guess.

Implements BDR-022's read-only .claude/ boundary for the ROADMAP case.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 12:39:18 +02:00
Bastien Chanot
f4e5bf425c docs: sync README/USAGE/CHANGELOG (doc-syncer clean run)
Run /doc clean over the public docs and apply the verified items.

- README: drop the unused CONTEXT7_API_KEY step from fresh-install (the
  var is never read; add an optional ctx7 setup section), complete the
  Makefile target table (+link, onboard, profile×3), add personal-skill
  rows (audit-delta, capitalize, prune-memory, pdf-translate) with a
  scope note, link CHANGELOG.md.
- USAGE: add audit-delta / capitalize / prune-memory to the decision
  tree, the quick-decision table, and the command reference, plus a
  scope note about plugin/marketplace skills.
- CHANGELOG: add a Keep-a-Changelog [Unreleased] section with a drafted
  (review-flagged) summary of changes since 3.4.0.

GSD notation left unchanged: gsd --help confirms both 'gsd <cmd>' (CLI)
and '/gsd <cmd>' (in-TUI) are valid, so no blanket rewrite. CHANGELOG
[Unreleased] is a draft for human review, not exhaustive.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 12:39:18 +02:00
Bastien Chanot
e631e3a6ca chore(memory): capitalize BDR-022 (doc-syncer public-docs scope)
Record the doc-syncer rewrite decision: sync targets limited to public
docs, .claude/ and CLAUDE.md as read-only context, normative conventions
and clean mode added. Extends BDR-016, does not supersede it. Log the
session in journal.md under 2026-06-18.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 17:57:36 +02:00
Bastien Chanot
edff761fc4 refactor(doc-syncer): scope to public docs, .claude read-only, conventions + clean mode
Rewrite the doc-syncer agent so it only ever targets public docs and
treats .claude/ (and CLAUDE.md) as read-only context.

- Add normative CONVENTIONS section: Standard-Readme, Diátaxis doc-type
  separation, Keep a Changelog + SemVer, Conventional Commits.
- Add CONTEXT SOURCES section: .claude/ and CLAUDE.md may be read for
  project context but are never modified, never sync targets, and their
  content is never copied into a public doc.
- Drop .claude/{tasks,audits,memory} and CLAUDE.md from discovery,
  per-doc analysis, tagging, patches, and the report. Remove the STEP 4
  blocks that audited TODO.md / audits/*.md / decisions-learnings-blockers.
- Fix sync scope to the modifiable targets: README, INSTALL, CONFIGURE,
  USAGE, DEPLOY, CONTRIBUTING, CHANGELOG, SECURITY, ARCHITECTURE, LICENSE,
  docs/**. Add SECURITY.md and ARCHITECTURE.md analysis stanzas.
- Make the README template lean (Standard-Readme order): drop Status and
  Project layout; forbid roadmap/todo/internal-state; README only links
  to the Diátaxis docs, never duplicates them.
- Add CLEAN mode (triggered by a 'clean' arg): propose removal of
  out-of-convention sections and copied .claude/ content from existing
  public docs, HUMAN-tagged and gate-validated.
- Conserve: stack detection, 14-section DEPLOY gate, validation gate,
  AUTO/HUMAN tagging, never-invent rule, AUTO MODE (input contract
  'auto-mode scope:' unchanged, so callers are unaffected).
- Preserve frontmatter name/tools/model; update description to reflect
  the public-doc scope and 'reads .claude/ for context only'.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 17:46:48 +02:00
Bastien Chanot
f39cc1b954 chore(memory): capitalize LRN-030 (Opus 4.8 under-delegation)
Add LRN-030 documenting Opus 4.8's tendency to under-delegate
subagents/memory/custom-tools by default and the CLAUDE.md fan-out
rule that counters it; log the session in journal.md under 2026-06-18.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 17:06:11 +02:00
Bastien Chanot
02a0ba0602 docs(claude-md): add subagent delegation guidance to Workflow
Expand the sub-agent bullet to push fan-out work (many files,
parallel searches, multi-point checks) to sub-agents rather than
serial iteration, and default to delegation for multi-file
exploration. Counters Opus 4.8's tendency to under-delegate.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 17:00:24 +02:00
Bastien Chanot
bc7f657be0 chore(settings): remove model pin (claude-fable-5[1m] override)
Drop the top-level "model" key so the session falls back to the
default model instead of forcing claude-fable-5[1m].

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-18 17:00:19 +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
e7e9dacddc refactor(claude-md): resolve contradictions, fix dead refs, restructure sections
Fable 5 audit of the global CLAUDE.md (symlinked from this repo):

Contradictions resolved:
- two conflicting graphify sections merged into one (query-first when
  graphify-out/graph.json exists, direct read otherwise; single command
  form; dropped the false 'this project has a knowledge graph' claim)
- plan rule: 'when in doubt skip plan' no longer cancels the mandate —
  borderline = single-file small obvious change
- deviation rule disambiguated: minor/justified -> explain after,
  significant/shaky -> ask before
- 'append-only' registries reconciled with /prune-memory curation

Dead refs fixed: /caveman:compress -> /caveman-compress; design-gate
path now ~/.claude/lib/ (was repo-relative); '(replaces LESSONS)' note
dropped.

Structure: Health Stack / Skill routing / graphify no longer nested
under '# Communication mode'; new '# Tooling & skills' and
'# This repo only' sections; repo-specific Health Stack labeled as such.

Routing updated: + audit-delta, close, capitalize, prune-memory,
profile, context-restore, geo; explicit gstack-OFF fallback rule.
Mid-task question exception generalized to all skill-mandated gates.

Non-critical sections caveman-compressed; Architecture decisions and
Security kept verbatim (must stay unambiguous). Net -1471 chars while
adding 8 routing entries.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 13:56:59 +02:00
Bastien Chanot
4d9cd7efe4 fix(geo-analyzer): define unreachable operationally
Both blind judges flagged the same residual: without a detection
criterion, a /seo-dispatched subagent could misread itself as headless
and degrade to report-only. Unreachable = no answer obtainable at all
(cron/CI, user explicitly absent); orchestrator dispatch with a main
thread that can relay questions is reachable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 19:25:40 +02:00
Bastien Chanot
225c4377da fix(onboard): allow Agent and Skill tools in frontmatter
Workflow STEPs 5-7 dispatch subagents and invoke skills; allowed-tools
omitted both, contradicting the orchestrator's core mechanism.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 19:09:44 +02:00
Bastien Chanot
2dc8431a69 fix(init-project): repoint missing readme-updater.md to doc-syncer
readme-updater.md does not exist on disk; STEPs 5b and 12 were broken
references. doc-syncer.md AUTO MODE covers both cases (README bootstrap
when missing, drift sync after changes).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 19:09:44 +02:00
Bastien Chanot
7719aea103 fix(analyzer): resolve memory-update vs read-only contradiction
"Update project memory" instructed file writes while RULES say
"Do not modify files". Patterns now surface in the analysis output;
persistence stays in the main thread via the gated capitalize flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 19:09:44 +02:00
Bastien Chanot
83e9871bc4 fix(geo-analyzer): headless run never applies fixes autonomously
Live darwin test: with the user unreachable, the triage table's
"Confirmation: No" batches edited 2 source HTML files unsupervised.
Autonomous batches presume a reachable user who saw the printed plan;
headless -> all batches report-only with ready-to-apply content.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 19:09:44 +02:00
Bastien Chanot
9fc93fabd2 optimize audit-delta: close 3 judge-flagged consistency gaps
Round 2 of darwin optimization (judge-identified residuals):
- 3c marker rule now cross-references the STEP 0 dangling/corrupted
  exceptions instead of contradicting them
- corrupted-but-present state JSON branch defined (trust no axis,
  ask repair/reset; headless -> full codebase report-only, file as-is)
- unreachable user at 3e max-cycles STOP -> fail closed: revert axis
  fixes, findings back to open, marker untouched

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 17:54:35 +02:00
Bastien Chanot
0d2ece757e optimize audit-delta: define unreachable-user branches (dangling marker, axis default)
Round 1 of darwin optimization, dim3 (failure-mode encoding). Live test
showed two agents diverging on undefined branches:
- dangling marker + unreachable user -> now full-codebase report-only,
  marker untouched (corrupted state needs user-approved repair)
- no axes named + unreachable user -> now defaults to all four axes
Also adds the matching Common-mistakes row. Includes test-prompts.json.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 17:48:41 +02:00
Bastien Chanot
e12f8243e5 baseline: add audit-delta skill (pre-darwin-optimization snapshot)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 15:41:49 +02:00
Bastien Chanot
fbf3e266f9 set fable 5 per default 2026-06-10 12:55:39 +02:00
Bastien Chanot
99fd082a65 chore(gstack): bump submodule to v1.52.1.0
Update the gstack submodule pin 026751e -> 070722a (v1.52.1.0: brain-aware planning + memory diagnostic + CDP leak fixes). Also removed a junk recursive self-symlink (bin/bin -> bin) from the submodule working tree.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 16:38:32 +02:00
Bastien Chanot
2c4c01dc3e chore(design-motion): quote SKILL.md description, gitignore local symlink
Wrap the frontmatter description in quotes (defensive valid-YAML: it contains an em-dash and an apostrophe). Add skills/design-motion-principles to the external-skill-symlink ignore allowlist so it matches its 4 siblings (emil-design-eng, frontend-design, darwin-skill, find-skills) and stops surfacing as untracked noise — consistent with the LRN-025 allowlist rule.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 16:28:51 +02:00
Bastien Chanot
61a98573d7 chore(skills): remove disable-model-invocation repo-wide
Strip the disable-model-invocation frontmatter key from all 19 editable skills. Absent = default = model invocation enabled. 8 were 'true' and blocked the model AND orchestrators from self-routing (status, plugin-check, analyze, onboard, refactor, init-project, pdf-translate, ship-feature) — contradicting the CLAUDE.md skill-routing rules. The other 11 were 'false', a no-op noise line.

The setting is binary (no per-caller granularity), so enabling orchestrator chaining also enables model auto-fire — accepted. Genuinely destructive operations remain guarded by the careful/guard hooks, independent of this flag.

Capitalized: BDR-019 (decision), LRN-026 (learning), journal 2026-06-09.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 16:18:10 +02:00
Bastien Chanot
d188cae302 feat(skills): add /capitalize — pre-wipe memory flush skill
Salvages registry-worthy insights from the conversation before /clear or /compact wipes context. Scans the conversation, dedups each candidate against the existing .claude/memory/ registries (its signature move vs /close), routes across all 5 registries behind a compact approval gate, always writes a journal line.

Baseline-tested per superpowers:writing-skills (RED/GREEN/REFACTOR): the no-skill baseline double-logged one incident across LRN+BLK; the skill passes clean and now counters that via a 'one incident -> one primary registry' rule. Ships v1 with the approval gate as the human safety net (same posture as /prune-memory).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 16:17:55 +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 Chanot
0d9f3d41eb feat(design): mandate full design toolchain on UI work via CLAUDE.md rule + hook
Add a tiered-by-scope "Design work — full toolchain" rule to the global
CLAUDE.md: trivial tweaks stay on /hotfix, building UI mobilizes ui-ux-pro-max,
frontend-design, Magic MCP, emil-design-eng, design-motion-principles, and
design-html; design systems start with design-consultation; reviews use
design-review + emil + motion audit. In doubt about scope, do not silently
skip the toolchain — ask or default to the Build tier.

Reinforce it with a design-toolchain-reminder UserPromptSubmit hook that
detects UI/design signals (broad FR+EN keyword set, \b-guarded against
substring false matches) and injects the tiered guidance into context. Soft
nudge, always exits 0, falls back to raw stdin when the hook JSON is missing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 15:48:10 +02:00
Bastien Chanot
6e30af0a01 chore(settings): set effortLevel xhigh, bump model 4-8, re-enable pr-review-toolkit
Add native effortLevel: "xhigh" (persisted enum, replaces dropped invalid "max").
Bump model to claude-opus-4-8[1m]. Re-enable pr-review-toolkit plugin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 19:37:27 +02:00
Bastien Chanot
23449dfc82 fix(scripts): add gstack infra symlinks to install, update, and doctor
The gstack/bin/ and gstack/browse/dist/ symlinks (added in link.sh) were
missing from install-plugins.sh and update-all.sh, meaning fresh installs
and updates wouldn't create them. Also adds doctor.sh health checks.

- install-plugins.sh: create symlinks after gstack ./setup
- update-all.sh: refresh symlinks after gstack submodule update
- doctor.sh: verify both symlinks exist in consistency section

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 07:25:03 +02:00
Bastien Chanot
0380f218c1 chore(gitignore): add .gstack/ to ignore list
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 07:20:34 +02:00
Bastien Chanot
7ec59819ab fix(link): expose gstack shared infra (bin/ + browse/dist/) via symlinks
Per-skill SKILL.md symlinks don't expose gstack's shared infrastructure.
Multiple skills hardcode ~/.claude/skills/gstack/bin/ (gstack-config,
gstack-update-check, gstack-paths) and gstack/browse/dist/ (browse binary).

Create targeted symlinks in link.sh:
- ~/.claude/skills/gstack/bin/ → skills-external/gstack/bin/
- ~/.claude/skills/gstack/browse/dist/ → skills-external/gstack/browse/dist/

Fixes: browse binary not found, gstack-config failures, freeze gstack-paths
resolution. Safe with profile toggles (profiles move per-skill dirs, not
the gstack/ infra dir). Safe with stale link cleanup (only removes -L
symlinks, not real dirs created by mkdir -p).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 06:05:26 +02:00
Bastien Chanot
c44852e665 feat(skills): add pdf-translate — PDF to translated HTML via Vision
OCR/image-based PDF pipeline: convert pages to PNGs, read with Claude
Vision (bypasses unreliable OCR text layer), translate with cross-page
glossary consistency, reconstruct faithful HTML via /design-html.

5 steps: deps check → page images + assets → style analysis →
page-by-page read+translate → HTML reconstruction → visual QA.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 03:38:16 +02:00
Bastien Chanot
5407d66da9 chore(settings): disable pr-review-toolkit, move model key, drop effortLevel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-25 22:57:25 +02:00
Bastien Chanot
469c807c10 feat(skills): add design-motion-principles from kylezantos
Motion/animation design skill with 3-designer lens (Emil Kowalski,
Jakub Krehel, Jhey Tompkins). Two modes: Create and Audit.
Complements frontend-design (broad) with deep motion expertise.

Integration points:
- skills-external/design-motion-principles/ — skill files + references
- link.sh EXTERNAL_SKILLS — symlink to ~/.claude/skills/
- install-plugins.sh step 8c — presence check
- update-all.sh step 7.2 — sync from GitHub
- profiles: design, full, web, web-full — listed as external
- plugin-advisor — decision table, recommended sets, conditional rules
- design-gate — symlink check + non-blocking warning if missing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-25 22:40:23 +02:00
Bastien Chanot
6b55a3aaf6 fix(doctor): update stale skill/agent refs, scope disable-model-invocation check
- Replace readme → doc in EXPECTED_SKILLS (readme skill was replaced by doc)
- Replace readme-updater → doc-syncer in EXPECTED_AGENTS
- Skip external/symlinked skills in disable-model-invocation check —
  external skills (frontend-design, emil-design-eng, darwin-skill, find-skills)
  and gstack skills (symlinked SKILL.md) are not owned by this repo

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-25 21:34:42 +02:00
Bastien Chanot
237810396c chore(plugins): add frontend-design to plugin-advisor and design-gate
frontend-design (Anthropic's anti-AI-slop skill) was installed but not
referenced in the plugin-advisor decision table, recommended sets, or
conditional rules — nor in the design-gate detection logic.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-25 20:59:19 +02:00
Bastien Chanot
057a5b7f5c feat(skills): add frontend-design from anthropic-agent-skills
Source: anthropic-agent-skills plugin cache → skills-external/frontend-design/
Auto-install via install-plugins.sh step 8b, auto-update via update-all.sh
step 7.1, symlinked by link.sh (refactored to loop over EXTERNAL_SKILLS).
Added to profiles: design, web, web-full, full.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-23 00:58:30 +02:00
Bastien Chanot
2b61276dfd chore(statusline): add PowerShell caveman-statusline hook
Windows/cross-platform statusline hook for caveman mode indicator.
Reads .caveman-active flag with symlink and size guards to prevent
injection via crafted flag files.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:55:28 +02:00
Bastien Chanot
b59cce1d1f feat(graphify): upgrade to 0.8.13 — gemini backend, encoding, monorepo, CLI export
Major SKILL.md rewrite:
- Fast path: skip extraction when graph exists and user asks a question
- Gemini backend replaces Kimi as default external LLM
- All file I/O uses ensure_ascii=False + encoding="utf-8"
- Monorepo support via per-subfolder extraction + merge
- Obsidian/HTML export via CLI instead of inline Python
- Node ID format includes parent dir to prevent ghost duplicates
- file_type gains "concept" as valid value
- Subagent chunk paths must be absolute
- --help flag prints usage and stops
- Large corpus gate raised from 200 to 500 files

Bumps gstack submodule to 026751e.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:55:23 +02:00
Bastien Chanot
0a8f524b72 chore(graphify): rewrite CLAUDE.md + hook to prefer graphify query over GRAPH_REPORT.md
Query-first approach: run graphify query/path/explain for focused
questions, read GRAPH_REPORT.md only for broad architecture review.
Also fixes checkpoint→context-save routing line in CLAUDE.md.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:55:13 +02:00
Bastien Chanot
7298a2e410 chore(settings): bump effortLevel to max, model to claude-opus-4-6[1m]
Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:55:08 +02:00
Bastien Chanot
b74d9afc4a chore(memory): capitalize BLK-004/005/006, LRN-021/022/023, journal 2026-05-20/21
Session entries from two bugfix sessions:
- BLK-004: orphan /ship-feature wrapper post-refactor (resolved)
- BLK-005: profile checkpoint→context-save rename (resolved)
- BLK-006: profile.sh symlink false-negative via logical cd (resolved)
- LRN-021: sweep ~/.claude/commands/ after orchestrator migrations
- LRN-022: audit profiles against gstack skill list after submodule bump
- LRN-023: cd -P mandatory for scripts invoked via symlink

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:55:04 +02:00
Bastien Chanot
1dd6b43517 chore(settings): switch default model to claude-opus-4-6
Previously unset — Claude Code was defaulting to Opus 4.7 (1M) based on
plan capability + picker history. Pin the default to Opus 4.6 so future
sessions start on 4.6 without going through the /model picker.

1M context tier is plan-routed (Claude Max) so no explicit suffix needed
in the persisted ID — backup `.claude.json` files in this account show
the same bare form (`"model": "claude-opus-4-7"`) while runtime usage
logs as `claude-opus-4-7[1m]`.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:28:31 +02:00