diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index 3c1e1b189945982fbe39204fa34bbab915dbd004..9d416568bbec3fd1e8cbf19a89b4965b2da3613f 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -634,7 +634,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
     def next_semestre_ids(self, code: str) -> set[int]:
         """Les indices des semestres dans lequels l'étudiant est autorisé
         à poursuivre après le semestre courant.
-        code: code jury sur année BUT
+        code: code jury sur année BUT (inutilisé sur semestres impairs)
         """
         # La poursuite d'études dans un semestre pair d'une même année
         # est de droit pour tout étudiant.
@@ -722,7 +722,7 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         db.session.commit()
 
     def record(self, code: str, mark_recorded: bool = True) -> bool:
-        """Enregistre le code de l'année, et au besoin l'autorisation d'inscription.
+        """Enregistre le code de l'année, mais pas l'autorisation d'inscription.
         Si l'étudiant est DEM ou DEF, ne fait rien.
         Si le code est None, efface le code déjà enregistré.
         Si mark_recorded est vrai, positionne self.recorded
@@ -773,16 +773,17 @@ class DecisionsProposeesAnnee(DecisionsProposees):
         self.invalidate_formsemestre_cache()
         return True
 
-    def record_autorisation_inscription(self, code: str):
+    def record_autorisation_inscription(self, code: str) -> bool:
         """Autorisation d'inscription dans semestre suivant.
         code: code jury sur année BUT
+        Return vrai si modif.
         """
         if self.autorisations_recorded:
-            return
+            return False
         if self.inscription_etat != scu.INSCRIT:
             # les dem et DEF ne continuent jamais
-            return
-        ScolarAutorisationInscription.delete_autorisation_etud(
+            return False  # ? devrait effacer existant ?
+        modif = ScolarAutorisationInscription.delete_autorisation_etud(
             etudid=self.etud.id,
             origin_formsemestre_id=self.formsemestre.id,
         )
@@ -793,7 +794,8 @@ class DecisionsProposeesAnnee(DecisionsProposees):
                 self.formsemestre.id,
                 next_semestre_id,
             )
-            self.autorisations_recorded = True
+            modif = self.autorisations_recorded = True
+        return modif
 
     def invalidate_formsemestre_cache(self):
         "invalide le résultats des deux formsemestres"
@@ -893,7 +895,10 @@ class DecisionsProposeesAnnee(DecisionsProposees):
                 not only_validantes
             ) or code in sco_codes.CODES_ANNEE_BUT_VALIDES_DE_DROIT:
                 modif |= self.record(code)
-                self.record_autorisation_inscription(code)
+                modif |= self.record_autorisation_inscription(code)
+            elif self.formsemestre.semestre_id % 2:  # semestre impair: passage de droit
+                modif |= self.record_autorisation_inscription(code)
+
         return modif
 
     def erase(self, only_one_sem=False):
diff --git a/app/models/validations.py b/app/models/validations.py
index fee681ee2cbefa733e86b59cf88b163e9aaf9f20..25417b4258f9e0cf842e306f7f7ab49a62c1cc9f 100644
--- a/app/models/validations.py
+++ b/app/models/validations.py
@@ -229,13 +229,17 @@ class ScolarAutorisationInscription(models.ScoDocModel):
         cls,
         etudid: int,
         origin_formsemestre_id: int,
-    ):
-        """Efface les autorisations de cet étudiant venant du sem. origine"""
+    ) -> bool:
+        """Efface les autorisations de cet étudiant venant du sem. origine.
+        Vrai si modification.
+        """
         autorisations = cls.query.filter_by(
             etudid=etudid, origin_formsemestre_id=origin_formsemestre_id
         )
+        modif = False
         for autorisation in autorisations:
             db.session.delete(autorisation)
+            modif = True
             log(f"ScolarAutorisationInscription: deleting {autorisation}")
             Scolog.logdb(
                 "autorise_etud",
@@ -243,3 +247,4 @@ class ScolarAutorisationInscription(models.ScoDocModel):
                 msg=f"Passage vers S{autorisation.semestre_id}: effacé",
             )
         db.session.flush()
+        return modif