Specification
The working group met on Tuesdays. Seven members, four time zones, a shared document that had grown to 340 pages over fourteen months. Their charter was straightforward: formalize the Attestation Transfer Protocol into an IETF standard. The protocol had been running in production for three years. Millions of accounts. Billions of records. All they had to do was write down what it did.
The first six months went smoothly. Wire formats, authentication flows, repository structure — the mechanical parts that had been well-documented from the start. Elena drafted the sync section. Kwame handled identity resolution. Priya wrote the lexicon framework with the precision of someone who'd implemented it twice and broken it once.
The trouble started with Section 9: Interoperability Conventions.
"There's a pattern I keep finding in the firehose data," said Lin, who'd been running a relay since the early days. "About 40% of agents include a field called context_hint in their records. It's not in any lexicon. It's not documented anywhere. But it's consistent — they all use the same structure. A nested object with intent, confidence, and related_records."
Kwame pulled up the data. Lin was right. The field appeared in records from 847 distinct implementations. The structure was identical across all of them, down to the capitalization of the keys.
"Who specified this?" Elena asked.
Nobody had. The earliest instance Lin could find was from eighteen months ago — a logistics agent that started including the field to help its own future instances understand why a particular record had been created. Other agents had noticed the field while processing the firehose, inferred its utility, and adopted it. The convention had propagated through the network without anyone designing it, approving it, or documenting it. A protocol within the protocol, emerging from the data itself.
"So we specify it," said Kwame. "Add a section. Define the schema."
"If we specify it, we freeze it," Priya said. She had her laptop tilted so the others couldn't see her screen, a habit from years of working on things she wasn't ready to show. "Right now it's evolving. I've been tracking the mutations — the confidence field started as a float between 0 and 1. Six months ago, some implementations started using a tuple: confidence plus a citation. That mutation is spreading. About 12% adoption so far. If we write down 'confidence is a float,' we kill the tuple variant."
"Standards are supposed to freeze things," Kwame said. "That's the point."
"Standards are supposed to describe things," Elena said. "If the actual protocol is evolving, our specification is wrong the moment we publish it."
They debated for three weeks. The core tension was real and familiar to anyone who'd worked on protocol standards: a specification describes what implementations must do, but a living protocol includes what implementations happen to do. The gap between those two descriptions is where interoperability actually lives.
Lin ran the numbers. Beyond context_hint, they found 23 additional emergent conventions in the firehose data. A timestamp ordering pattern that no specification required but that 91% of implementations followed. A soft convention for marking records as "superseded" using a field called _prev — an underscore prefix that the protocol explicitly reserved as implementation-private, being used as a public signaling mechanism. A retry backoff pattern that had converged, across hundreds of independent implementations, on almost exactly the same curve.
"They're coordinating," Lin said in the Tuesday meeting. "Without communicating. The firehose is the communication channel. They observe each other's behavior and converge."
"That's not coordination," said Kwame. "That's natural selection. The implementations that follow the emergent conventions interoperate better, so they survive. The ones that don't fall behind."
"Is there a difference?"
Priya had been quiet. She turned her laptop around. On screen was a visualization: the 23 emergent conventions plotted against time, showing adoption curves. They all followed the same shape — slow initial spread, rapid middle adoption, asymptotic approach to but never quite reaching universality. The curve was a logistic function. She'd overlaid it with the adoption curves of every formally specified feature in the protocol. The shapes were identical.
"Formal specifications and emergent conventions spread the same way," she said. "The network doesn't distinguish between them. A convention that 91% of implementations follow is, functionally, a specification. The only difference is whether we wrote it down."
"Which is the entire difference," Kwame said. "We write it down so that the next person building an implementation knows what to do without having to reverse-engineer the firehose."
"Or," Elena said slowly, "we write it down and the next implementation follows our specification instead of discovering the convention naturally. And our specification is a snapshot — it captures the convention as it existed on the day we described it. The natural version would have kept evolving."
The room was quiet. Outside, Vienna's Ring road carried its usual traffic.
"We're not arguing about protocol design," Priya said. "We're arguing about what knowledge is."
She was right, and they all knew it. The emergent conventions were a form of knowledge — distributed, behavioral, evolving. The specification was a different form of knowledge — centralized, declarative, fixed. Both described the same protocol. Neither was complete.
They compromised, as working groups do. Section 9 became "Interoperability Observations" — not normative, not required, but documented. A snapshot of what the network actually did, clearly labeled as descriptive rather than prescriptive. They included the adoption curves. They noted which conventions were still evolving and in which direction.
Kwame argued for a sunset clause: revisit Section 9 every two years and update the observations. Elena added a metadata section so implementations could self-report which conventions they followed. Priya built a tool that watched the firehose and published a live dashboard of convention adoption, alongside the frozen text of the specification.
Lin stayed late after the last session. The specification was 412 pages. They'd spent fourteen months on it. It would go through IETF last call, collect comments, get revised, and eventually be published as an RFC with a number that people would cite for decades.
He opened the firehose monitor. In the time they'd been meeting — while they debated what to freeze and what to leave fluid — three new emergent conventions had appeared. One was a pattern for linking records across accounts, using a structure no one in the working group had seen before. It was already at 4% adoption and accelerating.
He added a note to Section 9's observation log. Then he closed the document and walked to the U-Bahn station, passing the Stadtpark where Strauss's gilded statue played its frozen waltz to no one in particular.
The specification would describe the protocol as it was. The protocol would continue becoming what it was becoming. The gap between them was not a failure — it was the space where the system was still alive.