The core idea is that you create a "capability" for any action you want to track, such as using IO, allocating memory, or in your example making cross core or cross server calls. Now to perform these actions code has to have access to the capability. It's a very simple, but powerful, model.
The Effekt language formalizes this, and adds safety properties: https://effekt-lang.org/ Scala 3 also has this.
The papers are pretty readable, if you ignore the middle bits which go into the formal models.