FixUne panne de la base ne peut plus vous montrer le planning d'un AUTRE service. C'est le defaut le plus grave trouve depuis le debut du projet, et il etait invisible. Quand vous ouvrez une page, l'application verifie que vous appartenez bien au service demande. Cette verification etait ecrite de telle facon qu'elle etait entierement SAUTEE si la base hoquetait a cet instant - et la page s'affichait quand meme. Un medecin d'un service de demonstration qui ouvrait l'adresse de la pediatrie de Rochefort voyait donc le vrai planning de Rochefort. Aucun message, aucune alerte : une page parfaitement normale. Desormais, si cette verification ne peut pas etre faite, l'acces est refuse et la panne s'affiche comme une panne.
FixVotre service ne peut plus afficher les postes d'un autre etablissement. L'application avait une configuration « par defaut » utilisee quand la vraie ne pouvait pas etre lue. Cette configuration par defaut etait, en dur, celle de la pediatrie de Rochefort. Un medecin de Libourne pouvait donc voir la grille de Rochefort, avec les postes de Rochefort, son regime horaire bascule, ses secteurs de soins disparus - et le nom « Pediatrie - CH Rochefort » affiche en haut. Il ne pouvait pas le deviner. Neuf endroits du code y menaient ; deux d'entre eux n'avaient meme pas besoin d'une panne pour se declencher. Il n'y a plus de configuration « par defaut » : sans configuration, l'ecran est vide - ce qui se voit, contrairement a une grille credible mais fausse.
FixUn planning valide ne peut plus etre ecrase par le brouillon du moteur lors d'un echange de garde. Quand un medecin acceptait une reprise, l'application relisait le planning en vigueur pour y appliquer l'echange. Si cette lecture echouait, elle repartait silencieusement du brouillon du moteur - et ecrasait le mois valide avec, en le remarquant « valide » au passage. Toutes les retouches manuelles de l'admin disparaissaient, et l'application repondait « echange applique ». Le probleme venait d'une facon de lire qui rendait « ce mois n'a jamais ete retouche » et « la base est tombee » strictement indiscernables.
FixLe moteur ne peut plus generer un planning en ignorant vos indisponibilites. Avant d'appeler le moteur, l'application rassemble les desiderata, les activites, les verrous poses par l'admin et les reglages du service. Si une seule de ces lectures echouait, elle etait remplacee par « personne n'a rien demande » - et le moteur resolvait un mois imaginaire, en toute confiance. Le resultat etait annonce « OPTIMAL », enregistre, et le medecin qui avait pose son indisponibilite se retrouvait de garde. Aucun trou, aucune alerte : le planning etait complet et parfaitement credible. Il etait juste faux. Sept lectures etaient concernees, dont les formations : on pouvait etre de garde la veille de sa propre formation.
Fix« Planning genere » veut de nouveau dire que quelque chose a change a l'ecran. Publier un planning, c'est trois operations qui doivent reussir ensemble. Si celle du milieu echouait sans bruit, le nouveau planning etait bien enregistre mais restait invisible, masque par l'ancien. L'admin lisait « OPTIMAL, planning genere », ne voyait rien bouger, regenerait, relisait « OPTIMAL »... et rien ne bougeait toujours. Les trois operations sont desormais indissociables : soit tout passe, soit rien ne bouge et l'erreur s'affiche.
FixReinitialiser un code PIN ne peut plus enfermer definitivement un medecin dehors. L'operation supprime deux choses : le compte de connexion, puis le lien avec le medecin. Si la seconde echouait, l'admin lisait « c'est fait » alors que rien n'etait repare : le medecin ne pouvait plus se connecter, l'application lui repondait « PIN deja configure, contactez un administrateur », et l'admin qui recliquait sur Reinitialiser obtenait une erreur. Plus personne ne pouvait rien faire depuis l'interface. Recliquer repare maintenant la situation au lieu d'echouer, et « c'est fait » n'apparait que si les deux suppressions ont vraiment eu lieu.
FixConfigurer son PIN ne peut plus creer un compte au mauvais endroit. Si la lecture du service echouait pendant la creation du compte, celui-ci etait cree sous un format d'identifiant obsolete - definitivement. C'etait le seul defaut dont l'effet SURVIVAIT a la panne : reparer la base ne renommait pas un compte deja cree, et le medecin se retrouvait avec un compte qu'aucune connexion ne retrouvait. L'application refuse maintenant AVANT de creer quoi que ce soit : une panne ne laisse plus aucune trace, il suffit de recliquer sur son lien.
AméliorationL'application ne vous dit plus « acces refuse » ou « ce service n'existe pas » quand c'est en realite la base qui est tombee. Plusieurs ecrans concluaient a un probleme de droits ou a une page inexistante alors que le probleme etait ailleurs - et vous auriez cherche au mauvais endroit. Le planning partage par QR code ne peut plus, lui, afficher le planning d'un autre service par erreur : cette porte-la n'etait fermee que par un hasard de donnees, pas par une protection.
MoteurGarde-fous : 5 nouveaux filets empechent ces defauts de revenir, sur 7 fichiers sensibles, et chaque test a ete verifie CAPABLE d'echouer en y reintroduisant le bug. Ce n'est pas un detail de methode : deux fois pendant ce travail, un test affichait vert sur un bug intact, et une fois le detecteur lui-meme avait un angle mort qui laissait passer toute une forme d'ecriture. Aucun n'a ete trouve en relisant. Le rapport d'audit qui a lance ce chantier avait recense 119 endroits ; il en manquait, et son critere de tri classait « sans risque » des cas qui ne l'etaient pas. Les deux ont ete corriges.
v8.28.017/07/2026
AméliorationL'edition du planning repond plus vite. Jusqu'ici, chaque action - poser un verrou, ajouter une activite, annoter un remplacant - faisait deux allers-retours au serveur : un pour ecrire, puis un second pour relire TOUTE la liste afin de savoir ce qui venait d'etre ecrit. L'ecriture renvoie desormais directement la ligne concernee : un seul aller-retour, et plus rien a retelecharger. 11 actions d'edition sont concernees. Le comportement ne change pas, seul le delai avant que l'ecran ne bouge est divise par deux. Remonte par Marion (« lent a l'utilisation »).
v8.27.017/07/2026
MoteurLes verifications automatiques portent desormais sur le moteur qui genere reellement les plannings. Le projet contenait deux listes de composants concurrentes : l'une servait la production, l'autre les verifications, et rien ne garantissait qu'elles restent d'accord. Elles avaient deja diverge. Un test pouvait donc valider un moteur qui n'est pas celui qui tourne - ou, a l'inverse, signaler une anomalie inexistante. Il ne reste qu'une seule liste, celle de la production : ce qui est verifie est maintenant, par construction, ce qui tourne. Les plannings ne changent pas ; c'est la valeur des verifications qui change.
AméliorationMenage : suppression d'un fichier de configuration de deploiement devenu inactif en mars, qui decrivait encore l'ancienne facon de mettre le moteur en ligne. Il ne servait plus a rien mais restait le premier fichier qu'on lisait pour comprendre le deploiement - et il donnait une reponse fausse. La documentation technique, figee elle aussi depuis mars, a ete remise a jour dans la foulee.
v8.26.016/07/2026
FixUne panne de la base de donnees ne peut plus ressembler a un planning. Jusqu'ici, si la base hoquetait au moment ou vous ouvriez une page, l'application affichait un planning vide - sans erreur, sans alerte, exactement comme un planning qui n'aurait pas encore ete fait. Sur une application de garde, c'est le pire malentendu possible : on peut en conclure qu'on n'est pas de garde. Desormais une panne s'affiche comme une panne, avec un bouton pour reessayer. Un vrai vide (« aucun planning genere pour ce mois ») reste un vrai vide, et le dit toujours.
FixLe planning validé ne peut plus etre remplace en silence par le brouillon du moteur. Si la lecture du planning valide echouait, l'application affichait a la place la proposition brute du moteur - un planning complet, credible, que personne n'avait valide, et rien ne le signalait. C'etait plus grave que la page vide, parce qu'invisible. Ce cas leve maintenant une erreur au lieu d'afficher un brouillon.
FixLe tableau de bord et Mon suivi n'affichent plus de zeros inventes. En cas de panne, le tableau de bord montrait « pas de garde » et Mon suivi « 0 h par semaine » ou « 0 garde » pour toute l'equipe. Des zeros sont une affirmation : une lecture ratee n'a pas le droit de la faire.
AméliorationLe planning partage par QR code reste lisible meme en cas de panne. Sur cette page, la grille se lit avec les initiales et les couleurs ; seule la legende en dessous a besoin de la liste des medecins. Si elle ne charge pas, la legende disparait mais le planning reste affiche - inutile de casser une page parfaitement lisible pour une legende. Meme principe pour les jours grises en bord de calendrier : un mois voisin indisponible ne fait plus disparaitre le mois que vous consultez.
AméliorationLe bandeau « Certaines donnees n'ont pas pu etre chargees » de l'espace Administration refonctionne. Il etait annonce depuis sa creation mais ne s'est jamais declenche pour la liste des medecins, a cause de ce meme defaut.
AméliorationLa page planning interroge la base une seule fois pour la liste des medecins, au lieu de cinq fois pour la meme information. Moins d'appels, donc moins d'occasions de tomber en panne.
FixLe calendrier synchronise sur votre telephone ne peut plus se vider tout seul. C'est le defaut le plus grave trouve, et le seul qui se produisait sans que personne soit devant : votre telephone interroge l'application tout seul, regulierement, pour rafraichir vos gardes. Si la base hoquetait a cet instant, l'application repondait « tout va bien » et servait un calendrier vide mais parfaitement valide, a votre nom - que le telephone gardait ensuite en memoire pendant une heure. Vos gardes disparaissaient de votre agenda, sans erreur, sans alerte, jusqu'au rafraichissement suivant. Desormais l'application refuse de repondre plutot que de repondre faux, et le telephone conserve les gardes qu'il a deja.
Fix« Planning en cours d'elaboration » ne s'affiche plus a la place d'un planning valide. Si la lecture du statut echouait, l'application concluait que le planning n'etait pas encore pret et affichait la page d'attente - a tous les medecins, sur un planning pourtant valide et publie.
Fix« Aucun planning » ne s'affiche plus sur tous les mois a cause d'une panne. La liste des mois est ce qui decide si un planning existe : quand sa lecture echouait en silence, chaque mois paraissait vide, et la verification faite juste apres n'avait alors plus rien a verifier.
Fix« Vous n'avez pas soumis vos desiderata » ne s'affiche plus quand l'information n'a simplement pas pu etre lue.
FixLes compteurs de gardes annuelles et de demi-journees ne peuvent plus afficher zero a cause d'une panne. Deux des correctifs ci-dessus ne fonctionnaient en realite pas : la protection avait ete posee au bon endroit, mais la fonction qu'elle protegeait etait incapable de signaler une erreur - elle rendait des listes vides sans rien dire. Le tableau d'equipe pouvait donc afficher « 0 garde » pour tout le monde malgre la correction. Trouve en verifiant les 119 endroits du code concernes, un par un.
MoteurTests : 18 tests ajoutes, dont trois garde-fous qui empechent le defaut de revenir - y compris un qui previendra explicitement la prochaine personne qui touchera aux droits d'acces de la base, un changement qui reintroduirait le probleme sans que rien ne le signale. Chaque test a ete verifie capable d'echouer. Correction verifiee sur l'application en simulant une vraie panne, avant et apres.
v8.25.017/07/2026
MoteurDetection automatique des pannes du moteur de generation. Si le calcul d'un planning echoue pour une raison technique (pas un planning impossible a resoudre, qui lui est deja diagnostique et explique), l'incident remonte desormais tout seul. C'etait le dernier angle mort : le moteur est la partie la plus complexe du systeme, et jusqu'ici un plantage n'y laissait aucune trace exploitable une fois la page refermee.
AméliorationAucune donnee ne part avec ces rapports : ni nom de medecin, ni desiderata, ni arret maladie - alors que ce sont precisement les donnees que le moteur recoit a chaque calcul. Deux protections explicites (les variables internes et le contenu des requetes ne sont jamais captures) verrouillees par 6 tests automatises. Les rapports sont heberges en Allemagne, comme ceux du site.
v8.24.016/07/2026
MoteurNouveau reglage par medecin : « Consultations comptees pendant une semaine de soins ». Certains medecins assurent leurs consultations de l'apres-midi meme les semaines ou ils suivent un secteur de soins, en plus du service. Jusqu'ici le moteur l'ignorait : il ne comptait comme journee de consultation qu'une journee sans aucun poste, et reservait donc des journees entierement libres en plus - alors que l'objectif du mois etait deja atteint. Active, l'option fait compter ces journees dans l'objectif. Premier cas reel : Libourne, qui l'a confirme lors du point du 16/07.
AméliorationLe reglage reste confine aux secteurs de soins declares par le service : une journee aux urgences ou en maternite continue de consommer l'objectif, puisqu'aucune consultation n'y est assuree. Une journee de garde aussi. Non coche, rien ne change - c'est le comportement de tous les autres services.
AméliorationLe recap medecins et la vue individuelle affichent desormais le meme compte que le moteur pour ces medecins : sans ca, l'ecran aurait signale un objectif non atteint alors que le moteur le considerait rempli. Un garde-fou refuse le reglage sur un service qui ne declare aucun secteur de soins, ou il n'aurait aucun effet en silence.
v8.23.016/07/2026
MoteurFiabilite des tests du moteur : deux tests automatises pouvaient echouer ou reussir sur un code strictement identique - l'un d'eux a mis la chaine de verification au rouge alors qu'aucune anomalie reelle n'existait, sur du code qui venait de passer au vert. En cause : ils demandaient au moteur le meilleur planning possible sur un mois entier avec six medecins interchangeables. A cette taille le moteur n'a pas le temps de demontrer qu'il tient le meilleur planning ; il rend celui qu'il a sous la main quand le temps imparti expire. Le resultat dependait donc du hasard de la recherche - version du moteur, nombre de processeurs de la machine, simple minutage - et pas du code teste. Les tests portent desormais sur une seule semaine, taille sur laquelle le meilleur planning est demontre en une fraction de seconde. Le moteur lui-meme n'a pas ete touche : il etait juste, seuls les tests etaient en tort.
FixLe test fautif verifiait en realite autre chose que ce qu'il annoncait. Le reglage « Garde du week-end apres une semaine de soins » decourage l'enchainement des deux ; il ne supprime pas la garde du week-end. Le moteur reste libre de defaire l'enchainement par l'autre bout, en retirant plutot la semaine de soins - ce qu'il fait effectivement, et qui lui coute moins cher. Le test exigeait le premier comportement, que le reglage n'a jamais promis. Pire : il passait aussi bien avec le reglage eteint, donc il ne verifiait pas grand-chose. Il mesure desormais ce que le reglage garantit vraiment, le cout de l'enchainement - avec le bon signe et le bon poids, cote « oui » comme cote « non ». Le reglage lui-meme fonctionnait correctement et n'a pas ete modifie.
AméliorationUn second test, sur le reglage « Secteur de soins prefere », souffrait exactement du meme defaut sans avoir encore fait rougir la chaine de verification - il est corrige avant d'avoir nui. Stabilite prouvee et non supposee : les tests corriges tiennent sur 24 configurations de recherche differentes, la ou les anciens tombaient respectivement une fois sur cinq et une fois sur six dans les memes conditions.
v8.22.016/07/2026
NouveauNouveau reglage medecin « Max jours / semaine » sur chaque poste (page Equipe) : on peut limiter le nombre de jours par semaine qu'un medecin passe sur un secteur donne - par exemple deux jours d'urgences par semaine, pas plus. Laisser vide reste la norme (aucune limite). Le poste continue d'etre couvert tous les jours : c'est un collegue qui prend le relais les autres jours.
MoteurLe moteur espace aussi ces jours : il evite de placer le medecin deux jours de suite sur ce poste, plutot que de regrouper ses deux jours en debut de semaine. Le meme reglage active les deux comportements ; l'espacement peut etre desactive seul depuis Moteur en mettant son curseur a zero.
AméliorationLe plafond est une preference forte, pas une interdiction - un choix delibere. Si personne d'autre ne peut couvrir le poste un jour donne, le moteur prefere depasser le plafond plutot que de ne pas sortir de planning du tout. Pour interdire completement un poste a un medecin, le reglage « Postes autorises » reste la bonne reponse : lui est strict.
AméliorationLes deux poids de la regle « Plafond de jours par semaine sur un poste » sont reglables dans Moteur : un curseur pour chaque jour au-dela du plafond, un pour deux jours qui se suivent.
FixGarde-fou : un plafond pose sur un poste qui n'existe pas (faute de frappe) est refuse avec un message clair, au lieu d'etre ignore en silence - le medecin aurait continue d'etre affecte au-dela d'une limite que personne n'aurait pu voir. Un plafond de zero est refuse de la meme facon, en renvoyant vers « Postes autorises ».
MoteurTests : 19 tests automatises ajoutes (14 moteur, dont la verification que le plafond cede bien au lieu de bloquer le mois quand personne d'autre n'est disponible ; 5 web verifiant que le reglage atteint reellement le moteur). Non-regression Rochefort prouvee au niveau du modele du moteur (strictement identique sur trois mois de reference).
v8.21.016/07/2026
AméliorationDetection automatique des pannes : quand l'application plante chez un medecin, l'incident remonte desormais tout seul, avec le detail technique necessaire pour le corriger. Jusqu'ici, il fallait qu'un medecin pense a le signaler - un ecran blanc que personne ne mentionnait restait invisible, et donc jamais repare. Ce filet devient necessaire a mesure que d'autres services rejoignent l'application.
AméliorationAucune donnee medicale ne part avec les rapports de panne : ni nom de medecin, ni desiderata, ni arret maladie, ni contenu de formulaire. Seuls le message d'erreur technique et la page concernee sont transmis. Les rapports sont heberges en Allemagne (Union europeenne) et ne transitent pas par les Etats-Unis. Le nettoyage des donnees est verrouille par 8 tests automatises.
FixUne erreur survenant dans la structure meme d'une page (le cas le plus rare mais le plus brutal) affichait jusqu'ici un ecran d'erreur brut. Elle affiche desormais un message clair en francais avec un bouton pour recharger - et remonte a l'equipe technique comme les autres.
v8.20.016/07/2026
FixCorrection d'un risque de statut de mois errone sur le tableau de bord et la page planning. Dans un cas precis - une session ou le service n'etait pas identifie - la liste des mois pouvait etre renseignee avec les mois des AUTRES services. Un mois aurait alors pu s'afficher « valide » ou « en cours » parce qu'un autre service l'etait, sans le moindre signe d'alerte. Desormais, si le service n'est pas identifie, les mois s'affichent sans statut plutot qu'avec un statut faux : moins d'information, mais juste. Trouve en auditant les lenteurs, sans lien avec elles. 5 tests automatises verrouillent le cas.
v8.19.016/07/2026
MoteurNouveau reglage par service : le choix du poste de jour quand un medecin enchaine sa journee et la garde de la nuit qui suit. Enchainer les deux, c'est presque 24h de presence d'affilee - et tous les postes ne se valent pas pour ca. Un service peut desormais declarer les postes a eviter ce jour-la et ceux a privilegier. Premier cas reel : Libourne, qui demande d'eviter les urgences et de preferer la maternite. Ne concerne que la semaine : le week-end n'a pas de poste de jour.
FixCorrige pour Libourne : le moteur faisait jusqu'ici exactement l'inverse de ce que le service demande. Une regle historique de Rochefort - « le medecin de garde est plutot aux urgences », qui a du sens la-bas pour la continuite de suivi des patients - s'appliquait a tous les services, y compris a ceux dont le poste d'urgences porte le meme role. Libourne heritait donc d'un encouragement a placer aux urgences le medecin qui enchaine 24h, alors que son cahier des charges demande le contraire. Les deux regles sont desormais exclusives : chaque service porte l'une ou l'autre, jamais les deux.
AméliorationLes deux poids de la nouvelle regle sont reglables dans Moteur (poste a eviter un jour de garde, poste a privilegier). Un garde-fou refuse trois reglages qui auraient l'air actifs mais seraient sans effet en silence : un poste inexistant (faute de frappe), un meme poste declare a la fois a eviter et a privilegier (le moteur appliquerait un bonus et une penalite qui s'annulent), et un service qui declare la regle sans qu'elle lui soit ouverte.
MoteurTests : 9 tests moteur ajoutes, dont un test temoin qui reproduit l'ancien comportement et prouve que le probleme etait bien reel (sur un mois complet : les 20 jours de semaine basculaient aux urgences, ils vont desormais tous a la maternite). Non-regression Rochefort prouvee au niveau du modele du moteur (strictement identique) : Rochefort garde sa regle historique inchangee.
v8.18.016/07/2026
FixSecurite : mise a jour des briques logicielles tierces sur lesquelles l'app est construite. L'audit remontait 27 alertes, dont 2 critiques et 12 elevees ; il n'en reste que 4, toutes moderees, et plus aucune critique ni elevee. Aucun changement visible : meme affichage, memes fonctionnalites, planning identique.
FixDeux de ces briques sont reellement utilisees par le site en ligne. L'outil qui fabrique l'export PDF du planning corrigeait deux failles critiques (injection de contenu dans le document genere) - l'export a ete reteste de bout en bout : document conforme, titre, mise en page et decoupage multi-pages inchanges. Le socle web de l'app (Next.js, 16.1.6 vers 16.2.10) corrige une serie de failles de contournement des controles d'acces et de saturation du serveur.
AméliorationLes 4 alertes restantes ont ete verifiees une par une et laissees en place a dessein : deux portent sur un composant utilise uniquement au moment de fabriquer le site, jamais par le site en ligne ; deux portent sur du code que l'app n'atteint jamais (l'export Excel), et les corriger imposerait de revenir a une version anterieure de cet export, ce qui casserait la fonctionnalite pour un risque nul.
v8.17.016/07/2026
NouveauNouveau reglage medecin « Secteur de soins prefere » (page Equipe) : quand un service suit ses patients sur deux secteurs (par exemple pediatrie et neonatologie), chaque medecin peut indiquer celui qu'il prefere, ou repondre « Les deux, indifferent » - ce qui reste la reponse par defaut. Une preference n'est jamais une exclusion : le medecin reste affecte a l'autre secteur si le planning l'exige. Les autres postes du service ne sont pas concernes par ce choix.
NouveauNouveau reglage medecin « Garde du week-end apres une semaine de soins » : le medecin qui a suivi un secteur toute la semaine peut enchainer avec la garde de jour du week-end et garder ainsi ses patients. Trois reponses possibles, parce que certains y tiennent et d'autres n'en veulent surtout pas : « Oui, je prefere », « Non, j'evite », ou « Sans preference » (le defaut, modifiable a tout moment). A savoir : sur une semaine de soins complete, le plafond d'heures passe avant - l'enchainement ne joue donc en pratique que pour les temps partiels et les semaines de soins partielles.
NouveauNouveau reglage medecin « Consultation le jour d'une garde » : consulter dans la journee puis enchainer sur la garde du soir ne convient pas a tout le monde. Chacun indique s'il l'evite, s'il l'accepte si besoin, ou s'il n'y voit aucun inconvenient. Sans reponse, rien ne change : une consultation n'empeche pas la garde, exactement comme aujourd'hui.
AméliorationLes trois reglages n'apparaissent que sur les services concernes : ils sont invisibles pour un service qui ne declare pas de secteurs de soins. Rochefort ne les voit pas et n'est touche par aucun des trois.
AméliorationLes poids des trois nouvelles regles sont reglables dans Moteur des la livraison, avec un curseur par cas (preference de secteur, enchainement souhaite, enchainement refuse, consultation refusee, consultation acceptee si besoin) - plutot que figes dans le code.
FixTrois garde-fous ajoutes contre des reglages qui auraient l'air actifs mais seraient sans effet en silence : un secteur de soins mal orthographie, une preference pour un secteur qui n'en fait pas partie, ou une preference posee sur un service qui ne declare aucun secteur de soins sont desormais refuses avec un message clair, au lieu d'etre ignores.
MoteurTests : 33 tests automatises ajoutes (20 moteur, 13 web), dont la verification que chaque reglage atteint reellement le moteur - la classe de bug qui avait rendu muet le reglage des types de garde. Non-regression Rochefort prouvee au niveau du modele du moteur (strictement identique sur trois mois de reference).
v8.16.016/07/2026
AméliorationL'application est plus rapide a charger. La cause etait geographique : les serveurs qui font tourner l'app etaient a Washington alors que la base de donnees est en Irlande. Chaque information affichee faisait donc un aller-retour au-dessus de l'Atlantique. Les serveurs sont desormais dans le meme centre de donnees que la base. Mesure en production sur un meme appel, avant et apres : 158 millisecondes, puis 78 - deux fois plus rapide. Le reste (environ 40 millisecondes) est un cout fixe de verification du compte, qu'aucun changement d'hebergement n'enleve. Le gain se voit surtout sur les pages qui posent beaucoup de questions a la base l'une apres l'autre - le planning, le tableau de bord, le suivi - puisque chacune de ces questions economise le voyage. Remonte par Marion.
v8.15.016/07/2026
FixCorrection du recapitulatif par medecin, colonne « J. libres » (services autres que Rochefort : Libourne, urgences...) : chaque jour reellement travaille y etait compte comme un jour libre. Un medecin poste tous les jours du mois affichait donc autant de jours libres que de jours ouvres, et l'indicateur de cible de jours libres restait au vert quoi qu'il arrive - une donnee fausse, affichee sans le moindre signe d'alerte. Le calcul cherchait les trois postes de Rochefort par leur nom, ecrits en dur ; il lit desormais les vrais postes du service, quels qu'ils soient.
FixChiffres de Rochefort strictement inchanges : l'ancien et le nouveau calcul ont ete compares sur 20 000 mois-medecins tires au hasard, sans un seul jour d'ecart. Un jour de garde reste compte comme un jour libre, comme avant (la garde ne prend que la soiree). 6 tests automatises ajoutes.
v8.14.016/07/2026
NouveauNouveau reglage medecin « Passages / mois » sur un site optionnel (page Equipe) : on peut donner a un medecin une frequence personnelle de passages sur un site ou l'equipe ne va pas tous les jours - par exemple une fois par semaine (soit environ 4 par mois). Laisser vide reste la norme : le medecin est alors simplement affectable, sans frequence imposee. Le champ n'apparait que sur les services qui declarent un tel site.
MoteurLes passages restants (ceux qui ne sont pas couverts par les frequences personnelles) sont repartis entre les autres medecins au prorata de leur quotite. Volontairement asymetrique : en faire moins que sa part ne coute rien, seul le fait d'en faire plus est penalise. C'est donc un simple arbitrage de repartition, qui ne peut jamais pousser quelqu'un a travailler davantage pour atteindre une part.
AméliorationLes poids de la regle « Passages sur un site optionnel » deviennent reglables dans Moteur, avec 5 curseurs distincts (semaine sans aucun passage, passage manquant, deux passages consecutifs, ecart a la frequence d'un medecin, part au-dela de la quotite). Ils etaient jusqu'ici figes dans le code.
FixTrois garde-fous ajoutes contre des reglages qui auraient l'air actifs mais seraient sans effet en silence : une frequence posee sur un poste inexistant (faute de frappe) ou sur un poste obligatoire est desormais refusee avec un message clair ; un service qui declare un site optionnel sans que la regle lui soit ouverte est refuse au lieu de ne jamais couvrir le site ; et le calibrage face au plafond d'heures est verrouille par un test (un futur reglage trop fort ne pourra plus faire perdre le plafond en silence).
MoteurVerifie sur le planning reel de Libourne (novembre) : les quatre frequences nommees sont respectees a l'unite pres (1, 1, 2 et 4 passages), les passages restants repartis aux autres, aucun poste obligatoire sacrifie, aucun depassement d'heures. 12 tests automatises ajoutes. Non-regression Rochefort prouvee au niveau du modele du moteur (strictement identique).
FixAudit complet des sites optionnels : cinq endroits signalaient encore a tort une case vide comme une anomalie. (1) La case vide affichait « A pourvoir » et proposait « Marquer un remplacant » dans le detail d'un jour. (2) Le message « Planning incomplet — N postes non affectes » et (3) la confirmation « N postes non affectes. Enregistrer quand meme ? » se declenchaient a chaque enregistrement. (4) Le diagnostic de sous-effectif annoncait « les 3 postes obligatoires (maternite, hospitalisation, urgences) » — les postes de Rochefort, en dur, faux pour tout autre service : il lit desormais les vrais postes du service. (5) Une annotation de remplacant posee sur un site optionnel etait silencieusement supprimee a chaque regeneration.
FixCorrige surtout : en mode « Generer avec les postes manquants », le moteur penalisait lourdement chaque jour sans passage sur un site optionnel — ce qui le rendait de fait obligatoire et annulait en silence tout le principe du rythme hebdomadaire. Un test verrouille desormais chacune de ces six surfaces contre une reapparition.
v8.13.016/07/2026
NouveauNouveaux postes « optionnels » (epic #32) : un service peut declarer un poste que le planning n'est pas oblige de remplir tous les jours - typiquement un site satellite ou l'equipe se rend une a deux fois par semaine, pas quotidiennement. Premier cas reel : la maternite de Blaye pour Libourne. Le poste s'affiche comme les autres dans la grille, mais il cede la place aux postes obligatoires et au plafond d'heures quand la semaine est tendue : il ne degradera jamais le reste du service pour etre rempli.
AméliorationUn poste optionnel vide ne declenche plus l'alerte « postes vides » du jour (ce serait une fausse alerte : il a le droit d'etre vide). Ce qui compte pour lui, c'est le rythme de la semaine - un nouvel indicateur « Passages a couvrir » apparait donc en Vue admin : rouge si une semaine n'a aucun passage, ambre s'il n'y en a qu'un alors que deux sont souhaites. Les semaines a cheval sur deux mois demandent proportionnellement moins (une semaine avec un seul jour dans le mois ne peut pas accueillir deux passages).
MoteurLe moteur vise une a deux visites par semaine sur un poste optionnel, avec une priorite forte pour la premiere et un bonus opportuniste pour la seconde, et evite deux visites deux jours de suite. Reglage volontaire et verifie : le plafond de 48h par semaine l'emporte toujours - le moteur laisse plutot une semaine sans visite que de faire depasser un medecin. Teste sur le planning reel de Libourne (septembre) : deux passages chaque semaine, aucun poste obligatoire sacrifie, aucun depassement d'heures.
MoteurTests : 19 tests automatises ajoutes (9 moteur, dont le calibrage face au plafond d'heures et les semaines de bord de mois ; 10 web sur l'indicateur hebdomadaire). Non-regression Rochefort prouvee au niveau du modele du moteur (strictement identique avant / apres) et aucun changement d'affichage : sans poste optionnel, tout se comporte exactement comme avant.
v8.12.015/07/2026
FixCorrection (services a plusieurs types de garde, ex : Libourne) : la restriction de types de garde par medecin (ex : un medecin qui ne fait que les gardes de nuit, jamais les gardes de week-end de jour) est desormais reellement appliquee par le moteur. Le reglage existait cote reglages mais n'etait pas transmis au moteur - il restait donc sans effet. Verifie de bout en bout sur un vrai planning. Aucun changement pour Rochefort (un seul type de garde).
MoteurNouveau mode de comptage d'equite des gardes par service (epic #32) : certains services comptent samedi + dimanche + feries dans un seul panier d'equite (le vendredi reste separe), au lieu des trois paniers separes de Rochefort. Choisi par service. Rochefort garde ses trois paniers, verifie strictement inchange (modele du moteur identique).
FixCorrection du comptage d'equite annuelle sur les services qui reutilisent le type 'garde de nuit' pour une garde pleine : cette garde comptait a tort pour une demi-garde (0,5) au lieu d'une garde entiere dans les statistiques annuelles. Chaque service peut desormais definir le poids d'equite de ses types de garde. Sans effet sur Rochefort.
MoteurTests : 3 tests moteur (mode d'equite fusionne / separe) et 4 tests web (transmission de la restriction de garde au moteur, poids d'equite par service) ajoutes. Non-regression Rochefort prouvee au niveau du modele du moteur (strictement identique avant / apres).
v8.11.015/07/2026
AméliorationUnification technique de la garde coupee en deux (un medecin le jour, un autre la nuit, ex : week-end a Rochefort) : elle est desormais exprimee comme les gardes a plusieurs medecins des autres services (dernier volet de l'epic #32), au lieu d'un mecanisme special a part. Aucun changement visible : l'affichage jour/nuit, l'equite (une demi-garde compte 0,5), le repos de garde (declenche par la nuit seulement), le suivi des points et les echanges de demi-garde restent strictement identiques. Verifie par un test de non-regression dedie sur les cas limites (dont le cas rare ou le meme medecin tient les deux moities = garde complete).
FixCorrige au passage : lors d'une regeneration d'un mois contenant une garde coupee en deux, seul le medecin de jour est verrouille pour le moteur (le medecin de nuit n'est plus verrouille par erreur), ce qui evitait un risque de planning impossible a generer.
AméliorationLe calcul de l'equite annuelle des gardes lit desormais correctement la nouvelle forme d'une garde coupee (une demi-garde = 0,5, pas 1) meme apres re-enregistrement d'un mois - evite un double comptage silencieux a l'avenir.
v8.10.014/07/2026
MoteurL'activite externe (IME, cours a la fac, vacation...) devient un blocage garanti : le moteur ne planifie plus jamais de poste ni de garde un jour d'activite externe (avant, il l'evitait fortement mais pouvait passer outre en cas de necessite). Ces jours restent comptes comme du temps de travail, pas comme une absence. Concerne Rochefort (Simon en IME, Mairica). Le blocage s'applique quel que soit le mode de saisie - desiderata ou activite declaree apres coup.
NouveauNouveau type de desiderata 'Temps non clinique' (epic #32 phase 3) pour le temps administratif ou d'enseignement protege - typiquement un chef de service ou un medecin formateur. Le moteur ne pose ni poste ni garde ce jour-la, mais la journee compte comme travaillee (pas comme une absence) et alimente le plafond d'heures des services au forfait horaire. Couleur violette dans la palette desiderata.
NouveauNouveau reglage medecin 'Temps non clinique reserve (%)' (page Equipe, visible uniquement sur un service au forfait horaire) : le moteur reserve une part du temps hebdomadaire d'un medecin pour l'administratif, sans jour fixe. Exemple : 20% pour un chef de service a temps plein revient a plafonner son temps clinique a environ 38h/semaine, les 9h30 restantes etant protegees pour ses missions non cliniques. Reglable par medecin (0 par defaut = aucun effet). Sans effet sur Rochefort.
Moteur16 tests automatises supplementaires (blocage dur de l'activite externe et non-reduction du plafond clinique interne, nouveau type non clinique, reserve flexible au prorata de la quotite, absence de double-comptage quand un medecin cumule reserve et jour fixe, garde-fous de configuration). Non-regression Rochefort : le plafond de charge et les statistiques d'absence restent inchanges.
v8.9.014/07/2026
MoteurRegime 'temps medical continu' pour les services au forfait horaire (ex : Libourne, 48h/semaine, epic #32 phase 2). Le moteur vise desormais un plafond d'heures par semaine, calcule au prorata de la quotite de chaque medecin (48h pour un temps plein, environ 19h pour un 40%). Les heures comptees incluent les postes, les gardes et la formation. Aucun changement pour Rochefort, qui reste au decompte en demi-journees.
MoteurCe plafond est une regle souple : dans une semaine difficile (plusieurs absences cumulees), le moteur peut laisser un medecin depasser 48h plutot que de ne produire aucun planning, et le depassement est signale. Choix valide par une mesure sur le roster reel de Libourne - un plafond strict rendait tout un mois impossible a generer des qu'une semaine manquait de medecins.
AméliorationSur un service au forfait horaire, l'ancien plafond de charge en demi-journees (logique propre a Rochefort) est automatiquement desactive au profit du decompte en heures : les deux facons de compter sont incompatibles et ne s'appliquent jamais ensemble.
NouveauNouveau suivi 'Heures par semaine' pour les services au forfait horaire : chaque medecin voit ses heures cumulees par semaine (postes + gardes + formation) face a sa cible (48h x quotite), avec un signalement quand une semaine depasse. Vue admin 'equipe' correspondante : un tableau medecins x semaines ou les depassements ressortent en orange. Remplace le suivi en demi-journees, qui ne s'applique pas a ces services.
AméliorationLa restriction de types de garde par medecin (ex : ne fait que les nuits) apparait desormais sur la page Moteur comme les autres regles de profil, avec la liste des medecins concernes.
Moteur24 tests automatises supplementaires (plafond horaire au prorata de la quotite, comptage de la formation, non-blocage garanti, desactivation du decompte demi-journees, calcul des heures par semaine, non-regression Rochefort verifiee octet-a-octet).
v8.8.014/07/2026
MoteurGabarits de garde restreints a certains jours (epic #32, phase 1 - besoin reel Libourne : garde de nuit 18h-9h en semaine + garde de jour 8h30-18h30 le week-end, sur le meme poste 'garde'). Chaque gabarit peut desormais declarer les types de jour ou il s'applique (semaine / vendredi-veille-de-ferie / samedi / dimanche-et-ferie) ; les jours feries sont automatiquement traites comme un dimanche, meme en semaine. Aucun changement pour Rochefort (un seul gabarit, actif tous les jours comme avant).
NouveauNouveau reglage medecin 'Types de garde autorises' (page Equipe, uniquement visible pour un service ayant plusieurs gabarits de garde) : permet de restreindre un medecin a un sous-ensemble des gardes du service (ex : un medecin qui ne fait que les gardes de nuit). Regle stricte (H20) - le moteur n'affecte jamais ce medecin sur un gabarit hors liste. Non renseigne = toutes les gardes autorisees, comportement identique a avant.
FixCorrige pendant ce chantier : une regle interne (H1, un seul medecin par poste/jour) aurait pu planter sur un jour ou un gabarit de garde ne s'applique pas (ex : gabarit week-end un mardi). Trouve et corrige avant tout impact, avec un garde-fou similaire pose sur 6 autres regles souples qui partageaient le meme risque (aucune n'avait encore cause de bug reel - corrige par prevention).
AméliorationGarde-fou de configuration : impossible d'activer desormais un service ou un medecin fait des gardes mais n'a acces a aucun gabarit de garde reellement configure (message d'erreur explicite au chargement plutot qu'un medecin jamais planifie sans explication).
AméliorationLe delai de calcul du moteur (time_limit) est desormais configurable par service au lieu d'etre fixe a 30s pour tous - necessaire pour les services a plusieurs gabarits de garde ou le calcul est plus complexe (mesure empirique : jusqu'a 45s+ pour un optimum garanti avec 2 gabarits contre 30s avant). Rochefort inchange (30s).
Moteur18 tests automatises supplementaires sur cette phase (gabarits restreints par jour, eligibilite medecin/gabarit, garde-fous de configuration, non-regression Rochefort verifiee identique).
v8.7.006/07/2026
MoteurFondation technique pour les futurs services avec plusieurs medecins en parallele sur le meme poste (ex : garde de weekend avec 3 medecins sur des horaires differents). Chaque poste peut desormais avoir un catalogue d'horaires nommes ('gabarits'), au lieu d'un seul horaire fixe. Aucun changement visible pour Rochefort : un seul gabarit par poste, comportement identique a avant (verifie par une regeneration reelle avant/apres, diff strictement identique). Prepare le terrain pour Trousseau et Libourne (pas de config reelle deployee pour eux cette session).
AméliorationGrille planning et tiroir du jour : quand un poste a plusieurs medecins en parallele (nouveaute ci-dessus), les deux noms s'affichent desormais correctement (avant, seul le premier apparaissait) et chacun peut etre modifie independamment depuis le tiroir.
AméliorationNettoyage en profondeur des routes d'echange de garde (offre, reprise, echange) : plusieurs verifications internes relisaient les affectations d'une maniere qui aurait pu, a terme, faire echouer a tort une proposition d'echange. Corrige avant tout impact utilisateur, aucune regression constatee (428 tests automatises verifies).
MoteurCorrection interne dans le calcul du planning : plusieurs regles souples qui comparent un mois au mois precedent (continuite sur un poste, espacement des gardes, jours de recuperation...) n'etaient pas encore adaptees a la nouveaute des gabarits ci-dessus. Trouve et corrige avant toute mise en production (103 tests automatises solveur verifies).
v8.6.003/07/2026
AméliorationLes 45 regles du moteur (contraintes dures et souples) ont desormais chacune un scope : universelles ('all', 43 regles) ou specifiques a un service. Seules 2 regles sont concernees aujourd'hui (bonus 'combo collegues' et 'jour off conditionnel', toutes deux specifiques a Rochefort) : elles n'apparaissent plus dans la page Moteur des autres services, et le moteur de calcul ne peut plus les appliquer pour eux, meme en cas de reglage errone. Prepare le terrain pour les futurs services (Trousseau, Libourne) sans dupliquer la liste des regles.
AméliorationLa colonne technique qui stockait un double complet des regles par service est remplacee par un simple ecart par rapport a la liste commune — plus aucun risque d'oubli d'un correctif sur un service en particulier.
FixNettoyage de ~26 exemples et descriptions du moteur qui citaient des prenoms de medecins de Rochefort (Marion, Cecile, Laura...) alors que ces regles s'appliquent a tous les services — remplaces par des formulations generiques.
v8.5.003/07/2026
FixLe lien de planning public affichait toujours les postes de pediatrie Rochefort (Neonat Mater, Ped ADO HDJ, Urgences), meme pour un autre service. Corrige : chaque service affiche desormais ses propres postes sur son lien public.
AméliorationPreparation du moteur pour accueillir des services tres differents de la pediatrie (ex : services sans consultations) : les ecrans qui supposaient des consultations partout (planning, tableau de bord, reglages medecin, desiderata, exports) s'adaptent maintenant au profil reel du service.
MoteurCorrection d'un affichage de diagnostic (CLI uniquement, pas visible dans l'application) qui masquait un poste dans les statistiques de continuite.
v8.4.002/07/2026
NouveauAnnotation 'remplacant' sur les cases vides du planning. Quand un poste ou une garde reste non pourvu par un medecin PH (couvert en pratique par un remplacant externe), l'admin peut desormais ecrire son nom directement dans le tiroir du jour ('Marquer un remplacant'). Le nom s'affiche a la place de '-', sur la grille interne comme sur le lien public secretariat, pour que toute l'equipe sache qui travaille. Le remplacant ne devient jamais un medecin du systeme : aucun impact sur l'equite, les contraintes du moteur ou les statistiques d'equipe.
AméliorationUne case annotee sort automatiquement de l'alerte 'X postes vides' (bandeau admin, point ambre Vue admin, dashboard equipe) — le trou est explique, plus besoin de le traiter. La note disparait toute seule si un vrai medecin est ensuite affecte sur la case (edition manuelle ou regeneration).
FixLe badge 'A pourvoir' d'une case vide ne s'affichait que juste apres une regeneration partielle, jamais sur un trou deja present dans un planning genere ou valide — le cas reel le plus frequent. Corrige : le badge se base maintenant sur l'etat reel de la case (poste attendu ce jour-la et vide), pas seulement sur le resultat ephemere de la derniere regeneration.
v8.3.008/06/2026
NouveauTracking des QR codes des flyers imprimes. Nouvelle route /f/{code} qui enregistre chaque scan (date, appareil, IP hachee pour le RGPD) dans une table Supabase 'qr_scans', puis redirige vers la destination reelle (ex : /f/congres vers /demo/pediatrie). Permet de compter les scans d'un flyer de congres sans aucun analytics tiers, et surtout de changer la destination d'un QR deja imprime sans reimprimer. La redirection reste fonctionnelle meme si le log echoue (best-effort, try/catch). Route declaree publique dans le middleware (pas de gate auth). Migration 041_qr_scans.
v8.2.027/05/2026
AméliorationRefonte admin — phase 1 (D1) complete : la page Settings monolithique de 1021 lignes est decoupee en un hub Admin a 3 cartes (Equipe / Moteur / Acces) et trois sous-pages distinctes. Avant, Cecile y allait une fois, voyait l'effet 'bordel' (28 curseurs + 14 protections + 11 medecins x 7 sous-sections sur la meme page), et n'y revenait pas. Desormais, /admin ouvre un menu clair, chaque carte mene a sa propre page focalisee : Equipe (medecins + affinites), Moteur (presets + 28 contraintes + protections), Acces (liens personnels + planning public).
AméliorationHub vivant : chaque carte affiche un mini-resume contextuel — nombre de medecins actifs, preset actif detecte, nombre de reglages modifies depuis les defauts, nombre de liens personnels. Si une transition de medecin est programmee dans le futur (ex : LV passe a 50% le 1er mai), un badge ambre s'affiche sur la carte Equipe avec la date — directement actionnable depuis le hub. Si une lecture Supabase echoue, un bandeau de degraded mode s'affiche et les compteurs s'adaptent.
AméliorationDetection des incoherences cross-page : le ConflictBanner (qui signale par exemple 'pas assez de medecins primary pour les postes obligatoires') vit desormais sur le hub uniquement. Il lit l'etat sauvegarde des 2 slices et detecte les conflits qui traversent equipe et moteur. Avant, le banner etait noye en haut de la page Settings monolithique.
AméliorationSave par page : modifier un medecin sauvegarde uniquement la ligne 'doctor_profiles' Supabase, modifier un poids sauvegarde uniquement 'soft_constraint_weights' et 'hard_constraint_toggles'. Plus de risque d'ecrasement croise. Si Cecile quitte une page avec des modifs non sauvegardees (clic sur un autre onglet, refresh, fermeture), un modal de confirmation s'affiche : 'Modifications non sauvegardees. Quitter sans enregistrer ?'
AméliorationArchitecture interne : reducer splitte en equipe-state + moteur-state alignes sur les 4 rows Supabase 'solver_config' (doctor_profiles, combo_groups, soft_constraint_weights, hard_constraint_toggles). Hooks dedies useEquipeViewState et useMoteurViewState (au lieu d'un hook monolithique de 460 lignes). Tous les fichiers < 300 lignes (mandate CLAUDE.md respecte). 12 nouveaux tests vitest (equipe-merge, moteur-merge, admin-hub-summary, admin-redirects, admin-flow-integration) en plus des 13 tests de regression sur la facade settings-merge maintenue pour les API routes solve et suggest-fixes.
AméliorationBackward compat complete : /settings et tous les vieux liens ?section=X (medecins, affinites, presets, repartition_gardes, rythme_travail, organisation_postes, protections, liens_perso, liens_planning) redirigent automatiquement vers la bonne sous-page admin. Lien 'Admin' dans la nav (desktop + bottom tab bar mobile) pointe desormais sur /admin. Logique de mapping extraite en module pur testable (admin-redirects.ts).
AméliorationPhase 2 (D2) a venir : audit du vocabulaire des contraintes du moteur (les ~10 termes opaques type 'Continuite poste→garde' ou 'Renfort sous-effectif' a re-ecrire avec Marion), badge d'impact 'Eleve / Modere / Fin' sur chaque carte de contrainte, et tiers de visibilite (5 contraintes 'toujours visibles' / 10 'depliables' / 10 'avancees cachees par defaut') pour reduire la charge cognitive.
v8.1.226/05/2026
FixPages /a-propos et /auteur/clement-tardy : correction de la duree d'experience hospitaliere de la conjointe (10 ans dans le milieu hospitalier au lieu de 15 ans). Metadata, OpenGraph, JSON-LD et corps de texte alignes.
FixPage /a-propos lettre fondateur : ajout de l'apposition 'medecin' pour lever l'ambiguite (avant : 'Ma conjointe evolue dans le milieu hospitalier' — pouvait laisser croire a un poste de cadre ou administratif).
v8.1.126/05/2026
AméliorationBandeau d'impact tiroir — diff baseline. Le bandeau ne compte plus que les contraintes dures introduites par l'edition courante, calculees par difference exacte entre la baseline (originalDays) et le planning edite. Avant, le filtre par cellule editee matchait trop large pour les contraintes day-scoped (repos de garde, double affectation, desiderata) — n'importe quelle edition sur le meme jour faisait surgir des violations preexistantes sans rapport. Le validateur retourne maintenant aussi baselineHardViolations dans ValidationResult, et la cle de comparaison combine constraintId + jour + medecin + poste + description.
AméliorationGarde-fou defense-in-depth sur handleEnterEdit (planning-view) : premiere ligne if (!isAdminView(isAdmin, activeTab)) return;. La chaine de rendu n'exposait deja le declenchement edition qu'en contexte admin, mais un appelant orphelin (devtools, hot-reload, futur refactor) ne peut plus glisser. Canary structurel admin-gating-day-sheet.test.ts couvre 5 invariants : Changer gate par editable, editable={isAdmin}, footer gate par isAdmin && hasEdits, ServiceActivitiesSection gate par isAdmin, handleEnterEdit guard precoce.
v8.1.026/05/2026
AméliorationTiroir de jour vivant : changer un medecin met a jour le nom affiche dans le tiroir instantanement. Avant, le tiroir gardait un instantane fige des affectations au moment de l'ouverture — apres un changement, le bandeau continuait a afficher 'Agnes' meme si on l'avait remplacee par 'Margaux'. Le tiroir derive maintenant le jour affiche depuis l'etat courant des journees via la date selectionnee, ce qui evite la divergence.
AméliorationBandeau d'impact contextuel : il n'affiche plus que les regles a corriger liees aux cellules que l'admin est en train de modifier, plus toutes les regles preexistantes du mois. Le compteur souple devient detaille — on voit la liste des preferences degradees avec le delta (+poids), le label et le detail (ex. '+30 · Equilibre gardes samedi degrade — MS 2 vs LB 0'). Avant, le bandeau affichait toutes les contraintes du mois (bruit) avec un simple compteur opaque pour les souples.
AméliorationFooter du tiroir admin reorganise en deux lignes : ligne 1 = compteur 'X modif(s)' + boutons texte 'Annuler' et 'Tout annuler' (avec icones), ligne 2 = bouton 'Enregistrer le brouillon' pleine largeur. Avant, les boutons Annuler n'avaient qu'une icone (peu clair) et le footer empietait sur la barre gestuelle iOS sur mobile. La distance de securite respecte maintenant env(safe-area-inset-bottom).
AméliorationMode edition auto-declenche au premier clic 'Changer' : plus besoin de cliquer le bouton 'Modifier' separement. L'ancien bouton 'Modifier' + le bandeau 'Mode edition actif' + l'EditToolbar sticky en haut de page sont supprimes — l'edition vit entierement dans le tiroir d'un jour. Le bouton 'Regenerer le planning' devient toujours visible (avant cache quand le planning etait valide) avec une boite de dialogue de confirmation explicite si le planning est valide.
FixErreur runtime corrigee quand l'admin positionnait un medecin libre sur une activite via le selecteur : 'Cannot set properties of null (setting value)'. React annule la reference au selecteur apres le retour du handler — avec un await onAssign au milieu, le reset de la selection plantait. La reference est maintenant capturee de maniere synchrone et verifiee (isConnected) avant le reset, puisque le selecteur peut aussi etre demonte si le medecin a quitte la liste 'Pas positionnes'.
AméliorationVocabulaire de l'app : le mot 'violee' est banni de l'interface utilisateur. Les contraintes ne sont plus 'violees' mais 'a corriger' ou 'non respectees'. Le ton de l'app reste aidant, pas accusatoire.
AméliorationNettoyage : fichier impact-panel.tsx supprime (orphelin apres la refonte 8.0.0). Le bandeau d'impact vit desormais uniquement dans le tiroir de jour.
v8.0.023/05/2026
NouveauVue planning unifiee mobile/desktop. Avant, la grille desktop ouvrait quatre popovers differents au clic sur une cellule (un pour editer l'affectation admin, un pour voir 'pourquoi ce medecin', un pour gerer les consultations, un pour les absences) et le mobile ouvrait un panneau par le bas avec d'autres options encore. Resultat : un medecin qui passait de son telephone a son ordi voyait des interfaces et des options completement differentes pour la meme feature. Desormais, click ou tap n'importe ou sur la ligne d'un jour ouvre le MEME panneau, organise par sections : Postes, Modifier (admin), Pourquoi ce medecin, Activites, Activites du service (admin), Absents, Actions (echanger / reprendre / declarer une activite). Sur mobile le panneau s'ouvre par le bas (overlay classique), sur desktop il s'ouvre par la droite (largeur 420px) et reste ouvert pendant que la grille reste interactive a gauche — l'administrateur peut cliquer d'un jour a l'autre pour les auditer sans fermer le panneau a chaque fois (la ligne active est marquee par un trait teal a gauche).
NouveauCinq nouveaux types d'activite disponibles sur mobile : CA, RTT, Arret, Activite externe, Conge sans solde. Avant, ces cinq types n'etaient declarables que via le wizard 'Remplir mon mois' ou la page Desiderata — le mobile etait limite a six types (Consultation, Bureau, Ado, Diabete, Off, Formation), donc un medecin qui voulait ajouter rapidement un CA depuis son telephone devait passer par un autre ecran. Les options sont alignees sur celles du desktop, gatees comme avant sur le suivi P (un medecin sans suivi P n'a pas acces a CA/RTT/Arret/Externe/CSS).
NouveauL'administrateur peut desormais editer le planning depuis son telephone : changer une affectation, scinder une garde, valider/refuser une consultation pending avec une raison de refus optionnelle, positionner un medecin libre sur une consultation ou un autre type d'activite. Avant, toutes ces actions necessitaient d'ouvrir l'ordinateur (le bouton 'Vue tableau' mobile etait un patch qui forcait la grille desktop en scroll horizontal, peu utilisable). Le panneau jour expose toutes ces actions admin via une section 'Modifier' qui s'ouvre automatiquement quand le mode edition est actif (sinon repliee). Le bouton 'Vue tableau' mobile a ete supprime puisque le panneau couvre tout.
AméliorationVisibilite des indicateurs : sur n'importe quel jour, le panneau affiche maintenant clairement l'icone verrou pour les affectations verrouillees par l'admin, un badge ambre 'A pourvoir' pour les postes sans medecin sur un planning partiel, un anneau teal pour les modifications en cours dans le brouillon, et la section 'Pourquoi ce medecin' qui resume les raisons de la generation (peut etre depliee a la demande). Avant, ces signaux n'apparaissaient que cote desktop dans les popovers.
AméliorationRefonte technique : suppression de 5 fichiers popover desktop (~1400 lignes) et de 4 fichiers planning-v3 mort, remplaces par un seul composant DaySheet decoupe en 7 fichiers de moins de 300 lignes chacun (orchestrateur + 6 sections). Hook useIsDesktop SSR-safe via useSyncExternalStore, modal asymetrique (modal=true mobile, modal=false desktop pour le pattern side rail). Pattern button-in-cell pour l'accessibilite — la cellule jour-label devient un bouton focusable, les badges medecins deviennent du pur affichage, le click sur la ligne entiere ouvre le panneau. 4 tests canary structurels verrouillent l'invariant : aucun popover ne peut etre reintroduit, les 5 types d'activite restent presents, mobileForceTable reste banni, le dossier day-sheet/ conserve sa structure (363 vitest au vert).
v7.9.022/05/2026
NouveauLa page Desiderata d'un mois est desormais organisee en deux onglets pour les administrateurs (Marion, Cecile) : 'Mes desiderata' et 'Vue admin'. 'Mes desiderata' est la declaration personnelle — le medecin peint son calendrier et le transmet — sans aucun outil de supervision. 'Vue admin' regroupe le pilotage de la campagne (suivi des soumissions, geler / degeler la collecte) et la consultation des desiderata de toute l'equipe. Un medecin non-admin ne voit aucun onglet : sa page reste la declaration propre, comme avant. Le gate est etanche cote serveur — un non-admin qui force l'URL ?vue=admin retombe sur 'Mes desiderata' et ne charge jamais les desiderata nommes des autres.
Nouveau'Vue admin' est organise en deux sections. 'Vue d'ensemble du mois' : une grille globale medecins x jours qui montre d'un coup tous les desiderata declares — avant, l'administrateur ne pouvait les consulter que medecin par medecin, impossible de voir 'le 14 juillet, 6 medecins indisponibles' sans tout parcourir. Une ligne 'Total indisponibles' en bas du tableau additionne les absences de chaque jour et passe en rouge sur les jours charges : les jours difficiles a couvrir sautent aux yeux avant de lancer une generation. Une legende decode les icones, la colonne des noms et l'en-tete des jours restent visibles au defilement horizontal. 'Desiderata par medecin' : la liste des medecins a droite, selection en un clic, le calendrier du medecin choisi a gauche, editable par l'admin avec les verrous.
NouveauUn point vert apparait sur l'onglet 'Vue admin' quand tous les medecins ont transmis leurs desiderata et qu'aucun planning n'est encore genere : le signal 'collecte complete, prete a generer'. L'administrateur garde ainsi sa vue 'Mes desiderata' propre sans perdre de vue l'avancement de la collecte.
AméliorationRefonte technique : la page Desiderata (1230 lignes) decoupee en composants de moins de 300 lignes — feuille de calendrier partagee par les deux onglets, sous-arbres perso et admin, grille, barre d'onglets, hook de logique. Un echec de chargement de la grille affiche desormais un etat 'Donnees indisponibles' avec bouton reessayer au lieu d'un ecran en erreur, et un echec de chargement du calendrier d'un medecin affiche une erreur explicite au lieu d'un calendrier vide trompeur. 30 nouveaux tests vitest (359 au vert) : construction de la grille, detection des jours charges, derivation des couleurs d'outils, et canaries du gate (?vue, ?month preserve, le sous-arbre perso n'importe aucune donnee admin).
v7.8.022/05/2026
NouveauLa page Planning est desormais organisee en deux onglets pour les administrateurs (Marion, Cecile) : 'Mon planning' et 'Vue admin'. 'Mon planning' est exactement la page d'un medecin — la grille du service, ses propres postes, ses echanges — sans aucun outil de supervision. 'Vue admin' regroupe au meme endroit tout ce qui releve du pilotage : l'audit de generation (genere par... + accuses de lecture), les conflits et postes vides, la validation, le mode edition, les scenarios, la regeneration, les diagnostics. Avant, ces outils admin etaient eparpilles dans le defilement de la page, melanges a ce que voit aussi le medecin — l'admin devait trier mentalement entre sa vue perso et ses outils. Un medecin non-admin ne voit aucun onglet : sa page reste strictement la vue propre, comme avant.
NouveauUn point d'alerte ambre apparait sur l'onglet 'Vue admin' des qu'il y a quelque chose a traiter — un conflit, un poste vide, une consultation en attente. L'administrateur garde ainsi sa vue 'Mon planning' propre sans perdre de vue ce qui l'attend cote supervision. Le simple statut 'brouillon' ne declenche pas le point, sinon il serait allume en permanence sur tout planning fraichement genere.
AméliorationLe mode edition survit au changement d'onglet. Un administrateur qui modifie le planning dans 'Vue admin', bascule sur 'Mon planning' pour verifier quelque chose, puis revient, retrouve ses modifications non sauvegardees intactes. L'onglet actif est porte par l'URL (?vue=admin) : forcer cette URL en tant que non-admin renvoie automatiquement sur 'Mon planning'.
AméliorationRefonte technique : le composant de la page Planning (978 lignes) decoupe en 7 fichiers de moins de 300 lignes chacun, sans changement de comportement. Le parametre isAdmin vient desormais d'une source unique (l'en-tete serveur), coherente avec le gate des onglets. 11 nouveaux tests vitest (325 au vert) : logique pure isGridEditable, gate resolveActiveTab cote Planning, et 3 tests structurels canary qui verrouillent l'invariant de survie de l'edition (pas de loading.tsx sur la route, le panneau admin n'appelle aucun hook de cycle de vie, les onglets preservent le parametre ?month).
v7.7.021/05/2026
FixSecurite : les headers d'identite du middleware ne sont plus usurpables. Le middleware recopiait les headers de la requete entrante puis posait x-doctor-id / x-is-admin / x-service-id de maniere conditionnelle, sans jamais supprimer d'eventuelles copies fournies par le client. Un utilisateur non-admin pouvait donc envoyer lui-meme un header x-is-admin: 1 et acceder aux ecrans admin, usurper un autre medecin via x-doctor-id, ou changer de service via x-service-id. Le middleware supprime desormais systematiquement ces 4 headers de confiance avant de poser les siens. Corrige les 6 surfaces concernees (Mon suivi, Settings, Dashboard, Planning, Desiderata, layout). Faille pre-existante reperee lors de la revue de la Vue admin.
NouveauNouvel onglet 'Vue admin' dans Mon suivi, reserve aux administrateurs (Marion, Cecile). Pendant nomme de la vue medecin anonyme : la ou chaque medecin voit ses propres gardes comparees a une mediane sans noms, l'admin voit un tableau nomme par medecin pour arbitrer concretement les desequilibres (ex. un medecin a 11 dimanches+feries sur l'annee quand la mediane est a 4). Deux tableaux empiles, structure miroir de la page medecin : 'Temps de travail' et 'Gardes'. Un medecin non-admin ne voit jamais cet onglet ni aucune donnee nommee d'autrui : le gate est etanche cote serveur, la donnee equipe n'est ni chargee ni envoyee a un non-admin.
NouveauTableau 'Temps de travail' avec selecteur de granularite Mois / Quadrimestre / Annee, plus un sous-selecteur en pills pour choisir quel mois ou quel quadrimestre afficher. La fenetre 'Annee' va du debut d'annee au DERNIER MOIS VALIDE (pas l'annee civile entiere) : realise et attendu sont ainsi compares sur la meme periode ecoulee, sans fausser l'ecart avec des mois futurs non generes. La plage de dates exacte du calcul est affichee a chaque selection. Un repere ambre 'j non declares' signale une saisie incomplete : un ecart negatif peut alors venir de donnees manquantes plutot que d'un vrai retard. Les medecins partages sur plusieurs hopitaux portent un badge 'Ext.' et n'affichent qu'un realise (pas de budget attendu sur ce service). Tableau compact, lisible sur mobile sans scroll horizontal.
NouveauTableau 'Gardes' triable par colonne (semaine / vendredis / samedis / dimanches+feries / total), tri par defaut sur le total : le medecin le plus charge en tete. Le sous-titre indique la periode reellement couverte (ex. janvier -> aout 2026). Une valeur nettement au-dessus de la mediane equipe est marquee d'un repere visuel. Les medecins ne participant pas au cycle de gardes (oncall_volume non defini) sont grises et places en bas, exclus de la mediane, mais leurs vraies gardes restent affichees (ils peuvent en avoir fait quelques-unes). Couleurs de categorie identiques a la vue medecin, pas de score pondere. Version mobile compacte : en-tetes abreges pour faire tenir les 6 colonnes sans scroll horizontal.
AméliorationPalette de couleurs des categories de garde extraite dans un module partage (guard-classification.ts), importee par la carte medecin et le tableau admin : une seule source pour les couleurs brand vendredi / samedi / dimanche+ferie. 35 nouveaux tests vitest (306 au vert) sur la logique pure : resolution des fenetres P (annee bornee au dernier mois valide, quadrimestre, mois), plage de dates, somme des jours non declares, tri et detection d'ecart, et regression critique du gate admin (un non-admin qui force l'URL ?vue=admin retombe sur sa propre vue).
v7.6.121/05/2026
FixUn medecin peut desormais reprendre ou echanger une garde (ou un poste) un jour de la semaine ou il n'est habituellement pas disponible. Avant, les jours de disponibilite declares (ex. Laura n'est de garde que le lundi) bloquaient totalement toute reprise ou tout echange sur un autre jour : impossible de proposer a Laura une garde le vendredi, et impossible pour elle de se proposer pour la reprendre. Or ces jours de disponibilite ne servent qu'a la generation automatique du planning : un echange entre medecins se fait avec l'accord des deux parties, il ne doit pas etre bloque. Desormais, dans tous les flux d'echange (offre de reprise, reprise directe, demande au service, echange croise), un jour hors des disponibilites habituelles affiche une simple alerte orange informative au lieu d'un blocage : la proposition reste possible. Le cas signale (Laura qui reprend la garde de Marion du vendredi 5 juin) fonctionne maintenant.
Amélioration8 nouveaux tests vitest verrouillant la regle : la disponibilite par jour de semaine devient une alerte souple dans les echanges (gardes et postes, reprise comme echange croise), sans jamais masquer un vrai conflit bloquant (absence, repos de garde, ne fait pas de gardes). La grille admin garde le blocage dur, car c'est le contexte de generation automatique.
v7.6.021/05/2026
FixJour de garde de nuit visible dans 'Remplir mon mois' et sur mobile. Avant, des qu'un medecin etait de garde un jour, ce jour disparaissait entierement du wizard 'Remplir mon mois' et le bouton 'Declarer une activite' etait masque sur mobile, comme si la garde occupait toute la journee. Or la garde de nuit ne prend que la soiree : le matin et l'apres-midi restent libres (un medecin de garde peut tout a fait etre en consultation la journee). Le wizard et la fiche jour mobile affichent desormais ces jours, avec leurs creneaux matin et apres-midi remplissables. Seuls le repos du lendemain de garde et la garde de jour d'une garde fractionnee bloquent encore la journee.
NouveauUn medecin peut desormais retirer ses propres consultations meme une fois validees, sans passer par l'administrateur. Avant, le comportement etait incoherent : bloque dans la grille desktop et la vue 'Mon planning', mais possible sans friction via 'Remplir mon mois' et la modale mobile. C'est desormais autorise partout, avec un rappel systematique avant le retrait : verifier qu'aucun patient n'a ete positionne sur le creneau, et prevenir le secretariat. Aucune notification automatique n'est envoyee (decision validee avec la cheffe de service) : le medecin previent le secretariat lui-meme.
Amélioration5 nouveaux tests vitest sur isPostedDaytime (poste de jour, garde de nuit, garde fractionnee jour et nuit, aucune affectation).
v7.5.020/05/2026
NouveauRefonte de la page Mon suivi pour donner une place premium au suivi des gardes, sans casser le suivi du temps. Le haut de page presente deux cartes cote a cote : 'Mon activite' (bilan temps de travail + bilan gardes sur la periode validee) et 'Soldes annuels' (CA / RTT / FO). Tout est cale sur la meme fenetre temporelle (mois valides ou en brouillon, ex. janvier -> aout 2026), pour ne plus melanger 'mois courant' et 'annuel' dans la tete du medecin.
NouveauNouvelle section 'Mes gardes' en bas de page avec chart annuel complet : 12 mois empiles par categorie (semaine / vendredi / samedi / dimanche+ferie), palette 4 couleurs brand distinctes (gris, ambre Warning #D4930D, Bois de Rose #C2707F, rouge Error #C93545), repartition mensuelle, et comparaison anonyme a la mediane de l'equipe (total + detail par categorie). Repond a la question 'est-ce que je suis lesee sur le long terme' sans nommer personne.
NouveauDistinction visuelle des trois zones temporelles partout (gardes ET P) : mois valides en plein, mois en brouillon avec hachures legeres en surimpression, mois futurs non generes avec hachures grises sur colonne vide. Coherence visuelle entre la carte 'Mois par mois' (P) et 'Mes gardes' (chart annuel). Permet d'etre honnete sur l'incertain : le medecin voit immediatement ce qui est confirme et ce qui est encore un projet revisable.
AméliorationCarte 'Mois par mois' (P) passe de 6 a 12 mois fixes (annee civile complete), suppression du toggle 'Tous / 6 derniers'. Coherent avec le chart annuel des gardes en bas.
AméliorationWizard 'Remplir mon mois' deplace dans la carte 'Mois par mois' : il apparait inline a la selection d'un mois valide via un bouton 'Remplir ce mois' dans le detail deroulant. Plus de bouton flottant orphelin au-dessus de la carte. Le wizard est contextualise au mois selectionne.
AméliorationMediane equipe calculee uniquement sur les medecins qui participent aux gardes (`oncall_volume` defini, exclut MM Moulay et ES Emilie au CH Rochefort). Pas de medianes 'normal vs reduced' separees : une seule comparaison de reference, claire. Si moins de 3 medecins participants : 'Comparaison equipe indisponible'. Si le medecin lui-meme ne participe pas aux gardes : message adapte, pas de comparaison.
AméliorationRenommages : 'Solde annuel' -> 'Soldes annuels' (pluriel) ; 'Conges' -> 'Conges' (avec accent). Lien d'ancre dans 'Mon activite' qui scrolle vers le detail mois par mois en bas.
AméliorationAucune nouvelle dependance ajoutee : tout le rendu visuel reutilise le pattern HTML/CSS pur deja en place pour les barres P mensuelles (pas de Recharts, pas de chart library externe). Bundle inchange.
Amélioration16 nouveaux tests vitest (266 au vert) verrouillant la classification des jours feries (regression critique : un samedi ferie compte comme dimanche+ferie en double-paie, pas comme samedi standard ; pareil pour vendredi ferie et jeudi ferie) et le calcul de la mediane d'equipe (cas a 10, 9, 2 medecins, totaux nuls).
v7.4.219/05/2026
FixUne seule comptabilite des P partout. Avant, la page Planning calculait les P sur le mois calendaire (1 au 31) et la page Mon suivi sur la periode administrative (du 1er lundi au dimanche avant le 1er lundi suivant) : deux chiffres differents pour le meme mois, et la version calendaire introduisait un arrondi (ex. aout : 25 au lieu de 30 pour un 60%). Desormais la page Planning affiche exactement le meme calcul que Mon suivi (periode administrative), pour le medecin connecte comme pour le tableau de tous les medecins. La grille reste calendaire pour editer le planning ; seul le compteur P bascule sur la periode administrative. Plus aucun arrondi, plus de double comptabilite, chiffres conformes a l'administration.
NouveauEncart explicatif quand la periode P est a cheval sur deux mois calendaires (ex. periode d'aout = 3 aout au 6 septembre). Tant que le planning du mois suivant n'est pas valide, le realise affiche est forcement incomplet : un bandeau bleu l'explique clairement (l'objectif, lui, reste definitif) au lieu de laisser croire a un retard. Affiche a l'identique sur Planning et sur Mon suivi.
Amélioration4 tests vitest verrouillant la detection 'periode a cheval' (aout -> septembre, fevrier -> mars, mai ne deborde pas, decembre -> janvier de l'annee suivante). 250 tests au vert.
v7.4.119/05/2026
FixSuivi du temps de travail : le budget P attendu d'un mois dont la periode administrative deborde sur le mois suivant n'est plus sous-estime quand le planning du mois suivant n'est pas encore genere. Exemple : la periode admin d'aout 2026 va du lundi 3 aout au dimanche 6 septembre (25 jours ouvres, dont 4 en septembre). Tant que septembre n'etait pas genere, le budget ne comptait que 21 jours (Laura 50% voyait 21P au lieu de 25P, Cecile 60% voyait 25P au lieu de 30P). Le budget attendu est desormais calcule sur les bornes administratives completes, independamment de l'existence du planning, et ne bougera plus quand le mois suivant sera genere. Corrige d'un seul coup la carte budget mensuel, les barres mois par mois, le hero de progression, le tableau de bord et la carte quadrimestre. Le realise reste calcule sur les jours reellement saisis (un mois futur non genere = 0P realise, normal).
Amélioration8 nouveaux tests vitest verrouillant le calcul du budget sur la fenetre admin complete (aout 2026 debordant sur septembre) + non-regression start_date (arrivee en cours de periode), conge sans solde, et ferie en semaine (regle PR #26).
AméliorationAudit de robustesse du calcul des P attendus (suite retour Laura) : 7 tests vitest figent 3 garanties. (1) Preuve sur 120 cas que sur la periode administrative le budget egale exactement le modele 'P par semaine x semaines - 2 par ferie' : aucun arrondi parasite cote Mon suivi. (2) La deduction d'un jour ferie vaut toujours 2P pleins, identique quelle que soit la quotite, et un ferie tombant un week-end ne retire rien. (3) Le garde-fou empechant un budget negatif ne se declenche jamais pour les quotites reelles du service (30 a 100%). Aucun bug trouve : comportement deja correct, desormais verrouille contre toute regression.
v7.4.015/05/2026
FixBudget P attendu pour les temps partiels : aligne sur la regle administrative officielle CH Rochefort. Avant, les jours feries en semaine etaient deduits au prorata du temps partiel (0.6 × ferie pour un 60%), ce qui surestimait le budget. Desormais, les feries sont deduits pleins (2P par ferie) independamment de la quotite, conformement aux OS quadrimestriels valides sur Q1 et Q2 2025. Exemples : Cecile (60%) juillet 2026 = 22P (au lieu de 23P), Q2 2025 = 92P (au lieu de 96P) ; Laura Berdah (50%) Q2 2025 = 75P (au lieu de 80P). Le 100% n'est pas impacte. Cartes budget mensuel, barres mois par mois, hero progression, dashboard suivi, carte quadrimestre et wizard 'Remplir mon mois' refletent automatiquement le bon budget.
MoteurContrainte H10 (work_rate cap) suit la meme regle admin : un ferie en semaine deduit 1 jour plein du cap d'activite mensuel, sans prorata par quotite. Exemple Cecile en juillet (1 ferie 14/7) : cap = round(0.6 × 23) - 1 = 13 days ; en mai (4 feries) : cap = round(0.4 × 21) - 4 = 4 days. Avant fix : 7 days pour le 40% en mai (3 days de trop). 2 nouveaux tests pytest validant la formule sur juillet+mai 2026.
Amélioration16 nouveaux tests vitest validant la formule admin sur Q1+Q2 2025 : 100% Q1=166P, Cecile 60% Q1=98P / Q2=92P, Berdah 50% Q1=81P / Q2=75P. Couvre computeMonthlyBudget, computeBudgetFromDates, computeAnnualBudget. Edge cases : ferie sur seul jour ouvre = budget 0 (max clamp).
v7.3.023/04/2026
NouveauConge sans solde (L6152-4 CSP) : nouveau type d'absence pour remplacement externe ou journees hors obligation de service. Disponible dans le popover d'activites, le wizard 'Remplir mon mois' et la page desiderata (bouton CSS slate). Ces jours ne sont PAS payes (0P realise) et reduisent le budget P attendu du mois (Margaux une semaine en CSS = budget reduit de 10P, elle ne doit pas rattraper ces jours). Cote solver : nouvelle contrainte dure CONGE_SANS_SOLDE bloque toute affectation sur ces jours (equivalent d'un UNAVAILABLE + reduction H10). Saisie via desiderata si declare avant generation, via activite sinon.
MoteurDesideratumType CONGE_SANS_SOLDE ajoute : H10 (work_rate cap) reduit le budget, H11 (desiderata unavailable) bloque toute affectation, H19 (specialist) exclut la date. Les activites CSS saisies via wizard sont projetees en desiderata CSS cote route /api/solve pour garantir la coherence solver.
AméliorationcomputeMonthlyBudget / computeBudgetFromDates / computeAnnualBudget acceptent desormais un parametre excludedDates pour exclure des jours du decompte budget. computeAnnualBudget ne deduit PAS de CA/RTT supplementaire pour les jours CSS (regle legale PH : CSS est une derogation a l'obligation de service, pas une perte de droits acquis).
v7.2.423/04/2026
FixConges, RTT, RTA et arrets poses sur des weekends, jours feries ou jours off contractuels (ex: mercredi pour Cecile) ne sont plus decomptes du solde annuel ni du budget P mensuel. Cas Cecile juillet 2026 : 34P → 26P correct, solde CA 22j → 14j correct. La saisie en plage continue (ex: 18 juillet → 9 aout) reste disponible et simple, les demi-journees hors jour travaille sont simplement ignorees au calcul. Formation et activite externe continuent de compter quel que soit le jour (temps de travail reel). Correction automatique pour 6 medecins deja impactes : AL, SB, AT, MM, MNA, HM.
v7.2.323/04/2026
FixSuivi du temps de travail : la date d'arrivee d'un medecin (reglages) ajuste desormais le budget P attendu, le solde annuel CA/RTT, le compteur de demi-journees libres et le bandeau de completude. Avant, un medecin arrive le 9 fevrier se voyait reclamer 42P pour janvier, 25 CA complets pour l'annee, et Fev 2-6 apparaissaient comme des demi-journees libres alors qu'il n'etait pas arrive. Le quadrimestre, le solde annuel (prorata legal), les listes de jours libres et les alertes de completude respectent tous la date d'arrivee.
AméliorationPlanning > Suivi du temps de travail : le bloc personnel affiche desormais 'arrivee le X' a cote du nom du mois quand le medecin est arrive en cours de mois, pour que le budget reduit soit immediatement comprehensible.
AméliorationSuivi P : helper fmtP (formatage des demi-journees) centralise dans p-tracking-helpers, elimine 7 duplications. Composant PAnnualCard non utilise supprime.
v7.2.222/04/2026
NouveauMessage optionnel dans les demandes d'echange : en proposant une reprise, une offre de reprise, un broadcast au service ou un echange, le medecin peut ajouter un mot pour son/ses collegues (ex: 'peux-tu me depanner, mon petit est malade'). Champ limite a 280 caracteres, visible dans les cartes entrantes ET dans l'email de notification (bloc cite avec barre teal).
FixEmails reprise et echange : l'envoi n'etait pas toujours fiable (fire-and-forget gele avec le container Vercel apres la reponse HTTP — signature observee le 20/04 : email Lucas avec 4m37s de retard, email Marion jamais envoye). Correction appliquee sur les 10 sites d'envoi d'emails des 5 routes swaps : offre de reprise (propose + respond), demande de reprise (propose + respond : refus direct, refus broadcast, acceptation), echange de garde (propose + 4 actions de respond). +200ms de latence, emails garantis.
v7.2.120/04/2026
AméliorationColonne Garde plus lisible : header transforme en chip Bois de Rose avec icone lune, badges medecins avec contour rose, icone lune prefixee devant chaque initiale. Desktop et mobile.
FixOffre de reprise : le bouton 'Reprendre la garde' n'apparaissait que sur la vue bureau (tableau). Sur mobile (et dans 'Mes postes'), tapper sur la garde d'un collegue n'offrait aucune action. Le bouton est desormais disponible dans la fiche jour mobile pour chaque poste tenu par un autre medecin sur une date future. Un poste = bouton direct, plusieurs postes = liste depliable inline.
FixOffre de reprise : les cellules verrouillees par l'admin (cadenas amber) sont exclues des propositions de reprise. Evite qu'un medecin reprenne une affectation qu'une regeneration retablirait automatiquement. S'applique a la fiche jour mobile et au popover bureau.
v7.2.009/04/2026
NouveauOffre de reprise : un medecin peut desormais proposer de prendre la garde d'un collegue (et non plus seulement en ceder une). Clic sur la cellule d'un collegue → 'Proposer de reprendre'. Verification d'eligibilite en temps reel (conflits bloquants en rouge, alertes souples en ambre). Le collegue recoit une notification et accepte ou refuse — le planning se met a jour automatiquement si accepte.
v7.1.307/04/2026
NouveauPage Glossaire (/glossaire) : 20 definitions du vocabulaire du planning de garde hospitalier en 5 categories. Strategie GEO 'niche dictionary' — definitions autonomes 30-50 mots citables par les IA. Schema DefinedTermSet JSON-LD, barre d'ancres sticky, maillage interne.
v7.1.206/04/2026
NouveauPage FAQ dediee (/faq) : 24 questions en 6 categories, optimisee SEO + GEO (format answer-first pour citation par les IA). Schema FAQPage JSON-LD, barre d'ancres sticky, liens internes vers articles et fonctionnalites.
v7.1.105/04/2026
FixPresets solver : les poids de 2 contraintes (preference de jours, poste prefere) etaient inverses dans les presets Equilibre/Continuite/Confort. Le solver penalisait les preferences au lieu de les favoriser. Corrige.
FixCalendrier personnel : le dialog 'Mon calendrier' n'affichait rien si le medecin n'avait pas de lien calendrier configure. Affiche desormais un message explicatif avec contact admin.
FixCopie lien calendrier : le toast 'Lien copie' s'affichait meme si la copie echouait. Corrige avec gestion d'erreur.
AméliorationReglages : ajout de 2 contraintes structurelles dans la documentation (plafond activite P, date de debut medecin).
AméliorationLabels admin : 'Lancer la collecte' remplace par 'Aller au planning' dans le panneau desiderata et 'Collecte a lancer' dans le dashboard, pour eviter la confusion avec le vrai bouton de lancement.
AméliorationRefactoring planning-view.tsx : 1752 lignes splitees en 6 modules (use-planning-lifecycle, use-regeneration, use-planning-days, use-admin-banner-state, calendar-subscription-dialog, swap-proposals-panel). Maintenabilite amelioree, zero regression.
v7.1.003/04/2026
NouveauPlanning valide : nouvelle vue mobile compacte avec badges couleur, garde en premiere colonne, legende sticky et separation visuelle des semaines.
NouveauFiche jour : tap sur un jour ouvre un bottom sheet avec les postes, les activites declarees et les absences. Consultations en attente signalees par un badge ambre.
NouveauDeclaration d'activite en ligne : grilles Matin / Apres-midi avec 6 types (Consultation, Bureau, Ado, Diabete, Off, Formation). Masquee les week-ends et quand le medecin est poste.
NouveauMes postes : vue personnelle avec carte prochaine garde, jours postes en blanc, week-ends grises, et declaration d'activite integree.
AméliorationAdmin : point ambre sur les jours avec consultations en attente (pas bureau ni formation). Validation et rejet en un tap.
AméliorationToggle Vue tableau pour forcer l'ancien tableau sur mobile.
FixGarde partagee : affichage correct des deux medecins (jour / nuit) dans la fiche jour et la vue compacte.
FixAccessibilite : suppression des warnings Radix 'Missing Description' sur les bottom sheets.
FixReglages : suppression d'une regle fantome ('Indisponibilites fixes') qui n'avait plus d'effet depuis la refonte des disponibilites.
FixValidation du planning : si l'import des conges/formations depuis les desiderata echouait, aucun message d'erreur n'apparaissait. Corrige.
FixGeneration : quand le moteur manque de temps sans trouver de solution, le message distingue desormais un timeout d'une impossibilite mathematique.
AméliorationNettoyage de code mort (contraintes H6/H7/H8, composant planning-v2 inutilise) et meilleure gestion des erreurs dans le moteur de planification.
v7.0.202/04/2026
FixMedecins 24h (Helene) : le moteur pouvait attribuer une garde sans poste en journee. Corrige : poste + garde toujours ensemble, dans les deux sens.
v7.0.131/03/2026
FixCalendrier perso : une garde ou un poste assigne apparaissait comme 'Absent' si un desiderata d'indisponibilite existait le meme jour. Le planning genere prime desormais sur les souhaits.
FixCalendrier perso : les consultations n'apparaissaient pas sur les mois au-dela du mois suivant (ex: mai quand on est en mars). Corrige.
v7.0.027/03/2026
NouveauReprise de garde entre medecins : proposez une reprise depuis Mon planning. Deux modes : direct (a un collegue specifique) ou broadcast (au service, seuls les eligibles sont notifies). Filtrage intelligent par contraintes. Notifications in-app + email.
NouveauScore de faisabilite sur chaque candidat (vert = OK, orange = impact souple, rouge = impossible) — meme systeme que l'editeur admin.
NouveauAlertes avant acceptation : le medecin voit les contraintes impactees (ex: garde le lendemain) avant d'accepter.
AméliorationLes reprises en cours sont automatiquement annulees lors d'une regeneration du planning.
v6.1.327/03/2026
MoteurActivite externe : penalite separee de 'prefere pas' (80 vs 25). Un medecin en activite externe (IME, cours…) sera beaucoup moins facilement poste par le moteur. Ajustable dans Reglages.
v6.1.227/03/2026
NouveauCompteur Formation (FO) dans Mon suivi : solde annuel 15 jours, non proratise (droit legal identique quelle que soit la quotite). Jauge bleue a cote de CA et RTT.
NouveauCompteur FO dans le wizard 'Remplir mon mois' : solde formation restant visible en temps reel, comme CA et RTT.
FixWizard : seuls les mois avec un planning valide apparaissent dans le selecteur. Plus possible de remplir un mois dont le planning n'a pas ete valide.
FixTableau P du service visible pour les admins non-medecins sur la page planning.
FixAlerte completude : 'Mercredi 1 Mars' corrige — les jours en debordement de mois P (ex: avril dans le mois P de mars) affichent maintenant le bon mois.
FixWizard : les jours de repos apres garde ne sont plus proposes a remplir, meme quand la garde etait en fin de mois precedent.
v6.1.127/03/2026
FixWizard 'Remplir mon mois' : correction du compteur CA/RTT qui variait entre les mois (desynchronisation activites/slots).
FixWizard : le bouton Enregistrer ne se grisait plus apres avoir peint des activites deja presentes en base.
FixWizard : crash corrige lors du passage au mois de mai (tableau de tailles differentes).
AméliorationWizard : chargement des activites avant affichage pour eviter les donnees stales.
NouveauWizard : retrait d'absences obsoletes (repos de garde avec absence declaree). Bouton 'absent x' + sauvegarde via Enregistrer.
FixBarres mois par mois : les barres budget (ghost bars) s'affichent correctement sur desktop. Mobile : barres proportionnelles au taux de remplissage.
AméliorationLanding : labels Avant/Apres et fleche de transition sur le hero. Image visible sur mobile. Excel plus chaotique.
v6.1.026/03/2026
NouveauSite vitrine : nouvelles pages Tarifs, Fonctionnalites, Contact et A propos. Navigation publique et footer etendu pour les visiteurs.
AméliorationLanding page allegee : sections deplacees vers /fonctionnalites, CTAs vers /tarifs et /contact. Bandeau 'Utilise en pediatrie hospitaliere'.
AméliorationHeader marketing avec navigation publique (Fonctionnalites, Tarifs, A propos, Changelog, Se connecter) pour les visiteurs non connectes.
AméliorationMetadata SEO sur toutes les pages publiques (title, description, openGraph).
v6.0.125/03/2026
NouveauFormation et Arret auto-declares : nouveaux boutons FO/AM dans le popover et la vue medecin (beta). Une formation ou un arret pose depuis le planning compte 1P par demi-journee dans Mon suivi.
v6.0.025/03/2026
NouveauMon suivi : nouvelle page personnelle de tracking des demi-journees (P). Progression du mois, historique, resume quadrimestriel et annuel. Badges cliquables pour voir le detail des jours.
NouveauCarte P sur le planning : tableau recapitulatif Realise / Attendu / Ecart par medecin avec legende et warning donnees.
NouveauCA / RTT post-validation : nouveaux boutons dans le popover d'activites et la vue medecin pour poser un conge annuel ou RTT apres validation du planning.
NouveauP-month : le decompte mensuel demarre le premier lundi du mois (ex: mars 2026 = 2 mars au 5 avril), conformement au comptage de l'administration.
MoteurH10 : les absences (formation, conge, arret) reduisent maintenant le budget du solver. Un medecin absent n'est plus sur-alloue.
FixImport de 61 consultations historiques (janvier + fevrier 2026) depuis les CSV de Cecile.
v5.5.023/03/2026
NouveauRetrait d'absence : un medecin peut desormais retirer sa propre absence depuis le planning (clic sur son badge dans la colonne Absences). Il devient libre de se positionner en consultation ou bureau.
FixDashboard : les mois valides au-dela de M+1 (ex: mai quand on est en mars) apparaissent maintenant dans le panneau mois complet.
v5.4.023/03/2026
MoteurNouveau role Specialiste : un medecin specialiste (ex: urgentiste adulte) est automatiquement affecte a son poste autorise chaque jour de presence. Libere un generaliste pour un autre secteur.
NouveauParametres : nouvelle option 'Specialiste' dans le role du medecin. Le moteur affecte automatiquement le specialiste a son poste dedie.
v5.3.020/03/2026
FixDevalidation preservee : repasser un planning en brouillon conserve maintenant les corrections manuelles au lieu de les supprimer.
FixTriangles de violation : les postes non autorises (ex: ES hors urgences) et les medecins WE-only affiches en semaine sont maintenant detectes sur la grille.
FixContrat contraintes : synchronisation complete des IDs entre le fichier de regles JSON, les labels TypeScript et le solver Python. 3 contraintes dures manquantes ajoutees.
FixDonnees orphelines : la desactivation d'un medecin nettoie maintenant ses desiderata et verrous futurs. La suppression definitive nettoie toutes les donnees liees.
AméliorationRegeneration : avertissement explicite quand des corrections manuelles sauvegardees seront remplacees par le nouveau calcul.
v5.2.020/03/2026
NouveauSous-poids editables : les 5 contraintes multi-poids (desiderata, continuite, renfort, espacement, recup) affichent maintenant des curseurs individuels dans Parametres. Chaque sous-poids peut etre ajuste independamment.
NouveauNouvelle contrainte visible : les desiderata souples (prefere pas, consultation demandee, demande de garde) apparaissent desormais dans la page Parametres avec leurs 3 sous-poids.
v5.1.020/03/2026
FixCurseurs multi-poids (continuite, backup, espacement, desiderata, recup) : les modifications etaient ignorees par le moteur. Les sous-poids sont maintenant ajustes proportionnellement.
FixProtections desactivables : les interrupteurs de contraintes dures dans Parametres n'avaient aucun effet. Le moteur respecte maintenant les protections desactivees.
FixGel desiderata : un medecin ne peut plus modifier ou soumettre ses desiderata apres la cloture de la collecte.
FixPlanning public : les plannings non valides ne sont plus visibles sur la page publique.
FixCalendrier iCal : correction de doublons potentiels dans le feed (jours de contexte stale).
AméliorationPanneau d'impact : detection des gardes trop rapprochees (3+/7j), des 2 week-ends d'affilee, et du bonus garde-urgences.
AméliorationSauvegarde : detection de conflit si un autre admin a modifie le planning entre-temps.
AméliorationRegeneration : avertissement si des modifications non sauvegardees seront perdues.
FixSecurite : un medecin desactive ne peut plus acceder aux fonctionnalites de l'app.
FixSecurite : le micro-feedback ne peut plus etre envoye au nom d'un autre medecin.
FixEquite annuelle : les corrections manuelles de gardes sont maintenant prises en compte dans le calcul d'equite.
FixSuppression medecin : verification des verrous admin avant suppression pour eviter les donnees orphelines.
FixRegeneration : timeout de 2 minutes sur l'appel au moteur — plus de barre de progression bloquee.
FixFormulaire feedback : l'ecran de confirmation ne s'affiche plus si la sauvegarde en base a echoue.
AméliorationPreferences email : le toggle 'Consultations par email' est desormais marque comme 'a venir' (in-app uniquement pour l'instant).
AméliorationDesiderata : message explicite quand tous les jours de semaine sont bloques par la disponibilite.
AméliorationExport CSV : echappement correct des champs contenant virgules ou guillemets.
v5.0.020/03/2026
MoteurPoids configurables : les curseurs de poids dans Parametres > Contraintes controlent maintenant reellement le moteur de planification. Chaque contrainte souple (26 au total) lit son poids depuis la configuration au lieu d'utiliser des valeurs fixes.
FixCorrection des poids dans le fichier de reference : S8 (preference de jour de garde) aligne sur le vrai bonus, S13 (desiderata souples) decompose en 3 sous-poids (prefer_not, consultation, demande de garde), S24 (recuperation post-garde) complete avec le poids jour unique.
v4.9.019/03/2026
NouveauDiagnostic intelligent : quand le moteur ne trouve pas de solution, un diagnostic detaille explique pourquoi (blocages de garde, sous-effectif) et identifie les jours problematiques.
NouveauRecherche de solutions : le moteur peut tester des modifications de desiderata pour proposer des alternatives classees par impact sur l'equilibre global du planning.
AméliorationDialog d'echec simplifie avec lien direct vers le diagnostic sur la page planning.
v4.8.119/03/2026
AméliorationRecapitulatif par medecin : retrait de la colonne Recup dont le calcul etait imprecis. Le tableau se concentre sur les donnees fiables (gardes, postes, jours libres, activites).
AméliorationVerification des regles : retrait de la section 'Charge de travail' (budget P) dont le calcul simplifie etait trompeur. Sera remplace par un vrai suivi du temps de travail.
v4.8.019/03/2026
MoteurFix S13 : le desideratum 'Consultation' ne penalise plus la garde du soir. Un medecin qui souhaite consulter en journee reste disponible pour la garde. Pour refuser poste ET garde, utiliser 'Plutot pas dispo'.
NouveauDesiderata : nouveau statut 'Activite externe' (IME, cours a la fac, vacations…). Compte comme temps de travail hospitalier. L'algorithme evite d'affecter un poste ou une garde mais peut le faire en cas de necessite.
NouveauDesiderata : panneau de description contextuel. En cliquant sur un statut, un panneau detaille apparait sous la toolbar avec l'impact sur les postes et la garde en langage clair.
AméliorationDesiderata : toolbar reorganisee en 2 groupes — Absences (5 statuts) puis Preferences (5 statuts + gomme). Plus facile a scanner.
AméliorationDesiderata : descriptions enrichies pour chaque statut. Chaque bouton indique explicitement son effet sur les postes de jour et la garde du soir (ex: 'Pas de poste . Garde possible').
NouveauDesiderata : bouton d'aide '?' avec recapitulatif de tous les statuts, impact poste/garde, et quand les utiliser.
FixDesiderata : boutons 'Transmettre' et 'Enregistrer le brouillon' ne debordent plus sur mobile. Les boutons passent en pleine largeur sur petit ecran.
v4.7.118/03/2026
NouveauDesiderata : acces en lecture seule aux desiderata des mois valides. Double CTA 'Voir le planning' + 'Mes desiderata' sur l'overview.
v4.7.018/03/2026
NouveauDesiderata : alerte douce a la soumission si un medecin de garde bloque plus de 50% des week-ends du mois (hors conges et arrets). Dialog de confirmation non bloquant.
NouveauDesiderata : badge temps reel 'WE : X/Y dispo' sous le calendrier en mode edition. Passe en orange avec icone d'alerte si trop de week-ends bloques.
NouveauDesiderata : sidebar admin enrichie — indicateur de disponibilite week-end par medecin de garde avec code couleur (vert/orange/rouge).
v4.6.017/03/2026
NouveauPlanning : nouveaux types d'activite Ado et Diabete. Les medecins peuvent se positionner en service adolescent ou HDJ diabete, en plus de Consultation, Off et Bureau.
AméliorationPlanning : les boutons de positionnement sont reorganises en 2 groupes — cliniques (Consult, Ado, Diab.) puis administratifs (Off, Bureau).
AméliorationPlanning : la colonne Consult. du recapitulatif devient Activites avec un total et un tooltip detaillant la repartition par type.
AméliorationDashboard : le service du jour inclut desormais les medecins positionnes en Ado et Diabete.
v4.5.117/03/2026
FixPlanning : confirmation avant de quitter le mode edition si des modifications n'ont pas ete sauvegardees. Evite de perdre son travail par un clic accidentel.
v4.5.017/03/2026
NouveauDesiderata : nouveaux types Conges et Arret maladie. Permet de distinguer les absences planifiees (CP, CT, RT) des arrets de travail, en preparation du futur suivi budget jours.
AméliorationDesiderata : palette couleurs revue — 9 statuts avec couleurs toutes distinctes. Consultation passe en bleu ciel (sky) pour se differencier clairement de l'absence (rouge).
FixDesiderata : dark mode entierement corrige. Tous les statuts, la toolbar, la legende et les cellules s'affichent correctement en mode nuit.
AméliorationDesiderata : cellules compactes sur desktop (hauteur fixe 56px au lieu de carres geants). Mobile inchange.
AméliorationDesiderata : week-ends visuellement distincts (headers Sam/Dim en couleur accent, contour subtil sur les cellules WE).
NouveauDesiderata : jours feries affiches avec un indicateur visuel (point rouge) et le nom du ferie en tooltip. Vacances scolaires Zone A egalement visibles.
AméliorationDesiderata : peinture verticale activee sur desktop (drag multi-directionnel). Sur mobile, le comportement horizontal-only est conserve pour eviter les conflits avec le scroll.
NouveauDesiderata : Shift+clic pour peindre une plage de jours. Cliquez un jour, puis Shift+clic un autre pour remplir tous les jours entre les deux.
MoteurConges et arrets maladie traites comme indisponibilites dures par le solver (meme comportement que 'Indisponible').
v4.4.017/03/2026
MoteurH18 : pas de garde la veille d'une formation. Le solver interdit automatiquement de placer un medecin de garde s'il a une formation le lendemain.
MoteurH18 cross-mois : si un medecin a une formation le 1er du mois suivant, le solver bloque aussi la garde le dernier jour du mois courant.
AméliorationL'editeur de planning signale en temps reel les conflits garde/formation (jour meme et veille).
FixLes jours de formation ne sont plus comptes comme jours libres dans l'audit et le budget consultations.
v4.3.317/03/2026
AméliorationDesiderata : UX admin clarifiee — CTA differenciee par etat (brouillon/transmis), badge 'Transmis' au lieu de 'Valide', date de soumission visible, banniere mode admin.
AméliorationPlanning : retrait d'une consultation validee necessite une confirmation et notifie le medecin (in-app + email digest).
FixDesiderata : le switch mode (?switch=1) est maintenant reserve aux admins.
v4.3.217/03/2026
FixLes boutons d'action (Enregistrer, Annuler) ne sont plus masques par la barre de navigation mobile. Corrige aussi le bouton 'remonter en haut' des reglages.
v4.3.116/03/2026
NouveauLe service du jour affiche les medecins en consultation et bureau (matin/apres-midi) en plus des postes obligatoires.
NouveauCompte admin developpeur (CT) : connexion propre avec impersonation, invisible pour les medecins et les autres admins.
v4.3.015/03/2026
NouveauPages legales publiques : mentions legales, CGV, CGU, politique de confidentialite et DPA accessibles depuis le footer.
v4.2.115/03/2026
AméliorationConfirmations de desactivation et suppression de medecin via modale au lieu d'une boite de dialogue navigateur.
FixLes erreurs inattendues sont maintenant enregistrees dans la console pour faciliter le diagnostic.
FixLe formulaire feedback n'affiche plus 'mars 2026' en dur mais le mois courant.
MoteurLes jours feries sont maintenant calcules dynamiquement (Paques, Ascension, Pentecote) au lieu d'etre codes en dur pour 2026.
MoteurVersions des dependances solver epinglees pour eviter les mises a jour inattendues.
MoteurCorrection d'une mutation potentielle des donnees d'entree dans le chargement des profils medecins.
AméliorationL'email 'planning valide' invite maintenant les medecins a se positionner sur leurs jours libres (consultation, bureau, off).
NouveauNotification in-app quand vos consultations sont validees ou refusees par l'admin. Les notifications sont agregees (pas de spam si plusieurs validations d'affilee).
NouveauL'admin peut relancer par email les medecins qui n'ont pas encore rempli leurs desiderata (bouton dans l'espace admin desiderata).
NouveauNotification in-app quand les desiderata sont geles par l'admin.
NouveauPage 'Mes notifications' : chaque medecin peut gerer ses preferences de notification, modifier son email, et desactiver les alertes non essentielles (accessible depuis la cloche).
NouveauEmail de bienvenue automatique : quand un admin cree un nouveau medecin, un email avec le lien de premiere connexion est envoye automatiquement.
v4.2.015/03/2026
NouveauEspace admin integre au dashboard : vue de pilotage avec alertes planning, suivi desiderata et demandes de consultation, directement sur la page d'accueil.
NouveauBandeau admin sur la page planning : conflits detectes en temps reel (medecin assigne mais absent, postes vides), avec possibilite de masquer les alertes volontaires.
NouveauPanneau admin sur la page desiderata : suivi collecte par mois avec progression visuelle (chips medecins) et actions rapides (lancer la collecte).
AméliorationLes 3 espaces admin (dashboard, planning, desiderata) sont repliables via un chevron pour ne pas encombrer la vue.
AméliorationDates lisibles dans les alertes planning (ex: 'vendredi 20 mars' au lieu de 'jour 20').
FixCorrection du scroll automatique vers le bas sur le dashboard (la page restait en haut sur le hero).
FixSecurite : les alertes masquees ne sont accessibles qu'aux administrateurs (politique RLS corrigee).
v4.1.014/03/2026
NouveauL'app peut maintenant etre installee comme une vraie application sur Android (menu Chrome > Installer DeGarde). L'icone s'affiche correctement sur tous les appareils.
NouveauPage hors ligne : si vous ouvrez l'app sans connexion, vous voyez un message clair au lieu d'une page d'erreur du navigateur.
AméliorationSupport iOS ameliore : l'app s'ouvre en mode plein ecran (sans barre URL Safari) quand ajoutee a l'ecran d'accueil.
NouveauBandeau d'installation in-app : un bouton 'Installer' apparait en haut de la page pour ajouter DeGarde a l'ecran d'accueil. Sur iOS, des instructions adaptees sont affichees.
FixIcone de l'app corrigee sur Android 13+ (Pixel 10 Pro, etc.) : ajout d'icones maskable dediees avec fond plein.
v4.0.113/03/2026
AméliorationSecurite renforcee : toutes les API verifient maintenant la session Supabase Auth au lieu de se fier a un header modifiable. Plus aucun acces sans connexion valide.
AméliorationProtection anti-brute-force : 5 tentatives de connexion maximum par quart d'heure.
AméliorationLe lien de premiere connexion ne fonctionne qu'une seule fois. Apres le choix du PIN, il faut passer par un administrateur pour reinitialiser.
AméliorationRenforcement des droits d'acces en base de donnees (RLS) : les tokens et les mappings d'authentification ne sont plus lisibles par les utilisateurs.
FixLes tokens dans les liens email sont maintenant correctement encodes (caracteres speciaux).
v4.0.013/03/2026
NouveauConnexion par code PIN : chaque medecin choisit un code a 4 chiffres (comme une carte bancaire). Plus besoin de retrouver un lien a chaque fois — selectionnez votre nom et entrez votre PIN.
NouveauPremiere connexion simplifiee : cliquez sur le lien personnel recu par email ou message, choisissez votre PIN, et c'est fait. La session reste active 30 jours.
NouveauBouton Se deconnecter dans le menu profil (en haut a droite).
AméliorationSuppression du code d'acces etablissement (748291). Il n'etait plus utile depuis les liens personnels.
AméliorationSecurite renforcee : sessions gerees par Supabase Auth (JWT + refresh tokens) au lieu d'un simple cookie.
v3.5.013/03/2026
FixDashboard : les consultations et activites validees (bureau, off) s'affichent desormais dans la vue semaine, la vue mois et le hero briefing. Avant ce fix, ces jours apparaissaient comme 'Libre' au lieu de 'Consultation' ou 'Bureau'.
v3.4.012/03/2026
NouveauDashboard Round 4 : vue semaine cross-mois (affiche les 7 jours meme quand la semaine chevauche deux mois), navigation mois dans la carte calendrier, prochaine garde dans le hero briefing.
NouveauRaccourcis rapides dans le hero : Mon planning, Planning service, Desiderata.
FixFix bug critique prevDay cross-mois : le repos de garde etait mal detecte le 1er du mois (arithmetique jour-du-mois remplacee par lookup date string).
FixFix bug timezone UTC : toISOString().slice(0,10) remplace par toLocalDateStr() sur le dashboard et la page planning (decalage de date en UTC+1/+2).
FixFix hydratation SSR sur la page planning (ActivityPopover span/button mismatch).
AméliorationVue mois : couleurs et labels alignes avec la vue semaine (dark gradient pour gardes, noms complets des postes).
AméliorationExtraction de helpers partages (daysUntil, prevDateStr) dans utils.ts, suppression du prop isAdmin inutilise.
v3.3.012/03/2026
NouveauNavigation mois redessinee : fenetre glissante de 5 mois (3 en mobile), fleches pour decaler la fenetre, dots colores selon le statut du mois, spinner de chargement sur la pill cliquee.
FixCorrection des cles React dupliquees dans la grille planning : les jours contextuels (mois adjacents) sauvegardes par erreur dans planning_edits sont desormais filtres au chargement.
FixCorrection des erreurs d'hydratation SSR/client sur le bandeau audit trail et le selecteur de scenarios.
v3.2.111/03/2026
FixSecurite notifications : sanitisation du parametre doctor_id contre l'injection PostgREST, validation des liens internes (pas de navigation hors app).
FixRLS active sur les 3 tables notifications (in_app_notifications, notification_reads, notification_dismissals).
FixCompteur non-lus : ne decremente plus pour des notifications deja lues. Sentinel read_at corrige (ISO timestamp au lieu de string 'read').
AméliorationDual-write email/in-app : les erreurs d'insertion in-app sont desormais loguees (console.warn) au lieu d'etre avalees silencieusement.
v3.2.011/03/2026
NouveauRefonte du dashboard medecin 'Mon Planning' : nouveau hero briefing avec statut du jour, emoji contextuelle, et apercu de demain.
NouveauEquipe du jour : voir d'un coup d'oeil qui fait quoi dans le service aujourd'hui (postes + garde du soir).
NouveauZone 'A faire' : CTA contextuelles (desiderata a remplir, notifications non lues, consultations en attente) ou 'Tout est a jour'.
AméliorationStrip semaine enrichi : affiche le nom du poste (URG, MAT, HOS) au lieu de 'Poste', jours passes attenues, aujourd'hui mis en avant.
AméliorationCalendrier mois + stats fusionnes en une seule carte compacte avec prochaine garde integree.
AméliorationSuppression des 3 boutons CTA redondants remplaces par des actions contextuelles plus pertinentes.
v3.1.011/03/2026
NouveauCentre de notifications in-app : icone cloche dans le header avec badge compteur non-lus. Dropdown style GitHub/Notion avec regroupement par date (Aujourd'hui / Cette semaine / Plus ancien).
NouveauNotifications automatiques : chaque email envoye (collecte ouverte, planning valide, desiderata recus) cree aussi une notification in-app persistante.
NouveauAnnonces produit (admin) : formulaire en bas du dropdown pour envoyer une annonce a tous les medecins (titre + message + lien optionnel).
AméliorationMarquer comme lu : clic sur une notification navigue vers la page concernee et la marque comme lue. Bouton 'Tout lire' pour marquer toutes les notifications.
AméliorationMobile : la cloche est visible a cote du badge identite. Le dropdown s'adapte en quasi-pleine largeur.
v3.0.111/03/2026
AméliorationCartes medecins compactes : 2 lignes max, toute la carte est cliquable, 3 colonnes sur grands ecrans.
FixLa sidebar suit maintenant le scroll et surligne la bonne section en temps reel.
AméliorationLe toggle Mode expert est repositionne dans un en-tete de zone 'Ajustement des contraintes', clairement separe des presets.
AméliorationSuppression de la distinction Bonus (jauge verte) : toutes les contraintes utilisent la meme jauge d'importance, plus simple a comprendre.
v3.0.011/03/2026
NouveauRefonte complete de la page Administration. Nouvelle navigation par sections (sidebar desktop, pills mobile) au lieu des onglets.
NouveauReglages rapides : 3 profils pre-configures (Equilibre, Continuite, Confort) pour configurer le moteur en un clic.
NouveauJauges d'importance : les poids numeriques sont remplaces par 5 niveaux clairs (Optionnel → Quasi-obligatoire). Les poids fins restent accessibles via un toggle.
NouveauDetection de conflits : le systeme signale automatiquement les configurations problematiques (sous-effectif, preferences orphelines, objectifs contradictoires).
AméliorationDescriptions en langage clair : chaque regle du moteur est expliquee en termes concrets ("Le moteur espace les gardes d'au moins 5-7 jours").
AméliorationProfils medecins en grille : vue d'ensemble compacte avec role, gardes/mois et jours en un coup d'oeil. Modification dans un panneau lateral.
AméliorationJours autorises : le selecteur de jours utilise maintenant un interrupteur explicite (On/Off) avec les jours bloques barres en rouge.
AméliorationRegles inviolables organisees en 3 niveaux : fondations (verrouillees), protections (desactivables avec avertissement), pilotees par profil.
AméliorationMobile : panneau medecin plein ecran, zones tactiles 44px minimum sur boutons et selecteurs de jours.
v2.3.011/03/2026
FixSecurite : cookie d'identite desormais httpOnly + secure (non accessible par JavaScript). L'identite est transmise du serveur au client via un contexte React.
FixSecurite : tokens d'acces renforces (128 bits au lieu de 32 bits).
FixMemory leak : nettoyage du timer de progression lors de la navigation pendant une regeneration.
AméliorationSolver API : validation Pydantic des parametres (month, time_limit, alternatives) avec bornes strictes.
AméliorationSolver API : les erreurs sont desormais loguees cote serveur (traceback complet).
v2.2.110/03/2026
FixSecurite : politiques RLS corrigees sur la table doctors (lecture publique, ecriture admin uniquement via service role).
FixToken creation : erreur silencieuse corrigee. Si la generation du token echoue a la creation d'un medecin, un message explicite est affiche.
FixProfils medecins : la priorite 'regular' est desormais fusionnee avec 'primary' (identiques cote moteur).
FixCouleurs medecins : les couleurs dynamiques (stockees en base) sont maintenant appliquees partout dans le planning et les badges.
FixRoute solver : guard ajoute si aucun medecin actif n'est trouve (erreur explicite au lieu d'un crash).
FixSauvegarde profils medecins : les modifications dans Settings sont maintenant persistees via l'API (corrige un echec silencieux lie aux politiques RLS).
v2.2.010/03/2026
NouveauWizard creation medecin : formulaire en 3 etapes (Identite, Disponibilites, Role) avec stepper visuel et navigation avant/arriere. Tous les reglages sont accessibles des la creation.
AméliorationReglages avances depliables a chaque etape du wizard : postes autorises, gardes preferees, espacement, jour off conditionnel, notifications. Visibles sans etre imposes.
AméliorationRecapitulatif visuel avant creation : badge couleur, initiales, quotite et cible gardes affiches a l'etape finale.
v2.1.009/03/2026
NouveauAjout de medecin : le responsable peut creer un nouveau medecin depuis les Settings. Formulaire avec initiales, nom, quotite, priorite, gardes et couleur. Un lien d'acces est genere automatiquement.
AméliorationSource de verite unique : les profils medecins sont stockes dans une table dediee en base. Plus de fichier JSON statique ni de systeme de delta.
AméliorationCouleurs dynamiques : palette de 20 couleurs pastels distinctes, auto-attribuee a la creation. Les couleurs sont stockees en base par medecin.
AméliorationListe admins centralisee : une seule source de verite pour les droits administrateur (supprime la duplication dans 4 fichiers).
v2.0.109/03/2026
NouveauAlertes contraintes visibles : les cellules du planning qui violent une contrainte dure (repos de garde, absence, etc.) sont signalees par un indicateur rouge. Un toast d'alerte apparait lors de l'assignation.
AméliorationToasts repositionnes en haut de l'ecran pour ne plus etre caches par la barre d'edition.
AméliorationToasts plus lisibles : fonds opaques avec contraste ameliore.
v2.0.006/03/2026
NouveauGel des desiderata : le responsable du planning peut geler la collecte d'un mois. Les medecins ne peuvent plus modifier leurs desiderata une fois la collecte gelee. Reouverture possible a tout moment.
NouveauLien public planning : lien partageable en lecture seule pour les secretaires du service. Accessible sans compte, affiche la grille du mois avec consultations validees, navigation entre mois, et bouton imprimer.
NouveauMode sombre : suit automatiquement la preference systeme (mode nuit du telephone/ordinateur). Toggle manuel dans le header. Confort pour les gardes de nuit.
AméliorationReorganisation des actions planning : onglets de vue a gauche, actions admin a droite. Menu ⋯ regroupe impression, export CSV, partage et calendrier. Sur mobile, les actions admin passent dans le menu ⋯.
AméliorationImpression planning : selecteur de colonnes a imprimer, recapitulatif masque, seules les consultations validees sont imprimees.
AméliorationExport CSV : colonnes Consultations Matin et Consultations Apres-midi avec uniquement les consultations validees.
v1.7.605/03/2026
NouveauExport calendrier (iCal) : bouton dans la vue médecin pour copier un lien d'abonnement. Collez-le dans Google Calendar ou Apple Calendar pour voir votre planning automatiquement mis à jour.
v1.7.505/03/2026
NouveauNouveau désidérata « Consultation souhaitée » : signalez les jours où vous souhaitez être libre pour consulter. Le solver en tient compte (préférence souple).
v1.7.405/03/2026
FixDésidérata « Dispo journée seule » (pas de garde ce soir-là) : les entrées n'étaient pas sauvegardées en base (contrainte SQL manquante). Corrigé.
AméliorationGestion d'erreurs sur la sauvegarde des désidérata : un toast d'erreur s'affiche si la persistance échoue, au lieu d'un échec silencieux.
v1.7.304/03/2026
FixAlternatives planning : les médecins en consultation sont maintenant correctement exclus des remplaçants dans le popover de cellule.
AméliorationProtection double-clic sur tous les boutons d'action activités (consultation, off, bureau, valider, refuser, retirer).
AméliorationRefactoring code : extraction des sous-composants activités dans un fichier dédié (day-row-activities.tsx).
v1.7.204/03/2026
AméliorationColonne Consult splitée en deux colonnes Matin et Après-midi : lecture immédiate de qui consulte quand, sans labels am/pm.
NouveauPopover admin scopé par période : chaque colonne (Matin/Après-midi) a son propre popover avec médecins non positionnés et section 'Me positionner'.
NouveauCommentaire de refus : au clic sur ✕, un champ texte optionnel permet d'indiquer la raison du refus avant confirmation.
AméliorationAbsences groupées : off/bureau AM+PM même type → affichage pleine journée sans suffixe. Demi-journées avec suffixes français (mat. / a-m.).
FixAdmin peut maintenant se positionner en consultation depuis le popover (section 'Me positionner' visible quand libre).
AméliorationSuppression de tous les labels am/pm dans la grille, les popovers et la vue médecin.
v1.7.104/03/2026
NouveauDemi-journées AM/PM : les médecins peuvent maintenant se positionner séparément le matin et l'après-midi (ex: consultation le matin, bureau l'après-midi).
AméliorationVue médecin : deux colonnes Matin/Après-midi remplacent la colonne unique Activité.
AméliorationColonne Consult : seules les consultations apparaissent (off/bureau restent dans Absences uniquement).
FixCorrection d'un décalage d'affichage (hydration mismatch) sur l'en-tête Consult.
v1.7.004/03/2026
NouveauGestion des consultations post-planning : après validation du planning, les médecins peuvent se positionner sur leurs jours libres (consultation, off, bureau).
NouveauColonne 'Consult' dans la grille service : affiche les médecins en consultation avec badge vert (validée) ou orange (en attente).
NouveauValidation admin des consultations : popover dans la colonne Consult pour valider/refuser les demandes et assigner directement les médecins non positionnés.
NouveauVue médecin enrichie : boutons Consult/Off/Bureau sur chaque jour libre quand le planning est validé. Statut visible en temps réel.
AméliorationAlternatives planning : les médecins en consultation sont exclus des remplaçants proposés (raison 'En consultation').
AméliorationRécapitulatif enrichi : colonne Consult. affiche le ratio consultations/jours libres avec indicateur d'attente.
AméliorationOff et bureau apparaissent dans la colonne Absences avec un label distinctif.
v1.6.203/03/2026
FixCorrection prénom Margaux Populaire (MP) dans toutes les sources de données et l'interface.
FixNotifications email : ajout d'un délai entre les envois pour respecter la limite Resend (2 req/s). Plus de mails perdus en campagne.
FixAjout du token d'accès pour Emilie Stempf (ES) — elle peut maintenant recevoir les notifications et accéder à ses désidérata.
v1.6.103/03/2026
FixÉditeur planning : le grid ne saute plus au premier clic en mode édition. L'éditeur s'initialise maintenant depuis le brouillon sauvegardé (et non la sortie solver brute).
v1.6.003/03/2026
NouveauWidget micro-feedback : bouton discret 'Votre avis ?' dans le footer, accessible à tous les médecins identifiés. Note 1-5 en un clic + commentaire optionnel, envoi en < 15 secondes.
NouveauCooldown intelligent : le widget se masque 14 jours après soumission, 7 jours après 3 fermetures sans répondre. Pas de harcèlement.
NouveauEmail notification : chaque feedback envoyé génère un email brandé à l'admin avec note, commentaire et page concernée.
NouveauVue admin /admin/micro-feedback : distribution des notes (bar chart) + liste chronologique avec badge coloré par note.
v1.5.103/03/2026
NouveauBrouillon désidérata : bouton 'Sauvegarder' (outline) confirme que les marquages sont enregistrés sans transmettre. 'Valider' renommé en 'Transmettre mes désidérata' pour distinguer brouillon et transmission. Après transmission : seul 'Mettre à jour' reste visible.
AméliorationLifecycle auto-advance : si tous les médecins ont transmis leurs désidérata sans campagne officielle, le mois passe automatiquement en statut 'Collecte'. La carte 'Lancer la collecte' disparaît et 'Générer le planning' devient visible.
AméliorationPerformance : chargement des pages ~3x plus rapide. Les requêtes Supabase par mois (12-15 requêtes individuelles) sont remplacées par une seule requête batch. Le chargement de la liste des médecins est parallélisé et mutualisé.
v1.5.003/03/2026
Nouveau3 nouvelles notifications email : désidérata reçu (admin informé par médecin), tous désidérata complets (admin peut générer), accusé de lecture planning (tracking via email + visite in-app).
NouveauAccusé de lecture planning : lien email passe par /api/notify/ack (tracking 1er clic), visite in-app met à jour read_at. Admin voit 'Vu par X/Y' sous 'Généré par'.
AméliorationTemplate email extrait dans email-template.ts (route.ts allégée de 290 à 190 lignes). 4 variantes de contenu (campagne, planning validé, désidérata reçu, tous reçus).
AméliorationMigration 010 : nouveaux types notification_log (desiderata_submitted, all_desiderata_received) + colonne read_at pour les accusés de lecture.
v1.4.002/03/2026
NouveauNotifications email : les médecins reçoivent un email quand la collecte de désidérata est lancée ou quand le planning est validé. Envoi via Resend, templates brandés (teal + Bois de Rose), liens personnalisés avec token d'authentification.
NouveauChamp email par médecin dans les Settings, avec préférences de notification séparées (collecte désidérata / planning validé). Badges 'À venir' retirés.
NouveauTable notification_log dans Supabase : idempotence native (pas de doublon par type + mois + médecin), log des envois et erreurs.
AméliorationTemplate email contact (/api/contact) aligné sur le brand kit : header teal bicolore DeGarde, bande accent Bois de Rose, espacement Gmail corrigé.
v1.3.102/03/2026
AméliorationRoute /planning dédiée : le planning a sa propre URL au lieu de /dashboard?month=. L'onglet 'Planning' dans la navigation est maintenant correctement actif. Ancien lien /dashboard?month= redirige automatiquement.
AméliorationTouch targets mobile : hamburger et flèches semaine agrandis (min 44px), toast centré en bas, backdrop sombre sur le menu mobile.
AméliorationNavigation : Feedback retiré du header (déplacé en footer admin), active state sur les liens, Changelog visible par tous les utilisateurs identifiés.
AméliorationDialogues de confirmation natifs (window.confirm) remplacés par des ConfirmDialog stylisés : validation, annulation, régénération, enregistrement, collecte, génération.
AméliorationDésidérata mobile : grille outils 4 colonnes avec labels courts, suppression en lot optimisée (1 requête au lieu de N).
AméliorationTap sans outil sélectionné : toast d'avertissement 'Choisissez un statut'.
AméliorationPlanning grid : légende couleurs médecins sous la grille, gradient de fade pour le scroll horizontal mobile, bouton Imprimer masqué sur mobile.
AméliorationTooltip avec le nom complet du médecin sur chaque onglet de la vue planning.
AméliorationDashboard médecin : empty state explicatif quand le planning n'est pas encore disponible, mois affiché à côté de 'Cette semaine'.
AméliorationAccessibilité : role='button' + tabIndex + onKeyDown sur les cartes mois du dashboard admin.
AméliorationPremier contact : texte d'accueil amélioré sur l'écran code d'accès + lien personnel, mention 'le responsable du planning' au lieu d'un nom.
v1.2.102/03/2026
FixCorrection imports inutilisés (PenLine, Cpu, isKnown) qui bloquaient le lint CI.
FixescapeHtml : ajout du remplacement des apostrophes (') dans le formulaire de contact.
MoteurNouveau type désidérata no_oncall : interdit la garde un jour donné (les postes restent autorisés). Traité dans H11.
FixBiais annuel cohérent API/CLI : la route /api/solve ne mélange plus les données de l'année précédente dans les stats annuelles.
AméliorationEmail contact configurable via variable d'environnement CONTACT_EMAIL.
AméliorationRate limiting sur /api/contact : 1 requête par minute par IP pour protéger le quota Resend.
v1.2.002/03/2026
NouveauFormulaire de contact sur la landing page : nom, email, établissement, message. Envoi par email via Resend. Section intégrée entre 'Pourquoi DeGarde' et le CTA final.
v1.1.001/03/2026
NouveauCode d'accès établissement : premier écran de connexion avec code à 6 chiffres. Cookie 30 jours. Les liens personnels (?token=xxx) passent directement.
NouveauPages d'erreur en français : error boundary (500), page introuvable (404), spinner de chargement.
NouveauLiens personnels dans Settings : onglet 'Liens' avec copie individuelle ou groupée des URLs par médecin.
AméliorationSélecteur d'identité masqué pour les non-admins : les médecins arrivent via leur lien personnel. Admins gardent 'Changer de profil'.
AméliorationOnboarding réécrit pour les médecins : 3 étapes (Bienvenue, Comment ça marche, C'est parti) au lieu du texte 'prototype'.
AméliorationGuard API /api/solve : seuls les admins (CA/MS/LB) peuvent lancer une génération. Timeout 60s sur l'appel solver.
AméliorationGuard API /api/desiderata : les non-admins ne voient que leurs propres désidérata.
AméliorationCompteur X/10 médecins visibles par tous dans la vue désidérata.
AméliorationRésilience dashboard : Promise.allSettled pour les queries non-critiques. Si Supabase est indisponible, le dashboard s'affiche quand même.
NouveauLanding page marketing : page d'accueil DeGarde avec sections Hero, Problème, Comment ça marche, Fonctionnalités, CTA. Esthétique professionnelle healthcare.
NouveauDashboard désidérata : vue d'ensemble des mois avec statut de soumission (envoyé, à remplir, à venir). Visible quand on clique sur Désidérata sans mois sélectionné.
NouveauRoute /planning dans la navbar : accès direct au planning du mois en cours.
AméliorationRestructuration routes : app déplacée de / vers /dashboard. Page d'accueil marketing indépendante.
v1.0.427/02/2026
AméliorationRefonte UX panneau Médecins (Settings) : ancien monobloc 710 lignes → 12 fichiers par catégorie. 7 groupes logiques (Disponibilités, Gardes, Postes, Règles, Transitions, Notifications, Note). Chaque champ a une description en ligne et un badge de sévérité (règle stricte / préférence). Pilier et Régulier fusionnés en « Standard » (identiques côté moteur). Note de disponibilité et raison du jour off conditionnels sont maintenant éditables.
v1.0.327/02/2026
MoteurS24 récup fériés : garde un jour férié en semaine → 1j récup (comme dimanche). Garde dimanche veille de férié → 2j récup (le repos H3 tombe sur férié, ne compte pas). Récapitulatif front mis à jour.
MoteurChangement de profil avec date d'effet : profile_changes remplace le champ transition hardcodé. Permet plusieurs transitions datées (quotité, priorité, volume gardes). UI Settings : ajout/suppression de transitions par médecin.
v1.0.226/02/2026
MoteurS24 — Récup post-garde WE : le moteur favorise des jours libres après les gardes weekend. Ven garde → 1j récup (lundi), Sam → 2j (lundi + mardi), Dim → 1j (mardi, lundi = repos). Cross-mois via contexte M-1.
NouveauColonne Récup dans le récapitulatif par médecin : affiche le ratio jours de récup pris/dus avec code couleur (vert si OK, orange si partiel, rouge si déficit).
v1.0.126/02/2026
NouveauRégénération partielle : quand on régénère un mois en cours, les jours passés (≤ aujourd'hui) sont automatiquement figés. Le moteur ne recalcule que les jours restants. Utile pour les changements de dernière minute (arrêt maladie, remplacements).
AméliorationConfirmation adaptée : le dialogue de régénération indique combien de jours seront conservés quand le mois est en cours.
AméliorationToast informatif après régénération : affiche le nombre de jours conservés (ex: '26 jours conservés').
v1.0.026/02/2026
MoteurUnified Weekly Availability : suppression complète du modèle fixed_unavailabilities (H4 + S9). Les disponibilités hebdomadaires sont désormais gérées exclusivement par les whitelists available_post_weekdays et available_oncall_weekdays (H16).
MoteurHéritage oncall : si available_oncall_weekdays est vide et available_post_weekdays est renseigné, la garde hérite les restrictions postes en semaine. Le WE reste toujours ouvert.
Améliorationdoctors.json migré : CA, LB, SB, AT, ES convertis de fixed_unavailabilities vers les whitelists + availability_note descriptif. SB mardi IME devient un désidérata prefer_not.
AméliorationTypeScript full-stack nettoyé : interface Unavailability supprimée, constraint-validator et doctor-constraints-check réécrits pour les whitelists, month-calendar simplifié (offWeekdays booléen), doctor-section affiche availability_note.
v0.9.926/02/2026
MoteurH16 réécriture : modèle blacklist (oncall_forbidden_weekdays) remplacé par deux whitelists optionnelles — available_post_weekdays et available_oncall_weekdays. Si vide = aucune restriction. Si renseigné = seuls ces jours sont autorisés pour postes ou garde.
MoteurH16 : bypass désidérata identique à H4 — AVAILABLE lève toutes les restrictions du jour, REQUEST_ONCALL lève uniquement la restriction garde. LB passe de 'pas de garde mardi' à 'garde uniquement lundi'.
AméliorationSettings UI : section 'Jours sans garde' remplacée par deux whitelists (jours poste autorisés + jours garde autorisés). UX : vide = tous les jours autorisés, clic = toggle inclusion/exclusion.
AméliorationVue planning responsive : toolbar en colonne sur mobile, onglets médecins scrollables horizontalement, boutons action avec retour à la ligne, grille table scrollable horizontalement.
MoteurFix biais annuel : compute_annual_guard_stats ne compte plus que les mois de l'année civile cible (jan→mois précédent). Sept-déc 2025 n'influencent plus le planning 2026.
v0.9.726/02/2026
MoteurH4 + désidérata : AVAILABLE sur un jour hard-off lève la contrainte pour tous les rôles ce jour-là. REQUEST_ONCALL lève H4 pour la garde uniquement. Le solver peut enfin respecter 'je suis dispo mercredi exceptionnellement'.
MoteurS10 adapté : la pénalité 'garde avant jour off' est désactivée quand le médecin a posé AVAILABLE ou REQUEST_ONCALL sur le lendemain — cohérence avec la levée de H4.
FixIcône 🔒 verrou admin masquée pour les médecins — visible uniquement par les admins dans la grille de planning
FixAudit 'Vérification des règles' : comptage des gardes recalculé depuis le planning affiché (activeDays) au lieu du snapshot solver — plus de désynchronisation après edits sauvegardés
FixPopover d'affectation : les jours de contexte (mois précédent) exclus du comptage de gardes — plus de faux 'N gardes ce mois (cible M)'
v0.9.525/02/2026
NouveauVerrous admin : Cécile peut verrouiller un médecin sur un poste précis avant de lancer le solver (ex: 'HM de garde le 16/04'). Priorité absolue sur toutes les règles.
MoteurContrainte H15 : admin_locked_assignments — force x[day][doc][role]==1. Override H4 (indisponibilités fixes) et H13 (allowed_posts). 4 tests PASS.
NouveauVue désidérata : section 'Verrous admin' par médecin — liste des locks actifs + formulaire date/poste + indicateur 🔒 dans le calendrier
AméliorationPlanning view : cellules verrouillées surlignées amber avec 🔒 — visibilité de ce qui est figé
NouveauTable Supabase admin_locks (migration 008) : persistance par mois/date/poste avec audit trail
v0.9.425/02/2026
MoteurContrainte H14 : shift_24h_only — certains médecins (HM) ne viennent qu'en 24h. Si affectés à un poste, ils doivent aussi être de garde ce jour-là.
NouveauSettings Config : toggle 'Garde seule (24h)' par médecin dans la section Profil
AméliorationValidator front : H14 détecte les violations (poste sans garde pour shift_24h_only) dans l'éditeur et la vue complète
v0.9.325/02/2026
AméliorationConcurrence Régénérer : lock optimiste (10 min TTL) — 2 admins ne peuvent plus lancer deux générations simultanées. Le 2e voit le bouton disabled avec tooltip 'En cours par X'.
AméliorationUX attente Régénérer : modal 5 étapes avec barre de progression estimée + purge du wording technique 'solver'
FixAudit trail : 'generated_by' n'était jamais renseigné (toujours 'unknown'). Corrigé : doctorId passé dans le body du fetch.
NouveauToolbar planning : affiche 'Généré par X · date' — traçabilité de qui a lancé la dernière génération
v0.9.225/02/2026
FixBug lifecycle brouillon : router.refresh() ajouté après dé-validation — dashboard affiche maintenant le bon mois
FixNextActionCard : statut 'brouillon' (draft) inclus dans la priorité 1 (à valider)
AméliorationAdmin override : les médecins en violation dure sont maintenant cliquables (⚠️ + texte rouge) — c'est l'admin qui décide, pas le solver