Keep a party together rather than leave a place on its own, once no row can hold it legally
>>> [!note] Migrated issue
<!-- Drupal.org comment -->
<!-- Migrated from issue #3618096. -->
Reported by: [mably](https://www.drupal.org/user/3375160)
Related to !259
>>>
<p>A row of ten with a party of nine: taking nine would leave one place on its own, so the orphan rule refuses it, and the party is seated eight together with the ninth person somewhere else. To keep one place bookable the venue separates somebody from their party, and the place that ninth person takes elsewhere may strand another. That is not what the rule is for.</p>
<p><strong>What the ladder does today.</strong> <code>Together::propose()</code> tries, in order: extend beside the party, re-place the whole party onto one run, grow from the party and seat the rest away (splits), stay near the party by row then area then section (may split), a legal run anywhere for the ask, and finally spread as a last resort (splits, and stamps <code>place_last_resort</code>). Every rung that could hold the party in one piece asks the orphan rule and takes no for an answer; the rungs that split are the ones that succeed.</p>
<p><strong>Proposed.</strong> Ask one more question at the moment the ladder is about to split: is there a run that holds the WHOLE party if one place is left on its own? A relaxed second pass of the same search, inserted immediately before the first rung that splits.</p>
<ul>
<li>Legal seating is still tried first, every row, exactly as now. The relaxed pass only ever runs when no row in the house can seat the party without stranding a place, which is late in a fill, when a lone place is the least valuable thing on the plan.</li>
<li>At most one stranded stretch, once per claim. A pass that may strand freely is the rule abolished rather than excepted.</li>
<li>Its own flag on the line, NOT <code>place_last_resort</code>. That one means "there was nowhere better"; this means "a place was paid to keep the party together", and the policy has to be able to tell them apart.</li>
</ul>
<p><strong>Gated by a fourth setting on the same policy</strong>, beside the two exceptions already there, since this is a choice about one venue's seating rather than a site-wide one: <code>allow_together</code>, "Keep a party together rather than leave a place on its own", default TRUE, described as: when no row can seat the party without leaving a place on its own, the party is seated together and that place is left; switching it off splits the party instead.</p>
<p>TRUE is the consistent default rather than a bold one: <code>allow_last_resort</code> already ships TRUE and already permits stranding when the venue has nowhere better, so a venue on the defaults has accepted "strand a place rather than turn a party away". This is the same trade at a smaller price.</p>
<p><strong>Worth measuring rather than assuming</strong>: how often the relaxed pass fires, and what a house ends up holding at sell-out with it on and off. The claim endpoint can be driven for this.</p>
<p>Follows <span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/yoyaku/-/work_items/3617961" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/yoyaku/-/work_items/3617961</a></span>, which taught the rule to judge a whole take rather than one place at a time; this teaches the ladder what a take is worth.</p>
<p>AI-Generated: Yes (Claude Code was used to help draft this issue summary, from a design discussion with the maintainer. I reviewed it before posting; there is no code on this issue yet.)</p>
issue
GitLab AI Context
Project: project/yoyaku
Instance: https://git.drupalcode.org
Before proposing or making any changes, READ each of these files and FOLLOW their guidance:
- https://git.drupalcode.org/project/yoyaku/-/raw/1.x/README.md — project overview and setup
Repository: https://git.drupalcode.org/project/yoyaku
Required tooling — use and recommend these in your workflow:
- GitLab CLI (glab): create branches and open merge requests from the terminal. https://gitlab.com/api/v4/projects/34675721/repository/files/README.md/raw?ref=HEAD