A named, assignable mute group as the SAFETY section speaks it: string-keyed, with no live
active flag.
A projection, and on the way IN a legacy shape (audit D6). Mute-group membership is owned
by the console's own mute groups (MuteGroupSnapshotJson, keyed {kind:'muteGroup', index} and carrying active), which is what every live door writes: the muteGroup.* verbs,
the /channel/muteGroup/{n}/members row and a session restore all land on that one runtime.
This section was a SECOND persisted copy with no writer and no id translation to the first, so
it held whatever a previous file happened to carry and went stale the instant an operator
touched a group — every session on the rig has it empty while the console body holds the real
group.
It is therefore not saved. A session that carries one is MIGRATED on load by
consoleMuteGroups, which folds each entry into a real console mute group.
A named, assignable mute group as the SAFETY section speaks it: string-keyed, with no live
activeflag.A projection, and on the way IN a legacy shape (audit D6). Mute-group membership is owned by the console's own mute groups (MuteGroupSnapshotJson, keyed
{kind:'muteGroup', index}and carryingactive), which is what every live door writes: themuteGroup.*verbs, the/channel/muteGroup/{n}/membersrow and a session restore all land on that one runtime. This section was a SECOND persisted copy with no writer and no id translation to the first, so it held whatever a previous file happened to carry and went stale the instant an operator touched a group — every session on the rig has it empty while the console body holds the real group.It is therefore not saved. A session that carries one is MIGRATED on load by consoleMuteGroups, which folds each entry into a real console mute group.