Storage is a codec, never a second mode
The runtime value is always bigint; representations sit at the IO boundary:
P.encode(perms, "base64url"); // JWT claim / cookie — smallest
P.encode(perms, "decimal"); // Postgres numeric/text; Discord-compatible
P.encode(perms, "names"); // ["chat.SEND_MESSAGES", …] — the JSON mode
P.decode(claim, "base64url"); // → bigint, on any runtimeBinary codecs (decimal · hex · base64url · chunks) are lossless —
they carry unknown (newer-version) bits through untouched, so a service on an old
version never silently revokes what a newer one granted. names / grouped are
human-readable and lossy for unknown bits by nature.