AxoMEME MEME-power gate — monotone retrain for veg/datamonkey3#151 Prepared 2026-08-04. For the DM3 dev team. FILES meme_power_gate_monotone.pkl the retrained model (sklearn HistGradientBoostingClassifier) retrain_gate_monotone.py the exact retrain script (reproducible; reads dm_sites.csv + um_manifest.csv) comparison.json old-vs-new probabilities on your golden.fixtures + issue #151 reproductions WHAT CHANGED (all three of your suggested fixes) 1. Monotonicity: monotonic_cst=[1,1,1] -> 0 decreasing steps (was 18-31%). NOTE: this needs HistGradientBoostingClassifier, NOT GradientBoostingClassifier — only Hist* supports monotonic_cst. 2. Dropped frac_p_defined -> input is now [1,3] (num_seqs, num_sites, median_pos_dist). 3. Floored median_pos_dist at 0.001 -> zero-distance no longer outranks short branches. COST: CV ROC-AUC 0.887 -> 0.853. Expected/honest price of monotonicity. Underlying relationship IS monotone in the data (P(informative) rises 0.49->0.76->0.79->0.81->0.86 by seq bin), so this encodes a true property, not a distortion. ONNX RE-EXPORT — PLEASE DO IN YOUR ENV I could not cleanly re-export via skl2onnx here: skl2onnx 1.20 / onnx in my env throws "Field AttributeProto.ints: Expected an int, got a boolean" converting the Hist* tree. Your original .onnx came out of your skl2onnx setup, so please re-export from the .pkl there (initial_types FloatTensorType([None,3]), options zipmap=False). If you'd rather keep the frozen [1,4] app contract, slice the 4th feature app-side before the session, or wrap with an ONNX Gather — your call on the contract.