Before replacing or deleting a file, the server re-reads the live file: an agent whose session read an older revision is refused with STALE_CONTEXT, one that never read it with BASELINE_REQUIRED, and nothing is written. On a project whose source authority is SyncNow, the change is also detected and reported as OUT_OF_BAND_DRIFT.
On those projects SyncNow periodically compares the hosting with the last deployed version, and sooner after writes made through SyncNow. A difference it cannot explain becomes an OUT_OF_BAND_DRIFT event, agents working on the project receive it as a live update, and writes or deploys touching those files are refused until someone decides. To decide, someone looks at the difference with import_preview, then the owner or a manager imports it into the repository with a written reason, or the canonical version is restored on the hosting and read back to verify it.
Drift on other files does not block a write: the agent only gets a drift_warning. In Activity the detection is an entry of its own, Changes made outside SyncNow detected on the hosting, with the type System, shown in the default Relevant activity view. recent_changes lists only changes made through SyncNow, so an empty answer there proves nothing about edits made by FTP or by the site itself.