Bindings REPLACES what the room is about, wholly. It is a replace and not a merge because a caller that cannot remove a binding would have no way to correct a wrong one, and an empty list sent explicitly is how a room is unbound. Absent (null) leaves the existing list alone.
Life sets the lifecycle intent: "standing" or "bound". Any other value is refused rather than stored, so a reader never has to interpret a third one. Empty leaves the current intent unchanged.
Workspace names the workspace holding the room. It is required, because a room id is unique only within one and searching every workspace for a matching id would make the write's target depend on iteration order.