Issue #3618660: Move the offer-on-this-front rule inside the engine, where every other rule already is
A tariff withheld from the front being served could be held from the place map: a seat click, a relocate and a reprice all accepted one. Full account in the issue.
Where the rule went
Into BookingManager::hold(), beside the rest of what a line has to be. Every other eligibility rule was already inside the engine; this one was asked above it in RequestBooker::assertOnOffer(), which is why the three surfaces that compose their own lines and hand them to the engine bypassed it. assertOnOffer() is deleted, and the channel filter it was injected for goes with it. No signature moves and no call site moves.
Which front a hold is judged on
The order's, recorded when it was opened, not the one being served as a line is added. A queued hold, a retry, and an operator finishing a booker's order are none of them standing in the front the order belongs to. It cuts both ways and the test says so in both: an entitled order keeps its offer when the request is served elsewhere, and an unentitled one cannot borrow the entitlement of whoever is running the request. An order being opened has nothing recorded yet, so there the front being served is the answer, and it is the same value the order is stamped with a few lines later.
BookingChannelFilter gains offersOn() for a named front, and allows() becomes that call with the front being served: one implementation of the sentence the filter says it exists to hold alone.
Seen to fail first
Against the code as it stood the new engine test threw nothing, the order-front test let an outsider hold the offer, and the placement test reported the seat click taking a withheld tariff. Every existing channel test drove RequestBooker, which is exactly why none of them ever saw this.
Cost
All ten figures in the hold cost log are identical before and after. Reading the slot's resource once per line rather than only for a line naming no tariff costs nothing, since it is loaded by then. PlaceHoldCostTest, PlaceReleaseCostTest and AllotmentQueryBudgetTest green.
Run locally on MySQL: BookingChannelRestrictionTest 9, BookingChannelContextTest 6, BookerRefusalTest 4, PlaceBookingTest 22, PoolOpTest 11. phpcs, cspell and the translation check clean; the whole suite belongs to CI.