The interaction between source and replicas is directional. Property changes and signal emission happen on the source, and are propagated to all replicas. If a property is writable, you can call the setter function on a replica, which is then forwarded to the source. Afterwards, if this call results in a new property value, that value is first changed at the source and then subsequently forwarded to all replicas. To the replica, it is then an asynchronous call, with latency before the change takes effect.
While technically you can emit a signal on a replica, this is discouraged as it may have unexpected results. It will only trigger slots connected to the replica itself; not slots connected to the source or other replicas. Like property setters, slot invocations on a replica are forwarded to the source to run.
Qt Remote Objects automatically implements the behavior described above. There is no need to write any replica implementation code. For dynamic replicas, this is handled automatically at runtime. For repc generated headers, this is handled at compile time.