# ✅ Vérification humaine — `dev-verif-2` (Discovery / IA / well-known)

**Branche :** `dev-verif-2` (depuis `dev-verif-1`)
**Lot :** Découvrabilité agents IA + `/.well-known/` + anti-clickjacking moderne
**Date :** 2026-06-01

## Items d'audit corrigés

| # | Item (spec) | Avant | Après |
|---|---|---|---|
| 1 | agent-readiness / **link-headers** | ❌ seul `Link: rel=canonical` | ✅ + 5 relations discovery |
| 2 | well-known / **api-catalog** (RFC 9727) | ❌ 404 | ✅ Linkset JSON 200 |
| 3 | security / **security.txt** (RFC 9116) | ❌ 404 | ✅ 200 text/plain |
| 4 | well-known / **well-known-overview** | ❌ namespace vide | ✅ 2 ressources servies |
| 5 | security / **frame-ancestors** | ⚠️ X-Frame-Options seul | ✅ + CSP `frame-ancestors 'none'` |

## Changements (fichiers)

- `app/api/wellknown/security/route.ts` — **nouveau** : sert security.txt (RFC 9116).
- `app/api/wellknown/api-catalog/route.ts` — **nouveau** : Linkset RFC 9264 (llms.txt, services.md, sitemap, feed, llms-full).
- `next.config.ts` — `rewrites()` : `/.well-known/security.txt` et `/.well-known/api-catalog` → route handlers (les dossiers `.well-known` ne sont pas scannés par l'App Router). Header `Content-Security-Policy: frame-ancestors 'none'` ajouté au bloc global.
- `proxy.ts` — le middleware posait déjà `Link: rel=canonical` via `.set()` (qui écrasait tout `Link` de config) ; on **append** maintenant 5 liens de discovery.

## Preuves de vérification (build prod local :3001)

```
/ , /guides/… , /contact/  →  HTTP 200
  Link: <…>; rel="canonical",
        </llms.txt>; rel="describedby"; type="text/markdown",
        </llms-full.txt>; rel="alternate"; type="text/markdown",
        </sitemap.xml>; rel="sitemap"; type="application/xml",
        </feed.xml>; rel="alternate"; type="application/rss+xml",
        </.well-known/api-catalog>; rel="api-catalog"
  Content-Security-Policy: frame-ancestors 'none'

/.well-known/security.txt  → HTTP 200, RFC 9116 (Contact / Expires / Preferred-Languages / Canonical)
/.well-known/api-catalog   → HTTP 200, application/linkset+json
```
`pnpm build` : exit 0. (curl est deny-listé → vérifs faites via `python3 urllib`.)

## ⚠️ À confirmer par un humain AVANT merge

- [ ] **Email de contact sécurité** dans `app/api/wellknown/security/route.ts` : placeholder `contact@aciebenergie.fr`. Mettre la vraie adresse (ex. `security@…`) si différente.
- [ ] Vérifier en prod après déploiement : `https://www.aciebenergie.fr/.well-known/security.txt` et `/.well-known/api-catalog` répondent 200.
- [ ] `Link` discovery non posé sur sitemap.xml/robots.txt/feed.xml/manifest (exclus par le matcher du middleware) — comportement voulu (ces ressources sont déjà les cibles), à confirmer OK.

## Comment re-vérifier soi-même

```bash
pnpm build && pnpm exec next start -p 3001 &
python3 -c "import urllib.request as u; r=u.urlopen('http://localhost:3001/.well-known/security.txt'); print(r.status); print(r.read().decode())"
python3 -c "import urllib.request as u; r=u.urlopen('http://localhost:3001/'); print(r.headers.get_all('Link'))"
```

## Décision

- [ ] **Lot validé** → mergeable dans `dev`.
- [ ] Corrections demandées :

> _Notes du vérificateur :_
