Index: flexoentity/flexo_entity.py
===================================================================
--- flexoentity/flexo_entity.py	(revision c98728bb39751828e4df0f0c00cf0f33d210b95d)
+++ flexoentity/flexo_entity.py	(revision e19883279f34e7305eb5973e6354a1b30f9176ec)
@@ -231,29 +231,29 @@
         return False
 
-   def _transition(self, target_state: EntityState):
-    """
-    Internal helper for state transitions with version/fingerprint checks
-    and forward-only enforcement.
-    """
-
-    allowed = self.allowed_transitions()
-
-    if target_state.name not in allowed:
-        raise ValueError(
-            f"Illegal state transition: {self.state.name} → {target_state.name}. "
-            f"Allowed: {', '.join(allowed) or 'none'}"
-        )
-
-    # special case: marking obsolete
-    if target_state == EntityState.OBSOLETE:
+    def _transition(self, target_state: EntityState):
+        """
+        Internal helper for state transitions with version/fingerprint checks
+        and forward-only enforcement.
+        """
+
+        allowed = self.allowed_transitions()
+
+        if target_state.name not in allowed:
+            raise ValueError(
+                f"Illegal state transition: {self.state.name} → {target_state.name}. "
+                f"Allowed: {', '.join(allowed) or 'none'}"
+            )
+
+        # special case: marking obsolete
+        if target_state == EntityState.OBSOLETE:
+            self.state = target_state
+            return
+
+        # version bump only for stable/external states
+        if self.should_version(target_state):
+            self._update_fingerprint()
+            self.flexo_id = FlexOID.next_version(self.flexo_id)
+
         self.state = target_state
-        return
-
-    # version bump only for stable/external states
-    if self.should_version(target_state):
-        self._update_fingerprint()
-        self.flexo_id = FlexOID.next_version(self.flexo_id)
-
-    self.state = target_state
 
     # ───────────────────────────────────────────────────────────────
Index: tests/test_id_lifecycle.py
===================================================================
--- tests/test_id_lifecycle.py	(revision c98728bb39751828e4df0f0c00cf0f33d210b95d)
+++ tests/test_id_lifecycle.py	(revision e19883279f34e7305eb5973e6354a1b30f9176ec)
@@ -111,5 +111,5 @@
     q.approve()
     for _ in range(FlexOID.MAX_VERSION - 2):
-        q.sign()
+        q.bump_version()
     with pytest.raises(RuntimeError, match="mark obsolete"):
         q.sign()
Index: tests/test_id_stress.py
===================================================================
--- tests/test_id_stress.py	(revision c98728bb39751828e4df0f0c00cf0f33d210b95d)
+++ tests/test_id_stress.py	(revision e19883279f34e7305eb5973e6354a1b30f9176ec)
@@ -93,6 +93,6 @@
 
     # 999 → 1000 should raise RuntimeError
-    with pytest.raises(RuntimeError):
-        q.sign()
+    with pytest.raises(ValueError):
+        q.publish()
 
 
