14 KiB
Why
The genesis bitpacker at packages/primitives/bitpacker is a cut-down greenfield build (~20 files) that lacks the schema-driven packing system, advanced strategies, streaming, delta encoding, game-state schemas, and enterprise hardening present in suaveplan's 400-file implementation. Rather than dumping all 400 files into a single monolithic package, we need a modular architecture where the core is lightweight and every advanced feature is an independently versioned, opt-in plugin.
What Changes
- Create
packages/bitpacker/parent directory as the home for all bitpacker-related workspace packages. - Move core bitpacker from
packages/primitives/bitpacker/topackages/bitpacker/bitpacker/. - Split suaveplan's 400 files into 10 workspace packages:
@suaveplan/bitpacker— Core:BitWriter,BitReader,BitPacker,PackingStrategyManager, base types.@suaveplan/bitpacker-strategies— All built-in packing strategies (string, number, object, array, enum, datetime, varint, map, set, bitarray, blob, bitset, etc.).@suaveplan/bitpacker-schema— Schema parsing, validation, token registry, matching, versioning, visualization.@suaveplan/bitpacker-streaming— Chunked streaming encode/decode, transform streams.@suaveplan/bitpacker-delta— Delta manager, XOR encoder, string diff, number XOR, field-level delta.@suaveplan/bitpacker-game— Game state schemas, quantization, prediction, interpolation, reconciliation, state manager.@suaveplan/bitpacker-network— Network simulation helpers (jitter, latency, packet loss).@suaveplan/bitpacker-crypto— Checksum helpers (CRC32, Adler32, xxHash32), crypto adapters.@suaveplan/bitpacker-compressed— Compression pipeline.@suaveplan/bitpacker-validation— Safety limits, schema validation, validation reports.
- Preserve genesis additions in core:
zigzagEncode/zigzagDecode,packBits/unpackBits,peek/seekonBitReader,align()on both reader and writer. - Preserve backward compatibility where possible: existing
defineBitSchemacall sites should continue to compile. - BREAKING: Package path changes from
@suaveplan/bitpacker(implicit in primitives) to explicit@suaveplan/bitpackerunderpackages/bitpacker/bitpacker/. - BREAKING:
BitpackerErrorwill eventually extendSuaveplanError(migrated from plainError).
Parity Checklist
Legend: ✅ ported · ⚠️ partial / stub-thin / misplaced (real gap remaining) · 🚫 not ported · ⛔ intentionally not ported (decision recorded in a follow-up change).
Last verified: 2026-05-02 by side-by-side comparison of /mnt/s/web/suaveplan/packages/universal/bitpacker/src/ against packages/bitpacker/*/src/. Line counts cited are implementation files only (excluding tests).
| Capability | Upstream | Migrated | Notes |
|---|---|---|---|
BitWriter / BitReader |
✅ | ✅ | Genesis additions preserved (peek, seek, align) |
BitPacker class |
✅ | ⚠️ | Core simplified by design (1203L → 178L): no EventEmitter, no built-in delta/checksum. Documented in design.md. |
PackingStrategyManager |
✅ | ✅ | Chain-of-responsibility pattern preserved |
PackingContext |
✅ | ✅ | Uses writer/reader instead of bitOps |
| Integer packing (signed/unsigned) | ✅ | ✅ | NumberPackingStrategy |
| Fixed-point packing | ✅ | ✅ | NumberPackingStrategy |
| String packing (fixed/variable) | ✅ | ✅ | StringPackingStrategy |
| UUID packing | ✅ | ✅ | StringPackingStrategy |
| Float packing (f32/f64) | ✅ | ✅ | StringPackingStrategy |
| Boolean packing | ✅ | ✅ | BooleanPackingStrategy |
| Null packing | ✅ | ✅ | NullPackingStrategy |
| BigInt packing (i64/u64/arrays) | ✅ | ✅ | BigIntPackingStrategy |
| Object packing | ✅ | ✅ | ObjectPackingStrategy |
| Array packing (tuple + dynamic) | ✅ | ✅ | ArrayPackingStrategy |
| Enum packing | ✅ | ✅ | EnumPackingStrategy |
| Optional packing | ✅ | ✅ | OptionalPackingStrategy |
| OneOf (union) packing | ✅ | ✅ | OneOfPackingStrategy |
| Conditional packing | ✅ | ✅ | ConditionalPackingStrategy |
| Version packing | ✅ | ✅ | VersionPackingStrategy |
| DateTime packing | ✅ | ✅ | DateTimePackingStrategy (simplified) |
| VarInt packing | ✅ | ✅ | VarIntPackingStrategy |
| Map packing | ✅ | ✅ | MapPackingStrategy |
| Set packing | ✅ | ✅ | SetPackingStrategy |
| BitArray packing | ✅ | ✅ | BitArrayPackingStrategy |
| Blob packing | ✅ | ✅ | BlobPackingStrategy |
| Bitset packing | ✅ | ✅ | BitsetPackingStrategy |
| Defs / $ref packing | ✅ | ✅ | DefsPackingStrategy |
| CustomType packing | ✅ | ✅ | CustomTypePackingStrategy |
| Schema registry | ✅ | ⚠️ | bitpacker-schema/registry/registry.ts is a 50L Map wrapper; old 576L surface (InMemory + LocalStorage storage adapters, factory helpers) NOT ported |
| Schema validation | ✅ | ✅ | validateData / assertValid in bitpacker-schema; full surface in bitpacker-validation (~4249L vs old ~4250L impl) |
| Schema matching | ✅ | ✅ | Ported at bitpacker-schema/matching/matching.ts (165L → 173L) |
| Schema migration | ✅ | ✅ | Ported at bitpacker-schema/migration/migration.ts (521L → 479L, ~92%) |
| Schema versioning | ✅ | ✅ | Ported at bitpacker-schema/versioning/versioning.ts (435L → 365L, ~84%) |
| Schema visualization | ✅ | ✅ | Ported at bitpacker-schema/visualization/visualization.ts (893L → 847L, ~95%) |
| Delta manager | ✅ | ❌ | Old 269L delta-manager.ts + 149L delta-state.ts NOT ported. Genesis has only a 35L inline DeltaManager class in bitpacker-delta/index.ts using JSON.stringify + Date.now() (deterministic-clock rule violation). |
| XOR delta encoder | ✅ | ⚠️ | Ported at bitpacker-delta/xor-encoder.ts (177L → 60L, ~34%) |
| String diff delta | ✅ | ⚠️ | Ported at bitpacker-delta/string-diff.ts (226L → 113L, ~50%) |
| Number XOR delta | ✅ | ⚠️ | Old 232L number-xor.ts folded into xor-encoder.ts's numberXor export; richer surface lost |
| Game quantization | ✅ | ✅ | quantizeVector / dequantizeVector in bitpacker-game |
| Game prediction | ✅ | ✅ | All 5 files ported in bitpacker-game/prediction/ (kalman-filter, motion-math, position-predictor, prediction-algorithms, rotation-predictor + entry; 827L → 700L, ~85%) |
| Game interpolation | ✅ | ⚠️ | Ported at bitpacker-game/interpolation/interpolation.ts (745L → 447L, ~60% — significant surface trim) |
| Game reconciliation | ✅ | ✅ | Ported at bitpacker-game/reconciliation/reconciliation.ts (615L → 478L, ~78%) |
| Game state manager | ✅ | ✅ | GameStateManager in bitpacker-game |
Game bitpacker.ts enhancements |
✅ | ✅ | Ported at bitpacker-game/bitpacker/bitpacker.ts (388L → 384L) |
| Game schema-factory | ✅ | ✅ | Ported at bitpacker-game/schema-factory/schema-factory.ts (50L → 50L) |
| Network simulation | ✅ | ⚠️ | Misplaced: full 622L implementation lives at bitpacker-game/src/network/network-simulation.ts; bitpacker-network/src/index.ts is a 48L stub using module-scope Math.random() (rule violation). Needs to move to bitpacker-network and the stub deleted. |
| CRC32 checksum | ✅ | ⚠️ | Functional, but inlined into 80L bitpacker-crypto/index.ts. Old 176L crc32.ts had separate appendCrc32/verifyAndStripCrc32 helpers — only appendCrc32/verifyAndStripCrc32 survive; helper API surface is flat. |
| Adler32 checksum | ✅ | ⚠️ | Functional, but inlined into 80L bitpacker-crypto/index.ts. Old 121L adler32.ts had appendAdler32/verifyAdler32 helpers — currently no append/verify wrappers in genesis. |
| xxHash32 checksum | ✅ | ✅ | Ported at bitpacker-crypto/xxhash32.ts (re-exported from index.ts) |
| Crypto provider | ✅ | ⛔ | Replaced by Packer / Authority in restore-crypto-keychain-packer's new @suaveplan/crypto; auxiliary SchemaFingerprint + HashAlgorithmRegistry in bitpacker-crypto-rewrite (slim). |
| Crypto registry | ✅ | ⛔ | Replaced by Authority (in-memory + future HSM/TPM/threshold) in restore-crypto-keychain-packer's @suaveplan/crypto. |
| Crypto adapter — noop | ✅ | ⛔ | Replaced by @suaveplan/testing fakes against Authority; see restore-crypto-keychain-packer. |
| Crypto adapter — libsodium | ✅ | ⛔ | Underlying primitives covered by @suaveplan/crypto-sodium; opinionated layer is Packer + InMemoryAuthority in restore-crypto-keychain-packer. |
| Crypto adapter — elliptic | ✅ | ⛔ | Underlying primitives covered by @suaveplan/crypto-curve; opinionated layer is Packer + InMemoryAuthority in restore-crypto-keychain-packer. |
Streaming StreamingPacker class |
✅ | ❌ | 406L streaming/streaming.ts NOT ported. Genesis bitpacker-streaming/index.ts (87L) has only chunked helpers (packToChunks/unpackFromChunks{Async}); the top-level streaming encoder class is missing. |
| Streaming transform | ✅ | ⚠️ | Ported at bitpacker-streaming/transform/transform.ts (544L → 365L, ~67%) |
| Compression pipeline | ✅ | ❌ | bitpacker-compressed/index.ts is 61L of standalone RLE labelled "placeholder for a more sophisticated compression algorithm". Old 663L (compressed/bitpacker.ts 327 + compressed/compression.ts 336) CompressedBitPacker class NOT ported. |
| Safety limits | ✅ | ✅ | SafetyChecker in bitpacker-validation |
defineBitSchema (legacy) |
✅ | ✅ | Preserved in core for backward compatibility |
zigzagEncode/zigzagDecode |
✅ | ✅ | Preserved in core |
Iterators (pack-iterator) |
✅ | ✅ | Ported at bitpacker/src/iterators/pack-iterator/ |
| Custom-type registry | ✅ | ✅ | Ported at bitpacker/src/handlers/custom-type-registry.ts |
| Performance utilities (buffer-pool / lru-cache / monitor) | ✅ | ✅ | Ported at bitpacker/src/performance/ |
| Serialization | ✅ | ✅ | Ported at bitpacker/src/serialization/ |
Outstanding gaps (real, not parity-table-stale)
These are the items above marked ❌ or 🚫 — the work that genuinely remains:
- ~
Crypto subsystem — provider, registry, and noop / libsodium / elliptic adapters (Resolved 2026-05-02 in two parallel changes: (a)1906L total). No genesis equivalent exists. Tracked separately by thebitpacker-full-portchange; should land in a dedicatedbitpacker-crypto-portfollow-up.restore-crypto-keychain-packer— new opinionated@suaveplan/cryptolayer withPacker/Unpacker/Authority/AuditLog/RevocationList/Keychain/Vaultconsolidating the 8+ inline sign-then-pack / encrypt-pack / Merkle-log patterns. (b)bitpacker-crypto-rewrite(slim) — auxiliary bit-packer-side primitives (SchemaFingerprint,HashAlgorithmRegistry) that don't overlap (a). Decision recorded inpackages/bitpacker/bitpacker-crypto/SUPERSEDED.md. Predecessor proposalsbitpacker-crypto-portand thebitpacker-crypto-rewritefirst draft (with seven primitives) are preserved as decision-history entries. StreamingPackerclass inbitpacker-streaming— 406L upstream, currently absent.CompressedBitPackerclass inbitpacker-compressed— 663L upstream replaced by 61L placeholder RLE.DeltaManager+delta-stateinbitpacker-delta— 418L upstream replaced by a 35L inline class that violates the deterministic-clock rule.- Network-simulation misplacement — the full implementation lives in
bitpacker-game/network/;bitpacker-networkitself is a stub. SchemaRegistrystorage adapters — InMemory and LocalStorage adapter classes + factory helpers (the bulk of the 576L upstream file) not ported.
Items marked ⚠️ (XOR encoder, string diff, interpolation, transform, CRC32/Adler32 helper API) have shipped most of the upstream surface but lost some helper functions / refinements; tracked as "polish" follow-ups, not blockers.
Capabilities
New Capabilities
bitpacker: Low-level bit I/O and schema-driven packing.bitpacker-strategies: Modular packing strategies for every schema token.bitpacker-schema: Schema registry, validation, versioning, and visualization.bitpacker-streaming: Chunked and transform-stream packing/unpacking.bitpacker-delta: Delta encoding for efficient repeated state transmission.bitpacker-game: Game-specific schemas, quantization, prediction, reconciliation.bitpacker-network: Network simulation and latency/jitter helpers.bitpacker-crypto: Checksum and crypto adapter integrations.bitpacker-compressed: Compression pipeline integration.bitpacker-validation: Safety limits and runtime schema validation.
Modified Capabilities
packer: The packer package atpackages/data/packer/imports bitpacker; its imports and types may need updating to point to the new core package location.
Impact
Affected dependents
@suaveplan/crypto— importsdefineBitSchema; compiles green with new core@suaveplan/network-plugin-protocol— importsdefineBitSchema; compiles green@suaveplan/network-plugin-registry— importsdefineBitSchema; compiles green@suaveplan/packer— imports bitpacker for envelope encoding; must be verified@suaveplan/network-*— imports bitpacker for protocol encoding; must be verified@suaveplan/storage-*— imports bitpacker for payload encoding; must be verified
Breaking changes
The genesis BitWriter/BitReader/defineBitSchema API surface is preserved where possible, but:
defineBitSchemareturn type will change to match suaveplan's richerBitSchemainterface.- Error types change from plain
ErrortoBitpackerError extends SuaveplanError. - New runtime deps:
@suaveplan/schema-registry,@suaveplan/opentelemetry,@suaveplan/feature-flags.
Migration
For consumers of the genesis cut-down API:
BitWriter/BitReader— unchanged signatures, but now live under subpath imports.defineBitSchema— return type gainspack/unpackmethods and metadata; existing call sites compile without change.- Error handling — catch
BitpackerErrorinstead ofErrorfor programmatic handling.