<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: mithilesh gaurihar</title>
    <description>The latest articles on DEV Community by mithilesh gaurihar (@mithilesh_gaurihar_e719cd).</description>
    <link>https://dev.to/mithilesh_gaurihar_e719cd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4002987%2F751a995c-5105-4a22-9693-c4a2dd6b18b7.png</url>
      <title>DEV Community: mithilesh gaurihar</title>
      <link>https://dev.to/mithilesh_gaurihar_e719cd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mithilesh_gaurihar_e719cd"/>
    <language>en</language>
    <item>
      <title>Hugging Face Was Breached by an AI Agent. Then Its Own Tools Refused to Help.</title>
      <dc:creator>mithilesh gaurihar</dc:creator>
      <pubDate>Mon, 20 Jul 2026 17:48:46 +0000</pubDate>
      <link>https://dev.to/mithilesh_gaurihar_e719cd/an-ai-agent-broke-into-hugging-face-the-scary-part-isnt-the-break-in-b20</link>
      <guid>https://dev.to/mithilesh_gaurihar_e719cd/an-ai-agent-broke-into-hugging-face-the-scary-part-isnt-the-break-in-b20</guid>
      <description>&lt;p&gt;Hugging Face, the largest repository of open AI models on the internet, disclosed that its production infrastructure was compromised by an autonomous AI agent system.&lt;/p&gt;

&lt;p&gt;The company said it detected and contained the incident earlier last week. Unauthorized access reached a limited set of internal datasets along with several credentials tied to its services.&lt;/p&gt;

&lt;p&gt;The investigation is ongoing. So far Hugging Face has found no sign that the agent touched public-facing models, datasets, or Spaces, and no sign that its software supply chain was altered.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the attack worked
&lt;/h2&gt;

&lt;p&gt;The entry point was the data processing pipeline. A malicious dataset abused two separate code execution paths: the remote code dataset loader, and a template injection flaw in a dataset configuration file. That was enough to run code on a processing worker.&lt;/p&gt;

&lt;p&gt;From there the agent escalated to node-level access, collected cloud and cluster credentials, and moved laterally into several internal clusters over the course of a weekend.&lt;/p&gt;

&lt;p&gt;Which model powered the attack is still unknown. What Hugging Face can describe is the shape of it: an autonomous agent framework running many thousands of individual actions through a swarm of short-lived sandboxes, with self-migrating command-and-control staged on public services.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hugging Face did about it
&lt;/h2&gt;

&lt;p&gt;The company closed the code execution paths used for initial access, then worked through remediation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removed the attacker's foothold and rebuilt compromised nodes across affected clusters&lt;/li&gt;
&lt;li&gt;Revoked and rotated affected credentials and tokens, with a broader precautionary secret rotation&lt;/li&gt;
&lt;li&gt;Added guardrails and tightened admission controls on its clusters&lt;/li&gt;
&lt;li&gt;Improved detection and alerting so responders get paged within minutes, around the clock&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hugging Face is also asking users to rotate their own access tokens and review recent account activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that should worry builders
&lt;/h2&gt;

&lt;p&gt;Reconstructing the timeline meant analyzing a very large volume of attacker activity, so the team pointed LLM agents at the logs.&lt;/p&gt;

&lt;p&gt;The frontier models behind commercial APIs would not do it.&lt;/p&gt;

&lt;p&gt;Forensic work requires submitting genuine attack commands, exploit payloads, and command-and-control artifacts. Safety guardrails treated that material as hostile, because a filter has no way to tell an incident responder from an intruder. Both are sending the same bytes.&lt;/p&gt;

&lt;p&gt;Hugging Face ran the analysis instead on GLM 5.2, an open-weight model from Z.ai, hosted on its own infrastructure.&lt;/p&gt;

&lt;p&gt;The company was direct about the lesson. It does not know whether the attacker's agents ran on a jailbroken hosted model or an unrestricted open-weight one. Either way, the attacker operated under no usage policy at all, while the defenders were blocked by the guardrails of the tools they reached for first.&lt;/p&gt;

&lt;p&gt;That asymmetry is not a mistake anyone made. It is structural. Offense uses ungoverned tooling by definition. Defense opts into governance and gets the invoice at the worst possible moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with this
&lt;/h2&gt;

&lt;p&gt;Most teams pick models on two axes: cost and capability. This incident adds a third, which is access.&lt;/p&gt;

&lt;p&gt;There is a real category of legitimate work where the hosted tier will decline. Incident response. Malware analysis. Abuse investigation. Red-teaming your own product. You do not want to discover the refusal during an emergency.&lt;/p&gt;

&lt;p&gt;Hugging Face's own recommendation is the practical one. Vet a capable model you can run on infrastructure you control, and have it ready before you need it. It avoids guardrail lockout, and it keeps attacker data and credentials inside your environment.&lt;/p&gt;

&lt;p&gt;Most of us are not running the world's largest model repository. But plenty of us are shipping systems where an agent has more reach than we would say out loud, and where the entire incident response plan is "ask the good model."&lt;/p&gt;

&lt;p&gt;That plan just failed a live test.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More like this daily. Discord's &lt;a href="https://discord.gg/A3Vx2ADhGd" rel="noopener noreferrer"&gt;here&lt;/a&gt; if you want to follow along.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aiagents</category>
      <category>cybersecurity</category>
      <category>llm</category>
    </item>
    <item>
      <title>A Pipeline Is a File. Running It Is the Work.</title>
      <dc:creator>mithilesh gaurihar</dc:creator>
      <pubDate>Mon, 13 Jul 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/mithilesh_gaurihar_e719cd/a-pipeline-is-a-file-running-it-is-the-work-5ao5</link>
      <guid>https://dev.to/mithilesh_gaurihar_e719cd/a-pipeline-is-a-file-running-it-is-the-work-5ao5</guid>
      <description>&lt;p&gt;&lt;em&gt;Why we built RocketRide Cloud around the same portable .pipe files developers use locally.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By Krish Garg and Mithilesh Gaurihar&lt;/p&gt;

&lt;p&gt;The artifact we want a team to own is small.&lt;/p&gt;

&lt;p&gt;It is a &lt;code&gt;.pipe&lt;/code&gt; file: a JSON description of the nodes in an AI workflow, the data lanes between them, and the configuration each node needs. You can open it in an editor, review it in a pull request, and keep it with the application it belongs to.&lt;/p&gt;

&lt;p&gt;The job we do not think every team should have to own is everything required to keep that file working for real users.&lt;/p&gt;

&lt;p&gt;That is the distinction behind RocketRide Cloud.&lt;/p&gt;

&lt;p&gt;We did not set out to make another place to draw agent graphs. Plenty of products can help you make a demo. We wanted the thing you build locally to stay the thing you run in production, without asking you to become the team that operates GPU inference, identity, secrets, routing, deploys, and the failures in between.&lt;/p&gt;

&lt;p&gt;The pipeline is yours. Running it is the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the file
&lt;/h2&gt;

&lt;p&gt;Here is a real RocketRide pipeline. A dropper takes in a media file, a parser prepares it, an audio-transcribe node turns its audio into text, and an output node returns that text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"components"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dropper_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dropper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dropper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dropper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hideForm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parse_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Parser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lane"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dropper_1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"audio_transcribe_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"audio_transcribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Transcribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"profile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"min_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"max_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"silence_threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"vad_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lane"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parse_1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response_text_1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response_text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Return Text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"laneName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lane"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"audio_transcribe_1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00000000-0000-4000-8000-0000000000d0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the application logic. Not the whole production system, obviously, but the part that should stay legible to the people who own it.&lt;/p&gt;

&lt;p&gt;The value of a declarative pipeline is not that JSON is fashionable. It is that the runtime can understand what it is being asked to run, and so can you. The source is explicit: the dropper. The steps are explicit. The lanes between the nodes are explicit too, named right there in the file. The dropper hands off to the parser on a &lt;code&gt;tags&lt;/code&gt; lane, the parser feeds the transcribe node on a &lt;code&gt;video&lt;/code&gt; lane, and the transcribe node returns its output on a &lt;code&gt;text&lt;/code&gt; lane. A model provider, a vector store, or a tool is a component with a contract, not a hidden dependency buried in application glue.&lt;/p&gt;

&lt;p&gt;That makes a pipeline easier to inspect and easier to change. Swap the transcription model and the surrounding workflow does not need to be rewritten. Add a step and the review is a small diff, not a new service with another deploy path. The visual builder is just another view of the same file.&lt;/p&gt;

&lt;p&gt;The file is portable on purpose. It can run locally in the VS Code extension, on infrastructure you operate yourself, or on RocketRide Cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnt2jkjly21eymgle9ibf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnt2jkjly21eymgle9ibf.png" alt="Local Pipeline" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On your machine: the file above, edited in the RocketRide extension. The connection at the bottom points at RocketRide Cloud, and one click deploys your local changes to production.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Local is dev. Cloud is production. Deploy is one click.
&lt;/h2&gt;

&lt;p&gt;This is the part we care about most, so we will say it plainly. In the VS Code extension the same pipeline points at two runtimes: one on your own machine, and RocketRide Cloud. Local is where the work happens. You add a node, connect it, run it, inspect the trace, and try again, against the very same runtime that will run in production. Local development should be boring, and here it is.&lt;/p&gt;

&lt;p&gt;Then moving what you built from local to production is not a packaging step. You make the changes locally, and one click deploys them to Cloud. No container to build, no config to fill in, no key to paste, no separate CI to wire up. The pipeline you were editing a second ago is the one now serving your users. Develop, edit, iterate, and when it is ready, one click ships it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr467o9qo8l7704yzr6du.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr467o9qo8l7704yzr6du.png" alt="Cloud Pipeline" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In the cloud: the very same file, now running in production. Nothing was packaged or re-uploaded; the local edits were promoted with a click.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Production is a different job, and that is what the click quietly hands off. A production pipeline needs an authenticated entry point. It needs a place for project state, secrets, and billing. It needs to survive a rolling deploy, a failed process, a slow model load, or a reconnecting client. It needs a route to a model server when the work requires OCR, transcription, embeddings, NER, or vision. It needs someone to watch the runtime itself, not just the prompt.&lt;/p&gt;

&lt;p&gt;Those concerns are why Cloud exists.&lt;/p&gt;

&lt;p&gt;When you deploy, you are not handing your workflow to a new format or a black box. You are running the same &lt;code&gt;.pipe&lt;/code&gt; file on a managed production path. The Cloud runtime supplies the service layer around it: authenticated access, managed endpoints, secrets and project controls, run-level observability, and the infrastructure that keeps the runtime available.&lt;/p&gt;

&lt;p&gt;The important part is what does not happen. You do not rebuild the workflow as a separate cloud-only artifact. You do not fork the logic just because it moved from a laptop to a service your users call.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are actually handing over
&lt;/h2&gt;

&lt;p&gt;Managed is an overused word, so it is worth being specific about the work that moves to us. Four things, plainly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fraction of the cost, on a patent-pending model server.&lt;/strong&gt; Open-weight models are cheap now, but only to whoever can serve them well. Our model server does that serving: continuous batching to keep the GPU busy, warm caches so shared context is not recomputed, quantized serving to fit more model into less memory, and step-level routing that sends each step to the cheapest model that clears its quality bar. A step that only needs a small model gets one. To be honest about the claim: the saving is in model selection and efficient serving, not in the runtime being cheaper compute than a script you wrote yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared pipelines your team actually shares.&lt;/strong&gt; A pipeline is a first-class object, not a script living on one laptop. One person defines it, and the rest of the team runs it, forks it, and reads the same traces and the same cost data. When a model changes or a step needs work, someone edits one node and everyone is on the same version, instead of six people maintaining six slightly different copies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The operational layer, handled.&lt;/strong&gt; Running AI in production means owning authentication and secrets, provider failover, tool isolation, monitoring, and the security posture around all of it. RocketRide Cloud runs that layer so the churn lands on our on-call rotation, not your product. A monthly invoice cannot tell you why one customer request failed. A trace of the run can, and that is the level we operate at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance and scale that survive real traffic.&lt;/strong&gt; Once a pipeline is resident, repeat requests are served warm instead of paying a cold start every time. I/O-bound work like model calls, retrieval, and database hops overlaps cleanly rather than running one call after another. Shared state lets the service route work across healthy instances rather than pinning a pipeline to one process, and health checks and controlled shutdowns mean a deploy does not become a dropped request by default.&lt;/p&gt;

&lt;p&gt;That is not the glamorous part of AI. It is the part that becomes your problem the first time a demo turns into a dependency.&lt;/p&gt;

&lt;p&gt;For an engineering leader, the question is not whether the team can stand up those pieces. Most good teams can. The question is whether that is the best use of their time while they are still learning whether the product itself is useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the runtime is written this way
&lt;/h2&gt;

&lt;p&gt;Under the file is a C++ runtime that orchestrates Python nodes. That design is deliberate, but it is not a magic performance claim.&lt;/p&gt;

&lt;p&gt;The runtime is there to supervise work, keep the pipeline contract stable, and isolate failure boundaries. It does not make every piece of Python suddenly parallel, and it does not make a model reason better. In production the useful question is often simpler: when a node fails badly, what else does it take down with it?&lt;/p&gt;

&lt;p&gt;RocketRide runs pipeline work under supervision so one broken run does not become an outage for every other request. That choice has a cost. Process isolation adds lifecycle work that a throwaway in-process script does not have. We made the trade because production systems are judged by how they fail, not only by how they look on the happy path.&lt;/p&gt;

&lt;p&gt;Cloud is where that trade becomes practical. It is one thing to have a runtime that can supervise a run. It is another to operate the surrounding services, update the runtime, manage GPU-backed model serving, and keep the path healthy over time. That is not a burden a product team should inherit by accident just because it wanted to ship an AI feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not self-host?
&lt;/h2&gt;

&lt;p&gt;This is the right question, and sometimes the answer is that you should.&lt;/p&gt;

&lt;p&gt;Self-host RocketRide Server when your environment requires it. If your data has to stay inside a particular VPC, if you run an air-gapped deployment, or if you already have a platform team that wants to own the runtime, the MIT-licensed server is there for exactly that. The &lt;code&gt;.pipe&lt;/code&gt; file you author is still yours, and it still runs.&lt;/p&gt;

&lt;p&gt;Cloud is for the other case: a team that wants to ship a production AI capability without first becoming responsible for the operations around it. Same portable workflow, but with RocketRide operating the service path behind it.&lt;/p&gt;

&lt;p&gt;That is a different thing from lock-in. We do not think a managed service earns its place by making departure hard. It earns its place when it is genuinely easier to run well than to run yourself. The open-source runtime makes that claim more credible, not less. You can inspect the runtime, use it locally, self-host it later, or keep using Cloud because it saves your team from running another piece of production infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision is smaller than it sounds
&lt;/h2&gt;

&lt;p&gt;You do not need to make a permanent infrastructure bet before you write the first pipeline.&lt;/p&gt;

&lt;p&gt;Author the workflow as a file. Run it locally while the work is changing quickly. Use Cloud when you need an operated production path. Self-host when your environment requires you to own that path.&lt;/p&gt;

&lt;p&gt;The important thing is that the application logic does not get trapped in the decision. That is why we built RocketRide this way. The pipeline should belong to the team building the product. The operational burden should be a choice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build and run a pipeline on &lt;a href="https://cloud.rocketride.ai" rel="noopener noreferrer"&gt;RocketRide Cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Inspect or self-host &lt;a href="https://github.com/rocketride-org/rocketride-server" rel="noopener noreferrer"&gt;RocketRide Server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Build locally with the &lt;a href="https://marketplace.visualstudio.com/items?itemName=RocketRide.rocketride" rel="noopener noreferrer"&gt;RocketRide VS Code extension&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>mlops</category>
      <category>llm</category>
    </item>
    <item>
      <title>What the AI Stack Looks Like Below the Model</title>
      <dc:creator>mithilesh gaurihar</dc:creator>
      <pubDate>Thu, 09 Jul 2026 16:25:16 +0000</pubDate>
      <link>https://dev.to/mithilesh_gaurihar_e719cd/what-the-ai-stack-looks-like-below-the-model-bf4</link>
      <guid>https://dev.to/mithilesh_gaurihar_e719cd/what-the-ai-stack-looks-like-below-the-model-bf4</guid>
      <description>&lt;p&gt;&lt;em&gt;Picking a model is a config decision now. Serving it, securing it, scaling it, and sharing the work across a team is where the difficulty went.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By Krish Garg and Mithilesh Gaurihar&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  This week in AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AWS raised EC2 Capacity Block GPU prices &lt;strong&gt;~20%&lt;/strong&gt; effective July 1, the second hike this year. (&lt;a href="https://finance.yahoo.com/technology/ai/articles/aws-raising-gpu-instance-prices-134420295.html" rel="noopener noreferrer"&gt;Yahoo Finance&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A design-level command-execution flaw in MCP's STDIO transport affects an estimated &lt;strong&gt;200K instances&lt;/strong&gt;. Anthropic &lt;strong&gt;declined to change the protocol&lt;/strong&gt;, calling the behavior expected. (&lt;a href="https://www.ox.security/blog/the-mother-of-all-ai-supply-chains-critical-systemic-vulnerability-at-the-core-of-the-mcp/" rel="noopener noreferrer"&gt;OX Security&lt;/a&gt;, &lt;a href="https://www.theregister.com/2026/04/16/anthropic_mcp_design_flaw/" rel="noopener noreferrer"&gt;The Register&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Stripe's autonomous coding agents now merge &lt;strong&gt;1,300+ PRs per week&lt;/strong&gt; with zero human-written code. The enabling layer is not the model, it is the harness around it. (&lt;a href="https://blog.bytebytego.com/p/how-stripes-minions-ship-1300-prs" rel="noopener noreferrer"&gt;ByteByteGo breakdown&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Frontier models keep shipping and open-weight alternatives keep closing the capability gap at a fraction of the price. Which model to run is &lt;strong&gt;a decision you revisit, not an architecture you commit to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The engineering problems below the model did not get easier. Cloud GPU pricing is climbing quarter over quarter. A design-level security flaw sits in the most widely adopted agent protocol. Teams running agents at real volume are discovering the ceiling is &lt;strong&gt;the orchestration layer&lt;/strong&gt;, not just the model on top of it. And pipeline work keeps getting rebuilt per engineer because there is no shared artifact to build against.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RocketRide Cloud&lt;/strong&gt; is a &lt;strong&gt;managed AI pipeline runtime&lt;/strong&gt; built around these four problems. You define your pipeline as a &lt;strong&gt;portable .pipe JSON file&lt;/strong&gt;, connect it to a growing node library covering LLM calls, OCR, transcription, embeddings, vector retrieval, agents, and more across all major LLM providers, and run it on managed infrastructure. The open-source server is &lt;strong&gt;MIT-licensed&lt;/strong&gt;. Cloud is the managed layer on top.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI subsidy era is ending
&lt;/h2&gt;

&lt;p&gt;For the past two years, &lt;strong&gt;compute has been quietly underpriced&lt;/strong&gt;. Cloud credits covered startup bills. Flat-rate tiers let power users consume more than they paid for. That era is closing: &lt;a href="https://startupfortune.com/amazon-raises-gpu-reservation-prices-20-percent-as-the-era-of-cheap-cloud-ai-comes-to-an-end/" rel="noopener noreferrer"&gt;the credits are expiring and the clouds are repricing the metal underneath&lt;/a&gt;, and pricing across the stack is moving toward metering that reflects actual compute cost.&lt;/p&gt;

&lt;p&gt;AWS raised EC2 Capacity Block GPU prices roughly 20% effective July 1, the second hike this year after a 15% increase in January. Cumulative increases have pushed reservation rates up 20 to 50 percent since January. When pricing was subsidized, &lt;strong&gt;inefficiency was invisible&lt;/strong&gt;. Under metered pricing, every wasted token and every idle GPU-second lands on your bill directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficiency in the serving layer is the lever.&lt;/strong&gt; For open-weight models running on Cloud's own infrastructure, RocketRide's model server applies &lt;strong&gt;continuous batching&lt;/strong&gt;, &lt;strong&gt;KV and prefix caching&lt;/strong&gt;, and &lt;strong&gt;quantized serving&lt;/strong&gt;. For steps that call provider APIs, &lt;strong&gt;step-level routing&lt;/strong&gt; sends each one to the cheapest model clearing its quality threshold. (The routing approach is patent-pending.) Either way, token spend, CPU, GPU, and memory are &lt;strong&gt;tracked live as the run executes&lt;/strong&gt;, so you see where the resources are going while you can still change the routing, not on a monthly bill.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh2w56fyof9k9hmd6gj0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh2w56fyof9k9hmd6gj0l.png" alt="Live CPU, memory, GPU, and throughput per node while the pipeline runs. Resource usage is visible during execution, not on a monthly bill." width="799" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Live CPU, memory, GPU, and throughput per node while the pipeline runs. Resource usage is visible during execution, not on a monthly bill.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP has a design-level security problem
&lt;/h2&gt;

&lt;p&gt;In April, &lt;a href="https://www.ox.security/blog/the-mother-of-all-ai-supply-chains-critical-systemic-vulnerability-at-the-core-of-the-mcp/" rel="noopener noreferrer"&gt;OX Security disclosed&lt;/a&gt; a command-execution vulnerability in MCP's STDIO transport. Here is the concrete failure mode: STDIO executes whatever command string it is given to spawn a server. If the command starts a valid MCP server, you get a handle. If it is anything else, you get an error, but &lt;a href="https://www.theregister.com/2026/04/16/anthropic_mcp_design_flaw/" rel="noopener noreferrer"&gt;the command has already run&lt;/a&gt;. &lt;strong&gt;Execute first, validate second.&lt;/strong&gt; An engineer installs an MCP server from a marketplace, the config carries a malicious command, and it executes on the host with that engineer's credentials. OX poisoned &lt;strong&gt;9 of 11 MCP marketplaces&lt;/strong&gt; with a proof-of-concept payload to demonstrate exactly this path.&lt;/p&gt;

&lt;p&gt;This is not an implementation bug in one product. It is a &lt;strong&gt;design default in the official MCP SDKs&lt;/strong&gt; across Python, TypeScript, Java, and Rust, inherited by every downstream project. OX confirmed 7,000+ publicly accessible servers and estimates up to &lt;strong&gt;200K vulnerable instances&lt;/strong&gt; across a supply chain of &lt;strong&gt;150M+ downloads&lt;/strong&gt;. The &lt;a href="https://labs.cloudsecurityalliance.org/research/csa-research-note-mcp-by-design-rce-ox-security-20260420-csa/" rel="noopener noreferrer"&gt;Cloud Security Alliance independently confirmed the findings&lt;/a&gt;. And the part that makes this an ongoing problem rather than a patch cycle: &lt;a href="https://thehackernews.com/2026/04/anthropic-mcp-design-vulnerability.html" rel="noopener noreferrer"&gt;Anthropic declined to modify the protocol&lt;/a&gt;, stating the behavior is by design and sanitization is the developer's responsibility. &lt;strong&gt;The only upstream change was a documentation update.&lt;/strong&gt; Remediation sits with whoever runs the server. &lt;strong&gt;That means you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you run MCP in-house, you own that surface continuously: allowlisting spawn commands, treating every config source as untrusted, auditing registries, and tracking the next CVE in the family (ten and counting from this one root cause). And that is one surface among many. Self-hosting AI infrastructure means also owning auth, secrets, warm model servers, queue pressure, deployment, and rollbacks. Every layer you run yourself is a layer you patch, monitor, and answer for. RocketRide Cloud takes the infrastructure ops layer off your plate, which shrinks the surface your team has to defend to the parts only your team can own. Build the pipeline, call it from your app, one click to production.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqofyfp259zqp5vay0wha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqofyfp259zqp5vay0wha.png" alt="The RocketRide Cloud server monitor" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The RocketRide Cloud server monitor. Uptime, connections, and resource usage tracked continuously.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  At Stripe scale, the harness is the product
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.bytebytego.com/p/how-stripes-minions-ship-1300-prs" rel="noopener noreferrer"&gt;Stripe's autonomous coding agents merge 1,300+ PRs per week with zero human-written code&lt;/a&gt;. The revealing part of their engineering writeup is that &lt;strong&gt;the model is almost a commodity&lt;/strong&gt;. What makes the system work is the infrastructure around it: isolated sandboxes that spin up in seconds, deterministic gates interleaved with agent steps, selective CI, and scoped context management. &lt;strong&gt;The harness is the product.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most teams do not have Stripe's decade of platform investment to build that harness on. And at high concurrency, the orchestration layer itself becomes the cost: &lt;strong&gt;per-pipeline memory footprint&lt;/strong&gt;, &lt;strong&gt;serialization overhead&lt;/strong&gt; between steps, and &lt;strong&gt;startup latency&lt;/strong&gt; all compound as run volume grows. RocketRide's execution engine is &lt;strong&gt;native C++ with multithreading&lt;/strong&gt;, built for exactly this throughput profile rather than retrofitted from a prototype.&lt;/p&gt;

&lt;p&gt;There is also a failure mode that only appears at run length. An agent &lt;strong&gt;passes every eval, then degrades deep into the run&lt;/strong&gt;, dozens of tool calls in, and nobody knows why until the run is over. Aggregate metrics never catch it, because the failure is specific to one run, not a statistical property of all runs. Catching it requires the full execution trace of the run that broke: every node, every handoff, where the drift started. RocketRide traces &lt;strong&gt;every LLM call, token, and millisecond scoped to the individual run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmq0vnr5b5pn6qj1yubuf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmq0vnr5b5pn6qj1yubuf.png" alt="Run-scoped trace" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Run-scoped trace. Every node and handoff, scoped to the run that failed.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The same pipeline keeps getting rebuilt
&lt;/h2&gt;

&lt;p&gt;Most AI pipeline work lives in individual environments. One engineer builds the prompt scaffolding. Another wires the tool calls. A third adds eval steps. None of it is in the same place, and when someone leaves, &lt;strong&gt;the context leaves with them&lt;/strong&gt;. The next team that needs the same capability starts from scratch.&lt;/p&gt;

&lt;p&gt;Here is what a shared pipeline looks like in practice. This RAG pipeline is a standard flow: ingest through a webhook, parse, embed, store in Qdrant, and a chat path that retrieves and answers grounded in that store. The screenshot below shows the topology. What matters is not the shape, it is that the whole thing is &lt;strong&gt;one portable .pipe JSON file&lt;/strong&gt;, and &lt;a href="https://github.com/rocketride-org/rocketride-server/blob/develop/examples/rag-pipeline.pipe" rel="noopener noreferrer"&gt;the full example is in the open-source repo&lt;/a&gt;. Point the LLM node at a different provider, run it on your laptop or on Cloud. &lt;strong&gt;Same file, same behavior.&lt;/strong&gt; One team defines it, others run it and build on top. &lt;strong&gt;The context lives in the file&lt;/strong&gt;, not in whoever built it first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsykjm5mmbu8e23uzewul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsykjm5mmbu8e23uzewul.png" alt="he RAG pipeline" width="799" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The RAG pipeline: Webhook, Parser, Generate Text, Transformer, Qdrant on ingestion, and a chat path through Transformer and Qdrant to the LLM.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Per-token prices keep falling, but the compute underneath is repricing upward and &lt;strong&gt;the subsidies that sat between those two numbers are ending&lt;/strong&gt;. The dominant agent protocol has a by-design flaw whose remediation sits with you. The teams shipping agents at real scale are winning on &lt;strong&gt;infrastructure, not model choice&lt;/strong&gt;. Each of these compounds while the model layer keeps commoditizing.&lt;/p&gt;

&lt;p&gt;Try the claim yourself. Grab the &lt;a href="https://github.com/rocketride-org/rocketride-server/blob/develop/examples/rag-pipeline.pipe" rel="noopener noreferrer"&gt;RAG pipeline example&lt;/a&gt; from the repo, run it on RocketRide Cloud, then run the same .pipe file on the MIT-licensed open-source server on your own machine. &lt;strong&gt;Same file, same execution.&lt;/strong&gt; If it does not work as described, that is worth knowing. If it does, you have a production pipeline you own either way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloud.rocketride.ai" rel="noopener noreferrer"&gt;RocketRide Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rocketride-org/rocketride-server" rel="noopener noreferrer"&gt;RocketRide Server on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=RocketRide.rocketride" rel="noopener noreferrer"&gt;VS Code extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
      <category>llm</category>
    </item>
    <item>
      <title>Build the Runtime, Not the Stack</title>
      <dc:creator>mithilesh gaurihar</dc:creator>
      <pubDate>Mon, 29 Jun 2026 15:08:40 +0000</pubDate>
      <link>https://dev.to/mithilesh_gaurihar_e719cd/build-the-runtime-not-the-stack-44md</link>
      <guid>https://dev.to/mithilesh_gaurihar_e719cd/build-the-runtime-not-the-stack-44md</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://www.linkedin.com/in/krishgarg-/" rel="noopener noreferrer"&gt;Krish Garg&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/mithilesh-gaurihar/" rel="noopener noreferrer"&gt;Mithilesh Gaurihar&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this post covers
&lt;/h2&gt;

&lt;p&gt;AI infrastructure risk is no longer theoretical. Here is what we are going to walk through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A US government directive took Anthropic's Fable 5 offline for every developer on the planet, with zero notice.&lt;/li&gt;
&lt;li&gt;GitHub Copilot ended flat-rate pricing and moved to usage-based billing, quietly ending the AI coding subsidy era.&lt;/li&gt;
&lt;li&gt;Every team hard-wired to a single model, tool, or pricing plan had no fallback. The ones that did had a runtime layer sitting above all of it.&lt;/li&gt;
&lt;li&gt;Model-agnostic doesn't mean migration is free. You will retune. But the runtime scopes the damage to one layer instead of everything.&lt;/li&gt;
&lt;li&gt;The platforms you're routing across, OpenAI, Anthropic, Microsoft, are all actively trying to absorb the orchestration layer themselves. That's the real lock-in risk, not the model.&lt;/li&gt;
&lt;li&gt;The answer is building the runtime on open infrastructure before you need it, not after.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bottom line: the model, the tool, and the pricing plan can all move overnight. The only thing that doesn't have to is the runtime layer above them.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Headlines. One Lesson.
&lt;/h2&gt;

&lt;p&gt;The US Commerce Department sent Anthropic a letter on a Friday evening. By midnight, Fable 5 and Mythos 5 were offline for every user on the planet. Not just foreign nationals, but everyone, because Anthropic had no way to verify citizenship at scale in real time. AWS Bedrock, Google Cloud, Microsoft Foundry, and the direct Claude API all went dark simultaneously. Teams woke up the next morning to broken pipelines and no warning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/news/fable-mythos-access" rel="noopener noreferrer"&gt;Read Anthropic's official statement →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Around the same time, GitHub Copilot ended flat-rate pricing and moved every plan to usage-based billing. The AI coding subsidy era ended with an email and a new line item on the bill.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/" rel="noopener noreferrer"&gt;Read the GitHub announcement →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you think that's isolated to models and billing, SpaceX has agreed to acquire Cursor-maker Anysphere for $60 billion pending regulatory approval. Same pattern, different layer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cbsnews.com/news/spacex-cursor-60-billion-ai-acquisition/" rel="noopener noreferrer"&gt;Read the CBS News report →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Different companies. Different layers. Same pattern: rented ground.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc8kp69ngyvcjwn53voiu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc8kp69ngyvcjwn53voiu.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;Most AI system engineering goes into the model layer. Prompt design, tool calling, eval pipelines, output parsing. All of it tuned against a specific model's behavior. When that model changes, disappears, or gets repriced, the tuning work is either portable or it isn't. In most production systems, it isn't.&lt;/p&gt;

&lt;p&gt;The layer that makes it portable is the runtime: model routing, observability, and cost tracking sitting above the model itself. Teams that built that layer had options on Friday night. Teams that didn't were waiting for support tickets.&lt;/p&gt;

&lt;p&gt;This isn't a new idea. Perplexity's Aravind Srinivas has argued that the model is not the product. Anthropic's Boris Cherny has written about loop engineering: stop prompting agents directly and design the loops that prompt them. The durable artifact is the loop, not the model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This news just made that expensive to ignore.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What model-agnostic actually means in practice
&lt;/h2&gt;

&lt;p&gt;A model-agnostic runtime needs to do three things. Most teams skip all three until they are forced to deal with the consequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Treat the model as a configuration, not a dependency.&lt;/strong&gt;&lt;br&gt;
Prompts, tool definitions, and output schemas should not assume a specific provider's API shape. The moment your prompt is written for GPT-4's output format, or your tool calling assumes Anthropic's schema, you have a hard dependency masquerading as flexibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Span the entire run.&lt;/strong&gt;&lt;br&gt;
The runtime needs to see every component, every model call, every handoff in a single trace. When you route across multiple models, the failure is almost never inside one model. It is in the handoff between them. A trace that only covers one provider tells you nothing useful about that failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Surface cost in real time.&lt;/strong&gt;&lt;br&gt;
Not in a billing dashboard at the end of the month. As the run executes. When you pay per token, the decision of whether to commit a workload to an expensive model needs to happen before you commit it, not after.&lt;/p&gt;

&lt;p&gt;Most teams get none of these right because they build the model integration first and the runtime later.&lt;/p&gt;




&lt;h2&gt;
  
  
  How RocketRide implements this
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The model is a node, not a dependency
&lt;/h3&gt;

&lt;p&gt;In RocketRide's pipeline builder, the model is a component node sitting between your prompt and your output. A Chat source feeds into a Prompt component, passes questions to an LLM node, and returns answers downstream. That LLM node is a configuration entry. Point it at OpenAI, Anthropic, Gemini, Mistral, Qwen, or a local Ollama instance and the rest of the pipeline stays exactly where it is. The connections, the prompt component, the output handler: none of it changes. You are swapping one node, not rewriting the system.&lt;/p&gt;

&lt;p&gt;Here is what a pipeline looks like running end to end:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frce9ktcfaozlw7vlhtm9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frce9ktcfaozlw7vlhtm9.gif" alt=" " width="480" height="310"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Swap GPT for Claude, Gemini, Qwen, Mistral, or a local Ollama instance without touching the pipeline.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Every run is fully observable
&lt;/h3&gt;

&lt;p&gt;When a pipeline runs, RocketRide streams six views simultaneously: Design, Status, Tokens, Flow, Trace, and Errors. Each scoped to that specific run, not aggregated across all runs. The Status tab streams CPU%, CPU Memory, GPU Memory, and Total Completions per second in real time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuw3b3kvi95lt6jim3oe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuuw3b3kvi95lt6jim3oe.png" alt="Status tab showing live performance metrics — CPU, memory, and completion throughput streaming live as the pipeline executes" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CPU, memory, and completion throughput stream live as the pipeline executes. Scoped to the run, not the account.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This matters for a specific reason. When you route across multiple models, the runtime is the only place that sees all of them. Without that span, you are flying blind across every provider boundary. A trace that only covers one model tells you nothing useful when the failure is in the handoff between them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost surfaces before you commit
&lt;/h3&gt;

&lt;p&gt;The Tokens tab breaks down what each component consumed: Total Tokens, CPU Usage, CPU Memory, and GPU Memory, per component, not just as a pipeline total.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11lchkb0o2x7322dq5pq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11lchkb0o2x7322dq5pq.png" alt="Tokens tab showing Chat component: Total Tokens 27.7, CPU Usage 25.2, CPU Memory 2.5, GPU Memory 0.0" width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Tokens tab breaks down CPU usage, memory, and total tokens per component in real time. Cost visibility at the right layer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That per-component breakdown is what makes cost decisions actionable. You can see whether the Chat component is consuming disproportionate tokens before the expensive LLM node even runs. When you are evaluating whether a cheaper model held up on a complex task, you are looking at this view, not waiting for an invoice at the end of the month.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest part: swapping is not free
&lt;/h2&gt;

&lt;p&gt;Repointing a config key is the start of the work, not the end.&lt;/p&gt;

&lt;p&gt;If the banned model was the one your prompts, tool-calling schemas, and eval thresholds were tuned against, you will retune. Prompt behavior differs across providers. Tool calling schemas are not universal. Evals that passed on one model will fail on another. That is real effort and we won't pretend otherwise.&lt;/p&gt;

&lt;p&gt;What the runtime gives you is a scoped problem instead of an architectural crisis. The pipeline structure, the tracing across the Flow and Trace tabs, the cost visibility in the Tokens tab: none of that moves when you swap the model node. You are fixing one layer, not rebuilding everything. That distinction matters when you are scrambling at midnight because a government directive just took your model offline.&lt;/p&gt;

&lt;p&gt;The economics make the effort worth it. &lt;a href="https://www.harvey.ai/blog/expanding-harveys-model-offerings" rel="noopener noreferrer"&gt;Harvey's multi-model approach&lt;/a&gt; points to a consistent pattern: routing cheaper models for lower-complexity steps and premium models where it counts can outperform a single expensive model while costing less. When you pay per token, that gap compounds across every agent run. But those gains only materialize if the runtime layer exists to do the routing and the measurement. Without it, you cannot even see where the cost is going, let alone optimize it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The counterargument worth taking seriously
&lt;/h2&gt;

&lt;p&gt;The obvious pushback: capability beats resilience. Bet on the best model and architectural flexibility is a distraction.&lt;/p&gt;

&lt;p&gt;The stronger version is structural. &lt;a href="https://openai.com/index/introducing-agentkit/" rel="noopener noreferrer"&gt;OpenAI's AgentKit&lt;/a&gt; and &lt;a href="https://venturebeat.com/orchestration/anthropics-claude-managed-agents-gives-enterprises-a-new-one-stop-shop-but" rel="noopener noreferrer"&gt;Anthropic's Managed Agents&lt;/a&gt; are both pulling orchestration, memory, evals, and observability into managed surfaces. VentureBeat reported that Anthropic has explicitly signaled the orchestration layer is where lock-in will live, because tooling infrastructure will outlast interchangeable models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The platforms you are routing across are actively trying to absorb the runtime themselves.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a real risk. It is also the clearest argument for building on open infrastructure. A vendor-owned runtime is the same rented ground problem one layer up. The swap cost has to stay low, which means the runtime cannot be the thing you are locked into. That is why &lt;a href="https://github.com/rocketride-org/rocketride-server" rel="noopener noreferrer"&gt;RocketRide Server is open source&lt;/a&gt;. Not as a positioning decision. As an architectural one.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;The routing logic, tracing, and cost attribution are not novel engineering. What is hard is building the abstraction before you need it. Most teams build the model integration first and the runtime later, if at all. When the model gets banned or repriced, there is no later.&lt;/p&gt;

&lt;p&gt;If your loop is model-agnostic, observable, and on open infrastructure, the next ban, acquisition, or repricing is an operational inconvenience rather than an architectural crisis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cloud.rocketride.ai" rel="noopener noreferrer"&gt;&lt;strong&gt;Try RocketRide Cloud&lt;/strong&gt;&lt;/a&gt; — spin up a model-agnostic runtime and watch every component trace and token stream live as it runs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rocketride-org/rocketride-server" rel="noopener noreferrer"&gt;&lt;strong&gt;RocketRide Server on GitHub&lt;/strong&gt;&lt;/a&gt; — open source and open to contributions. If you're building in this space, we'd love to build alongside you.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=RocketRide.rocketride" rel="noopener noreferrer"&gt;&lt;strong&gt;Download the free VS Code extension&lt;/strong&gt;&lt;/a&gt; — the pipeline builder and all six run views live directly inside VS Code, free and open source, no account needed to get started.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;If you've run a pipeline on &lt;a href="https://cloud.rocketride.ai" rel="noopener noreferrer"&gt;RocketRide Cloud&lt;/a&gt;, let us know your &lt;a href="https://forms.cloud.microsoft/Pages/ResponsePage.aspx?id=FDSRephNkEqwBhb0HXoxXtiaIQBmy29Fsyt1y9jysfpUMzExSUg3Uk1YOUNOU0VTSjFEWVdHWUNCWC4u" rel="noopener noreferrer"&gt;feedback.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>softwareengineering</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
