Spaces:
Running
Running
Commit History
Yesterday
-
feat(simulateur): score de remboursement sans Jev, selon la qualite du modele Running
Le score s'affiche si le modele a passe ses controles (historique mature, classes equilibrees, test chronologique, Brier, AUC). Jev reste pour l'analyse Jasmine et Ontology. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>2278cb0 -
feat(jasmine): chat et contenu de la carte Logistique (Mapbox) transmis au chat
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>57c9004 -
feat(jasmine): le chat lit tous les graphiques de la page (Plotly et natifs), par module
Les graphiques affiches sont captes (core/graphiques_contexte.py) et transmis au chat de leur page via graphiques_affiches ; le chat lit ceux du run precedent. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>2ce0542 -
fix(jasmine): le chat voit les donnees des graphiques C et H (residus vs predits, stats, historique)
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>373f99b
2 days ago
-
fix(signature): localisation facultative — le code email reste saisissable sans position
Le lieu non communique est inscrit a la place (refusee / non recue) avec l'IP. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>06df37a -
feat(jasmine): chat JASMINE sur la page prevision, avant la section A — Signal operationnel
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>b3acfb7 -
fix(ui): legende evolution reelle suit le theme (Ambre en noir)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>c928c1f -
fix(sheets): colonnes sans titre ne bloquent plus get_all_records
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>8caf834 -
docs(onboarding): mail insiste sur localisation obligatoire
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>bb9984f -
fix(kyc): geolocalisation facultative si refusee par le navigateur
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>8beadd4 -
feat(signature): apercu des contrats dans la page, plus de PDF dans les emails
Lien de signature et confirmation sans piece jointe ; apercu par page (client et preteur), telechargement immediat apres signature, PDF definitifs envoyes a la contresignature. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>966c823 -
fix(logistique): lecture des feuilles tolerante aux onglets absents, quota remonte au bandeau 429
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>5ba382e
3 days ago
-
feat(logistique): carte de renseignement — liens adresses/IP/tel/email/piece entre clients et garants
- core/liens_logistique.py : croisement pur (adresses normalisees + GPS, IP publiques, telephones, emails, pieces, employeurs, garants). IP d'audit limitees aux sessions publiques. - modules/carte_html.py : carte plein ecran noire, clic = dossier du lieu + liens, recherche, alertes. - map_dashboard : retrait du bloc ANSD (donnees externes) et des KPI codes en dur. - sheets_quota : invalidation par onglet (l'audit ne vide plus les autres feuilles). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>1030d8c
4 days ago
-
feat(tarif): forfait duree minimale = plancher, taux machine si plus eleve
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>8661ddc -
fix(demandes): montants lus a 0 quand le Sheet fournit une espace insecable
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>6ff8ef6 -
feat(ui): base du benefice Accordé et theme Gotham par defaut
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>6cefb3d -
perf(sheets): bouclier anti-429 global (cache GET gspread, invalidation sur ecriture, secours perime, reessais)
Cache au niveau HTTPClient.request : valeurs 60 s, metadonnees 10 min, Drive 1 h, dedoublonnage des lectures concurrentes, disjoncteur + cache perime sur 429. Bouton ACTUALISER LES DONNEES, lecture fraiche pour la generation d'ID. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>dd08ad5 -
style(ui): emojis remplaces par des balises tactiques sobres
- [OK] [ECHEC] [ATTENTION] [ALERTE] [REFUS] [STOP] [ANALYSE] [IA] [DOSSIER]... a la place des emojis dans tous les libelles, messages et journaux - puces d'etat (couleurs) remplacees par des carres/ronds geometriques - aucun changement de logique : les tests et la detection des messages suivent la nouvelle forme Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>495d60d -
feat(signature): localisation obligatoire pour signer et contresigner
- Etape 3 de la page de signature : lieu detecte (ville, quartier) affiche avant le formulaire ; sans position, pas de formulaire. - Apres un refus : case obligatoire qui relance la demande au navigateur (audit_log.redemander_gps, nouvelle cle du composant) ; aide pour reactiver une localisation bloquee. - signer/contresigner(exiger_position=True) refusent une position vide, refusee ou non recue (verification cote service, pas seulement dans l'interface). - Contresignature du preteur : meme localisation (Localisation_Preteur, GPS_Preteur) imprimee dans son bloc ; module partage localisation_ui. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>cfbb492 -
feat(ui): theme NOIR "poste de commandement" (Gotham) + style tactique partout
- core/theme.py : theme BLEU (defaut, inchange) et NOIR ; interrupteur "MODE NOIR · GOTHAM" dans la barre laterale (connexion et admin), choix memorise par navigateur (cookie 1 an) - NOIR = table de correspondance BLEU -> NOIR appliquee au rendu de tout le HTML/CSS injecte (st.markdown, st.html, components.html) et des figures Plotly : fonds noirs, gris neutres, accent ambre, etats desatures ; une seule source de style pour les deux themes - composants natifs habilles dans les deux themes : fonds, champs, listes, boutons, onglets, expanders, metriques, code, progression, chat, barres de defilement - alertes encapsulees en bandeau tactique : CONFIRMATION / INFORMATION / AVERTISSEMENT / ALERTE / EXCEPTION SYSTEME (liserai de couleur, etiquette), toasts au meme style - NOIR : titres fins en capitales espacees (style mission suite) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>4aa6677 -
feat(signature): localisation (ville, quartier) dans le bloc de signature
- GPS du navigateur reutilise (audit_log) : geocodage inverse Nominatim en "Ville, Quartier" ; refus ou absence = mention explicite. - Ligne "Localisation (GPS)" dans le contrat, IP conservee a cote ; absente des signatures anterieures (PDF identiques octet pour octet). - Signatures_Contrats : Localisation_Signature et GPS_Signature (coordonnees brutes + precision, jamais imprimees) ; journal de signature enrichi. - Page de signature : information sur l'enregistrement de la position. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>3f6c2b9
5 days ago
-
feat(erreurs): incidents techniques en bloc Gotham explique par l'IA + Telemetrie
- core/incidents.py : bloc sobre (bleu-gris, jamais rouge) avec DIAGNOSTIC et ACTION en une phrase chacune (call_llm, repli sur regles locales), fleche "Journal technique" avec les lignes de log en texte simple (type, message, traceback) - chaque incident part dans la Telemetrie (ERREUR / INCIDENT) avec ses valeurs : type, message, contexte, traceback, diagnostic, action, analyse ; dedoublonne 60 s - appels IA bornes : cache par signature (24 h), 15/heure, 15 s au total ; emails, numeros et jetons masques avant envoi, traceback jamais envoyee - branche sur : exceptions non gerees d'un module admin, st.error technique (pas les consignes de saisie), afficher_erreur_sheets ; le public ne voit jamais le detail - tests : aucun appel IA reel (garde-fou conftest), un test lent ne bloque plus la suite Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>001eb74 -
feat(ui): bandeau jaune 429 partout dans l'application
- core.errors.est_quota() : detecte [429], code 429, Quota exceeded, RESOURCE_EXHAUSTED, Too Many Requests, rate limit (sans faux positif sur un nombre comme 1 429 000) - core.errors.installer_bandeau_429() : tout st.error / st.warning (sidebar, container...) dont le message est un quota s'affiche en bandeau jaune explicatif au lieu d'un cadre rouge (texte Google Sheets ou service externe selon le message) - bandeau unique partage avec afficher_erreur_sheets ; gestionnaire global du module utilise la meme detection Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>a62a48f -
feat(signature): faire signer tous les prets en cours, avec ou sans remboursement
- lister_prets_a_signer : inclut les prets avec remboursements (colonne Remboursements), exclut seulement ceux deja signes par toutes les parties. - Un pret avec remboursements reste ACTIF pendant l'attente de signature (journal PRET_RESTE_ACTIF) ; sans remboursement il passe EN_ATTENTE_SIGNATURE. - Onglet "Prets a faire signer" : case "Tout selectionner". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>bc03a3d -
feat(signature): suivi d'ouverture des emails de lien de signature
- Les emails de lien (et rappels) portent le tag Brevo vortex-signature et sont enregistres dans Suivi_Emails (Type=SIGNATURE, ID_Signature, ID_Pret). - Onglet Signatures > Ouvertures : liens envoyes / ouverts / signes, delai entre premiere ouverture et signature, filtres. - Plus de copie cachee admin sur le lien (son ouverture fausserait le suivi). - envoyer_email accepte tags et meta (message_id Brevo). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>c44d4c8
7 days ago
-
feat(communications): suivi d'ouverture des emails (Brevo)
- Envoi HTML tague par campagne, une ligne par destinataire dans Suivi_Emails. - Synchronisation des evenements Brevo (delivre, ouvertures, proxy Apple, clics, rebonds, spam) a la demande et toutes les heures (scheduler). - Onglet Statistiques d'ouverture : tableau par campagne + detail par personne. - Recapitulatif unique a l'admin au lieu d'une copie cachee par email. - Lecture du messageId Brevo sans jamais faire echouer un envoi reussi. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>c45c242 -
fix(securite): XSS sur donnees publiques, limite d'envoi des liens simulateur
- echappement HTML des donnees saisies par le public avant rendu brut : analyse IA des documents KYC (kyc_form), profession/secteur (request_loans), nom et valeurs des garants (Data_exploration). Plus important depuis que le cookie de session est lisible en JavaScript. - simulateur public : email valide obligatoire, 3 liens/heure par adresse, 40 liens/heure au total (protege le compte Brevo et la feuille des tokens) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>c4a01d3 -
feat(signature): mention manuscrite "Bon pour..." saisie par le debiteur
- reconnaissance de dette : montant en toutes lettres (snapshots v2), mention recopiee par le signataire, verifiee avant l'OTP, stockee (Mention_Manuscrite) et imprimee - echeancier du contrat repris tel quel des donnees du pret (recalcul en controle seulement) - mention bornee a 300 caracteres (texte public) Travail d'une autre session, relu et teste avant commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>6122be7 -
feat(auth): cookie "Rester connecte" (survit aux redeploiements)
- jeton signe HMAC (SESSION_SECRET, sinon cle derivee de SIGNATURE_SECRET), 30 jours, renouvele a l'usage ; aucun etat en memoire, donc valable apres un push - invalide si mot de passe change, compte supprime, ou deconnexion (hash du jeton inscrit dans la feuille Sessions_Revoquees, cookie efface) - role et modules relus a chaque restauration - case "Rester connecte sur cet appareil" (cochee par defaut) a l'ecran de connexion Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>5f4c0ba -
feat(signature): onglet Actions, plusieurs demandes affichees en meme temps
Selection multiple : une carte par demande, avec ses propres boutons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>0a12997
8 days ago
-
fix(ui): bandeau explicite au lieu de la traceback sur quota Sheets (429)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>b6cc722 -
feat(signature): email au signataire quand sa demande est annulee
- annulation par l'admin : email "lien annule, ne l'utilisez plus" (journal ANNULATION_NOTIFIEE) - nouveau lien a la meme adresse : le mail du nouveau lien annonce que l'ancien est annule - nouveau lien a une adresse corrigee : l'ancienne adresse recoit l'email d'annulation - ecran admin : confirme l'envoi ou signale l'echec de l'email d'annulation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>103bca0
9 days ago
-
feat(ontology): module serieux (vue 360, fraude, coherence, terminal IA fiable)
Exactitude - core/kg_data.py : une ligne par pret (Prets_Master + derniere version Prets_Update), classes canoniques (Prêt = Pret), ID_Officiel n'est plus classe "Officiel", identifiants normalises (telephone, email, piece) - montant_net = Montant_Total de la version courante (plus le MAX de tout "montant") - qualite RDF sur toutes les classes : completude reelle + cardinalites - controles de coherence : references orphelines, doublons, chaine des soldes (solde de depart = Montant_Total), statuts incoherents - fraude : identifiants partages entre personnes distinctes (client = garant compte pour une personne), auto-garantie, garantie croisee, garant multi-emprunteurs Securite - plus aucun HTML brut issu des donnees (chat en st.chat_message, infobulles neutralisees) - identifiants sensibles masques dans le RDF, l'export et tout ce qui part vers LLM/Jev - SPARQL de l'agent en lecture seule (SERVICE/INSERT/DROP... refuses) Robustesse - lecture groupee en cache (values_batch_get)…c6c39e9 -
fix(sidebar): base du benefice en liste deroulante, libelles courts
Le segmented_control coupait les libelles longs dans une sidebar etroite. Liste "Encaissé" / "Accordé", definition en legende. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>a798bd8 -
feat(ui): cases carrees sur tous les st.radio, module Suppressions
- CSS radio : structure react-aria (stRadioOption / data-selected), remplace l'ancien [data-baseweb="radio"] inoperant en Streamlit 1.64 - maintien de session (fragment run_every 5 min) - module Suppressions (admin) et son journal, entree dans l'overlay orb Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>f7df762 -
fix(signature): journal chaine, lecture groupee et arret propre sur quota Sheets
- lot_envoi() : lit Clients_KYC/Garants_KYC une fois par envoi groupe et reutilise la feuille du journal (quota 429) - envoi groupe : arret propre sur APIError avec liste des prets restants - journal de signature chaine (verifier_journal), cache par classeur reinitialise entre tests Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>bbab97f -
fix(telemetrie): heure de Dakar (et non d'Abidjan) dans les libelles
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>4208fca -
chore(telemetrie): renommer le module Audit en Télémétrie
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>3caa1ab -
feat(exercice): base du benefice globale (encaisse / accorde)
Le bouton "Base du benefice" passe dans la barre laterale et pilote tous les modules : - Dashboard : KPI, analyse mensuelle, repartition. - Optimizer : realise selon la base ; interets restant a echoir ajoutes seulement en base encaissee. - Digital Twin : projection du benefice jusqu'au 31/12 de l'exercice (realise + part interets/penalites simulee) au lieu de la tresorerie totale sur 52 semaines ; base accordee = realise. - Rapports IA et JASMINE : base retenue dans les donnees et la consigne. Echeancier contractuel : vraies dates (Dates_Versements) si renseignees. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>2d6c8b9 -
feat(dashboard): bascule benefice encaisse / accorde
Bouton "Base du benefice" sur le Dashboard : Encaisse (interets + penalites, au mois du paiement, base de l'objectif) ou Accorde (cout du credit, au mois du deblocage). KPI, analyse mensuelle, repartition et contexte JASMINE suivent la base choisie. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>89d4159 -
feat(exercice): separation de toute l'application par annee civile
- core/exercice.py : source unique (lecture des dates FR/ISO, bornes, selecteur EXERCICE de la barre laterale, regle A : chaque flux dans l'annee de sa propre date, echeancier contractuel, synthese par exercice). - Objectifs de benefice par exercice (2026 = 2,2 M, 2027 = 3,5 M XOF, annees futures = dernier objectif connu), editables par annee. - Dashboard, Optimizer, rapports IA, JASMINE, Digital Twin : chiffres de l'exercice choisi + comparaison N-1 ; benefice = interets + penalites encaisses dans l'annee. - IA : consigne d'exercice dans tous les prompts. ML : variable Annee_Deblocage + erreur hors echantillon par exercice. - Correctif : "2026-03-01" n'est plus lu comme le 3 janvier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>631cd58 -
feat(ui): overlay de chargement thinking-orb (fond flouté) sur chaque exécution
- core/orb_overlay.py : injection dans le document principal (components.html height=0 + window.parent), état d'orbe par module - core/assets/vortex_orb.js : bundle IIFE du moteur thinking-orbs (sans React) - vendor/thinking-orbs/vortex/ : source overlay.ts + README (rebuild esbuild) - streamlit_app.py : installer_orb() juste après set_page_config Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>b9c04ed
10 days ago
-
feat(signature): contresignature du preteur (contrat et caution) avant activation
- Le preteur contresigne le dossier une fois client et garant signes (code par email, admin connecte) - Bloc preteur ajoute au contrat et a l'acte de caution ; reconnaissance de dette inchangee - Pret ACTIF seulement apres contresignature ; documents definitifs envoyes a chaque signataire - Onglet admin 'A contresigner' ; verification publique du sceau preteur - Mention 'loi ivoirienne' retiree du bandeau public Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>db7f3f2 -
feat: journal d'audit, pénalités, cohérence remboursements et signature
- Journal d'audit (core/audit_log.py, module audit_viewer) : traces des envois d'email, connexions et jobs - Pénalités : consommation de l'occurrence à l'octroi uniquement, idempotente - Correctifs remboursements, rappels et décimaux du Sheet (virgule française) - Pages et module de signature électronique restants (voir commit précédent) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>56277f7 -
feat(signature): signature electronique des contrats (lien email + 4 derniers car. ID_Officiel + OTP + case a cocher)
- Pret cree EN_ATTENTE_SIGNATURE (bloque), ACTIF quand client (et garant) ont signe - Pages publiques ?sign=<token> et ?verifysig=<ID> ; bloc de signature electronique en fin de PDF - PDF deterministes (invariant=1) + snapshot JSON : documents reconstituables sans stockage de fichier - Sceau HMAC (secret SIGNATURE_SECRET), token et OTP jamais stockes en clair, journal append-only - Relances 24 h, re-emission automatique apres expiration (3 max), alerte admin - Module admin Signatures : suivi, rattrapage des prets sans remboursement, actions, journal - Branche sur octroi direct, demandes approuvees et Check-Up ; EN_ATTENTE_SIGNATURE compte dans la limite de prets - 79 tests (faux classeur Sheets, AppTest Streamlit) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>de5e25f
12 days ago
-
perf+fix(simulateur): Jasmine plus rapide, capacite de remboursement lue par la grille
LLM : modeles non textuels exclus (image, audio, deep-research...) ; un modele en echec est ecarte un moment (15 min quota, 6 h modele absent, 2 min panne) au lieu d'etre reessaye a chaque appel ; mode rapide (modeles flash d'abord) et delai de 25 s par modele pour l'analyse Jasmine. Jev : Jasmine recoit la capacite de remboursement calculee par la grille de l'entreprise et doit la recopier ; la trace envoyee a Jev contient cette lecture et la grille. Mots de decision interdits dans le rapport, phrase de non-garantie imposee. Outil tools/jev_diagnostic.py pour tester quelles formulations passent. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>5183195 -
fix: decimaux du Sheet lus correctement (17,61 n'est plus lu 1761) et logs LLM/Jev
Le classeur est en locale francaise : gspread supprimait la virgule des decimaux a la lecture ("17,61" -> 1761, "1,5" -> 15, "252,4" -> 2524). core/gspread_fr.py lit desormais une virgule decimale comme un decimal, pour toute l'application (get_all_records, cache partage) et le job de rappels. Neutralise la rustine "diviser par 10 tant que > maximum" de Demandes Prets qui reduisait un taux legitime de 24,11 % en 2,41 %. Diagnostic : [LLM] modele, duree et erreur de chaque tentative ; [JEV <etape>] trace envoyee et reponse brute complete. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>c73b85c -
fix: journalisation des refus Jev et ajustements du remboursement
- Simulateur : chaque refus Jev de l'analyse est écrit dans les logs avec les contrôles échoués, le score, l'erreur et le début du rapport, pour diagnostiquer les boucles de réécriture Jasmine - Remboursements et penalites : modifications en cours de la session de suivi (AnalyseRepayment, repayments) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>238c4a3 -
fix(simulateur): meme seuil de blocage a l'affichage et a la soumission (LIMITE_PRETS_EN_COURS = 3)
Le garde-fou de soumission bloquait a 2 prets/demandes en cours alors que l'affichage bloque a 3 : un client avec 2 prets etait refuse a tort. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>e50b6fd -
feat(simulateur): progression de l'analyse IA en une ligne et durée dans Demandes Prêts
Sous le bouton d'analyse, une seule ligne remplacée à chaque étape (taux ML, Jasmine, contrôles Jev, modèle de remboursement) avec le temps écoulé, puis "Analyse terminée en X s". Durée totale et détail par étape enregistrés dans Prets_Requests (Duree_Analyse_IA_s, Detail_Analyse_IA) et affichés dans la fiche de la demande. Chronométrage de chaque étape aussi écrit dans les logs ([CHRONO simulation]). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f40f505