ADR-0021 — Une ligne du plan @Atlas est du travail executable, jamais un lien
L'ADR 0020 pose que l'onboarding se termine sur le scan, et que le bouton qui ouvre le checkout porte le nom d'une action. C'est la regle 3, et c'est elle qui supprime le « choisis un palier » : un prix n'a de sens que…
Statut
Accepté · 2026-09-17
Piliers : ai-platform, app-shell, billing
Contexte
L'ADR 0020 pose que l'onboarding se termine sur le scan, et que le bouton qui ouvre le checkout porte le nom d'une action. C'est la regle 3, et c'est elle qui supprime le « choisis un palier » : un prix n'a de sens que rapporte a un travail nomme.
ai-platform/2709 a livre le devis par action
(src/features/action-plan/action-cost.ts) et a decouvert, en cherchant
ou brancher le budget de tokens, que la regle 3 n'avait rien a nommer.
Les sept actions.push(...) de features/action-plan/synthesizer.ts
produisent des recommandations dont la CTA est, sans exception, un
lien vers une page du tableau de bord : « Voir Web Vitals », « Voir
Insights », « Voir Conversion », « Voir AOV », « Voir AEO ». Aucun
chemin du depot n'execute une StrategicAction.
Deux plans avaient ete confondus :
| Ce que c'est | Etat au moment de decider | |
|---|---|---|
StrategicActionPlan | des recommandations a LIRE, une CTA = un lien | existe, livre |
| Le plan @Atlas de l'ADR 0020 | du travail qu'@Atlas EXECUTE, une CTA = une course | n'existe pas |
Une action qui dit « va regarder cette page » ne consomme aucun token.
Lui attacher un devis afficherait un chiffre qui ne correspond a aucune
depense — l'heuristique deguisee en prix que action-cost.ts refuse
dans son propre en-tete.
L'ADR 0020 reposait donc sur une capacite que le depot n'avait pas, et
estimateActionCost / totalPlanCost attendent un appelant qui
n'existe pas.
Décision
Le plan @Atlas rendu en fin d'onboarding ne contient que des lignes qu'@Atlas peut executer. Une recommandation dont la seule issue est un lien n'est pas une ligne de plan : c'est un insight, et sa place est dans la surface qui porte le sujet.
Trois consequences immediates, a l'indicatif present :
- Une ligne nomme un travail et son volume mesure sur le scan (« @Atlas reecrit ces 14 fiches »), jamais une destination.
- Une ligne porte un
tokenBudgetderive de ce volume, jamais devine. Sans volume mesurable, la ligne est rendueunpriceableet non chiffree au hasard — le comportement queaction-cost.tsimplemente deja. - Les recommandations consultatives existantes ne sont pas jetees : elles cessent d'etre des lignes de plan et redeviennent ce qu'elles sont, des insights sur leur System.
Alternatives écartées
| Option | Pourquoi non |
|---|---|
| Le plan reste consultatif, le paiement nait ailleurs | c'est la seconde sortie que ai-platform/2709 avait laissee ouverte, et elle rouvre le probleme que l'ADR 0020 existe pour fermer. Si le paiement ne nait pas d'une action nommee, il nait d'un palier — et on demande a nouveau un arbitrage de prix a quelqu'un a qui on vient de prouver quelque chose sans jamais lui proposer de l'utiliser. C'est aussi le seul chemin qui contredit la vision : une plateforme dont l'IA OPERE le business ne peut pas conclure sa demonstration par « voici ou cliquer vous-meme » |
| Chiffrer les actions consultatives quand meme | un lien ne consomme rien. Le chiffre serait faux par construction, et un devis faux sur un plan qu'on demande de payer coute plus cher que pas de devis du tout |
Retirer action-cost.ts en attendant un appelant | le raisonnement, l'egalite avec la garde pre-flux et les quinze cas sont ecrits et justes. Le module n'est pas faux, il est en avance ; le supprimer ferait re-ecrire dans six mois la seconde implementation de calcul de prix que modules/billing/credits.ts documente comme ayant deja cite un tarif d'un tiers superieur a un client Pro |
| Melanger les deux familles dans un meme plan, avec un badge | le marchand lit une liste et decide ligne par ligne. Une liste ou certaines lignes s'executent et d'autres ouvrent un onglet est une liste dont il faut apprendre la grammaire avant de s'en servir, et le badge sera lu apres le clic |
| Faire executer les actions par le marchand, @Atlas se contentant de guider | c'est la definition d'un outil, pas d'un operateur. Le produit vend l'inverse (CLAUDE.md : « l'utilisateur definit la vision, l'IA gere le business ») |
Conséquences
Ce que ca coute. Le travail reel n'est pas dans
features/action-plan : il est cote orchestrateur. Chaque famille
d'action executable demande un outil @Atlas capable de la mener, avec
ses garde-fous (estimation avant flux, plafond dur en cours de flux,
journal d'usage) et son mode d'approbation. Le plan de fin d'onboarding
ne peut donc contenir, au depart, que les familles pour lesquelles cet
outil existe. C'est une liste courte, et c'est assume : mieux vaut trois
lignes qui s'executent que sept qui renvoient ailleurs.
Ce que ca rend difficile. Une action executable modifie une boutique en production. La frontiere « lire est gratuit, ecrire passe par les credits » (ADR 0020, regle 4) devient aussi la frontiere de ce qui merite une approbation explicite, et les deux ne coincideront pas toujours : une action peu couteuse peut etre lourde de consequences. C'est le niveau d'autonomie qui tranche, pas le prix.
La dette acceptee. estimateActionCost et totalPlanCost restent
sans appelant tant que la premiere famille executable n'est pas livree.
C'est du code juste en attente, pas du code mort — mais il en a l'odeur,
et un audit le signalera. Cet ADR est la reponse a cet audit.
Le signal qui indiquerait de revisiter. Si, apres livraison des premieres actions executables, le taux d'execution reste proche de zero pendant que les insights consultatifs sont lus : alors le marchand ne veut pas deleguer a ce stade, et c'est l'ADR 0020 lui-meme — le moment ou l'on demande a payer — qu'il faut rouvrir, pas celui-ci.
Comment c'est appliqué
Rien ne le rend effectif aujourd'hui, et il faut le dire : c'est une regle tenue a la main jusqu'a la premiere famille executable.
Ce qui existe deja et qui la sert : action-cost.ts rend unpriceable
toute action sans budget plutot que 0, et totalPlanCost publie le
nombre d'actions non chiffrees a cote du total — donc un plan encore
consultatif ne peut pas afficher un prix qui se lirait comme complet.
Le gate manquant est nommable : le jour ou le plan de fin d'onboarding
est rendu (app-shell/2726), une garde doit refuser qu'une ligne du
plan porte une CTA de navigation. Tant que cette surface n'existe pas,
il n'y a rien a garder.
Suivi : ai-platform/2709 (le devis, livre), app-shell/2726 (le rendu
du plan), et l'item qui porte la premiere famille executable.