Offsetting the time based on latency isn’t enough to keep the platforms synchronized. Based Movement is sent as a relative position/rotation, not absolute. The Server and Client will ultimately be simulating the rotation of the platform at different delta times (less obvious when you’re testing on the same machine), so when the Server receives an RPC for the Character Movement, it is 99% likely that the platform will still be at a slightly different rotation there than on the client.
Character Movement would suffer the same issue - but doesn’t because the Server actually doesn’t run any simulation on the client between packets. When it receives a packet from the client, delta time is computed from the time the last packet was received and that’s when it updates movement. This ensures that Client and Server simulate movement with the same delta time over the course of multiple frames. It also does some complex timestamp synchronization which prevents the client from artificially sending huge deltas for speed-hacking.