# Cover Count Comes After the Aisles

![Developer-blog cover card: the headline “Cover Count Comes After the Aisles” beside a thin-stroke restaurant floor-plan schematic with tables, aisle arrows, and a kitchen block](https://cdn.hashnode.com/uploads/covers/69c0b8acd9da55a9a523b069/9d171caf-de9e-4995-abe0-09118ae59f7c.jpg)

I have a soft spot for a particular kind of bad restaurant brief. It arrives as a number.

“We need 80 covers.”

Sometimes it is 64, or 120, or “as many as we can get.” The number is treated as an input, the way a compiler treats a source file. Everything else — aisle width, the path from the pass to table 12, whether a buffet counter can be approached from both sides — is expected to rearrange itself around that target.

I do not work on FloorAI. I work on spatial reasoning models at ArchyBase. FloorAI is another product our team builds. I am writing this because **cover count is not an objective you maximize first**. It is a residual: what remains after circulation, kitchen adjacency, and a handful of hard clearances have been satisfied. Marketing pages often bury that order of operations. Operators feel it on opening night, when two servers cannot pass and the ticket times go strange.

This is not an essay about editing a single door, and it is not about animating a plan. It is about the predicate that should run *before* you report how many seats fit.

## The number is downstream

A dining room is a circulation network with tables in the leftover space. If you invert that, you get a familiar failure: tables land on a grid, the leftover strips are called aisles, and those strips are narrower than a loaded tray.

Common rules of thumb — and I am repeating them as rules of thumb, not as measurements I have validated in a lab — put casual dining in the neighborhood of 12–15 square feet per seat, and fine dining closer to 18–20. Those ranges already encode a lot of circulation. They are not a license to divide floor area by 12 and call the quotient “covers.” The divisor assumes the aisles exist. If you spend the aisles on extra two-tops, the rule no longer applies, even though the arithmetic still looks clean.

Service style changes which constraints are hard:

- **Casual dining** can tolerate tighter tables, but still needs a path that does not thread between chair backs.
- **Fine dining** spends more area per seat, and usually wants a calmer service path that does not cut across the room’s ceremonial axis.
- **Fast food** is not “more tables.” It is a queue lane and a pickup shelf, plus a kitchen that can feed that shelf without crossing the queue.
- **Buffet** wants wider aisles and often a double-sided counter; a single-sided island in a narrow room is a congestion machine.
- **Cafe** and **bar & restaurant** change the mix again: a bar is a linear workstation with stool clearances and a staff side that cannot be treated as leftover dining area.

Outdoor seating, if you have it, is not free density. It is another circulation problem, with its own access and a service path back to the kitchen. Ticking “bar area” or “outdoor seating” should *reduce* how freely you pack the indoor grid, not inflate a vanity cover number.

## What I would check first (illustrative, not production)

If I were reviewing a restaurant layout system as an ML engineer on an adjacent team, I would refuse to emit a cover count until a short predicate passed. The following is illustrative geometry, not a dump of anyone’s production code:

```python
# Illustrative checks only — not production source.

def aisle_clearances(aisles, min_width):
    """Every service aisle should meet a minimum clear width."""
    return all(a.clear_width >= min_width for a in aisles)

def kitchen_to_dining_path(path, min_width, max_turns=None):
    """The pass-to-floor path is a first-class constraint, not decoration."""
    if any(seg.clear_width < min_width for seg in path.segments):
        return False
    if max_turns is not None and path.turns > max_turns:
        return False
    return True

def residual_covers(plan, sqft_per_seat):
    if not aisle_clearances(plan.aisles, plan.min_aisle):
        return None
    if not kitchen_to_dining_path(plan.service_path, plan.min_service_width):
        return None
    usable = plan.dining_area - plan.blocked_by_circulation
    return usable / sqft_per_seat
```

Two habits matter more than the exact formulae:

- **Return `None`, not a smaller integer, when circulation fails.** A layout that clips a 900 mm aisle down to 600 mm does not “fit 74 covers instead of 80.” It is not a candidate. Reporting a number anyway trains people to negotiate with the residual as if the predicate were optional.
- **Measure the kitchen-to-dining path as a path, not as a pretty arrow.** A route that looks short on a 2D plan can still fail if it pinches behind a waiter station, crosses the queue, or shares a door swing with the walk-in.

I cannot tell you which checks any given product runs. I can tell you that without some version of them, “we fit 80” is a sentence about packing, not about service.

![A laptop on a daylight desk showing a floor-plan editor with a restaurant layout of tables and aisles, next to a printed plan with pencil notes](https://cdn.hashnode.com/uploads/covers/69c0b8acd9da55a9a523b069/1507c4d2-3edb-4333-9b19-fb69bc2625b4.jpg)

## Dining and kitchen belong on the same sheet

A lot of early restaurant sketches treat the kitchen as a labelled box offstage. That is how you get a beautiful dining grid whose pass is on the wrong wall, so every plate crosses the front door.

I have been looking at [a generator that drafts dining rooms and kitchens on the same plan](https://floorai.ai/ai-restaurant-floor-plan-generator). FloorAI ships it; I do not maintain it. What I care about is the modelling choice: one labelled plan, dining room and kitchen together, rather than a seating study that pretends the hot line is someone else’s problem.

The workflow, as the product page describes it, is small on purpose. You pick a service style — fine dining, casual dining, fast food, cafe, bar and restaurant, or buffet. You can tick a bar area or outdoor seating. You enter length and width in feet or metres, or a total square footage. You can ask for up to four plans in one run, in a Fast or Best mode, and each layout comes with a cover count. The 2D technical plan style keeps room labels and dimension lines, which is the only way I want to argue about aisles.

That is the right shape of tool, whether or not any particular run is a plan I would build from. It forces the residual to be computed on a sheet that already contains the kitchen. If the buffet option did not spend space on wider aisles and a double-sided counter, or if the fast-food option skipped a queue lane and a pickup shelf, the cover number would be lying even if the tables were pretty.

## Hard clearances are not a style

People talk about aisle width as taste. It is not. It is a family of constraints that depend on what has to move:

- a guest pulling out a chair
- two servers passing with trays
- a food runner coming from the pass
- a guest queue that must not back into a table
- a barback moving behind seated stools

I am not going to invent millimetre standards and pretend I measured them. Building and health codes vary, and so do house rules. The engineering point is simpler: **whatever minimums you adopt, they are inputs, and cover count is the output.** If a client “needs 80” in a room whose circulation budget only leaves 62 after those minimums, the honest artifact is a plan of 62, plus a conversation about a larger room, a different service style, or a shorter menu that changes the kitchen footprint.

Outdoor seating and bars are the usual places this honesty collapses. A patio drawn as a second grid, with no return path to the kitchen, inflates covers. A bar drawn as a row of circles with no staff aisle behind it also inflates covers. In both cases the dining room looks generous because the work was pushed off the page.

## Fast versus careful, and what a generator cannot do

Asking a model for four candidates is useful. It is a way to see how the residual moves when you change service style or peel off a bar. Fast and Best modes, as product options, are a time-versus-scrutiny trade-off I recognize from my own work: cheaper search is fine for a first cut; you do not want to discover the pinched service path after you have already fallen in love with a cover number.

What I would not do is treat the sheet as a construction document. A generator can label rooms and draw dimension lines. It does not know your hood location, your grease interceptor, your accessible-route rules, or the chair your operator actually bought. Those belong to a later, slower process, with a human who will be in the room when a trolley has to turn.

The failure mode I want to name is earlier than that. It is the moment someone writes “80 covers” at the top of a brief and asks the geometry to obey. Invert it. Fix the aisles, the kitchen path, the bar, the queue, the buffet counter. Then count.

If the count is lower than the brief, the brief was a wish. The plan is the measurement.
