runtime: pb.decode_unsafe + M.<Name>_decode_unsafe in runtime mode (58u) Completes the unsafe-decode story 6bb started in full mode. Runtime mode now exposes the same API via parallel `f._reader_unsafe` closures compiled in pb.finalize_message against a swapped scalar table where `string` maps to the bytes handler (no utf8_len). build_reader / build_repeated_reader / decode_one are now parameterized on (scalar_tbl, decode_msg_fn, decode_group_fn) so the same builders emit both reader shapes. decode_message_unsafe, decode_group_unsafe, and decode_extension_unsafe are literal clones of their safe twins with three substitutions (documented in codec.lua): the _reader field, the scalar table in slow paths, and the sub-message / group / extension dispatchers. Tests in test/decode_unsafe_test.lua are now parameterized over both modes (14 cases, including a map<string, int32> invalid-key case that exercises the decode_one map-fallback path). Runtime-mode microbench shows ~8% throughput vs validating decode on the string-heavy 1KB Person; smaller than full mode's ~20% because the descriptor dispatch + closure indirection swamp utf8_len, but still a net win and the perf-cost-of-validating story is now consistent across modes. Conformance 3240/3240 + JIT trace 37/37 still pass. Closes 58u, also closes b12 (already fixed in 2656c97; never closed). kyt still tracks unifying _decode_unsafe with C accel.
codegen: emit <Msg>_decode_unsafe for trusted-source decoding (6bb) Full-mode codegen now emits a sister <Msg>_decode_unsafe(buf) alongside <Msg>_decode that drops the per-string utf8_len check (singular, repeated, map keys/values, extensions, and the >=128-byte fallback all route through wire.decode_bytes). Sub-messages recurse into their own _decode_unsafe so nested strings also bypass; WKTs continue to call the normal pb.wkt.<Name>_decode (no _unsafe twin, no string-validation hot path). C runtime dispatch is skipped because it validates today (kyt). Use this when re-decoding bytes from a trusted producer — your own encoder over typed RPC, JSON/text round-trips, in-process pipelines — where the spec-required utf8.len check on every string is duplicate work. Microbench on a string-heavy 1KB Person (26 emails) shows ~20% throughput vs _decode; conformance suite still passes (3240/3240) because _decode itself is unchanged. Runtime mode does not yet expose _decode_unsafe (compiled f._reader closures capture handler.decode by value, so a runtime swap wouldn't reach them); tracked in 58u.