Zero rejections with zero input is just a dead scraper so alert on rejection counts alongside input volume. The 10% cap only bounds single steps, compounding still walks you to the floor, so use a windowed cumulative drift breaker instead of counting consecutive capped moves, which is gameable by alternating capped and accepted ones Real bug in the guard too, if the price already sits below the floor a capped up move at current_price * 1.1 can still ship below it, clamp to max(floor_price, upper_bound). Tie the floor to current landed cost and say whether 20% means margin on price or markup on cost, those give different numbers. Add a per unit multipack check with an override lane for clearance stuff, and make rule_set_version and segment_version real columns in pricing_decisions so old prices stay explainable