v4.3.1
Patch release. The reason to cut it is the CFrame fix: until now a rotation was invisible to BloxForge.
Fixed
A CFrame no longer loses its orientation on the way out. Three read paths reduced it to a position and reported success — mass_get_property/get_attributes answered {"_type":"CFrame","Position":{...}}, get_node_batch answered three numbers byte-identical to that position, and the change fingerprint behind get_changes_since hashed only cf.Position. Verified live: rotating a part from Orientation [20.7,49.1,82.2] to [0,90,0] with its position untouched produced "changed":[] and changedCount: 0 — a visible edit the changefeed could not see at all. Of every type this serializer handles, CFrame was the only one that looked like a complete structured read while half the value was gone.
A serialized CFrame can now be written back. Neither the attribute path nor the property path had a CFrame branch, so the tagged table fell through and was stored as a table.
Added
npm run protocol:compat-check. From MCP revision 2026-07-28 the tool set "MUST NOT vary per-connection or as a side effect of other requests on the connection" — both of which load_toolset does. Every revision the pinned SDK can negotiate is 2025-11-25 or earlier, all of which permit it, so 4.3.1 is compliant with everything it can actually speak. The check fails the build the moment an SDK bump makes a forbidding revision negotiable, so the conflict cannot arrive silently.
Changed
load_toolset says when to switch toolsets. Tool definitions sit at the top of the prompt-cache hierarchy — above system and messages — so changing them invalidates the cached prefix for the entire conversation, not only the schemas that moved. 4.3.0 shipped unload without that caveat, which made churn look free. Switch at phase boundaries, not per call.
The network-effects audit stopped under-counting its own reach. A bare fetch( was not a recognized client, delegation through this.x() was not followed, and five tools with template-literal names were invisible to it. No effect was ever mis-declared — what was wrong is that the audit reported coverage it did not have. 12 → 14 checked, plus a check from the method end that catches definitions the tool-end scan cannot enumerate.
Removed
The ROADMAP-RESEARCH-* working notes are no longer tracked.
Full changelog: v4.3.0...v4.3.1