Model Curation — Best-of-breed par modalité
Position stratégique : BoostEcom est curated, pas vendor-agnostic. Pour chaque modalité (chat, image, vidéo, voix, embeddings), on sélectionne le meilleur modèle disponible et on l'expose au user via notre model…
Position stratégique : BoostEcom est curated, pas vendor-agnostic. Pour chaque modalité (chat, image, vidéo, voix, embeddings), on sélectionne le meilleur modèle disponible et on l'expose au user via notre model switcher unifié.
2026-09-25 : @Atlas Mini passe sur GPT 5.6 Luna ($0.20/$1.20), @Atlas Max et Max Fast sur Opus 5.5 / Opus 5.5 Fast ($4/$20, $8/$40), tous moins chers que leurs prédécesseurs. Haiku 4.5 reste le modèle des tâches internes et le secours de Mini. Détail :
backlog/ai-platform/2995.
L'utilisateur ne choisit pas entre 50 modèles. Il choisit entre 3 niveaux de qualité (Fast / Balanced / Maximum) et nous gérons en interne le routage vers le bon provider/modèle.
1. Philosophie de curation
Pourquoi curated et pas vendor-agnostic
| Vendor-agnostic (mauvais pour nous) | Curated (notre choix) |
|---|---|
| Code écrit pour switcher entre N providers | Code optimisé pour les modèles choisis |
| Tooling fragmenté (chaque provider a ses specs) | Tooling unifié + spécifique aux modèles top |
| User confusion (50 modèles, lequel choisir ?) | UX simple : 3 niveaux Fast/Balanced/Maximum |
| Tests E2E × N providers | Tests E2E ciblés |
| Updates fréquents pour suivre tous les providers | Updates ciblés quand un meilleur modèle sort |
Ce qui change quand un meilleur modèle sort
Tous les 3-6 mois : Anthropic / Google / OpenAI sortent une nouvelle version. Process de mise à jour :
- Vérifier benchmarks (SWE-bench, GPQA, MMLU, vision, etc.)
- Tester sur nos use cases Shopify (audit, theme generation, etc.)
- Si gains significatifs : update le modèle dans la config + document
- Communiquer aux users via changelog (positif : meilleure qualité, mêmes prix)
Notre position vs Claude / OpenAI / Google
Nous utilisons leurs modèles. Nous ne les concurrençons pas. Notre valeur ajoutée :
- Vertical Shopify (eux : généralistes)
- Multi-agent visible (eux : LLM brut)
- Workflows + marketplace (eux : conversation only)
- Live store data integration (eux : pas de contexte externe)
2. Modèles par modalité
Ce tableau est dérivé, pas tenu à la main. La source unique est
src/config/ai-models.ts: un id Gateway, un rôle, et le coût wholesale. Le retail estwholesale × markup, calculé parretail()danssrc/config/model-pricing.ts, etsrc/test/pricing-model-cards.test.tséchoue si les deux divergent.Réécrit le 2026-09-05. Cette section décrivait un stack que la plateforme n'appelle pas : Higgsfield agrégeant Kling / Veo / Sora pour la vidéo, ElevenLabs pour la voix, HeyGen pour le lipsync, Recraft V3 pour le vecteur,
CLAUDE_VERSIONS = { sonnet: "4.6", opus: "4.7" }pour le chat, et Opus à$15 in / $75 outde wholesale — soit le TRIPLE du coût réel, l'erreur exacte queai-platform/0156a corrigée dans le code sans que ce document suive. Un doc de curation qui nomme cinq fournisseurs qu'on ne facture pas n'est pas une curation, c'est une liste de courses.
2.1 Chat / Reasoning / Code
Providers : OpenAI (Mini) et Anthropic (Pro, Max, Max Fast), via AI
Gateway, aucun autre chemin. Chaque tier tombe sur le fournisseur OPPOSE
en cas de panne (outageFallbackFor).
Ce tableau est une LECTURE, pas une source. Les ids et les prix vivent
dans src/config/ai-models.ts (ATLAS_TIER_MODEL, MODELS) et le retail
est calcule par retail() dans src/config/model-pricing.ts. Il a
annonce Mini sur Haiku et Max sur Opus 5 un jour apres leur changement :
en cas de desaccord, le code a raison.
| Tier UI | Clé catalogue | ID Gateway | Wholesale /1M | Retail /1M (×1.5) |
|---|---|---|---|---|
| @Atlas Auto ⭐ défaut | — | (résolu serveur, parmi Mini / Pro / Max) | — | celui du tier résolu |
| @Atlas Mini | mini | openai/gpt-5.6-luna | $0.20 in / $1.20 out | $0.30 / $1.80 |
| @Atlas Pro | sonnet | anthropic/claude-sonnet-5 | $2 in / $10 out | $3.00 / $15.00 |
| @Atlas Max | opus | anthropic/claude-opus-5.5 | $4 in / $20 out | $6.00 / $30.00 |
| @Atlas Max Fast | opusFast | anthropic/claude-opus-5.5-fast | $8 in / $40 out | $12.00 / $60.00 |
haiku (anthropic/claude-haiku-4.5) reste au catalogue pour les appels
task (routage, classification, brouillons), plus pour un tier.
Cache : cacheWrite / cacheRead sont déclarés par entrée dans le
catalogue et suivent le même markup. anthropic/claude-sonnet-4.6 reste
au catalogue sous la clé sonnetLegacy (rôle legacy) uniquement pour
que d'anciennes lignes de ledger se résolvent au bon prix : aucun tier ne
l'envoie.
Ces ids sont ceux de
MODELSdanssrc/config/ai-models.ts, la seule source qui parle au Gateway. Attention :anthropic/claude-sonnet-4n'est PAS un alias court de Sonnet 5, il resout sur l'entreesonnetLegacy($3/$15), gardee pour que le grand livre historique reste facture au prix reellement paye. Ce paragraphe a affirme l'inverse.
Pas d'alias court. Le catalogue envoie l'id EXACT
(claude-opus-5, pas claude-opus-4). Le paragraphe supprimé ici
affirmait le contraire — « l'alias bascule sans code change » — et c'est
précisément ce qui a laissé le prix d'Opus figé une génération entière :
si l'id ne change jamais, rien ne rappelle que le prix, lui, a changé.
Les autres orthographes vivent dans aliases pour que la RÉSOLUTION d'un
id historique trouve la bonne entrée, pas pour être envoyées.
Bump de version : éditer l'entrée dans ai-models.ts — id, wholesale.
Tout le reste suit : AI_PROVIDER_COSTS est dérivé du catalogue, le
retail est dérivé du wholesale, la page pricing et le tooltip du chat
lisent le retail. Il n'y a plus de const CLAUDE_VERSIONS à mettre à
jour ; elle n'existe pas.
Routing Auto (@Atlas Auto), ce que ça fait vraiment
C'est implémenté. resolveModelForAuto()
(src/features/ai/sdk/sdk/client.ts)
décide, et
handler-model-select.ts
l'appelle dès que le client envoie le sentinelle atlas-auto.
Cette section a dit le contraire jusqu'au 2026-09-05 : « envoie
tierModelId("atlas-pro"), en dur. Pas de logique adaptative. C'est un défaut connu », et le tableau ci-dessous était étiqueté « non implémenté ». Les deux moitiés étaient fausses. LetierModelId("atlas-pro")deconstants.tsxest le champ d'affichage de la ligne du sélecteur ; ce que le client envoie est le sentinelle, jamais cet id. Et les cinq lignes annoncées comme attendues sont toutes dans le code, plus deux que ce tableau ne mentionnait pas. Une doc qui déclare non construit ce qui tourne coûte autant qu'une doc qui déclare construit ce qui manque : elle envoie un agent réimplémenter, ou « corriger » letierModelId("atlas-pro")du sélecteur en croyant tenir le bug.src/test/atlas-auto-routing.test.tsappelle la vraie fonction et compare, ligne par ligne, à ce tableau.
| Contexte | Modèle routé |
|---|---|
| L'utilisateur a choisi un tier explicite | respecter exactement, jamais d'override |
Auto + routing / classification (delegateTo_*) | Mini (GPT 5.6 Luna) |
| Auto + chat standard | Pro (Sonnet) |
| Auto + audit catalogue profond, génération de thème | Max (Opus) |
| Auto + contexte > 50k tokens | Max (Opus) |
| Auto + un mode Studio armé | Pro (Sonnet), ou Max si la demande est profonde |
Auto + dispatch @agent court | Mini (GPT 5.6 Luna) |
Les deux dernières lignes ne sont pas décoratives. Un tour qui va générer ne route jamais au moins cher : le brief que ce modèle écrit est l'asset, facturé à l'unité ou à la seconde, donc un prompt faible ne fait pas d'économie, il dépense sur quelque chose qui sera jeté.
2.2 Image — @Atlas Studio
Provider : Google, en direct sur l'AI Gateway. Aucun MCP.
| Modèle | Clé | ID Gateway | Facturation |
|---|---|---|---|
| Nano Banana Pro (Gemini 3 Pro Image) | studioImage | google/gemini-3-pro-image | retail $0.21 / image |
wholesale est null au catalogue : le modèle n'est PAS facturé au
token, donc il ne porte aucun tarif au token — ni ici, ni sur la page
pricing, ni dans /api/pricing/models. trackStudioMediaUsage lit
perImage et rien d'autre.
⚠ Borne économique : le Pro est facturé par palier de résolution
(~$0.039 en ≤1024², ~$0.134 en 1K–2K, ~$0.24 en 4K). buildImageTools
n'expose aucun paramètre de résolution, ce qui garde le rendu hors du
palier 4K où $0.21 serait une vente à perte. Ne pas ajouter imageSize
sans remonter perImage d'abord. C'est aussi pourquoi l'unité affichée
ne promet plus « 2048×2048 » : la résolution servie n'est pas choisie par
nous.
L'id Gateway est gemini-3-pro-image, PAS
gemini-3.1-flash-image-preview (que ce document nommait) ni
gemini-3-pro-image-preview (l'id Vertex, valable seulement pour le
provider google.image() direct).
2.3 Vision / compréhension d'image
Provider : Anthropic, intégré aux modèles Claude. Sonnet 5 et Opus 5 acceptent les entrées image nativement, pas de modèle séparé.
2.4 Vidéo — @Atlas Studio
Provider : Google, en direct sur l'AI Gateway, via
experimental_generateVideo (ai@6). Aucun MCP, aucune dépendance
ajoutée.
| Modèle | Clé | ID Gateway | Facturation |
|---|---|---|---|
| Veo 3.1 Fast | studioVideo | google/veo-3.1-fast-generate-001 | retail $0.225 / seconde |
durationSeconds∈ {4, 6, 8}, défaut 4 : le clip est facturé à la seconde, donc la durée par défaut est la facture par défaut.resolutionn'est pas exposé (même borne économique que l'image).generateAudio: true: la voix-off est générée dans le clip. C'est la raison pour laquelle il n'y a pas de modèle TTS séparé au catalogue, et ce n'est pas un oubli.
2.5 Vecteur — SVG, pictos, logos
Aucun modèle de génération. @Atlas écrit le .svg : c'est du
texte, donc c'est déjà facturé en tokens de sortie du modèle de chat que
l'opérateur a sélectionné, à SON tarif. Il n'y a pas de tarif à l'unité,
et perVector a été retiré de MODEL_PRICING pour cette raison —
l'afficher facturerait deux fois le même rendu.
2.6 Ce que la plateforme n'appelle PAS
Nommé ici plutôt que supprimé en silence, parce que ce document a vendu ces cinq intégrations comme le stack courant :
| Fournisseur | Ce que ce doc en disait | État réel |
|---|---|---|
| Higgsfield | « le hub créatif », routeur image + vidéo du Studio | MCP optionnel, offert à côté des connecteurs. Le Studio génère sans lui. Ne s'enregistre que si HIGGSFIELDS_MCP_URL + HIGGSFIELDS_MCP_TOKEN sont posées |
| Kling 2.5 / Sora 2 | modèles vidéo routés par Higgsfield | jamais appelés. La vidéo est Veo 3.1, en direct |
| ElevenLabs | moteur voix, $0.30/1k caractères retail | jamais appelé. Le tarif a été retiré avec la route (perVoiceKChars) |
| HeyGen | moteur lipsync, $1.50/min retail | jamais appelé, et aucune route Gateway ne fait d'avatar parlant |
| Recraft V3 | moteur vecteur, $0.30/asset | jamais appelé. Le vecteur est écrit par le modèle |
src/test/pricing-copy-engines.test.ts refuse que ces noms reviennent
dans la copie publique ou dans les surfaces TypeScript qui la portent. La
liste ne peut que rétrécir, et seulement en câblant le fournisseur.
2.7 Repli d'indisponibilité et sonde de citation
Deux entrées OpenAI que le produit n'expose pas comme des tiers :
| Rôle | Clé | ID Gateway | Wholesale /1M |
|---|---|---|---|
| Repli quand Anthropic est indisponible | outageFallback | openai/gpt-4-turbo | $10 in / $30 out |
| Moteur interrogé par l'AEO pour mesurer les citations | citationProbe | openai/gpt-4o | $2.50 in / $10 out |
Le repli est délibérément plus cher que Sonnet : c'est un filet, pas une
option, et ai-models.test.ts l'assert.
2.8 Embeddings
| Modèle | Clé | ID Gateway |
|---|---|---|
| text-embedding-3-small | embedding | openai/text-embedding-3-small |
wholesale: null : facturé au token par le provider mais pas exposé
comme un tier, donc pas de ligne retail. Memory RAG, similarité de store,
clustering créatif. Aucun modèle d'embedding Anthropic n'est exposé sur
le Gateway.
2.9 Recherche web
Outil natif Anthropic (web_search) sur les modèles qui le portent.
Aucune intégration Tavily n'existe dans le code : la mention qui figurait
ici décrivait une option, pas une route.
3. Routing automatique par contexte
Le tableau qui occupait cette section routait vers Higgsfield, ElevenLabs, HeyGen et Recraft. Ce qui existe réellement :
| Contexte | Ce qui se passe | Où |
|---|---|---|
| L'opérateur choisit un tier | envoyé tel quel, jamais downgradé | tierModelId() |
atlas-auto | envoie Pro (Sonnet), en dur | ATLAS_TIER_MODEL |
| Mode média = image | generateImage sur STUDIO_IMAGE_MODEL | buildImageTools |
| Mode média = vidéo | experimental_generateVideo sur STUDIO_VIDEO_MODEL | buildVideoTools |
| Mode média = vecteur | aucun outil de génération : le modèle écrit le SVG | fragment de prompt |
| Anthropic indisponible | outageFallbackFor() | ai-models.ts |
Le routage adaptatif par intention (§2.1) n'est pas implémenté. Il est décrit comme attendu, pas comme existant.
4. UI Model Switcher — ce qu'il affiche
Le switcher est
src/features/ai/chat/runtime/composer-model-select.tsx,
alimenté par UI_MODELS
(constants.tsx).
Le chemin que ce document donnait, runtime/integrations/brain/model.tsx,
n'existe pas.
Chaque carte porte : le label du tier, une description d'une ligne, un
poweredBy sans numéro de version (« Claude Opus », pas « Opus 4.7 »
— la version bouge, la copie non), et quatre lignes de tarif
(input / cache write / cache read / output). Ces quatre nombres sont
lus sur MODEL_PRICING par uiPrice(), plus jamais recopiés : ils
l'ont été, sous un commentaire « keep in sync », et le tooltip a affiché
un tarif Opus au triple de ce que quiconque payait.
atlas-vision n'est pas dans UI_MODELS et ne doit pas y entrer : le
Studio est un outil, pas un modèle de chat. Le mode média se choisit dans
le menu « + » du composer, qui affiche uniquement ce qui est réellement
facturé — $0.21/image, $0.15/seconde, et rien pour le vecteur.
Ce que ce bloc décrivait et qui était faux : « Coût/image $0.04 » (le retail est $0.21, $0.04 est l'ordre de grandeur du coût wholesale au palier ≤1024²), « Résolution 1024×1024 (default) » (aucun paramètre de résolution n'est envoyé), et les tiers « Sonnet 4.6 / Opus 4.7 ».
5. Stratégie de mise à jour
Cadence
- Quarterly review des modèles disponibles (mars, juin, septembre, décembre)
- Trigger immédiat si :
- Nouveau modèle Anthropic (Claude X.X+1)
- Baisse de prix d'un provider sur un modèle qu'on utilise
- Outage prolongé d'un provider (active fallback)
Process de mise à jour modèle
- Test interne sur 10-20 prompts représentatifs Shopify
- A/B sur cohorte (5% des users pendant 1 semaine)
- Métriques : qualité réponse (eval LLM), latence, satisfaction (👍/👎)
- Décision : adopt / hold / reject
- Adoption : update config + tooltip + bump doc version
- Communication : changelog public si gain user-visible
Rollback
Tous les modèles sont versionnés via leur ID. Si Anthropic deprecate claude-sonnet-4-6 (typiquement 12 mois après release), on a 6 mois pour migrer.
Warning system : alert si un modèle approche end-of-life (Anthropic publie ces dates).
6. Pas de vendor lock-in dur : fallback graceful
| Situation | Ce qui se passe réellement |
|---|---|
| Un modèle Anthropic est indisponible | outageFallbackFor(id) renvoie openai/gpt-4-turbo (clé outageFallback). Délibérément plus cher que Sonnet : c'est un filet, pas une option, et ai-models.test.ts l'assert |
| AI Gateway indisponible | Aucun repli : il n'y a pas de second chemin vers un provider |
| BYOK côté client | N'existe plus. Le BYOK LLM a été retiré au passage AI Gateway ; IntelligenceApiKey est un token émis PAR BoostEcom (bei_…, lecture seule), pas une clé provider. La table ProviderApiKey que ce document citait n'est pas au schéma |
Où ça vit : outageFallbackFor() dans
src/config/ai-models.ts. Le
getModelForFramework() que citait ce paragraphe n'existe pas.
7. Code de référence
| Sujet | Path |
|---|---|
| Catalogue — source unique | src/config/ai-models.ts — MODELS, MODEL_LIST, ATLAS_TIER_MODEL |
| Retail dérivé du wholesale | src/config/model-pricing.ts — retail(), MODEL_PRICING |
| Coûts wholesale pour la facturation | src/types/billing-plans.ts — AI_PROVIDER_COSTS, dérivé de MODEL_LIST |
| Tiers affichés dans le switcher | src/features/ai/chat/runtime/constants.tsx — UI_MODELS, prix lus via uiPrice() |
| Le switcher lui-même | src/features/ai/chat/runtime/composer-model-select.tsx |
| Modes média du composer | src/features/ai/chat/runtime/composer-plus-menu.tsx — useMediaSegments() |
| Outils Studio | src/features/ai/orchestrator/runtime/handler-tools-build.ts — buildImageTools, buildVideoTools |
| Facturation média à l'unité | src/features/ai/orchestrator/runtime/billing.ts — trackStudioMediaUsage |
| Page pricing publique | src/app/(marketing)/pricing/_components/model-pricing-cards.tsx |
Gardes dérivées : src/config/ai-models.test.ts,
src/test/pricing-model-cards.test.ts,
src/test/pricing-copy-engines.test.ts,
src/test/studio-modalities.test.ts, src/test/model-catalogue.test.ts.
8. Items de migration — état réel
Ce tableau listait treize actions « à ajouter à la Phase 1 » du roadmap. Six sont faites, quatre ont été rejetées en câblant autre chose, une n'existe plus, deux restent.
| # | Action d'origine | État |
|---|---|---|
| 1.29 | Migrer BRAIN_MODELS vers des ids Claude | fait — BRAIN_MODELS supprimé, le catalogue le remplace |
| 1.30 | Router les ids Claude via AI Gateway | fait |
| 1.31 | Défaut = Sonnet | fait — DEFAULT_TIER = "atlas-pro" |
| 1.32 | Tooltips avec données réelles | fait — prix lus sur MODEL_PRICING |
| 1.33 | Tooltip image « Gemini 3 Pro Image $0.04 » | fait autrement — le retail est $0.21 ; $0.04 était l'ordre de grandeur du wholesale au palier ≤1024² |
| 1.34 | Mettre à jour PROVIDER_COSTS à la main | rejeté — AI_PROVIDER_COSTS est désormais DÉRIVÉ de MODEL_LIST, il n'y a plus rien à mettre à jour |
| 1.35 | Routing auto vers le tier bon marché | fait — resolveAutoRoute choisit parmi Mini / Pro / Max via ATLAS_TIER_MODEL et rend sa raison ; jamais Max Fast |
| 1.36 | Repli si Anthropic est down | fait — outageFallback |
| 1.37 | Câbler la vidéo via le MCP Higgsfield | rejeté — la vidéo passe en direct sur Veo 3.1 (ai-platform/0345) |
| 1.38 | Câbler la voix via ElevenLabs | rejeté — la voix-off est générée DANS le clip (generateAudio: true) |
| 1.39 | Câbler le lipsync via HeyGen | rejeté — aucune route Gateway ne fait d'avatar parlant ; le tarif a été retiré avec la promesse |
| 1.40 | Câbler le vecteur via Recraft V3 | rejeté — @Atlas écrit le .svg lui-même |
| 1.41 | Connecteur Frame.io | à faire — aucun code |
9. Maintenance — qui update et quand
- Founder ou tech lead : decisions adoption nouveau modèle
- À chaque update : bump version
model-curation.md+ bump version README - Audit semestriel : revue complète tous les modèles utilisés
- Tooltip drift check : vérifier trimestriellement que les coûts affichés matchent les vrais prix providers
10. Évaluation des nouveaux produits IA : process décisionnel
L'écosystème IA bouge vite. Quand un nouveau modèle, agent platform, ou produit AI sort, suivre ce process :
Phase 1 — Vérification (avant tout)
Avant d'évaluer, vérifier la source :
- WebSearch + lecture docs officielles
- Distinguer modèle (Sonnet/Opus/Gemini) vs produit/plateforme (Claude Code, Manus, Cursor)
- Confirmer le provider (Anthropic ? OpenAI ? Tiers ?)
Phase 2 — Classification
Une fois vérifié, classifier dans une de ces catégories :
| Catégorie | Exemple | Notre position |
|---|---|---|
| Nouveau modèle par un provider qu'on utilise | Claude Opus 4.8 | Adopter après benchmark si gains > 10% |
| Nouveau modèle par un provider qu'on n'utilise pas | Mistral Large 3 | Évaluer vs notre stack actuelle, adopter seulement si remplace mieux |
| Nouveau modèle spécialisé (vision, audio, code) | Stable Audio 3 | Évaluer par modalité spécifique (image, voix, vidéo) |
| Plateforme agent par un provider | Claude Managed Agents, OpenAI Assistants v3 | Ne pas adopter — concurrent de notre orchestration |
| Produit tiers utilisant Claude/GPT | Manus AI, Cursor, Lovable | Ignorer sauf si menace business directe |
| Outil dev / IDE | Claude Code, Cursor 2.0 | Outil interne uniquement — pas dans le produit |
Phase 3 — Décision
| Décision | Quand | Action |
|---|---|---|
| Adopt | Gain qualité/coût clair, aligné stratégie | Éditer l'entrée dans src/config/ai-models.ts (id + wholesale) — le retail, la facturation et les trois surfaces qui affichent un prix suivent. Puis ce doc, puis un A/B 5% |
| Hold | Prometteur mais pas mature ou mal aligné | Bookmark + revue dans 3 mois |
| Reject | Mauvais ROI, redondant, ou incompatible vision | Note dans ce doc avec raison |
Décisions actuelles documentées
| Produit | Date évaluation | Statut | Raison |
|---|---|---|---|
| Claude Managed Agents (Anthropic, avr 2026) | 2026-05-04 | Reject | Concurrent direct de notre orchestration @Atlas + 5 specialists. Adopter = commoditiser notre value-add layer. On garde notre stack custom (AI SDK v6 Agent class + ContextManager + composeAtlasPrompt). |
| Manus AI (manus.im) | 2026-05-04 | Ignore | Produit tiers chinois utilisant Claude. Concurrent indirect (autonomous agents) mais pas dans le vertical Shopify. Pas de menace court-terme. |
| Claude Code (CLI Anthropic) | 2026-05-04 | Outil interne uniquement | Excellent pour les devs BoostEcom, pas une feature produit user-facing. Pas dans la stack runtime. |
| OpenAI Assistants API v3 (si annoncé) | Future | TBD | À évaluer quand publiquement disponible. Probable Reject car même logique que Managed Agents. |
Anti-patterns
❌ Adopter un nouveau produit "parce que c'est cool" sans benchmark
❌ Adopter une plateforme agent qui commoditise notre orchestration
❌ Confondre un modèle avec un produit (Manus ≠ Claude Sonnet)
❌ Switcher de provider sans tester sur nos use cases Shopify
✅ Vérifier (WebSearch + docs officielles) avant de raisonner
✅ Classifier avant de décider
✅ Tester sur 5% users avant adoption full
✅ Documenter la décision (adopt/hold/reject) dans ce doc