Operator console — the gacha twin of /lottery. Attest the drop table before anyone pulls. Publishing here timestamps your rates (and pity) at ×2 independent RFC-3161 TSAs and hands you a bannerId. Players then pull against that id (/gacha?banner=…); the odds are frozen and can't be swapped after a pull. This closes the "odds published before sales" boundary (uvGacha §5).
Integer rates over a denominator D (parts-per-million by default). Rates MUST sum to exactly D — no floats (uvGacha §4).