Analyse
État daté du 12 septembre 2026, code ab7d606. Chaque constat porte son emplacement, sa preuve, son scénario d'échec et son correctif.
4 constats à corriger avant tout locataire payant, 9 avant dix, 5 de dette. L'épaisseur du filet dit la gravité : la charte réserve la couleur Arrêt aux blocages durs.
Ce qui a
été mesuré
| Contrôle | Commande | Résultat |
|---|
| Types | npx tsc --noEmit | code 0 |
| Lint | npx eslint . | code 0 |
| Tests | npx vitest run | 28 tests passés |
| Suite agrégée | npm run verify | échec : Missing script "typecheck;" |
| Base de données | supabase list_projects | aucun projet nommé prospeo |
| Rôle servi à un anonyme | GET /parametres sans cookie | Administrateur |
| Routes d'API sans jeton | POST /api/entrant, /usage, /worker/tick | 200 sur les trois |
| Secrets dans l'historique | git log -p --all | grep -E "sk-ant-|eyJhbGciOi|gho_" | aucun |
| Charte : ombres, dark:, couleurs en dur | grep -rn dans src/ | aucune occurrence |
| Charte : Terre par écran | comptage de btn-principal sur 10 pages | 1 au maximum |
Tout constat non vérifiable sans base de données est signalé comme tel, avec la commande à lancer. Aucun chiffre ne vient du jeu de démonstration, qui est fictif.
Sécurité
Sécurité
Ce qui est propre à ce produit : isolation des locataires, validation humaine, surface exposée.
S1 Tout visiteur anonyme est administrateur d'AgenIAP0 — avant tout locataire payant
- Où
src/lib/auth/session.ts:27-31, src/proxy.ts:9-11- Preuve
- Depuis un navigateur sans cookie ni compte, la page Paramètres de l'instance publique affiche « Votre rôle : Administrateur ». Hors Supabase, getSessionUser renvoie l'utilisateur de démonstration sans aucune vérification, et le proxy laisse passer toute requête.
- Scénario d'échec
- N'importe qui ouvre l'URL publique, renomme l'organisation, remet le budget IA à zéro ou réinitialise la démonstration. Toutes ces actions sont gardées par canAdminister, qui renvoie vrai pour ce visiteur.
- Correctif
- Non corrigé, et assumé pour l'instant : cette instance est une démonstration ouverte, et la page que vous lisez est publique par choix. Ce qui reste à restreindre, ce sont les actions réservées à l'administrateur — réglages du locataire et réinitialisation — qu'un visiteur peut encore déclencher. La réponse durable est la bascule sur Supabase Auth, qui rétablit une session nominative.
S2 Les trois routes d'API acceptent des écritures anonymes en productionP0 — avant tout locataire payant
- Où
src/app/api/entrant/route.ts:20, src/app/api/usage/route.ts:12, src/app/api/worker/tick/route.ts:14- Preuve
- Trois requêtes lancées depuis l'extérieur sans jeton renvoient 200. La création de contact retourne un identifiant réel, et le worker rapporte neuf priorités recalculées et huit alertes. Le garde est écrit « si un secret existe », donc l'absence de secret vaut autorisation.
- Scénario d'échec
- Un tiers injecte des pistes dans le pipeline, ou marque n'importe quelle affaire comme essai activé, faussant l'indicateur dont le PRD §6.1 dit qu'il conditionne toute la valeur du pipeline abonnement.
- Correctif
- Corrigé le 12 septembre : les trois gardes sont inversés, l'absence de secret vaut désormais refus. Les routes répondent 401 tant que INBOUND_SECRET, PRODUCT_USAGE_SECRET et WORKER_SECRET ne sont pas définis dans Vercel. Pour la tâche planifiée, définir CRON_SECRET égal à WORKER_SECRET, seul en-tête que Vercel sait envoyer.
S3 Aucun invariant n'est réellement opposable : la base n'existe pasP0 — avant tout locataire payant
- Où
supabase/migrations/0001_socle.sql, supabase/migrations/0002_rls.sql- Preuve
- La liste des projets Supabase en compte huit, aucun nommé prospeo. Les migrations n'ont jamais été appliquées : les quatre invariants du PRD §5 et les critères 1, 3, 4 et 7 du §16 existent sous forme de fichiers, pas de contraintes actives.
- Scénario d'échec
- Le discours commercial affirme que la garantie vit dans la base. Un client qui demande la preuve ne peut pas l'obtenir.
- Correctif
- Créer le projet, appliquer les migrations, puis exécuter les quatre sondes d'invariants. Tant qu'elles n'ont pas tourné, ne présenter aucun de ces quatre critères comme tenu.
S4.1 Un apporteur peut forger un changement d'étapeP1 — avant dix locataires
- Où
supabase/migrations/0002_rls.sql, policy stage_events_insert- Preuve
- Revue statique, sans exécution faute de base. La policy n'exige que de voir l'affaire concernée, or un apporteur voit ses recommandations.
- Scénario d'échec
- Insertion de changements d'étape fictifs, qui corrompent le cycle médian et les taux de conversion du PRD §13.
- Correctif
- Ajouter « and app.is_seller() » à la clause with check.
S4.3 Le commercial voit tous les contacts de l'organisationP2 — dette
- Où
supabase/migrations/0002_rls.sql, src/lib/domain/visibility.ts:11-24- Preuve
- Les policies contacts, activities et touchpoints filtrent sur l'organisation et le rôle vendeur, pas sur la propriété. applyRoleView fait le même choix.
- Scénario d'échec
- Écart entre le code et le PRD §4, qui écrit « ses pistes ». Code et SQL sont cohérents entre eux et tous deux plus larges que le document.
- Correctif
- Décision produit avant correctif : trancher lequel a raison, puis corriger l'autre.
S5 Aucun secret dans le dépôt ni dans l'historiqueconforme
- Où
git log -p --all- Preuve
- Le filtrage sur les motifs de clés connues ne renvoie que des noms de variables dans le README et dans src/lib/store/supabase.ts. Le fichier .env.example versionné ne contient que des clés vides.
- Correctif
- Rien à faire. À revérifier à chaque ajout de fournisseur.
Document de référence : docs/ANALYSE-SECURITE-2026-09-12.md
Optimisation
Optimisation
Ni faille ni lenteur, mais ce qui coûte de l'argent ou de la maintenance.
Coût d'un run de sourcing
| Candidats | Modèle | Enrichissement | Total |
|---|
| 20 | 0,0681 € | 0,60 € | 0,67 € |
| 40 | 0,1334 € | 1,20 € | 1,33 € |
| 80 | 0,2640 € | 2,40 € | 2,66 € |
| 120 | 0,3947 € | 3,60 € | 3,99 € |
L'enrichissement représente 90,2 % du coût affiché d'un run de 120 candidats.
O1 Le budget IA est calibré sur un coût qui n'existe pasP1 — avant dix locataires
- Où
src/lib/ai/sourcing.ts:16- Preuve
- La constante d'enrichissement vaut 0,03 € par candidat. Or la recherche des appels sortants ne renvoie que deux fetch, tous deux vers l'API publique recherche-entreprises de l'État, gratuite et sans clé. Aucun enrichissement payant n'est implémenté.
- Scénario d'échec
- Le budget de 40 € par mois autorise dix runs de 120 candidats au coût affiché, contre cent un au coût réel. L'utilisateur s'auto-limite d'un facteur dix, et le garde-fou du PRD §7.4 refuse des runs que rien ne justifie de refuser.
- Correctif
- Mettre la constante à zéro si aucun fournisseur payant n'est prévu, ou la conserver comme provision commentée et ne la compter que lorsque l'appel existe. Une ligne et un test.
O2 Deux modules métier sans aucun testP1 — avant dix locataires
- Où
src/lib/domain/quotas.ts, src/lib/services/settings.ts- Preuve
- Les 28 tests couvrent la file, les pipelines, les rôles, la RGPD, les invariants et le worker. Ces deux modules n'apparaissent dans aucun fichier de tests.
- Scénario d'échec
- Le comptage des invitations LinkedIn repose sur un préfixe de chaîne posé à un seul endroit. Changé ou oublié, le compteur tombe à zéro sans bruit, le quota de 100 par semaine ne se déclenche plus, et le compte LinkedIn du commercial est exposé — le risque même que le PRD §8.3 dit vouloir écarter.
- Correctif
- Trois tests sur le comptage, le blocage à la limite et la montée en charge d'envoi. Puis remplacer le préfixe par un champ explicite sur l'activité. Une heure.
O4 Le script de vérification n'a jamais fonctionnéP2 — dette
- Où
package.json, script verify- Preuve
- La commande renvoie « Missing script: typecheck; ». L'enchaînement par point-virgule est de la syntaxe PowerShell, alors que npm exécute via cmd.exe. Lancés séparément, les quatre contrôles passent.
- Scénario d'échec
- Le README et le prompt d'analyse prescrivent tous deux cette commande : les deux documents ont tort.
- Correctif
- Corrigé le 12 septembre : le script enchaîne désormais par doubles esperluettes, et le README a été rectifié. npm run verify passe de bout en bout.
O5 Arrêt sert de couleur d'erreur génériqueP2 — dette
- Où
src/app/globals.css:137, src/components/ActionButton.tsx:38- Preuve
- La couleur Arrêt est liée à la classe des messages d'erreur, rendue par huit composants dont ceux de la relance et du changement d'étape.
- Scénario d'échec
- La charte §11 exige qu'Arrêt n'apparaisse sur aucun écran de retard, de relance ou d'échéance, et la réserve à quelques apparitions par an. Ici elle s'affiche à chaque saisie refusée.
- Correctif
- Une variable dédiée aux erreurs de saisie, distincte d'Arrêt.
Document de référence : docs/ANALYSE-OPTIMISATION-2026-09-12.md
Offres et commercialisation
Offres et commercialisation
Ce n'est pas le coût IA qui dicte le prix de Prospeo.
Coût IA mensuel par compte
| Usage | Total affiché | Total réel après correctif O1 |
|---|
| Léger : 1 run de 40, 20 générations | 1,57 € | 0,37 € |
| Moyen : 2 runs de 80, 60 générations | 6,03 € | 1,24 € |
| Intensif : 4 runs de 120, 200 générations | 18,34 € | 3,96 € |
Au pire, le coût IA représente 12 % du prix plancher de 149 € HT annoncé par le PRD.
Grille proposée, à confirmer par un relevé de concurrence
| Essentiel | Métier | Cabinet |
|---|
| Prix HT par mois | 149 € | 249 € | 449 € |
| Utilisateurs | 1 | 3 | 10 |
| Apporteurs | 2 | 10 | illimité |
| Budget IA inclus | 10 € | 30 € | 80 € |
| Profils de client idéal | 1 | 3 | illimité |
| Domaine d'envoi dédié | — | inclus | inclus |
Le dépôt ne contient aucune étude de concurrence : ces prix sont des propositions argumentées, pas des recommandations validées.
C1 Cette semaine : fermer ce qui empêche de montrer le produitP0 — avant tout locataire payant
- Où
Plan daté- Preuve
- Trois correctifs mesurables : S1 et S2, le script verify, la constante d'enrichissement.
- Scénario d'échec
- Sans eux, toute démonstration à un tiers expose une instance ouverte en écriture.
- Correctif
- Critère de réussite : les trois sondes d'API renvoient 401, npm run verify passe de bout en bout, et le coût affiché avant un run correspond à la dépense réelle.
C2 Ce mois : rendre le produit démontrable à un tiersP1 — avant dix locataires
- Où
Plan daté- Preuve
- Création du projet Supabase et des migrations, remontée d'usage depuis Margeo, relevé de concurrence.
- Scénario d'échec
- Sans la remontée d'usage, l'étape « essai activé » reste déclarative, donc fausse, et la relance à J-4 se fait à l'aveugle.
- Correctif
- Critère : les douze critères du PRD §16 sont prouvés, pas huit sur douze ; une facture importée dans Margeo fait avancer l'affaire dans Prospeo sans saisie.
C3 Ce trimestre : ouvrir à un premier clientP1 — avant dix locataires
- Où
Plan daté, PRD §17 question 5- Preuve
- Le PRD laisse ouvert le seuil d'ouverture commerciale. Le critère de succès de son propre §2 le tranche.
- Scénario d'échec
- Vendre avant d'avoir tenu ce critère contredit l'argument commercial d'AgenIA, qui est de montrer ce qu'elle construit pour son propre compte.
- Correctif
- Prospeo se vend quand il a tenu, un trimestre entier sur le pipeline réel d'AgenIA, l'absence de demande entrante au-delà de 24 heures ouvrées sans réponse et l'absence de proposition expirée sans relance.
Document de référence : docs/ANALYSE-COMMERCIALISATION-2026-09-12.md
Prise en main
Prise en main
Ce qui bloque entre « il découvre Prospeo » et « il a compris la valeur ».
B1 Le prospect arrive au milieu du produit, sans contexteP1 — avant dix locataires
- Où
src/app/page.tsx- Preuve
- Parcours refait depuis un navigateur anonyme : le visiteur tombe directement sur la file de travail d'AgenIA, sans page d'accueil ni explication.
- Scénario d'échec
- Prospeo vend une idée contre-intuitive, cinq tâches et rien d'autre. Sans explication, la brièveté passe pour de la pauvreté alors qu'elle est la proposition.
- Correctif
- Un bandeau visible en mode démonstration seulement, disant ce qu'on regarde et ce qui a été classé pour nous, avec un lien vers l'aide. Deux heures.
B2 Le visiteur emprunte l'identité d'un tiersP1 — avant dix locataires
- Où
src/lib/auth/session.ts:29- Preuve
- L'en-tête affiche « Grégory Coja » à tout visiteur anonyme.
- Scénario d'échec
- Pour un produit dont l'argument central est que l'humain valide nommément, faire valider un brouillon au nom de quelqu'un d'autre est contradictoire.
- Correctif
- Nommer l'utilisateur « Vous, en démonstration » tant que Supabase n'est pas branché. Une heure.
B3 Rien ne persiste, donc rien ne prouveP1 — avant dix locataires
- Où
src/lib/store/memory.ts- Preuve
- Validation d'un brouillon sur l'instance en ligne : le compteur passe de 11 à 10, puis revient à 11 au rechargement.
- Scénario d'échec
- Le moment où le produit convainc est celui où le prospect voit le passage du crayon à l'encre avec son nom. Le rechargement efface cette preuve.
- Correctif
- Brancher Supabase. À défaut, dire la vérité dans le bandeau : la démonstration se réinitialise à chaque visite.
B5 Rien ne relie la démonstration à une prise de contactP2 — dette
- Où
src/components/Header.tsx- Preuve
- Aucun lien vers agenia.pro, aucun moyen pour un prospect convaincu de se manifester.
- Scénario d'échec
- L'instrumentation d'attribution que le produit vend ne s'applique pas à sa propre démonstration.
- Correctif
- Un lien portant un paramètre d'origine, pour que la piste retombe dans le canal des pages démo. Dix minutes, et c'est le meilleur rapport de tout le rapport.
Document de référence : docs/ANALYSE-PRISE-EN-MAIN-2026-09-12.md
Sources
Les cinq documents docs/ANALYSE-*.md du dépôt font foi. Cette page en présente l'état daté : si elle contredit un document, c'est la page qui a tort. Le PRD et la charte graphique, qui fixent ce que le produit promet, restent les références au-dessus des deux.
Comment utiliser Prospeo