85f0c2f0fa
Managed serializer for the historical-write "ON" buffer, byte-for-byte matching the live capture (WcfHistoricalWriteProtocolTests golden-tests the exact 56-byte native buffer). Layout: "ON"(0x4E4F) + count + lengths + 16B tag GUID + sample FILETIME + u16 quality(192) + 4B descriptor + received FILETIME + value. Value encoding (Float, captured): an 8-byte slot = u32(0) + float32(value) — the 4-byte float in the high dword, NOT a double. The 16B tag GUID is the per-tag GUID the SDK already parses as ParseTagInfoRecord's "typeId" (confirmed: it appears at offset 8 of GetTagInfosFromName's response = where typeId is read, and in EnsureTags' response + the "ON" buffer). Only the Float encoding is captured; other types rejected until captured. Next: gRPC orchestrator (write-enabled session -> EnsureTags -> resolve tag GUID -> AddStreamValues) + public AddHistoricalValuesAsync + live write/read-back. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B6mcaT2PjRFKcogzp9UkfC