Markdown source

Transcript: The Prompt is the Platform - Dominik Tornow, Resonate HQ

Source Video

Local Cache

Transcript

In 2026, coding agents will quietly retire their first software platform. Not because it's bad, simply because the platform is unnecessary. I am Dominic Turno. I am founder and CEO of Resonate. Resonate is a durable execution platform built with minimalism and simplicity as its core technical values. And these properties will play a central role in this talk. At Resonate, we have a working theory where software engineering is headed. General purpose implementations will increasingly be replaced by bespoke implementations generated on demand, not as a new library, a new framework, or a new platform, but as a minimal extension of the infrastructure that is already in place. If this theory holds true, reuse will move upstream.

Instead of reusing a general purpose implementation, we will reuse a specification and we will derive a bespoke implementation from it. In fact, we can build many bespoke implementations tailor made for the infrastructure that is already in place. We just have to ask the agent. At this point, the prompt is a platform. Resonate is a dual execution platform. We have an implementation of the Resonate server. We have implementations of the Resonate SDK for TypeScript, Python, Rust, Go, and Java. So, we have to ask what does this new reality mean for us? If implementations become generatable, where does our value live? And our answer, our value moves from implementation to specification.

Now this changes how we think about Resonate. The product is no longer the implementation. The product is the specification, the protocol. And from that protocol, we want to derive multiple server implementations. One is a general purpose resonate server, our reference implementation. Others are implementations built with infrastructure partners. For customers and partners, this means durable execution right on top of their existing infrastructure with minimal additional dependencies. So the question is no longer can we build a server. The question is can we repeatedly synthesize trusted servers from the same specification and if so how? When we talk about agentic engineering we focus all of our attention on verification. How do we know the result is correct?

But today I want to focus on the specification instead and more importantly how can agents participate in specifying the system not just building or verifying it. Now Resonate is partnering with multiple infrastructure providers to bring durable executions natively to their technology stack. One of them is Senadia the company behind Nats.io IO, an open-source messaging system designed for building modern distributed systems. For the rest of this presentation, we will use Resonate on Nats.io to explore our agentic engineering practices. How do we go from specification to implementation? First, we need to level set our mental model. This picture is a common view of agent decoding. There's an agent.

There's a specification and then there's an implementation and for many applications that is enough but it is not enough for what we are trying to do because we are not trying to generate one implementation from a specification. We are trying to generate multiple target specific implementations from the specification. So the specification must not take any aspect of an implementation into account. The specification must not assume a concrete database schema or concrete indices. The specification must not even assume a relational database with tables and transactions at all. It must not assume a key value store. It must not assume weak consistency. It must not assume strong consistency. The specification must be abstract.

only the implementation must be concrete. So we ask the agent to follow the abstract specification and generate a concrete implementation. Specifically at first we ask the agent build a resonate server in rust on top of posgress and the agent failed. The gap between the abstract specification and the concrete implementation was too large. The agent generated a system that worked on the happy path. It passed the basic tests, but it was not correct. It broke on the concurrency. It broke on the process failure. It broke on the network failure. The implementation was closer to a prototype, but not a production system. So we amended the process.

Instead of asking the agent to jump directly from abstract spec to concrete implementation, we inserted an intermediary artifact, the concrete specification. That concrete specification was derived interactively with the agent. But the human was the main driver. For Postgress that meant making target specific decisions explicit, the data schema, the indices, the SQL queries, the transaction boundaries. Once those decisions were written down, the agent was indeed able to implement the production system. So this worked, but it also revealed the limitations. The agent helped us build the system, but the agent did not help us design the system. And if the specification is a reusable product, then that's not enough. Now the next step is obvious.

Agents have to move upstream. But how? When we started building Resonate on Natio, we changed the question. We did not ask can the agent build the production system. Instead we ask what does the agent need in order to design the system first and build the system second. So we gave the agent access to a deterministic simulation environment. And we gave it a different task. Do not build the production system. Build a simulated implementation. The simulated implementation is not the product. It is executable design. Its purpose is to discover the correct algorithm under partial order under partial failure.

And once these algorithms are discovered, tested and verified in simulation, then we ask the agent to write the concrete specification. And only then do we ask the agent to write the production implementation. So the process becomes abstract specification, simulation implementation, concrete specification and then concrete implementation. This is a point where the agent moves upstream. Humans are still involved in the design process, but now the agent is a driver. Two ingredients make this possible. Minimalism and simplicity. Unfortunately, minimalism and simplicity are not the starting point. They are the finish line. We spent three years making the protocol smaller and simpler. Every time we ran into a problem, we ask, "What can we take away?

What abstraction can we erase? What property can we remove? What relationship can we break?" The result is a very small protocol centered around two objects, a durable promise and a durable task. That simplicity matters because even simple concurrent distributed protocol have a complex state and behavior space. So in other terms, implementing even simple protocols on top of a few simple primitives is tough. Let's make this concrete with nats.nats NATS gives us a small set of primitives we can build on cues, a key value store and delayed or scheduled messages. These are not resonate concepts. These are the concepts of the target platform.

So the design question becomes how can we express the resonate protocol using only these primitives? Let's focus on the key value store. The key value store is versioned. We create a key with value fu. Then we update it to bar. Then we update it to bass. So the latest value is bass at version two. Most of the time when we read the key that is exactly what we get, a fresh read. And if all reads were fresh, the design would be straightforward. But sometimes the read is stale. Here the latest value is still bass at version two. But the read returns fu at version zero. That is not corruption.

That is not a bug in the key value store. That is a valid read under the consistency model of the target platform. And that matters because our implementation cannot be correct only when the target behaves conveniently. The implementation has to be correct when the target behaves legally. So the simulation environment has to expose exactly this kind of behavior. Fresh reads, stale reads, and the version information that tells us which world we are in. Unfortunately, we do not know the read was stale simply by reading. We will find out later when we try to write here. We read version zero. So, we try to update version zero. But the key has already moved on.

The right fails. That is the moment the target tells us the world you saw is not the current world. Building always correct applications on top of a concurrency model that allows occasional stale reads is not simple. Not for humans, not for agents. So how do we set up our agent for success? What tools does our agent need to ace this task instead of falling flat on its face? Agents thrive on feedback. immediate unambiguous feedback. Not just feedback that shows this went wrong. Feedback that shows why and how this went wrong. What stale value was returned? What logic was triggered, what right failed and which invariant broke because of that.

So we built a deterministic simulation testing environment in Python and inside that environment we simulated the parts of nuts io we depend on. Here for example is the simulated key value store. It keeps a full version history for every key on get the simulated store sometimes return the latest version. But sometimes controlled by the deterministic random generator the store returns an older version. On update the store enforces optimistic concurrency. The right only succeeds if the version you read is still the latest version otherwise it raises. This gives the agent a store that behaves like the real store in the ways that matter for correctness.

But unlike the real target, the simulation is deterministic, it's repeatable, and it's inspectable. So when the agent writes the wrong algorithm, we can reproduce the exact execution that broke it and the agent can repair the algorithm against that trace. But deterministic simulation does more than just inject stale reads. It lets us expose facts the real platform hides. We call this the forbidden fruit. In production, when you read from the key value store, you only get the value in the version you observed. You do not get to know whether that read was fresh or stale.

You do not get to see the latest value you missed and you shouldn't get that information because real code cannot depend on it. But in simulation we can record it. Here every get emits a trace event. If the read is fresh the trace says this was fresh. If the read is stale the trace says this was stale. this is what you got and this is what the latest value was. That information is forbidden to the algorithm, but it is incredibly useful to the agent. It lets us explore failures in terms the agent can act on. Now, this is what a trace event looks like. The production code only receives the result.

It sees the promise was pending. This is all the real platform would tell us. But the simulation also records the type of the read. This read was a stale read. And it records the latest value that was hidden from the algorithm. The latest value says the same promise is already settled. That difference is exactly the kind of fact an agent needs when it's debugging a distributed algorithm. Not just the invariant failed, but the invariant failed because the algorithm made a decision from a stale view of the world. Again, the algorithm is not allowed to depend on this information, but the agent is allowed to use it to explain why the algorithm it designed was wrong.

Cause and effect becomes visible. The agent does not just learn that the system is wrong. It learns why the system is wrong. And with this approach, the agent was able to close the gap. First, the agent built a proof of concept in the deterministic simulator verified by first testing. From the proof of concept, the agent derived a concrete specification where we already knew the algorithm was correct. And like before, from the concrete specification, the agent derived an implementation. Deterministic simulation lets agents participate in the design, not just in the implementation. Humans are still in the design process, but this time the agent is the driver.

From a single abstract specification, the agent designed and built the platform via simulation to concrete specification to concrete implementation. The prompt is a platform and the specification is a product. Thank you very much for watching. If you have any questions, please don't hesitate to reach out. You will find me in resonates discord.