Stacked tables & reinitialise — how the engine behaves

Managed tables on a sheet are organised into lanes: tables that share at least one column (transitively) belong to the same lane and must have pairwise disjoint row ranges. Tables in entirely disjoint column bands are independent lanes and may sit beside each other freely (side-by-side, L-shape, T-shape are all allowed). Within a lane that one rule governs the whole layout engine — growing, shrinking, and widening tables in place without ever silently corrupting a neighbour. Pick a scenario below; each shows the same sheet before → after. The grand finale is reinitialise with more columns, the move that keeps a live Benchling sheet in sync with an evolving schema.

Header / title (managed table) Live data cell Newly added column (widen) Rows opened / shifted Cell cleared by the op Stacked neighbour table Danger zone / loose content Cell in a refused op

1. The stacked-only contract safe

Table X (rows 2–4) sits above neighbour Y (rows 6–8) with a one-row gap between them. Both occupy columns A–C — the columns overlap completely. That is fine: the only thing the engine forbids is row overlap.

The stack
A
B
C
2
sample
batch
resultanchor
3
S1
B1
10start
4
S2
B1
20end
(gap — empty, safe to grow into)
6
well
conc
od
7
A1
5
0.2
8
A2
5
0.3
Why it is accepted

The invariant test compares row intervals only. X spans rows [2,4]; Y spans rows [6,8]. Their intersection is empty, so the layout is accepted — even though every column is shared.

Column overlap is fine; row overlap is not. Each managed table is tracked by sheet-scoped names: a header anchor, per-column tokens, and the _table_start / _table_end bookmarks that record the live data extent. The bookmark prefix is the table's identity.

If X and Y shared even one row, a resize of X would tear Y in half — so that layout is rejected up front with SideBySideNotSupportedError (scenario 5).