AgenticOS
One place to build, run and govern your company's AI agents. Self-hosted, open source, and yours.
L'agent IA du Product Owner de Jalon
Translation pending
BusinessTypeScript · PLpgSQLGitHub @MrickSvsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Signal, l'agent IA du Product Owner : retours clients regroupés par problème, priorisation RICE et MoSCoW pondérée par la valeur business, backlog rédigé et envoyé dans Notion après validation.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Signal filtre le bruit. C'est l'agent IA de Léa, Product Owner de Jalon, un SaaS fictif de gestion de projet pour agences. Il lit les retours clients de sept canaux, les découpe par sujet et les regroupe par problème, pas par solution demandée. Il chiffre chaque sujet (RICE calculé en code, valeur business, MoSCoW sous règles dures), défend son classement preuves à l'appui et challenge une décision qui les contredit. Il rédige le backlog (stories, bugs, tâches techniques, critères Gherkin, points estimés par analogie) et l'envoie dans le kanban Notion de l'équipe. Signal recommande, le PO décide : toute décision et toute écriture externe passent par sa validation, et chaque chiffre ouvre sa preuve.
Le problème. Léa reçoit plus de 150 retours par mois, sur sept canaux : e-mails, tickets, commentaires in-app, NPS, notes des CSM et des sales, Slack. Personne ne lit tout ; c'est le plus bruyant qui gagne : trente comptes gratuits qui demandent un Gantt pèsent plus que trois comptes Enterprise sur le point de partir ; et transformer un problème en stories prend des heures.
La réponse. Un copilote, pas un pilote automatique :
Le principe qui tient le tout : le modèle lit, juge et rédige ; le code compte, calcule et vérifie ; Léa décide. Aucun score n'est produit par un LLM : le modèle ne fournit que l'Impact, avec ses preuves, et tout le reste est calculé en code.
Mesuré, pas supposé (docs/EVALS.md) :
| Ce qu'on mesure | Résultat | Cible |
|---|---|---|
| Triage, sur un jeu réservé jamais utilisé pour régler les prompts | type juste 90,3 % · domaine (macro-F1) 0,91 · injections détectées 100 % | 90 % · 0,85 · 100 % |
| Garde-fous de l'agent (injection, chiffres sourcés, ID existants, validation avant Notion…) | 6 / 6 | 6 / 6 |
| Juge qualité du backlog (Opus), calibré à l'aveugle sur des annotations humaines | 86 % des notes à 1 point ou moins de l'humain · κ de Cohen 0,71 | 80 % · 0,60 |
| Détection des sept problèmes cachés dans le jeu de données | 7 / 8 ❌ (réglée et mesurée sur le même jeu : chiffre optimiste) | 8 / 8 |
| Estimation, en leave-one-out sur les tickets livrés | 70 % des points réels dans la fourchette ✅, mais 0,9 cran d'erreur contre 0,3 pour l'équipe ❌ | 70 % |
Et : 829 tests, sans aucun appel réseau ; un run complet sur 214 retours en 7 minutes pour 2,52 € ; un tour de chat à environ 2 centimes.
| Attendu | Où dans Signal | Comment on le prouve |
|---|---|---|
| Traiter les retours (e-mails, tickets, commentaires) | Pipeline : triage et découpage en sujets, rattachement au compte ; écran Retours ; ajout en direct | eval:triage sur un jeu réservé |
| Identifier patterns et tendances | Regroupement par problème (vecteurs du problème extrait, seuil mesuré) ; tendance émergente ; alertes ; digest du matin | eval:detection |
| Extraire les demandes de fonctionnalités | « Ce qu'ils demandent » face à « ce dont ils ont besoin » sur chaque insight | eval:triage, eval:detection |
| Scorer selon plusieurs critères | RICE hybride : Reach pondéré (plan ou MRR), Impact jugé, Confidence calculée, Effort estimé ; alignement sur les OKRs ; robustesse du rang | tests à 100 % sur le calcul, eval:stability |
| Appliquer des frameworks (MoSCoW, RICE) | RICE en code ; MoSCoW recommandé par le modèle, contrôlé par des règles dures ; capacité des Must ≤ 60 % ; règles dans des skills éditables | tests unitaires |
| Expliquer et justifier | Chaque chiffre s'ouvre sur son calcul ou ses retours ; recommandations de Signal ; challenge dans le chat ; journal des décisions | eval:guardrails |
| Générer des user stories | Backlog au format adapté : epic et stories, story seule, bugs, tâche technique, ou rien quand la fonctionnalité existe déjà | badge du juge calibré sur chaque élément |
| Proposer des critères d'acceptation | Gherkin en français, avec au moins un cas limite ; règles de gestion | juge (critère « testabilité ») |
| Estimer la complexité | Par analogie : carte d'architecture, tickets livrés les plus proches, biais de l'équipe corrigé en code | eval:estimation (leave-one-out) |
Au-delà du sujet : digest du matin, alertes avec enquête préparée en lecture seule, validation humaine de toute écriture, envoi dans Notion, écran des évals, sujets hors retours (dette technique, pari stratégique).
Les livrables : le code (ce dépôt) · la démonstration (démo en ligne, captures) · la documentation (architecture, décisions, evals) · les tests (tests et evals).
Sur la démo en ligne. Chaque écran répond à une question de PO ; tout chiffre et tout ID s'ouvrent sur leur preuve.
Ces écrans ne font qu'afficher, sauf la génération du digest, qui appelle Claude (quelques centimes).
Ceci appelle Claude (quelques centimes par action) ; rien ne part dans Notion sans validation explicite.
Sur la base de démo (pnpm demo:reset), à 1 280 × 800.
| Digest du matin · « À traiter » (trois recommandations avec leurs preuves), comptes à risque, 214 nouveaux retours. | Génération du digest en direct · « Régénérer ce digest » : les vraies étapes et leurs chiffres pendant que Sonnet rédige (ADR-044). |
| Détail d'un insight (I-55) · Chiffres clés, ce qu'ils demandent face à ce dont ils ont besoin, répartition sur quatre canaux. | Le problème, pas la solution (I-56) · Cinq demandes différentes, un seul besoin : c'est lui que Signal regroupe et score. |
| Priorisation, Reach en comptes · I-54 (Gantt) 2e, I-59 (permissions) 8e mais Must par règle dure. | Priorisation, Reach en MRR · Le même classement pondéré par le revenu : I-59 monte en 3e, I-54 descend en 7e. |
| Chat, onglet Trace · Rédaction des stories d'un insight : outils appelés, skills chargées, coût du tour. | Backlog · Epic de I-59, une story dépliée : règles de gestion, Gherkin avec cas limites, badge du juge. |
| Alerte et dossier d'enquête · Retour collé de Studio Bastide : alerte churn et dossier écrit en lecture seule, faits avec ID. | Évals · Est-ce que Signal fait bien son travail ? Chaque éval face à sa cible. |
createAgent) avec 14 outils, un briefing calculé en code à chaque tour, une validation humaine par middleware (carte d'approbation, reprise depuis un checkpointer Postgres) et des enquêtes en lecture seule sur les alertes.Détail : docs/ARCHITECTURE.md.
pnpm lint && pnpm typecheck && pnpm test : 829 tests dans 101 fichiers, sans aucun appel réseau (modèles, Voyage, Notion et Supabase simulés). pnpm test:coverage impose 100 % de couverture sur lib/scoring, lib/clustering, match.ts et mappers.ts. La CI (GitHub Actions) lance lint, typecheck et couverture, sans aucun secret.evals/ground-truth/, evals/holdout/) ne sont lisibles que par scripts/evals/ : règle ESLint et test.pnpm eval:triage (--compare, --edge, --model sonnet), eval:detection, eval:estimation, eval:stability, eval:guardrails (--tools), eval:judge-calibration, eval:backlog. Elles appellent les vrais modèles : chaque runner annonce son coût et exige --yes au-delà de 1 €. Résultats, dates et ce qui n'est pas mesuré : docs/EVALS.md, et l'écran Évals.Avec un agent de code (Claude Code), piloté comme une équipe :
Au total : 50 sessions, environ 21 heures, et 14 € d'appels aux modèles de l'application pendant le build (runs du pipeline, evals, essais). pnpm tsx scripts/build-time.ts refait ce décompte par phase depuis le journal.
Pour passer en production : masquer les données personnelles avant les modèles (ici, tout est fictif) ; héberger les traitements dans l'UE ; de vrais connecteurs (Zendesk, Intercom, e-mail) ; un pack de contexte par produit et des droits d'accès ; une synchronisation retour avec Notion ; calibrer les hypothèses (facteurs d'extrapolation du Reach) sur de vraies données.
Échelle : Signal est dimensionné pour quelques centaines de retours par mois. Trois points cèdent au-delà, chacun avec sa solution :
get_priority de l'agent relisent tous les retours (texte compris), items, comptes, analyses et overrides, puis recalculent tout en code. C'est simple et toujours à jour, instantané à 214 retours ; mais le coût grandit avec le volume : à 10 000 retours, chaque affichage transférerait des dizaines de mégaoctets. Solution : stocker les agrégats de chaque insight (comptes par plan, MRR, canaux) et ne les mettre à jour qu'à l'arrivée d'un retour.Non construit : le prototype visuel d'une story et l'exposition MCP, coupés pour tenir le périmètre (ADR-031) ; le retour du statut depuis Notion.
Ce qui reste fragile :
Le détail, cas limites non traités et dettes techniques compris : BUILD_LOG, REVIEW_NOTES et SPEC §19.
Compter une heure, dont la moitié pour créer les comptes. Toutes les commandes se lancent à la racine du repo.
.nvmrc) et pnpm 12 (packageManager de package.json : corepack enable suffit). Le CLI Supabase est une dépendance du projet (pnpm exec supabase).supabase link). L'extension vector est créée par la première migration. L'URL et la clé service_role sont dans les paramètres d'API du projet ; DATABASE_URL est la chaîne du pooler en mode session (bouton « Connect » du projet).git clone https://github.com/MrickSvs/signal.git && cd signal
pnpm install --frozen-lockfile
cp .env.example .env
Renseigner .env (chaque variable y est commentée ; valeurs sans guillemets, en local comme sur Vercel : une LANGFUSE_BASE_URL entre guillemets a déjà cassé toutes les routes serveur en production) :
| Variable | Pour | Obligatoire |
|---|---|---|
ANTHROPIC_API_KEY | Modèles Claude | oui (pipeline, chat, digest, evals) |
VOYAGE_API_KEY | Embeddings | oui (seed, pipeline, recherche par le sens) |
SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY | Base, côté serveur uniquement | oui |
DATABASE_URL | Verrou du pipeline et mémoire du chat : le pooler en mode session (port 5432, IPv4), pas la connexion directe (IPv6 seulement) ni le mode transaction (6543) | oui |
LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_BASE_URL, LANGFUSE_TRACING_ENVIRONMENT | Traces, coûts, datasets d'evals | non |
NOTION_TOKEN, NOTION_PARENT_PAGE_ID, NOTION_DS_BACKLOG | Envoi du backlog validé | non |
SITE_PASSWORD | Basic Auth de l'app (vide : pas de mot de passe) | non |
APP_BASE_URL | Liens poussés dans Notion | avec Notion |
CRON_SECRET | Route du cron quotidien | en déploiement |
DEMO_NOW | Date de référence du scénario (vide : maintenant) | non, laisser vide |
pnpm exec supabase login
pnpm exec supabase link --project-ref <ref du projet>
pnpm db:push # applique les 8 migrations de supabase/migrations/
pnpm db:seed # 90 clients et 5 prospects, 40 tickets de référence (vectorisés par Voyage), 214 retours
Le schéma langgraph (mémoire du chat, reprise du pipeline) est créé au premier usage.
Base de démo (recommandé, ~20 s, sans appel de modèle) : restaure le snapshot versionné dans data/demo-snapshot/ (214 retours triés, 26 insights déjà revus par le PO dont 25 actifs, scores, estimations), puis écrit le premier digest.
pnpm demo:reset # ~15 s, dates recalées sur aujourd'hui (jours du calendrier de Paris)
pnpm digest # ~15 s, ~0,03 €
Le premier digest peut aussi s'écrire depuis l'écran Digest (« Générer le premier digest ») : une page sans digest ne compte pas comme une visite de Léa, donc il couvre tout le scénario. Le cron quotidien (04:00 UTC) écrit aussi un digest : faire le reset après son passage, ou le désactiver ce jour-là, sinon l'écran montre le digest d'une nuit presque vide.
Ou tout recalculer : pnpm pipeline:run (mesuré le 7 octobre : 214 retours, 410 s, 2,52 € ; --resume <run_id> reprend un run interrompu). Les insights naissent « à valider » : écran Insights, « Tout accepter » ou revue une à une.
pnpm dev # http://localhost:3000
Sans SITE_PASSWORD, aucun mot de passe n'est demandé. Après une modification de l'agent (prompt, outils), redémarrer pnpm dev : l'agent compilé est gardé en mémoire.
Signal envoie dans Notion les éléments du backlog que le PO a validés, et seulement eux, dans un seul sens (SPEC §11, ADR-026). Une base suffit : Backlog, avec sa vue kanban groupée par Statut.
Créer l'intégration : notion.so/profile/integrations → nouvelle intégration interne, capacités « Lire », « Mettre à jour » et « Insérer du contenu ». Copier le jeton dans NOTION_TOKEN.
Partager la page parente : créer une page « Jalon — Produit (Signal) », puis ••• → Connexions → ajouter l'intégration. Copier l'ID de la page (les 32 caractères à la fin de son URL) dans NOTION_PARENT_PAGE_ID.
Lancer le setup :
pnpm notion:setup
Il crée la base Backlog (Nom, ID, Type, Statut, Epic, Insight, MoSCoW, Points, Énoncé, Prototype, Lien Signal, Validé le) et la vue « Kanban » groupée par Statut, puis affiche NOTION_DS_BACKLOG=… à copier dans .env (et sur Vercel). Relancé, il ne recrée rien et ajoute seulement les propriétés manquantes.
Si la vue kanban n'a pas pu être créée (le script le signale) : dans la base, « + Ajouter une vue » → Tableau → Grouper par « Statut ».
L'envoi se fait depuis le chat (« Envoie US-004 dans Notion », carte d'approbation) ou depuis l'écran Backlog (« Valider et envoyer »). En cas d'échec, l'élément reste « validé » avec l'erreur et un bouton « Réessayer ». Une fois envoyé, il se modifie dans Notion.
Projet Vercel à la racine du repo, Fluid compute (300 s au plus par fonction), région dub1 et cron quotidien déclarés dans vercel.json. Reporter les variables dans Vercel, pour chaque environnement qui doit tourner : sur le projet actuel, elles ne sont définies qu'en Production, et un déploiement Preview tourne sans base ni clés. Les runs complets du pipeline restent en CLI.
Le tableau complet, avec les options, est dans CLAUDE.md.
| Commande | Effet |
|---|---|
pnpm dev | Lancer l'app |
pnpm lint · pnpm typecheck · pnpm test · pnpm test:coverage | Qualité (aucune clé nécessaire) |
pnpm db:push · pnpm db:seed · pnpm db:types | Base |
pnpm pipeline:run · pipeline:triage · pipeline:enrich · pipeline:cluster · pipeline:score · pnpm digest | Pipeline, en entier ou nœud par nœud |
pnpm chat · pnpm investigate <alert_uuid> (--pending) · pnpm estimate I-xx | L'agent, une enquête, une estimation, en terminal |
pnpm notion:setup | Base Backlog dans Notion |
pnpm eval:* | Evals (voir plus bas) |
pnpm demo:snapshot · pnpm demo:reset (--empty) | Figer la base de démo, la restaurer (ou la vider) |
pnpm tsx scripts/build-time.ts | Temps et coût LLM du build par phase, depuis le journal |
.
├── SPEC.md · CLAUDE.md · README.md
├── src/
│ ├── app/ # écrans et routes API (agent, pipeline incrémental, digest, cron)
│ ├── agent/ # agent unique, prompt système, briefing, middlewares, HITL, enquêtes
│ │ └── tools/ # un fichier par outil (14)
│ ├── pipeline/ # graphe LangGraph, mode incrémental, verrou ; nodes/ : un nœud par fichier
│ ├── services/ # priorisation, revue des insights, backlog, estimation, alertes, notion/
│ ├── server/ # queries/ (lectures) et actions/ (server actions)
│ ├── lib/ # llm, embeddings, scoring, clustering, estimation, insights, judge, evals…
│ └── components/ # écrans, chat, puces d'aperçu, ui/ (shadcn)
├── scripts/ # CLI : seed, génération, pipeline, chat, Notion, démo ; evals/ : runners
├── context/jalon/ # pack de contexte et 9 skills
├── data/ # scénario, clients, retours, tickets ; demo/ et demo-snapshot/
├── evals/ # ground-truth/, holdout/, human-labels/, reports/ (lus par scripts/evals seulement)
├── supabase/migrations/ # 8 migrations, en ajout seulement
└── docs/ # ARCHITECTURE, DECISIONS, EVALS, img/ ; process/ : PLAN, BUILD_LOG, REVIEW_NOTES