Descripteurs well-known OpenAPI
`GET /.well-known/openapi.json` et `GET /.well-known/openapi.yaml` servent le contrat public curé OpenAPI 3.1 sur le chemin well-known RFC 8615. Les deux endpoints sont non authentifiés, renvoient des ETags forts dérivés d’un hash de contenu et honorent `If-None-Match` avec `304 Not Modified` pour permettre un cache agressif. Le descripteur est filtré contre la denylist publique de `app/core/public_contract_filter.py`, miroir du tableau `denylist` du contrat du site : les routes internes, admin et plateforme n’apparaissent jamais. Les deux formats sont sémantiquement équivalents ; seule la sérialisation diffère.