<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Mark Lesly on Medium]]></title>
        <description><![CDATA[Stories by Mark Lesly on Medium]]></description>
        <link>https://medium.com/@marklesly?source=rss-18febd03a35c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*7KFblJCCRwbtU4L_.</url>
            <title>Stories by Mark Lesly on Medium</title>
            <link>https://medium.com/@marklesly?source=rss-18febd03a35c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 18:18:00 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@marklesly/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[AI as Peer, Not Controller: The Multi-Actor Execution Model]]></title>
            <link>https://medium.com/@marklesly/ai-as-peer-not-controller-the-multi-actor-execution-model-ac6e7c93927f?source=rss-18febd03a35c------2</link>
            <guid isPermaLink="false">https://medium.com/p/ac6e7c93927f</guid>
            <category><![CDATA[execution-state]]></category>
            <category><![CDATA[multi-actor-systems]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[human-in-the-loop]]></category>
            <dc:creator><![CDATA[Mark Lesly]]></dc:creator>
            <pubDate>Fri, 29 May 2026 20:49:15 GMT</pubDate>
            <atom:updated>2026-05-29T20:49:15.118Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Article 4 of 5 in a series on the execution-state continuity layer for AI-native computing.</em></p><p>There is a mental model baked into almost every AI agent built today, and it is so pervasive that most engineers never notice it is a choice. The model sits <em>on top</em> of the system. It reasons, it decides, and then it reaches <em>down</em> through a tool interface to make things happen. Shells, browsers, file systems, databases — all of them are <em>tools</em>, and the AI is the thing that calls them.</p><p>This is a powerful and correct abstraction for a specific job: <strong>tool dispatch</strong>. It is also the wrong abstraction for a different job that the industry is now backing into without a name for it — <strong>co-participation in live execution</strong>, where an AI is not the orchestrator above the machine but one actor among several attached to the same running state.</p><p>This article argues that those are two different architectural layers, that conflating them is the source of a recurring class of design pain, and that the systems converging on the second model are pointing at a category that deserves to be named explicitly.</p><h3>Two mental models, drawn out</h3><p>Start with the dominant one. In <strong>AI-on-top</strong>, the model is the controller. Everything below it is a tool it invokes, typically through a structured call protocol. The Model Context Protocol (MCP), introduced by Anthropic, is the cleanest modern expression of this: the model emits structured tool calls over a JSON-RPC transport to servers that expose capabilities, and those servers do the work and return results.</p><figure><img alt="Two mental models, drawn out" src="https://cdn-images-1.medium.com/max/1024/1*0oPgUJ7hzSauJOstqtsdjg.png" /></figure><pre>AI-ON-TOP (controller / tool-caller)<br><br>              +-------------------+<br>              |     AI MODEL      |   &lt;- decides, orchestrates<br>              |   (controller)    |<br>              +---------+---------+<br>                        | tool calls (JSON-RPC / function-call)<br>        +---------------+---------------+-------------------+<br>        v               v               v                  v<br>   +---------+     +---------+     +-----------+      +-----------+<br>   |  shell  |     | browser |     | database  |      |   MCP     |<br>   |  tool   |     |  tool   |     |   tool    |      |  server   |<br>   +---------+     +---------+     +-----------+      +-----------+</pre><pre>   Humans observe the AI; they are OUTSIDE the execution path,<br>   reading transcripts and approving/denying tool calls.</pre><p>Now the alternative. In <strong>AI-as-peer</strong>, there is a single live execution state — a running process tree, a PTY, open file descriptors, sockets — and <em>multiple actors attach to it</em>. A human at a terminal, an AI agent, a second specialized agent, a monitoring service, a device: each is an actor that observes and mutates the <em>same</em> state through the <em>same</em> interface, under the <em>same</em> rules. No actor sits above the others. No actor owns a privileged control path.</p><pre>AI-AS-PEER (one actor among many on a shared execution state)</pre><pre>   +--------+   +--------+   +---------+   +--------+   +---------+<br>   | human  |   |  AI    |   |  AI     |   | device |   | service |<br>   | client |   | agent  |   | agent#2 |   |        |   |         |<br>   +---+----+   +---+----+   +----+----+   +---+----+   +----+----+<br>       |            |             |            |             |<br>       +------------+------+------+------------+-------------+<br>                           |  (same observe/mutate interface,<br>                           |   same rules, no privileged path)<br>                  +--------v---------+<br>                  |  LIVE EXECUTION  |<br>                  |  STATE (single,  |<br>                  |  coherent object:|<br>                  |  procs/PTY/fds)  |<br>                  +------------------+</pre><p>The shift is not “the AI got weaker.” The AI is just as capable inside the box as it was on top of it. The shift is <em>where the AI lives relative to the execution boundary</em> — and that single relocation changes what the system can do.</p><h3>MCP is right — for what it is</h3><p>It is worth being precise and fair here, because the easy version of this argument is wrong. MCP and tool-calling are not mistakes to be corrected. They are the correct abstraction for connecting a reasoning model to capabilities it does not itself contain. Standardizing tool dispatch over JSON-RPC so that any model can talk to any tool server, without bespoke per-tool glue, is a genuinely good piece of systems design, and it has become an industry standard for exactly that reason.</p><p>The point is narrower and more structural: <strong>tool dispatch is orchestration, not co-participation.</strong> When a model calls a tool, the tool runs, returns a result, and the interaction is over. The model holds the thread of control; the tool is stateless from the model’s point of view and disposable from the system’s. That is precisely what you want for “fetch this row,” “render this page,” “run this command and give me stdout.”</p><p>It is <em>not</em> what you want when the question is: <em>can a human reach into the same live shell the AI is using, type a few commands, and hand control back — without restarting anything, without a separate session, without the AI and the human living on two different control paths that have to be reconciled?</em> That question is not about dispatching a tool. It is about two actors sharing one execution state. Different layer, different invariants.</p><h3>The take-over / hand-back pattern</h3><p>The cleanest litmus test for which model a system actually implements is the <strong>take-over / hand-back</strong> pattern.</p><p>Picture an agent halfway through a long migration. It has a shell open, environment variables set, a dev server running in the background, a half-applied set of changes on disk. It gets stuck. A human pauses it, types directly into <em>that same live shell</em> — fixes a broken auth token, restarts a wedged process, eyeballs the actual process tree — and then hands control back to the agent, which continues from the real, now-corrected state.</p><figure><img alt="The take-over / hand-back pattern" src="https://cdn-images-1.medium.com/max/1024/1*zmqG0oTXG_jA-89FtAwuAg.png" /></figure><p>This only works if the human and the AI are <em>peers on one execution state</em>. If the AI owns a separate control path — if its shell is “the AI’s shell” reachable only through its tool interface — then human intervention means tearing down and rebuilding, or running a parallel session and hoping the two states converge. The whole value of the intervention is that both actors mutate <em>the same</em> running object.</p><p>The industry is visibly converging on exactly this. Devin’s enterprise architecture separates a stateless model “brain” from a persistent execution sandbox (the “devbox”), and exposes that sandbox to a human for direct takeover of the <em>same</em> workspace the agent is operating in. OpenHands runs its agent against an execution server inside a container and additionally exposes a VS Code server port on that same container, so a human can attach to the live filesystem and terminal buffers when the agent gets stuck. Warp’s Agent Session Sharing publishes an agent session to a relay so that multiple participants — human and agent — can watch the same scrollback, see each other’s cursors, and concurrently type commands and steer the run.</p><p>None of these teams set out to write a manifesto about peer participation. They arrived at it because the controller-on-top model could not cleanly answer “let a human and an agent work the same live state.” That convergence is the evidence.</p><h3>The multi-actor invariants</h3><p>If you describe the peer model at the level of <em>what must be true</em> rather than <em>how to build it</em>, four invariants fall out. These are the load-bearing properties; the specific mechanisms that satisfy them are an implementation concern (and, in some systems, a patented one — not the subject of this article).</p><figure><img alt="The multi-actor invariants" src="https://cdn-images-1.medium.com/max/1024/1*H5D9Vg1GydjGkTbq_kVS7w.png" /></figure><ol><li><strong>Uniform rules across all actor inputs.</strong> A command, an edit, or an observation is governed by the same policy, permission model, and ordering discipline regardless of whether a human or an AI submitted it. There is not one rulebook for “the AI’s tool calls” and another for “the human’s keystrokes.” Inputs are inputs.</li><li><strong>No actor holds exclusive control.</strong> No participant owns a privileged path that the others must route through. The human is not a supervisor calling the AI; the AI is not a controller calling tools that humans cannot touch. Control is <em>shared</em>, which means it can be <em>handed off</em> without a state transition that any actor has to specially authorize as “now you’re in charge.”</li><li><strong>A single coherent execution state.</strong> All actors observe and mutate one canonical live state — not per-actor copies that drift and later have to be merged. The take-over / hand-back pattern is impossible the moment you have two states pretending to be one. This is the deepest of the four, and it is where most current architectures quietly fall back to the controller model.</li><li><strong>Provenance and attribution per actor.</strong> Even though the state is shared and the rules are uniform, every mutation carries the identity of the actor that produced it. You can always answer “who ran this,” “who edited that,” “which agent took this branch” — across humans and machines alike. Shared state without attribution is a forensic and safety dead end; the peer model requires both.</li></ol><p>State these as a contract and the difference from the controller model becomes mechanical rather than philosophical. The controller model satisfies <em>none</em> of them in the strong sense: rules differ between the model’s tool calls and the human’s out-of-band actions; the model holds exclusive control of its tools; there is no single shared live state (the tools are disposable); and attribution, if it exists, lives in a transcript rather than in the execution object.</p><h3>Peer participation is not agents messaging each other</h3><p>There is a second, easier-to-confuse pattern that must be ruled out: <strong>agent-to-agent messaging</strong>. Protocols in the A2A / agent-relay family standardize how separate agents pass structured messages — a planner asks an implementer to do work, an implementer asks a reviewer to check it, completion events get routed back. This is valuable and, like MCP, it is the right tool for its job.</p><p>But it is <em>message passing between separate agents, each with its own state.</em> The peer model is the opposite topology: multiple actors inside <strong>one shared execution state</strong>. The distinction is the same one that separates “two processes exchanging RPCs” from “two threads operating on shared memory.” A2A coordinates <em>distinct</em> execution contexts by relaying messages between them. Peer participation has <em>no</em> distinct contexts to relay between — the coordination happens <em>through the state itself</em>, because everyone is operating on the same object. Confusing the two leads to architectures that bolt a message bus between agents and call it collaboration, when what the take-over / hand-back pattern actually needs is a shared substrate.</p><figure><img alt="Peer participation is not agents messaging each other" src="https://cdn-images-1.medium.com/max/1024/1*SYFtgshrShFWZPF8AcRjhw.png" /></figure><pre>A2A / AGENT RELAY                 AI-AS-PEER<br>   (message passing)                 (shared execution state)</pre><pre>   [agent A]--msg--&gt;[agent B]        [A][B][human] -&gt; one live state<br>     own state        own state          (no separate states to sync)</pre><h3>Why this matters now</h3><p>Three forces make the peer model not just elegant but necessary.</p><p><strong>Human-in-the-loop at scale.</strong> As agents run for hours and take hundreds of consequential actions, “approve every tool call” does not scale and “let it run unattended” is reckless. The workable middle is <em>fluid intervention</em> — drop into the live state when something looks wrong, fix it in place, step back out. That requires peers, not a controller you can only observe through a transcript.</p><p><strong>Multi-agent plus human coordination.</strong> Once you have a planning agent, an implementation agent, a verification agent, <em>and</em> a human reviewer, the controller-on-top model has no natural seat for everyone. Who is on top? The honest answer is that nobody should be — they are all actors with different roles attached to one body of work. The shared-state model has a seat for each of them by construction.</p><p><strong>Devices and services as first-class actors.</strong> A sensor that streams readings into the state, a deployment service that mutates it on a webhook, a phone that reattaches to a session the laptop started — these are not “tools the AI calls.” They are participants with their own initiative, observing and mutating the same execution state on their own schedule. The controller model has nowhere to put an actor that <em>acts without being called</em>. The peer model treats it as just another actor.</p><h3>The historical line points here</h3><p>The lineage is consistent if you read it as a slow migration of execution state <em>out from under any single client</em>. Terminal multiplexers (screen, tmux) first let a process tree survive its terminal and accept multiple local attachments. tmate pushed those attachments across the network through a relay. Jupyter decoupled a live kernel from the notebook front-end so any client could attach to the same in-memory state. Guacamole normalized remote <em>display</em> surfaces for multiple viewers. Cloud workspaces (Gitpod, Codespaces) moved the environment off the laptop. Agent runtimes (Devin, OpenHands, Warp&#39;s cloud platform) then added autonomous actors to that picture — and immediately discovered they needed humans to be able to reach into the same live state the agent was using.</p><p>Each step loosened the assumption that one client owns the execution. The peer model is what you get when you finish the job: the execution state is the durable object, and <em>every</em> participant — human, AI, device, service — is a client that attaches to it as an equal.</p><h3>The fourth distinction, stated cleanly</h3><p>This is the fourth load-bearing edge of the execution-state-centric category:</p><blockquote><strong><em>AI as peer ≠ AI as controller / tool-caller.</em></strong><em> MCP-style tool dispatch puts the model </em>above<em> the tools and treats them as disposable. Peer participation puts the AI </em>inside<em> the same execution model as humans and devices, with equivalent observe-and-mutate rights, governed by uniform rules, with no privileged control path and per-actor provenance over a single coherent live state.</em></blockquote><p>It is a distinction about <em>position relative to the execution boundary</em>, and everything else — fluid human-in-the-loop, multi-agent coordination, devices as actors — follows from getting that position right.</p><h3>Naming the category</h3><p>The systems drifting toward this — Devin’s takeover of a shared workspace, OpenHands’ attach-to-the-container intervention, Warp’s collaborative agent sessions — are all reaching for the same architectural object: a <strong>distributed execution-state architecture</strong> in which humans, AI agents, devices, and services participate as peers in one live execution topology, rather than a stack with the AI on top calling tools below.</p><p><a href="https://cmdop.com/">cmdop</a> is built explicitly on this peer-participation model: a persistent execution state that humans and AI agents attach to as co-equal actors, governed by uniform rules with per-actor provenance, so that taking over a run and handing it back is a first-class operation rather than a workaround. It is offered here not as the point of the argument but as one reference implementation of the category the industry is converging on.</p><p>The controller-on-top model gave us tool-calling, and tool-calling is here to stay. But the question that defines the next layer is not “what can the AI call?” It is “what can the AI <em>participate in</em> — as one actor among many, on the same live state, under the same rules as everyone else?”</p><p><em>Next in the series: </em><strong><em>The Session as a Computational Primitive</em></strong><em> — the execution session as a first-class object decoupled from client, transport, and device.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ac6e7c93927f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Steered, Not Replayed: Execution Graphs vs Workflow Graphs]]></title>
            <link>https://medium.com/@marklesly/steered-not-replayed-execution-graphs-vs-workflow-graphs-82f6d1f97b09?source=rss-18febd03a35c------2</link>
            <guid isPermaLink="false">https://medium.com/p/82f6d1f97b09</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[durable-execution]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[temporal]]></category>
            <category><![CDATA[execution-state]]></category>
            <dc:creator><![CDATA[Mark Lesly]]></dc:creator>
            <pubDate>Fri, 29 May 2026 20:43:54 GMT</pubDate>
            <atom:updated>2026-05-29T20:43:54.700Z</atom:updated>
            <content:encoded><![CDATA[<h3>Steered, Not Replayed: Execution Graphs vs Workflow Graphs</h3><h3>Durable-execution engines reconstruct a logical workflow by deterministic replay. Execution-state systems maintain a live OS-level execution graph that humans and AI steer in real time. Both say ‘durable.’ They are not the same paradigm.</h3><p>There are two fundamentally different ways to make a running computation survive failure, and the industry keeps confusing them because both ship under the word <em>durable</em> and both draw something they call an <em>execution graph</em>.</p><p>The first way is <strong>replay</strong>. You record every decision and side effect a program made into an append-only journal, and when the host dies you start the program over from its entry point on a fresh worker — except the runtime feeds the journaled results back in so the re-execution lands on exactly the state it had before the crash. This is durable execution as Temporal, Cadence, Microsoft Orleans, Dapr, and Azure Durable Functions practice it. It is excellent engineering, and it is the right tool for an enormous class of problems.</p><p>The second way is <strong>steering</strong>. You do not re-derive state from a log; you maintain a <em>live</em> OS-level execution graph — a process tree with real parent/child lineage, a PTY, open file descriptors, sockets — and you keep it alive by directly observing the running system, so that interactive clients (a human, an AI agent, a monitoring service) can attach to it <em>concurrently</em> and act on it while it runs.</p><p>The first is reconstructed. The second is held. One is <strong>replayed</strong>; the other is <strong>steered</strong>. This article is about why that distinction is not pedantry — and why agentic systems are about to need the second kind whether the vocabulary exists for it or not.</p><h3>A short, fair account of durable execution by replay</h3><p>Let’s give replay-based durable execution the respectful, accurate description it deserves, because it is one of the most quietly important ideas in modern backend design.</p><p>The core problem durable execution solves is this: in an unreliable world — flaky networks, crashing nodes, downstream APIs that time out — you want to write ordinary-looking imperative code that <em>runs to completion anyway</em>. You want to write:</p><pre>chargeCard(user)<br>sleep(30 days)<br>sendRenewalReceipt(user)</pre><p>and have it be true that the charge happens once, the sleep survives a datacenter reboot, and the receipt eventually goes out — even if the machine that started the function no longer exists.</p><p>Durable-execution engines achieve this with <strong>event sourcing plus deterministic replay</strong>. The runtime does not try to serialize the language’s native thread stack or heap (the JVM, V8, and the CLR do not natively let you freeze and ship a live call stack). Instead it separates code into two roles. <em>Workflow</em> code is the orchestration logic and it must be <strong>strictly deterministic</strong>. Any genuinely non-deterministic act — calling an external API, reading the clock, generating a random number, writing to a database — is pushed out into an <em>Activity</em>, and the result of each Activity is written to an append-only <strong>event history</strong>.</p><p>When the workflow worker crashes, the orchestrator detects the lost liveness and schedules the workflow on a different worker. That new worker <strong>re-runs the workflow code from the top</strong>. As the code re-executes and reaches each Activity call, the SDK intercepts it, finds the already-recorded result in the event history, and returns it immediately — <em>without</em> re-executing the side effect. The program “fast-forwards” through everything it already did and resumes exactly where it left off. Each workflow instance carries a stable <strong>workflow ID</strong>, so signals and queries can find it regardless of which physical worker is hosting it.</p><p>This is what makes “sleep for a month” real rather than a metaphor. When the workflow hits its 30-day delay, the worker <strong>frees all in-memory resources</strong> and the service registers a timer. Thirty days later a worker picks the task back up, replays the event log to rebuild the in-memory variables, and continues. Idle cost approaches zero. Long-running business processes — subscriptions, onboarding flows, multi-step sagas, human-approval chains — become ordinary code.</p><p>It is genuinely powerful, and the constraints are the source of the power: because state is <em>derived</em> from a deterministic re-execution of a log, the engine never has to capture volatile heap pointers or CPU registers, and it can run on stock language runtimes. The price is the determinism contract. Read the wall clock outside an Activity and your replay diverges; the rebuilt state no longer matches reality and the engine raises a non-determinism error to protect you from silent corruption.</p><h3>What replay actually models — and what it doesn’t</h3><p>Here is the load-bearing observation. Replay reconstructs <strong>logical workflow state</strong>: which steps completed, what they returned, where the program counter logically sits in the orchestration graph. That logical graph is the <em>workflow graph</em> — a state machine over completed activities and pending steps.</p><p>It does <strong>not</strong> model, and structurally cannot model, <strong>live OS-level execution state</strong>.</p><p>A deterministic replay engine cannot represent a running bash process mid-command with a half-filled input buffer. It cannot hold a PTY whose scrollback a human is reading right now. It cannot keep a TCP socket in flight, an ssh child waiting on a prompt, a long-lived REPL with a populated namespace, or a process tree where killing the parent should cascade to the children. None of that is journalable as a sequence of deterministic decisions, because none of it <em>is</em> a sequence of deterministic decisions — it is the messy, non-deterministic, concurrently-mutated reality of a live operating system. Replay deliberately forbids exactly the thing a live interactive environment is made of.</p><p>This is <strong>load-bearing distinction #2 of this series, stated cleanly:</strong></p><blockquote><strong><em>Execution continuity ≠ workflow orchestration.</em></strong><em> Durable-execution engines reconstruct a </em>logical<em> workflow by deterministic replay; they do not maintain a live OS-level execution graph that heterogeneous interactive clients attach to. </em><strong><em>Steered, not replayed.</em></strong></blockquote><p>Now consider the <em>opposite</em> extreme, because it clarifies the middle. <strong>CRIU</strong> (Checkpoint/Restore in Userspace) is the purest form of “capture the live OS state”: it uses ptrace to seize a process, dumps its memory pages, CPU registers, file-descriptor table and even TCP connection state (via TCP_REPAIR), and can restore the whole thing — bit for bit — on another machine. CRIU captures precisely what replay throws away.</p><p>But CRIU is a <em>snapshot mechanism</em>, not a continuity <em>architecture</em>. It is single-process-tree oriented; it has no control plane, no logical identity that outlives the snapshot, no way for multiple interactive clients to attach to one coherent live object, no consistency model for concurrent steering, no routing fabric that lets “the execution” be addressed independent of which host currently holds it. It is architecture-locked, too — restore generally demands a matching ISA and kernel. CRIU answers “how do I freeze this one process,” not “how do I make a live execution a first-class, addressable, multi-actor object.”</p><p>So we have three points on a map, not two:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cN-nz6TaK27ZohLfcFuC5A.png" /></figure><pre>REPLAY-BASED               LIVE EXECUTION-STATE          CRIU<br>  DURABLE EXECUTION          GRAPH                         SINGLE-PROCESS SNAPSHOT<br>  (Temporal / Orleans /      (the missing layer)           (raw OS freeze/thaw)<br>   Dapr / Azure DF)</pre><pre>+-----------------+        +-----------------+           +-----------------+<br>  | logical event   |        | live process    |           | one process     |<br>  | history journal | &lt;----&gt; | tree + PTY +    | &lt;-------&gt; | tree, dumped to |<br>  | (derive state)  |        | fds + sockets,  |           | disk, restored  |<br>  |                 |        | held + observed |           | elsewhere       |<br>  +-----------------+        +-----------------+           +-----------------+<br>        ^                            ^                             ^<br>        |                            |                             |<br>   determinism                  no determinism                 no control<br>   contract                     constraint; steered            plane; snapshot<br>                                by peers in real time          only, no peers</pre><p>The middle column is the one the industry has <em>names for the edges of</em> but not for the center.</p><h3>The comparison, dimension by dimension</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WOj3DBnK2i_yh5nHffUkcA.png" /></figure><pre>DIMENSION              | REPLAY-BASED DURABLE   | LIVE EXECUTION-STATE     | CRIU SINGLE-PROCESS<br>                       | EXECUTION              | GRAPH                    | SNAPSHOT<br>-----------------------+------------------------+--------------------------+----------------------<br>state model            | logical workflow state | live OS execution graph: | raw OS state of one<br>                       | (completed steps,      | process tree w/ lineage, | process tree (pages,<br>                       | activity results,      | PTY, file descriptors,   | regs, fds, TCP),<br>                       | logical position)      | sockets — held live      | serialized to disk<br>-----------------------+------------------------+--------------------------+----------------------<br>determinism            | mandatory; non-deter-  | none; the live system is | none; captures state<br>requirement            | minism outside an      | inherently non-deter-    | as-is, no re-exec<br>                       | activity diverges      | ministic and that&#39;s fine | ever happens<br>-----------------------+------------------------+--------------------------+----------------------<br>what&#39;s persisted       | append-only event      | the live execution graph | a point-in-time<br>                       | history (inputs/       | as a first-class,        | image; nothing<br>                       | outputs/side effects)  | addressable object       | between snapshots<br>-----------------------+------------------------+--------------------------+----------------------<br>multi-client           | no — clients send      | yes — heterogeneous      | no — restore yields<br>interactive attach     | signals/queries to a   | clients attach concur-   | one process for one<br>                       | logical instance; no   | rently to one coherent   | restorer; no shared<br>                       | shared live surface    | live object              | live surface<br>-----------------------+------------------------+--------------------------+----------------------<br>AI / human steering    | drive the workflow     | observe AND mutate the   | none while running;<br>                       | between steps via      | running environment      | you freeze, ship,<br>                       | signals; cannot grab   | mid-flight as a peer;    | thaw — you do not<br>                       | a live shell mid-run   | hand-off live           | steer<br>-----------------------+------------------------+--------------------------+----------------------<br>recovery method        | re-run from entry      | reconnect to / re-home   | restore the dumped<br>                       | point, replay journal  | the live graph; identity | image on a (matching)<br>                       | to rebuild state       | survives host change     | host</pre><p>The shape of the table is the whole argument. Replay buys you indefinite, cheap, deterministic durability for <em>logical</em> processes. CRIU buys you a faithful freeze of <em>one</em> live process tree. Neither buys you a <strong>live execution graph that several actors can steer at once and that recovers as an identity rather than as a re-derivation or a re-thaw.</strong> That center column is a distinct architectural category.</p><h3>A line through history</h3><p>The lineage helps locate where this category sits, because each prior era solved one axis and dropped the others (a screen → tmux → tmate → Jupyter → Guacamole → cloud-workspace → agent-runtime arc runs through the whole series; here we trace the <em>execution-continuity</em> thread specifically).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iD4Qgu7rPPlB4iaB3DzALQ.png" /></figure><ul><li><strong>Distributed-OS process migration (Sprite, Mosix, Locus, Condor, late 1980s–1990s).</strong> The first serious attempt to make a <em>live</em> process outlive its host. Sprite migrated a running process to a new node, forwarding host-specific syscalls back to a “home node” via kernel RPC; Mosix shipped the user address space between processors. Visionary — and fatally dependent on the home node: a partition or a home-node crash killed every migrated process. Live state, no durable identity.</li><li><strong>CRIU (2011).</strong> Migration done right at the snapshot level: userspace ptrace seizure, full memory/register/fd/TCP capture, restore anywhere with a matching kernel and ISA. It nailed <em>capturing</em> live OS state — and stopped exactly there. No control plane, no multi-client coherence, no logical identity layer.</li><li><strong>Durable-execution engines (Temporal, Cadence, Dapr, Azure Durable Functions, ~2014 onward).</strong> Solved durability and identity at the <em>logical</em> level — stable workflow IDs, indefinite sleeps, exactly-once steps, scale-to-zero while idle — by abandoning live OS state entirely in favor of deterministic replay. Durable identity, no live state.</li></ul><p>Lay those out and the gap is obvious. Sprite had <em>live state</em> but no <em>durable identity</em>. Temporal has <em>durable identity</em> but no <em>live state</em>. CRIU can <em>capture</em> live state but offers no <em>continuity architecture</em> around it. The <strong>execution-state-continuity</strong> direction is the synthesis the lineage keeps pointing at but never reaches: a live OS-level execution graph that has a stable logical identity, survives host and transport changes, and is concurrently steerable by peers.</p><h3>Why this matters now</h3><p>For a decade the gap was tolerable because the thing on the other end of an execution was a <em>program</em> — deterministic, headless, content to run to completion and report back. Replay fits that world perfectly. You do not need to “take over” a Temporal workflow mid-step; you need it to finish reliably.</p><p>Agentic systems break that assumption in two specific ways.</p><p><strong>First, agents must pause for a human and then resume a <em>live environment</em>.</strong> Not resume a logical position in a state machine — resume an actual shell with a half-built project in it, a dev server still listening on a port, a database connection still open, a Python REPL with two hours of populated namespace. Replay can pause a <em>workflow</em> for a month and rebuild its <em>variables</em>; it cannot rebuild a live process tree and a PTY, because those were never deterministically derivable in the first place. The thing the agent is working <em>inside</em> is exactly the thing replay does not model.</p><p><strong>Second, a human needs to take over a running session mid-flight — and then hand it back.</strong> The agent is three commands into a deploy, something looks wrong, an engineer wants to attach to the <em>same live execution the agent is in</em>, inspect it, type a few commands, and let the agent continue from the now-modified reality. That is concurrent multi-actor steering of one live execution object. Replay has no shared live surface to attach to — it linearizes signals to a logical instance, it does not host a live shell two parties can both touch. CRIU has the live surface but no multi-client coherence — restore hands <em>one</em> restorer <em>one</em> process; there is no consistency model for two actors mutating it at once, no routing identity for “the session” independent of the host.</p><p>The agentic workload sits precisely in the hole between them. It needs replay’s durable, host-independent <em>identity and continuity</em>, and it needs CRIU-grade <em>live OS state</em>, and it needs something neither has: <strong>coherent concurrent steering by multiple peer actors.</strong> Pause for human input and resume a live environment; let a human grab the wheel of a running session and give it back. Replay cannot do live concurrent steering. Raw snapshot cannot do multi-client coherence. You can watch the convergence pressure in the field already — Devin, Warp, OpenHands, Claude Code, E2B, and Daytona are each, from different starting points, reaching toward “a live environment that persists and that an agent and a human share.” They are converging <em>into</em> the center column without yet having agreed on a name for it.</p><h3>Naming the category</h3><p>The center column deserves its name. It is the <strong>execution-state continuity layer</strong>: live OS-level execution state — the process tree with its lineage, the PTY, the file descriptors, the sockets — elevated to a first-class, persistent, addressable object, decoupled from any one client or transport, that humans, AI agents, devices, and services attach to as <em>peer participants</em>. The discipline that produces it is <strong>Distributed Execution-State Architecture</strong>.</p><p>Hold the slogan, because it is the cleanest way to keep the three paradigms apart: a durable-execution engine <strong>replays</strong> a logical workflow; CRIU <strong>freezes and thaws</strong> one process; an execution-state system <strong>steers</strong> a live graph. Replayed, frozen, and steered are three different verbs, and only one of them describes a running environment that a human and an agent can stand inside together.</p><p>The systems that exist today are not wrong; they are aimed elsewhere. Temporal and Orleans are superb at making logical processes invincible, and that will remain true and important. But the agentic era needs the other thing too, and the other thing has been the missing column on the map all along.</p><p>One implementation built explicitly around this center column — a live, addressable, multi-actor execution graph that is steered rather than replayed — is <a href="https://cmdop.com/">cmdop</a>, offered here as a reference point for what the category looks like in practice rather than as the category itself.</p><p><em>Next in the series: AI as Peer, Not Controller — the multi-actor execution model, and why “the model calls tools” is the wrong shape for systems where humans and agents share one live execution.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=82f6d1f97b09" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Маркетинг на Github, PyPi, Npm]]></title>
            <link>https://medium.com/@marklesly/%D0%BC%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3-%D0%BD%D0%B0-github-pypi-npm-79cb78244e97?source=rss-18febd03a35c------2</link>
            <guid isPermaLink="false">https://medium.com/p/79cb78244e97</guid>
            <category><![CDATA[package]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[pypi]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[github]]></category>
            <dc:creator><![CDATA[Mark Lesly]]></dc:creator>
            <pubDate>Wed, 19 Dec 2018 16:36:25 GMT</pubDate>
            <atom:updated>2018-12-19T16:36:25.397Z</atom:updated>
            <content:encoded><![CDATA[<p>Как легко и быстро предоставить доступ к своему API разработчикам со всего мира? Давайте попробуем разобраться.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*mH8_-Idad2HEDIt8oRGiiw.jpeg" /></figure><blockquote>API (Application Programming Interface) — это программный интерфейс для предоставления сторонним разработчикам доступа к вашей программе (модулю, библиотеке, коду, базе данных, сайту и т.д.).</blockquote><p>Я, как руководитель компании очень заинтересован в увеличении количества внешних интеграций к программным продуктам своей компании, поскольку это регулярно приводит новых клиентов.</p><p><em>Уже у многих компаний есть собственные маркет-плейсы: </em><a href="https://www.zendesk.com/apps/"><em>Zendesk Apps</em></a><em>, </em><a href="https://apps.shopify.com/"><em>Shopify Apps</em></a><em>, </em><a href="https://wordpress.org/plugins/"><em>WordPress plugins</em></a><em> и т.д., где сторонние разработчики выкладывают свои модули использующие API этих платформ.</em></p><p>Итак, вы разрабатываете собственный API с подробной документацией. Дело за малым — кто будет этим пользоваться? Одно из решений это публикация кода на Github.com, это действительно просто. Чуть сложнее обстоят дела с публикацией в профессиональных каталогах (PyPi или Npmjs).</p><ul><li>GitHub — хостинг IT-проектов — 36 млн. посетителей в месяц</li><li>PyPi.org — каталог модулей для Python — 2 млрд. установок в месяц</li><li>Npmjs.com — каталог модулей для Node js — 37 млрд. установок в месяц</li></ul><p><strong>Преимущества публикации API в профессиональных каталогах очевидны:</strong></p><ul><li>Это бесплатно</li><li>Ваша библиотека доступна для поиска в каталоге каждого репозитория</li><li>Каталоги имеют высокую «трастовость» со стороны поисковых систем и через пару дней после публикации вы можете оказаться в топе поисковой выдачи</li><li>Установка вашего модуля занимает пару секунд с помощью одной команды и ваш API готов к использованию! ($pip install module или $npm install module)</li><li>Внутренняя система контроля версий позволяет удобно выкатывать обновления вашего кода</li><li>Ваш код доступен круглосуточно для разработчиков со всего мира</li><li>Невысокая конкуренция. Как правило, разработчикам лень публиковать, поддерживать и развивать свой код</li></ul><p><strong>Некоторые недостатки профессиональных каталогов:</strong></p><ul><li>Нет мультиязычной поддержки ReadMe</li><li>Строгие требования к публикуемому коду</li><li>Отнимает много времени при публикации и последующих обновлениях вашего кода</li><li>Прочие «подводные камни» в зависимости от типа каталога</li></ul><p><strong>Выходит простая формула:</strong> чем больше разработчиков находят ваш модуль или API, тем лучше для вас. Выходит, что нужно присутствовать везде, как бы сложно это не казалось.</p><p><strong>Кстати,</strong> GitHub.com не самое практичное решение, т.к. разработчики предпочитают использовать стандартные менеджеры пакетов (каталоги).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/0*oFTKGPUsaTSp6PZw" /></figure><h3>Кейс #1</h3><p>Допустим, у вас есть собственный веб-сервис и вы хотите, что бы разработчики со всего мира создавали дополнительные модули, которые бы вы могли предложить своим клиентам. Вы понимаете, что при выборе продукта ваши клиенты ориентируются не только на ту задачу, которую решает ваш веб-сервис, но и на богатство ваших модулей (внешних интеграций).</p><p>Ок, вы поставили задачу своим программистам, чтобы они опубликовали ваш API, но следует помнить, что эта задача больше для маркетологов, т.к. необходимо качественно оформить описание. В итоге вместо пары часов на публикацию кода может уйти неделя, т.к. маркетологам придется работать в тандеме с разработчиками. А когда по той или иной причине программист публиковавший код покинет штат компании, то встанет вопрос «<em>как быть?»</em></p><p>Конечно, для профессионалов разобраться во всех требованиях каталогов и опубликовать код не составит труда, но ведь у них есть и основная работа! А кто будет это поддерживать? А если вы хотите, чтобы описание было на разных языках? Как сделать так, что бы ваш API был доступным на разных платформах и его находили как можно чаще?</p><h3>Кейс #2</h3><p>Вы маркетолог и хотите, чтобы о продуктах вашей компании узнало как можно большее кол-во разработчиков со всего мира. Публикации API на 3–4 ресурсах явно недостаточно, ведь вас должны находить по разным ключевым словам. Стандартный ReadMe этого не позволяет, т.к. содержит всего 1 языковую версию, а название библиотеки не позволяет добавить все словосочетания по которым (как вам кажется) вас должны находить.</p><p>Стандартные решения вам точно не подойдут, т.к. нужно регулярно работать с описаниями, переводами и обновлять код.</p><h3>Кейс #3</h3><p>Вы разработчик и у вас много хороших решений. Возможно, вы периодически публикуете что-то на GitHub, но не более.</p><p><strong>Причины для публикации кода у вас могут быть разные:</strong></p><ul><li>Вы хотите, что бы вас заметил крутой работодатель и предложил вам контракт на $ 100.000 в год</li><li>Вам хочется использовать свои наработки от проекта к проекту с простым подключением модулей (без дублирования кода)</li><li>Вы филантроп и хотите, что бы ваши наработки были полезны разработчикам со всего мира</li><li>Просто так =)</li></ul><p><strong>А вот причины по которым вы вероятно не станете публиковать свой код:</strong></p><ul><li>Нет времени подготавливать описание (ReadMe), тем более, если оно на нескольких языках</li><li>Нет желания разбираться в нюансах публикации кода и сливать своё время «в трубу»</li><li>Нет времени на поддержку своих библиотек, т.к. каждый раз приходится снова вспоминать все тонкости для обновления кода в каталогах</li><li>Ну или вам это просто не надо =)</li></ul><h3>Решение кейсов</h3><p>Как сделать так, что бы код вашего API (модуля/библиотеки) был всегда под рукой и не отнимал время на публикацию или обновления?</p><p>Для этой задачи я перебрал много разных решений, но не одно не решало задач моей компании. В итоге я разработал собственный сервис для массового тиражирования API — <a href="https://gitupload.com/ru"><strong>GitUpload.com</strong></a></p><p>Сервис выводит вашу библиотеку в топ выдачи Google уже через пару дней после первой публикации кода (если вы всё сделали правильно)</p><p><a href="https://www.google.com/search?q=How+to+upload+package+to+PyPi"><em>Пример попадания библиотеки в поисковую выдачу Google</em></a><em> по интересному запросу (6–8 строчка)</em></p><p><strong>Что умеет GitUpload.com</strong></p><ul><li>Автоматическая публикация кода на: Npmjs.com, PyPi.com, Github.com</li><li>Автоматический перевод ReadMe на 6 языков</li><li>Возможность регулярного обновления кода — так сторонние разработчики поймут, что у вас актуальная библиотека и с большей вероятностью интегрируют ее в свой проект.</li><li>Умное клонирование, т.е. ваша библиотека публикуется не 1 раз, а ее можно растиражировать с разными ключами по разным аккаунтам, чтобы ее находили как можно чаще. Ах да, я слежу за тем, что бы не было злоупотребления (спама).</li><li>Панель управления своими аккаунтами от репозиториев и каталогов</li><li>Подготовка проекта и публикация занимает пару минут</li><li>Это бесплатно и навсегда =)</li></ul><p><strong>Примеры библиотек опубликованных с помощью GitUpload.com</strong></p><ul><li><a href="https://pypi.org/project/py-translator/">https://pypi.org/project/py-translator/</a></li><li><a href="https://www.npmjs.com/package/sigma_sms">https://www.npmjs.com/package/sigma_sms</a></li><li><a href="https://github.com/markolofsen/py_translator/">https://github.com/markolofsen/py_translator/</a></li></ul><p>Проект некоммерческий и немного сыроват, но он работает стабильно и доказал мне свою необходимость. Не судите строго — попробуйте сами!</p><p>Кстати, дальнейшее развитие проекта я планирую за счет привлечения компаний желающих отдать задачу тиражирования API мне на аутсорс.</p><p>Спасибо, что дочитали до конца. С любовь, я.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=79cb78244e97" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Цифровое рабство]]></title>
            <link>https://medium.com/@marklesly/%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B5-%D1%80%D0%B0%D0%B1%D1%81%D1%82%D0%B2%D0%BE-7f25fa59d94f?source=rss-18febd03a35c------2</link>
            <guid isPermaLink="false">https://medium.com/p/7f25fa59d94f</guid>
            <dc:creator><![CDATA[Mark Lesly]]></dc:creator>
            <pubDate>Fri, 14 Dec 2018 01:22:54 GMT</pubDate>
            <atom:updated>2018-12-14T01:22:54.289Z</atom:updated>
            <content:encoded><![CDATA[<p>Поисковые системы контролируют интернет-пространство. Под безобидным предлогом мир постепенно погружается в цифровое рабство, где монополия на поиск диктует свои правила игры.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/760/0*-n2RVFm7UfTu7RXX" /></figure><p>Еще совсем недавно поисковые системы рассматривались не более, чем база данных со строкой поиска. Постепенно качество поиска повышалось под очевидным предлогом: результаты выдачи должны быть максимально-релевантными. Монополист поискового рынка Alphabet, которой принадлежит Google, добилась хороших результатов релевантности выдачи, но не более.</p><p>Сейчас уже нет необходимости бороться за повышение качества поисковой выдачи, поскольку стратегия поискового бизнеса изменилась. В след за сменой стратегии основного лидера, стали подтягиваться и мелкие игроки, например, Яндекс.</p><p>Пользователям больше не требуется супер-релевантные результаты поисковой выдачи, т.к. качество текущих результатов удовлетворительно и лучше уже просто не требуется.</p><blockquote>Если писать картину, в какой-то момент она наконец будет завершена и понятна зрителю.</blockquote><p>Поисковые алгоримты уходят на задний план, в ход идет цифровая диктатура. Основной доход Google получает от своей рекламной сети Google Adwords.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/796/0*zBQdW_sQgpx6PJN0.jpg" /></figure><p>Т.е. источник извлечения прибыли это реклама. Достаточно посмотреть по сторонам как становится понятно, что практически ни одна компания не способна вести бизнес, если ее нет в поисковой выдаче. Совсем недавно обычные компании боролись за места в естественной выдаче за счет SEO-оптимизации и увеличения цитируемости. Чудеса закончились. Монополия на поиск от Google все время работала не столько над увеличением качества поиска, сколько над закручиванием гаек для интернет-бизнеса и сейчас попасть в поисковую выдачу стало практически невозможно.</p><p>Независимо от уникальности контента, скорости загрузки сайта и качества кода, компания Google не просто не заинтересована в том, что бы какой-либо сайт находили, а против этого. Нужны клиенты? — неси кровные в Adwords, а иначе извини. Только представьте, что практически 50% всех интернет-продаж происходят благодаря рекламной платформе Google. Выражаясь иначе: покупая через интернет вы платите Google. Кстати, стоимость рекламы в Google несоизмерима с практической пользой, которую компания производит.</p><p>Я не призываю к радикальным переменам, просто испытываю некоторую тревогу.</p><p>Или взять например Facebook, который умело манипулирует сознанием масс за счет алгоритма ротации постов в ленте своих пользователей. О чем сегодня выгодно или не выгодно говорить — решает Facebook.</p><p>Вообще складывается такое ощущение, что с миром происходит что-то не то. Каждая монополия стремится контролировать или использовать человека. Религия, правительство, поисковые системы, социальные сети. Со временем список расширится в сторону VR-коммуникаций, где битва пойдет за сознание человека и случится как фантасты уже сейчас подсказывают: эко-системы (конгломераты) контролируют все сферы жизни человека.</p><p>Удивительно, но до сих пор не существует компаний, которые бы несли реальную пользу, ориентированных больше на развитие сознания человека, изучение трансциндентных областей жизни. Как будто существует только эмпирическое существование и больше НИ-ЧЕ-ГО. Цифровое рабство это не только про деньги, но также и поле битвы за сознание человека.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7f25fa59d94f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Домен для визуальной памяти]]></title>
            <link>https://medium.com/@marklesly/%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD-%D0%B4%D0%BB%D1%8F-%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8-b30668503b56?source=rss-18febd03a35c------2</link>
            <guid isPermaLink="false">https://medium.com/p/b30668503b56</guid>
            <category><![CDATA[yandex]]></category>
            <category><![CDATA[домен]]></category>
            <category><![CDATA[beru]]></category>
            <category><![CDATA[ecommerce]]></category>
            <category><![CDATA[domains]]></category>
            <dc:creator><![CDATA[Mark Lesly]]></dc:creator>
            <pubDate>Thu, 13 Dec 2018 19:19:35 GMT</pubDate>
            <atom:updated>2018-12-13T19:21:49.339Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*l37EH4uP5n1XRjw_pCEetw.png" /></figure><p>Бытует мнение, что домен для компаний уже не столь важен, т.к. деньги вложенные в покупку домена лучше всего пустить в маркетинг. Это утверждение работает, когда речь идет о небольших стартапах, но крайне не верно, когда компания вкладывает значительные средства в укрепление бренда на рынке.</p><p>Примером неудачных стартов я могу назвать сервис объявлений «Юла» от Mail.ru, ужасное написание домена youla.ru (а ранее и вовсе youla.io) не позволяет домену закрепиться в визуальной памяти. Написание «you» (Ю) просто ужасно для русского языка.</p><p>Или бренд Beru.ru от совместного проекта Яндекса и Сбербанка. Тут немного получше, ребята сделали вирусную историю на судебных прериях якобы за бренд «Беру!». В самый разгар спора я предложил яндексу купить свой домен kupi.ru вместе с товарным знаком «купиру», но практически сразу получил отказ.</p><p>Satom.ru — аналог яндекс.маркет, с хорошей (в отличии от яндекс.маркета) реализацией. Ребята постарались, выражаю почтение. Но бренд. Я вот даже сейчас в попытках вспомнить адрес сайта потратил около 10 минут, что бы найти их в поисковике. Satom не вызывает никаких ассоциаций</p><p>Конечно, существуют рекламные кампании с внушительными бюджетами, где задачей ставится узнаваемость бренда массированной атакой, например, Avito.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b30668503b56" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>