Edit permissions in the designer's words (TYP-761).
The model is 27 booleans in eight groups; the person authoring them is a template designer asking
"may the customer change this?" (decided 2026-09-28). So every control the editor shows is one of
the switches below, each a plain question that reads and writes a GROUP of flags — "Resize the
frame" is all four edges, "Move it" both axes. The 27 stay behind them.
⚠️ A switch over several flags can find them disagreeing — a role that allows horizontal moves
only, say, written by a host or a later operator view. It then reads 'mixed', and is written only
if the designer actually changes it, so opening and saving a role never flattens what it holds.
⚠️ Every block written from here is COMPLETE. can() reads a present block's missing branch as a
DENY, so a partial block would take away things nobody meant to take away.
Edit permissions in the designer's words (TYP-761).
The model is 27 booleans in eight groups; the person authoring them is a template designer asking "may the customer change this?" (decided 2026-09-28). So every control the editor shows is one of the switches below, each a plain question that reads and writes a GROUP of flags — "Resize the frame" is all four edges, "Move it" both axes. The 27 stay behind them.
⚠️ A switch over several flags can find them disagreeing — a role that allows horizontal moves only, say, written by a host or a later operator view. It then reads 'mixed', and is written only if the designer actually changes it, so opening and saving a role never flattens what it holds.
⚠️ Every block written from here is COMPLETE. can() reads a present block's missing branch as a DENY, so a partial block would take away things nobody meant to take away.