MoteurCinq règles demandées par le service des urgences pédiatriques sont actives : un médecin junior n’est jamais seul en garde, un seul créneau de garde par week-end (sauf en juillet et en août), pas plus de deux journées complètes de médecine d’affilée, le jour d’une doublure la matinée reste libre et l’après-midi peut aller en médecine, et trois week-ends de lits portes par personne et par année civile au plus.
v8.295.012/09/2026
FixLe lendemain d’une doublure : la matinée reste au repos, comme le service l’a demandé, et l’après-midi redevient possible quand le planning l’exige. Jusqu’ici le moteur fermait la journée entière, plus strict que la demande.
FixLe plafond de trois week-ends de lits portes par an compte maintenant tous les mois de l’année, y compris ceux déjà planifiés après le mois qu’on génère. Regénérer un mois ancien pouvait dépasser le plafond sans alerte.
FixUn réglage de fiche créé pour un service ne s’écrit plus dans un autre, même par l’enregistrement de la fiche côté administrateur : la clé est ignorée là où elle n’a pas cours.
v8.294.011/09/2026
FixLes réglages de fiche créés pour un service précis restent à ce service. Onze réglages (les gardes de 24 heures, les jours à éviter, l’ordre des créneaux, la moitié fixe du mois, les quotas par type de garde, entre autres) s’affichaient dans tous les services et y auraient agi si quelqu’un les avait cochés. Ils n’apparaissent plus ailleurs, et le moteur les ignore même s’ils sont présents sur une fiche. Aucune fiche n’était concernée : rien ne change dans vos plannings.
v8.293.011/09/2026
MoteurQuatre nouvelles règles, prêtes pour Trousseau et éteintes tant qu’elles ne sont pas activées : un seul créneau de garde par week-end (les lits portes du samedi et du dimanche comptent pour un), pas plus de deux journées complètes de médecine d’affilée, le jour d’une doublure la matinée libre et, l’après-midi, la médecine et aucun autre poste, et trois week-ends de lits portes au plus par personne et par année civile. Ce sont des préférences fortes, pas des interdictions : le planning sort toujours.
v8.292.011/09/2026
NouveauNouveau réglage sur la fiche d’un médecin, pour les services qui l’ont demandé : « Jamais seul en garde ». Un médecin marqué, un docteur junior par exemple, n’est posé sur une garde que si un sénior est présent du début à la fin de sa garde ; plusieurs séniors peuvent se relayer. Tant qu’aucune fiche ne porte le réglage, rien ne change dans vos plannings.
v8.291.011/09/2026
FixSi un type de garde est renommé ou supprimé, l’enregistrement d’une fiche qui le cite encore est maintenant refusé, avec le nom du type en cause : côté Équipe comme dans « Mon profil ». Jusqu’ici l’enregistrement réussissait, et c’est la génération du mois qui s’arrêtait ensuite pour tout le service. Il suffit de retirer la ligne concernée ou de choisir un type proposé.
v8.290.011/09/2026
FixUne préférence de garde mal formée sur une fiche (un jour mal écrit, une liste de types de garde abîmée) est maintenant refusée à l’enregistrement ; si elle arrive quand même jusqu’au moteur, la génération s’arrête avec un message qui nomme le médecin et le réglage à corriger. Jusqu’ici, elle était ignorée sans avertissement et le planning sortait sans elle ; une liste abîmée pouvait même étendre la préférence à toutes les gardes. Aucune fiche actuelle n’est concernée.
FixUn type de garde inconnu cité dans ces préférences (faute de frappe, type renommé ou supprimé) arrête aussi la génération, en nommant le médecin et le type en cause. Il décalait jusqu’ici tout le classement d’un rang, ou rendait la journée réservée sans effet, sans que rien ne le dise. Les types de garde d’une autre saison restent acceptés. Si un type est renommé, les fiches qui le citent sont à corriger avant de générer.
v8.289.011/09/2026
FixNovembre a été régénéré trois fois avec les réglages d’aujourd’hui et revérifié : l’équilibre des dimanches est respecté les trois fois, et plus aucun médecin n’en a deux quand un collègue n’en a aucun. Il reste une alerte, sur la régulation confiée à des séniors arrivés récemment : leur date d’arrivée n’est pas renseignée, et sans elle le moteur ne peut pas savoir quand finissent leurs deux premiers mois.
v8.288.011/09/2026
FixLa journée réservée autour d’une garde peut maintenant viser un jour de garde précis. Pour Mélusine, « off le vendredi si de garde le samedi » réservait aussi la veille des jours fériés, puisque sa garde de journée y tourne : le 10 novembre, le 24 et le 31 décembre. Ce n’était pas demandé. Sa fiche vise désormais la seule garde du samedi, et ce choix se fait à l’écran.
MoteurLa journée réservée autour d’une garde tient maintenant d’un mois à l’autre. Si Mélusine est de garde le samedi 1er, son vendredi 31 est protégé : le moteur ne regardait que le mois en cours, et ce vendredi-là lui échappait. Il lit désormais les gardes déjà publiées du mois voisin.
MoteurNous avons cherché pourquoi certains médecins avaient deux dimanches en novembre quand d’autres n’en avaient aucun. Ni le nombre de médecins disponibles ni vos autres règles ne l’imposaient : le moteur ne trouvait pas, dans son temps de calcul, la répartition qu’il savait pourtant meilleure. Une nouvelle règle l’y aide en comptant chaque dimanche au-delà de la part de chacun. Sur novembre, elle donne au plus un dimanche par médecin à chaque essai. Elle est activée pour votre service depuis le 11 septembre.
v8.287.010/09/2026
FixUn créneau ajouté au catalogue pouvait passer pour « le même créneau à une autre saison » alors qu'il tournait toute l'année : il aurait été imposé chaque soir de semaine, et les contrôles l'annonçaient conforme. Deux créneaux jumeaux doivent maintenant couvrir des périodes qui ne se chevauchent pas.
FixLe contrôle de la doublure supplémentaire vérifiait qu'il en existe une par mois concerné, jamais qu'il n'y en a qu'une : deux auraient été postées chaque nuit de janvier sans un mot. Il compte désormais, et il surveille aussi la doublure du vendredi, qui n'était bornée par personne.
FixLe lit porte de week-end pouvait être tenu par deux créneaux le même jour — deux médecins sur un siège que le service tient à un — sans que le contrôle de couverture le voie : il ne regardait que les postes de journée.
v8.286.010/09/2026
FixLes vacances scolaires 2027-2028 avaient été ajoutées au moteur mais pas au calendrier de saisie des désidérata : les vacances de la Toussaint 2027 n'y auraient pas été grisées. Les deux tables sont de nouveau d'accord, et un garde-fou refuse maintenant un enregistrement qui n'en modifie qu'une.
AméliorationLe contrôle de couverture ne regardait qu'un seul sens : un poste obligatoire sans personne. Il voit désormais aussi l'inverse — deux créneaux qui se chevauchent sur un poste qui n'en veut qu'un, ce qui poserait deux médecins au lieu d'un sans que le planning ait l'air faux.
v8.285.010/09/2026
NouveauLe calendrier du service va maintenant jusqu'à fin octobre 2027 au lieu de fin août. Sont revenues à leur place les règles qui tombaient après l'été : la doublure supplémentaire d'octobre, la réouverture des lits portes au 1er septembre puis leur second siège au 1er octobre, le lit porte court de septembre.
FixLe poste de 13h-21h n'avait aucun créneau après sa pause d'été : septembre et octobre seraient sortis sans lui, sans message d'erreur. Le contrôle de couverture l'a signalé — 43 journées ouvrées sans personne sur un poste obligatoire.
FixTrois contrôles jugeaient à partir d'une liste de noms de créneaux figée, et voyaient les créneaux d'octobre comme des inconnus. Ils lisent désormais l'horaire, qui est la définition que le service donne lui-même.
v8.284.010/09/2026
AméliorationLe moteur connaît maintenant les vacances scolaires de la zone parisienne pour l'année 2027-2028 : Toussaint, Noël et hiver. Les vacances de printemps 2028 attendent une décision — elles se terminent un 1er mai, jour férié, et l'outil ne sait pas encore distinguer un lundi de rentrée d'un lundi férié. Tant qu'elles manquent, l'application refuse simplement de générer un mois qu'elle ne saurait pas décrire.
FixLe panier d'équité du jeudi n'avait jamais été observé par le contrôle qui vérifie où les gardes sont comptées : il était éteint par défaut, et un compteur non observé se lisait comme un compteur vide. Sans effet sur les plannings produits jusqu'ici.
v8.283.010/09/2026
FixLe report des gardes déjà faites était mal converti dans le nouveau comptage. Deux médecins séparés d'une garde entière pouvaient se retrouver avec le même report, donc l'équilibrage les voyait à égalité alors qu'ils ne l'étaient pas. Corrigé — et l'historique portait déjà le détail par créneau, contrairement à ce que nous avions supposé.
FixUn créneau déclaré comme comptant double aurait pu rendre le mois introuvable, sans message. La borne interne du compteur d'équité supposait qu'aucun créneau ne vaut plus d'une garde ; elle se calcule maintenant sur les valeurs réellement déclarées. Un poids qui ne tombe pas sur une demi-garde (0,25 par exemple) est désormais refusé au chargement plutôt qu'arrondi en silence — arrondi à zéro, le créneau devenait gratuit.
MoteurUn samedi matin de lits portes ne compte plus pour un week-end entier. Vous écrivez que LP6, DV1 et DV2 valent « un demi G19/G18/G8 » : le moteur, lui, comptait des journées, donc quelqu'un qui prenait deux samedis matin passait pour avoir fait deux week-ends complets et se voyait retirer d'autres gardes. Chaque créneau porte désormais son poids, et le week-end complet de lits portes vaut bien une unité — une demi-unité le samedi, une demi-unité le dimanche. Une seule réserve : DW, la demi-garde de week-end de 18h à 23h, compte toujours pour une garde complète, parce que votre phrase ne la nomme pas. Nous préférons vous poser la question.
v8.282.010/09/2026
FixUne vérification qui devait signaler un poste ouvert un mois où vous le fermez pouvait passer à côté. Elle recopiait la règle du moteur qui décide si un créneau est ouvert à quelqu'un, et elle l'avait recopiée à l'envers dans un cas : une liste de médecins autorisés laissée vide veut dire « tout le monde » pour le moteur, et cette copie comprenait « personne ». Corrigé, avec le raisonnement écrit à côté pour que la prochaine recopie ne reparte pas de zéro.
FixUne date de période mal écrite dans la configuration faisait mourir l'outil de vérification entier : aucun verdict, juste une erreur technique. Le contrôle qui sait justement diagnostiquer une date mal écrite n'était jamais atteint. Désormais un contrôle qui échoue est signalé comme tel et les quarante-neuf autres s'affichent quand même.
FixLe contrôle du nombre de lits portes de semaine ne mesurait plus rien : il comptait les postes déclarés, or les deux existent toute l'année et c'est leur période d'ouverture qui change. Il compare maintenant, jour par jour, le nombre réellement ouvert à celui que vous indiquez — deux d'octobre à février, un de mars à septembre, zéro en août.
NouveauVotre calendrier annuel est maintenant écrit en entier, de novembre 2026 à fin août 2027. Le lit porte de week-end passe en LP6 de mars à juillet et le second lit porte de semaine ferme après février, comme vous l'indiquez ; les deux ferment en août. Le poste polyvalent, qui n'existait nulle part chez nous, ouvre en journée la première quinzaine de mai puis en après-midi jusqu'à fin juin. Le 13-21h s'arrête pour la pause d'été. La doublure supplémentaire de janvier tourne en semaine et le vendredi. Chaque période reprend la phrase de votre document qui la fonde.
MoteurUn poste fermé et un poste oublié se ressemblaient trait pour trait : dans les deux cas, aucun créneau ouvert ce jour-là. Vos fermetures voulues — la chirurgie à Noël, les lits portes en août, le polyvalent le reste de l'année — sont désormais écrites comme telles, avec votre phrase à côté. Résultat : une fermeture que vous n'avez pas demandée est signalée, et un poste qui tournerait un mois où vous le fermez l'est aussi. Ce second cas était le plus dangereux, parce qu'un poste pourvu à tort donne un planning qui a l'air complet.
AméliorationLa saison s'arrête au 31 août 2027 et pas plus loin, parce que c'est là que s'arrête le calendrier scolaire officiel que nous connaissons. Septembre et octobre attendent les dates 2027-2028. Nous préférons refuser de générer un mois plutôt que de le générer sur un calendrier deviné.
v8.281.010/09/2026
MoteurUn poste obligatoire ne peut plus disparaître d'un mois sans que rien ne le dise. Vos postes ouvrent et ferment selon la saison : la chirurgie s'arrête pendant les vacances de Noël, le second lit porte ne tient que d'octobre à février. Jusqu'ici, un poste qui n'avait plus aucun créneau ouvert un jour donné n'était pas signalé — le mois sortait complet et sans erreur, simplement amputé de ce poste. Un balayage vérifie désormais, jour après jour, que chaque poste obligatoire a bien un créneau et que chaque nuit a bien une garde. Une fermeture voulue, comme celle de Noël, est écrite avec la phrase qui la fonde ; une fermeture non écrite est refusée.
NouveauLe catalogue va maintenant jusqu'à fin février 2027 au lieu de s'arrêter au 31 décembre. La chirurgie et le 13-21h reprennent le 4 janvier, le second lit porte et le lit porte de week-end s'arrêtent fin février comme vous l'indiquez, et la doublure supplémentaire DG2 tourne en janvier. Les périodes sont écrites comme vous les formulez — « du premier lundi de novembre au premier dimanche des vacances de Noël » — et non en dates fixes : les bornes de cette année se recalculent à partir de vos règles et retombent au jour près.
v8.280.011/09/2026
FixSur la vue d’ensemble du mois des désidérata, l’infobulle au survol d’une case n’apparaissait qu’une fois sur deux. Elle était en réalité réservée aux cases portant un créneau de garde : un congé, une formation ou un souhait sans créneau n’en avaient aucune, ce qui donnait l’impression d’un affichage aléatoire. Toute case renseignée en porte une désormais.
AméliorationCette même infobulle affiche maintenant la précision écrite par le médecin. Le texte libre existait, il se lisait sur le calendrier d’un médecin, mais la vue d’ensemble ne le transportait pas : aucun geste ne permettait de le voir sur cet écran. Sur une journée coupée en deux, chaque précision reste attachée à sa moitié.
v8.279.010/09/2026
MoteurL’ordre de préférence des créneaux ne servait à rien, et il a fallu regarder un vrai planning pour le voir. En régénérant novembre, Mélusine n’obtenait aucun de ses quatre choix et héritait du samedi NUIT, qu’elle n’avait pas classé — alors que votre document dit qu’elle préfère la journée. En cause : son premier choix ne coûtait rien, mais un créneau non classé non plus, donc les deux étaient à égalité. Désormais un type de garde non classé UN JOUR QU’ELLE MENTIONNE compte comme son dernier choix. Elle obtient maintenant son samedi journée.
AméliorationUn jour dont le médecin n’a rien dit reste entièrement libre. Le bloc de Mélusine ne parle que du week-end et du vendredi : ses gardes de semaine ne sont pas concernées, sans quoi nous lui prêterions une préférence qu’elle n’a jamais exprimée.
NouveauChaque médecin peut désormais classer ses propres créneaux depuis « Mon profil », comme il règle déjà ses jours préférés. La journée réservée autour d’une garde reste, elle, entre vos mains : c’est le service qui décide de réserver la journée de quelqu’un, et la déplacer ferait retomber les postes sur les collègues.
FixLe planning de novembre a été rejoué et re-vérifié : Nathalie n’est plus postée le jour de ses gardes, et une deuxième alerte est tombée avec elle. Il en reste trois, dont une sur l’équilibre des dimanches que nous avons vérifiée indépendante de ces changements.
v8.278.010/09/2026
FixUne relecture du code livré a trouvé quatre défauts dans les deux réglages de garde d’hier, tous corrigés. Le plus sérieux : dans un classement, une ligne incomplète ou mal orthographiée gardait sa place et rendait plus chères toutes celles d’en dessous, sans que rien ne l’indique. Ces lignes-là sont maintenant refusées plutôt que gardées.
FixLaisser le type de garde vide voulait dire « toutes les gardes » dans un réglage et « aucune » dans l’autre. C’est désormais « toutes » dans les deux, ce qui était le sens attendu. Aucun réglage existant ne change de comportement.
FixAjouter deux fois la même ligne ne la comptait pas deux fois à l’écran mais la facturait deux fois au moteur. Le bouton d’ajout propose maintenant la première combinaison encore libre, et les doublons sont écartés à la lecture.
AméliorationLe classement gagne une flèche « descendre ». Il n’y avait qu’une flèche « monter », donc faire redescendre une ligne obligeait à remonter toutes les autres.
v8.277.010/09/2026
AméliorationUn refus de reprise dit maintenant qu’il refuse. Quand vous êtes en formation, absent ou déjà posté ce jour-là, la fenêtre « Proposer de reprendre » listait bien le conflit en rouge, mais elle laissait un champ de message et un bouton d’envoi qui ne partait pas. Le clic ne faisait rien, et rien ne l’expliquait. Elle annonce désormais « Reprise impossible » au-dessus des raisons, et invite à voir avec le ou la responsable du planning si la reprise doit se faire malgré tout. Le champ de message et le bouton disparaissent, puisqu’il n’y a rien à envoyer. Ce qui était refusé le reste : un collègue de journée attendrait quelqu’un arrivant tard, et c’est à un responsable de l’arbitrer.
FixLa même fenêtre écrivait « le planning ne change que si elle accepte », quel que soit le collègue à qui la proposition était faite. Elle écrit maintenant « si la proposition est acceptée ».
v8.276.010/09/2026
NouveauLes deux nouveaux réglages de garde se saisissent maintenant sur la fiche du médecin, dans les Réglages. L’ordre de préférence se compose en lignes que vous réordonnez avec une flèche : le premier de la liste est le créneau le plus voulu. La journée réservée se règle en choisissant le décalage par rapport à la garde et le type de garde concerné, ou « toutes ses gardes ».
AméliorationVous n’avez donc plus besoin de nous pour ces deux réglages : c’était la seule famille de préférences que vous ne pouviez pas modifier vous-même. Les autres l’étaient déjà toutes.
v8.275.010/09/2026
FixLes descriptions retirées de « Dispo » et « Souhait de récup » revenaient à l’écran. La configuration les avait bien vidées — et la vérification d’écriture le confirmait — mais la lecture jetait les textes vides en les prenant pour une absence de réglage, et le texte d’origine reprenait sa place. Un texte effacé est un choix, il est désormais respecté. Un NOM de bouton vide reste ignoré : ce n’est pas un choix, c’est une faute de frappe, et mieux vaut le nom d’origine qu’un bouton anonyme.
v8.274.010/09/2026
NouveauLes préférences de Nathalie et de Mélusine sont renseignées. La journée qui précède les gardes de Nathalie lui est désormais réservée, comme votre document le demande, et le moteur évite d’y placer un poste. Mélusine a son classement de créneaux dans l’ordre exact que vous avez donné, ainsi que son vendredi libre quand elle est de garde le samedi.
MoteurNous avons pris votre réponse au mot sur un point : vous écriviez « ne pas la poster avant ses gardes » à une question qui vous demandait si cela valait pour TOUTES ses gardes. La règle couvre donc aussi les demi-gardes de semaine, qui commencent à la même heure que les gardes de nuit et devant lesquelles la journée vaut autant pour ses AIG. Le contrôle qui vérifie cette règle n’en surveillait que la moitié ; il les couvre maintenant toutes.
AméliorationSur le mois de novembre, ces réglages retirent un à deux placements que vous auriez eu à corriger à la main. C’est peu, et c’est voulu : ces règles sont des garde-fous, pas des corrections de masse. Elles restent souples — le moteur passe outre s’il n’a pas d’autre solution, et l’écran Moteur vous dit quand c’est arrivé.
v8.273.010/09/2026
MoteurUn médecin peut désormais CLASSER ses créneaux de garde, et pas seulement les cocher. « Samedi journée, puis vendredi nuit, puis dimanche journée, puis dimanche nuit » : jusqu’ici les quatre auraient été mis sur le même plan, ce qui effaçait exactement l’arbitrage demandé. Le moteur donne maintenant le premier choix quand il peut, et descend la liste quand il doit. Le premier cran ne coûte rien : classer ses préférences ne pénalise personne par rapport à un collègue qui n’a rien dit.
MoteurUne journée peut être réservée autour d’une garde. Deux demandes se rejoignaient sans qu’on le voie : « ne pas la poster avant ses gardes » pour l’une, « off le vendredi si de garde le samedi » pour l’autre. C’est la même chose à un décalage près, et le moteur évite maintenant de poser un poste ce jour-là. Le champ voisin, « jour off conditionnel », aurait fait l’inverse dans les deux sens : il coûtait chaque vendredi, garde le samedi ou non, et regardait la veille là où vous parlez du lendemain.
AméliorationCes deux réglages existent dans le moteur mais ne se saisissent encore sur aucun écran : ils demandent une mise en place de notre côté. Aucun planning déjà produit n’en est modifié, sur aucun service.
v8.272.010/09/2026
AméliorationLe pavé d’explication qui s’ouvrait sous le statut choisi a disparu. Il redisait en quatre lignes ce que le bouton porte déjà sous son libellé — et il le redisait faux : ses deux pastilles annonçaient encore « pas de garde » sur des statuts qui ne ferment plus la garde du soir. Une seule chose y survit, parce qu’elle corrige au lieu de répéter : la phrase qui apparaît sur une demi-journée, « le matin seulement : vous restez affectable à une garde de 18h à 9h ».
AméliorationQuatre statuts perdent la phrase sous leur nom. « Je veux » et « Je ne veux pas » ne disent plus « poste possible » : vous choisissez les postes après la diffusion de la liste de garde, donc la mention parlait d’une étape qui n’a pas encore eu lieu. « Dispo » et « Souhait de récup » perdent la leur, que le libellé disait déjà.
Amélioration« Congé sans solde » est retiré de la palette. Vérifié avant de l’enlever : aucun désidérata de votre service ne porte ce statut, donc aucune saisie ne devient illisible.
FixLe bandeau de transmission parle de la « liste de garde » et non plus du « planning ».
v8.271.010/09/2026
NouveauVous pouvez enfin dire « je veux le jour mais pas la nuit ». La préférence de garde n’avait que DEUX cases, et votre service les avait dépensées à séparer la doublure de la garde complète — or un samedi en distingue trois : la journée, le soir, la nuit. « Le jour » et « la nuit » tombaient donc du même côté, et la seule issue était de l’écrire en commentaire pour que vos responsables le placent à la main. Le sélecteur propose désormais trois créneaux : La journée, Le soir, La nuit. Ce sont vos mots — votre document dit « samedi jour dimanche nuit », « vendredi nuit ou samedi journée », « pas de dimanche soir ».
AméliorationChaque créneau affiche ses horaires et ce qu’il recouvre. « La journée » dit 08h30 → 18h00 ou 19h30, et 11h00 → 23h00 : les lits portes, la garde de jour et la garde décalée. « Le soir », 18h00 → 23h00, les doublures. « La nuit », les gardes qui passent minuit. Ces horaires sont calculés depuis votre catalogue, pas recopiés : une garde ajoutée apparaît d’elle-même, et aucune ne peut manquer à l’appel.
AméliorationUn jour qui n’ouvre aucune garde du créneau choisi se grise avant le clic, et le survol dit pourquoi. « La journée » armée, la semaine s’estompe — sauf les jours fériés, que le moteur traite comme des dimanches : les gardes de week-end y sont ouvertes, et c’est le seul moment de la semaine où une garde de journée existe.
FixLes onze types de garde de votre service sont classés une fois chacun, et un contrôle refuse d’écrire un classement qui en oublierait un ou en nommerait un qui n’existe pas. Les autres services ne déclarent aucun créneau et ne bougent pas d’un caractère : leurs désidérata déjà saisis gardent leur sens, et le modèle envoyé au moteur est vérifié identique au bit près sur quatre mois.
v8.270.010/09/2026
AméliorationUn jour dont vous n'avez rempli que le matin ne s'annonce plus comme une journée entière. Le calendrier signale désormais trois états à une synthèse vocale — rempli, à moitié rempli, vide — là où il n'en distinguait que deux. Sans effet à l'œil : c'est ce que le logiciel dit de la case, pas ce qu'il en montre.
v8.269.010/09/2026
FixOn peut enfin décocher un statut : recliquez-le et il se désarme. Il n’y avait aucun moyen de le faire — une fois un statut choisi, tout clic sur le calendrier peignait, et le seul recours était de peindre puis d’effacer. Le besoin est né avec le panneau de lecture, qui donne une raison de cliquer un jour sans rien y poser.
FixCliquer un jour sans aucun statut choisi affiche son détail au lieu de vous reprocher de ne pas avoir choisi. L’application répondait « choisissez un statut » à quelqu’un qui venait de faire exactement ce qu’il voulait faire : consulter ce que le moteur retient de ce jour-là. Au clavier comme à la souris.
AméliorationLe point d’interrogation en haut de la palette a été retiré. Il dépliait un récapitulatif de tous les statuts, mais tout en bas de la carte, sous le champ de note : le bouton en haut, le contenu hors écran, et sur téléphone aucun effet visible. Surtout, ce récapitulatif annonçait encore « pas de garde » sur les statuts qui ne ferment plus la garde du soir — un écran d’aide qui contredit le moteur est pire qu’une absence d’aide. Ce que chaque statut ferme est écrit sous le statut lui-même, et le panneau de lecture le dit jour par jour.
v8.268.010/09/2026
FixVos médecins d'étage ne lisent plus qu'on leur demande une réponse qu'on ne leur demande pas. Novembre pose deux questions — les gardes et la journée — mais la seconde ne concerne que l'équipe des urgences. Les médecins d'étage voyaient malgré tout « Novembre vous demande deux réponses », et la ligne « Ma journée » marquée « figé », alors que cette collecte n'a jamais été fermée : elle ne leur est simplement pas adressée. Beaucoup y auraient lu une échéance manquée. Ils voient désormais leur seule question, et le mot « figé » est réservé à ce qui a vraiment été clos.
FixLe calendrier des désidérata se remplit au clavier. Entrée ou Espace sur un jour pose le statut choisi, comme un clic. Les jours étaient déjà atteignables à la touche Tab, mais ils ne réagissaient qu'à la souris et au doigt : on pouvait parcourir le mois entier sans jamais rien pouvoir y inscrire, et sans le moindre message. Cela vaut aussi pour la commande vocale et les contacteurs.
FixSur téléphone, un jour tapé du doigt s'inscrit même si le doigt tremble. Un léger mouvement vers le bas suffisait à annuler le geste entier, sans rien afficher : on tapait un jour et il ne se passait rien. Et quand le téléphone reprenait la main pour faire défiler la page au milieu d'un balayage, la sélection abandonnée restait en mémoire — le geste suivant, même un simple appui, la réinscrivait par-dessus. On posait un jour, on en obtenait trois.
FixUn mois dont aucune collecte ne vous concerne vous le dit, au lieu de n'afficher rien. Le cas se produit quand le service lance une collecte à laquelle vous n'appartenez pas — les gardes seules alors que vous n'en faites pas, ou la journée seule quand vous êtes d'étage. L'écran affiche désormais une ligne : aucune collecte ne vous concerne ce mois-ci, et vos congés et arrêts maladie restent déclarables à tout moment.
AméliorationLe calendrier des désidérata est plus fluide au doigt. Le nom de chaque jour était recalculé à chaque redessin, trente fois par image pendant un balayage — assez pour faire saccader le geste sur un téléphone. Le calcul est fait une fois pour toutes : cinquante fois moins de travail par image.
AméliorationLes écrans se lisent mieux, à l'oreille comme à l'œil. Les quatre cases du code PIN se présentent enfin (elles n'avaient aucun intitulé, sur le tout premier écran d'une nouvelle arrivée) ; chaque jour du calendrier annonce sa date en toutes lettres et son statut plutôt qu'un numéro suivi d'un point d'interrogation ; le statut sélectionné dans la palette ne se signale plus par sa seule couleur ; et le texte des pastilles « à transmettre », « transmis », « figé » a été assombri pour passer le seuil de lisibilité — il était le plus pâle de l'application, sur l'information qui compte le plus. Les couleurs de la charte, elles, n'ont pas bougé.
v8.267.010/09/2026
FixUn médecin que vous placez à la main, et qui a dit ne pas faire de 24 h, ne bloque plus la génération du mois. Quatre de vos médecins ne sont posés QUE par vous, jamais par le moteur : c'est leur mode de fonctionnement normal. L'un d'eux refuse les 24 h le week-end. Si vous lui posiez ses deux gardes du samedi, le refus et vos deux placements se contredisaient et le mois entier devenait introuvable, sans qu'aucun message ne nomme ni la personne ni la date. Désormais deux placements manuels le même jour valent votre accord explicite : c'est vous qui écrivez l'exception. Un seul placement laisse le refus mordre, et le moteur ne compose jamais un 24 h de lui-même chez quelqu'un qui n'en veut pas.
AméliorationDeux mois passés de Rochefort ne se régénéreraient pas aujourd'hui, et ce n'est pas une panne : le vendredi 15 mai 2026, sept médecins sur onze sont absents, et il reste deux personnes pour quatre postes. Le planning de mai a été produit en mars, avant que ces absences ne soient saisies. Rien à corriger dans l'application ; c'est un trou d'effectif réel, à connaître avant de relancer un calcul sur un mois ancien.
v8.266.010/09/2026
FixLa période « chaque année » se saisit enfin. Le moteur savait déjà lire une période qui se répète — c'est la forme que vous employez, « sauf juillet et août », sans millésime — mais l'écran ne savait produire que des dates complètes, donc uniquement la forme qui devient fausse l'année suivante. Une case à cocher sous les deux dates règle la question, sur la fiche du médecin comme sur son profil. Trouvé en ouvrant la page, pas en relisant le code : les vérifications automatiques contrôlaient que les champs existent, pas ce qu'ils savent produire.
v8.265.010/09/2026
NouveauLe choix des 24 heures est maintenant renseigné pour les onze médecins dont votre document le précise. Huit refusent, Nicolas n'accepte que l'été, Nathalie penche plutôt pour et Romain plutôt contre. Chaque valeur reprend votre phrase telle qu'elle est écrite, sans rien déduire — et les quarante-huit autres restent sans consigne, parce que le document n'en donne aucune pour eux.
MoteurUn médecin peut pencher sans interdire. Vous écrivez « plutôt 24h » pour l'une et « plutôt des 12h le week-end, sauf 24h en août si besoin » pour l'autre : ce ne sont pas des refus, et les traduire comme tels vous aurait retiré des gardes que vous comptez pouvoir poser. Le moteur suit maintenant ces penchants quand il peut et passe outre quand le planning l'exige. Votre « si besoin » n'a d'ailleurs pas eu besoin d'être daté : c'est exactement ce que fait une règle souple.
FixUn refus de 24 heures peut ne valoir que le week-end. Trois de vos huit refus sont écrits sous un intertitre « WE : » et un quatrième le dit en toutes lettres. Sans cette distinction, nous leur aurions interdit les 24 heures de semaine, que votre document n'évoque nulle part — une interdiction que nous aurions inventée, sur une règle stricte, et que rien à l'écran n'aurait expliquée.
AméliorationUne période peut se répéter chaque année. Vous écrivez « sauf juillet et août » et « 15 juillet – 15 août », jamais avec un millésime. Une date complète aurait été juste cette année et fausse la suivante, sans le moindre signal. Les deux formes sont acceptées : avec l'année pour une exception ponctuelle, sans elle pour une habitude de saison.
v8.264.010/09/2026
NouveauUn médecin peut enfin dire s'il fait des gardes de 24 heures, et n'accepter que sur une période. Votre cahier des charges le demande en toutes lettres, en contrainte dure : « choisir si souhaite faire 24h ou non », puis « uniquement sur une période (15 juillet – 15 août par exemple) ». Ce choix n'existait nulle part. Le seul champ au nom voisin faisait l'inverse : il imposait le 24 h au lieu de demander l'accord, et cette ressemblance l'a fait passer pour traité pendant deux jours. La période n'est pas un détail, c'est votre façon de limiter le nombre de week-ends travaillés — « pas de 24h les WE, sauf juillet et août » se saisit maintenant telle que vous l'écrivez.
MoteurLe moteur reconnaît un 24 h à sa durée, jamais à un nom de créneau. Vous en donnez trois exemples et aucune définition : posté la journée puis de garde en semaine, G8 suivi de G19 le week-end, et LP12 suivi de G19 qui « compterait 24h ». Les trois vont de 8h30 à 9h le lendemain. Le moteur mesure donc l'amplitude de la combinaison et la compare à 20 heures, ce qui laisse largement de la marge avec le cas que vous n'appelez jamais un 24 h : un poste de journée suivi d'une demi-garde, qui s'arrête à 14 heures et demie. Un service qui changerait ses horaires reste couvert sans qu'on touche au code.
FixL'alerte de saturation des désidérata ne vise plus que les médecins d'étage. Vous aviez écrit « pour les étages, j'aimerais qu'ils ne puissent pas bloquer plus de la moitié des week-ends » ; nous l'avions appliquée à tout le monde. L'équipe des urgences, qui tient aussi les postes de journée, n'a jamais été concernée. Une alerte qui se déclenche sur des gens qu'on ne voulait pas contraindre apprend à être ignorée, et cesse alors de servir pour ceux qu'elle vise.
AméliorationLes deux réglages de 24 heures sont désormais côte à côte sur la fiche du médecin, avec la différence écrite noir sur blanc. L'un impose la garde le jour où le médecin est posté, l'autre demande son consentement. Ils se ressemblaient assez pour être confondus, y compris par nous.
v8.263.009/09/2026
MoteurUn médecin peut enfin dire les jours où il préfère NE PAS être de garde. Votre cahier des charges le demandait, et nous avions cru pendant deux jours que le réglage voisin le portait : c'est l'inverse, « jours de garde préférés » attire les gardes au lieu de les éloigner. Quelqu'un qui y aurait listé ses mardis pour les fuir s'en serait vu donner. Ce sont donc deux réglages distincts, avec deux titres, et cocher un jour d'un côté le décoche automatiquement de l'autre.
FixLe jour de garde préféré d'un médecin comptait double quand son ancienne fiche et la nouvelle portaient la même valeur. Deux champs se sont succédé pour le même réglage, et le moteur additionnait les deux : le mardi d'une praticienne de Rochefort valait deux fois le tarif annoncé, sans que rien à l'écran le dise. Mesuré : quatorze préférences sur trois mois, toutes sur la même personne, toutes ramenées à leur prix affiché. Effet de bord réparé au passage : un médecin qui décoche tous ses jours depuis son profil ne pouvait pas retirer une préférence portée par l'ancien champ, invisible partout.
NouveauLe lit porte du week-end se demande ou se refuse. C'est le créneau que presque tout le monde chez vous limite ou évite, et jusqu'ici celui qui le voulait et celui qui le fuyait avaient exactement les mêmes boutons. Trois positions, comme vous nous les avez décrites : au moins un par mois, un tous les deux mois, le moins possible. Une précision honnête sur la position du milieu : le moteur ne travaille que sur un mois à la fois, donc il sait refuser le deuxième du mois, mais il ne se souvient pas que vous n'en avez pas eu le mois dernier.
FixUne adresse e-mail mal formée saisie par un administrateur est refusée, comme celle saisie par le médecin depuis hier. L'asymétrie était plus grave que le trou d'origine : une adresse invalide posée sur une fiche verrouillait l'écran Notifications du médecin, qui la renvoyait à chaque enregistrement — il ne pouvait plus cocher une seule case. Les dix-neuf adresses actuellement en base passent toutes.
FixQuand le service modifie les préférences d'un médecin, sa fiche le dit maintenant. Elle continuait d'afficher « modifié par vous » avec une date périmée, sur le seul champ qui existe pour répondre à la question « pourquoi mon réglage a changé ? ». Un bandeau apparaît désormais sur la page de profil du médecin, avec la date.
AméliorationLes réglages des deux autres services sont prouvés intacts, pas supposés. Chaque mois de référence de Rochefort et de Libourne est reconstruit avant et après le changement et comparé au bit près : Libourne et Trousseau sont rigoureusement identiques, et les seuls écarts de Rochefort sont les quatorze préférences corrigées ci-dessus, isolées une à une.
v8.262.009/09/2026
NouveauUn médecin a maintenant une page « Mon profil », atteinte par son avatar en haut à droite. Onze lignes de votre cahier des charges commencent par « un médecin doit pouvoir choisir » et aucune n'avait d'écran : les quatre onglets de l'application regardent tous un mois donné, et ces réglages-là valent tous les mois. On y règle l'espacement souhaité entre deux gardes, le type de garde préféré, et les jours où l'on souhaite être de garde. La page dit ce que ces réglages valent : une préférence que le moteur suit quand il peut, que le service voit et peut reprendre.
AméliorationCette page n'est ouverte que sur les services qui la demandent, et elle démarre sur les urgences pédiatriques de Trousseau seules. Elle était partie ouverte partout, parce que son entrée vit dans l'avatar, qui s'affiche sur tous les services. Or à Rochefort et à Libourne ces réglages sont posés par la personne qui fait le planning, et quatre médecins en ont déjà : les leur ouvrir sans prévenir aurait déplacé qui décide, ce que personne n'avait demandé. Ouvrir un autre service tient en une ligne de configuration, le jour où il le demande.
FixLes quotas de gardes restent à l'administrateur, et ne figurent pas sur cette page. Baisser son propre quota reporte la charge sur ses collègues : c'est le seul réglage de cette famille dont l'effet retombe sur quelqu'un d'autre, et vous nous aviez autorisé l'auto-déclaration des préférences, pas des quotas.
FixLes soldes de RTT saisis par un médecin étaient acceptés par l'application et jamais enregistrés. La page annonçait « enregistré », le serveur répondait que tout allait bien, et le chiffre repartait comme avant au rechargement. C'est le même champ qu'une erreur avait effacé en juillet chez tous les médecins d'un service. Il est maintenant vérifié et écrit, et une année déjà saisie n'est plus effacée par la suivante.
FixUne adresse e-mail mal formée était enregistrée sans un mot. Elle repartait ensuite telle quelle chez notre expéditeur de courriels : le médecin ne recevait plus rien, et personne ne pouvait savoir pourquoi. Elle est maintenant refusée à la saisie, avec le nom du champ en cause.
v8.261.010/09/2026
NouveauGeler les gardes et geler la journée sont désormais deux boutons distincts, et chacun dit ce qu’il ferme avant d’être cliqué. Il n’y en avait qu’un : il visait la collecte que l’application choisissait pour vous, et vous ne lisiez laquelle que dans la fenêtre de confirmation. Or vous êtes deux responsables à geler, à deux dates différentes, et c’est précisément la raison pour laquelle ces deux collectes ont été séparées. Chaque bouton connaît l’état de son axe : l’un peut être gelé pendant que l’autre reste ouvert. Les services à collecte unique gardent leur bouton unique, au mot près.
FixPoser un statut de journée sur un samedi, un dimanche ou un férié était encore possible pour les responsables. Le refus existait depuis plusieurs jours, mais il était désactivé pour les comptes administrateurs — c’est-à-dire pour les trois personnes qui vérifient l’écran. L’exemption n’avait pas lieu d’être : un responsable est dispensé d’un verrou, pas d’une impossibilité, et il n’existe aucun poste de journée le week-end pour personne. Le calendrier le dit désormais AVANT le clic : les jours que le statut choisi ne peut pas changer s’estompent, et le survol explique pourquoi. Le refus reste derrière, pour le glissé qui traverse un samedi.
FixSur téléphone, les options « Garde concernée » débordaient de leur cadre. Elles étaient dessinées comme un sélecteur d’un seul tenant, ce qui suppose qu’elles tiennent sur une ligne — depuis qu’elles nomment le côté visé (« Pas de garde complète »), la troisième passait à la ligne à l’intérieur du cadre et laissait à côté d’elle une case vide bordée, qui ressemblait à un bouton. Chaque option porte maintenant sa propre bordure et le groupe passe à la ligne proprement. Le sélecteur de créneau, qui tient encore aujourd’hui mais serait tombé au premier mot plus long, est traité pareil.
AméliorationLes trois groupes de la palette gardent leur étiquette de couleur et perdent la phrase qui la répétait en plus long. Un écran qui explique deux fois se lit moins bien qu’un écran qui dit une fois.
v8.260.010/09/2026
FixTrois de nos preuves internes désignaient la mauvaise ligne de code : une instruction sans rapport, une ligne vide, et un intervalle qui commençait après sa fin. Elles venaient d'un recalage automatique fait après une modification du moteur. Corrigées, et deux règles en sortent : une preuve désigne la ligne qui FAIT la chose et non le commentaire qui la décrit, et le symbole cité doit précéder la référence. Un compteur bloque désormais toute nouvelle preuve invérifiable.
v8.259.010/09/2026
AméliorationUne nouvelle vérification automatique contrôle que les quotas de gardes par période sont bien ceux que vous avez décrits, ET qu’ils atteignent le moteur. Elle juge la fiche puis la résolution : une fiche juste dont le câblage serait rompu passait jusqu’ici pour correcte.
FixNos preuves internes de la forme « fichier, ligne » étaient devenues fausses pour treize d’entre elles : une modification du moteur avait décalé le code qu’elles désignent sans que rien ne les suive. Elles sont recalées, et l’outil qui les vérifie repasse au vert.
AméliorationL’exigence « les assistants à temps partagé font 50% des gardes des autres » est désormais mesurée sur la bonne assiette. Le chiffre publié la veille comptait aussi les gardes de week-end et de vendredi, que cette règle ne gouverne pas. Le diagnostic complet montre que 50% est inatteignable en novembre : le mois offre 32 créneaux de garde de semaine et vos deux règles en demandent 36. La question part au service.
v8.258.110/09/2026
FixLa légende sous le calendrier parlait une autre langue que la palette juste au-dessus. Elle annonçait « Congés », « Temps non clinique », « Activité externe » là où vous choisissez « Vacances », « AIG », « AIG extérieur » — et elle listait en plus les deux statuts que votre service ne propose plus, « Formation donnée » et « Plutôt pas de garde ». Trois statuts de plus qu’il n’en existe, sous des noms qui n’apparaissent nulle part ailleurs. Un statut masqué mais déjà posé sur le mois garde sa ligne : sinon sa couleur deviendrait illisible.
AméliorationLe panneau « Ce que le moteur retiendra » nommait trois lignes « Poste » à la suite. Elles disent maintenant le moment : poste du matin, de l’après-midi, de la journée. La coupure est à 13h00, exactement celle que le moteur applique pour décider ce qu’une demi-journée bloque.
FixL’écran affirmait « Transmis » au-dessus de deux lignes « à transmettre ». Votre dernier envoi datait d’avant la séparation des deux collectes et ne correspondait à aucun des deux axes : une pastille unique ne peut pas dire vrai quand la vérité a deux moitiés. C’est le bandeau, axe par axe, qui porte l’état.
FixLa liste des mois côté responsable annonçait « Non lancée » sur chacun d’eux. Il n’y a plus rien à lancer chez vous : ces mois sont ouverts, et c’est ce qu’ils disent. Et le bouton de relance envoyait encore l’ancienne notification, celle que votre service a retirée — il partait, l’application répondait « rappel déjà envoyé », et personne ne recevait rien. Il envoie désormais la relance des gardes.
v8.258.010/09/2026
NouveauL’écran des désidérata vous montre enfin ce que le moteur retiendra de votre journée. À côté du calendrier, une ligne par plage horaire du service — vos postes du matin et de l’après-midi, vos gardes du soir — et pour chacune son état : assignable, écarté, ou « vous l’avez » quand la garde vous a déjà été attribuée. Cela se recalcule à chaque clic. Jusqu’ici vous posiez un statut et deviez nous croire sur parole : rien ne disait si la garde du soir était restée ouverte, ce qui est précisément la chose que ce chantier a servi à rendre possible. Une phrase sous les lignes dit ce que ça veut dire, et l’écran est clair sur ses limites : « assignable » veut dire possible, pas promis.
NouveauUn panneau dit ce que le jour choisi porte, réponse par réponse, et permet d’en retirer une sans repasser par la gomme. Un congé du matin, une AIG de l’après-midi et un souhait de garde sont trois choses distinctes posées sur la même case : elles s’y lisent maintenant séparément, chacune avec son bouton. Une garde qui vous a été attribuée y figure aussi, sans bouton — ce n’est pas une saisie, c’est une décision de vos responsables, et l’application ne la défait pas toute seule.
NouveauLes gardes qui vous ont été attribuées apparaissent sur le calendrier de saisie. Vous posez vos absences en les voyant, au lieu de les découvrir après coup. Elles ne s’affichent qu’une fois le planning de garde sorti, et la légende les nomme.
AméliorationDemander une garde et en refuser une ne se disent plus avec les mêmes mots. Un refus est un blocage ferme : « pas de doublure » n’interdit pas la garde complète, et vous devez le savoir avant de cliquer. Un souhait n’est qu’une préférence que le moteur suit s’il peut. Les deux côtés proposaient « Toute la garde », ce qui laissait croire à une symétrie qui n’existe pas. Une phrase sous le sélecteur dit désormais ce que votre choix engage. Les services qui ne séparent pas leurs deux collectes gardent leurs mots.
FixUn mois sur lequel personne n’a encore ouvert de collecte ne demandait qu’UNE réponse. « Janvier vous demande une réponse · Mes désidérata » : l’écran d’avant, sur onze mois sur douze. C’était le repli du code quand aucune ligne de campagne n’existe — or il n’y a plus de collecte à lancer chez vous, donc un mois sans ligne est le cas normal et non l’exception. Ces mois-là demandent maintenant vos gardes et votre journée, séparément, comme les autres.
FixLes explications sous chaque statut disaient le contraire de ce que fait le moteur. Elles avaient été écrites quand un statut de journée fermait aussi la garde du soir : « vous ne serez affecté à aucun poste ni garde ». Depuis que votre service distingue les deux, c’est faux — et faux sur le point exact que tout ce chantier a servi à changer. Un « AIG » explique désormais qu’il ne ferme que la journée et que la garde du soir reste ouverte. Ces phrases décrivent une règle, pas un choix de vocabulaire : elles se déduisent de la liste des statuts qui ne parlent que de la journée, et ne peuvent donc plus diverger de ce que le moteur applique.
FixLe bandeau « Novembre vous demande deux réponses » était invisible pour les responsables du service. Il n’apparaissait qu’aux médecins sans droits d’administration — or vos trois responsables sont aussi médecins du service, et c’est sur leur propre mois qu’ils regardaient. Ils tombaient sur l’ancien bouton unique et ne pouvaient pas transmettre leurs gardes et leur journée séparément. Ce qui distingue les deux écrans n’est pas le rôle mais le calendrier regardé : le sien, où l’on répond pour soi, ou celui d’un collègue, où un responsable transmet à sa place. Un responsable peut aussi transmettre un axe déjà figé, comme il peut déjà le modifier.
AméliorationLes mots de l’écran sont ceux que vous aviez validés. La demi-garde s’appelle « doublure », comme vous la nommez : le mot avait été écrit en configuration la veille de la réunion où vous l’avez tranché, et il n’avait pas été repris. Les boutons de garde disent « Je veux » et « Je ne veux pas » plutôt que « Je veux la garde » et « Pas de garde » — le titre de la section dit déjà qu’il s’agit des gardes. Et la gomme s’appelle « Gomme ».
AméliorationChaque groupe de la palette porte une étiquette de couleur qui dit à quelle question il répond : les absences répondent aux deux, « Ma journée » laisse la garde du soir ouverte, « Gardes et doublures » laisse la journée ouverte. Le texte existait déjà en gris ; une couleur se retrouve d’un coup d’œil quand on redescend dans la palette.
v8.257.010/09/2026
FixUn échange de gardes porté sur la journée même devenait impossible à accepter, du jour au lendemain et sans que rien n’ait bougé au planning. Une proposition faite lundi pour échanger la garde de jeudi contre celle de vendredi passait toute la semaine, puis basculait sur « Repos de garde » le jeudi matin : l’application tenait la journée en cours pour du passé, donc la garde qu’on rendait cessait de compter, et le conflit que l’échange résolvait justement réapparaissait. Vous voyiez un bouton grisé sans explication. Une garde du jour même s’échange désormais jusqu’à minuit, et elle peut aussi être proposée en retour.
v8.256.010/09/2026
AméliorationL’écran des désidérata reprend les mots de la maquette que vous aviez validée. La section des gardes s’appelle « Gardes et doublures » et non plus « Garde » : la doublure est une garde à part entière de votre service, et un titre qui ne la nomme pas laisse croire qu’elle n’est pas là. Chaque section dit maintenant à quel axe elle répond — les absences répondent aux deux, la journée laisse la garde du soir ouverte, les gardes ne parlent que du soir et de la nuit. Et le bloc de transmission nomme le mois : « Novembre vous demande deux réponses », pas « Ce mois ». La date limite, elle, reste tue : la base la porte et personne ne la remplit, donc l’écran ne la promet pas. Les services qui ne séparent pas leurs deux collectes gardent leurs mots, au caractère près.
v8.255.009/09/2026
NouveauUn médecin peut enfin dire « je ne suis pas là en journée, mais je prends la garde du soir ». C'était impossible : six situations que votre service distingue une par une — indisponible, AIG, AIG extérieur, formation, vacances, et même « indisponible mais je veux la garde » — produisaient exactement le même blocage. Ajouter « je veux la garde » ne changeait rien, l'interdiction l'emportait. Désormais les statuts de journée ne parlent que de la journée, et vos gardes se décident sur leur propre ligne. Vos vacances, arrêts et congés sans solde, eux, continuent de tout fermer : c'est délibéré, poser une garde sur quelqu'un qui est parti coûte plus cher qu'une ligne à saisir en trop.
NouveauLa palette est réorganisée en trois questions au lieu d'une liste. « Absences » ferme la journée et la garde. « Ma journée » ne parle que de la journée. « Gardes et doublures » ne parle que du soir. Une même journée peut porter deux réponses, et elles ne s'effacent plus l'une l'autre. Les mots sont ceux de votre service : Vacances, AIG, AIG extérieur, Indisponible, Souhait de récup. Les autres services gardent les leurs, au caractère près.
Amélioration« Formation donnée » disparaît de la palette et rejoint « AIG extérieur », qui porte désormais les cours, les congrès et les formations que vous animez. Un seul bouton au lieu de deux, comme demandé. Rien n'est perdu : les journées déjà saisies restent lisibles, et le service qui distingue encore les deux durées n'est pas touché.
FixUne journée d'AIG extérieure comptait ZÉRO heure de travail. Une journée entière de cours à la fac pesait autant qu'un jour de repos dans votre décompte hebdomadaire, ce qui vous faisait paraître sous-chargé et vous valait davantage de postes. Elle compte désormais ses 10 heures, comme l'AIG interne — ce que vous nous aviez écrit le 31 août. Les services qui ne déclarent pas cette durée ne bougent pas.
AméliorationIl n'y a plus de collecte à lancer. Tous les mois sont ouverts en permanence, sur une fenêtre d'un an, et un responsable n'intervient plus que pour figer — les gardes d'abord, la journée ensuite, à deux dates différentes. Figer veut désormais dire figer : passé ce moment, plus personne ne modifie ce mois-là hors d'un responsable, congés compris. Tant qu'une des deux collectes reste ouverte, vos congés passent toujours.
FixPoser un statut de journée un samedi, un dimanche ou un jour férié est maintenant refusé, avec une phrase qui dit pourquoi. Ces jours-là n'ont aucun poste de journée : le geste ne bloquait rien et vous laissait croire le contraire. L'écran renvoie vers les deux gestes qui ont un effet — « Je ne veux pas » pour refuser la garde, une absence pour dire que vous n'êtes pas là. Un glissé qui traverse un week-end peint ce qui a du sens et vous dit ce qui a été ignoré.
AméliorationDeux relances distinctes remplacent la relance unique : une pour vos gardes, une pour votre journée. Elles ne partent pas au même moment et ne s'adressent pas aux mêmes personnes — une relance de journée envoyée à quelqu'un qui n'est jamais posté en journée est du bruit. Une notification neuve annonce le gel d'un mois, et une autre permet à un médecin de signaler qu'il est absent un jour où une garde lui a été attribuée, avec un mot libre.
FixTransmettre votre journée ne fait plus repasser vos gardes en « à transmettre ». L’écran ne regardait que votre dernier envoi : le premier des deux axes perdait sa marque sous vos yeux dès que vous validiez le second, et le seul geste évident devenait de tout renvoyer. Les deux états sont maintenant lus ensemble.
NouveauSi une garde vous a déjà été attribuée un jour où vous vous déclarez en vacances ou en arrêt, l’écran vous le dit et vous propose de prévenir les responsables, avec un mot libre. Le cas est normal : les gardes se figent avant la journée, un congé accordé tard arrive forcément après. L’application ne retire pas une garde figée toute seule — ce serait défaire une décision sans que personne le sache — mais elle cesse de vous laisser croire que le conflit a été vu. Une journée d’AIG posée sur une garde ne déclenche rien : c’est le geste que ce lot vient d’ouvrir.
v8.254.009/09/2026
MoteurLes quotas de gardes de vos assistants suivent enfin les périodes de l’année. Vous écrivez « 1 demi-garde par mois de février à septembre, 2 en octobre et janvier, 1 demi-garde plus 1 garde complète en novembre et décembre » : le réglage ne portait qu’un seul nombre, appliqué à tous les mois. Il avait été rempli avec la ligne de novembre-décembre, donc il était juste pour deux mois et faux pour les dix autres. Le quota se déclare maintenant par période, et le mois généré reçoit le sien.
MoteurUne demi-garde par mois devient une garde un mois sur deux, et c’est ce qui rend la règle contraignante. Le moteur lisait « 0,5 garde » comme « zéro ou une, jamais deux » : un plafond, sans rien qui oblige à en prendre une. Les trois assistants à temps partagé, à qui vous demandez la moitié des gardes de leurs collègues, en tenaient de fait entre un quart et la moitié. Le quota se répartit désormais en gardes entières, décalées d’un médecin à l’autre pour que le service ne fasse pas de vagues, et la somme sur la période tombe exactement sur la moitié.
AméliorationLa case de quota se saisit par période, avec un sélecteur au-dessus de la grille. Un mois sans valeur hérite du défaut plutôt que de valoir zéro, et une fiche qui n’utilise qu’un seul jeu de nombres reste écrite simplement.
FixLa case de quota affichait « 0 » là où la fiche portait « 0,5 ». Elle montrait le nombre de gardes que le moteur allait recevoir pour le mois en cours, au lieu de la valeur que vous aviez saisie. Sur les trois assistants à temps partagé, on y lisait donc « pas de quota », et la moindre frappe effaçait la vraie valeur.
AméliorationUne nouvelle vérification automatique contrôle que la configuration suit bien les périodes que vous avez décrites, et qu’elle atteint le moteur. Aucune ne le faisait : les autres jugent le mois de novembre, et une fiche qui aurait perdu son quota d’octobre serait passée inaperçue. Le tableau de bord du chantier passe de 96 à 97 règles outillées sur 161.
FixNotre outil de non-régression annonçait « aucune règle n’a changé » alors qu’une règle venait de changer ses bornes. Il ne savait pas distinguer un simple changement d’ordre des données d’une vraie modification de contrainte, et rendait le message le plus rassurant des deux. C’est l’outil qui protège les services de Rochefort et Libourne à chaque modification du moteur.
v8.253.009/09/2026
MoteurLes vacances scolaires du service ne sont plus celles de Poitiers. Le moteur appliquait le calendrier de la zone A à tous les services, quelle que soit l’académie déclarée : Trousseau, qui est en zone C, recevait donc des dates de vacances qui ne sont pas les siennes. La zone déclarée par le service traverse désormais toute la chaîne jusqu’au moteur, et les deux zones sont écrites depuis le calendrier officiel jusqu’en 2027.
FixLe calendrier de saisie des désidérata montrait un jour de vacances de plus que le moteur n’en connaissait. Les deux tables de dates, celle de l’écran et celle du moteur, mélangeaient deux conventions : « dernier jour de vacances » pour l’hiver et le printemps, « jour de reprise » pour la Toussaint et Noël. Un médecin voyait la Toussaint finir le 2 novembre quand le moteur la finissait le 1er. Les deux tables disent maintenant la même chose, et un test refuse qu’elles divergent à nouveau.
MoteurUn quota de gardes exprimé en demi-garde valait zéro. Le moteur convertissait le quota en nombre entier avec un arrondi qui ramène 0,5 vers le bas : les trois assistants à temps partagé du service, à qui l’on demande la moitié des gardes de leurs collègues, recevaient donc la consigne « aucune garde de semaine », et chaque garde qu’ils prenaient malgré tout était pénalisée. Un quota à virgule vaut désormais une fourchette : 0,5 veut dire « zéro ou une, jamais deux ». Les quotas entiers des autres services ne bougent pas d’un chiffre.
FixUn médecin portait une dispense qui ne lui revenait pas, et cela lui donnait des gardes de 24 heures. La liste des personnes dispensées avait été dérivée d’une réponse voisine et lisait « dispensé du repos » comme « peut cumuler un poste et une garde », alors que sa fiche dit « pas de 24h ». La dispense retirée, ses deux gardes de 24 heures de novembre ont disparu. Une seule personne du service est réellement dispensée, et c’est ce que le client écrit.
AméliorationLes quotas de gardes se saisissent en nombre à virgule, et l’aide de l’écran le dit maintenant. Une valeur comme 0,5 n’est pas un demi-quota mais une fourchette, « zéro ou une, jamais deux », et c’est un plafond : elle n’oblige personne à prendre une garde. Le texte d’aide parlait encore d’un nombre entier de gardes.
FixUn quota négatif ne peut plus atteindre le moteur, même écrit hors de l’écran. La case des réglages refusait déjà les nombres négatifs, mais les scripts qui écrivent la configuration directement ne passent pas par elle : une valeur négative créait alors une pénalité permanente qu’aucun planning ne pouvait effacer. Le garde-fou est descendu dans le moteur, là où tous les chemins se rejoignent.
MoteurSept dernières règles du service de Trousseau qui étaient posées en configuration sans que rien ne sache dire si elles tiennent sont désormais vérifiées : la composition des paniers d’équité, l’effectif des urgences, la règle des deux médecins d’un même service, le calendrier appliqué, et trois consignes personnelles écrites en texte libre sur des fiches. Le tableau de bord du chantier passe de 89 à 96 règles outillées sur 161, et la catégorie « il ne manque qu’une vérification » tombe à zéro.
AméliorationNos preuves de la forme « fichier, ligne » sont vérifiées automatiquement. Elles servent à retrouver le code qui justifie chaque décision du chantier, et rien ne disait quand une ligne se décalait : quatorze d’entre elles ne désignaient plus rien de ce qu’elles annonçaient. Un outil les relit à chaque passage. Deux autres garde-fous s’ajoutent : la taille des fichiers de contrôle ne peut plus grandir, et l’outil qui vérifie que chaque contrôle est bien testé refuse maintenant qu’on committe pendant qu’il travaille, parce qu’il modifie temporairement le code et qu’un enregistrement pris à ce moment-là figerait un contrôle désactivé.
v8.252.009/09/2026
FixLe compteur « WE : n/m dispo » de l’écran des désidérata pouvait afficher « tout est disponible » alors que rien ne l’était. Il ne regardait pas le statut « Plutôt pas de garde » : quelqu’un qui marquait ainsi les huit jours de week-end du mois lisait « 8/8 dispo », sans le moindre signe, pendant que le moteur en tenait compte huit fois. Les deux sont maintenant comptés et affichés séparément, parce que « je préférerais ne pas » n’est pas « je ne peux pas » et que le moteur ne les traite pas pareil.
AméliorationCe compteur compte désormais des créneaux de garde et non des jours, comme vous nous l’aviez demandé. Deux jours de week-end ne pèsent pas la même chose : un samedi de novembre à Trousseau porte six gardes en parallèle, un samedi d’août beaucoup moins. Et les vendredis, qui n’étaient comptés nulle part, ont désormais leur propre compte : vous nous aviez donné deux seuils distincts, la moitié des week-ends et les trois quarts des vendredis.
NouveauLes administrateurs voient qui dépasse ces seuils, médecin par médecin, dans la vue d’ensemble des désidérata. C’est un signalement, pas un refus : personne n’est jamais empêché d’enregistrer ce qu’il a saisi. Vous nous aviez donné les seuils sans nous dire ce qui devait se passer au-delà, et bloquer quelqu’un qui a une vraie raison le jour de l’ouverture nous a paru le plus mauvais des deux choix. Les seuils se règlent par service ; les services qui n’en déclarent pas ne voient aucun changement.
FixL’application comptait des gardes qui n’existent plus. Un type de garde peut n’être ouvert que sur une période — votre deuxième garde de nuit court du 2 novembre au 20 décembre — et l’application ne lisait ces dates nulle part, à deux endroits différents. Le 25 décembre, elle comptait encore cette garde comme à pourvoir, et le 1er novembre, qui est un dimanche, elle la comptait alors qu’elle ne commence que le lendemain. Les deux endroits lisent maintenant la même règle.
FixLa précision écrite par un médecin n’est lisible que par les personnes connectées. La table des désidérata était en lecture ouverte depuis l’origine : tant qu’elle ne contenait que des dates et des statuts, ça ne prêtait pas à conséquence. Y ajouter du texte libre changeait la donne, puisque la clé de lecture publique du site aurait suffi à lire ces notes sans compte. La colonne est désormais réservée aux comptes connectés. Le reste de la table est inchangé.
NouveauUn médecin peut enfin écrire une précision à côté de ce qu’il marque : « départ en week-end, train à 15h », « rendez-vous médical le matin ». Le champ n’existait pas, alors que la place lui était réservée depuis toujours et que l’application savait déjà l’afficher. Résultat : tout ce qui ne rentrait pas dans l’un des quatorze boutons ne pouvait pas être dit, et repartait par message. La précision est lue par le service et pas par l’algorithme, et l’écran le dit noir sur blanc. Elle s’attache aux jours marqués ensuite et s’efface quand on change de statut, pour qu’un motif écrit pour un congé ne parte pas sur une demande de garde.
v8.251.008/09/2026
MoteurDix-neuf règles du service des urgences pédiatriques de Trousseau étaient posées dans la configuration sans que rien ne sache dire si elles tiennent. Elles sont désormais vérifiées automatiquement sur un planning produit ou sur la configuration reçue : qui a le droit de tenir quel type de garde, les six postes simultanés d’un week-end, le quota de gardes des docteurs juniors, les six situations d’absence que le service a décrites une par une, la coupure des collectes en deux temps. Le tableau de bord du chantier passe de 70 à 89 règles outillées sur 161.
FixTrois de ces dix-neuf sonnent rouge dès le premier passage, et c’est le résultat utile. Les assistants à temps partagé tiennent en novembre plus de gardes que leurs collègues à temps plein, quand le service en demande la moitié : aucun réglage ne porte cette moitié aujourd’hui. Deux docteurs juniors à mi-temps prennent sur le seul mois de novembre les deux gardes décalées prévues pour novembre et décembre réunis. Et sur décembre, trois médecins que le service déclare en congé sans date de retour sont postés, parce que leur absence n’a pas été saisie sur ce mois-là.
AméliorationNotre outil qui vérifie que chaque contrôle est bien testé pouvait se déclarer complet en n’ayant rien regardé. Il travaille sur une liste de fichiers écrite à la main, et cinq fichiers neufs n’y étaient pas : il a rendu le même total que la veille sur un code qui portait cinquante vérifications de plus. Il refuse maintenant de tourner tant qu’un fichier de contrôles n’est rattaché à aucune suite de tests. Une fois le périmètre juste, vingt-deux vérifications se sont révélées non testées ; elles le sont.
FixUne relecture ligne à ligne du lot a trouvé six défauts que ses propres tests, tous verts, ne voyaient pas. Deux comptaient juste sur le mauvais nombre. Le compteur d’absences additionnait des lignes de saisie au lieu de jours : quinze jours posés en demi-journées faisaient trente lignes, donc « absente tout le mois » sur un mois de trente jours, et la vérification des congés se taisait alors que la moitié du mois restait ouverte. Et la comparaison des gardes entre assistants à temps partagé et à temps plein incluait au calcul une médecin absente tout le mois, ce qui décalait le résultat de huit points dans le sens qui accuse. Les six sont corrigés, chacun avec le test qui l’empêche de revenir.
AméliorationSept règles restent sans vérification possible, et le dire fait partie du travail. Quatre ne sont écrites nulle part ailleurs que dans une phrase de commentaire sur la fiche d’un médecin, un texte libre qui n’arrive jamais jusqu’au moteur : les préférences d’ordre de gardes de deux médecins, et deux seuils d’activité non clinique. Les trois autres portent sur des informations que le moteur ne reçoit pas du tout. Chacune est documentée avec sa preuve plutôt que transformée en vérification qui ne vérifierait rien.
v8.250.008/09/2026
AméliorationLe réglage « Garde concernée » sépare désormais les demi-gardes des gardes complètes, le week-end compris. Il ne le faisait qu'en semaine : le samedi et le dimanche, la demi-garde de 18h-23h et la garde décalée de 11h-23h tombaient du même côté, alors que ce sont les deux seules options des docteurs juniors des étages. L'un d'eux ne pouvait donc pas dire « la demi oui, la décalée non ». Les mots du réglage sont maintenant ceux de chaque service : « Demi-garde / Garde complète » là où c'est ce que la garde sépare, « De jour / De nuit » là où c'est le jour et la nuit. Une seule paire de mots ne pouvait pas être juste sur les deux.
NouveauUn médecin peut déclarer le type de garde qu'il PRÉFÈRE, sans que ce soit une interdiction. Votre cahier des charges le demandait en contrainte moyenne : « Préfère faire des demi garde que des gardes complètes », et sa symétrique. Jusqu'ici seule l'interdiction existait, et refuser une garde n'est pas la même chose que préférer l'autre : le moteur suit la préférence quand il peut, et passe outre si le planning l'exige. Le réglage est sur la fiche de chaque médecin, juste au-dessus de la restriction ferme.
MoteurLes quotas de gardes peuvent maintenant distinguer deux types de garde sur la même période. Vous écrivez pour vos assistants « en novembre et décembre : 1 demi-garde par mois du lundi au jeudi, plus 1 garde complète par mois de semaine ». Les deux sont de semaine, et le moteur ne comptait qu'un seul nombre par période : une cible de deux gardes de semaine pouvait donc être remplie par deux demi-gardes. Les deux quotas se comptent désormais séparément. Les quotas existants, eux, ne bougent pas d'un chiffre.
FixQuand deux médecins s'échangent une garde, l'avertissement « cette personne a demandé à ne pas être de garde ce jour-là » ne savait pas de quelle garde il s'agissait. Une proposition d'échange n'enregistre pas le créneau exact, seulement la date et le poste, et l'application se rabattait sur un créneau générique. Quelqu'un qui avait refusé les demi-gardes et à qui on en proposait une n'était donc averti de rien ; et quelqu'un qui avait refusé les gardes complètes était averti à chaque échange, même pour une demi-garde. Le planning, lui, sait quelle garde change de main : c'est celle que son titulaire tient ce jour-là. Un samedi de Trousseau en compte jusqu'à six, et c'est le titulaire qui les départage.
NouveauLes quotas de gardes par type se saisissent maintenant sur la fiche du médecin. Six cases, trois périodes du mois par deux types de garde, chacune facultative. C'est ce qui permet d'écrire votre consigne « en novembre et décembre : 1 demi-garde par mois du lundi au jeudi, plus 1 garde complète par mois de semaine » : les deux étant de semaine, un seul nombre ne pouvait pas les distinguer. Une case laissée vide veut dire « pas de quota », ce qui n'est pas la même chose que « zéro garde ». Les intitulés des colonnes sont ceux de chaque service.
FixTrois endroits de plus jugeaient encore la mauvaise garde, et un quatrième ne prévenait personne. Le compte « N médecins disponibles » affiché à l'admin, la carte d'un échange qu'on vous propose, et la contre-proposition d'échange se rabattaient tous sur une garde générique : ils comptaient donc comme disponible un collègue qui avait refusé précisément ce type de garde. La contre-proposition, elle, passait en vert puis se faisait refuser à l'acceptation, avec le message d'erreur affiché à l'autre personne.
FixUn quota de gardes par type n'éteint plus l'objectif de volume mensuel du médecin. « 1 demi-garde de semaine » ne dit rien du nombre total de gardes du mois, mais le moteur traitait les deux consignes comme interchangeables et abandonnait silencieusement la seconde. Les services qui n'utilisent que des quotas par période ne changent pas.
FixLe script qui bascule Trousseau sur la nouvelle séparation ne pouvait pas se lancer : la commande écrite dans son mode d'emploi échouait avant la moindre requête. Corrigée, et l'essai à blanc tourne. Un second script, en lecture seule, compte maintenant les souhaits déjà saisis dont le sens changerait — parce qu'un souhait n'enregistre pas la liste des gardes qu'il vise, seulement le côté, et que ce côté se relit à travers la configuration du service.
FixUne case de quota refuse maintenant un nombre négatif. Une valeur négative traversait jusqu'au moteur, où elle créait une pénalité qu'aucun planning ne pouvait effacer et que rien n'expliquait à l'écran.
FixLe repère qui marque un souhait de garde dans le calendrier devient un demi-disque ou un disque plein, selon que le souhait vise la garde moindre ou la garde entière. Le soleil et la lune posés ce matin ne tenaient plus une fois les lits portes de 8h30-18h rangés du côté des gardes complètes : une lune devant une garde de journée est à l'envers.
v8.249.008/09/2026
AméliorationSur les services où la garde se sépare en plusieurs créneaux, le réglage « Garde concernée » s'appelait « Toute la garde / De jour / De nuit ». À Trousseau, la demi-garde court de 18h à 23h : l'appeler « de jour » était un contresens, et un médecin nous a écrit qu'il ne trouvait pas de case pour dire s'il voulait ou non la demi-garde. La case existait et faisait exactement ce qu'il demandait, du lundi au vendredi. Les mots de ce réglage ne sont plus écrits une fois pour toutes dans l'application : chaque service dit les siens (voir la version suivante). Aucun changement de comportement, seulement les mots.
FixCe même réglage était coupé sur téléphone. Les trois boutons et leur titre demandaient plus de place que la largeur d'un écran de 375 pixels, et le dernier bouton se retrouvait tronqué : on lisait « De nuit » réduit à « De ». Le titre passe désormais au-dessus des boutons, et les boutons se replient sur deux lignes quand l'écran est trop étroit. Vérifié sur un écran de 375 pixels puis sur un de 320 : plus rien n'est coupé.
FixQuand un médecin précisait quelle garde il refusait, l'application et le moteur ne parlaient pas de la même chose sur six des onze créneaux de garde de Trousseau. L'application se fiait à trois noms de créneaux écrits en dur, hérités d'un service qui n'en a qu'un seul, au lieu de lire la liste que chaque service déclare. Deux conséquences, dans les deux sens : un refus de garde de nuit signalait un conflit sur une demi-garde que le moteur accepte, et surtout un refus de demi-garde n'en signalait aucun sur celle que le moteur interdit. Ce second cas était silencieux. Il touchait l'alerte du planning, les pastilles de l'éditeur, le message affiché en posant une garde à la main, la liste des remplaçants proposés, et la validation des échanges de gardes entre médecins. Les autres services n'étaient pas concernés et ne changent pas.
AméliorationLe repère qui marque, dans le calendrier, qu'un souhait vise une garde précise passe d'une lettre à un pictogramme (sa forme définitive est décrite à la version suivante). Une lettre de huit pixels ne se lit pas, et surtout ne se comprend pas sans avoir vu le réglage. Au passage, le calendrier et la grille du mois affichaient deux repères différents pour la même chose ; ils viennent maintenant du même endroit.
v8.248.008/09/2026
FixSe déclarer absent un après-midi écarte maintenant AUSSI la garde qui commence le soir même. Jusqu’ici deux gardes qui commencent à la même heure étaient traitées différemment : celle qui se termine à 23h était bien écartée, celle qui se poursuit jusqu’au lendemain matin ne l’était pas, parce que son heure de fin appartient au jour suivant. Quelqu’un qui partait en week-end le vendredi midi restait donc affectable à la garde du vendredi soir. Une garde compte désormais pour le jour où elle commence. Le matin ne change pas : la fin de nuit d’une garde appartient bien au lendemain. À Rochefort rien ne bouge, la garde y dure 24 h et était déjà écartée des deux côtés ; à Libourne cela concerne la garde de nuit.
AméliorationUne distinction a été introduite entre deux questions qui n’en faisaient qu’une : « cette demi-journée est-elle libre de travail ? » et « cette absence empêche-t-elle ce créneau ? ». Elles diffèrent sur les gardes de nuit : un médecin de garde le vendredi soir peut tenir sa consultation du vendredi après-midi, mais s’il se déclare absent cet après-midi-là il ne prend pas la garde. Les consultations honorées continuent donc de se compter comme avant.
FixUn médecin de Trousseau peut de nouveau se déclarer absent sur une seule moitié de journée. Depuis samedi, le choix Matin / Après-midi avait disparu chez eux : on ne pouvait plus dire « je pars vendredi à midi », seulement poser la journée entière. La cause était un raccourci de notre côté. Nous avions branché la demi-journée sur « ce service tient-il des consultations », en pensant que cela revenait à demander « ce service coupe-t-il ses journées en deux ». Trousseau répond non à la première question et oui à la seconde : ils n’ont aucune consultation, et leur médecine se prend le matin, l’après-midi ou la journée entière. La question posée est maintenant la bonne, et elle se lit directement dans les créneaux du service : un service qui déclare au moins un poste plus court qu’une journée entière propose les trois choix. Rochefort et Libourne ne bougent pas.
FixQuand on déclare une absence sur une SEULE moitié de journée, l’écran dit maintenant ce qui reste vraiment possible. Il annonçait « Pas de poste » et « Pas de garde » quel que soit le créneau choisi, alors qu’une demi-journée ne libère que les heures qu’elle recouvre : à Trousseau, une absence posée l’après-midi laisse ouverts le créneau du matin et les gardes qui passent minuit. Quelqu’un qui partait en week-end le vendredi midi pouvait donc lire qu’il ne serait pas de garde, et l’être le soir même. L’écran nomme désormais les plages horaires qui restent ouvertes, et propose de poser la journée entière pour tout bloquer. Les statuts que le moteur ne bloque pas, comme « Dispo » ou « Ça m’arrange pas », gardent leur texte d’origine. À Rochefort rien ne change : la garde y dure 24 h et les postes couvrent la journée, donc une demi-journée les bloque bel et bien.
AméliorationUne erreur d’horaire dans la configuration d’un service ne peut plus faire disparaître l’écran des désidérata, et elle ne passe plus inaperçue. Un créneau dont l’horaire ne se lit pas est désormais écarté dès la lecture de la configuration, et la page d’administration affiche lequel : jusque-là une faute de frappe aurait privé tous les médecins du service de leur page, et l’écarter en silence aurait retiré le choix Matin / Après-midi sans que personne comprenne pourquoi. Aucun des services actuels n’est concerné.
AméliorationSur la gomme, l’option « Garde » a été sortie du groupe des créneaux : elle désigne le souhait de garde, pas un moment de la journée, et effacer « Journée » ne l’efface pas. Elle porte maintenant son propre libellé, « Mes souhaits de garde », qui ne se confond plus avec le titre de la section des statuts de garde juste au-dessus.
FixLa légende du calendrier de désidérata suivait le même raccourci. Une absence posée sur une demi-journée s’affiche en deux moitiés de couleur, et la clé qui l’explique manquait tant que le mois n’en portait pas déjà une. Elle suit désormais le même critère que le sélecteur.
AméliorationLe moteur, lui, savait déjà lire une demi-journée chez Trousseau : il compare des horaires, et rien d’autre. Une absence posée le vendredi après-midi libère la personne de la médecine de l’après-midi et du créneau 13h-21h, et la laisse disponible le matin. Aucune donnée déjà saisie n’est touchée : le correctif ne change que ce que l’écran propose.
v8.247.008/09/2026
FixLes droits d’écriture en base ne distinguaient pas les services. La base répond à la question « cette personne a-t-elle le droit d’écrire cette ligne ? », et sa réponse ne regardait pas de quel service la ligne relève : elle vérifiait seulement que le demandeur était administrateur QUELQUE PART. Un administrateur d’un service pouvait donc modifier et supprimer les souhaits, le planning, les verrous, les campagnes et la configuration d’un autre service. Quinze règles étaient concernées. Le défaut existait depuis la mise en place des comptes ; il n’a pris son ampleur qu’avec l’arrivée du troisième service. Chaque règle porte désormais le service de la ligne visée.
FixLe même défaut ne demandait même pas d’être administrateur pour une partie des écritures. Deux services peuvent avoir deux médecins aux mêmes initiales — c’est prévu, et il y en a. La règle qui autorise chacun à écrire ses propres souhaits comparait les initiales sans regarder le service : un médecin pouvait écrire les souhaits de son homonyme d’un autre service.
AméliorationLe correctif se garde tout seul. Les deux fonctions fautives sont supprimées par la même opération qui réécrit les règles : si une seule règle avait été oubliée, la base refuse la suppression et annule tout, plutôt que de laisser une porte ouverte en silence. Un test tourne contre un vrai moteur de base de données, sur un poste de travail ordinaire : il rejoue treize écritures interdites une par une, et vérifie aussi qu’elles passaient toutes avant le correctif — sans quoi un test vert ne prouverait rien.
FixRien ne garantissait qu’un compte n’ait qu’UNE identité par service. La table qui relie un identifiant de connexion à un médecin était unique par (service, médecin), jamais par (service, compte) : deux fiches médecin d’un même service pouvaient pointer vers le même compte, sans erreur. La fonction qui répond « qui est cette personne ici ? » en aurait alors choisi une au hasard — la même indétermination que celle qu’on vient de corriger, d’un cran plus loin. La contrainte manquante est posée. Si un tel doublon existe déjà, la mise à jour s’arrête d’elle-même, n’applique rien, et dit combien de comptes sont concernés plutôt que de laisser une erreur technique à déchiffrer.
AméliorationLes accès en LECTURE n’ont pas été touchés, et c’est délibéré : tout compte connecté lit encore les souhaits de tous les services. Les fermer demande d’abord un autre chantier, parce que les pages rendues côté serveur lisent sans session et se videraient.
v8.246.007/09/2026
FixUne de nos vérifications se trompait de calendrier. Le service des urgences pédiatriques de Trousseau fait tourner une deuxième garde de nuit du premier lundi de novembre au premier dimanche des vacances de Noël. La vérification, elle, croyait que cette période commençait le premier lundi du mois qu’on lui donnait à lire, et ne lui connaissait aucune fin. Sur novembre elle tombait juste par hasard. Sur décembre elle signalait dix-sept anomalies dont aucune n’existait : six au début du mois, en plein milieu de la période, et onze à la fin, après une fermeture que le service demande lui-même. Les deux dates viennent maintenant du service, et un test refuse qu’elles se mettent à diverger de celles du catalogue.
MoteurDécembre 2026 a été généré pour la première fois, cinq fois de suite, et comparé à ce qui était attendu avant de le produire. Ce mois-là est le premier où le service ferme des postes en cours de route : la chirurgie et le 13-21h de traumatologie s’arrêtent le 20 décembre, un 13-21h de médecine prend le relais du 21 au 31, et la deuxième garde de nuit s’arrête aussi le 20. Les vingt-quatre créneaux sortent au jour près, aux bonnes dates, sur les cinq essais : le 25 décembre ne porte aucun poste de journée et bien des gardes de week-end, et le 24 est traité comme une veille de jour férié.
FixUne seconde vérification comptait de travers, et son signalement était un faux positif. Le service énumère ce qu’il veut voir réparti équitablement chaque mois : lits portes, régulation, 13-21h, traumatologie, CPU. Cinq compteurs. Nous n’en faisions que quatre, en additionnant la traumatologie de journée et le 13-21h. Tant que ces deux postes tournent le même nombre de jours l’addition ne change rien, et novembre passait. En décembre l’un tourne quatorze jours et l’autre vingt-deux : la somme s’écartait alors que chaque poste pris séparément était bien réparti. La génération faisait donc déjà ce que le service demande. Les deux compteurs sont séparés ; les deux lits portes restent groupés, parce que le service les cite d’un seul bloc dans la même phrase.
AméliorationEn séparant ces deux compteurs, une troisième vérification a cessé de voir la moitié de ce qu’elle surveille : celle qui interdit de tenir les deux traumatologies le même jour. Elle se reposait sur le regroupement qu’on venait de défaire, alors que ce sont deux questions distinctes et deux réponses distinctes du service. Un test l’a signalé immédiatement. Elle s’appuie maintenant sur sa propre liste.
FixNotre contrôle de non-régression sonnait sur trois mois de Rochefort. Il compare le problème envoyé au moteur avant et après un changement, pour garantir qu’un travail fait sur un service n’en touche aucun autre. Ses valeurs de référence pour Rochefort avaient été prises juste avant un correctif livré plus tôt le même jour, celui qui fixe l’ordre dans lequel les médecins sont envoyés au moteur. Rien n’avait changé sur le fond : même nombre de variables, mêmes règles, mêmes poids, seule la numérotation interne diffère. Les valeurs de Rochefort ont été reprises, celles des deux autres services laissées telles quelles.
AméliorationUne règle demande à chaque médecin de garde au moins une garde de jour non ouvré par mois. À Trousseau elle est arithmétiquement impossible : cinquante-six médecins pour cinquante-neuf créneaux en novembre, dont quarante-quatre seulement peuvent être servis compte tenu de qui a le droit de tenir quoi, et cinquante et un créneaux en décembre pour quarante et un servis. Ce n’est pas un défaut de génération, c’est le calendrier. Il fallait l’écrire, parce que la note de qualité d’un mois n’est pas comparable à celle d’un autre tant qu’on ne l’en retire pas.
v8.245.007/09/2026
FixDeux générations du même mois ne posaient pas tout à fait le même problème au moteur. Quatre des listes qui lui sont envoyées — les médecins, les souhaits, les activités et les affectations verrouillées — n’avaient pas d’ordre complètement défini : deux lignes créées le même jour pouvaient sortir dans un sens ou dans l’autre, et changer de sens d’un jour à l’autre. Le moteur n’y est pas indifférent. Ces quatre ordres sont maintenant fixes. Cela ne change aucune règle et aucun poids, vérifié sur trois services : même nombre de variables, de contraintes et d’objectifs qu’avant.
v8.244.007/09/2026
FixUn médecin à qui la collecte en cours ne s’adresse pas peut de nouveau déclarer un congé ou un arrêt maladie. Jusqu’ici, l’écran lui répondait qu’aucune collecte n’était ouverte et refusait tout, y compris une absence. Une absence n’est pourtant pas un souhait à l’intérieur d’une collecte : c’est un fait sur la personne, et le planning en a besoin quelle que soit la collecte du moment. Il suffit désormais qu’une collecte existe sur le mois.
FixLe service des urgences pédiatriques de Trousseau ouvre ses collectes en deux temps : les gardes d’abord pour tout l’hôpital, les journées ensuite pour son équipe, et deux mois peuvent séparer les deux. Pendant toute cette fenêtre, quatre médecins n’avaient aucun moyen de signaler qu’ils seraient absents. L’une d’elles part en congé en fin d’année à des dates que le service ne connaît pas encore, et c’est exactement ce qu’il attend d’elle.
FixLe même filtre existait à trois endroits, et n’en corriger qu’un n’aurait rien changé à l’écran. Le premier retirait le mois de la liste du médecin, le deuxième retirait l’outil de la palette avant même de demander s’il était utilisable, le troisième le grisait. Seul le dernier avait été signalé. Celui de la liste des mois ne se déclenchait qu’une fois un planning existant sur un mois voisin : il dormait, et se serait réveillé à la première génération.
FixLa gomme ne peut plus effacer un souhait de garde sur une collecte close. Elle était le seul outil sans catégorie, donc le seul à ne vérifier aucune autorisation précise : il lui suffisait qu’une saisie quelconque soit ouverte quelque part. Comme les absences le sont désormais toujours, elle est devenue un passe-partout. Un médecin pouvait effacer ses gardes après la clôture, et ces gardes-là sont bien lues par le moteur au moment de générer. Le bouton et l’écriture sont fermés tous les deux ; l’administrateur, lui, garde le droit de corriger.
FixLes médecins qu’aucune collecte du mois ne concerne sont maintenant prévenus qu’ils peuvent y déclarer une absence. C’était exactement la population que ce lot venait d’autoriser et que la notification n’atteignait jamais : on leur ouvrait une porte sans le leur dire. Ils reçoivent un message distinct, qui ne leur demande pas de renseigner des disponibilités puisque la collecte ne porte pas sur eux. Le message ne part qu’à ceux qu’AUCUNE collecte du mois ne concerne : les médecins d’étage, déjà prévenus pour les gardes, ne reçoivent rien de plus.
FixUn garde-fou de ce lot n’en était pas un. Il surveillait quatre lignes de code pour empêcher qu’un filtre supprimé revienne ; remettre ce filtre six lignes plus bas restaurait le défaut en entier sans qu’aucun des 2600 tests ne bronche. Vérifié en le faisant, pas en le supposant. Il surveille maintenant la fonction entière, et il a été remis à l’épreuve contre trois façons différentes de réintroduire le défaut.
AméliorationUn commentaire du code affirmait qu’une saisie faite hors collecte « ne part jamais au moteur ». C’est faux : la génération lit les désidérata du mois sans regarder les collectes. Rien n’est donc inerte, et c’est ce qui rend le correctif de la gomme nécessaire plutôt que cosmétique. Le commentaire dit maintenant ce que le code fait.
AméliorationTrois garanties ont été posées en même temps que le correctif, chacune avec son test : un congé reste déclarable sur une collecte close, un mois sans aucune collecte reste fermé, et les services qui n’ouvrent qu’une seule collecte à la fois ne changent en rien. Chaque moitié du correctif a été remise dans son état d’origine pour vérifier qu’un test proteste bien.
AméliorationLe correctif a été rejoué sur les données réelles d’un service de démonstration avant d’être livré. Une médecin qui ne prend pas de gardes n’y voyait même pas le mois de décembre dans sa liste : le défaut de la liste des mois, censé être dormant, était bien réveillé là-bas. Elle y dispose maintenant de ses outils d’absence, et d’eux seuls.
AméliorationDeux tests existants affirmaient le contraire de ce qui est corrigé ici, et l’un d’eux justifiait son résultat par le défaut lui-même. Ils ont été réécrits avec la raison du changement plutôt que réajustés en silence.
v8.243.007/09/2026
FixLa vérification ajoutée pour ce profil pouvait rester silencieuse sur le cas même qu’elle surveille. Quand le profil est écrit dans le champ qui sert normalement à indiquer le service du médecin, on sait qui il est mais plus où il travaille — et la règle diffère entre les étages et les urgences. La vérification classait alors ces médecins du côté « pas aux étages » et ne disait rien. Elle signale désormais la saisie ambiguë au lieu de deviner un service.
AméliorationLe service annonce deux médecins d’un profil particulier qui ne participent aux gardes des étages que sur volontariat. Aucun des soixante médecins enregistrés ne porte ce profil, et le lot précédent s’était contenté de le noter dans un document de suivi. Une note ne se déclenche jamais : le jour où ces deux médecins seraient enregistrés, la règle deviendrait applicable et personne ne le saurait. Une vérification prend maintenant le relais — elle se déclare « sans objet » aujourd’hui, et signalera le cas dès que le profil apparaîtra.
AméliorationNos vérifications rendent deux sortes de sortie : des alertes, et des messages d’observation qui ne signalent aucun défaut mais portent une information — le budget d’heures d’un mois, ou l’avertissement qu’un chiffre affiché se lit à l’envers. L’outil qui vérifie que rien ne peut disparaître sans qu’un test proteste ne regardait que les alertes. Il examine désormais aussi les messages d’observation : sur 37, 16 sont couverts par un test et 21 peuvent être supprimés sans que rien ne le dise. Ces vingt et un ne sont pas traités ici, ils sont listés.
AméliorationLa façon de mesurer cette couverture a été choisie plutôt que supposée. Transformer un message d’observation en alerte fait échouer n’importe quel test qui vérifie que le contrôle est au vert, même ceux qui ne lisent jamais le message : cette méthode aurait annoncé 32 messages couverts sur 37 au lieu de 16, soit deux fois trop. Effacer le texte en laissant le reste intact ne fait tomber que ce qui lit vraiment le message.
v8.242.007/09/2026
FixUne vérification censée refuser de juger un planning incomplet le jugeait quand même. Elle contrôlait que le champ dont elle dépend soit PRÉSENT ; l’outil qui produit le planning écrit toujours ce champ, vide quand la donnée manque. Résultat : sur un planning sans cette donnée, la vérification rapportait vingt écarts qui n’existaient pas, au lieu de dire qu’elle ne pouvait pas se prononcer. C’est le chiffre inventé que son propre message d’erreur dit empêcher.
FixSept autres vérifications de ce lot pouvaient être supprimées sans qu’aucun test ne s’en aperçoive — y compris celle qui écarte les quatre médecins dont le service construit le planning à la main. Chacune a maintenant son test, et chaque suppression a été rejouée après coup pour vérifier que le test tombe bien. L’outil maison qui traque ce genre de trou ne pouvait pas les voir : il n’examine qu’une seule forme d’alerte, et six de ces sept vivent ailleurs.
AméliorationLe service des urgences pédiatriques de Trousseau coupe sa journée de travail à 13h00, et le moteur aussi — mais les deux le savaient chacun de leur côté, l’un dans sa configuration, l’autre dans une valeur écrite en dur. Une vérification exige désormais qu’ils coupent à la même heure. Ce n’est pas une question d’affichage : c’est cette heure qui décide quels créneaux une indisponibilité de demi-journée bloque réellement.
AméliorationLe service souhaite qu’un médecin qui prend une doublure de soirée ait sa matinée libre et de la médecine l’après-midi. Il le présente comme un souhait, pas comme une règle : une mesure a donc été ajoutée plutôt qu’une alerte, et elle dit combien de fois le souhait est tenu. Sur six plannings de novembre, elle n’a rien à mesurer — toutes les doublures de semaine vont aux médecins des étages, comme le service le demande, et ceux-là ne tiennent pas de postes de journée.
FixCette mesure comptait d’abord des dimanches, où aucun poste de journée n’existe : elle réclamait de la médecine l’après-midi un jour où il n’y en a jamais. Elle comptait aussi une médecin extérieure à qui le service interdit tout poste. Les deux défauts ont été trouvés en lisant ce que la mesure affichait, pas en relisant son code : le chiffre avait l’air parfaitement juste.
AméliorationSept autres règles du service ont été examinées et AUCUNE vérification n’a été écrite dessus, ce qui est le résultat : les préférences individuelles des médecins — l’ordre dans lequel chacun accepte ses gardes, la fréquence à laquelle il veut des lits portes de week-end — n’ont aujourd’hui aucun endroit où être enregistrées. Elles vivent en texte libre dans une note. Une vérification aurait été verte parce qu’il n’y a rien à contrôler, pas parce que la règle est tenue.
FixLa liste des médecins envoyée au moteur n’arrive pas toujours dans le même ordre. Elle est triée sur la date de création de la fiche, et un import initial crée tout le monde à la même seconde : 59 des 60 médecins de Trousseau partagent le même horodatage, 11 sur 14 à Rochefort, 12 sur 19 à Libourne. Deux envois du même mois peuvent donc présenter les mêmes médecins dans un ordre différent, et le moteur n’y est pas indifférent — deux générations identiques ne posent pas exactement le même problème. Constaté sur deux exports de la même base à une heure d’écart, aux données rigoureusement identiques. Signalé, pas encore corrigé : le correctif touche les trois services et demande de refaire les mesures de référence.
FixL’outil qui vérifie que chaque alerte de nos contrôles est bien testée comptait ses propres commentaires comme des alertes. Un commentaire qui cite la formule examinée était modifié comme s’il s’agissait de code, puis signalé comme non testé — ce qu’aucun test ne peut corriger, puisque c’est une phrase. Le total annoncé cessait donc d’être un nombre d’alertes. Corrigé, et l’outil remis à l’épreuve après coup.
v8.241.007/09/2026
FixSur la page Désidérata, un mois dont la collecte est close affichait « À renseigner » juste à côté de « Collecte gelée » : deux étiquettes qui se contredisent sur la même carte, et la première convoquait le médecin sur un calendrier dont tous les jours sont verrouillés. La carte ne réclame plus rien quand il n’y a plus rien à faire. Quarante et une cartes étaient dans cet état au moment du correctif, dont celle de janvier 2027 à Libourne, où elle s’affichait pour les dix-huit médecins du service.
FixL’écran d’accueil pouvait annoncer « La collecte des désidérata n’est pas encore ouverte, vous serez prévenu dès qu’elle le sera » à un médecin dont la collecte avait été ouverte puis close, et qui avait donc reçu les deux notifications. L’écran ne gardait qu’un seul indicateur — « peut saisir, oui ou non » — qui confondait une collecte jamais lancée avec une collecte terminée. Il connaît maintenant la différence et le dit : une collecte close est annoncée comme close.
AméliorationCes deux corrections viennent d’une vérification, pas d’un signalement, et la vérification a démenti le diagnostic de départ. Le défaut avait été rapporté sur le service de Trousseau ; en le mesurant sur les six services, il n’y était pas du tout — la règle qui laisse toujours déclarer un congé, même collecte gelée, l’en protège. Il était chez Rochefort et Libourne, et le symptôme le plus visible n’était pas celui qu’on croyait corriger.
v8.240.007/09/2026
FixLe miroir de contraintes du site connaît maintenant les DEUX verrous du moteur sur le cumul de postes, pas seulement le premier. Autoriser deux postes le même jour ne dit rien des heures : sans le second verrou, un administrateur qui déplace une case à la main pouvait poser un médecin sur la CPU du matin et la médecine du matin — une personne à deux endroits en même temps, sans aucune alerte. La génération n’était pas concernée, le moteur refusant de lui-même ; c’est l’écran d’édition, le seul endroit où un humain place une case, qui était devenu plus permissif que le moteur.
FixL’accueil et la page de planning comptaient les mêmes anomalies différemment : 23 d’un côté, 1 de l’autre, sur le même mois. Il manquait à l’accueil la table des créneaux qui permet de reconnaître les demi-journées légitimes — un médecin qui tient le matin et l’après-midi du même poste y apparaissait 22 fois comme une anomalie. Les deux écrans lisent désormais la même chose, et une vérification automatique refuse qu’ils divergent à nouveau.
FixQuand le planning du mois en cours n’existe pas encore, l’écran d’accueil annonce le mois publié le plus PROCHE à venir. Il prenait la première entrée de sa liste, qui commence par le mois précédent quand il y en a un : un médecin aurait lu « le planning d’Octobre est publié » alors qu’il attend celui de novembre — vrai, et moins utile que la phrase remplacée.
AméliorationCes trois corrections viennent d’une relecture du correctif de la veille, pas d’un signalement. Deux d’entre elles portaient la même signature : un commentaire qui affirme une garantie que le code ne tient pas. Une quatrième vérification a été ajoutée après coup, sur une branche du code que rien ne testait — on s’en est aperçu en cassant volontairement le code pour voir si un test protestait, et aucun ne l’a fait.
v8.239.007/09/2026
FixDouze cumuls parfaitement légitimes étaient affichés comme des conflits à l’administrateur. Le service des urgences pédiatriques de Trousseau a demandé qu’un médecin puisse tenir la CPU le matin et la médecine l’après-midi ; le moteur le sait depuis début septembre, mais la vérification qui alimente l’espace admin l’ignorait et signalait « affecté à 2 postes ». Sur leur tout premier planning, un administrateur y aurait lu douze erreurs qui n’en sont pas, sur une fonctionnalité qu’il avait lui-même réclamée. Vérifié sur le planning réel : les douze disparaissent, et la seule vraie anomalie du mois — un médecin posté le lendemain d’une garde — reste signalée.
FixLe même écran annonçait « 30 jours avec postes vides — Incomplet » sur un planning que le moteur venait de rendre sans le moindre trou. La règle qui attend une garde de jour ET une garde de nuit distinctes se déclenchait dès qu’un service déclare des gardes dites « de soins », sans vérifier qu’il s’agisse vraiment de gardes de journée. Chez Trousseau ce sont des gardes entières ou des demi-gardes de soirée, et elles couvrent tout le mois : chaque jour réclamait donc deux moitiés qui n’existent pas. Deux affichages se contredisaient sur le même écran ; c’est l’alerte qui avait tort.
FixLe bouton « Générer le planning » était injoignable quand la collecte des désidérata est close. L’écran attendait que tout le monde ait répondu — y compris sur une collecte gelée, où les réponses manquantes ne peuvent plus arriver : chez Trousseau, 2 réponses sur 56, et aucun moyen de générer. Une collecte close ouvre désormais la génération, en disant combien de médecins n’ont pas répondu plutôt qu’en laissant croire que tout est là. Un service dont un seul axe est gelé, lui, continue d’attendre l’autre.
FixUn médecin lisait « Aucun planning n’est encore publié pour votre service » juste au-dessus de son propre planning du mois suivant. La phrase se calcule sur le mois en cours et sur la date de démarrage du service, sans jamais regarder si un mois futur est publié — elle était juste tant qu’aucun planning n’existait, et fausse le jour où le premier est validé. Elle nomme maintenant le mois publié.
FixLe dialogue de validation promettait qu’« un email sera envoyé à chaque médecin ». Il n’en part que vers les médecins qui ont renseigné une adresse et n’ont pas coupé la notification — chez Trousseau, une fiche sur soixante, qui l’a désactivée : la validation n’a envoyé aucun email. C’est la même correction que celle faite au dialogue de lancement de collecte la veille, sur le dialogue qui avait été oublié.
v8.238.007/09/2026
MoteurLe moteur pouvait calculer un planning complet puis le jeter. Une fois le calcul terminé, il dresse le compte de ce que chaque règle a coûté et cherche à nommer les médecins concernés ; sur certaines règles, l’élément à nommer n’a tout simplement pas de nom, et le moteur s’interrompait sur une erreur au lieu de rendre le planning. C’est ce qui est arrivé à la toute première génération du service des urgences pédiatriques de Trousseau : trente-trois secondes de calcul, un planning valide, et une erreur serveur à l’arrivée.
FixCe défaut ne concernait pas que ce service. La règle en cause — celle qui demande au moins un jour de garde de week-end ou de férié par mois — présente le même cas de figure sur la totalité de ses termes à Rochefort aussi ; la panne y était seulement en sommeil, car elle ne se déclenche que si la règle cède réellement dans le planning retenu. Le compte de la règle reste juste : seul le nom, qui n’existait pas, n’est plus réclamé.
MoteurPremier planning produit pour les urgences pédiatriques de Trousseau : novembre 2026, soixante médecins, cent six désidérata, aucun poste laissé vide. Le service ne déclarait pas combien de temps de calcul lui accorder, et le réglage par défaut demandait un scénario de secours qui portait le total à quarante-cinq secondes, sous un plafond d’une minute. Mesuré sur trois essais, le calcul consomme tout le temps qu’on lui donne sans jamais converger plus tôt : le scénario de secours a été retiré pour ce service, comme il l’avait été à Libourne pour la même raison.
v8.237.007/09/2026
FixLes pastilles d’initiales étaient grises partout sauf sur le planning et la fiche d’équipe. Les couleurs des médecins vivaient dans une table remplie par deux écrans seulement : ailleurs — l’accueil, la page des désidérata, la page des accès, et la pastille d’identité présente en haut de chaque page — tout le monde tombait sur le même gris. Sur le service des urgences pédiatriques de Trousseau, zéro pastille sur seize était colorée ; il y en a maintenant cent vingt-quatre sur la vue admin des désidérata.
FixPire que le gris : quatre fiches portaient la couleur de quelqu’un d’autre. Cette table était amorcée avec les douze médecins de Rochefort écrits en dur, et un identifiant de médecin n’est unique qu’à l’intérieur de son service. Margaux Patin et Clément Tardy chez Trousseau, Margaux Moreau chez Libourne et Clément Tardy sur le service de démonstration recevaient donc la couleur de leur homonyme rochefortais. La couleur vient désormais de la fiche du médecin, et d’elle seule.
AméliorationL’assistant de création d’un médecin proposait une couleur « libre » calculée sur les douze fiches de Rochefort, quel que soit le service. Chez Trousseau il ignorait donc les soixante couleurs réellement portées et pouvait en proposer une déjà prise. Il regarde maintenant celles du service courant.
AméliorationSept contrôles automatiques neufs, chacun vérifié capable de détecter la faute qu’il surveille. Deux d’entre eux gardent des erreurs que les tests n’avaient pas vues et que seul l’écran a montrées : une pastille d’identité restée grise parce que l’en-tête est rendu au-dessus de l’endroit où les couleurs étaient fournies, et une page de planning public tombée entièrement en erreur parce qu’un composant rendu côté serveur appelait du code réservé au navigateur.
v8.236.007/09/2026
FixUne vérification annonçait qu’une semaine de congé permet quand même d’atteindre les quarante-quatre heures — ce que le service a écrit noir sur blanc. Elle recopiait le chiffre au lieu de le lire là où il est défini : le jour où la cible journalière du service changerait, elle aurait continué d’afficher l’ancienne valeur sans rien signaler. Elle compare maintenant les deux nombres et alerte s’ils cessent de coïncider, parce que c’est exactement à ce moment-là qu’un congé arrête d’être neutre et que le compteur annuel se met à dériver.
AméliorationLa durée d’une journée de travail était écrite à deux endroits dans le code de vérification, avec une justification qui ne tenait plus. Les deux copies pouvaient diverger sans que rien ne le dise. Il n’y en a plus qu’une.
v8.235.007/09/2026
AméliorationOnze règles écrites par les urgences pédiatriques de Trousseau étaient posées dans la configuration sans que rien ne sache dire si elles y étaient encore. Elles sont désormais vérifiées automatiquement, en moins d’une seconde et sans faire tourner le moteur : le barème d’heures conventionnel, le vocabulaire des gardes et des demi-gardes, le tarif d’une demi-journée d’absence, les quatre emplois du temps que le service construit lui-même, et le régime des médecins des étages.
AméliorationLe service annonce que ses gardes de week-end de nuit durent treize heures et demie mais comptent douze heures, et que ses lits portes en durent neuf et demie pour onze comptées. C’est un barème, pas une erreur, et il l’a écrit ainsi. Une vérification le protège maintenant du « correctif » qui alignerait les heures comptées sur les horaires réels : ce sont les heures annoncées qui font foi, sur sept des onze types de garde.
AméliorationDeux règles du service demandaient une donnée que la configuration ne sait pas porter, et le dire est le résultat : le service d’origine de chaque médecin, qui n’est enregistré nulle part et qu’aucune règle du moteur ne lit, et la zone de vacances scolaires, écrite en base mais jamais transmise au moteur, qui utilise une zone codée en dur. Aucune vérification n’a été écrite dessus plutôt qu’une vérification qui serait verte sans rien contrôler.
AméliorationLa règle qui impose de tenir compte du mois précédent et du mois suivant était vérifiée du côté du moteur seulement. Elle l’est maintenant aussi du côté de ce qui lui est envoyé : les trois règles concernées seraient devenues muettes, sans erreur ni alerte, le jour où l’envoi aurait cessé de transporter ces deux données.
FixUne vérification annonçait que les médecins des étages ne sont pas soumis à la cible de quarante-quatre heures. C’est faux au niveau du mécanisme : leurs heures de garde sont comptées comme celles de tout le monde. À leur volume de gardes la règle ne se déclenche jamais, mais aucun réglage ne les en exclut, et la vérification le dit désormais au lieu de laisser croire le contraire.
FixSoixante et une des cent trente-deux anomalies que nos vérifications savent détecter pouvaient être supprimées par mégarde sans qu’aucun test ne s’en aperçoive. Chacune a maintenant le sien. L’une d’elles était même impossible à déclencher : elle se lisait comme une protection et n’en était pas, elle a été retirée après avoir vérifié que le cas reste couvert ailleurs.
FixLa vérification « pas trois week-ends de garde d’affilée » affichait ses dates en les faisant passer par la fonction qui retrouve le nom d’un médecin. Elle cherchait un médecin appelé « 2026-11-07 », n’en trouvait aucun et réaffichait la date : le message avait l’air juste, et le défaut était invisible à la lecture.
FixUn horaire de garde laissé vide faisait planter la vérification de configuration au lieu d’être signalé comme illisible.
AméliorationL’outil qui a trouvé ces trous est versionné avec le reste, et il a fallu le corriger trois fois. Sa première version rendait trois résultats différents pour le même code — un effet du cache de compilation de Python, pas du code examiné. La deuxième n’examinait que la moitié des vérifications, au motif que l’autre moitié coûtait trop cher : personne ne l’avait mesuré, et c’était faux. La troisième acceptait qu’on lui demande zéro passe et répondait alors « tout est vérifié » sans rien avoir vérifié. Il est maintenant mis à l’épreuve en lui cachant délibérément une anomalie, qu’il retrouve.
FixCet outil modifie temporairement le code pendant qu’il l’examine, et il annonçait remettre les fichiers en état même s’il est interrompu. C’était faux pour une des deux formes d’interruption : un fichier restait modifié, avec une vérification silencieusement désactivée. Il rétablit maintenant dans les deux cas, et refuse de rendre un verdict tant qu’il n’a pas confirmé que chaque fichier est revenu à l’identique.
v8.234.006/09/2026
FixSur la page Accès, une panne de lecture affichait « Aucun mois disponible pour l’instant » — c’est-à-dire qu’un responsable de planning qui a dix mois validés lisait qu’il n’avait aucun lien à donner à ses secrétaires. La liste des mois se lisait sans jamais regarder si la requête avait échoué, et l’échec ressortait sous la même forme qu’un service qui n’a rien généré. L’écran distingue maintenant les deux : « je n’ai pas pu lire » invite à recharger et précise que les plannings existants ne sont pas perdus.
FixMême correction sur la liste des médecins de cette page : elle pouvait s’afficher entièrement vide sur une panne, ce qui se lisait comme un service sans aucun médecin. Une lecture qui échoue mène désormais à la page d’erreur, qui dit qu’on ne sait pas, plutôt qu’à un écran plausible et faux.
FixLe tableau de bord d’un médecin sans planning annonçait « La collecte des désidérata n’est pas encore ouverte » sans qu’aucune donnée ne le soutienne, dès lors qu’il n’avait aucun mois à examiner. Il propose de nouveau de remplir ses désidérata dans ce cas.
FixL’écran d’inscription pouvait rendre une erreur serveur au lieu du formulaire si la connexion à la base ne s’initialisait pas. C’est le chemin par lequel passent les cinquante-neuf médecins de Trousseau pour choisir leur code PIN. Il affiche maintenant le formulaire sans le nom, comme prévu pour toute lecture qui échoue : une panne ne doit jamais se lire « votre lien est mort ».
AméliorationLe calendrier des désidérata refabriquait la liste de sa légende à chaque fois que l’écran de saisie se redessinait, ce qui rendait inutile le calcul mis en cache juste en dessous. Aucun effet visible, aucun gain mesuré : c’était une garantie écrite dans le code sans exister.
AméliorationDeux contrôles automatiques étendus, chacun vérifié capable de détecter la faute qu’il surveille. Celui qui impose de comparer les identifiants sans tenir compte des majuscules couvre un écran de plus et reconnaît une forme d’écriture qui lui échappait. Celui qui interdit qu’une panne de lecture se déguise en écran vide en reconnaît trois de plus, dont celle qui a produit le défaut corrigé plus haut — et dont deux trouvées en relisant ce correctif-là, qui déclarait conforme un fichier dont il ne savait pas lire la forme principale.
v8.233.006/09/2026
MoteurQuatre des six anomalies signalées sur le planning des urgences pédiatriques de Trousseau n’en étaient pas : c’est la vérification qui se trompait, pas le planning. La plus visible reprochait un dépassement de six heures dans la semaine, alors que le service a écrit noir sur blanc qu’il s’agit d’une cible souple et qu’un remplacement après un arrêt peut faire vingt heures de plus. Ces quatre-là affichent désormais ce qu’elles voient sans le présenter comme un défaut.
NouveauLe seul engagement horaire réellement obligatoire du service — un compteur d’heures à zéro au 31 décembre, à deux heures près — n’était mesuré nulle part. Chaque médecin des urgences voit maintenant, par son nom, ce que le mois généré ajoute ou retire à son compteur annuel. C’est une mesure et pas une garantie : le report des mois précédents est tenu par le service dans son propre tableur, pas chez nous, et la vérification le dit en tête de son résultat.
AméliorationLes résultats de vérification nomment les médecins au lieu de les abréger. Quatre prénoms sont portés par deux personnes différentes dans ce service : une initiale seule désignait tôt ou tard la mauvaise. Une mesure qui ne trouve pas le nom refuse maintenant de s’afficher plutôt que de se replier sur l’abréviation.
AméliorationUne vérification en contredisait une autre sur un même point : les dates figées de la médecin extérieure étaient traitées comme une anomalie d’un côté et comme le comportement attendu de l’autre. Le service a répondu que ces dates se décident chaque mois avec elle — il n’y a donc plus qu’un seul endroit qui en parle. Les seules anomalies qui subsistent sont deux points déjà connus et en attente : une date d’arrivée que personne ne nous a communiquée, et une règle de week-end que le moteur ne sait pas encore exprimer.
AméliorationLes vérifications nomment désormais les médecins au lieu de les abréger. Vingt-deux d’entre elles affichaient encore un identifiant seul, ce qui désigne un jour la mauvaise personne : quatre prénoms sont doublés dans le service. Le décompte annuel, lui, refuse carrément de s’exécuter si un nom manque plutôt que de rendre un résultat qui a l’air juste.
AméliorationLe décompte de contribution annuelle dit maintenant qui il laisse de côté : les quatre emplois du temps construits à la main et les médecins absents du mois. Il les écartait en silence, ce qui laissait croire qu’il couvrait tout le service alors que deux des quatre ont pourtant une cible horaire donnée par le service.
v8.232.006/09/2026
MoteurUn planning complet des urgences pédiatriques de Trousseau a été produit et passé au crible des vingt-neuf vérifications de comportement, pour la première fois. Vingt-et-une sont respectées sur les cinq essais : les enchaînements de nuits, le repos après une garde, les week-ends consécutifs, l’encadrement des internes, les cinq jours de travail d’affilée, l’équilibre des gardes du week-end. Aucun défaut du moteur n’est ressorti.
FixLe décompte des heures était faux de trois manières à la fois, et c’est le service lui-même qui donne la bonne règle : 8,8 heures par jour ouvré, jours fériés retirés, et pour les quatre médecins à mi-temps une moitié de mois entière plutôt qu’une demi-semaine chaque semaine. Les vérifications attendaient tantôt des demi-semaines, tantôt quarante-quatre heures forfaitaires — ce qui déclarait vingt-quatre dépassements imaginaires, et en cachait quatre bien réels dans la semaine du 11 novembre, qui ne compte que quatre jours ouvrés.
FixLe budget d’heures complémentaires affiché pour les médecins à mi-temps était faux dans les deux sens. Les deux moitiés de novembre 2026 ne pèsent pas pareil — neuf jours ouvrés d’un côté, onze de l’autre — et le calcul les traitait à égalité : un médecin pile sur sa cible s’en voyait annoncer huit heures à distribuer, un autre en avait neuf de plus qu’affiché.
AméliorationLa cible horaire du service n’est plus calculée à trois endroits différents mais à un seul, celui où la règle qu’il a écrite est transcrite. Deux des trois calculs étaient faux, et chacun l’était à sa façon.
AméliorationTrois règles que le service a demandées ne sont encore appliquées par personne, et les vérifications le disent désormais avec leur preuve : un seul créneau de garde par week-end, les heures de garde décomptées des quarante-quatre heures, et l’ordre de priorité entre la cible d’heures et l’égalité des postes. Elles repartent au suivi avec ce qu’il faudrait régler pour les ouvrir.
AméliorationLes vérifications de comportement n’avaient elles-mêmes aucun test : un planning de référence et six tests les gardent maintenant, dont un qui s’assure que les informations dont elles ont besoin arrivent bien jusqu’à elles. C’est précisément ce qui manquait pour attraper l’erreur de cible corrigée ci-dessus.
v8.231.006/09/2026
FixDeux réglages enregistrés en même temps pouvaient s’effacer l’un l’autre, sans message ni trace. Chaque écriture reposait le bloc de configuration entier tel qu’il avait été lu quelques secondes plus tôt : ce que quelqu’un d’autre avait enregistré entre-temps disparaissait sous la version périmée. La base refuse désormais une écriture dont la valeur de départ a changé, et l’enregistrement s’arrête en nommant le réglage disputé plutôt que d’écraser.
FixLe même défaut touchait la fiche de chaque médecin, et c’est le cas le plus coûteux : la page Préférences y enregistre l’adresse e-mail, les choix de notification et les soldes de RTT. Un réglage de service posé au même moment pouvait les effacer, ce qui s’est déjà produit en juillet sur tous les médecins d’un service à la fois. Si l’enregistrement entre en conflit, la page demande maintenant de recharger et de recommencer, au lieu de laisser croire que tout s’est bien passé.
AméliorationUne vérification automatique refuse désormais tout nouveau code qui reposerait un bloc de configuration entier. Les rares fichiers qui en ont encore le droit sont listés un par un avec leur motif, et la liste ne peut que raccourcir : une exception devenue inutile fait échouer la vérification. Un second contrôle rejoue le scénario exact de l’incident et vérifie que le réglage de la première session survit.
AméliorationLes scripts qui écrivent en base sont désormais contrôlés automatiquement avant chaque livraison. Ils échappaient jusqu’ici à toutes les vérifications du projet, et une faute de frappe y serait passée sans que rien ne le signale : le script aurait modifié une fiche puis se serait arrêté en cours de route, avec un message sans rapport.
FixLe récapitulatif quotidien des activités pouvait partir deux fois. Le code annonçait un verrou empêchant le double envoi, mais l’écriture qui devait le poser n’était conditionnée à rien : deux exécutions lancées en même temps constataient toutes deux que rien n’était encore envoyé, et envoyaient toutes deux. Chaque notification est maintenant réservée avant l’envoi, et une exécution qui n’en réserve aucune n’envoie rien.
FixCe même envoi effaçait au passage les autres informations attachées à une notification. Seule la marque « déjà envoyé » est désormais modifiée.
AméliorationSur l’écran de l’équipe, un enregistrement qui n’aboutit qu’à moitié le dit maintenant explicitement, en précisant ce qui a été pris et ce qui ne l’a pas été, au lieu d’un message d’erreur qui laissait croire que rien n’avait été enregistré.
AméliorationLa date de dernière modification d’un service et d’une fiche médecin est enfin tenue à jour automatiquement. Elle existait depuis l’origine mais ne bougeait jamais, sauf si le code pensait à l’écrire : elle indiquait donc la date de création. Elle suit désormais toute modification, y compris celles faites directement en base.
AméliorationLe dernier script capable d’écrire dans la configuration de plusieurs services à la fois passe lui aussi par la nouvelle écriture protégée, dans ses deux modes. S’il s’interrompt en cours de route, il indique combien de services ont déjà été modifiés.
v8.230.006/09/2026
FixAprès avoir choisi son code PIN, un médecin qui vient de s'inscrire retombait sur le formulaire de connexion — avec son propre nom déjà affiché en haut de l'écran. Il était bien connecté, l'application le lui disait, et lui redemandait quand même de s'identifier. L'arrivée sur son tableau de bord se fait maintenant directement.
FixL'écran d'inscription affiche désormais le nom de la personne à qui le lien a été envoyé, et le service concerné. Les liens sont personnels et se distribuent un par un : rien ne permettait jusqu'ici de vérifier qu'on ouvrait le bon.
FixLa barre de navigation ne s'affiche plus pendant la connexion ni pendant l'inscription. Y cliquer renvoyait vers la page de connexion et faisait perdre le lien d'invitation, qu'il fallait alors retrouver dans son fil de messages.
FixSur un service où la saisie des désidérata s'ouvre par campagne, un mois sans collecte lancée présentait un calendrier entièrement verrouillé, sans un mot d'explication — alors que le tableau de bord, la liste des mois et l'écran de planning invitaient tous les trois à le remplir. Le calendrier dit maintenant pourquoi il est fermé, et les trois écrans n'invitent plus à saisir là où rien ne peut l'être.
FixLe message de l'écran de planning affirmait « les médecins peuvent déjà remplir individuellement » y compris sur les services où c'est faux, la collecte y étant précisément ce qui déverrouille la saisie.
FixLe sélecteur « Matin / Après-midi » n'apparaît plus sur un service sans consultations : la demi-journée n'y existe pas, et un congé posé sur une matinée y partait pourtant en base.
FixSur un service sans consultations, la gomme conserve son option « Garde » : c'est le seul moyen de retirer un souhait de garde déjà posé.
FixLes interrupteurs d'envoi par email ne sont plus réglables tant qu'aucune adresse n'est renseignée. Ils étaient actifs et allumés juste sous l'avertissement « Sans email, vous ne recevrez aucune notification par email » — l'état par défaut de cinquante-neuf médecins sur soixante à Trousseau. L'écran précise aussi que les notifications dans l'application, elles, continuent d'arriver.
FixLa fenêtre de lancement d'une collecte annonçait « Les médecins ayant un email seront notifiés », périmé depuis que la notification part dans l'application à tout le monde. Elle décrit désormais les deux canaux, et le message de confirmation compte les notifications réellement parties au lieu des seuls emails.
FixLes statuts de garde ne promettent plus un poste de journée aux médecins qui n'en occupent jamais : « Je veux — poste possible » se lit maintenant « Je veux — garde demandée » pour un urgentiste.
FixLa légende sous le calendrier des désidérata ne liste plus que les statuts réellement disponibles, plus ceux déjà posés sur le mois. Elle en annonçait dix-huit, dont sept qu'aucun bouton de l'écran ne permet de poser.
FixLe tableau de bord annonçait « Le planning de Septembre n'est pas encore disponible » à un service qui démarre en novembre et ne planifiera jamais septembre. Il dit maintenant simplement qu'aucun planning n'est encore publié.
FixSur la page de connexion, l'exemple d'initiales citait celles des médecins de Rochefort. Il décrit maintenant la forme attendue, sans nommer personne.
Fix« 1 médecin sur 56 ont répondu » s'accorde enfin, sur les deux écrans qui l'affichaient.
FixL'écran « Mon suivi » vouvoie comme le reste de l'application.
FixDans la liste de l'équipe, un médecin sans cible mensuelle de gardes affichait « ? gardes/mois » — un point d'interrogation qui se lit comme une donnée manquante alors que l'absence de cible est un réglage valide, celui de cinquante-cinq médecins sur soixante à Trousseau. La mention devient « Gardes ». Et les médecins qui ne prennent que des gardes n'affichent plus de jours de poste : ils ne sont jamais postés.
FixLa page Accès annonçait deux mois de planning « Généré », avec leurs liens de partage, pour un service qui n'a encore généré aucun planning — et les liens menaient à « Planning non disponible ». Ces deux mois n'existaient nulle part : ils étaient fabriqués par un repli qui inventait le mois courant et le suivant quand la liste réelle était vide. L'écran dit maintenant qu'aucun mois n'est disponible.
FixUn administrateur peut désormais créer un médecin dont l'identifiant fait deux à cinq lettres, majuscules ou minuscules. La règle précédente n'acceptait que deux ou trois majuscules, ce qui interdisait à Trousseau la convention de son propre service. Le contrôle de doublon ignore maintenant la casse : deux fiches qui ne différaient que par elle pouvaient coexister et rendaient la connexion ambiguë.
v8.229.006/09/2026
FixTrente-sept des soixante médecins des urgences pédiatriques de Trousseau ne pouvaient pas se connecter depuis la page de connexion. Leur identifiant s’écrit en casse mixte — ThTr, SoCor, AdBe — alors que le formulaire met la saisie en majuscules et que la recherche du compte, elle, distinguait les majuscules des minuscules. Le message affiché était « Identifiant ou code PIN incorrect », donc indiscernable d’un PIN oublié, et cinq essais bloquaient l’accès un quart d’heure. Aucun autre service n’était touché : les soixante-cinq médecins de Rochefort, de Libourne et des services de démonstration ont tous un identifiant en majuscules.
AméliorationLa casse d’un identifiant ne se perd plus entre l’écran et la base : la recherche du compte transporte désormais l’identifiant tel qu’il est enregistré, et toute comparaison ignore les majuscules des deux côtés. Un contrôle automatique refuse maintenant qu’une comparaison sensible à la casse revienne dans le chemin de connexion.
v8.228.006/09/2026
FixDeux traces de mise au point tournaient encore dans la version livrée. L’une inscrivait l’identifiant du médecin qui consulte dans les journaux du serveur, à chaque affichage d’un planning et sur les trois services ; l’autre écrivait dans la console du navigateur à chaque changement de mois. Elles ne servaient plus à rien et sont retirées.
AméliorationUne vérification automatique refuse désormais toute nouvelle trace de ce genre : celles qui restent doivent être nommées une par une, avec ce qu’elles servent à diagnostiquer. Elle a détecté dès son premier passage une trace que la recherche manuelle avait manquée — le compte rendu d’une suppression de mois, seule mémoire de ce qui a été effacé, qui est conservée.
v8.227.005/09/2026
MoteurLe service de Trousseau autorise un médecin à tenir les consultations post-urgences le matin puis la médecine l’après-midi. Le moteur l’interdisait : il plafonnait à un poste par jour, sans moyen d’exprimer une exception. Sans ce cumul, les consultations du matin laissaient l’après-midi vide et faisaient venir les médecins pour une demi-journée — ce que le service demande justement d’éviter. Deux postes déclarés cumulables ne peuvent toujours pas se superposer sur les mêmes heures.
MoteurLes dates d’un médecin extérieur de Trousseau sont désormais réellement figées : le service les arrête à l’avance, et le moteur le plaçait quand même où il voulait. Il n’apparaîtra plus au planning tant que ses dates ne sont pas saisies, ce qui est le comportement attendu et se voit tout de suite.
AméliorationVingt-et-une vérifications automatiques sur les réglages de Trousseau, toutes au vert. La dernière en date distingue les deux médecins extérieurs, dont les régimes sont opposés : l’une a des dates figées, l’autre est placée selon ses disponibilités. Les confondre ferait disparaître la seconde du planning sans que cela ressemble à une erreur.
FixCinq réglages étaient rangés comme « questions à poser au service » alors qu’il y avait répondu fin août. L’un d’eux cachait le cumul décrit plus haut, resté invisible tant qu’il était classé comme question ouverte.
v8.226.005/09/2026
AméliorationLe catalogue de postes et de gardes d’un service pouvait ne décrire qu’un seul mois. Celui des urgences pédiatriques de Trousseau couvre désormais novembre ET décembre 2026, chaque poste et chaque ligne de garde portant ses propres dates d’ouverture et de fermeture. C’est ce qui permet de décrire une année qui change avec les saisons sans changer de configuration à chaque mois.
AméliorationLe créneau de 13h à 21h suit maintenant les vacances de Noël. La traumatologie y tient sa dernière journée le vendredi 18 décembre, et une médecine de 13h à 21h prend le relais à la rentrée des vacances : huit journées, du 21 au 24 puis du 28 au 31 décembre. Le 25 et les week-ends restent fermés d’eux-mêmes.
AméliorationLa deuxième garde de nuit s’arrête aux vacances de Noël, comme le service l’a demandé : dernier week-end les 19 et 20 décembre, dernière nuit de semaine le vendredi 18. Elle courait jusqu’au 31 décembre dans une première version, ce qui aurait imposé huit nuits de garde supplémentaires pendant les fêtes.
FixGénérer un mois qu’un service ne décrit pas est maintenant refusé, avec un message qui dit quelle période est couverte. Sans ce garde-fou, un mois hors saison sortait avec des postes vides et sans aucune alerte, ce qui se lit comme un choix du service plutôt que comme une erreur. Les services qui ne déclarent pas de période ne changent pas de comportement.
v8.225.005/09/2026
FixLa page d’accueil des Désidérata, celle qui liste les mois sous forme de cartes, affichait toujours les six prochains mois du calendrier sur un service qui tient deux collectes par mois. Seul le sélecteur de la page d’un mois avait été corrigé. Un médecin arrivait donc sur six cartes dont quatre le renvoyaient vers un écran où il ne pouvait rien saisir.
FixCette même liste faisait remonter des mois révolus. Sur le service de démonstration, avril et août 2026 apparaissaient avant novembre, et le mois proposé par défaut devenait avril. La liste s’arrête maintenant au mois en cours, comme avant, et ne peut plus s’allonger d’une carte à chaque mois ouvert.
AméliorationUn service peut déclarer le mois à partir duquel il utilise l’application. Sa page Désidérata démarre alors à ce mois-là au lieu du mois courant. Trousseau commence en novembre 2026 : sans cette borne, ses médecins verraient septembre et octobre, deux mois où le service n’existe pas encore ici. Le réglage est posé pour eux ; aucun autre service n’en déclare, et rien n’y change.
v8.224.005/09/2026
AméliorationVingt réglages du service de Trousseau sont désormais vérifiés automatiquement : l’heure de début de la garde de week-end, les horaires partagés par tous les postes de semaine, les codes de demi-garde selon le jour, les postes qui n’ouvrent qu’à certaines saisons, le nombre de lits portes du mois, et cinq situations individuelles nommées par le service. Jusqu’ici ces réglages étaient posés sans que rien ne signale leur disparition.
FixLe tableau de bord des règles de Trousseau surévaluait son propre score. Il comptait une règle comme vérifiée dès qu’un fichier mentionnait son numéro, une phrase de commentaire comprise — douze règles étaient dans ce cas, soit près d’un cinquième du total annoncé. Une règle n’est désormais comptée que si un contrôle déclare la juger. Le score passe de 43 à 52, après être réellement descendu à 32.
AméliorationLe tableau de bord distingue enfin « on sait juger cette règle » de « le service la respecte ». Les deux avaient divergé dès le premier contrôle écrit : sans cette séparation, outiller une règle que rien ne tient faisait monter le score au moment même où l’on découvrait le trou.
FixTrois vérifications automatiques ne pouvaient pas échouer, et une quatrième réussissait pour une raison qui n’était pas celle qu’elle annonçait. Corrigées : chaque vérification est désormais éprouvée en cassant volontairement le réglage qu’elle surveille.
FixLe fichier qui mémorise le résultat des vérifications porte le nom du service concerné, et personne ne le lisait. Lancer les vérifications sur un autre service aurait écrasé ce fichier, et le tableau de bord aurait affiché sous le titre de Trousseau des résultats mesurés ailleurs.
FixDeux fiches de médecin portant le même identifiant : l’une écrasait l’autre en silence, et toute vérification nommant la personne écrasée devenait verte sans rien juger. C’est désormais refusé au chargement.
FixTrouvé en écrivant ces contrôles : le service indique que les dates d’un de ses médecins extérieurs sont arrêtées avant la génération, et rien ne les fige côté moteur. Le planning de novembre la place donc librement. Le contrôle le signale à chaque passage ; la correction demande une décision du service.
v8.223.105/09/2026
AméliorationSur un service qui tient deux collectes par mois, le sélecteur de mois ne propose plus que les mois réellement ouverts au médecin, plus ceux qui portent un planning. Il affichait six mois glissants quoi que l’administrateur ait ouvert. Les services à collecte unique gardent leurs six mois, y compris ceux à venir que les médecins préremplissent.
FixUn outil de saisie qui vient d’être retiré ou verrouillé ne reste plus armé sous le curseur. Le clic était bien refusé, mais après le geste.
FixLes désidérata de garde d’un service scindé arrivaient au suivi des demi-journées avec un créneau que ce calcul ne connaît pas. Ils sont désormais lus comme des journées entières, ce qu’ils sont.
v8.223.005/09/2026
FixL’application installable sur mobile portait le nom d’un seul service, « Pédiatrie CH Rochefort », quel que soit l’établissement qui l’installait. Le nom apparaît au moment d’accepter l’installation sur Android, puis dans la fiche de l’application ; un médecin de Libourne ou de Trousseau y lisait donc celui d’un autre hôpital. Le libellé sous l’icône, lui, était déjà neutre. L’application s’installe désormais sous le nom « DeGarde — Planning de garde hospitalier », et un contrôle automatique empêche qu’un nom de service revienne s’y glisser.
v8.222.005/09/2026
FixSur un service qui tient deux collectes de désidérata par mois, le mail annonçant la seconde n’aurait été envoyé à personne. Le journal des envois ne distinguait pas les deux collectes : tous ceux qui avaient reçu le premier mail, trois semaines plus tôt, étaient considérés comme déjà prévenus. L’écran aurait annoncé un envoi réussi. Corrigé avant qu’un service ne tienne deux collectes.
v8.221.005/09/2026
FixGeler un mois sur lequel aucune collecte n’a été lancée allait cesser de fonctionner à la prochaine mise à jour de la base. Le cas se produit sans rien activer de nouveau : un mois passe en « Collecte » dès que toute l’équipe a transmis, le bouton « Geler » s’affiche alors sur un mois sans collecte enregistrée. Corrigé avant la mise à jour, donc jamais visible en production.
v8.220.005/09/2026
FixSur un service qui tient deux collectes de désidérata par mois, lancer la seconde effaçait la première. L’écran annonçait « Collecte lancée », et en base la collecte des gardes avait été remplacée par celle de journée : les souhaits déjà recueillis devenaient invisibles, la nouvelle collecte naissait fermée, et un médecin qui ne prend que des gardes ne pouvait plus déclarer ses congés. Aucun service en production n’était concerné, la fonctionnalité n’ayant jamais été activée ailleurs.
FixLe compte de réponses affiché à l’administrateur était celui du service entier, alors que chaque collecte ne concerne qu’une partie de l’équipe. Il annonçait 3 réponses sur 9 là où le médecin lisait 1 sur 6 pour le même mois. Plus gênant, « prêt à générer » attendait une réponse de chaque médecin du service, y compris de ceux que la collecte ne concerne pas : le planning ne pouvait donc jamais devenir générable.
FixLes désidérata transmis par un administrateur pour lui-même n’étaient rattachés à aucune collecte, donc jamais comptés. Trois administrateurs sont dans ce cas à Trousseau.
FixLe bouton « Relancer les médecins » écrivait à tout le service, y compris à ceux qu’une collecte de journée ne concerne pas.
FixGeler une collecte annonçait à tout le monde que « les modifications ne sont plus possibles ». C’est faux quand une seule des deux collectes du mois est gelée : les congés et les arrêts maladie restent déclarables, et l’autre collecte continue. Le message nomme désormais la collecte gelée et dit ce qui reste ouvert.
FixLe bouton « Geler » de la vue admin ne trouvait aucune collecte à geler sur un service qui en tient deux, et répondait qu’elle n’existait pas.
Fix« Modifier mes désidérata » restait proposé à un médecin qu’aucune collecte du mois ne concerne, et ouvrait sur un écran où tous les outils étaient verrouillés.
FixUne panne de lecture au moment du lancement rétrécissait la liste des médecins prévenus au lieu de l’élargir, à l’inverse de la règle voulue : quand on ne sait pas qui est concerné, on prévient tout le monde.
AméliorationDeux refus s’expliquent enfin. Lancer une seconde collecte affichait un message d’erreur de la base de données ; il dit maintenant qu’un seul type de collecte est possible par mois pour l’instant, et que la collecte en cours n’a pas bougé. Et un médecin dont la seconde transmission est refusée lisait « réessayez », ce qui ne pouvait pas marcher ; il lit désormais que ses désidérata sont bien enregistrés.
v8.219.004/09/2026
AméliorationLe rapport moteur affiché sous un planning dit désormais QUI a dépassé la règle des cinq jours travaillés d’affilée, et à partir de quelle date. Il indiquait seulement « pénalisée 3 fois », ce qui ne permet pas d’appeler la personne concernée avant de valider le mois — or c’est précisément ce que fait le service de Trousseau. Une même personne n’apparaît qu’une fois, à sa première date.
AméliorationHuit règles du service de Trousseau que le moteur respectait déjà sans que rien ne le dise sont désormais rattachées au réglage exact qui les porte, et un contrôle automatique refuse qu’on retire ce réglage en silence. Parmi elles : un seul médecin par créneau de garde, jamais deux nuits consécutives, pas de cumul sur les deux créneaux de traumatologie, et la prise en compte du mois précédent et du mois suivant.
FixUne analyse interne annonçait que le moteur comptait un jour férié comme un week-end dans la règle qui évite deux week-ends de garde d’affilée, contrairement à ce que Trousseau demande. C’est faux : le moteur fait bien ce que le service demande. La note qui affirmait le contraire visait deux autres règles, qui ne parlent pas du même sujet.
FixL’inventaire des règles de Trousseau cessait de signaler un manque dès qu’un fichier mentionnait la règle au détour d’un commentaire, même sans rien implémenter. Trois manques réels étaient ainsi devenus invisibles. Seule une preuve les retire désormais de la liste.
v8.218.004/09/2026
AméliorationCinq règles de plus du service de Trousseau sont désormais vérifiables sur un planning produit : l’équilibrage des week-ends, le fait que les heures de garde soient comprises dans les 44 heures et non ajoutées, la liste fermée des quatre médecins dispensés d’équilibrage, la priorité du planning de garde sur celui de semaine, et la séparation des lits portes de week-end et de semaine. Elles étaient déjà paramétrées ; rien ne disait si un planning les respectait.
AméliorationUne conclusion d’analyse est corrigée : un rapport interne affirmait que Trousseau n’avait jamais demandé que les week-ends de garde soient répartis équitablement, et proposait de retirer cinq règles sur cette base. Le service l’a demandé explicitement. Les cinq règles n’avaient jamais été retirées et ne le seront pas.
FixLes outils internes qui rejouent un mois pour le vérifier ne recevaient aucune des affectations figées à la main : 81 à 124 selon le mois et le service. Ils mesuraient donc un planning plus libre que celui que l’application produit vraiment. La génération, elle, n’a jamais été affectée.
MoteurChez Trousseau, un médecin ne peut plus être posté en journée le jour où il prend une garde, ce que le service demandait et que le moteur ne respectait pas : douze à treize journées par mois étaient concernées. Deux médecins que le service dispense de cette règle la subissent désormais aussi ; leur cas se règle en figeant la journée à la main.
MoteurChez Trousseau toujours, la régulation n’est plus proposée aux docteurs juniors.
FixDeux réglages de fiche médecin auraient été effacés au premier enregistrement des Réglages : l’enregistrement réécrit la fiche entière à partir de la liste des champs connus de l’écran, et ceux-là n’y étaient pas. Ils sont désormais visibles et modifiables depuis Équipe, comme les plafonds posés sur un groupe de postes, qui n’apparaissaient nulle part.
FixDeux réglages de fiche médecin n’atteignaient pas le moteur : ils étaient enregistrés, visibles, et ignorés au moment de générer. Un réglage saisi sur une fiche traverse deux conversions successives, et chacune ne recopie que les champs qu’elle connaît. Un contrôle automatique refuse désormais qu’un champ soit lu sans être transmis.
MoteurUn médecin peut être dispensé individuellement de la règle « pas de poste le jour de sa garde ». Deux médecins de Trousseau sont nommément dispensés par leur service ; la règle venait de leur être appliquée à tort.
MoteurUn médecin à mi-temps peut désormais être déclaré sur une moitié fixe du mois : le moteur choisit s’il travaille du 1er au 15 ou du 16 à la fin, et ne le fait plus passer d’un côté à l’autre. Quatre médecins de Trousseau étaient concernés chaque mois.
MoteurUn créneau peut maintenant n’exister que sur une partie du mois. La deuxième garde de nuit de Trousseau commence au premier lundi de novembre : elle était ouverte la veille, un dimanche, faute de pouvoir dire « à partir du ».
MoteurDeux postes qui portent le même nom pour l’équipe peuvent être comptés comme un seul dans les plafonds hebdomadaires. Chez Trousseau, les deux sièges de lits portes et les deux créneaux de traumatologie étaient comptés séparément, donc la règle « pas deux fois le même poste dans la semaine » ne les voyait pas. Sur un mois test, les deux à douze répétitions constatées tombent à zéro.
FixL’outil qui vérifie le planning de Trousseau signalait chaque semaine où un médecin est SOUS sa cible d’heures comme un défaut, alors que cet écart est précisément le temps à remplir en activités non cliniques. Soixante à soixante-huit fausses alertes par mois, les deux tiers de son total. Il ne signale plus que les dépassements, et affiche le déficit à part.
v8.217.004/09/2026
AméliorationUne commande donne désormais l’état réel du paramétrage de Trousseau : combien de règles du client sont à la fois appliquées par le moteur et vérifiables sur un planning produit. Le compte précédent mesurait combien de règles étaient mentionnées quelque part, ce qui ne dit rien de leur effet. Un contrôle automatique interdit à ce nombre de redescendre.
AméliorationDeux enregistrements successifs ne lancent plus deux fois la même batterie de tests en parallèle, sauf sur la branche principale où l’interrompre ferait perdre la dernière vérification après une mise en ligne.
FixLes propositions de modification entre deux branches de travail n’étaient vérifiées par aucun test automatique. L’une d’elles a touché le cœur du moteur le 3 septembre sans autre filet qu’une vérification à la main.
v8.216.004/09/2026
FixLa génération d’un planning échouait avec une erreur 500 quand le calcul des consultations de l’année devait relire un mois enregistré avant juillet 2026. Ces mois-là ont un format d’affectation plus ancien que le calcul ne savait pas lire. Il le convertit désormais à la lecture, comme les deux autres calculs annuels le faisaient déjà.
FixLes liens d’accès des 59 soignants de Trousseau se devinaient à partir du nom du service et des initiales. Ils ont tous été remplacés par des liens tirés au sort. Les comptes déjà créés ne bougent pas, ils continuent de se connecter avec leur identifiant et leur code ; les liens d’invitation encore en attente sont à renvoyer depuis Réglages puis Accès.
FixUn abonnement calendrier créé avec un ancien lien Trousseau cesse de se mettre à jour : il faut le refaire depuis l’application.
AméliorationL’outil qui vérifie le planning de Trousseau contre les réponses du client refuse désormais de rendre le moindre verdict s’il cite une question à laquelle le client a répondu autre chose. Neuf renvois faux avaient traversé quatre relectures successives, dont deux nés d’une correction à la main des sept premiers.
FixDeux contrôles se trompaient de personne ou de règle. L’un dispensait un médecin d’une contrainte qui le vise et en accusait un autre qui en est explicitement exempté ; le second laissait passer neuf jours de présence sur dix sans rien signaler.
v8.215.004/09/2026
FixQuand un mois refuse de se générer, les correctifs proposés sont désormais calculés sur le mois réel. Ils l'étaient jusqu'ici sur une image approximative des souhaits de l'équipe : une demi-journée demandée libre y était comprise comme la journée entière, et un refus de garde de nuit valait pour toutes les gardes du jour. Sur un mois de Libourne, 41 souhaits de demi-journée et 49 souhaits portant sur une garde précise étaient ainsi élargis. Les propositions cherchaient donc à débloquer un mois plus contraint que le vrai.
FixLes absences déclarées en activité arrivent maintenant elles aussi jusqu'à ce calcul. Seul le congé sans solde y parvenait. Une activité externe ou une formation donnée passaient inaperçues, et un correctif pouvait proposer de poser quelqu'un un jour où il n'était pas là.
AméliorationL'écran qui génère le planning et celui qui propose des correctifs lisent désormais les souhaits de l'équipe au même endroit, et un contrôle automatique refuse tout retour en arrière. C'est le deuxième écart de cette nature entre ces deux écrans : le premier, corrigé en juillet, portait sur ce qu'ils savaient du mois précédent.
v8.213.003/09/2026
MoteurDeux générations du même mois à Libourne ne posaient pas exactement le même problème au moteur. Les mêmes règles, mais énoncées dans un ordre qui changeait d’une fois sur l’autre, et le moteur n’y est pas indifférent. Une part des écarts constatés entre deux plannings générés coup sur coup venait donc de là, et non de ses arbitrages. L’ordre est désormais fixe.
MoteurRochefort et Trousseau n’étaient pas concernés et ne bougent pas d’une affectation. La règle en cause ne s’exécute que dans les services qui déclarent des postes incompatibles avec la garde du même jour, ce que seul Libourne fait aujourd’hui, sur six de ses postes.
AméliorationUn contrôle automatique refuse maintenant le code qui ferait revenir ce défaut. Il avait tenu des mois sans être vu : le seul contrôle qui existait portait sur Rochefort, précisément le service où la règle fautive ne tourne jamais.
AméliorationL’outil de non-régression du moteur distingue enfin un changement d’ordre d’un changement de poids. Il annonçait le second pour le premier, soit son diagnostic le plus alarmant pour la modification la plus inoffensive qui soit.
v8.212.002/09/2026
FixLe questionnaire « Vos retours » a été retiré. C'était le formulaire de validation utilisé à la mise en service de Rochefort, en février. Il était resté accessible depuis le pied de page de toute personne administratrice, quel que soit son service, et il y affichait en clair des prénoms de médecins de Rochefort, leurs nombres de gardes par mois et leurs préférences personnelles.
FixL'écran qui affichait les réponses part avec lui. Il les listait toutes sans distinction de service : un administrateur d'un autre établissement y aurait lu les réponses libres des médecins de Rochefort. Les réponses déjà enregistrées ne sont pas supprimées, elles restent en base.
AméliorationLe canal de retour reste le petit sondage du pied de page, à côté du changelog. Lui est rattaché à votre service et n'est lisible que par ses administrateurs.
v8.211.002/09/2026
FixLe compteur « libres » de la carte « Ce mois-ci », sur la page d’accueil de chaque médecin, comptait chaque jour travaillé comme un jour libre dans les services autres que Rochefort. Un médecin posté tous les jours d’une semaine y lisait « 4 libres ». Le calcul reconnaissait trois noms de postes seulement, ceux de Rochefort ; partout ailleurs il ne reconnaissait plus rien et concluait que la journée était vide. Les chiffres de Rochefort, eux, ne bougent pas d’un jour.
Fix« Ajouter une absence » ne propose plus quelqu’un déjà posté ce jour-là. Même cause : hors Rochefort, la liste ignorait les postes réellement tenus et offrait toute l’équipe, y compris les médecins affichés en maternité ou aux urgences la même journée.
FixLe bandeau « ce que votre modification change » restait muet sur le bonus « garde le jour où l’on tient déjà le poste préféré du service ». Il ne savait reconnaître que le poste préféré de Rochefort ; les services qui en désignent un autre ne voyaient jamais ce gain apparaître, alors que le moteur, lui, l’accordait bien. Le bandeau et le moteur disent désormais la même chose.
AméliorationLa lecture des postes d’une journée a maintenant une seule définition partagée, pour les six écrans qui en avaient chacun leur copie. Ce défaut a été corrigé quatre fois sur quatre écrans différents, des mois d’intervalle, précisément à cause de ces copies.
AméliorationUn contrôle automatique refuse désormais tout nouveau code qui désignerait un poste de Rochefort en dur. C’est ce qui a fait passer les quatre bugs précédents : chacun a été trouvé par hasard, aucun n’avait été signalé.
v8.210.001/09/2026
FixLe bouton « + consult. » réapparaît pour un médecin qui vient travailler un jour où il ne travaille normalement pas. À Rochefort, impossible d'ajouter une consultation à Simon Biarnes le mercredi 16 septembre : il ne travaille aucun mercredi, il était donc compté absent ce jour-là malgré son poste en hospitalisation, et toute sa ligne disparaissait de « Positionner l'équipe » — le bouton avec elle, sans un mot pour dire pourquoi.
AméliorationL'administratrice peut désormais positionner quelqu'un que le planning dit absent, y compris en congés ou en formation. C'était refusé sans explication ; c'est maintenant autorisé, avec l'information nécessaire pour décider.
AméliorationLa ligne d'un médecin absent porte son motif en clair : « Congés », « Arrêt maladie », ou « Ne travaille habituellement pas le mercredi » quand l'absence vient de ses jours off et non d'une déclaration.
AméliorationLe positionner demande une confirmation qui rappelle le motif, ce qui va être posé, et le fait que le médecin n'en sera pas prévenu automatiquement.
v8.209.028/08/2026
FixUn écran « Erreur sur cette page » pouvait remplacer le planning alors que tout allait bien. Il suffisait qu'une seule lecture de données soit refusée pendant quelques millisecondes par notre hébergeur de base. C'est arrivé deux fois en trois jours sur le lien de consultation de Rochefort : la personne voyait un écran d'erreur, rechargeait, et le planning s'affichait normalement.
AméliorationL'application retente maintenant d'elle-même une lecture qui échoue, deux fois, à 150 puis 400 millisecondes d'intervalle. Un incident de cette durée devient invisible. Au-delà, l'écran d'erreur revient : afficher un planning à moitié lu serait pire.
AméliorationLes enregistrements, eux, ne sont jamais retentés. Une garde proposée ou une notification envoyée en double serait plus grave qu'une erreur visible : en cas de doute, l'application préfère s'arrêter et le dire.
AméliorationL'ouverture d'une page de service demandait deux fois de suite la même information. Une seule demande suffit désormais, ce qui réduit d'autant les occasions de tomber sur un incident.
v8.208.028/08/2026
FixLes flèches « mois précédent » et « mois suivant » du lien de consultation partagé retrouvent tous les mois publiés. Un mois restauré depuis l'historique devenait invisible depuis ses voisins : le lien des secrétaires « s'arrêtait à juillet », sans flèche vers août, et un lien d'août ou de septembre ne permettait plus de revenir en arrière. Seule l'adresse directe du mois fonctionnait encore.
FixUne flèche ne mène plus à un mois qui n'est pas publié. Un planning généré mais encore en brouillon proposait quand même sa flèche, et la page répondait « Planning non disponible » — un cul-de-sac, visible en passant de septembre à octobre.
AméliorationLa flèche et la page posent désormais littéralement la même question : « ce mois est-il publié ? ». Elles s'appuyaient sur deux informations différentes, ce qui les faisait diverger dans les deux sens. Un contrôle automatique empêche qu'elles se remettent à diverger.
v8.207.027/08/2026
FixUn mois dont le planning a été supprimé peut de nouveau être restauré depuis l'application. Le contenu était bien conservé et la restauration existait déjà, mais elle n'était accessible que depuis la page du planning — laquelle ne s'affiche plus une fois le planning supprimé. Autrement dit, le filet de sécurité était hors d'atteinte précisément dans le seul cas où il servait vraiment. Il fallait passer par une intervention manuelle sur la base.
NouveauSur un mois supprimé, le responsable voit maintenant un encadré « Ce mois a déjà eu un planning », déplié d'emblée, qui liste les versions conservées et propose de remettre celle de son choix. Le mois reste invisible pour les médecins tant qu'il n'a pas été restauré : rien ne change pour eux.
FixRestaurer un mois supprimé prévient désormais les médecins concernés. L'application comparait le mois restauré à « rien », concluait qu'aucune journée n'avait changé et ne prévenait personne — un mois entier de gardes revenait dans le silence complet, alors même que la fenêtre de confirmation, elle, annonçait bien qui serait prévenu.
AméliorationLa fenêtre de confirmation dit ce qu'elle fait vraiment dans ce cas : « Ce mois est vide aujourd'hui — la restauration y remettrait 81 affectations », plutôt que d'annoncer des changements « sur le planning affiché » devant un écran qui n'affiche rien.
v8.206.027/08/2026
NouveauQuand le planning d'un mois déjà validé est retouché, les médecins concernés sont maintenant prévenus — dans l'application et par e-mail. Jusqu'ici rien ne le signalait : on découvrait le changement en ouvrant le planning, parfois plusieurs jours après, parfois trop tard pour s'organiser. Les échanges entre collègues et les restaurations de version prévenaient déjà ; la retouche faite depuis l'espace du responsable, elle, ne prévenait personne.
NouveauLe message dit précisément ce qui a changé pour vous, pas seulement que quelque chose a bougé : « mar. 8 sept. — Maternité : vous y êtes désormais affecté(e) », « vous remplacez Marion Seguin », « vous n'y êtes plus », « Laura Berdah vous remplace ». Au-delà de cinq changements, les premiers sont détaillés et le reste est annoncé.
AméliorationSeules les personnes réellement touchées reçoivent quelque chose. Une retouche qui déplace trois médecins envoie trois messages différents, chacun ne contenant que ses propres journées — et personne d'autre dans le service n'est dérangé.
AméliorationLes retouches sont regroupées par séance de travail : le responsable qui corrige cinq cases de suite déclenche un seul message, pas cinq. L'application attend vingt minutes de calme avant d'envoyer, puis vérifie toutes les heures.
AméliorationLa personne qui fait la modification n'est jamais notifiée de sa propre modification. Un échange entre collègues n'est pas notifié deux fois : il l'était déjà au moment de son acceptation.
AméliorationUne nouvelle ligne « Planning modifié après validation » apparaît dans Mes notifications, avec ses deux cases e-mail et in-app, distincte de « Planning validé ». Couper l'annonce de publication ne doit pas rendre muet sur un changement qui touche ses propres journées.
AméliorationLes mois encore en brouillon et les mois déjà écoulés ne déclenchent rien : un brouillon bouge par nature, et une régularisation faite après coup n'appelle aucune action.
v8.205.027/08/2026
AméliorationLe rapport du moteur et l'historique des modifications passent SOUS le planning. Ces deux volets étaient déjà les derniers de leur bloc, mais ce bloc entier est affiché avant la grille : à l'écran, ils s'intercalaient entre l'en-tête et le planning. Ce sont des outils de diagnostic qu'on va chercher quand on doute, consultés par le seul responsable du planning — ils n'ont rien à faire au-dessus de ce qu'on vient lire.
AméliorationLes deux restent repliés par défaut, et l'historique ne charge ses versions qu'à l'ouverture. Rien ne change à leur contenu ni à la restauration d'une version antérieure.
v8.204.026/08/2026
AméliorationChaque génération de planning laisse désormais une trace : le mois visé, l'heure, la personne, le résultat, les verrous réellement transmis au moteur, les trous obtenus et le message d'erreur le cas échéant. Les échecs sont enregistrés au même titre que les réussites. Jusqu'ici rien ne gardait la moindre trace d'une génération : le résultat écrasait le précédent, une génération réussie effaçait les retouches manuelles, et un échec ne s'écrivait nulle part. Résultat, un « j'ai généré et ça n'a pas tenu compte de mon verrou » devenait invérifiable au bout de quelques jours.
AméliorationUne génération interrompue par l'hébergeur avant la fin laisse une trace ouverte, jamais refermée — ce qui la distingue à coup sûr d'une erreur du moteur. C'est le cas le plus difficile à diagnostiquer, parce qu'aucun code ne tourne au moment où la coupure a lieu.
AméliorationUn clic sur Générer refusé parce qu'une génération est déjà en cours est lui aussi enregistré : l'admin qui a l'impression de cliquer dans le vide laisse maintenant une trace.
v8.203.026/08/2026
FixPoser une garde à la main sur quelqu'un qui avait coché « pas de garde » ne déclenchait aucune alerte. C'est le seul souhait de l'équipe qui échappait complètement au contrôle : un congé, un arrêt, une formation, une activité extérieure sont tous signalés depuis toujours, parce qu'ils rendent le médecin absent de la journée. « Pas de garde » ne rend absent de rien — la personne travaille normalement, elle ne veut simplement pas la garde — et c'est précisément par là que le contrôle ne passait pas.
FixL'alerte apparaît maintenant au moment du changement, avec le nom et le jour, et la journée concernée est également listée dans les conflits de l'espace admin. Les postes de la même journée restent proposés sans rien dire : « pas de garde » n'a jamais voulu dire « pas là ».
AméliorationLes souhaits plus doux — « je préférerais éviter la garde ce jour », « je préférerais ne pas travailler » — sont eux aussi signalés, mais dans un registre distinct, à titre d'information et jamais comme un conflit. Ils restent des préférences que le responsable du planning peut arbitrer en connaissance de cause.
AméliorationQuand un service distingue la garde de journée de celle de nuit, l'alerte suit cette distinction : un « pas de garde la nuit » n'empêche plus la garde de journée du week-end, et couvre en revanche la garde de 24 h, qui contient la nuit.
AméliorationLe contrôle vaut pour tous les services, pas seulement celui où le problème a été remarqué : quand un service distingue la garde de journée de celle de nuit, un « pas de garde la nuit » posé sur une garde de nuit remonte au même titre.
FixLes échanges entre médecins étaient touchés par le même angle mort : un collègue qui avait coché « pas de garde » un jour donné apparaissait comme partenaire parfaitement disponible, et l'échange partait sans que rien ne le signale. Sa fiche porte désormais le motif, en orange.
AméliorationIci l'application prévient, elle n'interdit pas. Le collègue reste proposé et la demande peut partir : si les deux personnes en ont parlé et que la situation a évolué, c'est leur affaire. Le message invite d'ailleurs à en confirmer avec l'intéressé, exactement comme il le faisait déjà pour une absence. Et celui qui a bloqué le jour garde le dernier mot — il accepte ou il refuse.
AméliorationDans l'espace du responsable du planning, en revanche, un « pas de garde » reste un conflit franc : la retouche manuelle n'est pas une conversation entre deux collègues.
FixLa vérification a lieu aussi côté serveur, pas seulement à l'écran : les six opérations qui modifient réellement le planning — proposer, répondre, échanger, contre-proposer, offrir une garde, y répondre — lisent les souhaits de l'équipe avant d'écrire, si bien qu'un onglet resté ouvert depuis avant la saisie d'un désidérata voit la même chose que tout le monde.
AméliorationEffet visible à connaître : le tableau de bord et le résumé d'une modification en cours lisent désormais les souhaits de l'équipe, ce qu'ils ne faisaient pas. Ils affichent donc des alertes qu'ils n'avaient jamais montrées — y compris une qui existait déjà ailleurs, « de garde la veille d'une journée au CHU ». Ce ne sont pas de nouvelles anomalies, ce sont des anomalies qui étaient invisibles sur ces deux écrans.
AméliorationUne dérogation posée volontairement — un verrou du responsable sur cette garde — reste silencieuse : c'est une décision assumée, pas un oubli. Vingt-trois tests verrouillent l'ensemble, dont cinq qui rougissent si le lien entre les souhaits de l'équipe et l'écran d'édition venait à se rompre — le défaut d'origine n'était pas un mauvais calcul, mais un calcul juste sur une information qui n'arrivait pas.
v8.202.026/08/2026
FixQuand le moteur ne peut pas remplir toutes les cases, le message d'erreur propose enfin les deux vraies sorties, côte à côte : générer quand même en laissant les cases vides — à combler ensuite à la main ou avec un remplaçant — ou lever une indisponibilité et relancer. Jusqu'ici le texte ne nommait que la seconde, alors que le bouton juste en dessous offrait la première : sur un mois vraiment en sous-effectif, où aucun désidérata ne peut débloquer la journée, on suivait la consigne affichée et on tournait en rond.
FixCe message peut désormais défiler. Avec plusieurs jours bloquants listés, sur un téléphone ou une fenêtre peu haute, le bas de la fenêtre — donc le bouton « Générer avec les postes manquants » — sortait de l'écran, et la page derrière étant figée, il n'y avait aucun moyen de l'atteindre. Le bouton reste visible quelle que soit la longueur de la liste.
AméliorationLe titre ne dit plus « Aucune solution trouvée », qui laissait croire à une impasse, mais « Certaines cases ne peuvent pas être remplies » — ce qui est le cas, et se traite.
v8.201.017/08/2026
NouveauRevenir en arrière est maintenant possible. Chaque version de l'historique porte un bouton « Restaurer » : le planning du mois redevient exactement ce qu'il était à ce moment-là. Le cas qui a motivé tout ça — un planning validé par erreur, ou une régénération qui a effacé une matinée de corrections — se répare désormais en deux clics au lieu d'être définitif.
NouveauAvant de confirmer, l'application dit précisément ce qui va changer : le nombre de modifications, le détail case par case avec les noms des médecins, et qui sera prévenu. La comparaison se fait avec le planning affiché aujourd'hui, pas avec la version qui précédait celle qu'on restaure — c'est bien « ce qui va changer », pas « ce qui s'est passé ce jour-là ».
AméliorationDeux conséquences invisibles sur la grille sont annoncées noir sur blanc. Les demandes d'échange en cours sur le mois sont annulées, parce qu'elles désignent des gardes qui viennent peut-être de changer de main. Et les verrous posés depuis peuvent contredire la version restaurée : ils sont listés, avec la précision de ceux qui étaient déjà en désaccord avant la restauration.
AméliorationLes médecins dont les affectations changent reçoivent une notification, et eux seuls — pas toute l'équipe. Elle porte sa propre icône, distincte de celle d'un planning validé : recevoir « planning validé » alors que ses gardes viennent de changer serait trompeur.
AméliorationUne restauration est elle-même annulable : l'état d'avant est conservé dans l'historique au même titre que les autres, et ne sera jamais purgé. Il n'y a pas de point de non-retour.
FixLa restauration est atomique : la réécriture du planning et l'annulation des échanges réussissent ou échouent ensemble. En cas d'échec, rien ne bouge et le message le dit — pas d'état à moitié appliqué.
v8.200.017/08/2026
NouveauLe planning garde désormais la trace de ses modifications. Un nouveau volet « Historique des modifications », en bas de la vue admin de la page Planning, liste chaque changement du mois : la date, la personne, la raison du changement, et le détail de ce qui a bougé — « samedi 12 septembre, garde de nuit : Camille Bartognali remplacée par Youssef Nasri ». Jusqu'ici le planning n'avait qu'un seul état : chaque enregistrement écrasait le précédent, sans laisser aucune trace de ce qui venait d'être remplacé.
NouveauUne régénération n'efface plus définitivement le travail manuel. Relancer le moteur sur un mois retouché à la main supprimait sans avertissement toutes les corrections apportées, et rien ne permettait de les retrouver. Le planning complet est maintenant mis de côté juste avant, et reste consultable dans l'historique. Même chose pour la suppression d'un planning et pour le retour d'un mois validé en brouillon.
AméliorationLes versions issues d'une validation, d'une régénération ou d'une suppression sont conservées sans limite de durée. Les enregistrements courants d'une séance de retouches sont gardés sur les vingt derniers, de quoi revenir sur la séance en cours et la précédente sans faire grossir la base indéfiniment.
AméliorationL'origine de chaque changement est indiquée : retouche du responsable, validation, échange entre médecins, retrait d'absence, régénération. Un échange accepté entre deux médecins et une correction manuelle ne se distinguaient jusqu'ici par rien du tout.
AméliorationL'historique n'est chargé qu'au moment où on l'ouvre : la page Planning reste aussi rapide qu'avant pour tous ceux qui ne s'en servent pas. Le volet ne remonte pas avant sa mise en service et le dit explicitement plutôt que d'afficher une liste vide trompeuse.
AméliorationRevenir à une version antérieure d'un simple clic n'est pas encore possible — c'est l'étape suivante. Tout ce qu'il faut pour le faire est désormais conservé.
v8.199.010/08/2026
FixÉchange de garde : un collègue de garde le lendemain était refusé comme partenaire d'échange. Le cas est pourtant courant — deux gardes qui se suivent, chacun reprenant celle de l'autre — et il était déjà accepté dans l'autre sens, quand le collègue était de garde la veille. Les deux sens sont désormais traités de la même façon. La reprise simple, elle, reste bloquée à juste titre : sans échange en retour, le collègue se retrouverait réellement avec deux gardes d'affilée.
AméliorationQuand l'échange n'est possible que parce que la garde voisine du collègue est justement celle qui part dans l'échange, l'application ne propose plus que cette garde-là en retour, en expliquant pourquoi. Auparavant, on pouvait choisir n'importe quelle autre date et laisser le collègue avec deux gardes de suite. Vaut aussi bien pour la proposition que pour la contre-proposition.
AméliorationLa liste des gardes d'un collègue signale maintenant celles que vous ne pourriez pas reprendre vous-même, avec la raison, au lieu de les proposer et de laisser l'échange échouer plus tard. Les deux moitiés d'un échange sont vérifiées, pas seulement celle du collègue.
FixLes échanges et reprises sont désormais revérifiés au moment où le planning est réellement modifié, et plus seulement à l'écran. Un onglet resté ouvert depuis avant un changement de planning ne peut plus faire enregistrer une affectation que l'application n'aurait jamais laissé construire — par exemple deux gardes de suite pour la même personne. Le refus est explicite et reprend la raison.
FixUn poste verrouillé par le responsable du planning ne peut plus partir dans un échange par un chemin détourné. C'était le plus discret des cas : l'échange semblait réussir, puis la génération suivante remettait le titulaire d'origine et le changement disparaissait sans que personne soit prévenu. Le verrou est maintenant vérifié des deux côtés d'un échange, et les gardes verrouillées d'un collègue ne sont plus proposées.
v8.198.006/08/2026
FixLes messages d'alerte du planning désignaient les médecins par leurs initiales de fichier plutôt que par l'abréviation de l'équipe. À Libourne, ce n'était pas seulement inhabituel à lire : deux médecins du service ont des initiales croisées, si bien que l'alerte annonçait le nom d'une collègue à la place de celui de la personne réellement concernée. Une alerte « posté alors qu'en formation » a ainsi été lue comme visant quelqu'un d'autre.
FixQuatre endroits affichaient encore ces initiales brutes : le bandeau d'alertes de l'espace admin, la fenêtre de confirmation qui masque une alerte, la liste « Règles à corriger » du détail d'une journée, et le message qui s'affiche quand on scinde une garde en jour et nuit. Tous emploient désormais l'abréviation que l'équipe utilise au quotidien, celle déjà visible dans la grille.
AméliorationUn contrôle automatique signale maintenant tout service où les initiales d'un médecin correspondent à l'abréviation d'un autre — la situation qui transforme une coquille d'affichage en confusion de personne. Deux cas existent aujourd'hui, tous deux à Libourne ; les autres services n'en ont aucun. Dix tests verrouillent les quatre écrans corrigés.
v8.197.030/07/2026
FixDes journées de travail comptaient zéro heure dans le suivi du temps, à Libourne. Une affectation sur cinq était concernée : les plannings importés de janvier à août placent les médecins sur « Urgences » et « Maternité / Bip » avec un créneau horaire qui n'existe plus, ces deux postes ayant été découpés en matin et après-midi depuis. Faute de retrouver l'horaire, la journée ne valait rien du tout.
AméliorationCes journées valent désormais la journée entière, c'est-à-dire la somme des deux demi-journées du poste : 4 h 30 le matin plus 5 h 30 l'après-midi. C'est exactement ce que valent Pédiatrie, Néonatologie et la maternité de Blaye dans la même configuration, les trois postes restés en journée complète. Aucun créneau n'a été ajouté à la configuration du service : la génération des plannings continue de ne proposer que des demi-journées.
FixLes totaux de douze médecins de Libourne remontent en conséquence, de 2 412 heures au total sur l'année, jusqu'à 460 heures pour l'un d'eux. Ce ne sont pas des heures ajoutées : ce sont des heures travaillées qui n'étaient pas comptées. Le contrôle qui rassure : l'objectif annuel à temps plein est d'environ 2 000 heures, et le médecin le plus concerné atterrit à 1 964 heures, contre 1 504 avant — un retard de 500 heures qui n'avait aucune raison d'être.
AméliorationUne consultation posée sur une de ces journées ne compte plus d'heures en double, comme sur toutes les autres journées postées. Les deux corrections vont ensemble : sans la première, retirer les heures de la consultation aurait affiché zéro heure sur une journée pourtant travaillée.
AméliorationMême correction pour les gardes de 24 h coupées en deux à la main, un médecin le jour et un autre la nuit : chaque moitié vaut la moitié de la garde, et les deux réunies font exactement la garde entière. Sept week-ends de Rochefort sont concernés entre janvier et juillet. Aucun chiffre affiché ne change là-bas aujourd'hui, ce service suivant les demi-journées et non les heures — c'est une justesse acquise pour plus tard.
v8.196.030/07/2026
FixQuand on modifie le planning, le bandeau qui annonce les préférences dégradées par le changement pouvait annoncer une pénalité deux fois trop lourde. Deux cas : un médecin de renfort placé sur une journée entière d'un poste réglé en deux demi-journées, et un médecin qui tient la garde de jour et celle de nuit du même jour. Dans les deux cas, une seule journée était facturée comme deux. Le compte se fait désormais par médecin : deux médecins différents sur les deux demi-journées, ou sur le jour et la nuit, comptent bien pour deux.
FixDans le détail de ce même bandeau, un médecin de garde la veille d'un jour où il ne travaille jamais était cité deux fois de suite quand il tenait le jour et la nuit. Il n'apparaît plus qu'une fois.
AméliorationAucun chiffre affiché ne change aujourd'hui : les deux situations ont été comptées sur les douze mois de planning enregistrés de chaque service avant de toucher au code, et aucune ne se présente. C'était un défaut en sommeil, qui n'attendait qu'un médecin de renfort posé sur une journée découpée. Neuf tests le verrouillent, dont quatre qui vérifient qu'un vrai deuxième médecin continue bien de compter double.
v8.195.030/07/2026
FixDans le récapitulatif par médecin, la colonne « Postes » comptait deux jours au lieu d'un quand un médecin tenait un poste toute la journée sur un service où la journée se règle en deux demi-journées. Le matin et l'après-midi étaient additionnés comme s'il s'agissait de deux personnes. Sur les plannings concernés, l'écart montait jusqu'à sept jours de trop sur un mois pour un même médecin. La colonne compte désormais les journées travaillées, une par médecin et par poste — deux postes différents le même jour continuent bien d'en valoir deux.
FixMême correction dans les exports : une journée entière tenue par une seule personne sur un poste réglé en deux demi-journées sortait avec son nom écrit deux fois dans la cellule, en CSV comme en Excel. Un fichier exporté circule hors de l'application, sans personne pour le relire — le nom n'apparaît plus qu'une fois. Quand les deux demi-journées sont réellement tenues par deux médecins différents, les deux noms restent affichés.
v8.194.030/07/2026
FixSur téléphone, un médecin qui tient les deux moitiés d'un poste découpé — les urgences le matin ET l'après-midi — apparaissait deux fois dans la même case, son nom empilé sur lui-même. La grille sur ordinateur n'en affichait qu'un, à juste titre : c'est bien une seule personne, toute la journée. Les deux écrans disent maintenant la même chose. Cent quarante-six cases étaient concernées chez Libourne, sur septembre, octobre, novembre et décembre.
FixMême correction préventive sur la pile des gardes de la grille : un médecin qui tient la garde de jour ET celle de nuit du même jour — le 1er janvier chez Libourne — exposait l'affichage au même risque, sans qu'on ait constaté de dégât. Le jour et la nuit restent deux lignes distinctes, avec leur soleil et leur lune.
AméliorationCes deux cases s'appuyaient sur le nom du médecin seul pour se repérer, ce qui ne suffit pas quand la même personne apparaît deux fois le même jour. Dans ce cas, l'affichage pouvait aussi bien dupliquer une pastille que la faire disparaître, sans jamais signaler d'erreur — c'est cette seconde possibilité, silencieuse, qui a motivé la correction. Un test vérifie désormais que ça ne peut plus arriver, sur les deux écrans.
v8.193.030/07/2026
FixLe panneau du jour pouvait faire tomber tout l'écran sur la page « Quelque chose s'est mal passé ». Le déclencheur : garder le panneau ouvert pendant que la largeur de la fenêtre franchit le seuil qui sépare l'affichage ordinateur de l'affichage mobile. Redimensionner la fenêtre, zoomer ou dézoomer, ou pincer sur le pavé tactile suffisait — le panneau change alors de forme, de rail latéral à tiroir venant du bas, et c'est ce basculement qui cassait. Le panneau se reconstruit désormais proprement à ce moment-là : il reste ouvert, sur le même jour, et prend simplement sa nouvelle forme.
AméliorationLe défaut venait de la bibliothèque de tiroirs utilisée par l'application, dans sa dernière version publiée — il n'y avait donc pas de mise à jour à attendre. Le correctif est posé chez nous, une bonne fois pour toutes : il vaut pour le panneau du jour comme pour tous les autres tiroirs de l'application, présents et à venir. Un test verrouille le comportement dans les deux sens de bascule.
v8.192.030/07/2026
NouveauOn peut désormais ajouter une consultation à un médecin déjà posté sur la même demi-journée. C'est la situation que Rochefort et Libourne ont décrite le même jour : « je suis en pédiatrie l'après-midi, et je consulte aussi l'après-midi ». Le poste n'est pas libéré, la consultation s'ajoute par-dessus — l'objectif est de pouvoir le savoir en regardant le planning. Dans le panneau du jour, la demi-journée tenue par un poste propose maintenant « + consult. » à côté du nom du poste.
AméliorationCette consultation n'ajoute aucune heure au suivi du temps. Le poste couvre déjà la journée entière : la consultation est une seconde casquette portée dans les mêmes heures, pas du temps de travail supplémentaire. Sans cette règle, une journée d'hospitalisation avec une consultation l'après-midi affichait quatorze heures et demie, et faisait sauter le plafond hebdomadaire.
AméliorationLe changement débloque surtout Rochefort, dont les trois postes vont de 8h30 à 18h00 : un médecin posté n'avait aucune demi-journée libre, il disparaissait donc entièrement de la liste des médecins à positionner. Le contournement consistait à le retirer du poste, ajouter la consultation, puis le remettre — trois manipulations, et un moment où le poste apparaissait découvert.
AméliorationUne fois la consultation posée, la demi-journée l'affiche à la suite du poste — « Maternité / Bip + Consultation » — et le bouton disparaît, pour qu'on ne l'ajoute pas deux fois. Le retrait se fait là où se retirent toutes les activités, dans la liste des activités du jour, avec la confirmation habituelle pour une consultation déjà validée.
AméliorationRien ne peut être écrasé en silence : le bouton n'apparaît que sur une demi-journée tenue par un poste et libre de toute déclaration. Un congé, un temps de bureau ou une formation déjà saisis ne peuvent pas être recouverts par une consultation. Une garde, elle, n'a jamais empêché de consulter dans la journée : elle ne bloque rien et ne retire aucune heure.
FixConséquence sur les heures déjà affichées, et elle est visible : certaines consultations des mois passés étaient déjà posées sur une demi-journée tenue par un poste — c'est le cas depuis l'import des plannings de janvier à août. Elles étaient comptées deux fois. Les totaux de ces mois baissent donc, de 460 heures au total à Libourne, réparties sur neuf médecins, et de 5 heures à Rochefort sur une seule journée. Ce ne sont pas des heures perdues : c'est le même après-midi qui n'est plus compté deux fois.
AméliorationLa correction ne s'applique que là où le poste couvre vraiment la demi-journée, d'après les horaires inscrits dans la configuration du service. Quand un planning importé porte un créneau qui n'existe plus, on ne sait pas quelle moitié de journée était tenue : ces consultations gardent leurs heures. Cent quatre-vingt-douze heures sont ainsi laissées en place à Libourne plutôt que retirées sur une supposition — un médecin en particulier n'est pas concerné du tout.
AméliorationLe geste est réservé à l'administrateur pour l'instant. Les médecins continuent de déclarer leurs activités sur leurs demi-journées libres, comme avant. Et la génération des plannings n'est pas concernée : le moteur ne lit pas les consultations déclarées.
v8.191.030/07/2026
FixUn email de notification ou un export PDF pouvait, dans de rares cas où le nom du service n'était pas trouvé, s'afficher au nom de « Pédiatrie — CH Rochefort » au lieu du service concerné. Trouvé pendant l'analyse d'ouverture pour Trousseau. Les deux affichent désormais un intitulé neutre dans ce cas, jamais le nom d'un autre établissement.
v8.190.030/07/2026
NouveauLe moteur accepte désormais une transition (quotité, gardes, priorité de poste…) datée en cours de mois, et pas seulement le 1er. Une quotité qui passe de 100 % à 60 % le 16 novembre est prise en compte à partir de cette date exacte, plutôt que d'être ignorée ou décalée d'un mois entier — l'ancien blocage rendait le défaut visible sans jamais le corriger.
AméliorationUne quotité change au début de la semaine suivante : la précédente termine sa semaine, la nouvelle démarre le lundi. Les cibles mensuelles (gardes, visites Blaye) ne sont jamais coupées en deux à la main — elles se réduisent toutes seules selon les jours où le médecin est réellement disponible, ce qui évite tout arrondi à trancher.
NouveauNouveau champ « Date de fin » dans la fiche d'un médecin, symétrique de la date d'arrivée. Un départ en cours de contrat s'exprime maintenant directement, sans combiner quotité, gardes et priorité de poste pour simuler un blocage.
AméliorationLe panneau Conflits et l'affectation manuelle reconnaissent la date de fin exactement comme la date d'arrivée : une affectation posée après le départ d'un médecin est signalée, sauf verrou admin explicite.
v8.189.029/07/2026
AméliorationUne demi-journée de consultation peut désormais compter autre chose que cinq heures dans le suivi du temps. Libourne la compte quatre heures, soit huit heures la journée : une journée de consultation ne tient pas l'amplitude d'une journée postée, qui va de 8h30 à 18h30. Le réglage est propre à chaque service — ceux qui ne disent rien gardent les cinq heures d'avant.
AméliorationLe changement ne vise QUE les consultations. Les HDJ ado et diabète, ainsi que le temps de bureau déclaré, restent à cinq heures la demi-journée. Et il n'a aucun effet sur la génération des plannings : le moteur ne compte pas les consultations déclarées dans ses heures, il ne lit que la durée des postes et les journées de formation.
v8.188.029/07/2026
NouveauL'assistant de création d'un médecin propose désormais « Aide extérieure » : un renfort que le planning ne place jamais de lui-même, et qui n'apparaît que là où l'administrateur l'a posé. C'est le profil d'un ancien interne qui vient faire quelques gardes, d'un remplaçant ou d'un vacataire. Jusqu'ici ce réglage existait mais n'était accessible par aucun écran : il fallait passer par la base de données.
AméliorationCocher la case suffit : l'assistant raccourcit le parcours en masquant tout ce qui décrit comment le moteur répartit le travail — jours autorisés, cible de gardes, priorité de poste, postes autorisés — puisque rien de tout cela ne s'applique. Un rappel affiche la marche à suivre : Désidérata, le nom du médecin, Verrous admin, une ligne par créneau, avant de générer le planning. C'est ce qui libère les autres médecins pour le reste.
AméliorationUne aide extérieure ne compte dans aucun effectif ni aucune équité, et n'a pas besoin de date de fin de mission : les mois où rien n'est posé pour elle, elle n'apparaît pas. Ses heures restent affichées dans le tableau des heures, mais sans objectif ni écart.
AméliorationLe réglage est visible et réversible depuis la fiche du médecin dans l'écran Équipe, et la liste de l'équipe l'annonce par une étiquette « Aide extérieure » — à la place de la quotité et du « Pas de garde », qui donnaient tous les deux une fausse indication pour ce profil.
AméliorationLa fiche d'une aide extérieure ne montre plus que ce qui la concerne, c'est-à-dire presque rien : le réglage lui-même, les notifications et les notes. Gardes, Postes, Préférences fines, Transitions programmées, jours autorisés, « WE uniquement », mais aussi quotité, date d'arrivée et objectif d'heures disparaissent. Aucun de ces réglages ne s'applique à quelqu'un qui n'apparaît que sur ses verrous et n'a pas de contrat de service ; les afficher laissait croire qu'ils agissaient.
AméliorationLe tableau des heures en tire les conséquences tout seul : une aide extérieure n'a jamais d'objectif mensuel ni d'écart, ses heures sont simplement comptées et affichées. Ce n'est pas un réglage qu'on aurait posé dans son coin — c'est déduit du profil, donc impossible à désynchroniser.
v8.187.029/07/2026
FixLes heures d'un mois sont maintenant celles du mois. Jusqu'ici le tableau regroupait le travail par semaine puis rangeait chaque semaine dans le mois de son lundi : « septembre » désignait donc les semaines commençant en septembre, ce qui excluait les 1er au 6 septembre — dont le lundi tombe en août — et incluait les premiers jours d'octobre. Un médecin lisait 125 h en septembre pour 175 h réellement travaillées dans le mois, et dix médecins sur seize avaient un total de quadrimestre différent selon la méthode.
AméliorationC'est ce qui rendait la vérification impossible : l'objectif, lui, se calcule sur les jours du calendrier, et un chef de service qui recompte le fait sur les journées du mois. Les colonnes Mois, Quadrimestre et Année comptent désormais du 1er au dernier jour du mois, donc les chiffres du tableau se retrouvent en recomptant sur le planning.
AméliorationEn vue Mois, les colonnes restent des semaines, pour la cible hebdomadaire. Comme une semaine à cheval déborde du mois, leur somme ne fait pas le Total — c'est écrit sous le tableau.
FixUne formation déclarée après la publication du planning comptait zéro heure. Le sélecteur d'activités propose « Format. » et « Form. donnée », et le moteur compte bien ces journées quand c'est lui qui les a posées — mais une formation ajoutée après coup sur une journée libre n'apparaissait nulle part dans le total. Elle compte désormais à son propre forfait : dix heures la journée pour une formation donnée, 9,6 h pour une formation suivie, la moitié pour une demi-journée. Une formation déjà posée par le moteur n'est pas comptée deux fois.
NouveauNouveau réglage « Quotité de l'objectif » dans la fiche du médecin, pour les cas où la quotité déclarée au moteur ne reflète pas le contrat. Un médecin peut être déclaré à 100 % afin d'être posté à fond les jours où il est présent, tout en exerçant ailleurs le reste du temps : son objectif d'heures suit alors sa vraie quotité, sans qu'on touche à ce que le moteur lui attribue.
v8.186.029/07/2026
NouveauOn peut désormais retirer des périodes de l'objectif d'heures d'un médecin — un congé maternité, ou les mois pendant lesquels quelqu'un n'était pas encore sous contrat horaire. Le nouveau champ « Périodes sans objectif » se trouve dans sa fiche, écran Équipe : on saisit un début, une fin et un motif. L'objectif du mois ne compte alors que ses jours hors de ces périodes.
AméliorationLes dates sont libres, y compris en cours de mois : un congé du 12 octobre au 31 décembre laisse onze jours d'objectif en octobre, puis rien. Un mois entièrement couvert n'affiche plus d'objectif ni d'écart du tout, au lieu de compter un retard qui n'a pas lieu d'être.
AméliorationCe réglage ne touche pas la génération des plannings : le médecin reste planifiable sur ces jours. C'est ce qui le distingue de la date d'arrivée, qui interdit au moteur de positionner quelqu'un — une personne présente ponctuellement pour les gardes peut donc garder ses gardes tout en n'ayant pas d'objectif horaire sur ces mois-là.
v8.185.029/07/2026
FixDans le tableau des heures, la colonne Total pouvait dépasser la somme des mois affichés — 230 h de total pour 200 h de détail chez une médecin, et des écarts de 10 à 25 h chez trois autres. Deux causes qui se rencontraient. D'abord, les 1er et 2 janvier 2026 appartiennent à la semaine qui commence le lundi 29 décembre 2025 : la règle « une semaine compte pour le mois de son lundi » étiquetait donc cette semaine de janvier comme du décembre. Ensuite, le regroupement par quadrimestre ne regardait que le NUMÉRO du mois, sans l'année — décembre 2025 et décembre 2026 tombaient dans le même total. Des heures de janvier 2026 se retrouvaient ainsi dans le total du 3e quadrimestre, où aucune colonne ne pouvait les montrer. Aucune donnée de 2025 n'était en jeu : uniquement une étiquette de mois erronée.
AméliorationUne semaine dont le lundi tombe avant le début de la période affichée est désormais rattachée au premier jour réellement chargé. Ces heures repartent donc en janvier, là où elles ont été faites, au lieu de disparaître d'un côté et de réapparaître de l'autre. Une semaine à cheval entre deux mois de la période garde la règle habituelle : elle compte pour le mois de son lundi.
AméliorationLe Total ne peut plus diverger des colonnes : il est maintenant calculé comme la somme de ce qui est affiché, dans les trois vues. Ce n'est plus une conséquence du bon rattachement, c'est une garantie.
v8.184.029/07/2026
NouveauLe tableau des heures de la vue admin affiche désormais l'écart de chaque médecin à son objectif du mois. Jusqu'ici il donnait un nombre d'heures brut — « 189,2 h en septembre » — et annonçait une cible par semaine, ce qui obligeait à faire le calcul de tête pour savoir si c'était beaucoup ou peu. Sous chaque total apparaît maintenant l'écart signé : en rouge au-dessus de l'objectif, en bleu en-dessous. La colonne Total cumule les objectifs de tous les mois de la période.
AméliorationL'objectif dépend de la longueur du mois : 164,1 h pour un mois de 30 jours à temps plein, 169,6 h pour un mois de 31, au prorata de la quotité de chacun. Un mois de septembre et un mois d'octobre ne se jugent donc plus sur le même chiffre. Les congés ne sont pas déduits, comme dans la comptabilité du service.
AméliorationL'objectif suit la quotité que le médecin avait ce mois-là : une personne qui passe à 50 % en novembre n'est plus jugée sur son ancienne quotité pour ses derniers mois. Et un mois où le médecin n'a aucune heure — parce qu'il n'était pas encore dans l'équipe — n'est plus compté comme un retard.
AméliorationEn vue Mois, les colonnes restent des semaines et la référence reste la cible hebdomadaire : un écart mensuel en face d'une semaine n'aurait rien voulu dire. L'écart du mois est donné sur la colonne Total. Les heures s'affichent enfin avec la virgule décimale française.
NouveauNouveau réglage par médecin, « Objectif d'heures », dans la fiche de l'écran Équipe. Éteint, la vue admin des heures continue d'afficher les heures faites par cette personne mais ne lui met plus ni objectif ni écart — pour quelqu'un dont le temps ne se juge pas contre un contrat de service, présent seulement pour les gardes ou en renfort ponctuel. Le sortir de l'équipe aurait effacé des heures bien réelles ; ici on retire la référence, pas la mesure. Le réglage n'a aucun effet sur la génération des plannings.
FixLe mois d'arrivée d'un médecin est désormais proratisé. Quelqu'un qui rejoint le service le 15 novembre se voyait réclamer le mois entier — 164,1 h au lieu de 87,5 — soit un retard de 76 h qui n'était le fait de personne. L'objectif ne compte plus que les jours à partir de la date d'arrivée, et un mois entièrement antérieur à celle-ci n'affiche plus rien du tout.
FixLe bandeau du tableau annonçait « 70 semaines au-delà de la cible hebdomadaire » alors que les colonnes affichées étaient des mois — deux unités dans le même bloc, dont une que rien ne montrait à l'écran. Le bandeau et la note de bas de tableau parlent maintenant dans l'unité de ce qui est affiché : des mois au-dessus de l'objectif en vue Quadrimestre et Année, des semaines au-delà de la cible en vue Mois.
v8.183.029/07/2026
NouveauUn service peut désormais se passer de la validation des consultations. Jusqu'ici toute consultation déclarée partait « en attente » et devait être validée par l'administrateur — c'est le fonctionnement de Rochefort, où la cheffe de service arbitre les demandes. Pour un service où les médecins posent leurs consultations eux-mêmes, cette étape n'apporte rien et laisse traîner des demandes que personne n'a l'intention de refuser. Réglage éteint, la consultation est acquise dès qu'elle est déclarée.
AméliorationÉteindre ce réglage fait disparaître d'un coup toutes les mentions de validation : le rappel « demandes de consultation à valider » du bandeau, l'alerte du tableau de bord, la pastille orange sur la grille et les boutons Valider / Refuser du panneau du jour. Rien à décocher écran par écran.
AméliorationLe réglage est allumé par défaut : les services qui ne disent rien — Rochefort et les autres — gardent exactement le fonctionnement actuel. Il ne peut s'éteindre que par une décision explicite, et jamais par un réglage mal saisi.
v8.182.029/07/2026
NouveauOn peut désormais ajouter une consultation le matin à un médecin déjà posté l'après-midi (et inversement). Jusqu'ici l'application raisonnait par journée entière : dès qu'un médecin tenait une demi-journée de maternité ou d'urgences, il disparaissait de la liste des personnes à positionner, alors que son autre demi-journée était justement libre. La seule façon de s'en sortir était de le retirer du poste, d'ajouter la consultation, puis de le remettre — trois manipulations, et un moment où le poste apparaît découvert. La liste s'appelle maintenant « Demi-journées libres » et propose chaque moitié de journée séparément.
AméliorationQuand une moitié de journée est déjà prise, l'écran dit par quoi — « Maternité / Bip », « Consultation » — au lieu de faire disparaître la personne ou d'afficher une case grise sans explication. Une journée entière reste une journée entière : un médecin sur un poste qui couvre la journée complète n'est proposé sur aucune des deux moitiés.
AméliorationMême correction côté médecin : celui qui est attendu sur un poste l'après-midi peut maintenant déclarer lui-même sa consultation du matin. Le bouton « Déclarer une activité » n'apparaissait plus du tout dans ce cas. La demi-journée où il est attendu sur un poste est affichée en clair et reste non modifiable.
v8.181.029/07/2026
FixUne formation que vous animez comptait 9,6 h dans votre suivi des heures au lieu de 10 h. Le moteur, lui, comptait bien les 10 h depuis toujours : c'est l'écran du suivi qui appliquait le même forfait à toutes les formations, faute de savoir laquelle était animée et laquelle était suivie. Le planning transporte désormais le nombre d'heures que le moteur a réellement compté pour chaque journée de formation, et le suivi se contente de le lire — les deux ne peuvent plus diverger.
AméliorationMême correction pour les formations d'une demi-journée, qui étaient comptées pour une journée pleine dans le suivi alors que le moteur ne comptait que la moitié.
AméliorationLes plannings déjà générés gardent leurs heures actuelles : la correction s'applique aux plannings générés à partir de maintenant. Pour un mois déjà généré, il faut le régénérer pour voir le nouveau total.
v8.180.029/07/2026
FixLe réglage « Continuité » ne changeait rien. Le bouton promet que les médecins restent plus longtemps sur le même poste, et il enregistrait bien une valeur plus forte — mais pas sous la forme que le moteur sait lire pour cette règle, qui travaille poste par poste. La valeur était donc écrite, affichée, sauvegardée, et ignorée à la génération. Elle est maintenant répartie sur chaque poste proportionnellement à l'importance que le service lui a déclarée : renforcer la continuité renforce d'abord les postes où elle compte le plus, et ne touche pas ceux où le service a dit qu'elle n'avait pas lieu d'être.
FixDescendre à zéro le curseur de continuité d'un poste bloquait toutes les générations suivantes du service. Le moteur refuse cette valeur — pour lui, une continuité à zéro sur un poste qui en déclare une est le signe d'une configuration abîmée, pas un choix — et il s'arrêtait au chargement avec une erreur. Le curseur descendait pourtant jusqu'à zéro sans rien signaler. Mettre un poste à zéro revient désormais simplement à le laisser sur la valeur déclarée dans la configuration du service, sans jamais interrompre la génération. Pour réellement éteindre la continuité d'un poste, c'est son niveau qui se change, dans la configuration du service.
AméliorationAucun planning existant ne change. Vérification faite service par service : aucun des cinq services n'avait modifié ce réglage, donc la correction ne déplace rien tant que personne n'y touche. Au passage, confirmation que la continuité par poste arrivait bien au moteur pour tous les services — Rochefort compris, avec hospitalisation à 30 et maternité à 15 depuis toujours.
v8.179.029/07/2026
MoteurLe week-end de jour se coupait encore en deux. Le moteur récompensait le week-end tenu par une seule personne, mais il ne faisait jamais payer le week-end coupé — et la récompense seule ne suffisait pas. Mesuré sur septembre 2026, six tirages : deux week-ends et demi sur quatre tenus par une seule personne, jamais les quatre. En figeant un planning et en ne déplaçant qu'une seule garde pour refermer un week-end, on voit pourquoi : la récompense est le seul poste qui paie, contre les objectifs de gardes, la charge de travail, l'espacement des gardes et le plafond horaire qui, ensemble, coûtent trois à six fois plus. Il y a maintenant un réglage qui fait payer le week-end coupé, à côté de la récompense. Comme un week-end coupé concerne deux médecins, il compte double : c'est ce qui lui permet de peser sans qu'on ait à gonfler la récompense au point de sacrifier le reste. Réglé à 600, les quatre week-ends de septembre tiennent sur une personne chacun, et personne ne s'écarte davantage de son objectif de gardes qu'avant.
AméliorationLe réglage est livré à zéro, donc inactif partout tant qu'un service ne le règle pas — Rochefort et les autres services sont strictement inchangés. Il ne s'affiche que pour les services dont la garde de week-end sépare le jour et la nuit.
v8.178.029/07/2026
MoteurLe moteur réclamait des gardes de week-end qui n'existaient pas. Quand un service fixe un objectif de gardes sur le trimestre, cet objectif est découpé mois par mois — et il était découpé en parts égales, alors que les mois n'ont pas le même nombre de week-ends. Sur septembre-décembre à Libourne : 8, 9, 10 puis 9 jours de week-end ou fériés. Septembre porte 22 % des gardes du trimestre et recevait 25 % de chaque objectif. Résultat mesuré : 21 gardes de week-end demandées pour les 16 que le mois contient. Cinq médecins étaient donc en dessous de leur objectif quoi que fasse le moteur, et comme il préfère répartir les manques plutôt que les concentrer, il maximisait le nombre de personnes différentes placées le week-end — ce qui revient exactement à séparer le samedi du dimanche. Deux week-ends de septembre ont ainsi été tenus par deux médecins au lieu d'un. L'objectif est désormais découpé au prorata du poids réel de chaque mois : septembre demande 16 gardes pour 16 créneaux.
FixUn médecin qui commence ses gardes en cours de trimestre se voyait demander zéro garde le mois même où il démarre — et chacune de celles qu'il devait prendre coûtait des points au moteur. Le calcul lisait « ne fait pas de gardes » dans la fiche et s'arrêtait là, sans voir la date à partir de laquelle les gardes s'activent. Un cas à Libourne : Clémence Boux, gardes actives au 1er décembre, objectif de trois week-ends sur le trimestre. Le moteur était payé pour ne pas l'utiliser en décembre. Les changements de profil sont maintenant lus dans les deux sens, arrêt comme reprise.
AméliorationAucun effet pour Rochefort ni pour les autres services : les objectifs de gardes par catégorie sont un réglage que seul Libourne utilise aujourd'hui, et la règle ne construit rien du tout pour un service qui n'en a pas.
v8.177.029/07/2026
MoteurNouveau réglage : quand le moteur doit confier les deux demi-journées d'un poste à deux médecins différents, il peut désormais le faire en priorité sur la maternité et l'éviter aux urgences. Jusqu'ici le bonus « même médecin sur les deux moitiés » était unique et s'appliquait à tous les postes scindables à l'identique : le moteur était incapable de distinguer les deux. Le nouveau réglage renforce la protection des postes que le service doit assurer tous les jours, et laisse les postes qui peuvent rester vides absorber la coupure — la même souplesse qui existait déjà au niveau de la couverture, appliquée maintenant au découpage matin/après-midi.
FixEn mesurant, le moteur s'est révélé non pas indifférent mais penché du mauvais côté. La règle qui équilibre les journées d'urgences entre médecins compte en demi-journées et ignore complètement la maternité : couper une journée d'urgences en deux lui RAPPORTE jusqu'à 36 points d'équilibrage, ce qui annulait presque entièrement le bonus de 40 qui décourageait la coupure. Sur les quatre mois générés, les taux bruts semblaient identiques (6,5 % contre 7,0 %), mais quatre des cinq coupures de maternité étaient imposées par un verrou manuel : les coupures réellement choisies par le moteur étaient de six aux urgences contre une seule à la maternité.
AméliorationLe nouveau réglage est à zéro par défaut et ne change aucun planning tant qu'un service ne l'active pas. Il se règle depuis l'écran Réglages et s'appuie sur une information que chaque service déclare déjà — quels postes doivent être couverts tous les jours — sans qu'il y ait rien de nouveau à saisir.
v8.176.029/07/2026
FixLe suivi des heures ne comptait pas les consultations qu'il affichait pourtant sur le planning. Quand un planning est généré mais pas encore validé, la grille montre déjà les consultations déduites des souhaits de chacun — mais le compteur d'heures, lui, ne lit que ce qui est écrit en base, et rien ne l'est avant la validation. Sur Libourne, de septembre à décembre : 67 consultations visibles à l'écran, zéro heure correspondante, soit 335 heures manquantes. Deux écrans du même produit disaient deux choses du même mois. Le compteur les prend désormais en compte, en annonçant clairement que le total est provisoire tant que le planning n'est pas validé.
FixUn médecin pouvait lire ses heures d'un mois dont le planning n'était pas encore validé, alors que la page Planning lui refuse ce même mois. Quatre mois étaient dans ce cas à Libourne. Les deux pages répondent maintenant pareil : tant que le planning n'est pas validé, le suivi ne l'affiche pas.
FixDeux endroits comptaient les consultations et ne trouvaient pas le même nombre : 96 d'un côté, 67 de l'autre, sur exactement les mêmes données. Le comptage du suivi ignorait trois situations que celui du planning connaissait — un médecin qui ne fait que des gardes sur la période, le repos dû après une garde de nuit, et les jours d'absence. Le cas le plus parlant : une consultation créditée seize fois à quelqu'un qui n'était pas encore de retour sur les secteurs. Les deux comptages partagent désormais les mêmes règles.
FixUn jour de congé comptait comme une demi-journée disponible pour consulter. La détection ne regardait que les affectations, or un jour d'absence n'en porte aucune — il passait donc pour libre. Un tiers des demi-journées repérées comme libres tombaient en réalité un jour d'absence.
MoteurLe moteur avait le même angle mort, et sur la règle qui vise les objectifs de consultation : il comptait les jours d'absence parmi les demi-journées disponibles pour consulter. Sur septembre-décembre à Libourne, 204 des 785 demi-journées comptées libres tombaient un jour de congé — pour Audrey Cougot, neuf créneaux fantômes par mois face à un objectif de trois. La règle voisine, plus ancienne, écartait déjà ces jours ; celle-ci ne l'avait pas repris. Aucun planning ne change aujourd'hui : tout le monde est déjà très au-dessus de son objectif, donc la correction ne déplace rien pour l'instant. Elle compte à partir du moment où un médecin s'approche du sien. Aucun effet pour Rochefort, dont l'empreinte du modèle est identique.
FixUne consultation refusée continuait d'ajouter ses heures au temps de travail affiché. Le refus était visible à l'écran mais restait sans effet sur le compteur.
AméliorationRetirer une consultation proposée automatiquement tient enfin. Jusqu'ici, la proposition revenait à l'identique à la validation suivante : le calcul repartait de zéro sans aucun souvenir de ce qui avait été écarté. Le refus est désormais mémorisé, et une déclaration faite à la main reste, elle, totalement intouchable.
FixAprès un échange de garde accepté, la mise à jour des consultations pouvait être interrompue en cours de route et laisser un médecin sans aucune de ses consultations du mois — cinq heures perdues par créneau, sans aucun message. Elle est maintenant menée à son terme avant que la réponse ne parte.
v8.175.028/07/2026
MoteurNouveau réglage : un plafond mensuel de gardes par médecin, fixé à 6. Il n'en existait aucun jusqu'ici, malgré les apparences — la règle « Cible de gardes/mois » s'efface complètement dès qu'un médecin a des objectifs par catégorie, ce qui est le cas des douze médecins de garde de Libourne, et les objectifs par catégorie visent un trimestre, jamais un mois. Le plafond est souple : un mois exceptionnel reste possible, et si un objectif du trimestre exige un rattrapage, l'objectif passe devant. La 8e garde d'un mois coûte plus cher que la 7e, pour que le moteur préfère répartir plutôt que concentrer.
MoteurUne deuxième semaine chargée dans le mois coûte désormais plus cher que la première. Le moteur savait déjà décourager trois gardes en sept jours, mais il facturait chaque épisode au même prix : quatre semaines chargées chez la même personne coûtaient exactement quatre fois une, donc rien ne lui disait de préférer « une fois chacun ». Sur les quatre mois générés, deux médecins portaient quatre épisodes chacun quand cinq collègues n'en avaient aucun. Le comptage se fait par épisode et non par jour de chevauchement : une seule mauvaise semaine reste facturée une seule fois, même quand elle s'étale.
AméliorationLes deux nouveaux réglages sont désactivés par défaut et ne changent aucun planning tant qu'un service ne les active pas. Le document de référence des règles du moteur de Libourne a par ailleurs été remis à jour : neuf de ses poids étaient périmés et cinq règles d'équité y figuraient comme actives alors qu'elles sont à zéro depuis plusieurs jours.
v8.174.028/07/2026
MoteurLe fichier de configuration annonçait six réglages que personne ne lisait : le nombre de gardes tolérées sur sept jours, le nombre de jours travaillés d'affilée, la longueur d'un « bloc long », le plafond de gardes de week-end. Les valeurs étaient écrites en dur dans le moteur, à côté, et coïncidaient — donc rien ne se voyait, mais les changer dans le fichier n'aurait rien changé du tout. Elles sont désormais réellement lues. Aucun planning ne bouge : l'empreinte du modèle est identique sur les trois mois de référence.
AméliorationUne septième n'a délibérément PAS été rendue réglable : le plancher d'une garde de week-end par mois. La rendre réglable oblige à modifier la façon dont le moteur exprime la règle, ce qui déplace le modèle — pour un réglage que personne n'a demandé. Le fichier dit maintenant pourquoi, au lieu d'annoncer un bouton qui n'existe pas.
FixTrois nombres du fichier de configuration du service décrivaient des règles inexistantes, dont une franchement fausse : « idéalement maximum une garde par semaine ». Rien ne plafonne à une garde par semaine — le moteur en tolère deux sur sept jours, et sur quatre mois de planning Libourne, la moitié des semaines-médecin en comptaient au moins deux. La même phrase avait été corrigée ailleurs le 25 juillet et avait survécu ici, dans une clé que personne ne lit. Remplacés par ce qui applique réellement chaque règle.
FixLe champ `applies_to` du fichier de règles voulait dire deux choses opposées : sur certaines règles une vraie liste de secteurs appliquée par le moteur, sur quinze autres un simple commentaire. Quinze fois sur quinze, on lisait donc un réglage là où il n'y avait qu'une note. Les commentaires ont leur propre nom désormais.
AméliorationLa fonction qui lit « le poids d'une règle » existait en six exemplaires identiques dans le code de l'écran Réglages — dont deux dans le même fichier, l'un importé et l'autre recopié quinze lignes plus bas. C'est la façon dont deux réglages s'étaient déjà perdus cette semaine. Une seule version désormais.
AméliorationL'écran Réglages peut enfin être testé tel qu'il s'affiche, et pas seulement dans ses calculs. Le défaut du curseur corrigé plus tôt vivait dans l'affichage lui-même, là où aucun test ne pouvait le voir.
v8.173.028/07/2026
MoteurDeux réglages de l'écran Réglages n'arrivaient pas jusqu'au moteur. Le code qui lui transmet la configuration décidait quoi transmettre en regardant le NOM du réglage : ceux dont le nom commence par « poids » passaient, les autres disparaissaient sans un mot. Deux réglages qui ne sont pas des poids mais des seuils étaient donc jetés à chaque génération — le curseur bougeait, la valeur s'enregistrait en base, et le moteur continuait avec sa valeur d'origine.
FixLe plus visible des deux : « À partir de combien de jours de soins la semaine compte comme une semaine de soins ». Réglé à 3 depuis le 25 juillet après mesure sur les plannings validés, il valait en réalité 1 pour le moteur. À 1 jour, l'enchaînement avec la garde du week-end se déclenchait pour une seule journée de soins — l'inverse de ce que demandent les médecins qui le souhaitent, et une pénalité pour ceux qui l'ont refusé alors qu'ils n'ont jamais refusé ce cas-là. Les plannings générés depuis le 25 juillet l'ont été avec le seuil à 1.
FixLe second : le « seuil de tolérance » du plafond d'heures hebdomadaire. Sa valeur coïncidait avec celle qu'utilisait le moteur, donc rien ne se voyait — mais y toucher ne changeait rien.
FixLe curseur du seuil « jours de soins » ne pouvait pas produire sa propre valeur. Tous les sous-réglages étaient rendus avec le curseur des poids : de 0 à 300, par pas de 5, étiqueté « pénalité ». Or le seuil vaut 3 jours, qui n'est pas un multiple de 5, et la position 0 revenait silencieusement à 1. Un seuil se règle désormais dans ses vraies bornes, avec son unité affichée — 1 à 5 jours, 0 à 40 heures — et sans se présenter comme une pénalité.
FixLe même défaut touchait deux poids ordinaires, trouvé en généralisant le contrôle : « dépassement toléré » vaut 14 et « préférer ce poste sur une garde de 24h » vaut -3, or le curseur avançait par pas de 5. Ces deux valeurs sont calibrées — 14 a été fixé le 24 juillet pour rester juste au-dessus du coût d'un site optionnel non couvert. Qui touchait le curseur atterrissait sur 15 et déplaçait la calibration sans que rien ne le signale. Les sous-réglages s'ajustent désormais au point près ; le réglage grossier reste le rôle de la jauge d'importance.
AméliorationLe contrôle « ce que le moteur reçoit vraiment », livré la veille avec les scripts de configuration, s'arrêtait une étape trop tôt : il vérifiait les quatre étapes côté site, pas la dernière, celle du moteur. Il répondait donc « valeur bien arrivée » sur exactement les réglages qui n'arrivaient pas. Il compte désormais cinq étapes et nomme celle qui a mangé la valeur.
AméliorationDeux garde-fous pour que cette famille de défaut ne repasse plus inaperçue : l'un vérifie qu'aucun réglage lu par le moteur n'est jeté en route, l'autre qu'un curseur peut toujours atteindre la valeur qu'il affiche par défaut. Le premier se déclenche même quand la modification ne touche que le fichier de configuration — le scénario exact qui avait produit le défaut.
AméliorationAucun changement pour Rochefort : les deux réglages concernés n'existent que pour Libourne, et l'empreinte du modèle est identique sur les trois mois de référence.
v8.172.028/07/2026
AméliorationL'adresse du service de Libourne perd son suffixe « -demo » : les liens sont maintenant en /s/pediatrie-libourne/. Libourne n'est plus une demonstration depuis longtemps, et le mot apparaissait dans chaque lien que les medecins utilisent. Les anciennes adresses continuent de fonctionner et redirigent automatiquement — favoris, application installee sur telephone, liens de planning deja envoyes par mail. Rien a refaire de votre cote.
FixCette adresse sert aussi, en interne, a savoir quelles regles du moteur s'appliquent au service. Renommer sans precaution aurait donc eteint les seize regles propres a Libourne sans le moindre message d'erreur, et tout planning genere entre-temps serait sorti faux en silence. Le changement s'est fait en trois temps, avec un garde-fou qui refuse le renommage tant que la nouvelle adresse n'est pas reconnue partout, et une redirection deployee a l'avance qui ne s'active qu'au moment ou l'ancienne adresse disparait — donc aucune seconde pendant laquelle un lien tombe en erreur.
v8.171.028/07/2026
FixOn peut desormais se connecter avec les initiales qu'on voit a l'ecran. Jusqu'ici la connexion attendait l'identifiant technique du medecin, alors que le planning, les badges et les exports affichent l'abreviation choisie par le service — deux choses differentes pour 15 medecins sur 17 a Libourne. Taper « JM » alors que l'app affiche « JM » partout echouait. Les deux fonctionnent maintenant, et l'identifiant reste essaye en premier : rien de ce qui marchait ne change. Le code PIN est verifie a chaque tentative, comme avant. Quand deux personnes se partagent les memes initiales — deux cas a Libourne — c'est le code PIN qui departage.
AméliorationLe reglage « Garde du week-end apres une semaine de soins » s'appelle desormais « Garde de jour du week-end apres une semaine de soins ». Le titre laissait croire que les gardes de nuit etaient concernees ; elles ne l'ont jamais ete. Le moteur ne regarde que la garde de journee du samedi et du dimanche, celle que le service a declaree comme telle. Corrige au meme titre sur la fiche de chaque medecin, la ou chacun repond oui ou non pour lui-meme, et les textes d'aide disent maintenant explicitement que la nuit n'est pas touchee. Aucun changement de comportement : seuls les mots changent.
AméliorationUn service peut desormais masquer « Recapitulatif par medecin » et « Verification des regles » sur sa page Planning. C'est un reglage de service, pas un cas particulier code en dur : chaque service declare ce qu'il veut voir, et un service qui ne declare rien affiche tout, exactement comme avant. Une valeur mal saisie ne peut pas faire disparaitre un bloc — seule une demande explicite de masquage compte.
v8.170.028/07/2026
FixLe planning se génère un mois à la fois, mais presque toutes les règles du service portent sur la semaine ou le week-end. Quand une semaine était à cheval sur deux mois, huit règles n'en voyaient qu'une moitié — et comme les deux mois sont calculés séparément, chaque moitié pouvait sembler correcte pendant que la vraie semaine ne l'était pas. Concrètement : un bloc de quatre jours du 30 novembre au 3 décembre était invisible des deux côtés ; une garde le dernier jour du mois dont le repos tombait sur un jour non travaillé n'était jamais décomptée ; une semaine de soins commencée avant le 1er n'était reconnue d'aucun côté, alors que plusieurs médecins avaient explicitement demandé à garder leurs patients le week-end qui suit ; et une semaine de soins à cheval était comptée deux fois dans l'équité, faussant la cible de toute l'équipe. Les huit règles regardent maintenant la semaine réelle.
FixLe garde-fou qui vérifie qu'une modification du moteur n'a pas déplacé un planning ne regardait jamais ce qui se passe aux frontières de mois : il testait chaque mois sans ses voisins, or ces règles ne s'activent que lorsqu'un mois voisin existe. Il était donc aveugle précisément là où le moteur a produit le plus de corrections cette année. Il rejoue désormais chaque mois de référence une seconde fois avec un mois voisin.
AméliorationChaque règle du moteur déclare maintenant noir sur blanc comment elle traite les frontières de mois — soit elle regarde le mois voisin, soit elle s'en tient volontairement au mois avec la raison écrite, soit la question ne se pose pas. Une règle ajoutée demain sans cette déclaration bloque la mise en production. C'est ce qui empêchera cette famille de défauts de revenir.
v8.169.028/07/2026
MoteurLes objectifs de gardes par catégorie ont désormais un prix par catégorie. Jusqu'ici, un écart d'une garde avec l'objectif coûtait la même chose en week-end, un vendredi ou en semaine — impossible de dire au moteur que les week-ends passent avant. Chaque catégorie porte maintenant son propre réglage, et sans réglage explicite chacune retombe sur le poids d'ensemble : un service qui n'y touche pas se comporte exactement comme avant.
MoteurUn écart de deux gardes sur une même personne peut maintenant coûter plus cher que deux écarts d'une garde répartis sur deux personnes. Ce n'était pas une affaire de calibrage : la pénalité était proportionnelle à l'écart, donc les deux situations coûtaient rigoureusement le même prix — mesuré identique aux poids 60, 150, 400 et 1000. « Un écart de 1 on rattrape à la main, un écart de 2 jamais » était donc inatteignable à n'importe quel réglage. Un second tarif, appliqué à partir de la deuxième garde d'écart et réglable par catégorie, rend enfin cette préférence exprimable.
FixSur l'écran Réglages, la carte des objectifs de gardes continue d'annoncer quand une valeur posée pour le service est ignorée par une valeur saisie ici. Trois mécanismes internes supposaient qu'une règle réglable par sous-poids n'a pas de réglage d'ensemble ; cette règle est la première à avoir les deux, et sans correction sa jauge principale aurait disparu de la mention de provenance et de l'aperçu « Voir les changements » — un vrai changement passé sous silence.
v8.168.028/07/2026
MoteurDernière règle à ne pas voir le mois voisin sur une semaine à cheval : celle qui répartit les passages d'un poste optionnel entre les médecins au prorata de leur quotité. Elle estimait le volume du mois à la main — nombre souhaité par semaine multiplié par le nombre de semaines — donc elle comptait une semaine que le mois d'à côté avait déjà couverte, et elle ignorait les jours fériés : décembre 2026 a vingt-deux jours ouvrés répartis sur cinq semaines, pas vingt-cinq. Les cinq règles qui arbitrent une semaine à cheval lisent désormais toutes la même chose.
MoteurCorrigé pour la cohérence, pas pour l'effet, et c'est vérifié : sur l'effectif réel et sur décembre, aucun plafond de répartition ne bouge — treize médecins sur treize pour Blaye, seize sur seize pour la maternité. La règle ne pénalise que le dépassement et arrondit la part au supérieur, donc l'écart devait faire franchir un nombre entier à quelqu'un pour changer quoi que ce soit. Le planning généré est inchangé.
v8.167.028/07/2026
FixRégler la continuité d'un poste aurait bloqué la génération sur tout service autre que Rochefort. L'écran proposait bien un réglage par poste du service — Pédiatrie et Néonatologie à Libourne — mais au moment de générer, le code qui relit ces réglages ne savait pas de quel service il s'agissait et retombait sur une liste écrite en dur : celle de Rochefort. Il envoyait donc au moteur deux postes inexistants dans le service, que le moteur refuse à juste titre. Personne n'a été touché : aucun service n'avait jamais utilisé ce réglage. Un seul curseur déplacé suffisait.
AméliorationL'écran et le moteur lisent désormais les postes du service par la même fonction. C'est ce dédoublement de lecture qui avait laissé les deux se désynchroniser.
v8.166.028/07/2026
FixUn planning validé ne stockait pas l'information « ce jour est un jour ouvré », et toutes les vérifications qui raisonnent par jour ouvré commencent par la lire. Sur un mois validé, elles voyaient donc un mois sans aucun jour ouvré et n'avaient rien à dire. Conséquence immédiate : septembre ne voyait pas le lundi 31/08, qui appartient à août, et le correctif de la semaine à cheval livré plus tôt dans la journée restait sans effet sur exactement les mois déjà publiés. L'information est désormais recalculée à la lecture, exactement comme le moteur la calcule — week-end ou férié, pas de poste — et une valeur réellement enregistrée reste souveraine.
AméliorationEffet de bord assumé et mesuré : les mois déjà validés affichent maintenant leurs alertes de couverture, qui étaient silencieuses. Sur les huit mois validés de Libourne, vingt-quatre semaines apparaissent — vingt en maternité sous le nombre souhaité, quatre sans aucun passage à Blaye. Ce sont des mois passés : c'est une information sur ce qui s'est produit, pas une liste de choses à corriger.
FixSur une semaine à cheval, ce que le mois voisin a couvert vient maintenant réduire ce qui reste à faire, au lieu de s'ajouter au compte affiché. La différence est visible sur un poste qui doit être tenu tous les jours : la journée couverte du lundi 31/08 faisait passer la semaine de septembre pour complète et effaçait un après-midi sans personne le mercredi 2. Le trou réel reste signalé, et une semaine qu'un passage du voisin suffit à couvrir ne l'est plus.
v8.165.028/07/2026
NouveauChaque règle de l'écran Moteur dit désormais d'où vient sa valeur : « Valeur par défaut », « Réglée pour ce service », « Réglée ici », ou « Hors périmètre pour ce service ». Jusqu'ici l'écran n'affichait qu'un chiffre nu, alors que quatre endroits différents peuvent le poser et se recouvrent en cascade.
NouveauQuand deux réglages se contredisent, l'écran le dit avec les deux chiffres — par exemple « Réglée ici à 150 · la valeur posée pour ce service (18) est ignorée ». C'est le cas qui justifie tout le reste : un poids réglé pour un service pouvait être écrasé depuis l'écran sans le moindre signal. Sur Libourne, quatre règles étaient dans cette situation au moment de la livraison, et rien ne le montrait.
AméliorationLa mention apparaît aussi sous chaque sous-réglage et sous chaque protection, et elle suit le curseur pendant qu'on le déplace : elle décrit toujours le chiffre affiché, jamais un état sauvegardé qu'on ne voit plus.
v8.164.028/07/2026
FixLe rapport du moteur affichait « 21 déclenchements sur 374 », et ce second nombre était trompeur. Il comptait toutes les combinaisons médecin × créneau que la règle examine, alors qu'un poste donné un jour donné ne peut être tenu que par une seule personne : les autres ne pouvaient de toute façon pas répondre présent. Pour la continuité des postes en mars, le vrai nombre d'occasions était 34 et non 374 — l'écran annonçait 6 % de réussite là où la réalité est 62 %.
AméliorationLe dénominateur est retiré plutôt que corrigé. Le calculer correctement demanderait de connaître, règle par règle, combien de places existent réellement — une table à maintenir à la main pour quarante-six règles, qui se désynchroniserait tôt ou tard. Mieux vaut aucun chiffre qu'un chiffre faux.
AméliorationReste le nombre de fois où la règle est intervenue, avec le verbe qui va avec : « récompensée 21 fois » quand elle a obtenu ce qu'elle voulait, « pénalisée 13 fois » quand le planning a dû lui désobéir.
v8.163.028/07/2026
NouveauLe rapport du moteur chiffre enfin ce que chaque règle a pesé. Il ne dit plus seulement qu'une règle a tourné, il dit combien elle a coûté au planning livré, quelle part du mouvement total elle représente, et combien de fois elle s'est réellement déclenchée. Sur mars à Rochefort : la continuité des postes rapporte 510 points de bonus et représente 17 % du mouvement, tandis que l'espacement des gardes ne se déclenche que 7 fois sur les 1 485 situations qu'il surveille.
AméliorationLes règles sont classées de la plus lourde à la plus légère, parce que la question posée à cette liste est « qu'est-ce qui a le plus pesé ». Un nombre négatif est un bonus que la règle a encaissé, un positif une pénalité que le planning a payée : le signe n'est jamais masqué, sans quoi un bonus se lirait comme une sanction.
NouveauNouveau groupe « respectées sans rien coûter » : des règles qui ont bien surveillé le planning sans jamais avoir à le corriger. C'est différent d'une règle sans effet, et l'écran le dit — une règle peut ne rien coûter précisément parce qu'elle est assez forte pour que le moteur ne la combatte jamais.
FixL'écran prévient explicitement que ce chiffre mesure ce que ce planning a payé, et non ce à quoi il ressemblerait sans la règle. La différence n'est pas théorique : mesuré le 28 juillet, deux règles coûtent exactement zéro alors que le planning est visiblement construit autour d'elles. Répondre à la seconde question demanderait de regénérer le mois sans la règle plusieurs fois, le moteur variant trop d'une exécution à l'autre pour qu'un seul essai signifie quoi que ce soit.
v8.162.028/07/2026
AméliorationLe rapport du moteur distingue enfin trois choses qu'il mélangeait. Les règles qui n'ont rien produit parce que le service n'utilise tout simplement pas la fonction concernée — pas de cible de consultation par quadrimestre, pas de secteur de soins — sont désormais présentées comme une configuration normale et non comme un défaut. Celles dont le curseur est à zéro forment leur propre groupe. Et il ne reste en évidence que celles qui étaient actives, avec du poids, et qui n'ont pourtant rien produit : sur la génération d'octobre, deux règles sur vingt-et-une au lieu de vingt-et-une.
AméliorationLe rapport est descendu en bas de la page et se replie. Il ne montre plus qu'une ligne discrète tant qu'on ne l'ouvre pas, et son compteur ne signale que les règles qui méritent un coup d'œil. C'est un outil pour l'administrateur qui veut creuser, pas une alerte permanente sur une page qui parle d'autre chose.
AméliorationChaque groupe s'ouvre et se ferme séparément. Seul celui qui demande un regard est déplié d'emblée.
FixLe libellé du groupe qui demande un regard dit « sans explication », pas « problème » : le moteur constate qu'une règle n'a rien produit et qu'il ne sait pas dire pourquoi. C'est ce qui justifie qu'un humain aille voir, pas une affirmation qu'il y a une erreur.
v8.161.028/07/2026
MoteurSur une semaine à cheval entre deux mois, le moteur cherchait encore à poser un passage que le mois voisin avait déjà posé — et que son propre plafond lui interdisait d'ajouter. Il poussait sur une porte fermée à clé. Sans effet visible tant que le nombre souhaité par semaine égale le maximum autorisé, mais dès que le souhait repasse au-dessus, ce mois-ci aurait visé un passage de trop sur une semaine déjà servie, en détournant un médecin d'une semaine qui, elle, n'a personne. Les quatre règles qui arbitrent une semaine à cheval — minimum, maximum, nombre souhaité et budget de charge — lisent maintenant toutes la même chose.
MoteurLe budget de charge suit : un passage déjà assuré par le mois voisin n'est plus provisionné ici, puisqu'il n'y aura pas lieu. Au plus deux semaines par mois sont concernées, et seulement si le voisin a réellement posé quelque chose. Les services sans poste optionnel — Rochefort — sont rigoureusement intouchés : l'empreinte de référence du moteur est restée conforme.
v8.160.028/07/2026
Fix« Voir les changements » disait deux fois faux. Il annonçait des modifications sur des réglages qui n'existent pas — le poids d'ensemble d'une règle qui se règle par sous-réglages n'est pas un curseur, c'est une valeur calculée. Et il ne montrait aucun sous-réglage : une session où l'on n'avait touché que ceux-là s'annonçait « aucun changement » alors que sept valeurs différaient. Les deux sont corrigés.
AméliorationL'aperçu parle français : plus de « Poids : » ni de « Toggle : » devant le nom des règles, et « Off » devient « Désactivée ».
NouveauLa section « Réglages rapides » devient un choix par service. Ses trois profils sont calqués sur un service donné ; sur un service qui s'en est éloigné, ils proposent des valeurs qui ne sont pas les siennes. Elle est désormais masquée pour Libourne, où douze règles divergeaient de ces profils.
v8.159.028/07/2026
NouveauLe réglage d'importance des règles du moteur devient un curseur continu. Les cinq niveaux — d'« Optionnel » à « Quasi-obligatoire » — ne sont plus des boutons qui imposent une valeur, mais des repères qui nomment une zone. Toute valeur est atteignable, et déplacer le curseur puis le relâcher au même endroit ne modifie plus rien. Avant, 89 % des règles affichaient un niveau arrondi qu'un simple clic suffisait à écrire à la place de la vraie valeur.
NouveauLa valeur est désormais visible en permanence à côté du curseur, et modifiable au clavier. On peut taper une valeur que le curseur ne couvrait pas : la piste s'étire jusqu'à elle au lieu de la tronquer.
AméliorationUne règle réglée à zéro affiche « sans effet » au lieu d'« Optionnel ». Zéro veut dire que la règle ne compte pas du tout, ce qui n'est pas la même chose qu'une importance faible. Neuf règles étaient concernées.
AméliorationUne valeur saisie au mauvais sens — négative sur une règle qui évite, positive sur une règle qui encourage — est refusée avec un message, jamais corrigée en silence. C'est une correction silencieuse de ce type qui avait inversé une règle en production.
AméliorationSur mobile, les cinq repères se répartissent sur toute la largeur de la ligne au lieu de se tasser sous leur position exacte, où ils finissaient par se chevaucher sur les écrans étroits.
AméliorationLe bouton « Mode expert » disparaît : il ne servait qu'à révéler la valeur numérique et un curseur d'appoint qui, lui, était plafonné et ne pouvait que réduire les quatre règles les plus fortes. La jauge fait mieux, tout le temps.
v8.158.028/07/2026
FixDans les Réglages du moteur, cliquer sur les pastilles d'importance d'une règle « bonus » la transformait en règle « pénalité » : le moteur se mettait à éviter exactement ce qu'elle devait encourager, et rien à l'écran ne le montrait. Les deux règles qui regroupent le week-end à Libourne (vendredi + dimanche, samedi + dimanche) basculaient d'un fort encouragement à un léger rejet en un clic. C'est le mécanisme qui avait produit le problème des deux week-ends de garde par mois en juillet.
FixLa règle « Poste préféré » était présentée comme un bonus alors que le moteur l'applique comme une pénalité sur les postes non préférés. Deux erreurs se compensaient ; corriger l'une sans l'autre aurait fait récompenser le fait d'être sur un poste qu'on n'a pas choisi.
AméliorationLe réglage « Garde → urgences » de Rochefort et de la démo pédiatrie porte une valeur au mauvais signe, héritée de ce défaut : la règle y décourage aujourd'hui ce qu'elle devrait encourager. Sa remise à l'endroit est signalée à part, car elle change le planning généré.
v8.157.027/07/2026
FixDans les Réglages du moteur, le petit lien qui ramène un sous-réglage à sa valeur par défaut faisait parfois l'inverse de ce qu'il annonçait. La carte affichait bien la valeur du service, la pastille « modifié » disparaissait — mais l'enregistrement écrivait une nouvelle surcharge à la place de l'ancienne, et le moteur repartait avec les mêmes valeurs qu'avant. Pire, cette surcharge était plus large que celle qu'elle remplaçait : elle s'appliquait aussi aux sous-réglages jamais touchés. Le lien retire désormais réellement la surcharge.
FixUn réglage de service inscrit sur un sous-réglage était perdu en silence, dans l'écran comme dans le moteur. À Libourne, le surcoût « deux gardes à un jour d'intervalle en semaine », demandé après le retour de Marine et réglé le 25 juillet, valait en réalité zéro depuis : la règle n'avait jamais eu d'effet. Elle est de nouveau lue, et l'écran affiche la bonne valeur.
AméliorationLes sous-réglages qui ne s'appellent pas « poids » — le nombre de jours qui définit une semaine de soins, le seuil de tolérance du plafond d'heures — se comparaient au catalogue général au lieu du réglage du service. Ils suivent maintenant la même règle que les autres.
v8.156.028/07/2026
FixLe bandeau « Passages à couvrir » réclamait un passage sur une semaine que le mois précédent avait déjà couverte. Décembre annonçait « Aucun passage — Maternité de Blaye · Sem. du 30/11 » alors que le passage était bien posé le lundi 30/11, du côté novembre de la semaine. Le bandeau ne regardait que les jours du mois affiché ; le moteur, lui, lit déjà le mois voisin des deux côtés, et son plafond interdisait même d'en ajouter un second. Une semaine à cheval compte désormais ce qui a été posé de l'autre côté de la frontière, comme le moteur.
v8.155.028/07/2026
FixL'écran Accès pouvait être entièrement vide : ni les noms des médecins, ni le compteur de PIN, ni la moindre explication. Il se construisait à partir des liens de connexion existants, et non de l'équipe : un service dont les médecins ont été enregistrés autrement qu'un par un depuis l'écran Équipe n'avait aucun lien, donc plus rien à afficher. La liste part désormais de l'équipe, et un médecin sans lien apparaît clairement étiqueté « Sans accès » au lieu de disparaître.
NouveauNouveau bouton « Créer les accès manquants » : il fabrique en une fois le lien personnel de tous les médecins actifs qui n'en ont pas. Jusqu'ici, un lien ne pouvait naître qu'au moment de créer un médecin, et rien ne permettait de rattraper un médecin déjà enregistré. Les médecins qui ont déjà un lien ne sont jamais touchés, et aucun email n'est envoyé : les liens sont à copier pour les transmettre.
Amélioration« Copier les liens en attente » ne colle plus de lien vide. Si les médecins en attente n'ont pas encore d'accès, le message invite à les créer d'abord.
AméliorationUn médecin désactivé reste visible sur l'écran Accès, marqué « Inactif », et aucun lien de connexion ne lui est créé.
v8.154.028/07/2026
NouveauUn rapport du moteur apparaît maintenant sous le planning, dans la vue admin. Il dit quelles règles n'ont strictement rien produit lors de la génération, et pourquoi. Jusqu'ici l'écran Réglages montrait chaque règle avec son curseur, ce qui donnait l'impression qu'elle agissait : dix-sept d'entre elles ne se réveillent en réalité que si le service a déclaré une certaine information, et rien ne le disait nulle part. Sur mars 2026 à Rochefort, le rapport annonce vingt-six règles appliquées et vingt sans effet, dont dix-neuf avec leur raison.
NouveauLe titre du rapport porte toujours la date et l'heure de la génération. C'est volontaire : le rapport décrit ce que le moteur a fait ce jour-là, pas le planning affiché à l'écran, qui a pu être retouché à la main depuis.
AméliorationLes mots sont choisis pour ne pas promettre plus que ce qui est mesuré. « Sans effet » est certain : la règle n'a rien mis dans la balance, elle ne peut pas avoir influencé le planning. De l'autre côté, le rapport dit qu'une règle « a bien tourné » et non qu'elle a pesé — une autre règle a pu la dominer, et l'écran ne prétend pas le savoir.
AméliorationQuand la raison n'est pas dérivable proprement, le rapport reste muet plutôt que d'inventer une explication. Une raison fausse coûterait plus cher que pas de raison du tout.
AméliorationLes plannings générés avant cette fonctionnalité affichent un état explicite — « Aucun rapport, ce planning a été généré avant cette fonctionnalité » — au lieu de disparaître silencieusement.
MoteurLe comptage ne retient que ce qui pèse vraiment. Une règle peut déposer des centaines d'éléments à poids nul sans jamais le vérifier ; le moteur les jette de toute façon. Les compter aurait affiché « appliquée » pour une règle qui, par construction, ne pouvait rien déplacer.
MoteurLe planning généré est rigoureusement identique : ce travail ne fait que compter ce qui existait déjà, sans créer la moindre contrainte. L'empreinte de référence du moteur est restée conforme sur les trois mois témoins.
v8.153.028/07/2026
FixLe planning d'un service qui compte en heures par semaine affichait quand même la carte de suivi en demi-journées, un décompte qui n'existe pas chez lui. Les deux façons de compter le temps de travail sont exclusives, mais la carte s'allumait par défaut faute de réglage explicite en base — et aucun service n'en posait un. Elle suit désormais le régime déclaré : demi-journées pour les services qui les utilisent, heures par semaine pour les autres, sans réglage à penser.
AméliorationDéclarer un congé, un RTT, une formation, un arrêt ou une activité externe reste possible partout. Ces options dépendaient du même réglage que le suivi en demi-journées et auraient disparu avec lui ; elles ont maintenant leur propre réglage, activé pour tout le monde.
v8.152.027/07/2026
FixUn mois pouvait devenir impossible à générer sans raison visible dès qu'un poste optionnel était limité à un seul passage par semaine. Sur une semaine à cheval entre deux mois, le plafond tenait compte de ce que le mois voisin avait déjà posé, mais le plancher non : il continuait d'exiger un passage alors que le plafond n'en autorisait plus aucun. Décembre 2026 est tombé exactement dans ce cas et refusait de se générer, sans que le message d'erreur mentionne le poste en cause. Les deux règles lisent désormais la même chose.
AméliorationLe sens est le même des deux côtés : si la semaine calendaire est déjà couverte par le mois précédent, le mois courant n'a plus rien à ajouter.
v8.151.027/07/2026
MoteurUn passage en bonus à Blaye ne comptait pas dans le temps de travail de celui qui le prenait, au moment de décider s'il pouvait le prendre. Un médecin à une heure de son plafond passait donc la porte, et le passage suivant aussi, et celui d'après : sur les quatre mois générés, une praticienne est restée trois mois de suite juste sous son plafond et a accumulé douze passages, soit cent vingt heures qui l'ont mise à 128 % de son contrat sans que rien ne s'y oppose. Chaque passage consomme désormais la marge de celui qui le prend, donc le deuxième n'est accordé que s'il reste vraiment de la place.
AméliorationLe passage obligatoire reste inchangé et la maternité n'est toujours jamais concernée : ils sont dus, et l'équipe génère le temps pour les assurer.
v8.150.027/07/2026
MoteurLes consultations faites pendant une semaine de soins étaient décomptées du temps disponible d'un médecin, alors qu'elles se font par-dessus un poste déjà tenu : le médecin est déjà là ce jour-là et ne quitte pas l'équipe disponible. Le service exprime ses objectifs en « X créneaux dont Y hors semaine de soins » ; le moteur retirait X au lieu de Y. Sur le quadrimestre, 72 créneaux sur 179 — 40 % — étaient dans ce cas, soit 29 journées de médecin retirées à tort de la capacité de l'équipe.
MoteurL'erreur ne frappait pas tout le monde pareil, et c'est ce qui déséquilibrait le planning : elle était proportionnelle à l'écart entre les deux objectifs. Une praticienne avec 25 créneaux dont 12 hors semaine de soins perdait 6,5 jours de disponibilité apparente, contre 2 jours pour une collègue qui n'a que 8 créneaux. Le moteur donnait donc les postes de journée à celle qui consulte peu — quatre semaines de soins d'affilée pour l'une d'elles — en croyant les autres déjà pleines.
AméliorationUn service qui ne détaille pas ses objectifs de consultation garde exactement le comportement précédent : sans la ventilation « hors semaine de soins », le total continue d'être décompté.
v8.149.027/07/2026
FixLa règle qui protège les médecins déjà au-dessus de leur temps ne s'appliquait presque jamais. Elle tolérait une personne surchargée par semaine avant de réagir : sur les dix-sept semaines à deux passages du quadrimestre, elle ne se déclenchait qu'une seule fois, et le planning régénéré était identique au précédent. Désormais, dès qu'une semaine comporte un passage en bonus, tous les médecins surchargés qui la tiennent sont pris en compte.
AméliorationLe passage obligatoire reste protégé exactement comme avant : une semaine qui n'a qu'un seul passage ne déclenche jamais la règle, quelle que soit la charge de celui qui l'assure.
v8.148.027/07/2026
MoteurLe deuxième passage hebdomadaire à Blaye est un bonus, mais le moteur le donnait à n'importe qui — y compris à des médecins qui avaient déjà largement dépassé leur temps de travail du mois. Sur les quatre derniers mois générés, dix-neuf passages sur trente-six sont allés à quelqu'un déjà au-dessus de son temps, dont un à 151 %, pendant que des collègues disponibles n'en recevaient aucun. Le moteur compare désormais les heures déjà travaillées au temps contractuel avant d'accorder ce passage. Le passage obligatoire et la maternité ne sont jamais concernés : ils restent dus, et l'équipe génère le temps pour les assurer.
MoteurLe temps contractuel d'un médecin est réduit à proportion de ses absences du mois. Sans cela, quelqu'un en congé trois semaines apparaissait comme le plus disponible de l'équipe et héritait du travail en bonus sur ses rares jours présents — un rattrapage après congés que le service avait explicitement écarté. Mesuré sur quatre mois : les médecins présents tout le mois affichaient une charge médiane de 99 %, contre 64 % pour ceux ayant posé des congés.
MoteurLe temps administratif déclaré d'un médecin est réservé sur son temps contractuel. Une cheffe de service dont 20 % du temps est administratif dispose de quatre cinquièmes d'un mois pour les soins, et non d'un mois entier — sans quoi le moteur la lisait comme disponible et lui confiait du travail en bonus.
AméliorationUne configuration incomplète est désormais refusée au démarrage avec un message explicite, au lieu de produire une règle qui apparaît active dans les Réglages et ne change rien au planning.
FixLa description du réglage de charge de travail affirmait que Blaye en était exclu. C'était faux : une journée à Blaye est une journée pleine et elle compte. Seul le CHU est exclu, ses heures appartenant à un autre établissement.
v8.147.027/07/2026
MoteurUne garde de nuit dure 15 heures mais comptait comme une journée de 10 dans la répartition de la charge — sous-évaluée d'un tiers par la seule règle censée tenir les quotités. Sur un quadrimestre, cela représentait 1 830 heures de travail de nuit dont un tiers était invisible. Les médecins qui portent le plus de gardes de nuit étaient donc systématiquement les plus chargés sans que rien ne le signale. La durée réelle de chaque poste est désormais ce qui compte.
MoteurUn poste qui n'est pas couvert tous les jours — la maternité, Blaye — était compté dans la charge à répartir même les jours où personne ne le tenait. Chacun recevait donc une part calculée sur du travail qui n'existait pas, et se retrouvait mécaniquement en dessous de son objectif. Comme plus personne n'était au-dessus, déplacer une journée d'un médecin surchargé vers un médecin disponible ne rapportait rien et le moteur ne le faisait jamais. Sur un mois réel, six médecins sur onze repassent au-dessus de leur objectif et les échanges redeviennent possibles.
MoteurL'écart sur les gardes et l'écart sur les journées étaient additionnés en une seule pénalité : un médecin ayant trois gardes de trop et trois journées de moins ne payait rien du tout, alors qu'il s'écartait des deux objectifs à la fois. Ils sont maintenant mesurés séparément.
FixLa répartition des semaines de soins pondérait chaque médecin par son ancienneté depuis janvier, alors qu'elle ne distribue que les semaines du mois en cours. Une assistante arrivée en novembre et présente tout décembre pesait six fois moins qu'une collègue également disponible, et se voyait attribuer zéro semaine de soins — lui en donner une l'aurait mise « en excès ». Elle en reçoit désormais sa part.
FixCette même répartition comptait en jours ce qu'elle distribue en semaines. Un médecin présent cinq jours groupés dans une seule semaine pesait autant qu'un médecin présent cinq jours répartis sur cinq semaines, alors que le premier ne peut tenir qu'une semaine de soins.
AméliorationQuand un mois ne peut pas être généré et qu'on relance en acceptant des trous, la répartition de charge ne s'applique plus : avec des postes volontairement laissés vides, son calcul n'a plus de sens et affichait un équilibre trompeur.
AméliorationUn poste optionnel ajouté au calcul de charge sans objectif de couverture hebdomadaire est désormais refusé au chargement, avec un message explicite, au lieu de produire une répartition silencieusement fausse.
v8.146.027/07/2026
MoteurLes créneaux de consultation qu'un médecin doit assurer ne réduisaient pas le nombre de journées de soins qu'on pouvait lui demander. Le moteur lui attribuait donc sa part pleine de postes, comme si ces heures n'existaient pas. Sur un vrai quadrimestre, une cheffe de service avec 35 créneaux et 17 gardes avait déjà 81 % de son temps engagé avant le moindre poste de journée : il ne lui restait que 10 jours de place, et elle en recevait 54. Les consultations se déduisent désormais de la capacité.
AméliorationLa règle reste souple : elle ne fait que réduire une part de répartition, elle ne rend aucun mois impossible à générer. Un médecin dont les consultations dépasseraient sa capacité tombe à zéro, jamais en négatif.
AméliorationSans objectif de consultation renseigné, strictement aucun changement — la déduction ne s'applique qu'aux médecins qui en ont un.
v8.145.027/07/2026
MoteurUne garde ne comptait pas comme du temps de travail dans la répartition de la charge. Un médecin pouvait donc recevoir sa part pleine de postes de jour EN PLUS de ses gardes, sans que rien ne le remarque : mesuré sur les plannings de septembre à décembre, cela représentait 42 % de charge invisible. Les gardes comptent désormais.
MoteurLe nombre de gardes attendu de chaque médecin reste celui que le service a défini, jamais un calcul proportionnel à la quotité. Sur le vrai effectif, deux médecins à temps plein peuvent avoir des cibles allant de 5 à 17 gardes selon leur situation : répartir les gardes au prorata aurait écrasé ces choix. La charge et les cibles de gardes tirent maintenant dans le même sens au lieu de s'opposer.
FixLes week-ends et jours fériés étaient entièrement ignorés par le calcul de charge. Comme les postes de jour n'existent pas ces jours-là, seules les gardes s'y trouvaient — et elles étaient donc invisibles. Sur un mois de novembre, 10 jours sur 30 échappaient au comptage.
FixUn médecin qui ne fait que des gardes était complètement exclu du calcul de charge. Il y entre désormais par sa cible de gardes, sans se voir réclamer une part de postes de jour qu'il ne peut pas tenir.
AméliorationRéglage optionnel par service : un service qui ne déclare pas de répartition de charge ne voit strictement aucun changement.
v8.144.026/07/2026
FixL'alerte hebdomadaire d'un poste comme la maternité ne remarquait pas qu'une seule demi-journée manquait, tant que l'autre moitié du jour était couverte. Un après-midi vide comptait comme une journée pleine, et la semaine pouvait afficher « ok » alors qu'il manquait réellement du monde.
v8.143.026/07/2026
MoteurUn poste optionnel (Blaye) peut désormais recevoir un plafond hebdomadaire ferme : au-delà d'un certain nombre de passages dans la semaine, le moteur refuse d'en ajouter un de plus, quelle que soit la pression par ailleurs. Un plafond de ce type ne peut jamais empêcher un mois de se générer — contrairement à un plancher, il reste toujours possible de le respecter en couvrant moins, jamais en étant forcé de couvrir plus.
FixUne semaine à cheval sur deux mois (moins de 3 jours dans le mois en cours) échappait entièrement au plafond, alors qu'elle y était bien soumise pour un plancher. Corrigé : le moteur regarde désormais des deux côtés de la frontière et déduit ce qui a déjà été placé dans le mois voisin avant d'appliquer le plafond restant, sur chaque semaine sans exception.
AméliorationRéglage optionnel par service et par poste, inactif par défaut : aucun changement pour un service qui ne le configure pas.
v8.142.026/07/2026
MoteurDeux régénérations du même mois, avec exactement les mêmes réglages, pouvaient produire des résultats différents de plusieurs centaines de points — le moteur explore huit chemins de recherche en parallèle sans jamais repartir du même point de départ. Le service peut désormais lancer plusieurs tentatives indépendantes et garder automatiquement la meilleure, plutôt que de se fier à la première trouvée.
AméliorationRéglage optionnel par service (inactif par défaut, aucun changement pour les services qui ne l'activent pas) : le nombre de tentatives à comparer avant de retenir un planning.
v8.141.026/07/2026
MoteurDeux semaines de soins d'affilée à cheval sur deux mois passaient complètement inaperçues. Constaté sur le planning généré le 24 juillet : Youssef tenait la pédiatrie du lundi 23 au vendredi 27 novembre, puis de nouveau du lundi 30 novembre au vendredi 4 décembre — dix jours de soins presque d'affilée, sans qu'aucun des deux mois ne signale quoi que ce soit.
MoteurDeux angles morts distincts, tous deux corrigés. D'abord, une semaine coupée par un changement de mois ne montrait que ses jours du mois en cours : une semaine qui commence un 30 novembre n'exposait qu'un seul jour, et la règle en demande deux pour considérer qu'il s'agit d'une semaine de soins — le seuil était donc hors d'atteinte, quel que soit le réglage. Ensuite, le moteur comparait cette semaine à sa propre moitié du mois précédent au lieu de la comparer à la semaine d'avant, qui est pourtant la vraie question posée.
MoteurLe moteur regarde désormais des deux côtés de la frontière : la semaine à cheval récupère ses jours de l'autre mois, et la semaine qui précède le premier lundi du mois est prise en compte quand elle a déjà été publiée. Sans mois voisin publié, le comportement est strictement identique à avant.
AméliorationConséquence pratique : générer les mois dans l'ordre chronologique donne désormais un meilleur résultat que les générer en désordre, puisque chaque mois voit réellement celui qui le précède.
v8.140.026/07/2026
MoteurUn médecin qui arrive en cours d'année n'est plus considéré comme « en retard » sur le travail fait avant son arrivée. L'équilibrage des postes lui réclamait sa part des mois où il n'était pas là, et le moteur le chargeait de journées d'urgences pour rattraper une dette qui n'existait pas. Comme un médecin ne tient qu'un poste par jour, chacune de ces journées était une journée où il ne pouvait pas être en pédiatrie ou en néonatologie.
MoteurLe calcul compte les mois où le médecin pouvait réellement tenir le poste, et non sa simple présence : un mois passé en « gardes uniquement » ne compte pas non plus. Mesuré sur septembre-décembre 2026, cela retire 88 % de l'écart injustement attribué aux trois médecins arrivés en cours d'année. Pour une équipe stable, rien ne change.
v8.139.025/07/2026
FixLe suggéreur de correctifs travaillait sur une image incomplète du planning. Il ignorait l'historique de répartition des postes, le mois suivant, et les objectifs de gardes et de consultations du quadrimestre — et il calculait l'historique des gardes sur l'année entière même pour un service qui compte par quadrimestre. Il proposait donc des corrections calculées sur un modèle différent de celui qui a produit le planning, sans que rien ne le signale.
AméliorationCe que le moteur sait du passé et du futur d'un mois est désormais construit à un seul endroit, partagé par la génération et par le suggéreur de correctifs. Les deux ne peuvent plus s'écarter l'un de l'autre : c'était la troisième fois que ça arrivait, et les deux fois précédentes avaient été corrigées champ par champ.
MoteurL'équité de répartition des postes ne compte plus comme disponible un médecin qui n'a aucun créneau réel sur un poste, même quand la règle qui l'en écarte lui laisse une case vide dans le modèle.
v8.138.025/07/2026
MoteurUn changement de profil daté peut désormais poser le plafond hebdomadaire d'un poste, au même titre que la quotité ou la priorité. Un médecin qui devient affectable à tous les postes en cours d'année pouvait changer de rôle sur le papier sans recevoir la limite qui va avec — le moteur pouvait alors lui poser quatre journées d'urgences dans la même semaine sans que cela lui coûte quoi que ce soit.
MoteurL'équité de répartition des postes ne réserve plus de part à un médecin absent tout le mois. Elle lui attribuait une semaine de soins et un quota d'urgences que personne ne pouvait prendre, ce qui réduisait d'autant la part réelle de tous ceux qui étaient présents.
AméliorationLa question « ce médecin peut-il travailler ce jour-là ? » n'a plus qu'une seule réponse dans le moteur. Deux règles la calculaient chacune de leur côté et pouvaient diverger.
v8.137.025/07/2026
MoteurDeux gardes séparées d'un seul jour en pleine semaine — un lundi puis un mercredi, un mardi puis un jeudi — deviennent très coûteuses pour le moteur. Deux gardes séparées de deux jours, comme lundi et jeudi, restent normales : le service les accepte. Un jour férié en milieu de semaine compte comme un jour de semaine.
MoteurAvant de choisir ce réglage, la question a été tranchée par la mesure : le moteur ne choisissait pas ces enchaînements, il ne les éliminait simplement pas dans le temps qui lui est imparti. En interdisant complètement le cas sur les quatre mois générés, il trouve toujours une solution — et parfois même une meilleure. Le réglage est donc volontairement très fort, mais reste souple : un mois vraiment contraint sortira dégradé plutôt que sans planning.
MoteurLe moteur regarde désormais aussi le mois suivant pour espacer les gardes, et plus seulement le précédent. Quand un mois est regénéré alors que le suivant existe déjà, une garde le 30 novembre et une le 2 décembre étaient invisibles aux deux plannings.
FixUn curseur d'espacement réglé à zéro dans les Réglages éteint maintenant vraiment son palier. Il laissait auparavant passer une pénalité résiduelle, donc le réglage semblait sans effet.
FixPage Réglages : le lien de remise à zéro d'un réglage fin visait la valeur du catalogue au lieu de celle du service. Un clic aurait pu écraser un réglage propre au service en croyant le restaurer.
AméliorationNouvel indicateur « Gardes rapprochées » dans la vue planning administrateur : il liste, avant publication, chaque médecin ayant deux gardes séparées d'un seul jour en semaine. Le réglage du moteur étant souple, il ne garantit jamais zéro — cet indicateur permet de le vérifier sans attendre un retour.
v8.136.025/07/2026
MoteurLa fiche de chaque médecin comporte un réglage « je garde les patients de mon secteur le week-end qui suit ma semaine de soins », à trois états : oui, non, ou pas de choix exprimé. Le plafond d'heures hebdomadaire, lui, était un chiffre unique appliqué à tout le monde : il empêchait donc cet enchaînement même pour ceux qui l'avaient explicitement demandé, sans que rien ne le signale. Le plafond suit désormais la fiche.
MoteurConcrètement, à Libourne : sept médecins ont demandé cet enchaînement, leur plafond passe à 70h — la valeur que prend une semaine de soins complète suivie des deux jours de garde du week-end. Ceux qui l'ont refusé et ceux qui n'ont rien exprimé restent à 65h, et le moteur ne leur proposera jamais une semaine de sept jours d'affilée.
MoteurMesuré sur les plannings validés de janvier à août : 21 des 39 gardes de jour de week-end suivent une semaine de soins complète, et 18 d'entre elles couvrent les deux jours du week-end, réparties sur huit médecins. C'est une pratique du service, pas une exception. Le plafond de service reste à 65h, valeur mesurée, inchangée.
FixLe moteur refuse au chargement une configuration où le plafond relevé serait inférieur au plafond de base, ou posé sans lui — deux erreurs qui auraient contraint davantage les médecins censés être soulagés, ou fait cohabiter deux modèles de plafond dans le même service.
v8.135.025/07/2026
MoteurLes week-ends se tenaient d'un bloc une fois sur deux seulement : la règle qui espace les gardes facturait le week-end groupé qu'une autre règle cherchait justement à former. Un samedi + dimanche, c'est un jour d'écart ; un vendredi + dimanche, deux jours : les deux tombaient dans la tranche « gardes trop rapprochées ». La récompense du week-end groupé dépensait donc une bonne partie d'elle-même à racheter une pénalité qu'elle déclenchait toute seule, et ce qui restait pesait moins que l'équité, les cibles de garde ou l'enchaînement semaine de soins. Les deux moitiés d'un même week-end ne se pénalisent plus entre elles.
MoteurL'exemption vaut aussi quand le week-end est à cheval sur deux mois, comme le 30 octobre – 1er novembre : la moitié déjà publiée est reconnue et la moitié restante n'est plus facturée. Sur les 4 mois générés le 24 juillet, 4 week-ends sur 17 étaient découpés, dont celui du 31 octobre qui mobilisait 5 personnes différentes au lieu de 3.
AméliorationL'espacement des gardes en semaine reste inchangé : deux gardes rapprochées un mardi et un jeudi coûtent toujours autant. Seules les deux moitiés d'un même week-end sont concernées, et seulement dans les services qui récompensent ce regroupement.
v8.134.025/07/2026
MoteurÀ Libourne, la quotité d'un médecin se regarde désormais sur le MOIS, en nombre de jours travaillés, et non plus semaine par semaine à travers un plafond d'heures. C'est la bonne maille : une journée de soins dure autant pour un mi-temps que pour un temps plein, et le service fonctionne en semaines de soins entières et en gardes de week-end. Mesuré avant correction sur les 4 mois générés : un médecin à 50% tenait 18,5 jours de poste pour une part de 11, un autre à 100% en tenait zéro pour une part de 36.
MoteurLa cible tient compte de la disponibilité réelle, pas seulement de la quotité : un médecin qui arrive en cours de mois, ou qui est en congé la moitié du mois, reçoit une cible réduite d'autant. Sans ça, sa part inutilisée était retirée à tout le monde.
MoteurCe décompte porte sur tout ce qui consomme du temps de travail du service, Blaye compris — une journée là-bas est une journée travaillée. Le CHU en est exclu : c'est un autre établissement, et le moteur ne lui compte déjà aucune heure. Le moteur refuse désormais au démarrage une configuration qui compterait un poste ne consommant aucun temps de travail.
FixLes réglages horaires posés côté service n'arrivaient pas tous jusqu'à l'application : la couche de lecture ne recopiait qu'une partie des champs, en silence. L'application pouvait donc afficher des chiffres différents de ceux que le moteur utilise. Deux champs étaient concernés.
v8.133.025/07/2026
MoteurÀ Libourne, le plafond d'heures hebdomadaire était calculé au prorata de la quotité, alors qu'une journée de soins dure 10h pour tout le monde. Conséquence mesurée : une semaine de soins complète devenait arithmétiquement impossible sans pénalité en dessous de 77% de quotité, 92% avec une garde de jour le week-end, 100% avec une garde de nuit — quel que soit le réglage. Sur les 4 mois générés, aucun médecin à temps partiel ne tenait une semaine de soins complète accompagnée d'une garde, contre 8 fois sur 8 mois de plannings faits à la main. Le moteur sait désormais utiliser un plafond identique pour tous, réglable par service.
MoteurÀ Libourne, l'enchaînement « semaine de soins puis garde de jour du week-end » se déclenchait dès UN SEUL jour de soins dans la semaine. Il récompensait donc les blocs courts chez les médecins qui voulaient l'enchaînement, et pénalisait ceux qui l'avaient refusé pour des situations qu'ils n'avaient jamais refusées. Le seuil est désormais réglable : il faut 3 jours de soins dans la semaine pour qu'elle compte comme une semaine de soins. Valeur mesurée sur les plannings validés du service, où la pratique réelle est nettement séparée entre « aucun jour de soins » et « une semaine de 4 à 5 jours ».
FixCorrection d'un défaut latent qui aurait rendu certains mois impossibles à générer dès que le seuil ci-dessus dépassait 1 : la règle interdisait alors purement et simplement aux médecins concernés de travailler 1 ou 2 jours de soins dans une semaine, au lieu de simplement moins le préférer.
v8.132.025/07/2026
NouveauLe panneau d'un jour permet enfin de pourvoir une demi-journée précise : la maternité et les urgences y affichent une ligne « Matin » et une ligne « Après-midi », chacune modifiable séparément, y compris celle que personne ne tient. Il fallait auparavant passer par « Scinder », qui n'apparaissait que si les deux moitiés étaient déjà remplies — impossible d'ajouter seulement l'après-midi.
FixPourvoir une maternité vide depuis le panneau d'un jour enregistrait l'affectation sans préciser matin ou après-midi, ce qui la faisait ressembler à une journée entière dans toutes les vues. Chaque ligne enregistre désormais la bonne demi-journée.
FixAccepter une reprise sur une journée complète de maternité ne transférait que le matin : l'après-midi restait au médecin d'origine, sans message ni avertissement. Les deux demi-journées changent maintenant de mains ensemble. Une reprise qui ne porte que sur une moitié laisse bien l'autre intacte.
AméliorationL'écran de proposition de reprise indique la demi-journée concernée (« Maternité / Bip — Matin »). Proposer sa seule matinée s'affichait jusqu'ici comme si la journée entière changeait de mains.
v8.131.025/07/2026
FixÀ Libourne, un médecin qui ne tient qu'une demi-journée à la maternité s'affichait exactement comme un médecin présent toute la journée : une seule pastille avec son nom, sans aucune indication d'horaire, et rien ne signalait que l'autre moitié n'était couverte par personne. Les cases concernées affichent désormais « Matin » et « A-m. » sur deux lignes, la moitié découverte comprise. Une journée entière tenue par une seule personne reste affichée comme avant, en une seule pastille.
FixLe cadenas d'un verrou posé sur une seule demi-journée s'étendait visuellement sur la journée entière, en teintant toute la case. Il se pose maintenant sur la seule tranche réellement gelée — l'autre moitié reste visiblement modifiable.
FixSur la page publique et sur « qui travaille aujourd'hui » du tableau de bord, quand deux médecins se partageaient une journée en deux demi-journées, seul le premier des deux était affiché. Les deux apparaissent désormais, chacun avec sa tranche.
AméliorationLe panneau d'un jour affiche l'horaire de la demi-journée tenue (« Maternité / Bip — Matin »). Il ne l'affichait jusqu'ici que lorsque les deux moitiés étaient remplies, si bien qu'une demi-journée seule perdait l'information qu'une journée complète donnait.
AméliorationDans « mon planning » et la vue équipe, une demi-journée est signalée comme telle au lieu d'être présentée comme une journée pleine.
v8.130.025/07/2026
MoteurÀ Libourne, un jour férié tombant en milieu de semaine coupait la semaine de soins en deux. Le moteur traitait ce férié exactement comme un week-end : garder le même médecin sur le secteur avant et après le férié ne lui rapportait plus rien, donc n'importe quelle autre règle décidait seule qui reprenait le secteur le lendemain. Constaté sur la semaine du 9 novembre 2026 (Armistice le mercredi), où la néonatologie changeait de médecin pile au férié, et sur la semaine du 14 juillet où les deux secteurs de soins étaient coupés. Un férié isolé en semaine ne rompt plus la continuité : une semaine avec férié se comporte désormais comme une semaine ordinaire.
MoteurMême correction étendue aux deux règles générales de rythme, qui avaient le même angle mort : celle qui encourage un même médecin plusieurs jours de suite sur un poste, et celle qui empêche les blocs de 4 jours et plus. Les deux comptent désormais les jours de la même façon de part et d'autre d'un férié — sans quoi la première aurait récompensé un enchaînement que la seconde n'aurait pas su voir. Concerne tous les services. Sur 2026, seuls trois mois sont touchés : mai (Ascension le jeudi), juillet (14 le mardi) et novembre (11 le mercredi) ; un férié tombant un lundi ou un vendredi ne change rien, puisqu'il est collé au week-end.
v8.129.025/07/2026
FixÀ Libourne, les mois importés directement sans jamais être passés par une génération du moteur (janvier à juin 2026) s'affichaient comme « rien de généré » sur la page Planning, la page publique et le tableau de bord — alors que ces mêmes mois étaient déjà correctement comptés dans les totaux d'équité de garde de Mon suivi. La page Planning lit désormais aussi les plannings importés, comme le fait déjà Mon suivi.
v8.128.024/07/2026
MoteurÀ Libourne, un médecin avec un objectif de passages mensuel sur un poste optionnel (ex. Blaye) qui prenait une semaine de congé voyait le moteur compenser en resserrant les passages restants sur les semaines suivantes pour quand même atteindre l'objectif du mois complet. L'objectif est désormais réduit au prorata de la présence réelle ce mois-là — une semaine de congé n'est plus rattrapée ensuite.
v8.127.024/07/2026
FixÀ Libourne, rien n'empêchait un médecin de se retrouver deux fois sur le site satellite de Blaye la même semaine — dommage et peu utile. Réutilisation du plafond hebdomadaire déjà existant sur un autre poste (construit pour les urgences) : au plus un passage à Blaye par semaine pour les médecins concernés, sauf si le planning n'a vraiment pas d'autre solution.
v8.126.025/07/2026
MoteurÀ Libourne, l'engagement d'un médecin partagé avec le CHU (30% de son temps) était devenu une règle stricte qui pouvait bloquer complètement la génération du planning si le compte n'était pas exactement atteint — c'est ce qui a empêché de générer octobre. Redevient une cible forte mais souple : le moteur vise fort ce 30% chaque mois, sans jamais empêcher la génération du reste du planning si un mois particulier ne le permet pas totalement.
v8.125.024/07/2026
MoteurÀ Libourne, la règle censée empêcher 2 semaines de suite sur le même secteur de soins ne voyait pas un médecin qui alterne pédiatrie et néonatologie d'une semaine à l'autre — chaque secteur étant vérifié séparément, alterner entre les deux passait inaperçu, jusqu'à 4 semaines d'affilée constatées pour un même médecin en décembre. Les deux secteurs sont désormais suivis comme un seul ensemble « soins » pour cette règle.
v8.124.024/07/2026
MoteurLa règle qui empêche un médecin de faire 2 week-ends de garde d'affilée perdait de vue le dernier week-end du mois précédent chaque fois que le mois suivant ne commence pas un lundi (ex. novembre 2026, qui commence un dimanche) — un médecin pouvait alors reprendre une garde le week-end suivant sans que la règle s'en aperçoive. Corrigé : la vérification compare désormais des dates calendaires plutôt qu'un numéro de semaine, quelle que soit la façon dont le mois démarre.
v8.123.024/07/2026
MoteurÀ Libourne, quand un poste se scinde en matin/après-midi (maternité, urgences), le moteur pouvait faire venir un médecin absent toute la journée pour une simple demi-journée, alors qu'un autre médecin déjà présent ce jour-là (en consultation) restait inutilisé — et scindait parfois un poste entre deux médecins sans aucune raison, un jour où le poste voisin restait tenu par une seule personne. Le moteur privilégie désormais le même médecin sur les deux moitiés d'un poste scindable, ou à défaut un médecin déjà présent ce jour-là.
v8.122.024/07/2026
MoteurÀ Libourne, dépasser de quelques heures le plafond hebdomadaire (régime temps médical continu) coûtait déjà plus cher que n'importe quelle autre préférence du moteur — au point d'empêcher systématiquement un couplage de garde week-end pourtant voulu, même quand le dépassement restait modeste et arrivait déjà régulièrement en pratique. Le dépassement reste dissuadé, mais les premières heures (jusqu'à 15h/semaine) pèsent maintenant beaucoup moins lourd qu'avant — le moteur peut à nouveau arbitrer plutôt que refuser systématiquement. Le dépassement au-delà de 15h reste aussi coûteux qu'avant.
v8.121.024/07/2026
MoteurÀ Libourne, un week-end de garde à cheval sur deux mois (ex. vendredi 30 octobre + dimanche 1er novembre) ne pouvait jamais être tenu par le même médecin, même quand cet appariement est fortement encouragé — les deux jours étaient générés par deux calculs de mois séparés, sans aucun moyen de se voir l'un l'autre. Le moteur regarde désormais des deux côtés de la frontière avant de choisir, comme pour la continuité des postes de soins (correctif précédent). Concerne aussi bien la garde de nuit (vendredi+dimanche) que la garde de jour du week-end (samedi+dimanche).
v8.120.024/07/2026
FixUn changement de profil médecin programmé à une date qui n'est pas le 1er du mois (ex. le 2 novembre) prenait effet un mois entier trop tard, silencieusement — sans erreur, sans alerte, aussi bien pour la génération de planning que pour l'espace admin et les soldes de points/congés. Concrètement, à Libourne, Sarah Talbourdel (poste plein + quota Blaye) et Clémence Boux (fin d'intégration) auraient vu leur changement appliqué un mois après la date prévue. Le moteur refuse maintenant de charger une configuration avec une telle date mal réglée, l'espace admin et les soldes l'ignorent proprement au lieu de mal l'appliquer, et les deux dates concernées ont été corrigées en base pour refléter le mois réellement prévu.
v8.119.024/07/2026
FixLa génération de planning à Libourne échouait pour n'importe quel mois dès que le changement de profil programmé de Sarah Talbourdel (poste plein + quota Blaye au 01/11) était présent en base — le moteur ne reconnaissait pas la clé qui porte son quota de passages mensuels et refusait de charger la configuration, même pour des mois sans rapport avec novembre. Le moteur sait maintenant appliquer ce type de changement (quota de passages par poste optionnel) à la date prévue.
v8.118.024/07/2026
MoteurÀ Libourne, deux réglages qui récompensent un même médecin sur les deux gardes d'un même week-end (nuit vendredi+dimanche, jour samedi+dimanche) avaient dérivé bien au-dessus de leur plafond de sécurité — le garde-fou censé empêcher le moteur de sacrifier l'équité pour former cette paire était lui-même affaibli. Résultat mesuré : un médecin pouvait se retrouver avec 2 week-ends de garde complets sur un même mois au lieu d'1. Les deux réglages et leur garde-fou sont recalibrés dans la fenêtre de sécurité documentée.
v8.117.024/07/2026
FixÀ Libourne, un médecin en mission garde-seule (sans droit aux consultations ni aux postes) pouvait quand même apparaître « en consultation » sur la grille — la détection automatique de consultation honorée regardait uniquement si le créneau était libre, jamais si le médecin y était réellement éligible. Un désidérata de consultation existant (même ancien ou mal daté) suffisait à l'afficher, et à l'écrire pour de vrai une fois le planning validé. La détection respecte désormais l'éligibilité du médecin à la date exacte, comme le moteur le fait déjà pour les postes.
v8.116.024/07/2026
MoteurLe mécanisme de bascule de profil dans le temps (post_priority, quotité, cible de garde mensuelle…) ne pilotait pas l'objectif mensuel sur un poste optionnel (ex. Blaye) — un médecin gardait son ancien objectif avant même d'être éligible à ce poste. Corrigé pour Sarah Talbourdel à Libourne : son objectif Blaye (4/mois) ne s'active désormais qu'à sa bascule garde-seule → poste, le 01/11.
v8.115.024/07/2026
FixUne consultation demandée par un médecin pouvait s'afficher (et se valider) le lendemain d'une garde de nuit — jour de repos de garde obligatoire — car le mécanisme de consultation automatique regardait seulement si le médecin était libre ce jour-là, sans savoir que cette disponibilité venait justement du repos dû après la garde. La consultation ne s'affiche plus sur ces jours.
v8.114.024/07/2026
FixÀ Libourne, un médecin externe positionné uniquement sur ses dates verrouillées par l'admin (Jean-René Nelson) continuait d'être placé par le moteur sur d'autres postes et d'autres jours. Le réglage qui l'en empêche existait bien en base et côté moteur, mais se perdait silencieusement en chemin entre les deux — corrigé, il n'apparaît plus que sur ses créneaux verrouillés.
v8.113.024/07/2026
MoteurÀ Libourne, la continuité d'équipe sur les postes de soins (pédiatrie, néonatologie) se cassait exactement à la frontière entre deux mois générés séparément — le dernier jour ouvré d'un mois ignorait totalement l'équipe déjà fixée sur le premier jour du mois suivant, et inversement. Le moteur regarde désormais des deux côtés de la frontière avant de choisir qui continue.
v8.112.024/07/2026
FixAprès le correctif de la grille de planning, l'identifiant interne du médecin (BX, CH, MJ…) apparaissait encore, au lieu de l'abréviation choisie par l'équipe, dans 4 autres endroits : le bandeau de conflits des réglages, l'aperçu des changements avant validation, les info-bulles de conflit sur le planning et les messages d'erreur d'échange de garde. Audit complet du code fait pour ne rien laisser passer une 4e fois — corrigé partout.
v8.111.023/07/2026
MoteurSous pénurie, maternité pèse désormais moins lourd que les autres postes obligatoires (urgences, néonatologie, pédiatrie) dans l'arbitrage du moteur — cohérent avec la priorité déjà établie côté découpage matin/après-midi : si un poste doit céder en premier, c'est maternité.
v8.110.023/07/2026
NouveauNouveau bouton « Supprimer ce planning » dans l'espace admin, à côté de « Régénérer » — supprime intégralement un planning déjà généré (affectations, retouches manuelles, échanges en cours) pour repartir d'une page blanche. Manquait jusqu'ici : seule la surcouche « Personnalisé » pouvait être retirée, jamais le planning du moteur lui-même.
v8.109.023/07/2026
FixUn verrou admin (garde forcée pour un médecin un jour donné) pouvait contredire un désidérata bloquant du même médecin le même jour (formation, congé, activité externe) — le moteur retenait les deux exigences contradictoires et refusait toute génération, y compris « avec les postes manquants ». Les verrous admin l'emportent désormais sur ces désidérata, comme prévu depuis toujours mais jamais appliqué en pratique.
v8.108.023/07/2026
MoteurSous pénurie (mois généré avec des postes manquants), le moteur traitait une garde vide et une maternité/urgence vide comme deux problèmes de même gravité. Une garde non couverte est bien plus grave — le moteur pèse désormais 4 fois plus la garde qu'un poste dans son arbitrage, pour qu'il sacrifie une demi-journée de maternité avant de laisser une garde vide, quand un vrai choix se pose.
v8.107.023/07/2026
MoteurÀ Libourne, la maternité (matin/après-midi) pouvait rester à moitié vide sur un mois généré avec des postes manquants — le moteur considérait la journée « couverte » dès qu'un médecin tenait ne serait-ce que la moitié, sans jamais chercher à pourvoir l'autre. Même cause que le correctif de la garde de nuit du samedi, appliquée cette fois aux postes en demi-journée (maternité, urgences). Vérifié sur octobre : les 22 jours ouvrés ont désormais leurs deux moitiés couvertes.
v8.106.023/07/2026
MoteurÀ Libourne, la garde de nuit du samedi restait vide sur tout un mois généré avec des postes manquants, même quand il y avait assez de médecins disponibles pour la couvrir — le moteur considérait la garde du jour comme suffisante pour dire « ce jour est couvert » et ne cherchait donc jamais à pourvoir la nuit séparément. Vérifié : forcer la couverture des 4 nuits de samedi d'octobre reste parfaitement possible, ce n'était pas un manque réel de médecins. La garde de jour et la garde de nuit du week-end comptent désormais comme deux couvertures distinctes à assurer.
v8.105.023/07/2026
FixDans le détail d'un jour, un week-end à Libourne où seule la garde de jour était affectée se présentait comme une garde fusionnée à « Scinder » — et cliquer sur Scinder dupliquait le médecin du jour sur la nuit au lieu d'ouvrir une vraie place à pourvoir, en perdant au passage le bon gabarit de garde du jour. La nuit manquante s'affiche désormais comme une ligne à pourvoir normale, directement assignable, sans passer par « Scinder ».
v8.104.023/07/2026
FixLe type de désidérata « formation animée » (utilisé par les médecins qui donnent une formation, distinct d'y assister) existait déjà dans le sélecteur mais n'avait jamais pu être enregistré — toute tentative de le choisir échouait silencieusement en base. Corrigé : la formation que Johan Mazzarino anime les 19 et 20 novembre est désormais posée correctement.
v8.103.023/07/2026
FixLe planning affichait les identifiants internes des médecins (BX, CH, MJ, LG…) au lieu des abréviations choisies par l'équipe (BC, MiC, JM, GL…), alors que ces abréviations étaient bien enregistrées. La liste utilisée pour colorer les badges du planning ne transportait jamais l'abréviation jusqu'à l'affichage — corrigé, sans toucher aux données.
v8.102.023/07/2026
FixÀ Libourne, un week-end avec seulement la garde de jour du samedi affectée (garde de nuit manquante) avait l'air complet partout — l'espace admin ne le signalait pas, et le planning affichait un seul badge qu'on pouvait confondre avec une garde 24h. Un médecin seul un jour où les deux gardes (jour et nuit) sont attendues affiche désormais explicitement laquelle manque, sur ordinateur comme sur mobile, et l'alerte « postes vides » la détecte.
v8.101.023/07/2026
FixL'espace admin de décembre affichait une longue liste de « Conflit » qui n'en étaient pas. Trois causes : (1) un médecin dont le profil change de rôle en cours d'année (ex. passage d'assistante ponctuelle à assistante temps plein) restait signalé « fait uniquement des gardes » sur chaque poste, même des mois après le changement — le contrôle ne relisait jamais la date d'effet ; (2) une affectation verrouillée manuellement par un admin en dérogation au profil habituel d'un médecin (garde de Noël avant reconnaissance d'une transition, poste couvert un jour normalement off) déclenchait quand même un conflit, alors que c'est précisément une décision volontaire ; (3) un médecin tenant les deux moitiés (matin+après-midi) d'un même poste combinable déclenchait deux fois la même alerte au lieu d'une.
v8.100.023/07/2026
FixLe bandeau « Passages à couvrir » de Blaye (Libourne) pouvait afficher « Aucun passage — 2 souhaités » pour une semaine à cheval sur deux mois alors que les passages du côté voisin du mois suffisaient déjà — le correctif de la semaine à cheval (v8.99.0) avait été fait côté moteur mais pas sur cet affichage, qui gardait l'ancien calcul. Une semaine que le mois en cours ne couvre pas (moins de la moitié de ses jours) n'apparaît plus du tout dans ce bandeau.
v8.99.023/07/2026
FixUn médecin en CHU, en congé maternité ou dans une autre absence longue durée (`activite_externe`) n'apparaissait dans aucune vue admin comme absent ce jour-là — y compris le panneau « qui pourrait faire ça » sur un trou de planning, qui pouvait donc suggérer quelqu'un de réellement indisponible. Corrigé pour tous les services (touche aussi Rochefort).
MoteurBlaye (Libourne) : une semaine à cheval sur deux mois pouvait recevoir 3 passages au lieu de 2, chaque génération mensuelle visant sa propre cible hebdomadaire sans savoir ce que le mois voisin avait déjà posé cette semaine-là. La semaine appartient désormais entièrement au mois qui en couvre la majorité, comme c'était déjà le cas pour le minimum obligatoire.
FixL'espace admin affichait un avertissement de repos de garde non respecté quand un même médecin enchaînait la garde de jour du samedi et celle du dimanche à Libourne — une combinaison volontaire (l'un des 3 rôles du week-end), pas une vraie garde de nuit suivie d'un lendemain travaillé. L'avertissement ne se déclenche plus que sur une vraie garde de nuit ou 24h.
v8.98.023/07/2026
FixLe bouton « Générer avec les postes manquants » ne s'affichait jamais pour un mois réellement infaisable à Libourne : le solveur renvoyait bien « aucune solution », mais sans l'étiquette technique que la page utilise pour distinguer une vraie impasse d'une simple erreur — donc pas de proposition de génération en mode dégradé, juste un message d'erreur sans suite. Ça ne touchait que les services qui génèrent sans scénario alternatif (Libourne), pas les autres.
v8.97.023/07/2026
FixLe bouton « Générer avec les postes manquants » (génération en mode dégradé, quand le mois ne peut pas être complètement couvert) renvoyait une erreur serveur dès qu'un médecin sans variable de poste ce jour-là était dans l'équipe — par exemple Jean-René Nelson à Libourne, positionné uniquement sur ses dates verrouillées par l'admin. Le mode dégradé fonctionne maintenant normalement dans ce cas.
v8.96.023/07/2026
FixSur les postes en demi-journée (maternité/bip et urgences à Libourne), un médecin qui tient le matin ET l'après-midi n'apparaît plus deux fois, ni sur le planning ni dans le détail du jour — un seul affichage avec l'horaire complet. Quand ce sont deux médecins différents, l'ordre suit maintenant l'heure (matin avant après-midi) au lieu d'être parfois inversé. Un lien « Scinder » permet de retrouver les deux créneaux séparément si besoin de réaffecter juste une moitié.
FixLes fausses alertes de conflit « affecté à deux postes » et « affecté à plusieurs gabarits » qui apparaissaient dans le panneau admin et le détail du jour quand un médecin tenait légitimement les deux moitiés d'un poste en demi-journée ont disparu — le moteur de vérification du planning connaît maintenant les mêmes règles que le solveur.
v8.95.022/07/2026
NouveauSur un planning tout juste généré (pas encore validé), la grille affiche désormais un aperçu en pointillés des consultations qui seraient honorées si tu valides maintenant — sans rien enregistrer. Jusqu'ici il fallait valider pour voir apparaître quoi que ce soit, ce qui pouvait laisser croire que rien ne s'était passé après une génération. L'aperçu disparaît et devient réel dès la validation.
v8.94.022/07/2026
NouveauNouveau réglage par médecin : un objectif de créneaux de consultation sur le quadrimestre (4 mois), avec un sous-total « dont hors semaines de soins ». Le moteur vise désormais ces deux nombres au lieu d'une seule cible mensuelle de jours libres — quand ils sont renseignés, ils remplacent l'ancien réglage pour ce médecin. Non renseigné = rien ne change. Disponible pour l'instant uniquement sur les services en régime continu (Libourne) qui proposent des consultations.
MoteurLe calcul distingue désormais le matin de l'après-midi pour les médecins dont les consultations comptent pendant une semaine de soins : le créneau du matin est neutre (ni compté ni manqué) et celui de l'après-midi compte comme tenu, même si le médecin est posté ce jour-là — conforme à la façon dont Libourne organise ses semaines de soins.
NouveauLa Vue admin de « Mon suivi » affiche désormais un tableau Consultations (mois / quadrimestre / année, comme celui des gardes), avec le nombre de créneaux réalisés en face de l'objectif saisi par médecin. Le nombre réalisé reste une estimation à partir des demandes de consultation posées et respectées — une consultation faite sans demande préalable n'est pas comptée, une demande respectée ne garantit pas que la consultation a eu lieu — l'écart avec le ressenti du terrain est donc normal et attendu.
v8.93.022/07/2026
NouveauQuand un médecin souhaite une consultation (matin, après-midi, ou journée) et que le planning validé la respecte réellement — aucun poste ne l'occupe sur ce créneau — il apparaît désormais automatiquement « en consultation » à cet endroit, sans avoir à redéclarer une activité après coup. Si seule une moitié de la journée est libre, seule cette moitié est marquée. Une déclaration manuelle existante (bureau, formation…) n'est jamais remplacée. La mise à jour se refait à chaque validation du planning et après un échange de garde ou de poste, pour ne jamais afficher une consultation devenue caduque. Activé pour l'instant uniquement à Libourne — Rochefort n'est pas concerné.
v8.92.022/07/2026
FixLe rattrapage d'équité par quadrimestre (Libourne) supposait un ordre de génération dans le sens du calendrier et ignorait les verrous déjà posés sur les mois à venir. Concrètement : décembre, souvent le mois le plus chargé en verrous à cause des fêtes de fin d'année, héritait de tout le rattrapage d'équité du quadrimestre au moment précis où il avait le moins de marge pour l'absorber — sans aucun filet de sécurité pour les gardes de vendredi et de semaine. Un verrou posé à l'avance sur un mois futur compte désormais comme une garde déjà faite pour le médecin concerné, quel que soit l'ordre dans lequel les mois sont générés — décembre peut même être généré avant septembre sans que le calcul se dérègle.
FixLe repos obligatoire après une garde à cheval sur deux mois ne fonctionnait que dans un sens : générer un mois vérifiait bien le dernier jour du mois précédent, mais pas le premier jour du mois suivant s'il avait déjà été généré. Un médecin de garde le 1er décembre pouvait ainsi se retrouver aussi de garde le 30 novembre si novembre était généré après décembre. Le repos de bord fonctionne désormais dans les deux sens.
v8.91.022/07/2026
FixLe rattrapage d'équité par quadrimestre (Libourne, 8.84.0) restait aveugle aux deux mois du milieu du quadrimestre : générer octobre juste après septembre — même sans avoir validé septembre — ne tenait compte d'aucune garde déjà posée, et pareil pour novembre. Tout l'écart accumulé retombait d'un coup sur le dernier mois du quadrimestre. En cause : le calcul exigeait 3 mois d'historique avant de faire confiance au signal (pertinent pour Rochefort, qui compare sur l'année civile), un seuil recopié tel quel pour le quadrimestre alors qu'un quadrimestre ne compte que 4 mois. Dès qu'un seul mois précédent existe dans le quadrimestre en cours, il est maintenant pris en compte. Rochefort (rattrapage annuel) est inchangé.
v8.90.022/07/2026
MoteurPour les médecins de Libourne partagés avec le CHU (Johan Mazzarino, Chloé Perrot, Margaux Moreaux), le moteur n'affecte plus de garde la veille d'un jour au CHU — la garde se termine trop tard pour permettre le départ le lendemain matin. Ça s'applique aussi bien aux dates fixes saisies en désidérata (Johan, Chloé Perrot) qu'au CHU de Margaux, que le moteur place lui-même sur ses mardis/mercredis disponibles. Empreinte Rochefort et autres services inchangée.
AméliorationDans l'éditeur de planning, un avertissement signale désormais si une garde est posée manuellement la veille d'un jour au CHU — comme c'était déjà le cas pour une formation.
FixLa recherche de solutions alternatives quand un planning ne se génère pas reconstruisait certains réglages du service à la main et en oubliait une partie en cours de route — désormais elle reprend fidèlement tous les réglages du mois d'origine.
v8.89.022/07/2026
MoteurMaternité et urgences peuvent désormais être divisées en demi-journées (matin/après-midi), chacune tenue par un médecin différent si besoin — jusqu'ici un poste ne pouvait être tenu que par une seule personne toute la journée. Par défaut, un même médecin continue de tenir les deux moitiés (rien ne change au quotidien) ; le moteur ne sépare que lorsqu'une indisponibilité demi-journée (désidérata matin/après-midi) ou un verrou admin l'exige. Le calcul d'équité des postes compte désormais chaque demi-journée pour sa juste valeur (une moitié = un demi-crédit, pas une journée complète).
NouveauUn médecin externe peut désormais être positionné sur des dates précises via un verrou admin, sans jamais entrer en concurrence avec l'équipe le reste du temps (ex. Jean-René Nelson à Libourne, qui vient occasionnellement le matin en maternité). Le sélecteur de créneau dans l'écran des verrous admin fonctionne maintenant pour tous les postes divisibles, pas seulement la garde.
FixLa préférence « je souhaite une consultation » posée sur une seule demi-journée ne décourage plus l'affectation de l'autre moitié de la journée — jusqu'ici elle décourageait la journée entière même si seule la matinée (ou l'après-midi) était concernée.
v8.88.022/07/2026
AméliorationObjectifs de gardes par catégorie (Libourne) : la saisie gagne un sélecteur de quadrimestre. Jusqu'ici l'écran était figé sur le quadrimestre du jour (Q2 mai-août), alors que les objectifs saisis concernent souvent un quadrimestre à venir (Q3 septembre-décembre) — on ne voyait donc rien et on ne pouvait pas les modifier. On peut désormais choisir le quadrimestre (celui en cours, les suivants, et tous ceux déjà renseignés) ; l'écran s'ouvre directement sur un quadrimestre où le médecin a déjà des objectifs. Les besoins peuvent ainsi différer d'un quadrimestre à l'autre (quotité, arrêts, missions).
AméliorationLe champ « Objectifs de gardes » affiche maintenant, comme les autres réglages, son badge « Préférence » avec le repère de la règle au survol — pour se retrouver entre règles strictes et préférences.
MoteurQuand un médecin a des objectifs de gardes par catégorie sur le quadrimestre généré, ceux-ci priment désormais sur sa cible mensuelle globale de gardes : le moteur ne cherche plus à satisfaire les deux à la fois (ce qui pouvait les faire se contredire). Sans objectif par catégorie, la cible mensuelle globale s'applique comme avant. Aucun effet sur Rochefort (empreinte de non-régression verte).
v8.87.022/07/2026
NouveauLes 2 dernières abréviations médecin de Libourne sont posées (17 sur 18 désormais, le 18e étant le compte admin partagé) : Chloé Perrot et Sarah Talbourdel affichent maintenant l'initiale reprise de leurs documents de service plutôt que la convention générée par l'app. Rochefort et les autres services inchangés.
v8.86.022/07/2026
FixSur la page Équipe (réglages), enregistrer une modification pour un médecin (par exemple sa cible de garde) pouvait, dans certains cas, effacer silencieusement des informations d'autres médecins pourtant non touchés par la modification : jours de RTT reportés de l'année précédente, préférences de notification. Corrigé : ces informations sont désormais toujours conservées lors de l'enregistrement, avec une double sécurité côté serveur pour empêcher qu'un enregistrement écrase autre chose que ce qui a réellement changé.
v8.85.022/07/2026
Nouveau5 abréviations médecin supplémentaires reprises des documents de Libourne (15 sur 18 au total désormais). Au passage, le nom affiché d'un médecin a été corrigé — une coquille dans la démo l'affichait comme « Clémence Bertolani » au lieu de son vrai nom, « Clémence Bartognali ». 2 médecins restent en attente de confirmation. Rochefort et les autres services inchangés.
v8.84.022/07/2026
MoteurNouveau modèle d'équité des gardes pour Libourne : le moteur peut désormais viser, pour chaque médecin, un nombre de gardes cible par catégorie — week-end, vendredi, semaine — sur le quadrimestre, au lieu de chercher à niveler tout le monde à l'identique. Les temps pleins portent volontairement plus de gardes que les petites quotités, conformément à la répartition réelle du service (les cibles sont saisies par l'admin, service par service). Sans effet tant que ce modèle n'est pas activé pour un service : Rochefort est totalement inchangé (empreinte de non-régression verte).
MoteurLe rattrapage d'équité d'un mois sur l'autre (qui a fait le plus de gardes récemment porte moins le mois suivant) peut désormais se calculer sur le quadrimestre en cours plutôt que sur l'année civile, pour les services qui le demandent (Libourne). Cela colle au raisonnement « par quadrimestre » du service et évite qu'un déséquilibre du début d'année pèse encore en fin d'année. Rochefort reste sur l'année civile, à l'identique.
v8.83.022/07/2026
NouveauNouveau champ d'affichage optionnel pour les initiales d'un médecin, distinct de son identifiant interne — un service peut désormais afficher les abréviations qu'il utilise déjà dans ses propres documents (planning grille, légende, impression, vue publique, exports CSV/Excel) plutôt que la convention générée par l'app. Sans effet si le champ n'est pas renseigné : Rochefort et les autres services sont inchangés. Activé pour 10 médecins sur 18 à Libourne (les abréviations reprises telles quelles depuis leurs documents de service) ; les 8 restants attendent une confirmation de correspondance nom/abréviation avant d'être posés à leur tour.
v8.82.022/07/2026
FixLe résumé quotidien par email des consultations (envoyé automatiquement une fois par jour) échouait parfois en silence pour un médecin sans que personne ne le sache — l'erreur restait uniquement dans les journaux techniques du serveur. Elle remonte désormais aussi à notre outil de suivi des incidents (Sentry), pour être vue et corrigée rapidement.
v8.81.021/07/2026
AméliorationDans « Vue admin » (Mon suivi, services au forfait horaire), les deux tableaux « Heures par semaine » et « Répartition des gardes » sont désormais présentés de la même façon : deux cartes de même importance, au lieu d'un grand titre pour les heures et un petit pour les gardes. Un titre « Vue admin » chapeaute le tout, avec deux raccourcis (« Heures par semaine », « Répartition des gardes ») — sur mobile comme sur desktop — pour sauter directement à l'un ou l'autre et bien voir qu'il y a deux blocs importants à cet endroit.
v8.80.021/07/2026
FixSur Mon suivi (Libourne), un mois dont le planning a été importé directement comme validé (sans passer par une génération du moteur — par exemple mai et juin 2026) apparaissait dans le sélecteur de mois mais s'affichait « aucune donnée » dans la vue des heures. En cause : la vue lisait la proposition brute du moteur d'abord et abandonnait quand elle était absente, sans regarder le planning validé. Elle lit désormais la même source que le reste de l'app (planning validé prioritaire, sinon proposition du moteur), donc ces mois s'affichent correctement — côté médecin comme côté admin.
AméliorationDans « Vue admin », le tableau « Heures par semaine — équipe » s'adapte à la granularité choisie : en vue Mois, une colonne par semaine ; en vue Quadrimestre, une colonne par mois du quadrimestre ; en vue Année, une colonne par quadrimestre. Une colonne « Total » est toujours affichée à droite, donnant le cumul d'heures de chaque médecin sur la période sélectionnée (le mois, le quadrimestre ou l'année). Plus lisible qu'une longue liste de semaines sur les grandes périodes.
v8.79.021/07/2026
FixLa page de démo publique (/demo/pediatrie) plantait après génération d'un planning : dès qu'un médecin était affecté à un poste, l'écran de résultat et le détail d'une journée restaient bloqués sur une erreur technique au lieu d'afficher les initiales du médecin. En cause, un décalage de format entre ce que renvoie le moteur (une liste d'affectations par poste) et ce que la page de démo attendait (un simple identifiant texte) — la démo n'avait pas été mise à jour lors d'une évolution antérieure du moteur. Le calcul de répartition des gardes affichait aussi toujours 0 garde par médecin pour la même raison. Corrigé sur les trois écrans concernés (grille de résultat, détail d'une journée, répartition des gardes) ; vérifié en local avec le vrai moteur de calcul.
v8.78.021/07/2026
AméliorationDans « Vue admin » (Mon suivi), le tableau « Heures par semaine — équipe » a désormais le même sélecteur Mois / Quadrimestre / Année que le tableau des gardes juste en dessous — jusqu'ici il était figé sur le mois en cours. On peut donc consulter les heures de chaque médecin sur le mois choisi, sur un quadrimestre entier (Q1 janvier-avril, Q2 mai-août, Q3 septembre-décembre) ou sur toute l'année, la plage exacte étant rappelée sous le sélecteur.
v8.77.021/07/2026
FixL'outil de suggestion de correctifs — celui qui propose des ajustements quand une génération est impossible — utilise désormais la configuration réelle du service concerné, lue en base comme le fait la génération : ses postes obligatoires, ses gardes de jour et de nuit du week-end, sa façon de compter les réveillons, son mode de regroupement des week-ends et sa durée de calcul. Auparavant, il partait toujours de la configuration de Rochefort, même pour un autre service : à Libourne, les correctifs proposés étaient donc calculés sur les postes et les gardes de Rochefort plutôt que sur les siens. C'est un chemin de diagnostic secondaire — il n'enregistre rien, il se contente d'afficher des suggestions à l'écran — mais il souffrait de la même incohérence de source que la génération, maintenant corrigée. Aucun effet sur Rochefort, dont la configuration en base est identique à celle utilisée jusqu'ici (empreinte de non-régression verte).
v8.76.021/07/2026
FixSur les services au forfait horaire (Libourne), la vue « Heures par semaine » affichait par erreur une cible de 65 h/semaine au lieu du quota contractuel de 48 h. Explication : le moteur utilise en interne un plafond hebdomadaire plus élevé (65 h) pour pouvoir construire une semaine de soins complète de 5 jours sans la pénaliser — le contrat, lui, est de 48 h (en moyenne sur le quadrimestre). L'affichage reprenait ce chiffre technique du moteur. La cible montrée aux médecins et aux admins est désormais bien 48 h × quotité, indépendamment du réglage interne du moteur. Une semaine de soins qui dépasse 48 h apparaît « au-delà de la cible » en orange — un simple repère souple, ni bloquant ni fautif, la moyenne se faisant sur le quadrimestre.
v8.75.021/07/2026
AméliorationSur les services au forfait horaire (Libourne), la vue « Heures par semaine » compte désormais les consultations, HDJ et demi-journées de bureau que les médecins déclarent eux-mêmes — jusqu'ici seuls les postes, gardes et jours de formation planifiés étaient comptés, si bien qu'une semaine surtout consacrée aux consultations paraissait bien plus courte qu'elle ne l'était. Chaque demi-journée déclarée compte 5 heures (la journée clinique valant 10 h). Les absences (congés, récup, arrêt) et l'activité dans un autre établissement ne comptent pas. Le total colle donc davantage au « 48 h toutes heures confondues » du contrat. Vue médecin et vue équipe alignées.
v8.74.021/07/2026
AméliorationSur Mon suivi, la vue « Heures par semaine » d'un médecin (services au forfait horaire, à Libourne) permet désormais de choisir le mois affiché — jusqu'ici elle était figée sur le mois en cours. Un sélecteur de mois apparaît à côté du titre (les mois déjà générés + le mois courant) ; le comparatif « heures réalisées vs attendues » se recalcule pour le mois choisi.
v8.73.021/07/2026
FixL'outil de suggestion de correctifs — celui qui propose des ajustements quand une génération est impossible — s'appuie désormais sur le même historique validé que la génération elle-même. Auparavant, pour évaluer le repos après une garde en toute fin du mois précédent et l'équilibre des gardes sur l'année, il ne lisait que la dernière proposition brute du moteur, sans tenir compte des corrections manuelles validées du planning. Une garde d'un mois passé rectifiée à la main pouvait donc être ignorée par ses suggestions. Il reprend maintenant, en priorité, le planning validé — exactement comme le fait la génération — et compte correctement les gardes des services qui séparent la garde de jour et la garde de nuit (Libourne). Aucun effet sur Rochefort : comportement identique, empreinte de non-régression verte. C'est un chemin de diagnostic secondaire, moins critique que la génération, mais qui souffrait de la même incohérence de source.
v8.72.021/07/2026
FixCorrection d'un décalage de source dans la génération de planning. Pour bien enchaîner avec le mois précédent (repos garanti en début de mois quand un médecin était de garde le tout dernier jour du mois d'avant, et bon espacement des gardes d'un mois à l'autre), la génération lit désormais l'historique RÉELLEMENT VALIDÉ du mois précédent. Auparavant elle s'appuyait sur la dernière proposition brute du moteur, qui pouvait être périmée si le planning avait été corrigé à la main puis validé depuis. Conséquence concrète, constatée à Libourne : une correction manuelle de la dernière semaine du mois — par exemple un changement de médecin de garde le dernier jour — n'était pas prise en compte à la régénération du mois suivant sans intervention technique. C'est désormais automatique : la génération du mois suivant, le gel des jours déjà passés et le rattrapage d'équité annuelle s'appuient tous sur la même source de vérité (le planning validé prime sur la proposition brute du moteur). Sans effet sur Rochefort : plannings strictement identiques, empreinte de non-régression verte.
v8.71.021/07/2026
NouveauSur l'onglet « Vue admin » de Mon suivi, le tableau des gardes se consulte désormais au mois, au quadrimestre ou sur l'année — comme le tableau du temps de travail juste au-dessus — pour comparer la répartition des gardes entre médecins sur la période voulue. L'année reste l'affichage par défaut, donc les chiffres au repos sont identiques à avant. Pour les services qui comptent le week-end d'un seul bloc (samedi + dimanche + jours fériés réunis, à Libourne), le tableau affiche une unique colonne « Week-end » au lieu du détail samedi / dimanche+fériés, au plus près de la façon dont l'équité y est mesurée. Les services qui distinguent samedi et dimanche+fériés (Rochefort) gardent le détail, inchangés.
AméliorationSur les services au forfait horaire (heures par semaine, à Libourne), la vue « Heures par semaine » précise désormais que le total compte les postes, les gardes et la formation, mais pas les consultations, les HDJ ni les jours off ou de récup déclarés : une semaine surtout consacrée aux consultations peut donc y paraître plus courte que la réalité. C'est un repère indicatif, pas un décompte officiel du temps de travail. Le comparatif reste « heures réalisées vs heures attendues » par semaine.
v8.70.021/07/2026
MoteurNouvelle règle de récupération pour les services qui la demandent (Libourne) : un médecin de garde le week-end (samedi ou dimanche, garde de jour comme de nuit) garde son lundi suivant libre — ni poste, ni garde. C'est une préférence forte mais souple : dans un mois tendu, le moteur peut céder plutôt que de laisser un poste obligatoire découvert. Elle vient en plus du repos automatique après une garde de nuit : elle couvre aussi la garde de jour du week-end et la garde du samedi, dont le lundi n'était protégé par aucune règle. Désactivée par défaut partout ailleurs : aucun effet sur Rochefort ni sur les autres services (plannings strictement identiques, empreinte de non-régression verte).
v8.69.021/07/2026
MoteurÀ Libourne, les gardes de nuit du 24 et du 31 décembre (les réveillons) sont désormais comptées comme des gardes de week-end, et non plus comme des vendredis — à la fois dans l'équité de répartition du moteur et dans le tableau de suivi du nombre de gardes. Seuls ces deux soirs sont concernés (par date, quel que soit le jour de la semaine où ils tombent) ; les autres veilles de fériés restent inchangées. Les gardes de réveillon déjà réalisées les années précédentes basculent aussi côté week-end dans le rattrapage annuel, pour que la répartition reste juste dans le temps. Aucun effet sur Rochefort ni sur les autres services : le comportement n'est activé que pour Libourne, plannings strictement identiques ailleurs (empreinte de non-régression verte).
v8.68.021/07/2026
FixSur la page « Le moteur » (admin), la règle « Max 5 jours / semaine » portait un libellé trompeur : il laissait croire à une limite par semaine calendaire (du lundi au dimanche) et à 5 jours strictement d'affilée. En réalité le moteur pénalise le fait de travailler plus de 5 jours sur toute période de 7 jours consécutifs — le décompte glisse au fil des jours — et un jour où un médecin cumule un poste et une garde compte pour un seul jour de travail. La règle a été renommée « Max 5 jours travaillés sur 7 » et sa description clarifiée en conséquence. Aucun changement de comportement du moteur ni de poids : uniquement l'affichage.
v8.67.021/07/2026
FixSur les services où une garde de nuit de 12 h compte pour une garde entière (Libourne), le « Récapitulatif par médecin » la comptait par erreur pour une demi-garde (0,5) : un week-end affichait le médecin de nuit à 0,5 et celui de jour à 1. Corrigé — chaque garde est désormais comptée selon le poids réel défini pour le service : une garde de nuit pleine compte 1, et sur un même week-end le médecin de jour comme le médecin de nuit comptent chacun 1. Rochefort est strictement inchangé : une garde de 24 h scindée manuellement en deux (jour puis nuit) continue de compter 0,5 par médecin. La même correction s'applique aux nombres affichés pendant l'édition d'un planning (aperçu d'impact : équité des gardes et volume de gardes).
v8.66.021/07/2026
MoteurÀ Libourne, la génération d'un planning ne calcule plus de scénario « alternatif » en plus du planning principal. Ce service demande un temps de calcul plus long (secteurs de soins suivis toute la semaine) ; ajouter un second scénario faisait dépasser la durée maximale autorisée pour une génération et la faisait échouer. Le moteur produit maintenant un seul planning, dans le temps imparti. Le nombre de scénarios reste réglable par service : les autres services (Rochefort…) continuent d'en proposer un alternatif, inchangés.
v8.65.021/07/2026
MoteurSur un service qui interdit les gardes de 24 heures (un même médecin sur un poste de journée puis la garde de nuit — à Libourne), le moteur ne les fabrique plus jamais de lui-même. Une garde de 24 heures reste possible, mais uniquement de façon exceptionnelle et manuelle : l'admin la force en posant deux verrous le même jour sur le même médecin — le poste de journée ET la garde. Jusqu'ici ce double verrou rendait la génération impossible (le moteur refusait de combiner poste et garde) ; il est désormais accepté comme un choix délibéré de l'admin, sur n'importe quel poste. Sans double verrou, aucune garde de 24 heures n'est créée automatiquement. Un jour déjà passé où une garde de 24 heures avait été faite est également préservé lors d'une régénération. Aucun effet sur Rochefort (garde de 24 h classique) : plannings strictement identiques, empreinte de non-régression verte.
v8.64.021/07/2026
MoteurLa continuité des soins atteint désormais la semaine entière pour les services qui suivent leurs patients par secteur (Libourne : pédiatrie et néonatologie). Jusqu'ici les blocs plafonnaient à 4 jours : plusieurs règles héritées d'un service à rotation courte se cumulaient contre une semaine de soins complète. Le moteur ne compte plus une semaine de soins comme une semaine « sans jour de repos » (à Libourne, tenir un secteur du lundi au vendredi est la norme, pas une surcharge) ; le plafond d'heures hebdomadaire a été relevé pour ce service afin qu'une semaine de soins complète n'y soit plus pénalisée (la moyenne réelle se calcule sur le quadrimestre) ; et l'équité de répartition des secteurs se mesure maintenant en semaines et non en jours, si bien qu'égaliser la charge ne coupe plus un séjour au milieu. Résultat mesuré sur septembre : chaque semaine pleine est tenue par un seul médecin du lundi au vendredi, zéro journée isolée, la structure des week-ends est préservée. Aucun effet sur les services à rotation courte comme Rochefort : plannings strictement identiques (empreinte de non-régression verte).
v8.63.021/07/2026
AméliorationSur la page « Le moteur » (admin), l'indication « qui est concerné » sous chaque règle est plus légère et plus lisible : au lieu d'une rangée de petites étiquettes d'initiales (CA, SB…), une simple phrase en français — par exemple « Concerne surtout les médecins à temps partiel » ou « Concerne les médecins spécialistes ». Elle n'apparaît que si des médecins du service sont réellement concernés ; les règles générales n'affichent rien. Pour les protections pilotées par le profil (liste compacte), l'info passe dans la bulle d'aide de la règle.
FixToujours sur « Le moteur », quatre descriptions de règles décrivaient un fonctionnement propre à Rochefort, faux ou trompeur sur un autre service. Corrigé et rendu neutre : les équités « samedi » / « dimanche+fériés » précisent maintenant que, selon le service, le week-end peut être compté d'un bloc (samedi+dimanche+fériés ensemble, jour et nuit confondus) plutôt que séparément ; « Équité gardes vendredi » ne parle plus de « moitié d'un samedi » ; « Espacement des gardes » précise que la pénalité porte sur toutes les gardes du médecin, de jour comme de nuit, sans distinction ; et « Continuité des postes » ne fige plus « 2-3 jours » mais indique que la longueur idéale dépend du service (jusqu'à la semaine entière). Aucun changement de comportement du moteur.
v8.62.021/07/2026
FixSur la page « Le moteur » (admin), les descriptions des règles ne mentionnent plus des éléments propres à Rochefort quand on les consulte depuis un autre service (Libourne). Plusieurs règles affichaient en dur des initiales de médecins de Rochefort (dans « Garde veille jour off », « 1 jour libre / semaine », « Postes autorisés »), des poids internes du moteur ou des chiffres de politique Rochefort (« 4 jours/mois de consultation », « poids 35 », etc.). Ces textes sont désormais génériques et valables pour n'importe quel service. Aucun changement de comportement du moteur — uniquement l'affichage.
FixToujours sur « Le moteur », la carte « Gardes WE par mois » ne s'affiche plus à Libourne : elle contenait un réglage « Max 1 garde WE/mois » qui n'a pas cours à Libourne (garde de week-end à plusieurs rôles) et que le moteur ignorait déjà. La règle « Min 1 garde WE/mois », elle, reste visible. Rochefort n'est pas concerné : la carte s'y affiche toujours, correctement.
AméliorationLe libellé de la règle « Continuité des postes » ne cite plus de noms de postes ni de poids propres à Rochefort : il renvoie au niveau de continuité réglé poste par poste dans la configuration du service.
FixSur « Le moteur », les pastilles de médecins sous une règle collent maintenant exactement à ce que fait le moteur. Deux règles étaient concernées : « Préférences de jours » n'affichait pas un médecin dont le seul jour de garde préféré est renseigné (sans liste) — il apparaît désormais ; et « Garde veille jour off » aurait pu afficher un médecin qui ne fait pas de gardes — il en est désormais exclu. Sans effet sur le planning généré.
v8.61.021/07/2026
MoteurContinuité des soins renforcée pour les services qui suivent leurs patients par secteur toute la semaine (Libourne : pédiatrie et néonatologie). Le moteur regroupe désormais les journées d'un même secteur en blocs les plus longs possibles — souvent la semaine entière — au lieu de changer de médecin d'un jour à l'autre, puis laisse la rotation se faire la semaine suivante. Il évite surtout les journées de soins isolées : un seul jour sur un secteur, entouré de journées sans. Les blocs s'ajustent d'eux-mêmes aux semaines courtes (fériés) et aux médecins à temps partiel, sans imposer de longueur fixe. Réglable dans les paramètres du moteur (« Continuité des soins sur la semaine »). Aucun effet sur les services à rotation courte comme Rochefort : plannings strictement identiques (empreinte de non-régression verte).
v8.60.021/07/2026
FixSur la page « Le moteur » (admin), la section « Règles inactives » affiche désormais aussi les règles retirées dans la configuration de base d'un service — jusqu'ici, seules celles retirées à la main via le bouton « Retirer » y apparaissaient. À Libourne, deux règles retirées d'origine restaient invisibles dans cette section, et le moteur continuait à les appliquer malgré leur retrait. Elles sont maintenant listées (et réactivables d'un clic) et réellement ignorées par le moteur lors de la génération. Sans effet sur Rochefort, qui ne retire aucune règle de cette manière — plannings identiques.
v8.59.020/07/2026
NouveauSur un service dont la garde de week-end se sépare en garde de jour et garde de nuit (Libourne), un verrou admin peut maintenant figer les DEUX gardes d'un même jour — la garde de nuit tenue par un médecin ET la garde de jour du week-end tenue par un autre. Jusqu'ici, un seul verrou de garde par date était possible : impossible de figer un week-end de fêtes où deux personnes couvrent la même journée. L'écran de verrouillage propose désormais un choix « Garde : de nuit / de jour (week-end) » quand le service a plusieurs gardes ; retirer l'une n'efface plus l'autre. Aucun changement pour les services à garde unique de 24 h (Rochefort) : pas de choix de garde, et les plannings restent identiques (moteur inchangé, empreinte de non-régression verte).
AméliorationL'écran de verrouillage admin (date, poste, garde) utilise maintenant les composants de la bibliothèque (menus, champs et boutons unifiés) au lieu de contrôles bruts, pour une apparence cohérente avec le reste de l'app.
MoteurUn verrou admin de garde est désormais toujours honoré, même si le profil du médecin refuserait la garde ce mois-là — par exemple un médecin qui commence les gardes en milieu de mois (le moteur lisait « pas de garde » pour tout le mois) ou dont la liste de gardes autorisées exclut ce créneau. Le verrou de l'admin fait foi (comme il prime déjà sur les indisponibilités et les postes autorisés). Sans effet sur Rochefort (empreinte de non-régression verte).
v8.58.020/07/2026
FixLe tableau du planning n'affiche plus « À pourvoir » sur les cases vides des sites optionnels (à Libourne : Blaye et le CHU), qui n'ont pas vocation à être couverts tous les jours. Une case vide y est normale et n'est plus signalée comme un trou à combler — leur rythme reste suivi à la semaine. Les quatre postes obligatoires (urgences, maternité, pédiatrie, néonatologie) continuent bien d'afficher « À pourvoir » quand ils sont vides. Le panneau de détail d'un jour se comportait déjà correctement ; seule la grille principale était concernée.
v8.57.020/07/2026
AméliorationTableau du planning plus lisible : les colonnes peuvent porter un surnom court à la place du nom complet, plus adapté à la largeur d'une colonne (à Libourne : « Urgences » au lieu de « Urgences pédiatriques », « Mater/Bip », « Pédia », « Néonat », « Blaye »). Le nom complet reste affiché au survol de l'en-tête et dans la légende mobile. Chaque service choisit ses surnoms ; ceux qui n'en définissent pas (Rochefort) gardent leurs libellés inchangés.
v8.56.020/07/2026
FixCorrection d'un défaut d'affichage du planning : sur certains mois, le dernier jour pouvait apparaître deux fois (une ligne fantôme vide en plus de la vraie), ce qui remontait aussi ce jour en tête de la grille et le comptait en double dans le suivi des gardes. Le planning garantit désormais une seule ligne par date, en ordre chronologique, à chaque chargement — quel que soit l'état des données enregistrées. La vraie journée (avec ses affectations) est conservée, la ligne fantôme est écartée. Sans effet sur les plannings déjà corrects.
v8.55.020/07/2026
FixSur un service dont la garde de week-end est déjà séparée en garde de jour et garde de nuit (Libourne), modifier le médecin d'une de ces gardes depuis le détail du jour ne dénature plus l'autre. Avant, le premier « Changer » écrasait la garde de jour du week-end par une garde de jour générique (horaires et périmètre du week-end perdus) et pouvait remplacer le médecin de la garde de nuit ; désormais chaque garde conserve son type et son médecin. En semaine, où il n'y a qu'une garde de nuit, la modifier réaffecte simplement cette garde au lieu de créer une garde de jour fantôme. Le bouton « Réunifier la garde 24 h » n'apparaît plus sur ces services (ils n'ont pas de garde de 24 h à reformer). Rien ne change pour Rochefort et les services à garde unique de 24 h, où « Scinder » / « Réunifier » fonctionnent comme avant.
v8.54.020/07/2026
FixVue planning — garde de week-end séparée jour / nuit (Libourne) : la garde de jour s'affiche avec un soleil et la garde de nuit avec une lune, la même iconographie pour les deux, au lieu d'un mélange lettre / icône peu clair où la garde de jour apparaissait à tort avec une lune. Sur mobile, le médecin de garde de jour, qui pouvait être masqué, apparaît désormais aux côtés du médecin de garde de nuit.
FixDétail du jour (Libourne) : le panneau ne répète plus jamais le même médecin sur deux créneaux. Le week-end, il montre les DEUX médecins de garde — le bon en journée, le bon la nuit — avec leurs horaires réels (8h30-18h30 pour le jour, 18h-9h pour la nuit). En semaine, où il n'y a qu'une garde de nuit, il n'affiche plus qu'une seule ligne au lieu de dupliquer le médecin en jour et en nuit.
AméliorationCohérence de l'ordre jour / nuit : partout où une garde de week-end s'affiche empilée (grille, liste mobile, planning public), la garde de JOUR est désormais placée au-dessus de la garde de nuit, dans le même ordre que le panneau de détail.
v8.53.020/07/2026
AméliorationLes désidérata liés à la garde sont regroupés dans une section « Garde » dédiée, avec trois statuts clairs et parallèles : « Je veux la garde », « Plutôt pas de garde » (souple) et « Pas de garde » (ferme). L'ancien « Dispo journée seule » devient « Pas de garde » — un nom qui parle de la garde, pas de la journée. Et sur les week-ends où la garde se sépare en jour et nuit, un seul réglage commun aux trois : « Garde concernée : Toute la garde / De jour / De nuit », au lieu de libellés qui variaient d'un statut à l'autre. Plus lisible, sans aucun changement de comportement du moteur.
v8.52.020/07/2026
NouveauNouveau statut de désidérata « Plutôt pas de garde » : un médecin peut indiquer qu'il préfère ne pas être de garde un jour donné, sans l'interdire. Le moteur l'évite si possible, mais peut quand même lui confier la garde si le planning en a besoin ; le médecin reste disponible pour un poste en journée. C'est la version souple de « Dispo journée seule », qui, elle, interdit fermement la garde.
NouveauSur un service dont la garde de week-end se sépare en garde de jour et garde de nuit (Libourne), les deux statuts liés à la garde — « Plutôt pas de garde » et « Dispo journée seule » — proposent maintenant un choix Jour / Nuit / Toutes. On peut ainsi exprimer « pas la garde de nuit, mais la garde de jour du week-end reste possible ». Rien ne change pour les services à garde unique de 24 h (Rochefort) : aucun choix jour/nuit n'apparaît et les plannings restent identiques.
v8.51.020/07/2026
MoteurSur un service dont la garde de week-end se divise en garde de jour et garde de nuit (Libourne), le moteur regroupe maintenant la garde de JOUR du samedi et celle du dimanche sur la même personne — comme il le fait déjà pour les gardes de nuit du vendredi et du dimanche. C'est ce que montre le planning réel de Libourne (la garde de jour du week-end tient sur une seule personne). C'est une préférence forte mais non absolue : le moteur ne sacrifie jamais la répartition équitable des gardes pour l'obtenir. Aucun effet sur les services à garde unique de 24h (Rochefort).
MoteurLibourne : la récupération après garde est adaptée à la garde séparée jour/nuit. Le repos du lendemain d'une garde de NUIT est conservé (le médecin ne travaille pas). En revanche, la garde de JOUR du week-end ne traîne plus la règle de récupération héritée d'un service à garde unique de 24h (1 jour après une garde du vendredi, 2 après le samedi, 1 après le dimanche), qui n'a pas de sens avec leur organisation. Aucun effet sur Rochefort et les autres services, qui conservent cette récupération.
v8.50.019/07/2026
NouveauSur la page Moteur, on peut maintenant retirer entièrement une règle souple, au lieu de bricoler un poids proche de zéro qui laissait croire la règle éteinte alors qu'elle tournait toujours. Un bouton « Retirer » (toujours visible, y compris sur mobile) bascule la règle dans un nouveau segment « Règles inactives », replié en bas de la page et masqué tant qu'il est vide. Une règle inactive est alors vraiment ignorée par le moteur et clairement signalée comme telle (badge « inactive », plus de jauge). Un clic sur « Réactiver » la remet en service avec son réglage d'origine intact. Chaque service gère ses propres règles inactives, et l'aperçu avant enregistrement liste les règles retirées ou réactivées. Rochefort et les autres services ne retirent rien par défaut : plannings identiques.
v8.49.019/07/2026
MoteurLibourne : le moteur n'empêche plus de garder le même médecin toute la semaine sur son secteur (pédiatrie ou néonatologie). En confrontant le planning réel de l'équipe, on a vu que la continuité y va jusqu'à la semaine entière (5 jours), alors qu'un garde-fou hérité d'un autre service décourageait les blocs de 4 jours et plus. Ce garde-fou est désormais retiré pour Libourne : le moteur peut suivre leur pratique — un médecin par secteur pour la semaine, puis rotation la semaine suivante (celle-ci reste inchangée). Aucun impact sur les autres services (Rochefort et démos), qui gardent ce réglage.
v8.48.019/07/2026
NouveauSur un service dont la garde de week-end se divise en garde de jour et garde de nuit (comme Libourne), un médecin peut maintenant préciser dans ses désidérata s'il préfère la garde de jour ou de nuit. Quand on sélectionne « Je veux être de garde », un choix « N'importe / Jour / Nuit » apparaît. C'est un souhait pris en compte par le moteur, pas une obligation : le médecin peut quand même recevoir l'autre garde si le planning l'exige. Un repère « J » ou « N » apparaît sur le jour concerné, dans le calendrier et la vue d'ensemble admin. Rien ne change pour les services dont la garde est une seule tranche de 24h (Rochefort) : aucun choix jour/nuit n'apparaît et les plannings restent identiques.
v8.47.019/07/2026
MoteurCorrection de l'« Équité de répartition des postes » (Libourne) : un médecin qui ne fait que des gardes (jamais de poste de journée) n'est plus compté dans le calcul de la part de chacun. Avant, sa part « manquante » était reportée à tort sur les autres, ce qui décalait légèrement l'équilibrage des postes entre les médecins. Sans effet sur les services qui n'utilisent pas ce réglage.
AméliorationRéglages du moteur : retrait du curseur « Volume gardes réduit », qui n'avait aucun effet réel. Le volume de gardes réduit d'un médecin est déjà piloté par sa cible de gardes mensuelles — le curseur donnait une fausse impression de contrôle. Un réglage trompeur en moins.
v8.46.019/07/2026
AméliorationUn jour où le matin et l'après-midi portent deux états différents (par exemple disponible le matin, « ça ne m'arrange pas » l'après-midi) s'affiche enfin clairement : la case est scindée en deux moitiés colorées — matin à gauche, après-midi à droite — au lieu de ne montrer que l'état du matin en faisant disparaître l'après-midi. Vaut pour le calendrier de chaque médecin (moitiés colorées avec leur symbole, numéro du jour toujours lisible) et pour la vue d'ensemble de l'admin (deux moitiés colorées avec un trait de séparation ; le survol d'une case donne le détail matin et après-midi). Une légende « Deux demi-journées » a été ajoutée. Les journées entières et les services sans demi-journées (Rochefort) ne changent pas d'aspect.
v8.45.019/07/2026
FixSur un service autre que Rochefort (démo Libourne, gynéco…), les boutons de la page Désidérata renvoyaient au mauvais service. Depuis la liste des mois, « Renseigner mes désidérata », « Modifier », « Mes désidérata » et « Voir le planning » basculaient systématiquement vers Rochefort au lieu de rester sur le service consulté. Ces liens restent désormais sur le bon service. Rochefort n'est pas concerné.
v8.44.019/07/2026
MoteurNouveau réglage de service « passage hebdomadaire garanti » pour un site optionnel (comme la maternité de Blaye à Libourne), désactivé par défaut. Jusqu'ici le moteur visait 1 à 2 passages par semaine sans jamais l'imposer : une semaine sans passage restait possible. Quand ce réglage est activé, le 1er passage de la semaine devient obligatoire — le moteur garantit au moins un passage chaque semaine, tout en gardant le 2e passage souple et sans jamais faire dépasser le plafond d'heures. Si une semaine est réellement impossible à couvrir (tous les médecins déjà pris par les postes obligatoires), la génération le signale clairement en nommant le site concerné et propose de générer « avec les postes manquants » pour cette semaine-là. Tant que le réglage n'est pas activé — Rochefort et les autres services n'ont pas de site optionnel — rien ne change : plannings identiques.
v8.43.018/07/2026
MoteurLe quota CHU de Margaux (Libourne) est désormais placé automatiquement par le moteur, comme un poste. Margaux doit faire environ 5 jours par mois au CHU, les mardi et mercredi ; jusqu'ici ces jours se saisissaient à la main. Le moteur les place maintenant lui-même, là où ça gêne le moins le planning, en visant ~5/mois (souple : 4 ou 6 selon les mois, jamais 0). Ces jours sont réservés à Margaux, n'ajoutent aucune heure au plafond hebdomadaire (activité externe au CHU) et excluent toute garde le même jour. Comme c'est un poste à part entière, il apparaît dans le planning, se gèle et s'échange comme les autres. Aucun impact sur les autres services.
v8.42.018/07/2026
MoteurNouveau réglage « Équité de répartition des postes », désactivé par défaut. À la demande de Libourne : sur la durée, chaque médecin fait à peu près la même part de chaque poste de journée (urgences, maternité, pédiatrie…) que ses collègues, au prorata de sa quotité — un 100 % en fait plus qu'un 60 %. Le moteur redistribue des semaines entières et ne coupe jamais un séjour en cours pour équilibrer : l'équité choisit à qui revient le prochain bloc, la continuité le garde entier. Le report d'une année sur l'autre est pris en compte dès 3 mois de plannings validés. Tant que le réglage n'est pas activé (Rochefort et les autres services), rien ne change — plannings identiques.
v8.41.018/07/2026
NouveauLes désidérata peuvent désormais être posés à la demi-journée. Jusqu'ici une indisponibilité, une préférence ou une formation se posait forcément sur la journée entière ; on choisit maintenant « Journée », « Matin » ou « Après-midi » dans la barre d'outils avant de peindre le calendrier. Une demi-journée ne bloque que la moitié correspondante — une indisponibilité du matin laisse l'après-midi (et la garde de nuit) disponibles — et une formation donnée sur une demi-journée compte moitié moins d'heures. Les gardes restent à la journée entière (le choix jour/nuit est un réglage distinct). Rien ne change pour les journées entières déjà saisies.
v8.40.018/07/2026
NouveauNouveau type de journée « Formation donnée » (Libourne). Jusqu'ici une journée de formation comptait toujours la même durée. Quand un médecin ANIME une formation (au lieu de la suivre), la journée est plus longue : elle compte désormais 10 h vers le plafond hebdomadaire, contre 9,6 h pour une formation suivie. « Formation donnée » se déclare comme une formation ordinaire (dans les désidérata) ou s'ajoute après coup sur un jour libre (comme une consultation) ; dans les deux cas la journée est bloquée (ni poste ni garde), comptée comme travaillée, et le repos de la veille de garde est respecté. Les services qui n'utilisent pas le régime horaire (comme Rochefort) ne sont pas affectés.
v8.39.018/07/2026
FixUn garde-fou attrape désormais, bruyamment, les changements de profil programmés (« passage à 60 % au 1er novembre », « ne fait plus de gardes à partir de mai ») dont un champ est mal saisi. Ces transitions s'appuient sur une liste de champs reconnus ; un champ mal orthographié — un préfixe oublié, une faute de frappe — n'était appliqué à rien, en silence : la transition figurait bien dans la fiche du médecin mais ne changeait rien au planning. Un audit a trouvé quatre médecins de la démo Libourne dans ce cas (exclusions de gardes de médecins juniors qui ne s'appliquaient pas). Le moteur refuse maintenant de générer tant qu'une transition porte un champ non reconnu, en indiquant lequel. Toutes les fiches actuelles ont été mises en conformité.
v8.38.018/07/2026
MoteurNouveau réglage « Équité gardes jeudi », désactivé par défaut. Une garde de nuit le jeudi suivie du repos du vendredi crée un week-end de trois jours, aussi convoité qu'un vendredi : Libourne a demandé que ces jeudis soient répartis équitablement, comme le sont déjà les vendredis. Une fois le réglage activé pour un service, le jeudi quitte le lot des « gardes de semaine » et est réparti à part, avec le même suivi d'une année sur l'autre que les autres catégories. Tant que le réglage reste à zéro (le cas de Rochefort et des autres services), rien ne change : le jeudi reste une garde de semaine ordinaire, plannings identiques.
v8.37.017/07/2026
AméliorationLe panneau Réglages → Moteur affiche enfin les bons postes pour la continuité, service par service. La carte « Continuité des postes » proposait deux curseurs figés — « Hospitalisation » et « Maternité », les postes de Rochefort. Pour un autre service comme Libourne, ces deux curseurs concernaient des postes qui n'existent pas chez lui, et ses vrais postes (pédiatrie, néonatologie, maternité) n'avaient aucun curseur : impossible d'y régler la continuité, et bouger les curseurs affichés ne faisait rien. Désormais chaque service voit un curseur par poste réellement en continuité, nommé comme le poste. Un service dont aucun poste n'est en continuité affiche un message clair au lieu d'une section vide. Rochefort retrouve ses deux postes (avec leurs vrais noms). C'est la moitié « réglages » du chantier de continuité livré juste avant côté moteur.
v8.36.017/07/2026
MoteurLa continuité des postes s'appuie désormais sur la configuration de chaque service, au lieu de deux noms de postes figés. Le moteur essaie de garder le même médecin sur un secteur plusieurs jours d'affilée — mieux pour le suivi des patients. Jusqu'ici l'intensité de cette continuité était écrite en dur sur deux postes de Rochefort (« hospitalisation » et « maternité ») ; pour un service dont les postes portent d'autres noms, comme Libourne, elle ne s'appliquait à aucun poste, silencieusement sans effet. Désormais chaque poste déclare lui-même son niveau de continuité dans la configuration du service, et le moteur le lit directement : Libourne récupère la continuité qu'il demandait sur pédiatrie et néonatologie, sans réglage manuel. Rochefort est strictement inchangé — mêmes niveaux qu'avant, planning identique.
MoteurUn garde-fou attrape désormais, bruyamment, les réglages qui désignent un poste absent d'un service. Beaucoup de réglages du moteur nomment des postes ; quand le nom ne correspond à aucun poste réel du service, le réglage ne faisait rien — sans la moindre alerte, une source de bugs discrets. Le moteur refuse maintenant de lancer un planning tant qu'un poste oublie de déclarer sa continuité, qu'un niveau est mal orthographié, ou qu'une règle vise un poste inexistant, en indiquant précisément quoi corriger. Tous les services actuels sont déjà conformes ; ce filet protège surtout l'arrivée de nouveaux services.
v8.35.017/07/2026
MoteurLes règles de rotation entre secteurs s'adaptent maintenant à chaque service au lieu d'être figées sur les postes de Rochefort. Deux règles — « pas de bloc trop long sur le même poste » et « pas deux semaines d'affilée sur le même secteur » — désignaient en dur les postes « hospitalisation » et « maternité », les noms de Rochefort. Pour Libourne, dont les postes s'appellent autrement, ces règles ne s'appliquaient donc à aucun poste : silencieusement inactives. Désormais, par défaut, elles couvrent les postes propres de chaque service — Libourne récupère la rotation qu'il demandait. Rochefort garde exactement son réglage d'origine (les deux mêmes postes, sans les urgences), défini côté sa propre configuration. Aucun planning de Rochefort ne change ; c'est le comportement par défaut, pour tout futur service, qui devient correct.
v8.34.017/07/2026
MoteurLibourne : le moteur cherche désormais à confier le vendredi nuit et le dimanche nuit d'un même week-end à la même personne. C'est une règle voulue par Libourne : quitte à ce qu'un week-end soit déjà entamé par une garde de nuit le vendredi, autant enchaîner avec le dimanche nuit plutôt que d'éparpiller. Jusqu'ici le moteur faisait l'inverse : deux gardes à deux jours d'écart lui semblaient mal espacées, il les séparait donc. Un bonus fort (mais réglable) le pousse maintenant à regrouper ces deux nuits — sans jamais aller contre la répartition équitable des gardes, qui reste prioritaire. La règle ne s'active que pour un service dont la garde de week-end sépare le jour et la nuit (comme Libourne) ; Rochefort et les autres ne sont pas concernés. Avec le retrait du plafond livré juste avant, la règle du week-end de Libourne est maintenant complète.
v8.33.017/07/2026
MoteurLibourne : le plafond « une seule garde de week-end par mois » ne s'applique plus. Leur organisation de garde de week-end, telle qu'ils l'ont écrite, fait faire à une même personne le samedi journée ET le dimanche journée — soit deux gardes de week-end le même week-end. Or le moteur avait une règle, pensée pour Rochefort, qui pénalisait très fortement une deuxième garde de week-end dans le mois : elle allait donc frontalement contre leur fonctionnement. Cette règle est retirée pour Libourne. Le plancher inverse (« au moins une garde de week-end par mois ») reste, lui, en place : il correspond à leur propre calcul. Rochefort et les autres services ne changent pas. C'est la première moitié de la règle du week-end de Libourne ; la seconde (récompenser la personne qui enchaîne vendredi nuit et dimanche nuit) suivra.
v8.32.017/07/2026
MoteurL'équité des gardes ne compte plus deux fois le vendredi. Le moteur répartit les gardes équitablement grâce à plusieurs « paniers » d'équité — un pour le week-end, un pour le vendredi, un pour les jours de semaine. À cause d'une définition trop large de « jour de semaine », chaque vendredi tombait à la fois dans le panier du vendredi ET dans celui des jours de semaine, comptant donc double alors qu'un samedi ou un dimanche ne comptaient qu'une fois. Un médecin avec beaucoup de gardes le vendredi paraissait ainsi plus « chargé » que la réalité, et le moteur sur-corrigeait. Désormais chaque jour appartient à un seul panier : lundi à jeudi dans celui de la semaine, le vendredi (et la veille d'un jour férié, qui compte comme un vendredi) dans le sien, le week-end dans le sien. Concerne Rochefort. C'est aussi le préalable à l'équité du jeudi demandée par Libourne : sans cette correction, un jeudi veille de férié aurait compté triple.
v8.31.017/07/2026
MoteurLibourne : une garde de 24h en semaine est désormais un choix subi, plus une récompense recherchée. Là-bas, une journée de travail suivie de la garde de nuit forme une présence de près de 24h. Le moteur avait deux réglages qui, ensemble, l'incitaient à créer ces 24h et à les placer sur la maternité : un bonus général « travailler un poste le jour où on est de garde » (pensé pour Rochefort, où c'est un confort) et une préférence maternité très forte. Résultat : le moteur cherchait activement à fabriquer des 24h. Le confort de Rochefort ne s'applique plus à Libourne, et la préférence maternité passe de forte à légère. Le moteur ne fabrique donc plus de 24h pour le plaisir ; quand il y en a une, il continue d'éviter les urgences (poste éprouvant) et de préférer la maternité (plus calme), exactement ce que Libourne a demandé. Rochefort est inchangé : le bonus lui reste acquis.
v8.30.017/07/2026
MoteurLe moteur de Rochefort a desormais une empreinte de reference, verifiee automatiquement. Les chantiers en cours pour le service de Libourne touchent du code partage avec Rochefort : un reglage pense pour Libourne peut deplacer le planning de Rochefort sans que personne s'en apercoive. Jusqu'ici, la seule facon de le verifier etait une manipulation manuelle que rien n'obligeait a faire - autant dire qu'elle n'etait pas faite. L'empreinte du moteur est maintenant figee sur trois mois temoins et recalculee a chaque test : si un changement la deplace, le test echoue et nomme la regle responsable au lieu de signaler un simple ecart. Aucun planning ne change - c'est un filet, pas une modification du moteur.
MoteurCe que ce filet couvre, et ce qu'il ne couvre pas. Il compare le moteur a configuration constante : il attrape un changement de code qui deplacerait Rochefort. Il ne voit pas les reglages propres a chaque service ni ceux de la page Reglages, qui sont ajoutes plus tard dans la chaine - un changement de ce cote la doit etre verifie autrement. La limite est ecrite noir sur blanc dans le fichier de reference, pour que personne ne prenne ce filet pour une garantie qu'il ne donne pas.
v8.29.017/07/2026
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