v2.10.0
v2.10.0 — Channel reserve: the last N pieces belong to B2B
Minor release. One additive migration (nullable columns). ## Operator-facing **Per-product channel reserve.** Set "hold back N pieces" and/or "publish only X% " on a product and every sales channel…
Minor release. One additive migration (nullable columns).
Operator-facing
Per-product channel reserve. Set “hold back N pieces” and/or “publish only X% ” on a product and every sales channel sees that much less ATP — the held stock stays fully available to B2B. Both set → the more conservative wins; reserve is applied inside the single ATP composition, so published numbers and allocation always agree (a component’s reserve also shrinks what kits can promise to assemble). The product page shows “reserved off-channel” next to ATP. Null fields = behavior identical to before, for every existing product.
Fixed
Manual inventory reconcile had been dead since S4: the busy-check counted the hygiene scheduler’s permanent delayed marker as pending work, so it yielded forever in any environment with schedulers running. It now counts waiting+active only.
Rollback
Re-deploy v2.9.1. Columns are nullable and harmless to old code.