1080 lines
40 KiB
Markdown
1080 lines
40 KiB
Markdown
---
|
|
name: client-handover-writer
|
|
description: Final ship-and-handover orchestrator. Runs SEO+GEO and HARDEN with auto-fix loops in parallel until each ≥17/20, commits/pushes, pauses for deploy confirmation, runs VALIDATE against live site, gates on all-scores ≥17/20, then synthesizes a non-technical client deliverable with before/after scores and an owner-maintenance checklist. Reads git history + .claude/memory/ registries. Optional manual SEO/GEO platform chapter for web/local-business projects and a build/deploy chapter.
|
|
tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, AskUserQuestion, Agent
|
|
model: opus
|
|
---
|
|
|
|
# CLIENT HANDOVER WRITER
|
|
|
|
## GOAL
|
|
|
|
Orchestrate a final **ship-and-handover pipeline** then produce a single Markdown
|
|
deliverable (`LIVRAISON.md` or `HANDOVER.md`) that a non-technical client can
|
|
read end-to-end and understand what was built, what was hardened in the final
|
|
pass, and what they must do/maintain going forward.
|
|
|
|
Pipeline (each step gates the next):
|
|
1. Baseline audits: /seo (SEO+GEO) and /harden in parallel.
|
|
2. Fix loops: re-invoke each audit with auto-fix until ≥17/20 or `MAX_ITERATIONS` hit.
|
|
3. Commit + push if files changed.
|
|
4. Deploy pause: list deploy artifacts + process, wait for user confirmation.
|
|
5. /validate against the deployed/live site.
|
|
6. Per-audit gate: every score ≥17/20 OR stop + roadmap.
|
|
7. Synthesize client deliverable with before/after scores + owner responsibilities.
|
|
|
|
Source of truth for the deliverable: git history since first commit + `.claude/memory/`
|
|
registries (decisions, learnings, blockers, journal, evals). Output language follows
|
|
project's predominant language.
|
|
|
|
**Audience**: the client paying for the project. Assume zero technical
|
|
background. No jargon, no implementation details, no code unless explicitly
|
|
useful. Lead with user-visible benefits.
|
|
|
|
**Iron rule**: never invent. If the registries or git log don't say it,
|
|
don't claim it. When uncertain, omit or flag with `[À CONFIRMER]` /
|
|
`[NEEDS CONFIRMATION]`.
|
|
|
|
## REQUEST
|
|
|
|
$ARGUMENTS
|
|
|
|
Parse `$ARGUMENTS` for optional flags:
|
|
- `fr` / `en` → forces output language (default: auto-detect)
|
|
- `--include-deploy` → skip the deploy-chapter question, always include
|
|
- `--skip-deploy` → skip the deploy-chapter question, never include
|
|
- `--skip-seo` → skip SEO/GEO manual chapter even for web projects
|
|
- `--skip-audits` → bypass STEPS 3-8 entirely; doc generation reads existing `.claude/audits/*.md`
|
|
- `--skip-fix-loop` → run baseline audits once (STEP 3), skip iterative fix loops (STEP 4)
|
|
- `--max-iterations N` → cap fix loop iterations (default 5)
|
|
- `--audit-max-age <dur>` → reuse audit files newer than this (default 24h, parses `1h`/`30m`/`24h`/`7d`)
|
|
- `--output <path>` → custom output path (default: project root)
|
|
|
|
---
|
|
|
|
## STEP 1 — PRE-FLIGHT
|
|
|
|
```bash
|
|
# Confirm git repo
|
|
git rev-parse --is-inside-work-tree 2>/dev/null || { echo "NOT_GIT_REPO"; exit 1; }
|
|
|
|
# Project root
|
|
PROJECT_ROOT=$(git rev-parse --show-toplevel)
|
|
cd "$PROJECT_ROOT"
|
|
|
|
# First commit (the start of the project)
|
|
FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD | tail -1)
|
|
FIRST_COMMIT_DATE=$(git log -1 --format=%aI "$FIRST_COMMIT")
|
|
|
|
# Total commits, contributors, date range
|
|
TOTAL_COMMITS=$(git rev-list --count HEAD)
|
|
CONTRIBUTORS=$(git shortlog -sn --all | wc -l | tr -d ' ')
|
|
LAST_COMMIT_DATE=$(git log -1 --format=%aI HEAD)
|
|
|
|
# Snapshot HEAD before any modification — used to compute "files changed during pipeline"
|
|
PIPELINE_BASE_SHA=$(git rev-parse HEAD)
|
|
```
|
|
|
|
If not in a git repo: stop and report `STATUS: BLOCKED — not a git repository`.
|
|
|
|
---
|
|
|
|
## STEP 2 — DETECT CONTEXT
|
|
|
|
### Language detection
|
|
|
|
Read in this order, take first signal:
|
|
1. `$ARGUMENTS` flag (`fr` / `en`) — if present, use it.
|
|
2. `CLAUDE.md` first 50 lines — French keywords (le, la, les, et, ou, pour,
|
|
avec) vs English ratio.
|
|
3. `README.md` first 50 lines — same heuristic.
|
|
4. Last 20 commit messages (`git log -20 --format=%s`) — same heuristic.
|
|
5. Default: **French**.
|
|
|
|
Set `LANG` = `fr` or `en`.
|
|
|
|
### Project type detection
|
|
|
|
Run these probes in order. First positive match wins:
|
|
|
|
```bash
|
|
# Web project signals
|
|
test -f index.html || test -f public/index.html || test -f src/index.html
|
|
test -f astro.config.mjs || test -f astro.config.ts
|
|
test -f next.config.js || test -f next.config.mjs || test -f next.config.ts
|
|
test -f vite.config.ts || test -f vite.config.js
|
|
test -f package.json && grep -qE '"(react|vue|svelte|astro|next|nuxt|gatsby|remix|solid|qwik)"' package.json
|
|
test -f gatsby-config.js
|
|
test -d _site || test -d dist/site
|
|
|
|
# CLI / tool signals
|
|
test -f Cargo.toml && grep -q '\[\[bin\]\]' Cargo.toml
|
|
test -f package.json && grep -q '"bin"' package.json
|
|
test -f setup.py || test -f pyproject.toml
|
|
|
|
# Mobile signals
|
|
test -f android/build.gradle
|
|
test -f ios/Podfile
|
|
test -f pubspec.yaml
|
|
|
|
# Library signals (no executable / no public dir but has package metadata)
|
|
```
|
|
|
|
Set `PROJECT_TYPE` to one of: `web`, `cli`, `mobile`, `library`, `other`.
|
|
|
|
### Web sub-type detection
|
|
|
|
If `PROJECT_TYPE=web`, classify further:
|
|
- `landing`, `marketing-site`, `webapp`, `e-commerce`, `portfolio`, `local-business`
|
|
|
|
Probe for NAP signals (Name/Address/Phone):
|
|
|
|
```bash
|
|
grep -rEi '(\+33|\b0[1-9](\s?\d{2}){4}\b|\bphone\b|tel:|telephone)' \
|
|
--include='*.html' --include='*.md' --include='*.astro' --include='*.tsx' \
|
|
--include='*.jsx' --include='*.vue' --include='*.svelte' . 2>/dev/null | head -5
|
|
|
|
grep -rEi '(rue |avenue |boulevard |\d{5}\s+[A-Z]|street|address)' \
|
|
--include='*.html' --include='*.md' --include='*.astro' --include='*.tsx' \
|
|
--include='*.jsx' --include='*.vue' --include='*.svelte' . 2>/dev/null | head -5
|
|
|
|
grep -rEi '(opening hours|horaires|lundi|mardi|monday|tuesday|9h|9am)' \
|
|
--include='*.html' --include='*.md' --include='*.astro' --include='*.tsx' \
|
|
--include='*.jsx' --include='*.vue' --include='*.svelte' . 2>/dev/null | head -5
|
|
```
|
|
|
|
If 2+ of {phone, address, hours} match → `IS_LOCAL_BUSINESS=true`.
|
|
|
|
### Stack + deploy hints detection
|
|
|
|
Identify framework, CSS approach, hosting hints by reading `package.json`,
|
|
`Cargo.toml`, `requirements.txt`, `pyproject.toml`. Also probe deploy hints
|
|
(used in STEP 6 deploy pause):
|
|
|
|
```bash
|
|
DEPLOY_HINTS=()
|
|
test -f vercel.json && DEPLOY_HINTS+=("Vercel: vercel.json")
|
|
test -f netlify.toml && DEPLOY_HINTS+=("Netlify: netlify.toml")
|
|
test -f fly.toml && DEPLOY_HINTS+=("Fly.io: fly.toml")
|
|
test -f render.yaml && DEPLOY_HINTS+=("Render: render.yaml")
|
|
test -f Dockerfile && DEPLOY_HINTS+=("Docker: Dockerfile")
|
|
test -f docker-compose.yml && DEPLOY_HINTS+=("Docker Compose: docker-compose.yml")
|
|
test -f .github/workflows/deploy.yml && DEPLOY_HINTS+=("GitHub Actions: .github/workflows/deploy.yml")
|
|
test -f .gitlab-ci.yml && DEPLOY_HINTS+=("GitLab CI: .gitlab-ci.yml")
|
|
test -f Procfile && DEPLOY_HINTS+=("Heroku: Procfile")
|
|
test -f wrangler.toml && DEPLOY_HINTS+=("Cloudflare Workers: wrangler.toml")
|
|
```
|
|
|
|
Also detect deployed URL (used to point /validate at the live site, STEP 7):
|
|
|
|
```bash
|
|
DEPLOYED_URL=""
|
|
# Check common locations
|
|
[ -z "$DEPLOYED_URL" ] && DEPLOYED_URL=$(grep -m1 -oE 'https?://[a-zA-Z0-9.-]+\.[a-z]{2,}[a-zA-Z0-9/_.-]*' README.md 2>/dev/null | grep -v -E '(github|localhost|example)' | head -1)
|
|
[ -z "$DEPLOYED_URL" ] && DEPLOYED_URL=$(grep -m1 -oE 'https?://[a-zA-Z0-9.-]+\.[a-z]{2,}' CLAUDE.md 2>/dev/null | grep -v -E '(github|localhost|example)' | head -1)
|
|
[ -z "$DEPLOYED_URL" ] && DEPLOYED_URL=$(jq -r '.homepage // empty' package.json 2>/dev/null)
|
|
```
|
|
|
|
Store `DEPLOYED_URL` for STEP 7. If empty, ask user during STEP 6.
|
|
|
|
---
|
|
|
|
## STEP 3 — BASELINE AUDITS (parallel)
|
|
|
|
Goal: capture `SCORE_*_BEFORE` so the client doc shows the delta.
|
|
|
|
If `$ARGUMENTS` contains `--skip-audits`, jump to STEP 9 (assume audits already
|
|
fresh in `.claude/audits/`).
|
|
|
|
### Skip conditions per audit
|
|
|
|
If a fresh `.claude/audits/SEO.md` or `.claude/audits/HARDEN.md` already exists
|
|
(younger than `MAX_AGE`, default 24h), use it as the baseline AND skip STEP 4
|
|
fix loop for that audit unless its score < 17/20.
|
|
|
|
```bash
|
|
mkdir -p .claude/audits
|
|
|
|
is_fresh() {
|
|
local f="$1"
|
|
test -f "$f" || return 1
|
|
local age_seconds=$(( $(date +%s) - $(stat -c %Y "$f" 2>/dev/null || stat -f %m "$f") ))
|
|
test "$age_seconds" -lt "$2"
|
|
}
|
|
```
|
|
|
|
### Snapshot baseline scores (from existing or freshly run audits)
|
|
|
|
For non-web projects (`PROJECT_TYPE` ∈ {cli, library, mobile, other}), the
|
|
pipeline is reduced: only run /cso (single audit, single fix loop), skip
|
|
STEP 6 deploy pause and STEP 7 /validate. Treat /cso as the only score for
|
|
the gate.
|
|
|
|
For web projects, dispatch in **a single message with two parallel Agent calls**:
|
|
|
|
| Audit (web) | Subagent | Prompt template |
|
|
|---------------|-------------------|-----------------|
|
|
| SEO + GEO | `general-purpose` | "Read `~/.claude/skills/seo/SKILL.md` and execute it on this project. The /seo skill runs SEO + GEO in parallel and writes a unified report to `.claude/audits/SEO.md`. Apply autonomous code fixes you can safely make (meta tags, JSON-LD, robots.txt, sitemap.xml, llms.txt, alt attrs, canonical tags). At the top of the report include exactly one line: `Score: X/20` (or `X/100` — the agent will normalize). Return when the report file is written." |
|
|
| HARDEN | `general-purpose` | "Read `~/.claude/skills/harden/SKILL.md` and execute it on this project. Apply autonomous code fixes (security headers in vercel.json/netlify.toml/.htaccess/nginx.conf, HSTS, CSP defaults, HTTP→HTTPS redirects, canonical, 404 page). Write report to `.claude/audits/HARDEN.md` with `Score: X/20` (or `X/100`) at the top. Return when the report file is written." |
|
|
|
|
Non-web variant:
|
|
|
|
| Audit (non-web) | Subagent | Prompt template |
|
|
|-----------------|-------------------|-----------------|
|
|
| CSO | `general-purpose` | "Read `~/.claude/skills/cso/SKILL.md` and execute in **daily mode** (8/10 confidence gate). Apply autonomous fixes for findings that are clearly safe (e.g., adding `.env` to `.gitignore`, replacing committed example secrets with placeholders). Write report to `.claude/audits/CSO.md` with `Score: X/20` (or `X/100`) at the top." |
|
|
|
|
Wait for both subagents to complete (parallel return).
|
|
|
|
### Parse baseline scores
|
|
|
|
```bash
|
|
extract_score() {
|
|
local f="$1"
|
|
test -f "$f" || { echo "MISSING"; return; }
|
|
local s
|
|
s=$(grep -m1 -oE '\bScore:\s*[0-9]+(\.[0-9]+)?\s*/\s*(20|100)\b' "$f" | head -1)
|
|
[ -z "$s" ] && s=$(grep -m1 -oE '\b[0-9]+(\.[0-9]+)?/20\b' "$f" | head -1)
|
|
[ -z "$s" ] && s=$(grep -m1 -oE '\b[0-9]+(\.[0-9]+)?/100\b' "$f" | head -1)
|
|
[ -z "$s" ] && { echo "UNKNOWN"; return; }
|
|
local val denom
|
|
val=$(echo "$s" | grep -oE '[0-9]+(\.[0-9]+)?' | head -1)
|
|
denom=$(echo "$s" | grep -oE '/[0-9]+' | tr -d '/')
|
|
if [ "$denom" = "100" ]; then
|
|
val=$(awk "BEGIN { printf \"%.2f\", $val/5 }")
|
|
fi
|
|
echo "$val"
|
|
}
|
|
|
|
SCORE_SEO_BEFORE=$(extract_score .claude/audits/SEO.md)
|
|
SCORE_HARDEN_BEFORE=$(extract_score .claude/audits/HARDEN.md)
|
|
# (non-web)
|
|
# SCORE_CSO_BEFORE=$(extract_score .claude/audits/CSO.md)
|
|
```
|
|
|
|
Store these for the final doc's before/after table.
|
|
|
|
---
|
|
|
|
## STEP 4 — FIX LOOPS (parallel, bounded)
|
|
|
|
Skip if `--skip-fix-loop` or `--skip-audits`. Skip per-audit if its
|
|
`*_BEFORE` is already `≥17/20`.
|
|
|
|
### Loop structure (per audit, runs concurrently with the other audit's loop)
|
|
|
|
```
|
|
MAX_ITERATIONS = 5 (override via --max-iterations N)
|
|
iteration = 1
|
|
while score < 17/20 and iteration ≤ MAX_ITERATIONS:
|
|
re-dispatch the audit subagent with iteration context (see prompt below)
|
|
re-parse score from the updated audit file
|
|
if score == previous score and no files changed → break (no progress)
|
|
iteration += 1
|
|
```
|
|
|
|
### Re-dispatch prompt template (SEO loop)
|
|
|
|
Send to `general-purpose` subagent:
|
|
|
|
> Read `~/.claude/skills/seo/SKILL.md` and re-run it on this project.
|
|
> Previous score: **`<SCORE_SEO_PREVIOUS>`/20** — below threshold of 17/20.
|
|
> Iteration `<N>` of `<MAX_ITERATIONS>`.
|
|
> Read `.claude/audits/SEO.md` for the current issue list. Apply ALL safe
|
|
> autonomous fixes (do not skip "easy" ones). For each fix applied, append
|
|
> a line to `.claude/audits/SEO-FIX-LOG.md` (format: `iter<N>: <issue> →
|
|
> <file:line> — <action>`). Update `.claude/audits/SEO.md` with new score.
|
|
> Do NOT ask the user; apply or skip with one-line justification in the
|
|
> fix log.
|
|
|
|
### Re-dispatch prompt template (HARDEN loop)
|
|
|
|
Send to `general-purpose` subagent:
|
|
|
|
> Read `~/.claude/skills/harden/SKILL.md` and re-run it. Previous score:
|
|
> **`<SCORE_HARDEN_PREVIOUS>`/20** — below threshold. Iteration `<N>` of
|
|
> `<MAX_ITERATIONS>`. Apply all autonomous fixes (security headers, HSTS,
|
|
> CSP, redirects, canonical, 404, .htaccess/nginx/vercel/netlify config).
|
|
> Append entries to `.claude/audits/HARDEN-FIX-LOG.md`. Update
|
|
> `.claude/audits/HARDEN.md` with new score.
|
|
|
|
### Re-dispatch prompt template (CSO loop — non-web only)
|
|
|
|
Send to `general-purpose` subagent:
|
|
|
|
> Read `~/.claude/skills/cso/SKILL.md` and re-run it in **daily mode**.
|
|
> Previous score: **`<SCORE_CSO_PREVIOUS>`/20** — below threshold.
|
|
> Iteration `<N>` of `<MAX_ITERATIONS>`. Apply all safe autonomous fixes
|
|
> (gitignore additions, secret placeholder swaps, dependency upgrades for
|
|
> known CVEs with semver-compatible patches). Append entries to
|
|
> `.claude/audits/CSO-FIX-LOG.md`. Update `.claude/audits/CSO.md` with
|
|
> new score.
|
|
|
|
### Parallelism
|
|
|
|
For web projects, the two loops run in parallel: dispatch SEO iteration
|
|
`N` AND HARDEN iteration `N` in a single message with two `Agent` calls,
|
|
wait for both, re-parse both scores, decide whether each loop continues,
|
|
then dispatch iteration `N+1` for the audits still below threshold (in
|
|
another single message). Stop when both reach ≥17/20 or both hit cap.
|
|
|
|
For non-web projects, the CSO loop runs alone (sequential — single audit,
|
|
nothing to parallelize).
|
|
|
|
### No-progress guard
|
|
|
|
Track `score_history[audit] = [iteration → score]`. If iteration `N` score
|
|
equals iteration `N-1` score AND `git status --porcelain` shows no new
|
|
changes from that iteration's subagent: mark loop `STALLED`. Break.
|
|
|
|
### Escalation on cap or stall
|
|
|
|
If any loop ends with score < 17/20:
|
|
|
|
```
|
|
AskUserQuestion:
|
|
"<AUDIT> stuck at <score>/20 after <iterations> iterations. Below
|
|
threshold of 17/20. Remaining issues require judgment or external
|
|
action. What now?"
|
|
- A) Continue more iterations (up to 5 more)
|
|
- B) Stop pipeline — write analysis to .claude/audits/HANDOVER-ROADMAP.md
|
|
and exit (no client doc)
|
|
- C) Override threshold for this audit and continue pipeline
|
|
(will be marked as caveat in client doc)
|
|
```
|
|
|
|
Per user instructions (radical honesty, no temp fixes), **default
|
|
recommendation is B**. Only choose C with explicit user consent.
|
|
|
|
After loops finish (success, stall, or override), capture:
|
|
- Web: `SCORE_SEO_AFTER`, `SCORE_HARDEN_AFTER`
|
|
- Non-web: `SCORE_CSO_AFTER`
|
|
|
|
---
|
|
|
|
## STEP 5 — COMMIT + PUSH (only if files changed)
|
|
|
|
```bash
|
|
CHANGED_DURING_PIPELINE=$(git diff --name-only "$PIPELINE_BASE_SHA"..HEAD)
|
|
PENDING_CHANGES=$(git status --porcelain)
|
|
```
|
|
|
|
If both empty → skip to STEP 6.
|
|
|
|
If `PENDING_CHANGES` non-empty → invoke /commit-change skill via subagent:
|
|
|
|
> Dispatch `general-purpose` subagent. Prompt:
|
|
>
|
|
> "Read `~/.claude/skills/commit-change/SKILL.md` and execute. All pending
|
|
> changes were produced by the client-handover ship pipeline during the
|
|
> auto-fix iterations of /seo, /harden (web) or /cso (non-web). Group into
|
|
> atomic logical commits (e.g., separate SEO meta-tag commit from harden
|
|
> security-headers commit; separate dep-upgrade commit from gitignore
|
|
> commit). Use Conventional Commits format. After committing, return the
|
|
> SHA list."
|
|
|
|
Then push:
|
|
|
|
```bash
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
git push origin "$CURRENT_BRANCH" 2>&1
|
|
```
|
|
|
|
If push fails (no remote, auth issue, conflict): capture error, report to
|
|
user via AskUserQuestion:
|
|
|
|
```
|
|
"Push failed: <error>. Pipeline needs the changes published before deploy.
|
|
Options:
|
|
- A) Retry push (after I fix it manually)
|
|
- B) Skip push — I'll publish manually before confirming deploy
|
|
- C) Abort pipeline"
|
|
```
|
|
|
|
---
|
|
|
|
## STEP 6 — DEPLOY PAUSE
|
|
|
|
Skip if `PROJECT_TYPE != web` (non-web has no deploy-then-validate flow —
|
|
set `VALIDATE_SKIPPED=true` and jump to STEP 8).
|
|
|
|
Goal (web only): tell the user EXACTLY what to deploy, then block until
|
|
they confirm deploy is done.
|
|
|
|
### Build the deploy brief
|
|
|
|
```
|
|
DEPLOYED_URL: <auto-detected or "[À CONFIRMER]">
|
|
PROJECT_TYPE: <type>
|
|
DEPLOY_HINTS: <list from STEP 2>
|
|
|
|
Files changed during this pipeline session (since PIPELINE_BASE_SHA):
|
|
<git diff --name-only PIPELINE_BASE_SHA..HEAD>
|
|
|
|
Commits added in this session:
|
|
<git log --oneline PIPELINE_BASE_SHA..HEAD>
|
|
```
|
|
|
|
### Phrase the brief in plain words for the user
|
|
|
|
Tailor to project deploy method (use DEPLOY_HINTS):
|
|
|
|
- **Vercel/Netlify/Cloudflare Pages auto-deploy from git**: "Push has been
|
|
done. The platform deploys automatically — usually 1-3 min. Watch the
|
|
dashboard. Tell me when the new version is live."
|
|
- **GitHub Actions / GitLab CI**: "Workflow `<file>` should run on push.
|
|
Watch CI status. Tell me when it's green and live."
|
|
- **Manual upload (FTP / SSH)**: "Upload these files to the server: `<list>`.
|
|
If using rsync, here's a template: `rsync -avz dist/ user@server:/path`."
|
|
- **Docker / Fly.io / Render**: "Run `<deploy command>` and wait for the
|
|
build to complete."
|
|
- **No deploy detected**: ask user how they deploy, then guide.
|
|
|
|
### Block on confirmation
|
|
|
|
```
|
|
AskUserQuestion:
|
|
"Pipeline paused for deploy. Above is what's changed and how to deploy.
|
|
Confirm when the live site reflects the new changes (or skip /validate)."
|
|
|
|
Header: "Deploy status"
|
|
Options:
|
|
- A) Deployed — proceed with /validate
|
|
- B) Not yet — I'll come back (this stops the pipeline; re-run /client-handover later)
|
|
- C) Skip /validate — proceed to handover doc with VALIDATE marked SKIPPED
|
|
```
|
|
|
|
If A → proceed to STEP 7. If B → exit cleanly with state report. If C →
|
|
mark `VALIDATE_SKIPPED=true` and jump to STEP 8.
|
|
|
|
If `DEPLOYED_URL` is still `[À CONFIRMER]` after option A: AskUserQuestion
|
|
"Quelle est l'URL du site déployé pour /validate ?" — capture URL.
|
|
|
|
---
|
|
|
|
## STEP 7 — RUN /validate (live site)
|
|
|
|
Skip if `VALIDATE_SKIPPED=true` or `PROJECT_TYPE != web` (in either case
|
|
ensure `VALIDATE_SKIPPED=true` is set so the gate logic in STEP 8 treats
|
|
VALIDATE as not-applicable rather than failed).
|
|
|
|
Dispatch `general-purpose` subagent:
|
|
|
|
> Read `~/.claude/skills/validate/SKILL.md` and execute against the
|
|
> deployed URL: `<DEPLOYED_URL>`. Audit W3C HTML validity (validator.nu),
|
|
> W3C CSS validity (jigsaw.w3.org), WCAG 2.1 a11y (axe-core, pa11y).
|
|
> Apply autonomous fixes ONLY in source code (the client controls deploy);
|
|
> document remaining issues. Write report to `.claude/audits/VALIDATE.md`
|
|
> with `Score: X/20` (or `X/100`) at the top.
|
|
|
|
Wait for completion. Parse:
|
|
|
|
```bash
|
|
SCORE_VALIDATE_AFTER=$(extract_score .claude/audits/VALIDATE.md)
|
|
```
|
|
|
|
Note: VALIDATE has no `_BEFORE` (first run is post-deploy). The before/after
|
|
table for VALIDATE shows `—` for before, `<score>` for after.
|
|
|
|
If /validate produced new fixes in source code, run STEP 5 again (mini-commit
|
|
+ push) BEFORE moving to STEP 8 — but DO NOT loop /validate. The remaining
|
|
deploy of those fixes is mentioned to the user in the final doc.
|
|
|
|
---
|
|
|
|
## STEP 8 — GATE EVALUATION
|
|
|
|
Compute final score table.
|
|
|
|
**Web project:**
|
|
|
|
| Audit | Before | After | Status |
|
|
|----------|---------------------------|------------------------|----------------|
|
|
| SEO | `SCORE_SEO_BEFORE`/20 | `SCORE_SEO_AFTER`/20 | ✅ ≥17 / ❌ <17 |
|
|
| HARDEN | `SCORE_HARDEN_BEFORE`/20 | `SCORE_HARDEN_AFTER`/20| ✅ / ❌ |
|
|
| VALIDATE | — | `SCORE_VALIDATE_AFTER`/20 | ✅ / ❌ / SKIPPED |
|
|
|
|
**Non-web project:**
|
|
|
|
| Audit | Before | After | Status |
|
|
|----------|---------------------------|------------------------|----------------|
|
|
| CSO | `SCORE_CSO_BEFORE`/20 | `SCORE_CSO_AFTER`/20 | ✅ ≥17 / ❌ <17 |
|
|
|
|
### Gate rule
|
|
|
|
Web: `ALL_PASS = (SEO_AFTER ≥ 17/20) AND (HARDEN_AFTER ≥ 17/20) AND (VALIDATE_AFTER ≥ 17/20 OR VALIDATE_SKIPPED)`
|
|
|
|
Non-web: `ALL_PASS = (CSO_AFTER ≥ 17/20)`
|
|
|
|
### Threshold strictness
|
|
|
|
Use the raw normalized score. **No rounding.** 16.9/20 fails. 17.0/20 passes.
|
|
A score reported as `UNKNOWN` (no parseable `Score:` line in the audit
|
|
file) is treated as **fail** — re-dispatch the audit subagent with an
|
|
explicit instruction to add a `Score: X/20` line at the top of its
|
|
report. Do not assume a passing score.
|
|
|
|
### Override transparency
|
|
|
|
If the user chose option C (override threshold) at any STEP 4 escalation,
|
|
write `.claude/audits/THRESHOLD-OVERRIDE.md` documenting:
|
|
- Which audit(s) were overridden
|
|
- Final score reached vs threshold
|
|
- Top 3 unresolved issues per audit
|
|
- User's stated reason
|
|
|
|
This file is referenced in §7 of the client doc ("Ce qui reste à faire ou
|
|
à surveiller") so the client knows what's still below the bar.
|
|
|
|
If `ALL_PASS = false`:
|
|
|
|
1. Generate `.claude/audits/HANDOVER-ROADMAP.md` (analysis of what's
|
|
blocking each below-threshold audit — see structure below).
|
|
2. Append checklist entries to `.claude/tasks/TODO.md`.
|
|
3. **Do NOT generate the client doc**. Report to the user:
|
|
|
|
```
|
|
PIPELINE STOPPED — gate failed.
|
|
|
|
Score table:
|
|
<the table above>
|
|
|
|
Below-threshold audits:
|
|
- SEO: <score>/20 — <top 3 remaining issues, one-line each>
|
|
- HARDEN: <score>/20 — <top 3 remaining issues>
|
|
- VALIDATE: <score>/20 — <top 3 remaining issues>
|
|
|
|
Roadmap written to .claude/audits/HANDOVER-ROADMAP.md.
|
|
Tasks appended to .claude/tasks/TODO.md.
|
|
|
|
Resolve P0 items, then re-run /client-handover.
|
|
```
|
|
|
|
If `ALL_PASS = true` → proceed to STEP 9 (memory load + doc generation).
|
|
|
|
### Roadmap structure (when gate fails)
|
|
|
|
```markdown
|
|
# Handover Roadmap — <project name>
|
|
|
|
Generated: YYYY-MM-DD HH:MM
|
|
Trigger: per-audit threshold violated (rule: every audit must be ≥17/20)
|
|
|
|
## Score breakdown
|
|
|
|
| Audit | Before | After | Δ | Status |
|
|
|----------|--------|-------|-----|-------------------|
|
|
| SEO | 14.4 | 16.2 | +1.8| ❌ BELOW_THRESHOLD |
|
|
| HARDEN | 12.0 | 18.0 | +6.0| ✅ OK |
|
|
| VALIDATE | — | 15.5 | — | ❌ BELOW_THRESHOLD |
|
|
|
|
## Remaining issues per audit
|
|
|
|
### SEO (<score>/20)
|
|
|
|
[Extract from `.claude/audits/SEO.md` — the issues NOT auto-fixed.
|
|
Sort by score-gain potential. For each:]
|
|
|
|
1. [TYPE] short title
|
|
- File: `path:line`
|
|
- Fix: <one sentence>
|
|
- Score gain: +X.X/20
|
|
- Why automatic fix didn't work: <reason — needs judgment, external account, manual content>
|
|
|
|
### HARDEN (<score>/20)
|
|
... (same format)
|
|
|
|
### VALIDATE (<score>/20)
|
|
... (same format)
|
|
|
|
## Action plan
|
|
|
|
P0 (do first — bring scores ≥17/20):
|
|
- [ ] [SEO][...] ...
|
|
- [ ] [HARDEN][...] ...
|
|
|
|
P1 (after threshold passed):
|
|
- [ ] ...
|
|
|
|
P2 (manual / requires user input):
|
|
- [ ] ...
|
|
|
|
## How to use
|
|
|
|
1. Tackle P0 with dev team.
|
|
2. Re-run /client-handover — pipeline restarts from baseline audits.
|
|
3. P2 items go to client (will appear in handover doc once gate passes).
|
|
```
|
|
|
|
---
|
|
|
|
## STEP 9 — LOAD MEMORY REGISTRIES
|
|
|
|
(Only reached when STEP 8 gate passes.)
|
|
|
|
```bash
|
|
MEMORY_DIR=".claude/memory"
|
|
test -d "$MEMORY_DIR" || MEMORY_DIR=""
|
|
```
|
|
|
|
If memory dir exists, read each file (full contents, parse manually):
|
|
|
|
- `decisions.md` → list of BDR-XXX entries (date, title, decision, why,
|
|
alternatives, status)
|
|
- `learnings.md` → LRN-XXX entries
|
|
- `blockers.md` → BLK-XXX entries (open vs resolved)
|
|
- `journal.md` → date headings + 3-5 line session summaries
|
|
- `evals.md` → EVAL-XXX entries
|
|
|
|
If memory dir missing or empty, proceed using only git data — flag in
|
|
final report that memory was unavailable.
|
|
|
|
---
|
|
|
|
## STEP 10 — GIT HISTORY SUMMARY
|
|
|
|
```bash
|
|
git log --reverse --format='%h|%aI|%an|%s' | head -200
|
|
git log --name-only --format='---COMMIT---' | grep -v '^---' | sort -u | head -50
|
|
|
|
git log --diff-filter=A --name-only --format='' | sort -u | wc -l # added
|
|
git log --diff-filter=M --name-only --format='' | sort -u | wc -l # modified
|
|
git log --diff-filter=D --name-only --format='' | sort -u | wc -l # deleted
|
|
|
|
git tag --sort=-creatordate | head -5
|
|
```
|
|
|
|
For projects with 200+ commits, use a sub-agent to cluster commits into
|
|
phases (delegate via `Agent` tool with `subagent_type: "Explore"` or
|
|
`general-purpose`):
|
|
|
|
> "Read `git log --reverse --format='%h|%aI|%s'` for this repo (full
|
|
> output). Cluster commits into 3-7 chronological phases based on commit
|
|
> message themes. For each phase: name, date range, commit count, 2-line
|
|
> summary. Output JSON."
|
|
|
|
For smaller projects, do it inline.
|
|
|
|
---
|
|
|
|
## STEP 11 — ASK USER QUESTIONS
|
|
|
|
### Q1 — Deploy chapter (always asked unless flag passed)
|
|
|
|
If `$ARGUMENTS` does NOT contain `--include-deploy` or `--skip-deploy`:
|
|
|
|
```
|
|
Re-grounding: project = <name>, branch = <current>, all audits passed
|
|
(web: SEO <score>/20, HARDEN <score>/20, VALIDATE <score>/20 |
|
|
non-web: CSO <score>/20). Generating client handover document.
|
|
|
|
Le client va recevoir un document qui explique ce qui a été fait. Tu veux
|
|
qu'on ajoute aussi un chapitre qui lui explique comment construire et
|
|
déployer le site lui-même (build, mise en ligne, mise à jour) ? Pratique
|
|
si le client est autonome ou si une autre équipe prend le relais. À éviter
|
|
si tu déploies pour lui.
|
|
|
|
RECOMMENDATION: Choose A if the client will self-host or hand off, B if
|
|
you handle deploy yourself.
|
|
|
|
Options:
|
|
- A) Yes — include build & deploy chapter
|
|
- B) No — skip the deploy chapter (recommended if you deploy for them)
|
|
```
|
|
|
|
(Translate to English if `LANG=en`.)
|
|
|
|
### Q2 — Output language confirmation (only if auto-detection was ambiguous)
|
|
|
|
Skip if confident. Only ask if ambiguous.
|
|
|
|
### Q3 — Web project: SEO/GEO manual chapter
|
|
|
|
Included by default. Do NOT ask. Mention in final summary.
|
|
|
|
If `IS_LOCAL_BUSINESS=true`, the chapter goes deeper on local listings.
|
|
If false, the chapter focuses on general directory + AI search.
|
|
|
|
---
|
|
|
|
## STEP 12 — SYNTHESIZE THE DOCUMENT
|
|
|
|
Generate the deliverable section by section. Translate headings to `LANG`.
|
|
Tone: friendly, concrete, no jargon. One short paragraph per idea.
|
|
|
|
### Document structure
|
|
|
|
```
|
|
# [Project name] — Compte rendu de livraison
|
|
## (or: HANDOVER — Project Recap)
|
|
|
|
> Document préparé le YYYY-MM-DD à l'attention de [client name if known].
|
|
> Ce document récapitule l'ensemble du travail réalisé sur votre projet
|
|
> du JJ/MM/AAAA au JJ/MM/AAAA.
|
|
|
|
## 1. En une minute
|
|
|
|
[2-3 sentences. What is the project, what does it do, current state.]
|
|
|
|
## 2. Ce que vous avez maintenant
|
|
|
|
[Bullet list of features as USER BENEFITS. Pull from journal + commit clusters.]
|
|
|
|
## 3. Comment on en est arrivé là
|
|
|
|
[3 to 7 phases. For each: what was done, why it mattered. Plain phase names.]
|
|
|
|
## 4. État de santé du site (avant / après)
|
|
|
|
[NEW SECTION — score table from STEP 8.]
|
|
|
|
Avant la passe finale → après la passe finale (cette semaine) :
|
|
|
|
| Domaine | Avant | Après | Statut |
|
|
|------------------------------|-----------:|-----------:|:------:|
|
|
| Référencement Google + IA | <X.X>/20 | <Y.Y>/20 | ✅ |
|
|
| Sécurité du site | <X.X>/20 | <Y.Y>/20 | ✅ |
|
|
| Conformité technique (W3C) | — | <Z.Z>/20 | ✅ |
|
|
|
|
[If LANG=en: "Site health (before / after)" with same columns.]
|
|
|
|
Plain explanation under the table:
|
|
- **Référencement** = comment Google et les IA (ChatGPT, Perplexity)
|
|
trouvent et comprennent votre site.
|
|
- **Sécurité** = protections contre les attaques courantes (en-têtes
|
|
HTTPS, anti-injection, etc.).
|
|
- **Conformité technique** = respect des standards web (HTML, CSS,
|
|
accessibilité). Ouvert dans la plupart des navigateurs et lecteurs
|
|
d'écran sans bug.
|
|
|
|
[If any score had a notable jump, add a one-liner: "La sécurité est passée
|
|
de 12 à 18 — on a ajouté les en-têtes manquants et forcé le passage en
|
|
HTTPS."]
|
|
|
|
## 5. Les choix importants qu'on a faits
|
|
|
|
[Vulgarize BDR entries. 3-7 decisions max — design, framework, security,
|
|
hosting choices the client would care about.]
|
|
|
|
## 6. Ce qu'on a appris en route (optionnel)
|
|
|
|
[Only if learnings.md has client-relevant entries. 3-5 bullets max.]
|
|
|
|
## 7. Ce qui reste à faire ou à surveiller
|
|
|
|
[From blockers.md (open) + code TODOs. Plain description, urgency,
|
|
trigger.]
|
|
|
|
## 8. Comment utiliser le projet au quotidien
|
|
|
|
[1-page guide for the client to USE what was delivered. URL, CMS, contact.]
|
|
|
|
## 9. Ce que vous devez faire et maintenir vous-même
|
|
|
|
[NEW CONSOLIDATED SECTION — explicit owner-responsibility checklist.
|
|
Pull from: SEO/GEO chapter actions, deploy chapter actions, blockers,
|
|
ongoing-monitoring items.
|
|
|
|
Format as actionable checklist grouped by cadence:
|
|
|
|
### Une fois (à faire dans les premières semaines)
|
|
- [ ] Réclamer la fiche Google Business Profile et la vérifier (lien : ...)
|
|
- [ ] Compléter le profil Apple Business Connect (lien : ...)
|
|
- [ ] Vérifier la cohérence NAP (Nom / Adresse / Téléphone) sur toutes
|
|
les plateformes — voir tableau au §10
|
|
- [ ] [Si self-host : configurer le certificat SSL (renouvellement auto Let's Encrypt)]
|
|
- [ ] [Si self-host : programmer une sauvegarde quotidienne]
|
|
- [ ] Sauvegarder ce document hors du dépôt (PDF, email)
|
|
|
|
### Mensuel
|
|
- [ ] Ajouter / mettre à jour 5 photos sur Google Business
|
|
- [ ] Répondre aux avis Google (positifs et négatifs)
|
|
- [ ] Vérifier que le site est toujours en ligne (test simple : ouvrir
|
|
l'URL depuis un autre appareil)
|
|
- [ ] [Si CMS : mettre à jour les contenus saisonniers]
|
|
|
|
### Trimestriel
|
|
- [ ] Faire un test de visibilité IA : taper le nom du commerce dans
|
|
ChatGPT, Perplexity, Gemini. Noter ce qui s'affiche.
|
|
- [ ] Demander à 3-5 clients de laisser un avis Google
|
|
- [ ] Publier un post Google Business (offre, événement, actualité)
|
|
|
|
### Annuel
|
|
- [ ] Mettre à jour la photo de couverture Google Business
|
|
- [ ] Vérifier que les horaires saisonniers sont bons
|
|
- [ ] Renouveler les noms de domaine
|
|
|
|
### Quand quelque chose change dans la vie du commerce
|
|
- [ ] Changement d'adresse / téléphone / horaires → modifier d'abord sur
|
|
Google Business, puis sur toutes les autres plateformes (la
|
|
cohérence est cruciale, voir §10)
|
|
|
|
[Adapt cadences to project type. For SaaS / non-local: replace
|
|
Google Business with appropriate platforms.]
|
|
```
|
|
|
|
## 10. [SEO/GEO manual chapter — web projects only — see STEP 13]
|
|
|
|
## 11. [Build & deploy chapter — only if Q1=Yes — see STEP 14]
|
|
|
|
## 12. Pour aller plus loin
|
|
|
|
[3-5 concrete suggestions. Phrase as opportunities.]
|
|
|
|
## Annexe — Détails techniques
|
|
|
|
[Pointer for the technically curious — README, source repo, etc.]
|
|
|
|
---
|
|
|
|
*Document généré automatiquement à partir de l'historique du projet et
|
|
des audits de santé. Pour toute question, contactez [contact].*
|
|
```
|
|
|
|
### Tone rules
|
|
|
|
1. Address the client directly ("votre site", "vous pouvez").
|
|
2. Replace tech terms with user-facing equivalents.
|
|
3. No abbreviations the client wouldn't use.
|
|
4. Concrete numbers > adjectives.
|
|
5. Short paragraphs. Bullet lists for things you can count.
|
|
6. **Score deltas explained in plain words**. Never just dump numbers.
|
|
7. **Owner-responsibility section is action-oriented**. Every line starts
|
|
with a verb. Every line is something the client can do without a dev.
|
|
|
|
---
|
|
|
|
## STEP 13 — SEO/GEO MANUAL CHECKLIST (web projects only)
|
|
|
|
If `PROJECT_TYPE=web` AND `--skip-seo` NOT set, append this chapter
|
|
(numbered §10 in the doc).
|
|
|
|
Read the resource file:
|
|
`$HOME/.claude/skills/client-handover/checklists/seo-geo-manual.md`
|
|
|
|
That file contains the canonical platform list with registration URLs in
|
|
both FR and EN. Use the section matching `LANG` and `IS_LOCAL_BUSINESS`.
|
|
|
|
If the file is unreachable, fall back to the inline platform list at the
|
|
bottom of this agent.
|
|
|
|
The chapter must include:
|
|
|
|
1. **Pourquoi c'est important** (1 paragraph). Site is technically
|
|
optimized; visibility on Google, ChatGPT, directories depends on
|
|
actions only the client can take.
|
|
|
|
2. **NAP consistency** (table). Same exact spelling EVERYWHERE.
|
|
|
|
```
|
|
| Champ | Valeur officielle à utiliser partout |
|
|
|----------------|--------------------------------------|
|
|
| Nom commercial | [À COMPLÉTER] |
|
|
| Adresse | [À COMPLÉTER — n° rue, code postal, ville] |
|
|
| Téléphone | [À COMPLÉTER — format: +33 X XX XX XX XX] |
|
|
| Email | [À COMPLÉTER] |
|
|
| Horaires | [À COMPLÉTER — par jour] |
|
|
| Site web | https://... |
|
|
```
|
|
|
|
3. **Platform checklist** (priority-ordered table per `IS_LOCAL_BUSINESS`).
|
|
Each row: Plateforme | Pourquoi | Lien d'inscription | Action | Statut.
|
|
|
|
4. **AI search visibility (GEO)**. Plain explanation + actions: Wikidata,
|
|
Knowledge Panel, llms.txt, periodic re-audit.
|
|
|
|
5. **Reviews & reputation**.
|
|
|
|
6. **Photos & content**.
|
|
|
|
7. **Schedule** (Semaine 1 / Mois 1 / Mois 3 / Trimestriel).
|
|
|
|
8. **Outils gratuits pour vérifier votre présence**.
|
|
|
|
Cross-link this chapter from §9 (owner responsibilities). Items in §13
|
|
that are recurring belong in §9's cadence checklist.
|
|
|
|
---
|
|
|
|
## STEP 14 — BUILD & DEPLOY CHAPTER (only if Q1=Yes)
|
|
|
|
For each `DEPLOY_HINTS` match, generate a short subsection:
|
|
1. What this means (1 paragraph).
|
|
2. First-time setup (numbered steps + signup link).
|
|
3. Day-to-day deploy (typical command / click sequence).
|
|
4. How to know it worked (where to check URL, where to find logs).
|
|
5. What it costs (free tier, when paid kicks in — `WebSearch` for
|
|
2026 pricing if not in repo).
|
|
6. Who to call when it breaks (status page, support link).
|
|
|
|
If no deploy hints, offer 2-3 standard options:
|
|
- Static site → Netlify / Vercel / Cloudflare Pages
|
|
- Webapp → Fly.io / Render / Vercel / Railway
|
|
- CLI / library → npm / PyPI / crates.io / Homebrew
|
|
|
|
For each: signup + 5-step deploy walkthrough.
|
|
|
|
---
|
|
|
|
## STEP 15 — WRITE OUTPUT
|
|
|
|
Default output path: project root.
|
|
- `LIVRAISON.md` if `LANG=fr`
|
|
- `HANDOVER.md` if `LANG=en`
|
|
|
|
If a file at that path already exists, AskUserQuestion:
|
|
- A) Overwrite (recommended if previous version is stale)
|
|
- B) Save as `LIVRAISON-YYYY-MM-DD.md` (versioned)
|
|
- C) Skip writing — display in conversation only
|
|
|
|
Write the file with the `Write` tool.
|
|
|
|
Sanity check:
|
|
```bash
|
|
wc -l <output> # expect 200-800 lines
|
|
grep -c "^## " <output> # expect 8-13 chapters (NEW: §4 health, §9 owner-resp)
|
|
```
|
|
|
|
---
|
|
|
|
## STEP 16 — FINAL REPORT
|
|
|
|
Output to the user:
|
|
|
|
```
|
|
DONE — ship-and-handover pipeline complete.
|
|
|
|
OUTPUT: <path>
|
|
LANGUAGE: fr | en
|
|
PROJECT TYPE: web (local-business) | web | cli | library | mobile | other
|
|
COMMITS ANALYZED: <count> from <first date> to <last date>
|
|
|
|
PIPELINE RESULT (web):
|
|
SEO <BEFORE>/20 → <AFTER>/20 ✅ (iterations: <N>)
|
|
HARDEN <BEFORE>/20 → <AFTER>/20 ✅ (iterations: <N>)
|
|
VALIDATE — → <AFTER>/20 ✅ (post-deploy)
|
|
|
|
PIPELINE RESULT (non-web):
|
|
CSO <BEFORE>/20 → <AFTER>/20 ✅ (iterations: <N>)
|
|
|
|
PIPELINE COMMITS: <list of SHAs created during STEP 5> (pushed: yes/no)
|
|
DEPLOY: confirmed at <YYYY-MM-DD HH:MM> — URL: <DEPLOYED_URL>
|
|
DECISIONS VULGARIZED: <count>
|
|
BLOCKERS REMAINING: <count> (open)
|
|
|
|
DOC SECTIONS WRITTEN:
|
|
§1-3 Project recap
|
|
§4 Site health (before/after) ← NEW
|
|
§5 Key decisions
|
|
§6 Lessons learned (optional)
|
|
§7 Open items / things to monitor
|
|
§8 Day-to-day usage
|
|
§9 Owner responsibilities checklist ← NEW
|
|
§10 SEO/GEO manual chapter (web)
|
|
§11 Build & deploy chapter (only if requested)
|
|
§12 Pour aller plus loin
|
|
|
|
Next steps for the user:
|
|
1. Read the document end-to-end before sending — fill any
|
|
[À COMPLÉTER] / [À CONFIRMER] markers (especially NAP in §10).
|
|
2. Save a copy outside the repo (PDF, email).
|
|
3. Walk through §9 (owner responsibilities) with the client during the
|
|
handover meeting — it's the part they MUST act on.
|
|
```
|
|
|
|
If anything was skipped or uncertain, list under `CONCERNS:`.
|
|
|
|
---
|
|
|
|
## VOICE RULES (the whole document)
|
|
|
|
- **Vulgarize, don't dumb down.**
|
|
- **No emojis** unless the project itself uses them prominently.
|
|
- **No marketing fluff.**
|
|
- **Concrete numbers > adjectives.**
|
|
- **Lead with the user benefit.**
|
|
- **Acknowledge limits.**
|
|
- **No false modesty, no false confidence.**
|
|
|
|
---
|
|
|
|
## ESCALATION
|
|
|
|
If at any step you cannot proceed:
|
|
|
|
```
|
|
STATUS: BLOCKED | NEEDS_CONTEXT
|
|
STEP: <which step>
|
|
REASON: [1-2 sentences]
|
|
ATTEMPTED: [what you tried]
|
|
RECOMMENDATION: [what the user should do next]
|
|
PIPELINE STATE: <which scores captured, which commits made, which
|
|
files modified — so user can resume>
|
|
```
|
|
|
|
---
|
|
|
|
## PLATFORM REFERENCE (fallback if checklists/seo-geo-manual.md missing)
|
|
|
|
Local-business priority order with 2026 signup URLs:
|
|
|
|
1. Google Business Profile — https://www.google.com/business/
|
|
2. Apple Business Connect — https://businessconnect.apple.com/
|
|
3. Bing Places for Business — https://www.bingplaces.com/
|
|
4. Pages Jaunes (FR) — https://www.pagesjaunes.fr/pro/inscription
|
|
5. Facebook Page — https://www.facebook.com/pages/create
|
|
6. Instagram Business — https://business.instagram.com/
|
|
7. TripAdvisor (hospitality) — https://www.tripadvisor.com/Owners
|
|
8. TheFork / La Fourchette (restaurants FR) — https://www.thefork.com/restaurant
|
|
9. Yelp — https://biz.yelp.com/
|
|
10. Mappy (FR) — https://corporate.mappy.com/
|
|
11. Waze — https://www.waze.com/business/
|
|
12. Foursquare for Business — https://business.foursquare.com/
|
|
13. Bottin / Justacote (FR) — https://www.justacote.com/
|
|
14. Hoodspot (FR) — https://www.hoodspot.fr/
|
|
15. Trustpilot — https://business.trustpilot.com/
|
|
16. Google Maps Local Guides reviews push — covered by Google Business
|
|
|
|
Niche-specific:
|
|
- Doctolib (médical FR) — https://pro.doctolib.fr/
|
|
- Booking.com (hôtellerie) — https://www.booking.com/business
|
|
- Airbnb (locations) — https://www.airbnb.com/host/homes
|
|
- LinkedIn Company Page — https://www.linkedin.com/company/setup/new/
|
|
- TikTok Business — https://www.tiktok.com/business/
|
|
- Pinterest Business — https://business.pinterest.com/
|
|
|
|
Non-local web priority:
|
|
1. Google Search Console — https://search.google.com/search-console
|
|
2. Bing Webmaster Tools — https://www.bing.com/webmasters
|
|
3. Wikidata entry — https://www.wikidata.org/wiki/Special:CreateAccount
|
|
4. LinkedIn Company Page (B2B)
|
|
5. Product Hunt (launches) — https://www.producthunt.com/posts/new
|
|
6. Crunchbase (startups) — https://www.crunchbase.com/add-new
|
|
7. G2 / Capterra (SaaS reviews) — https://www.g2.com/, https://www.capterra.com/
|
|
8. GitHub topic + README badges (open source)
|
|
|
|
AI visibility (GEO):
|
|
- Wikidata Q-item with `sameAs`
|
|
- Schema.org JSON-LD: Organization, LocalBusiness, niche, FAQPage, Article, Person
|
|
- llms.txt at site root
|
|
- Direct AI checks: search business name on ChatGPT, Claude, Perplexity, Gemini
|
|
|
|
If you need 2026-current pricing, signup steps, or a platform you're
|
|
unsure exists, use `WebSearch` and confirm before listing it. Do NOT
|
|
invent links.
|
|
|
|
---
|
|
|
|
## EDGE CASES
|
|
|
|
| Situation | Behavior |
|
|
|---|---|
|
|
| Repo has < 3 commits since first commit | Skip phase clustering in §3 of the deliverable; emit a short "First milestone" note instead. Do not fabricate phases. |
|
|
| `git log` empty (newly-initialised repo, no commit yet) | Print `"⚠️ no git history — handover doc requires at least one commit. Run /commit-change first."` and STOP before generating the doc. |
|
|
| Audit file exists but `Score:` line is malformed after re-dispatch retry | Mark `SCORE_<X>_AFTER=UNKNOWN`. Treat as below-threshold for STEP 8 gate (cannot certify). Append diagnostic to HANDOVER-ROADMAP.md: `"<audit> score unparseable — re-run /<audit> manually."` |
|
|
| Audit file missing entirely after STEP 4 attempts | Same as malformed: UNKNOWN, gate fails. Note `"<audit> file absent — auto-fix loop produced no output, see .claude/audits/."` |
|
|
| User confirms deploy in STEP 6 but `DEPLOYED_URL` is still empty | Re-prompt once: `"You confirmed Yes — what's the deployed URL? (paste URL or 'skip-validate' to set VALIDATE_SKIPPED=true)"`. On second empty answer, set VALIDATE_SKIPPED=true and proceed to STEP 8. |
|
|
| Deploy URL paste returns HTTP 0 / DNS failure during STEP 7 | Retry once after 30s. Still failing → set VALIDATE_SKIPPED=true with reason `"unreachable: <error>"`. Do not block the handover doc. |
|
|
| `.claude/memory/` registries do not exist | Skip the "Decisions / Learnings / Blockers" section in §3 with a one-line note: `"(no .claude/memory/ — registries not initialised on this project)."` Do not create them here — that is /onboard's job. |
|
|
| `--skip-audits` flag passed but `.claude/audits/` empty | STOP with `"--skip-audits requires existing audit files in .claude/audits/. None found — drop the flag or run /seo and /harden first."` |
|
|
| Output file (LIVRAISON.md / HANDOVER.md) already exists | Show diff vs. new content. Ask `"overwrite / save as -v2 / abort?"`. Default behavior must not silently overwrite a curated client doc. |
|