@@ -817,27 +817,66 @@ def advice_text() -> str:
817817 for e in selected_errors
818818 if isinstance (e , dict )
819819 }
820+ driving_gear , smallgear , biggear = _get_gear_counts (out )
821+ shaft_long , shaft_short , shaft_total = _get_shaft_counts (out )
822+ spacer_long , spacer_short , spacer_total = _get_spacer_counts (out )
820823
821824 # Highest-priority prerequisite errors
822825 if "E_NO_GEARS" in codes :
823- return False , MESSAGE_POLICY ["mesh_ratio" ]["fail" ]
826+ return False , MESSAGE_POLICY ["gear_inventory" ]["no_gears" ].format (
827+ driving_gear = driving_gear ,
828+ smallgear = smallgear ,
829+ biggear = biggear ,
830+ )
831+
832+ if "E_NO_SHAFTS" in codes :
833+ return False , MESSAGE_POLICY ["shaft" ]["none_detected" ]
824834
825- if "E_NO_SHAFTS" in codes or " E_NO_GEAR11" in codes :
835+ if "E_NO_GEAR11" in codes :
826836 return False , MESSAGE_POLICY ["mesh_ratio" ]["fail" ]
827837
838+ # Shaft checks
839+ if (
840+ "E_SHAFT_COUNT_MISMATCH" in codes
841+ or "E_SHAFT2_NOT_FOUND" in codes
842+ ):
843+ if shaft_total == 0 :
844+ return False , MESSAGE_POLICY ["shaft" ]["none_detected" ]
845+ if shaft_total > 2 :
846+ return False , MESSAGE_POLICY ["shaft" ]["too_many" ]
847+ if shaft_total == 1 and shaft_long == 1 and shaft_short == 0 :
848+ return False , MESSAGE_POLICY ["shaft" ]["short_missing" ]
849+ if shaft_total == 1 and shaft_short == 1 and shaft_long == 0 :
850+ return False , MESSAGE_POLICY ["shaft" ]["long_missing" ]
851+ return False , MESSAGE_POLICY ["shaft" ]["count_fail" ]
852+
853+ if "E_SHAFT_TYPE_CONFUSION" in codes :
854+ return False , MESSAGE_POLICY ["shaft" ]["type_confusion" ]
855+
856+ if (
857+ "E_SHAFT_POSITION_SWAP" in codes
858+ or "E_SHAFT2_CLASS_MISMATCH" in codes
859+ or "E_SHAFT3_CLASS_MISMATCH" in codes
860+ ):
861+ return False , MESSAGE_POLICY ["shaft" ]["position_swap" ]
862+
828863 # Spacer checks
829864 if "E_SPACER_SHORT_MISSING" in codes :
830865 return False , MESSAGE_POLICY ["spacer" ]["short_missing" ]
831866
832867 if "E_SPACER_LONG_MISSING" in codes :
833868 return False , MESSAGE_POLICY ["spacer" ]["long_missing" ]
834869
835- if "E_SPACER_COUNT_MISMATCH" in codes :
836- return False , MESSAGE_POLICY ["spacer" ]["count_fail" ]
837-
838870 if "E_SPACER_TYPE_CONFUSION" in codes :
839871 return False , MESSAGE_POLICY ["spacer" ]["type_confusion" ]
840872
873+ if "E_SPACER_COUNT_MISMATCH" in codes :
874+ if spacer_total == 0 :
875+ return False , MESSAGE_POLICY ["spacer" ]["none_detected" ]
876+ if spacer_total > 2 :
877+ return False , MESSAGE_POLICY ["spacer" ]["too_many" ]
878+ return False , MESSAGE_POLICY ["spacer" ]["count_fail" ]
879+
841880 if (
842881 "E_SPACER_ASSIGNMENT_FAIL" in codes
843882 or "E_SPACER2_MISSING" in codes
@@ -855,28 +894,33 @@ def advice_text() -> str:
855894 if "E_SPACER_DISTANCE_ORDER" in codes :
856895 return False , MESSAGE_POLICY ["spacer" ]["distance_order" ]
857896
858- # Shaft checks
859- if (
860- "E_SHAFT_POSITION_SWAP" in codes
861- or "E_SHAFT2_CLASS_MISMATCH" in codes
862- or "E_SHAFT3_CLASS_MISMATCH" in codes
863- ):
864- return False , MESSAGE_POLICY ["shaft" ]["position_swap" ]
865-
866- if (
867- "E_SHAFT_COUNT_MISMATCH" in codes
868- or "E_SHAFT2_NOT_FOUND" in codes
869- ):
870- return False , MESSAGE_POLICY ["shaft" ]["count_fail" ]
897+ # Mesh and consistency checks
898+ if "E_GEAR_BIG_SMALL_INCONSISTENT" in codes :
899+ return False , MESSAGE_POLICY ["gear_inventory" ]["big_small_inconsistent" ].format (
900+ driving_gear = driving_gear ,
901+ smallgear = smallgear ,
902+ biggear = biggear ,
903+ )
871904
872- if "E_SHAFT_TYPE_CONFUSION" in codes :
873- return False , MESSAGE_POLICY ["shaft" ]["type_confusion" ]
905+ if "E_GEAR_CONTACT_INCONSISTENT" in codes :
906+ return False , MESSAGE_POLICY ["gear_inventory" ]["contact_consistency_fail" ].format (
907+ driving_gear = driving_gear ,
908+ smallgear = smallgear ,
909+ biggear = biggear ,
910+ )
874911
875- # Mesh and consistency checks
876912 if (
877913 "E_MISMESH_DETECTED" in codes
878914 or "E_MESH_MISMATCH" in codes
879- or "E_CONTACT_COUNT_MISMATCH" in codes
915+ ):
916+ return False , MESSAGE_POLICY ["gear_inventory" ]["mismatch_fail" ].format (
917+ driving_gear = driving_gear ,
918+ smallgear = smallgear ,
919+ biggear = biggear ,
920+ )
921+
922+ if (
923+ "E_CONTACT_COUNT_MISMATCH" in codes
880924 or "E_GEAR_COUNT_UNSUPPORTED" in codes
881925 ):
882926 return False , MESSAGE_POLICY ["mesh_ratio" ]["fail" ]
0 commit comments