Release 2026-09-24 — Salle de marché institutionnelle (Lots 0-8)
Status : en production. Programme entièrement livré — 9 lots, PRs #133 à #143, branches feature/claude/lot* squash-mergées sur main.
TL;DR
Le marketplace investisseur privé (wallet, enchères, listings publics) est remplacé par un circuit institutionnel de bout en bout : une institution financière s'onboarde avec un dossier KYB, reçoit des demandes accompagnées d'une analyse nominative datée, y répond avec des conditions structurées comparables, pilote son portefeuille depuis un cockpit à quatre files, et tout cela sous un abonnement STANDARD/PREMIUM visible, pilotable et audité. Le pipeline facture s'arrête à SCORED — plus aucune surface investisseur.
| Avant (marketplace investisseur) | Après (salle de marché institutionnelle) |
|---|---|
SCORED → Offer/MarketListing → LISTED, financé par des investisseurs wallet | SCORED = état terminal, la demande alimente le circuit banque |
Taux et avance calculés côté plateforme (pricing_islamic) | Conditions saisies par la banque, jamais calculées (§43/§68) |
| Pas de KYB institution, pas de gate d'accès | Dossier KYB obligatoire, garde exiger_etablissement_financier câblé |
| Aucune analyse nominative persistée | Analyse datée par demande, servie aux destinataires + à l'entreprise (A3) |
| Aucune comparaison d'offres | Position concurrentielle (A1) + benchmarks k-anonymes (A2), PREMIUM |
| Abonnement institution sans gate serveur | Gate serveur unifié (premium.py), tier visible et audité |
| Guide utilisateur en markdown dépôt seulement | Guide /guide in-app, captures Playwright reproductibles |
| Assistant IA ignore le financement | Persona FINANCEUR, panneaux insights gatés serveur |
Invariants qui traversent tout le programme
- §13 — aucun classement ni recommandation d'offres.
- §43/§68 — aucun taux, commission ou marge fixé ou suggéré par Tauraco ; la banque saisit, la plateforme ne calcule ni ne classe.
- §33 — aucun scoring opaque : chaque nombre servi est nommé, daté, avec sa formule.
- A1/A2/A3 (
docs/legal/2026-09-14-amendement-invariants-salle-de-marche.md) — les trois seules extensions autorisées : position concurrentielle par classe nommée (jamais montants/identités des concurrents), fourchettes de marché k-anonymes (servies seulement si ≥ k offres de ≥ m institutions distinctes), analyse nominative réservée aux destinataires nommés + à l'entreprise émettrice.
Lot 0 + Lot 1 — Décisions juridiques & dépose du marketplace (PR #133, #134)
PR A (docs) : amendement de la spec + deux documents de décision docs/legal/2026-09-14-*.md, posant les trois autorisations A1/A2/A3 et actant la fermeture des surfaces de consultation investisseur. PR B (code) : dépose complète du marketplace investisseur privé — routes /v2/marketplace/*, /v3/portal/investor/*, /v3/auctions/*, vues SPA, pages statiques, registre de tokens — pipeline arrêté à SCORED, pricing_islamic supprimé côté plateforme. Aucune table ni colonne supprimée (zéro migration) ; redirections 301 conservées. Voir docs/financing/surfaces-gelees.md pour l'inventaire de ce qui reste volontairement en place.
Lot 2 — Onboarding institution avec dossier KYB (PR #135, migration 084)
Une institution invitée dépose un dossier KYB (agrément, statuts, RCCM, dirigeants), la compliance le valide, et cette validation promeut CollateralTiersQualification.statut_validation de non_validee à validee — le chaînon manquant du dépôt, jamais câblé jusque-là. Le garde exiger_etablissement_financier (déjà écrit, jamais branché) devient la condition d'accès aux routes banque. Les 17 banques démo sont backfillées validee par migration + seed pour ne rien casser.
Lot 3 — Analyse nominative + abonnement institution (PR #136, migration 085)
Chaque demande soumise porte désormais une analyse nominative, datée, calculée entre le snapshot et le flush de statut (jamais dans le snapshot, dont le hash est figé), à partir du moteur à règles existant (score_invoice) alimenté par l'historique réel du débiteur et du cédant. Servie aux banques destinataires (PREMIUM) et à l'entreprise (A3). Un module premium.py unifie les trois prédicats premium divergents et porte le premier gate institution. Décision produit (sega, 2026-09-20) : le contrôle IBAN/RIB est neutralisé dans l'analyse — les IBAN ne sont pas vérifiables ni connectés en Afrique ; aucune analyse ne porte plus INVALID_BANK_ACCOUNT ni INVALID_IBAN, ni la pénalité de -10 qui les accompagnait (app/domains/financing/analyse.py).
Lot 4 — Conditions structurées, position, benchmarks (PR #138, migration 086)
Les offres bancaires portent des conditions structurées comparables (taux, type, quotité, frais — saisies par la banque, jamais calculées), avec trigger d'immuabilité étendu aux nouvelles colonnes. Le gate test_aucun_calcul_de_taux_ni_de_classement est resserré puis compensé par trois gates plus forts (provenance depuis OffreIn, aucun défaut suggéré, trigger à jour), citant l'amendement A1/A2. Position concurrentielle (A1, domaine pur écrit au chantier « engagement » mais jamais branché) gagne enfin sa route. Benchmarks de marché k-anonymes (A2) livrés en nouveau module d'agrégats, cloisonnés par classe d'environnement (démo vs réel).
Lot 5 — Cockpit banque (PR #139, hotfix #140)
Porte d'entrée unique pour la banque : compteurs et têtes de file des quatre décisions en attente (dossiers, tirages, sorties de stock, exceptions), inbox triable/paginée avec âge des dossiers, échéancier banque miroir de celui de l'entreprise. Aucune migration — le code manquait, pas les données. PREMIUM côté SPA uniquement : la consolidation est le confort premium, chaque file reste accessible unitairement en STANDARD. Hotfix #140 : le tri de l'inbox par échéance se fait sur le snapshot réel — correction structurelle, aucun nouveau privilège.
Lot 6 — Backoffice abonnements (PR #141)
Le cœur (prédicat, colonne posée au Lot 3, routes GET/POST) existait depuis les Lots 3-4 ; ce lot le rend visible et pilotable. L'admin plateforme voit et gère le tier de chaque banque (STANDARD/PREMIUM, échéance, historique audité via audit_logs / INSTITUTION_SUBSCRIPTION_CHANGED). La banque voit son propre état d'abonnement dans le cockpit. Décision sega : 2 niveaux uniquement, tranché explicitement contre l'extension naturelle vers ENTERPRISE/TRIAL (le prédicat PREMIUM_TIERS reste inchangé en lecture, aucune nouvelle surface d'écriture). CTA « contactez Tauraco » inchangé — pas de parcours de paiement institution, procédure manuelle.
Lot 7 — Guide in-app + banc de captures (PR #142)
Le guide utilisateur vit désormais dans l'application (/guide), sections par persona filtrées par les droits, contenu enrichi des nouveautés Lots 2-6 (KYB, analyse, position, benchmarks, cockpit, abonnements). Aucun changement backend. Les captures d'écran sont des PNG versionnés dans frontend-app/public/guide/, produits par un banc Playwright dédié (playwright.guide.config.ts, hors CI e2e) sur les comptes démo de la stack locale seedée — jamais à la main. Le markdown docs/guide-utilisateur/ reste la source dépôt ; l'in-app est la surface produit enrichie (duplication assumée et documentée).
Lot 8 — Insights + démo bout-en-bout (PR #143)
L'assistant IA Insights (/v2/ai/insights) gagne le gate d'abonnement serveur qu'il n'a jamais eu (axe tenant pour les pages ERP, axe institution pour les pages banque via est_premium_institution), un persona FINANCEUR, et un champ degraded sur le repli 503. Rédaction d'identités systématique avant tout appel LLM — jamais après. Démo : script seed_salle_de_marche_demo.py (double garde, idempotent) qui comble les manques en base — offres structurées de 4 banques sur le segment SN pour franchir les seuils k=3/m=3 des benchmarks, une demande en mode COMPETITIVE_OFFER à 2 offres (position visible), le 18ᵉ dossier KYB en file, demo-co-sn en tenant PREMIUM. Runbook associé : docs/runbooks/demo-bout-en-bout-sega.md.
Décisions produit de sega qui traversent le programme
- Fermeture complète du marketplace investisseur, pas de fermeture partielle ni de gel progressif — un seul lot, deux PRs (
docs/legal/2026-09-14-fermeture-consultation-investisseur.md). - 2 tiers d'abonnement STANDARD/PREMIUM uniquement (Lot 6), contre l'extension naturelle du prédicat existant.
- IBAN neutralisé dans l'analyse nominative (Lot 3, 2026-09-20) — non vérifiable en Afrique, retiré du scoring plutôt que de produire un faux signal systématique.
- Mode libre en cas de doute produit sur chaque lot (autorisation permanente sega) — décisions ledgerisées dans les plans
docs/superpowers/plans/2026-09-*.mdplutôt que reportées.
Pointeurs
- Spec :
docs/superpowers/specs/2026-09-13-salle-de-marche-institutionnelle-design.md - Décisions légales :
docs/legal/2026-09-14-fermeture-consultation-investisseur.md,docs/legal/2026-09-14-amendement-invariants-salle-de-marche.md - Orphelins assumés du Lot 1 :
docs/financing/surfaces-gelees.md - Runbooks :
docs/runbooks/institution-kyb.md,docs/runbooks/demo-bout-en-bout-sega.md,docs/runbooks/guide-captures.md - Plans détaillés par lot :
docs/superpowers/plans/2026-09-14-lot0-lot1-depose-marketplace.md,2026-09-19-lot2-kyb-institution.md,2026-09-20-lot3-analyse-nominative.md,2026-09-21-lot4-conditions-structurees.md,2026-09-21-lot5-cockpit.md,2026-09-23-lot6-abonnements.md,2026-09-23-lot7-guide-inapp.md,2026-09-24-lot8-insights-demo.md