<?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).</description>
    <link>https://dev.to/mithilesh_gaurihar</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</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mithilesh_gaurihar"/>
    <language>en</language>
    <item>
      <title>Rocket Ralph: Support That Answers While You Sleep</title>
      <dc:creator>Mithilesh Gaurihar</dc:creator>
      <pubDate>Wed, 29 Jul 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/mithilesh_gaurihar/rocket-ralph-support-that-answers-while-you-sleep-3fd0</link>
      <guid>https://dev.to/mithilesh_gaurihar/rocket-ralph-support-that-answers-while-you-sleep-3fd0</guid>
      <description>&lt;p&gt;&lt;em&gt;A multimodal RAG pipeline that answers our community's questions in Discord around the clock, running on RocketRide Cloud.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A few months ago, a new member joined our Discord, installed RocketRide that evening, and got stuck around midnight. They could not find the configuration file they needed, so they asked in the help channel.&lt;/p&gt;

&lt;p&gt;By morning, someone on our team had found the right documentation, added a little context, and sent it over. The member was unblocked. A week later, somebody else asked the same question. Then another question arrived while the team was asleep. The answers were usually already written down, but a person still had to find and deliver them.&lt;/p&gt;

&lt;p&gt;That was the actual problem. We didn't need more documentation. We needed a better path between the documentation and the person asking for help.&lt;/p&gt;

&lt;p&gt;So we built a retrieval-augmented generation pipeline that could accept our existing material, find useful context for a question, and return an answer in the same Discord channel. We call him Rocket Ralph. The RocketRide portion is 21 components on the canvas: 30 minutes to a working path, longer to a trustworthy one. Our existing Discord bot sends messages to the pipeline through a webhook, so we didn't have to build another application around it.&lt;/p&gt;

&lt;p&gt;If you would rather watch than read, we recorded the build:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/vaV7_isrA7Y"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Wanted
&lt;/h2&gt;

&lt;p&gt;We weren't trying to build another bot that replies with "Have you checked the FAQ?"&lt;/p&gt;

&lt;p&gt;The useful version had to work with the material we already had: written guides, PDFs, screenshots, recorded walkthroughs, and the repositories themselves. It also had to stay inside Discord. Nobody should have to leave the conversation, open a separate support tool, and ask the same question again.&lt;/p&gt;

&lt;p&gt;There were two parts to the pipeline. One prepared our knowledge for retrieval. The other handled questions as they arrived.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning Messy Material Into Searchable Context
&lt;/h2&gt;

&lt;p&gt;The ingestion flow begins with a Dropper, RocketRide's file-input node. The Dropper accepts the source material; the downstream nodes decide how to process it.&lt;/p&gt;

&lt;p&gt;Documents go through parsing, then chunking with a RecursiveCharacterTextSplitter so the pieces break on natural boundaries instead of mid-sentence. Screenshots and extracted images go through OCR. Audio is transcribed. Video can be separated into audio and representative frames so that spoken explanations and on-screen text are not lost. Each path eventually produces text with enough source information to understand where it came from.&lt;/p&gt;

&lt;p&gt;A miniLM embedding model converts those text chunks into vectors, and the pipeline stores them in Qdrant. The practical reason for doing this is simple: the wording in a question rarely matches the wording in a document exactly. Someone may ask about an "authentication problem" while the relevant guide calls it a "login error." Vector retrieval gives us a way to find likely matches based on similarity rather than relying only on exact keywords.&lt;/p&gt;

&lt;p&gt;This step does not train the agent or guarantee that it will find the right document. It creates a searchable index of the material we supplied. That distinction became important later, because retrieval quality is something we can inspect and improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens When Someone Asks a Question
&lt;/h2&gt;

&lt;p&gt;When a message arrives from Discord, our bot forwards it to the pipeline's webhook. The query side then follows a short path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The question is embedded using the same miniLM model used during ingestion.&lt;/li&gt;
&lt;li&gt;Qdrant returns the closest matching chunks, filtered by a 0.7 similarity score threshold so marginal matches stay out of the context.&lt;/li&gt;
&lt;li&gt;The question and retrieved context are passed together to a CrewAI agent backed by OpenAI GPT-4.1.&lt;/li&gt;
&lt;li&gt;The answer is trimmed to 1,900 characters, safely under Discord's message limit, and returned to the channel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For harder questions, Ralph also has tools that can inspect our GitHub repositories or call an external API. Those tools are optional; retrieval remains the first source of context. If the indexed material does not contain a reliable answer, the agent should say so rather than fill the gap from memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Guardrails
&lt;/h2&gt;

&lt;p&gt;An agent with tools needs limits more than it needs more capabilities, and Ralph's limits are enforced by the pipeline rather than left to the prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The GitHub tools are read-only. Ralph can search and read our repositories; he cannot write to them.&lt;/li&gt;
&lt;li&gt;The HTTP tool makes GET requests only, and only against a whitelist of URLs we control.&lt;/li&gt;
&lt;li&gt;Tool calls are rate-limited, so a misbehaving loop cannot hammer an API or drain a quota.&lt;/li&gt;
&lt;li&gt;Ralph cannot claim a search happened without a tool result to show for it. If nothing came back, the answer says so.&lt;/li&gt;
&lt;li&gt;When he cannot answer, or a tool errors in a way he does not recognize, he does not improvise. He mentions the team in the channel so a human can jump in.&lt;/li&gt;
&lt;li&gt;Billing questions are not his to answer. Those get a team mention, every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The credentials behind those tools are stored as RocketRide environment variables and injected at runtime. They are not pasted into the .pipe file, which means the pipeline can be shared or versioned without carrying an API key with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting Every Step
&lt;/h2&gt;

&lt;p&gt;The first version did not always retrieve the context we expected. That was useful, because it showed us exactly what we needed from the tooling around the agent.&lt;/p&gt;

&lt;p&gt;RocketRide's Status view shows the active task and its nodes. The Flow view shows the route an input took through the pipeline. The Trace tab exposes the useful debugging details: what Qdrant returned, what context the agent received, which tools it invoked, what each stage produced, and how long the stages took.&lt;/p&gt;

&lt;p&gt;That is not the same as reading a model's private chain of thought. It is something more operationally useful: a record of the inputs, retrieval results, tool activity, and outputs that we can actually act on.&lt;/p&gt;

&lt;p&gt;If an answer is weak, we can see whether the problem began with parsing, chunking, retrieval, prompting, or a tool call. Instead of changing the prompt and hoping for the best, we can fix the stage that produced the bad input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Take Our Word for It
&lt;/h2&gt;

&lt;p&gt;The first real test worked: the same kind of configuration-file question that started this project came in through Discord, moved through embedding and retrieval, and came back answered, with the right documentation attached and nobody on the team involved. But our word is exactly the kind of evidence this post says you shouldn't settle for.&lt;/p&gt;

&lt;p&gt;So test him yourself. &lt;a href="https://discord.gg/PMXrtenMsY" rel="noopener noreferrer"&gt;Join our Discord&lt;/a&gt; and ask Ralph a real question. Then try to make him make something up: ask about a feature we don't ship, a configuration option that doesn't exist, a version that was never released. The guardrails above mean he cannot claim a search he never ran, and his instructions tell him to say when the indexed material doesn't support an answer. Whether he declines or answers, the Trace shows exactly what was retrieved, what he was given, and what he did with it. We read those traces.&lt;/p&gt;

&lt;p&gt;One successful answer does not prove that a support bot is finished. It does prove the path works end to end. The next work is less glamorous and more important: adding representative source material, testing the questions people actually ask, reviewing failed retrievals, and giving the agent a clear way to admit when the context is insufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Run It on Cloud
&lt;/h2&gt;

&lt;p&gt;Building the pipeline was only half the job. A Discord support bot needs a stable endpoint when nobody has the RocketRide canvas open and every developer laptop is closed.&lt;/p&gt;

&lt;p&gt;We run the .pipe on RocketRide Cloud so the webhook and pipeline remain available. Cloud also gives the team one place to manage runtime variables and inspect live tasks and traces. The artifact itself stays portable: it is the same .pipe format we can run locally or with the open-source server.&lt;/p&gt;

&lt;p&gt;That portability matters. A team with strict data-residency requirements or an existing platform group can self-host the runtime and operate the surrounding services. We use Cloud here because answering Discord questions is the product workflow; maintaining the infrastructure behind that workflow is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Would Tell Someone Building This
&lt;/h2&gt;

&lt;p&gt;Start with the material you have, not the knowledge base you wish you had. Useful context often lives in screenshots and recordings as well as polished documentation.&lt;/p&gt;

&lt;p&gt;Treat retrieval as a component to test, not an oracle. Qdrant returns candidates. The agent still needs clear instructions for using them and for declining questions they do not support.&lt;/p&gt;

&lt;p&gt;Finally, demand evidence from the pipeline. You should be able to see what was retrieved, what reached the model, which tools ran, and what came back. Without that record, every incorrect answer becomes guesswork.&lt;/p&gt;

&lt;p&gt;The result is not a replacement for the people in our community. It handles the repeated questions whose answers already exist, including the ones that arrive while the team is asleep. That leaves the human conversations for the problems that actually need a human.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Your Own
&lt;/h2&gt;

&lt;p&gt;Everything Ralph runs on is available today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build and host your pipeline on &lt;a href="https://cloud.rocketride.ai" rel="noopener noreferrer"&gt;RocketRide Cloud&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rather run it yourself? &lt;a href="https://github.com/rocketride-org/rocketride-server" rel="noopener noreferrer"&gt;rocketride-server&lt;/a&gt; is open source&lt;/li&gt;
&lt;li&gt;Or build right in your editor 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;

&lt;p&gt;And if you get stuck, hop into the &lt;a href="https://discord.gg/PMXrtenMsY" rel="noopener noreferrer"&gt;RocketRide Discord&lt;/a&gt; and ask. Yes, Ralph is in there too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>discord</category>
      <category>python</category>
    </item>
    <item>
      <title>Why We Run Every AI Pipeline in Its Own Process</title>
      <dc:creator>Mithilesh Gaurihar</dc:creator>
      <pubDate>Mon, 27 Jul 2026 21:07:47 +0000</pubDate>
      <link>https://dev.to/mithilesh_gaurihar/why-we-run-every-ai-pipeline-in-its-own-process-1ikc</link>
      <guid>https://dev.to/mithilesh_gaurihar/why-we-run-every-ai-pipeline-in-its-own-process-1ikc</guid>
      <description>&lt;p&gt;&lt;em&gt;The runtime boundary behind RocketRide's crash isolation, task lifecycle, and Cloud operations.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;At 9 a.m., with ten thousand users mid-session, a node in an AI pipeline dereferences a bad pointer. The process running it is gone before Python can raise a useful exception. That is an unpleasant failure, but it is not the question we care about most.&lt;/p&gt;

&lt;p&gt;The question is what happens next. Does that crash take unrelated pipelines with it? Does the server need a restart? Does the on-call engineer walk into a system-wide incident, or into one failed task and a useful record of why it failed?&lt;/p&gt;

&lt;p&gt;In RocketRide, a failed task is meant to be contained and recorded. The server sees the child process exit, updates the task's state and exit code, releases the task's ports and connections, and sends status updates to subscribed monitors. The run stops. Its history does not vanish. Other task processes are not sharing its memory, interpreter, or worker threads.&lt;/p&gt;

&lt;p&gt;That behavior comes from a decision we made early: every pipeline run gets its own isolated process.&lt;/p&gt;

&lt;p&gt;It is not the cheapest or fastest possible architecture. Starting a process has a cost, and keeping one around has a cost too. We accepted those costs because the alternative makes failures much harder to reason about once Python code, native libraries, model runtimes, and user-defined nodes are all running in the same service.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Process, One Blast Radius
&lt;/h2&gt;

&lt;p&gt;An AI pipeline does not fail like a typical request handler. A normal exception is one thing. A segfault in a C extension, a crash in a media decoder, or a broken native inference library is another. Once a process has corrupted memory, application-level error handling is no longer a reliable line of defense.&lt;/p&gt;

&lt;p&gt;So each RocketRide task starts as a fresh child process with its own embedded Python interpreter. It loads one pipeline, initializes that pipeline's nodes, and owns the work for that run. The parent runtime keeps the task registry, allocates the task's local ports, monitors the child, and handles its lifecycle.&lt;/p&gt;

&lt;p&gt;The transport details matter here. The parent supervises the child through standard input and output streams, while pipeline data is handled through a local WebSocket endpoint assigned to that task. It is not a simple request pipe with a response pipe on the other end. The important property is the boundary: a task has a supervisor, a known process, and an exit status.&lt;/p&gt;

&lt;p&gt;When the child exits unexpectedly, the runtime marks it as stopped, records the exit code, cleans up the data and debug connections, and makes that state visible to clients subscribed through &lt;code&gt;rrext_monitor&lt;/code&gt;. The system has a record for a live incident and a post-mortem later. We are not trying to hide a failure inside "continuous operation." We are trying to keep one failure from becoming every customer's failure.&lt;/p&gt;

&lt;p&gt;The same boundary also works in reverse. Child processes are launched with an auto-terminate setting, so they exit when their parent goes away rather than becoming unsupervised work that lingers after a server shutdown.&lt;/p&gt;

&lt;p&gt;This is fault isolation, not a security sandbox. Separate processes limit the blast radius of a broken workload. They do not, by themselves, turn untrusted code into a safe multi-tenant security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping a Good Process Around
&lt;/h2&gt;

&lt;p&gt;The obvious downside of process isolation is startup. A new task may have to start Python, import packages, read the &lt;code&gt;.pipe&lt;/code&gt; file, construct the graph, connect to services, and prepare any state the nodes need. Paying that cost for every message in a chat or every page in a document job would be wasteful.&lt;/p&gt;

&lt;p&gt;Today, a pipeline is either running or it is not. There is no pre-warmed middle state yet: tasks that are known to the runtime and spin up the moment a request arrives are planned, but we would rather describe what ships. What ships is a set of controls that decide when a running pipeline stays up and when it goes away.&lt;/p&gt;

&lt;p&gt;In production, the application owns the pipeline's lifetime: it starts the pipeline it needs and stops it when it is done. Development is where the runtime steps in, with three mechanisms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Restart on change.&lt;/strong&gt; The runtime detects when you save the pipeline and restarts it. You can have that happen automatically, after a prompt, or never.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-to-live.&lt;/strong&gt; A development pipeline that outlives its application should not quietly run up costs. The default TTL is 15 minutes: if nothing touches the task for that long, it shuts itself down, and it is up to the caller to start it again with the pipeline it wants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;useExisting&lt;/code&gt;.&lt;/strong&gt; An application that just needs a pipeline can set &lt;code&gt;useExisting&lt;/code&gt; and leave the TTL alone. If the pipeline is already running, the app uses it; if not, the runtime starts it. On the next run, a stopped pipeline starts again automatically, and one still inside its idle window is simply reused.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While a task stays up, it keeps its state: the same process, the same initialized pipeline. The first request pays the initialization cost, and the requests that follow use the process that is already ready. It is still not a shared worker pool. A running task remains one pipeline's process, with one pipeline's state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Is Real
&lt;/h2&gt;

&lt;p&gt;We do not think process-per-run is the right answer for every system. An in-process runtime starts faster, uses less memory, and avoids crossing process boundaries. For a local experiment, a trusted script, or a short-lived internal tool, that can be the right choice.&lt;/p&gt;

&lt;p&gt;Our concern was the point at which a runtime becomes shared infrastructure. At that point, the platform needs to know which process owns a pipeline, which process owns a port, how a task is terminated, what happened when it died, and how to avoid orphaned work. A team can assemble those pieces with worker frameworks and process managers. We wanted them to be the default behavior of the runtime rather than an operations project every pipeline author has to recreate.&lt;/p&gt;

&lt;p&gt;The C++ layer is not there to make CPU-bound Python magically faster. Python remains where developers use the model libraries, data ecosystem, and notebook-friendly tools that make modern AI practical. The runtime's job is to give that Python code a dependable floor: native orchestration, task lifecycles, explicit cleanup, and a process boundary when something goes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Cloud Begins
&lt;/h2&gt;

&lt;p&gt;The open-source runtime gives a team this execution model on its own infrastructure. Running it as a service adds a different job. Running tasks are stateful; access needs an identity; and task usage needs to belong to an organization, team, and user. Once those concerns stretch beyond one developer's laptop, they are not incidental deployment details. They are the operating system around the runtime.&lt;/p&gt;

&lt;p&gt;RocketRide Cloud takes on that work while keeping the pipeline format portable. Cloud uses API-key access, records task-level usage against the relevant organization, team, and user, and uses health checks around the services that supervise and route tasks. Session-level routing is part of the Cloud architecture because a running task belongs to a particular runtime instance. That is operational work, not a reason to turn a deployment diagram into a promise of unlimited scale.&lt;/p&gt;

&lt;p&gt;Cost tracking is where that attribution earns its keep, and it covers both halves of a pipeline's life. Development and deployment are tracked as separate costs, so a team can see what building a pipeline cost before it ever served production traffic, and what running it costs after.&lt;/p&gt;

&lt;p&gt;During development, a project team with five members can see exactly what each person's runs cost, then roll those numbers up into the total for the project. At deployment, a pipeline is deployed into a production team, and that team's costs are visible the same way, down to the individual user. Every task's usage lands against the organization, the team, and the user that spent it, so the question of what a pipeline costs has an answer at every level someone actually asks it: per person, per team, per organization.&lt;/p&gt;

&lt;p&gt;That is also why self-hosting remains a real option, not a grudging footnote. Teams with a VPC requirement, air-gapped deployment, strict data residency, or an existing platform group may want to own every layer themselves. The same &lt;code&gt;.pipe&lt;/code&gt; files and runtime are available for that path. Cloud is for teams that want the execution model without taking on the day-to-day responsibility of operating it.&lt;/p&gt;

&lt;p&gt;The decision rule is straightforward. Self-host when owning the infrastructure is part of the job. Use Cloud when the pipeline is the work and operating the pipeline platform is not. Either way, the artifact you build remains yours.&lt;/p&gt;

&lt;p&gt;Build and run a pipeline on &lt;a href="https://cloud.rocketride.ai/" rel="noopener noreferrer"&gt;RocketRide Cloud&lt;/a&gt;, self-host with &lt;a href="https://github.com/rocketride-org/rocketride-server" rel="noopener noreferrer"&gt;RocketRide Server&lt;/a&gt;, or start in the &lt;a href="https://marketplace.visualstudio.com/items?itemName=RocketRide.rocketride" rel="noopener noreferrer"&gt;RocketRide VS Code extension&lt;/a&gt;. And if you have questions about any of this, come find us on the &lt;a href="https://discord.gg/PMXrtenMsY" rel="noopener noreferrer"&gt;RocketRide Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <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/an-ai-agent-broke-into-hugging-face-the-scary-part-isnt-the-break-in-b20</link>
      <guid>https://dev.to/mithilesh_gaurihar/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/a-pipeline-is-a-file-running-it-is-the-work-5ao5</link>
      <guid>https://dev.to/mithilesh_gaurihar/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/what-the-ai-stack-looks-like-below-the-model-bf4</link>
      <guid>https://dev.to/mithilesh_gaurihar/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/build-the-runtime-not-the-stack-44md</link>
      <guid>https://dev.to/mithilesh_gaurihar/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>
