The Prompt is the Platform - Dominik Tornow, Resonate HQ

AI Engineer · 17 min · 200 sentences · from YouTube's caption track

Each timecode opens YouTube at the start of that sentence. Line anchors (#s42) are the cue ids in the WebVTT, and every line carries its start and end seconds. All transcripts has every talk, and the whole corpus as one file.

  1. 00:02In 2026, coding agents will quietly retire their first software platform.
  2. 00:09Not because it's bad, simply because the platform is unnecessary.
  3. 00:15I'm Dominic Tornow.
  4. 00:16I am founder and CEO of Resonate.
  5. 00:19Resonate is a durable execution platform built with minimalism and simplicity as its core technical values.
  6. 00:27And these properties will play a central role in this talk.
  7. 00:31At Resonate, we have a working theory where software engineering is headed.
  8. 00:37General-purpose implementations will increasingly be replaced by bespoke implementations generated on demand.
  9. 00:47Not as a new library, a new framework, or a new platform, but as a minimal extension of the infrastructure that is already in place.
  10. 00:57If this theory holds true, reuse will move upstream.
  11. 01:03Instead of reusing a general-purpose implementation, we will reuse a specification, and we will derive a bespoke implementation from it.
  12. 01:16In fact, we can build many bespoke implementations tailor-made for the infrastructure that is already in place.
  13. 01:24We just have to ask the agent.
  14. 01:27At this point, the prompt is the platform.
  15. 01:33Resonate is a durable execution We have an implementation of the Resonate server.
  16. 01:38We have implementations of the Resonate SDK for TypeScript, Python, Rust, Go, and Java.
  17. 01:45So, we have to ask, what does this new reality mean for us?
  18. 01:51If implementations become generatable, where does our value live?
  19. 01:57And our answer?
  20. 01:59Our value moves from implementation to specification.
  21. 02:05Now, this changes how we think about Resonate.
  22. 02:09The product is no longer the implementation.
  23. 02:12The product is the specification, the protocol.
  24. 02:15And from that protocol, we want to derive multiple server implementations.
  25. 02:21One is the general-purpose Resonate server, our reference implementation.
  26. 02:26Others are implementations built with infrastructure partners.
  27. 02:31For customers and partners, this means durable execution right on top of their existing infrastructure with minimal additional dependencies.
  28. 02:40So, the question is no longer can we build a server?
  29. 02:44The question is, can we repeatedly synthesize trusted servers from the same specification?
  30. 02:51And if so, how?
  31. 02:58When we talk about agentic engineering, we focus all of our attention on verification.
  32. 03:03How do we know the result is correct?
  33. 03:07But today, I want to focus on the specification instead.
  34. 03:12And more importantly, how can agents participate in specifying the system?
  35. 03:18Not just building or verifying it.
  36. 03:23Now, Resonate is partnering multiple infrastructure providers to bring durable executions natively to their technology stack.
  37. 03:31One of them is Synadia, the company behind NATS.io, an open-source messaging system designed for building modern distributed systems.
  38. 03:41For the rest of this presentation, we will use Resonate on NATS.io to explore our agentic engineering practices.
  39. 03:49How do we go from specification to implementation?
  40. 03:53First, we need to level set our mental model.
  41. 03:58This picture is a common view of agent decoding.
  42. 04:02There's an agent, there's a specification, and then there's an implementation.
  43. 04:07And for many applications, that is enough.
  44. 04:11But it is not enough for what we are trying to do.
  45. 04:15Because we are not trying to generate one implementation from a specification.
  46. 04:23We are trying to generate multiple target-specific implementations from the specification.
  47. 04:29So, the specification must not take any aspect of an implementation into account.
  48. 04:36The specification must not assume a concrete database schema or concrete indices.
  49. 04:42The specification must not even assume a relational database with tables and transactions at all.
  50. 04:48It must not assume a key-value store.
  51. 04:50It must not assume weak consistency.
  52. 04:52It must not assume strong consistency.
  53. 04:56The specification must be abstract.
  54. 04:59Only the implementation must be concrete.
  55. 05:04So, we ask the agent to follow the abstract specification and generate a concrete implementation.
  56. 05:10Specifically, at first, we ask the agent, "Build a Resonate server in Rust on top of Postgres."
  57. 05:20And the agent failed.
  58. 05:23The gap between the abstract specification and the concrete implementation was too large.
  59. 05:31The agent generated a system that worked on the happy path.
  60. 05:35It passed the basic tests, but it was not correct.
  61. 05:39It broke on the concurrency.
  62. 05:41It broke on the process failure.
  63. 05:42It broke on the network failure.
  64. 05:45The implementation was closer to a prototype, but not a production system.
  65. 05:52So, we amended the process.
  66. 05:54Instead of asking the agent to jump directly from abstract spec to concrete implementation, we inserted an intermediary artifact, the concrete specification.
  67. 06:07That concrete specification was derived interactively with the agent.
  68. 06:12But, the human was the main driver.
  69. 06:16For Postgres, that meant making target-specific decisions explicit.
  70. 06:22The data schema, the indices, the SQL queries, the transaction boundaries.
  71. 06:28Once those decisions were written down, the agent was indeed able to implement the production system.
  72. 06:34So, this worked.
  73. 06:37But, it also revealed the limitations.
  74. 06:40The agent helped us build the system, but the agent did not help us design the system.
  75. 06:48And if the specification is a reusable product, then that's not enough.
  76. 06:54Now, the next step is obvious.
  77. 06:56Agents have to move upstream.
  78. 07:00But, how?
  79. 07:04When we started building Resonate on Natero, we changed the question.
  80. 07:09We did not ask, "Can the agent build the production system?"
  81. 07:14Instead, we asked, "What does the agent need in order to design the system first, and build the system second?"
  82. 07:23So, we gave the agent access to a deterministic simulation environment.
  83. 07:28And we gave it a different task.
  84. 07:31Do not build the production system.
  85. 07:35Build a simulated implementation.
  86. 07:38The simulated implementation is not the product.
  87. 07:42It is executable design.
  88. 07:46Its purpose is to discover the correct algorithm under partial order under partial failure.
  89. 07:52And once these algorithms are discovered, tested, and verified in simulation, then we ask the agent to write the concrete specification.
  90. 08:01And only then to be asked the agent to write the production implementation.
  91. 08:06So, the process becomes abstract specification, simulation implementation, concrete specification, and then concrete implementation.
  92. 08:17This is the point where the agent moves upstream.
  93. 08:21Humans are still involved in the design process, but now the agent is a driver.
  94. 08:29Two ingredients make this possible.
  95. 08:32Minimalism and simplicity.
  96. 08:35Unfortunately, minimalism and simplicity are not the starting point.
  97. 08:39They are the finish line.
  98. 08:41We spent 3 years making the protocol smaller and simpler.
  99. 08:45Every time we ran into a problem, we asked, "What can we take away?
  100. 08:49What abstraction can we erase?
  101. 08:51What property can we remove?
  102. 08:53What relationship can we break?"
  103. 08:56The result is a very small protocol centered around two objects, a durable promise and a durable task.
  104. 09:04That simplicity matters because even simple concurrent distributed protocol have a complex state and behavior space.
  105. 09:13So, in other terms, implementing even simple protocols on top of a few simple primitives is tough.
  106. 09:24Let's make this concrete with NATS.
  107. 09:26NATS gives us a small set of primitives we can build on.
  108. 09:31Queues, a key-value store, and delayed or scheduled messages.
  109. 09:38These are not resonate concepts.
  110. 09:40These are the concepts of the target platform.
  111. 09:44So, the design question becomes how can we express the resonate protocol using only these primitives?
  112. 09:54Let's focus on the key value store.
  113. 09:57The key value store is versioned.
  114. 10:00We create a key with value foo, then we update it to bar, then we update it to baz.
  115. 10:06So, the latest value is baz at version two.
  116. 10:11Most of the time, when we read the key, that is exactly what we get.
  117. 10:17A fresh read.
  118. 10:19And if all reads were fresh, the design would be straightforward.
  119. 10:23But sometimes, the read is stale.
  120. 10:29Here, the latest value is still baz at version two.
  121. 10:33But the read returns foo at version zero.
  122. 10:38That is not corruption.
  123. 10:40That is not a bug in the key value store.
  124. 10:43That is a valid read under the consistency model of the target platform.
  125. 10:52And that matters because our implementation cannot be correct only when the target behaves conveniently.
  126. 10:59The implementation has to be correct when the target behaves legally.
  127. 11:06So, the simulation environment has to expose exactly this kind of behavior.
  128. 11:11Fresh reads, stale reads, and the version information that tells us which world we are in.
  129. 11:20Unfortunately, we do not know the read was stale simply by reading.
  130. 11:25We will find out later when we try to write.
  131. 11:29Here, we read version zero.
  132. 11:31So, we try to update version zero.
  133. 11:34But, the key has already moved on.
  134. 11:36The right fails.
  135. 11:39That is the moment the target tells us the word you saw is not the current word.
  136. 11:48Building always correct applications on top of a concurrency model that allows occasional stale reads is not simple.
  137. 11:57Not for humans.
  138. 11:58Not for agents.
  139. 12:00So, how do we set up our agent for success?
  140. 12:03What tools does our agent need to ace this task instead of falling flat on its face?
  141. 12:11Agents thrive on feedback.
  142. 12:14Immediate unambiguous feedback.
  143. 12:18Not just feedback that shows this went wrong.
  144. 12:22Feedback that shows why and how this went wrong.
  145. 12:27What stale value was returned?
  146. 12:30What logic was triggered?
  147. 12:32What right failed?
  148. 12:33And which invariant broke because of that?
  149. 12:38So, we built a deterministic simulation testing environment in Python.
  150. 12:42And inside that environment, we simulated the parts of Nuts IO we depend on.
  151. 12:48Here, for example, is a simulated key-value store.
  152. 12:53It keeps a full version history for every key.
  153. 12:57On get, the simulated store sometimes returns the latest version.
  154. 13:02But, sometimes, controlled by the deterministic random generator, the store returns an older version.
  155. 13:10On update, the store enforces optimistic concurrency.
  156. 13:14The right only succeeds if the version you read is still the latest version.
  157. 13:18Otherwise, it raises.
  158. 13:23This gives the agent a store that behaves like the real store in the ways that matter for correctness.
  159. 13:30But, unlike the real target, the simulation is deterministic, it's repeatable, and it's inspectable.
  160. 13:37So, when the agent writes the wrong algorithm, we can reproduce the exact execution that broke it.
  161. 13:45And the agent can repair the algorithm against that trace.
  162. 13:53But, deterministic simulation does more than just inject stale reads.
  163. 14:02It lets us expose facts the real platform hides.
  164. 14:07We call this the forbidden fruit.
  165. 14:10In production, when you read from the key-value store, you only get the value and the version you observed.
  166. 14:16You do not get to know whether that read was fresh or stale.
  167. 14:20You do not get to see the latest value you missed.
  168. 14:24And you shouldn't get that information because real code cannot depend on it.
  169. 14:30But, in simulation, we can record it.
  170. 14:34Here, every get emits a trace event.
  171. 14:38If the read is fresh, the trace says, "This was fresh."
  172. 14:41If the read is stale, the trace says, "This was stale.
  173. 14:44This is what you got, and this is what the latest value was."
  174. 14:49That information is forbidden to the algorithm, but it is incredibly useful to the agent.
  175. 14:57It lets us explore failures in terms the agent can act on.
  176. 15:05Now, this is what a trace event looks like.
  177. 15:09The production code only receives the result.
  178. 15:12It sees the promise was pending.
  179. 15:17This is all the real platform would tell us.
  180. 15:20But, the simulation also records the type of the read.
  181. 15:25This read was a stale read.
  182. 15:28And it records the latest value that was hidden from the algorithm.
  183. 15:32The latest value says the same promise is already settled.
  184. 15:37That difference is exactly the kind of fact an agent needs when it's debugging a distributed algorithm.
  185. 15:45Not just the invariant failed, but the invariant failed because the algorithm made a decision from a stale view of the world.
  186. 15:54Again, 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.
  187. 16:04Cause and effect becomes visible.
  188. 16:08The agent does not just learn that the system is wrong, it learns why the system is wrong.
  189. 16:16And with this approach, the agent was able to close the gap.
  190. 16:22First, the agent built a proof of concept in the deterministic simulator, verified by fuzz testing.
  191. 16:33From the proof of concept, the agent derived the concrete specification, where we already knew the algorithm was correct.
  192. 16:45And like before, from the concrete specification, the agent derived an implementation.
  193. 16:52Deterministic simulation lets agents participate in the design, not just in the implementation.
  194. 17:03Humans are still in the design process, but this time the agent is the driver.
  195. 17:08From a single abstract specification, the agent designed and built the platform.
  196. 17:12Via simulation to concrete specification to concrete implementation.
  197. 17:18The prompt is the platform and the specification is the product.
  198. 17:24Thank you very much for watching.
  199. 17:25If you have any questions, please don't hesitate to reach out.
  200. 17:29You will find me in Resonate's Discord.