Skip to content
About
Main content

Time gap, back-channel, and who pays

Which variable organizes every interface mechanism, and why does cost move to the other party?

The organizing variable: time gap and back-channel

This mechanism has three families of interface. They are three positions on one variable: how much time separates the from the , and whether the consumer can answer back.

Time gapConsequence
File formatsUnbounded: the writer may be goneNoneEverything needed to read the bytes must travel with the bytes, or live in a agreed in advance
Access protocolsShort, interactiveFullMeaning can be negotiated live, so the contract moves from the data to the conversation. Errors, limits and capabilities become part of the contract
Integration patternsRepeated, indefiniteExists, but the relationship outlives any single conversationThe position must be stored as durable state (, , high-watermarks), because neither side can remember it in memory

One line rebuilds why each family looks the way it does: no back-channel, then a back-channel, then a back-channel plus memory.

  • Self-description is mandatory in the first family (nobody can ask).
  • It is optional in the second (you can ask).
  • It is irrelevant in the third, where the hard problem is instead resumability: starting again from where you stopped.

Who pays: cost moves to the other party

In earlier mechanisms, cost could move between time, space, energy, money and complexity. At a boundary there is a new place to move it: onto the other party. This is the signature move of this whole mechanism. Examples we will meet:

  • Schema-on-write (check and fix the data when writing) charges the producer once. Schema-on-read (accept anything, interpret when reading) charges every consumer, forever.
  • Pagination pushes state to whichever side holds the cursor.
  • moves computation to the party that holds the data.
  • versus (explained in Integration patterns) is, without the vocabulary, an argument about which organization's budget pays for the transformation.

This gives two useful questions a sharp answer at a boundary:

  1. What does an interface assume that it cannot verify? That the other side reads the bytes the way you do: the same rules for values, decimal versus floating point, character encoding, timestamp meaning, and what an empty string means.
  2. Who pays when it breaks? Not the producer. The producer ships. The consumer finds the problem months later, at read time.

Three principles this mechanism adds

Principle A: At a boundary, no change is atomic. Every change to an interface becomes a migration, with a required interval in which both the old and the new contract must work at the same time (). So the cost of an interface is paid at change time, not at design time. That is why interfaces are chronically under-priced when they are chosen.

Principle B: Adoption is a resource, and it compounds. An interface's fitness is set by the size of its reader population, not by its technical properties. So inferior formats win and stay won. The derived mechanism is the compatibility layer: speaking someone else's protocol is often worth more than designing a better one.

Principle C: A boundary gives work to the party with less power to refuse. "Costs are conserved" says a cost only moves; this says which way. The direction of the move is predicted by who has less power to refuse, not by efficiency. The examples in this mechanism:

ExampleWho is chargedWhy they cannot refuse
Schema-on-readEvery consumerThey have no say in what the producer wrote
Caller-specified queries ()The serverIt does not know in advance what it will be asked
The receiver, who must be The producer decides to
A production databaseIt did not choose to be queried
A destination that rate-limits youIt rate-limits because it is defending itself

This is what makes interfaces an organizational topic, not only a technical one: interface design is usually a negotiation about budgets, wearing a technical costume.