prospeoGrégory Cojajeu. 09:03

Analyse

État daté du 12 septembre 2026, code ab7d606. Chaque constat porte son emplacement, sa preuve, son scénario d'échec et son correctif.

Sécurité

Ce qui est propre à ce produit : isolation des locataires, validation humaine, surface exposée.

3 P0 · 1 P1 · 1 P2

Performance

Au volume actuel il n'y a rien à optimiser. La question utile est ce qui casse avec le volume.

1 P1 · 1 P2

Optimisation

Ni faille ni lenteur, mais ce qui coûte de l'argent ou de la maintenance.

2 P1 · 2 P2

Offres et commercialisation

Ce n'est pas le coût IA qui dicte le prix de Prospeo.

1 P0 · 2 P1

Prise en main

Ce qui bloque entre « il découvre Prospeo » et « il a compris la valeur ».

3 P1 · 1 P2

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ôleCommandeRésultat
Typesnpx tsc --noEmitcode 0
Lintnpx eslint .code 0
Testsnpx vitest run28 tests passés
Suite agrégéenpm run verifyéchec : Missing script "typecheck;"
Base de donnéessupabase list_projectsaucun projet nommé prospeo
Rôle servi à un anonymeGET /parametres sans cookieAdministrateur
Routes d'API sans jetonPOST /api/entrant, /usage, /worker/tick200 sur les trois
Secrets dans l'historiquegit log -p --all | grep -E "sk-ant-|eyJhbGciOi|gho_"aucun
Charte : ombres, dark:, couleurs en durgrep -rn dans src/aucune occurrence
Charte : Terre par écrancomptage de btn-principal sur 10 pages1 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

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

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

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

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

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

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

Performance

Performance

Au volume actuel il n'y a rien à optimiser. La question utile est ce qui casse avec le volume.

Pages servies en production, instance chaude

PageTempsPoids
/0,59 s25 Ko
/pipeline0,56 s37 Ko
/entreprises0,59 s49 Ko
/brouillons0,47 s20 Ko
/sourcing0,43 s24 Ko
/sourcing/run-10,45 s39 Ko
/attribution0,51 s25 Ko
/sequences0,41 s19 Ko
/parametres0,49 s18 Ko
/aide0,41 s31 Ko

Aucune page ne dépasse 0,6 seconde ni 50 Ko.

Montée en charge, jeu de démonstration dupliqué

FacteurLignesPoidsFileAttributionWorker
1489145 Ko0 ms2 ms5 ms
103 117907 Ko2 ms3 ms14 ms
5014 7974,3 Mo31 ms36 ms172 ms
10029 3978,6 Mo144 ms135 ms607 ms
20058 59717,1 Mo572 ms598 ms2 354 ms

Doubler le volume de 100 à 200 multiplie les temps par quatre : la croissance est en carré du volume.

P1 La lecture est quadratique et casse vers 1 500 contactsP1 — avant dix locataires

src/lib/store/supabase.ts:52-68, src/lib/domain/priority.ts:66-99, src/lib/services/worker.ts:44-90
Preuve
Voir le tableau de montée en charge. getDataset charge les dix-huit tables en entier à chaque requête, et les calculs balaient ces tableaux en boucles imbriquées.
Scénario d'échec
Le facteur 30, vers 1 500 contacts, correspond à deux ans d'activité au rythme du PRD ou à une dizaine de locataires. Le jeu pèse alors 2,5 Mo, transférés depuis Supabase à chaque affichage de page, avant tout calcul. Le goulot est le transfert, pas le processeur.
Correctif
Ne charger que ce dont la page a besoin, puis indexer activities(contact_id, occurred_at) et ai_drafts(contact_id, status). Gain : de 145 Ko à moins de 10 Ko par affichage. Coût : une journée. À programmer quand un locataire dépasse 500 contacts, pas avant.

P2 Le worker réécrit les mêmes priorités à chaque tourP2 — dette

src/lib/services/worker.ts:93-99
Preuve
La sonde sur l'instance de production renvoie neuf priorités recalculées sur dix tâches ouvertes, alors que le score ne devrait changer qu'au franchissement d'un seuil temporel.
Scénario d'échec
À la cadence de quinze minutes prévue par le PRD §6.3, cela fait 96 écritures quotidiennes par tâche ouverte, soit l'essentiel du trafic d'écriture de l'application.
Correctif
Arrondir à la journée le terme d'ancienneté, qui est la seule composante qui bouge en continu. Gain : environ 90 % des écritures du worker. Coût : une ligne.

Document de référence : docs/ANALYSE-PERFORMANCE-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

CandidatsModèleEnrichissementTotal
200,0681 €0,60 €0,67 €
400,1334 €1,20 €1,33 €
800,2640 €2,40 €2,66 €
1200,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

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

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

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

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

UsageTotal affichéTotal réel après correctif O1
Léger : 1 run de 40, 20 générations1,57 €0,37 €
Moyen : 2 runs de 80, 60 générations6,03 €1,24 €
Intensif : 4 runs de 120, 200 générations18,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

EssentielMétierCabinet
Prix HT par mois149 €249 €449 €
Utilisateurs1310
Apporteurs210illimité
Budget IA inclus10 €30 €80 €
Profils de client idéal13illimité
Domaine d'envoi dédiéinclusinclus

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

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

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

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

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

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

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

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

Une question ?