Commit Graph

335 Commits

Author SHA1 Message Date
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
Bastien Chanot
a491de51c8 feat(statusline): replace plan segment with profile: + effort:
Drop the `PLAN` (Max/Pro) segment — user wants runtime context, not
account-tier info. Add prefixes for clarity:

- `profile: <name>` reads `<repo>/.active-profile` (already wired in
  the previous commit).
- `effort: <level>` reads `.effortLevel` from `<repo>/settings.json`
  via jq — picks up `/effort` changes automatically since settings.json
  is the source-of-truth (symlinked into `~/.claude/settings.json`).

Sample output:

  Opus 4.7 | claude (master) | profile: full | effort: xhigh | ███░░ 42% | 3m

`lib/detect-plugins.sh` is left untouched — still used by
hooks/session-start.sh, doctor.sh, update-all.sh, install-plugins.sh.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:17:29 +02:00
Bastien Chanot
cb1e8cd814 feat(profile,statusline): show active profile in statusline via .active-profile cache
`bash lib/profile.sh current` is 12s+ — far too slow to call from the
statusline hook (runs on every keystroke). Add a one-line cache file at
`<repo>/.active-profile`, written by `cmd_apply` and `cmd_reset`. The
statusline reads the file directly with a single `head -n1`, no
sub-shell into `profile.sh`.

Behavior:
- `bash lib/profile.sh set <name>` (which ends in `cmd_apply`) and
  `bash lib/profile.sh apply <name>` both write `<name>` to
  `<repo>/.active-profile`.
- `bash lib/profile.sh reset` writes the literal `none`.
- Statusline inserts the cached profile name between the plan segment
  and the context-bar segment, e.g.
  `Opus 4.7 | claude (master) | Max | full | ████░░░░░░ 42% | 3m`.
- Missing or empty cache → statusline shows `?`.

Cache file is gitignored — it tracks runtime state, not source.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:14:12 +02:00
Bastien Chanot
a4558ee805 fix(profile): resolve REPO via physical path (cd -P) so cmd_current finds the right skills-disabled
`lib/profile.sh:43` set `REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"`.
Default `cd` preserves symlinks (logical pathname), so when the script is
invoked via the `~/.claude/lib/profile.sh` symlink, `$REPO` resolves to
`/home/bchanot-ubuntu/.claude` instead of the real repo path. `$SKILLS_DIR`
still works because `~/.claude/skills` is itself a symlink to the repo's
`skills/`. But `$DISABLED_DIR` ends up at `~/.claude/skills-disabled` (a real
sibling directory containing only stale npx-skill symlinks) while the actual
disabled gstack skills sit at `<repo>/skills-disabled`.

Symptom: `bash "$HOME/.claude/lib/profile.sh" current` returns
`none (all gstack skills enabled — no profile set)` even when a profile is
applied — because `find $DISABLED_DIR -name 'gstack__*'` returns 0.

Adding `-P` to `cd` forces physical-path resolution so `$REPO` always points
to the real repo regardless of how the script was invoked. `cmd_current`
now correctly reports `full (100% match, 14 gstack skills disabled)`.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 05:04:54 +02:00
Bastien Chanot
69c5ded827 fix(profiles): rename checkpoint to context-save in 5 profiles
gstack upstream renamed the `checkpoint` skill to `context-save`
(it was shadowed by Claude Code's native /checkpoint rewind alias).
`/profile set full|dev|backend|web|web-full` was emitting
`⚠ missing: checkpoint — try: bash link.sh`, but link.sh only
materializes symlinks for skills that exist upstream — it cannot
resurrect a renamed skill, so the suggested next step was a dead
end.

Replace `checkpoint` → `context-save` in all 5 affected profiles
so the warning goes away and the new skill is enabled when the
profile is applied.

CLAUDE.md routing rule (line 193) also updated locally but left
uncommitted because the file carries an unrelated in-progress
graphify section rewrite.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-21 04:57:14 +02:00
Bastien Chanot
157b2de788 memory: capitalize 2026-05-18 — BDR-017 + LRN-020 (full profile)
BDR-017: `full` profile = web-full + plan + dev superset for end-to-end
MVP via /init-project. Alternatives rejected: extend web-full (different
semantic), profile-of-profiles (not supported), keep 3 apply-chained.

LRN-020: sentinel/identifier collision pattern — `cmd_current`'s "full
(no profile set)" literal collided with new profile name. Renamed to
"none". Rule: sentinels must be outside the entity namespace.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-18 20:53:37 +02:00
Bastien Chanot
5da97d10f6 feat(profile): add full profile for end-to-end MVP via /init-project
Superset of web-full + dev + audit + plan tools — covers brainstorm →
design → architecture review → scaffold → implement → ship → audit
pipeline needed by /init-project to produce a real MVP in one session.

Also renames cmd_current "no-profile" sentinel from "full" to "none"
to avoid collision with the new profile name.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-18 20:50:13 +02:00
bastien
59ff561c55 memory: capitalize 2026-05-15 — BDR-016 + LRN-019 (doc-syncer rework)
BDR-016: doc-syncer makes README AUTO+unconditional (no skip at
validation gate, only yes/edit) and DEPLOY.md prod-only with a
14-section VPS-deploy template. Mixed dev/prod DEPLOY.md flagged as
drift; dev quick-start lives only in README.

LRN-019: deployable-project doc split by audience — README = dev +
features, DEPLOY = ops + SRE. 14-section template mirrors real
VPS-deploy shape (topology, env, provisioning, two-layer firewall,
Docker tuning, persistence, backups, TLS, observability, hardening,
rollback, runbook). Drop sections that don't apply.

journal: 2026-05-15 heading covering the /commit-change run.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 22:37:19 +02:00
bastien
b0d129be27 chore(settings): enable ui-ux-pro-max skill
Toggle ui-ux-pro-max@ui-ux-pro-max-skill false → true so design-review,
design-consultation, and feat/hotfix design gate can route through it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 22:21:18 +02:00
bastien
58f1e7e458 feat(doc-syncer): README mandatory + 14-section prod-only DEPLOY.md
README.md creation becomes AUTO and unconditional — strikes through any
"no README" opt-out in CLAUDE.md. Enriched template: Stack, Quick start
(dev), Verifying a change, Build & deploy sections, all rendered from
real project data (manifest, .env.example, scripts).

DEPLOY.md becomes prod-only, expanded into a 14-section VPS-deploy
structure (topology, env, provisioning, two-layer firewall, Docker
tuning, first-time setup, routine deploys, persistence, backups, TLS,
observability, hardening, rollback, runbook). Dev quick-start lives in
README only — mixed dev/prod DEPLOY.md is flagged as drift.

AUTO MODE: missing README surfaced as SIGNIFICANT in STEP A4 with
rendered draft for one-shot end-of-session approval. Validation gate
(STEP 8) now distinguishes AUTO patches / HUMAN items / CREATE items,
and README CREATE has no "no" — only yes/edit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 22:21:13 +02:00
bastien
f4a0cbe24d memory: capitalize darwin 2026-05-12 — LRN-017/018 + BLK-003 + BDR-015
LRN-017: thin-dispatcher SKILL.md round-1 invariant = fallback + triggers.
LRN-018: darwin eval subagents drift on total math (factor-10, D8 weight).
BLK-003: scripts/screenshot.mjs hardcoded macOS path blocks PNG cards on Linux.
BDR-015: exclude broken gstack symlinks from /darwin-skill scope.
journal: 2026-05-12 session entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 18:07:29 +02:00
bastien
f4ceed20bb merge darwin: bottom-5 skill optimization round 1
Avg score 58.0 → 78.2 across status, refactor, plugin-check,
skills-perso, commit-change. See .claude/audits/DARWIN-SKILL-2026-05-12.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 18:04:42 +02:00
bastien
34d850336e darwin: Phase 3 report — bottom-5 round 1, avg 58.0 → 78.2
Audit at .claude/audits/DARWIN-SKILL-2026-05-12.md.
5 skills optimized (status, refactor, plugin-check, skills-perso,
commit-change), all KEEP. Rounds 2-3 skipped — diminishing returns.
graphify deferred to exploratory rewrite (Phase 2.5).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 18:01:42 +02:00
bastien
db9048877a optimize skills-perso + commit-change: round 1 — D3 edge cases
skills-perso: add 'Known limits of detection heuristic' section
(false positives in code blocks, false negatives for non-standard
agent paths, override via owner: user marker, malformed frontmatter).

commit-change: add fallback when commit-changer.md unreachable,
plus pre-flight check stub (detached HEAD, missing git identity).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:59:22 +02:00
bastien
727e9fc73a optimize plugin-check: round 1 — D3 fallback + D1 triggers + advisory clarification
D3: fallback when plugin-advisor.md unreachable.
D1: triggers added.
D4: explicit 'never writes' clarification (skill is advisory-only).
Size: 425B → 628B (+48%, under 150% cap).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:57:48 +02:00
bastien
9a992a0186 optimize refactor: round 1 — D3 fallback + D1 triggers
Add explicit fallback when refactorer.md unreachable (D3 edge case).
Add triggers to frontmatter for routing (D1).
Size: 379B → 493B (+30%, under 150% cap).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:55:39 +02:00
bastien
58e99b2f36 optimize status: round 1 — D3 fallback + triggers
Add explicit fallback when status-reporter.md unreachable (D3 edge case).
Add triggers to frontmatter description for routing clarity (D1).
Size: 776B → 834B (+7.5%, under 150% cap).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:53:28 +02:00
bastien
11b0c6bb8e darwin: add test prompts for 5 skills (baseline pass)
Skills covered: close, graphify, harden, profile, prune-memory.
Used by /darwin-skill dim 8 effect testing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:50:06 +02:00
bastien
0fe6153ead fix(prune-memory): STEP 4 verify — prefix mapping bug (TDD RED→GREEN)
First end-to-end run of /prune-memory on real .claude/memory/ surfaced
a broken verify script:

Old: `prefix=$(basename "$f" .md | tr a-z A-Z | cut -c1-3)` derived
the prefix from the filename's first 3 letters → produced DEC / LEA /
BLO. Actual prefixes are BDR / LRN / BLK. The grep then matched zero
entries, no MISSING/ORPHAN was ever reported, and the script printed
its "OK if blank" footer regardless of real state. False clean signal.

Fixed: hard-mapped filename → prefix via `declare -A PREFIX_MAP`.
Verified against current registries — 14 BDR + 16 LRN + 2 BLK + 1 EVAL
entries all index-consistent, no false negatives.

Added EVAL prefix to the map (evals.md was missing from the loop in
v1). Footer line clarified to `(blank above = OK)`. `wc -l` excludes
`.original.md` backups from the output.

Note: caveat in skill body said "v1 ships without baseline TDD test —
STEP 2 approval gate is the safety net". First real test caught a
verify bug that bypassed STEP 2 entirely. Lesson: STEP 4 is its own
safety net and needs its own test.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:27:31 +02:00
bastien
f1e2f3dfd3 fix(memory): BDR-011 body status — superseded by BDR-013
/prune-memory first run flagged body↔Index drift on BDR-011:
- Index row (since 2026-05-11): `superseded by BDR-013`
- Body line 201 (since 2026-05-07): `Status: accepted`

BDR-013 explicitly supersedes BDR-011's 4-chapter doc structure with
6-chapter restructure (scores+NAP promoted). Body now consistent with
Index.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:27:20 +02:00
bastien
fd619f5f9a feat(skills): add /prune-memory — curate .claude/memory/ registries
New personal skill to maintain memory registry hygiene. Gap identified
between existing tools:
- /caveman:compress — text-compresses one file, no curation
- /close — appends new entries end-of-session, doesn't prune
- /prune-memory (new) — audits, classifies, applies user-approved cleanup

Operations:
- Mark obsolete entries `status: superseded by <ID>` or `status: deprecated`
  (no hard delete — append-only per CLAUDE.md memory rule).
- Merge similar entries (new ID, sources marked superseded).
- Caveman-compress bloated prose-heavy entries inline.
- Repair Index drift (missing rows, orphaned rows).

Workflow: STEP 0 precheck (refuses dirty working tree, git = backup)
→ STEP 1 audit (A obsolete / B similar / C bloated / D drift)
→ STEP 2 plan + mandatory user approval
→ STEP 3 apply safe→destructive
→ STEP 4 verify Index sanity + line-count report.

Follows superpowers:writing-skills CSO conventions: "Use when..." trigger
description (under 1024-char spec), Quick Reference table, Common
Mistakes table, Failure Paths table. v1 ships without baseline TDD test
(noted in skill body); STEP 2 approval gate is the safety net.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:24:16 +02:00
bastien
bf54de84a1 docs(memory): BDR-013 + BDR-014 + LRN-014..016 + 2026-05-11 journal append
decisions.md:
- BDR-013: client-handover 6-chapter doc — promote scores §2 + NAP §4
  (supersedes BDR-011 4-chapter structure).
- BDR-014: personal SKILL.md descriptions follow "Use when [triggers]…"
  pattern + 1024-char frontmatter spec limit.
- Backfilled missing BDR-012 Index row (entry existed in body, Index
  skipped in prior session).

learnings.md:
- LRN-014: pandoc base gfm strips header id attrs — need
  `gfm+gfm_auto_identifiers` for internal anchor links.
- LRN-015: BrightLocal Free Tools retired 2026 — Moz Local Citation
  Checker is current free NAP-audit replacement.
- LRN-016: pandoc GFM checkbox markup breaks adjacent-sibling CSS —
  target `li > input[type="checkbox"]` directly, not `+ *` siblings.
- Backfilled missing LRN-013 Index row.

journal.md:
- 2026-05-11 session: orchestrator audit + writing-skills CSO fixes +
  client-handover 6-chapter restructure + 4 atomic commits e2425ca..0fb634d.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:15:05 +02:00
bastien
0fb634deca refactor(skills): compress 8 SKILL.md descriptions per writing-skills spec
Two issues fixed across personal skills:

1. Five skills had frontmatter > 1024 chars (spec limit per agentskills.io):
   - client-handover: 1920 → 924
   - doc: 1390 → 734
   - seo: 1378 → 885
   - geo: 1189 → 734
   - validate: 1050 → 742
   All now compliant.

2. Three orchestrators had workflow-summary descriptions that create
   "shortcut" risk per writing-skills CSO (Claude may follow the
   description instead of reading the full skill body, skipping steps):
   - ship-feature: "design → plan → implement (TDD) → review → finish"
     → "Use when shipping a feature end-to-end — needs… (9-step pipeline)"
   - init-project: "interview → design → scaffold → implement (TDD)"
     → "Use when initializing a brand-new project from scratch — needs…"
   - onboard: "detect archetype, install claude-config, run full audit…"
     → "Use when bringing an existing repo into the framework — needs…"

Descriptions now follow "Use when [triggers]…" pattern. Workflow detail
preserved in skill body where it belongs. Triggers consolidated and
trimmed of duplicates.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:09:21 +02:00
bastien
7db8f01074 fix(client-handover): CSS — kill checkbox overlap with adjacent inline elements
Old rule `li input[type="checkbox"] + *` absolutely-positioned the first
element sibling after the checkbox (typically <a>, <code>, <strong>),
yanking links and code spans out of flow and overlapping adjacent
content in the rendered PDF.

Replace with a targeted rule that styles the native disabled checkbox
inline (small green box) and leaves siblings untouched. Pandoc GFM emits
`<li><input disabled type="checkbox"> text…</li>` with no wrapper class,
so we target `li > input[type="checkbox"]` directly.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:09:12 +02:00
bastien
bfea74285b fix(client-handover): NAP table — add description + swap BrightLocal→Moz Local
NAP table now includes a "Description courte" / "Short description" field
(1-2 sentences, lifted from hero/meta description, pasted identically
across Google Business, Bing Places, Apple Maps, directories). Same field
client was already typing 10 different ways across platforms — now it's
the single source of truth.

BrightLocal Free Tools page was retired in 2026 (service now paid-only).
Replaced with Moz Local Citation Checker (free 60s audit across 50+
directories, no credit card). Both FR and EN versions updated.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:09:07 +02:00
bastien
e2425ca79d feat(client-handover): 6-chapter doc — promote scores + NAP chapters
Restructure deliverable from 4 to 6 chapters:
- §2 (new): score table promoted from technical annex to top of doc for
  immediate visual proof of impact (tested with local-business clients —
  converts "what did I pay for?" doubt within 30 seconds).
- §4 (new): NAP table promoted from §7 annex so client reads identity
  values (name, address, phone, hours, categories, short description)
  BEFORE attacking §5 todo list. Prevents 10-different-description drift
  across external platforms that degrades Google's NAP-consistency signal.
- §5 (todo) and §6 (tech details) renumbered; §7/§8 annexes still optional.

Pandoc bumped to gfm+gfm_auto_identifiers so internal anchor links like
[§4](nap) resolve in the rendered HTML/PDF.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-11 16:09:01 +02:00
bastien
864612ff7b fix(client-handover): kill PDF text superposition (URL dupe + list page-break)
Two distinct render bugs producing overlapping text on multi-page PDFs:

1. Bare-URL duplication. The print stylesheet injects `(href)` after every
   external link via `a[href^="http"]::after`. When pandoc/marked
   auto-links a bare URL or renders `[X](X)`, the visible text already
   equals the href, so the pseudo-element produces "URL (URL)" and the
   trailing duplicate wraps onto the next line, colliding with the
   following block (e.g. "https://pagespeed.web.dev/ (https://...)" then
   "• Ouvrir, taper l'URL...").
   Fix: post-process the body HTML in handover-to-pdf.sh; tag every
   `<a href="X">X</a>` (text == href, ignoring trailing slash + case)
   with `class="bare-url"`, and exclude `a.bare-url::after` from the
   URL-injection rule. Named links still get `(URL)` for print legibility.
   Belt-and-braces: add `white-space: nowrap` and `break-inside: avoid`
   on the remaining `::after` so future long URLs cannot wrap across
   page boundaries either.

2. List item splitting across page boundary. `li` had only
   `orphans/widows: 3` and no `break-inside`, so a long item could put
   its bullet on page N and its text on page N+1, overlapping unrelated
   content. Heading-to-first-block adjacency was also unprotected, so
   "heading at bottom of page A / intro paragraph or first bullet at top
   of page B" could produce visual overlap during reflow.
   Fix: add `li { page-break-inside: avoid; break-inside: avoid; }` and
   `h{1..4} + p|ul|ol { break-before: avoid; }` so list items stay
   intact and intros stay glued to their heading.

Verified end-to-end: rendered sample md with bare URL + named link +
heading-followed-by-list straddling a page break; pdftotext shows each
URL once, no orphaned bullets, no `::after` warning from weasyprint.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 20:23:14 +02:00
bastien
17ef213548 docs(memory): BDR-012 + LRN-013 + 2026-05-07 journal append
- BDR-012 — `/client-handover` cover: white bg + green-forest accents +
  PNG logo default. Captures iteration (cream → green-dark rejected →
  white-pure final). Why: light theme matches zenquality.fr without
  overpowering long client-facing text. Solid green-dark reserved for
  marketing covers, not deliverables.
- LRN-013 — marked CLI 16.x ignores stdin and dumps own cli.js source.
  Pattern: do not assume marked CLI accepts stdin like awk/jq/sed.
  Always pass `-i FILE`. Smoke-test MD→HTML output for known content.
- Journal — appends bugfix subsection under 2026-05-07 with the three
  bugs, root causes, fixes, verified output (164 KB / 19 pages).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 19:57:20 +02:00
bastien
b447a892b1 fix(client-handover): PDF render bugs — marked CLI, white cover, PNG logo
Three bugs surfaced on the LIVRAISON.pdf test render:

1. **MD→HTML conversion** — host had no pandoc, no python-markdown, fell
   back to `npx marked < "$src"`. marked CLI 16.x ignores stdin and
   dumps its own cli.js source. Resulting PDF body = marked's binary
   source (`#!/usr/bin/env node`, `Marked CLI`, copyright). Fix:
   `npx --yes marked --gfm -i "$src"` (file path via -i, not stdin).

2. **Cover background** — original cream `#F5F0EB` + 8mm green stripe
   was washed out. Iterated to white-pure bg with subtle radial
   sage/forest tints, black-deep title, green-forest accents
   (eyebrow, meta labels, footer, border). Solid green-dark tried
   first then rejected (too heavy for long client-facing doc).

3. **Default logo** — SVG `logo-horizontal.svg` rendered cream-toned,
   blended into bg. Switched LOGO_URL default to
   `https://zenquality.fr/assets/logo-horizontal-1024.png`.

Also added test-artifact gitignore rules for LIVRAISON.* / HANDOVER.*
project-local renders.

Verified: regenerated LIVRAISON.pdf → 164 KB, 19 pages, full content
rendered, white cover with black title + green-forest accents +
visible PNG logo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 19:57:08 +02:00
bastien
591a035ec6 docs(memory): BDR-011 + LRN-012 + 2026-05-07 journal append 2026-05-07 19:11:44 +02:00
bastien
a963faa764 feat(client-handover): 4-chapter doc structure + branded HTML/PDF rendering 2026-05-07 19:08:59 +02:00
bastien
5d8103f595 docs(memory): BDR-010 + LRN-011 + 2026-05-07 journal entry 2026-05-07 18:39:16 +02:00
bastien
c99308f0a7 feat(client-handover): split SEO + GEO scores, gate GEO at ≥17/20 2026-05-07 18:34:59 +02:00
bastien
64cef26e50 docs(darwin-skill): audit report + LRN-008/009/010 + journal entry 2026-05-06 18:39:12 +02:00
bastien
69348d0463 Revert "optimize(doc): add resources/templates/README.md.tpl + DEPLOY.md.tpl + reference (d6 target)"
This reverts commit b26a94d779.
2026-05-06 18:32:54 +02:00
bastien
ae49ca99a8 optimize(onboard): tighten frontmatter description — verb-forward, EN consistency (d1 target) 2026-05-06 18:32:45 +02:00
bastien
b26a94d779 optimize(doc): add resources/templates/README.md.tpl + DEPLOY.md.tpl + reference (d6 target) 2026-05-06 18:32:16 +02:00
bastien
8df5f2c6ca Revert "optimize(code-clean): empty-approval branch — record audit + skip Phase 2 cleanly (d3 target)"
This reverts commit f514308305.
2026-05-06 18:31:40 +02:00
bastien
f514308305 optimize(code-clean): empty-approval branch — record audit + skip Phase 2 cleanly (d3 target) 2026-05-06 18:31:03 +02:00
bastien
f36be7e4ba optimize(seo): add resources/depth-matrix.md (depth/weights/dedup/envelope) + reference from SKILL.md (d6 target) 2026-05-06 18:30:25 +02:00
bastien
7fd5ac860c optimize(client-handover): add EDGE CASES table for zero commits, malformed audit, missing URL, .memory absent (d3 target) 2026-05-06 18:29:19 +02:00
bastien
ad92360bce optimize(plugin-check): rollback on partial toggle failure + pre-recommendation validation checkpoint (d4 target) 2026-05-06 18:28:31 +02:00
bastien
44fab4c9e3 optimize(validate): add RETRY POLICY with exp backoff + cache reuse + WAVE quota path (d4 target) 2026-05-06 18:27:43 +02:00
bastien
e2faf322f2 optimize(ship-feature): add FAILURE PATHS table for orchestrator-level error handling (d6 target) 2026-05-06 18:26:51 +02:00
bastien
9ad12d9680 optimize(init-project): add PROGRESS PROTOCOL header per step + plain-language recap before status table (d8 target) 2026-05-06 18:26:01 +02:00
bastien
a471d1c3f0 optimize(feat): add concrete scope-check decision rules table + worked examples (d8 target) 2026-05-06 18:25:03 +02:00