param accepts a live Signal<string> so a bound [param] rename stays
reactive; a plain string is wrapped internally. serialize/deserialize
default to a boolean codec (true -> 'open', absence -> false); pass an
identity codec (v => v ?? null / raw => raw) to sync string ids.