ADRADR-0021 · Une ligne du plan @Atlas est du travail executable, jamais un lien

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'estEtat au moment de decider
StrategicActionPlandes recommandations a LIRE, une CTA = un lienexiste, livre
Le plan @Atlas de l'ADR 0020du travail qu'@Atlas EXECUTE, une CTA = une coursen'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 :

  1. Une ligne nomme un travail et son volume mesure sur le scan (« @Atlas reecrit ces 14 fiches »), jamais une destination.
  2. Une ligne porte un tokenBudget derive de ce volume, jamais devine. Sans volume mesurable, la ligne est rendue unpriceable et non chiffree au hasard — le comportement que action-cost.ts implemente deja.
  3. 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

OptionPourquoi non
Le plan reste consultatif, le paiement nait ailleursc'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 memeun 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 appelantle 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 badgele 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 guiderc'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.