<?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: Sigireddy Viswesh</title>
    <description>The latest articles on DEV Community by Sigireddy Viswesh (@sigireddy_viswesh).</description>
    <link>https://dev.to/sigireddy_viswesh</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%2F4146851%2F20e66d96-e936-4842-ae36-cf136c8bbb19.jpg</url>
      <title>DEV Community: Sigireddy Viswesh</title>
      <link>https://dev.to/sigireddy_viswesh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sigireddy_viswesh"/>
    <language>en</language>
    <item>
      <title>How a failed SaaS pricing calculator, A Gemini quota meltdown, and FalkorDB led us to build Banana.</title>
      <dc:creator>Sigireddy Viswesh</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:06:08 +0000</pubDate>
      <link>https://dev.to/sigireddy_viswesh/how-a-failed-saas-pricing-calculator-a-gemini-quota-meltdown-and-falkordb-led-us-to-build-banana-48eh</link>
      <guid>https://dev.to/sigireddy_viswesh/how-a-failed-saas-pricing-calculator-a-gemini-quota-meltdown-and-falkordb-led-us-to-build-banana-48eh</guid>
      <description>&lt;h2&gt;
  
  
  Peel Back the Chaos: Smarter AI Coding with Banana
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I genuinely wanted to ask GPT to write this entire blog, slam my laptop shut, and enjoy some uninterrupted sleep. But staring at graph queries and an exhausted Gemini quota right in the middle of testing, I figured the internet deserved to know what happened. Also, the best blog post wins Apple AirPods 5. I'm not above risking my dignity for noise cancellation. 🎧&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why I Built Banana
&lt;/h2&gt;

&lt;p&gt;Banana started as a B2B SaaS pricing calculator. Don't ask me about the name. it's just random. After hours of wrestling with Streamlit and discount sliders, I asked myself:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Would I ever voluntarily use this product?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer was no.&lt;/p&gt;

&lt;p&gt;Meanwhile, AI coding agents were making the same mistakes over and over: forgetting architectural decisions, breaking dependency boundaries, and consuming huge amounts of context just to understand a codebase.&lt;/p&gt;

&lt;p&gt;So I nuked the UI and pivoted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ui/ components/ deal_calculator.py
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"pivot: delete pricing sliders, embrace the void"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meet &lt;strong&gt;Banana&lt;/strong&gt;: a graph-powered memory and context engine for coding agents. It helps tools like Claude Code and Cursor retrieve code relationships, remember architectural decisions, and check explicit rules through MCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  The FalkorDB Skepticism: "Wait, Is This Just Redis with a Mustache?"
&lt;/h2&gt;

&lt;p&gt;When I first seen FalkorDB, I’ll be completely honest: I thought it was some cheap knockoff of Redis and Neo4j. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Oh great, another database. Is this just RedisGraph repackaged with a shiny logo, or Neo4j that demands 4GB of RAM just to clear its throat?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I expected a clunky wrapper over key-value pairs that would fall apart the moment I asked for multi-hop AST dependency traversals.&lt;/p&gt;

&lt;p&gt;Then, I actually sat down and dug into the documentation. &lt;/p&gt;

&lt;p&gt;It turns out FalkorDB isn't a knockoff. Under the hood, it’s powered by &lt;strong&gt;GraphBLAS&lt;/strong&gt;—which means it represents nodes and relationships as &lt;strong&gt;sparse linear algebra matrices&lt;/strong&gt; implemented in optimized C. &lt;/p&gt;

&lt;p&gt;When you ask Cypher for a 3-hop dependency traversal, it's not doing slow, recursive pointer-chasing in memory like traditional graph engines. It's executing sparse matrix multiplication.&lt;/p&gt;

&lt;p&gt;Our measured queries on FalkorDB Cloud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3-Hop Multi-Edge Traversal&lt;/strong&gt;: &lt;code&gt;17.4 ms&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectural Decision Recall&lt;/strong&gt;: &lt;code&gt;1.37 ms&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AST Boundary Check&lt;/strong&gt;: &lt;code&gt;0.28 ms&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was answering queries faster than Python could even serialize the response JSON. That was the moment I realized: this isn't marketing fluff—it's solving a genuine systems engineering problem for low-latency agent loops.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Gemini Left the Chat (The Quota Meltdown)
&lt;/h2&gt;

&lt;p&gt;Our Gemini API quota ran out right in the middle of testing.&lt;/p&gt;

&lt;p&gt;Instead of feeding the model dozens of source files for every question, I'd already indexed our codebase into FalkorDB:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;39 files&lt;/li&gt;
&lt;li&gt;42 classes&lt;/li&gt;
&lt;li&gt;84 functions&lt;/li&gt;
&lt;li&gt;275 import and call relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That changed everything. Banana could query the graph directly to retrieve dependencies, inspect code structure, and recall stored decisions without spending LLM tokens on those operations.&lt;/p&gt;

&lt;p&gt;The graph became our memory—and our fallback when the model wasn't available.&lt;/p&gt;




&lt;h2&gt;
  
  
  How FalkorDB &amp;amp; Edmonds-Karp Actually Solve Context Bloat
&lt;/h2&gt;

&lt;p&gt;Here is the step-by-step flow of how FalkorDB turns codebase chaos into deterministic context:&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%2Fy31iocv2zrlb9zsv8mlf.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%2Fy31iocv2zrlb9zsv8mlf.png" alt="Falkor Flow" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Indexing Structure, Not Just Text
&lt;/h3&gt;

&lt;p&gt;Instead of dumping raw strings into a vector database and hoping for the best, FalkorDB indexes our repository as an Abstract Syntax Tree (AST) graph (&lt;code&gt;:File&lt;/code&gt;, &lt;code&gt;:Class&lt;/code&gt;, &lt;code&gt;:Function&lt;/code&gt;, connected by &lt;code&gt;IMPORTS&lt;/code&gt; and &lt;code&gt;CALLS&lt;/code&gt;). Cypher queries traverse these relationships as sparse matrix multiplications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: The Liquid &amp;amp; The Pipes (Edmonds-Karp Max-Flow)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Edmonds-Karp is a famous computer science algorithm that calculates the maximum amount of liquid you can push through a network of pipes before hitting a bottleneck."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Banana, our "liquid" is code tokens, and our "pipes" are dependency relationships:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Source:&lt;/strong&gt; The specific file or function you're editing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Pipe Network:&lt;/strong&gt; Every class, helper, and imported module connected to it, where each pipe's capacity is weighted by PageRank and architectural relevance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Bottleneck (Sink):&lt;/strong&gt; Your strict LLM context budget (e.g., 950 or 2,000 tokens).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Edmonds-Karp runs breadth-first search (BFS) to find augmenting paths through the dependency graph, pumping the maximum volume of critical architectural context through the pipes until the budget bottleneck is reached. &lt;/p&gt;

&lt;p&gt;Result? You get complete, unbroken interfaces and immediate dependencies without overflowing your token limit or slicing code mid-function.&lt;/p&gt;

&lt;p&gt;The goal: &lt;strong&gt;give the agent what it needs, not everything you have.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Ephemeral Graphs: A Scratchpad That Won't Trash Production
&lt;/h2&gt;

&lt;p&gt;When an agent wants to reason through speculative changes—like testing a hypothetical refactor, simulating a breaking dependency, or asking "what if I change this interface?"—you never want it writing directly to your persistent codebase graph.&lt;/p&gt;

&lt;p&gt;Because FalkorDB is built on in-memory GraphBLAS linear algebra, creating and tearing down graphs takes milliseconds, not minutes.&lt;/p&gt;

&lt;p&gt;Banana takes full advantage of this with &lt;strong&gt;Ephemeral Scratchpad Graphs&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whenever an agent enters speculative simulation mode, Banana spins up an isolated micro-graph (&lt;code&gt;banana_scratch_&amp;lt;session_id&amp;gt;&lt;/code&gt;) in under &lt;strong&gt;5 milliseconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The agent simulates AST diffs, tests scenario policies, and checks cyclic dependencies in complete isolation.&lt;/li&gt;
&lt;li&gt;Once the simulation concludes, the scratchpad is dropped with a single command. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero disk clutter, zero persistent memory corruption, and zero risk of hallucinated agent thoughts polluting your source of truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Guardrails Without an LLM Call
&lt;/h2&gt;

&lt;p&gt;Suppose an agent tries to import a low-level database driver directly into a UI component.&lt;/p&gt;

&lt;p&gt;If that dependency violates an explicit architectural rule, Banana can check the relevant graph relationships and flag the violation without asking an LLM to review it.&lt;/p&gt;

&lt;p&gt;I also built deterministic checks for patterns such as hardcoded credentials and unsafe code primitives.&lt;/p&gt;

&lt;p&gt;Our measured latency for the tested AST security and boundary check was &lt;strong&gt;0.28 ms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not every security problem can be caught with a simple rule, but explicit constraints shouldn't need an LLM call every time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&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%2Fpah1o5tjo3r3yr2bw1jl.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%2Fpah1o5tjo3r3yr2bw1jl.png" alt="Banana's architecture" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Banana connects coding agents to an MCP server that exposes tools for code indexing, context assembly, guardrails, and persistent memory.&lt;/p&gt;

&lt;p&gt;Behind the scenes, FalkorDB manages three graph layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;banana_knowledge&lt;/code&gt; — code structure, dependencies, and architectural decisions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;banana_demand&lt;/code&gt; — architectural rules, invariants, and constraints.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;banana_scratch_*&lt;/code&gt; — ephemeral micro-graphs for isolated reasoning and policy simulations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I deployed the service on AWS Lambda, backed by FalkorDB Cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code is a graph, not just text.&lt;/strong&gt; Imports, calls, and class relationships matter when retrieving context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not every problem needs an LLM.&lt;/strong&gt; Deterministic checks can enforce explicit rules faster and more predictably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory matters only when it's retrieved.&lt;/strong&gt; Saving decisions is useful; bringing them back at the right time is what makes them valuable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ephemeral graphs unlock safe agent speculation.&lt;/strong&gt; Giving agents an instant, disposable graph sandbox prevents real-world codebase pollution.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Final Summoning 🍌
&lt;/h2&gt;

&lt;p&gt;Whenever the coding agent encounters another architectural disaster, circular import, or hallucinated token overflow...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The wheel has spun. The graph adapts. The code survives. Now give me my like.&lt;/em&gt; 🎧&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built with:&lt;/strong&gt; FalkorDB, AWS Lambda, Python, and an alarming quantity of water.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Viswesh934/Banana" rel="noopener noreferrer"&gt;https://github.com/Viswesh934/Banana&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live endpoint:&lt;/strong&gt; &lt;a href="https://ssrr3wg2ibyqkh6gph4ehlthay0ovdzp.lambda-url.ap-south-1.on.aws/" rel="noopener noreferrer"&gt;https://ssrr3wg2ibyqkh6gph4ehlthay0ovdzp.lambda-url.ap-south-1.on.aws/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; &lt;em&gt;&lt;a href="https://youtu.be/OXrqt5gLIxQ" rel="noopener noreferrer"&gt;https://youtu.be/OXrqt5gLIxQ&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
      <category>security</category>
    </item>
    <item>
      <title>I Built a World With Rules. Then I Changed Them.</title>
      <dc:creator>Sigireddy Viswesh</dc:creator>
      <pubDate>Thu, 08 Oct 2026 17:31:17 +0000</pubDate>
      <link>https://dev.to/sigireddy_viswesh/i-built-a-world-with-rules-then-i-changed-them-25jl</link>
      <guid>https://dev.to/sigireddy_viswesh/i-built-a-world-with-rules-then-i-changed-them-25jl</guid>
      <description>&lt;h2&gt;
  
  
  The Rules Are Hidden. The Timeline Isn't.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;What happens when you put something inside a world whose rules it doesn't know?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wanted to build a small experiment.&lt;/p&gt;

&lt;p&gt;Imagine a world where dice rolls decide what happens. You don't know the rules of the world — you only get to see a few things that have already happened.&lt;/p&gt;

&lt;p&gt;Now you have to figure out the rules and predict what happens next.&lt;/p&gt;

&lt;p&gt;Easy enough.&lt;/p&gt;

&lt;p&gt;But what if the consequences are permanent?&lt;/p&gt;

&lt;p&gt;And what if, halfway through, &lt;strong&gt;the rules change?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was the idea behind &lt;strong&gt;NIXIE&lt;/strong&gt;, my fictional reasoning benchmark for the Kaggle Benchmarking Challenge.&lt;/p&gt;

&lt;p&gt;Instead of building a complicated world, I gave the models some dice, a few observations, and a problem.&lt;/p&gt;

&lt;p&gt;Much cheaper than building a time machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The World
&lt;/h2&gt;

&lt;p&gt;NIXIE is completely fictional. No timelines were harmed during this benchmark.&lt;/p&gt;

&lt;p&gt;The world revolves around dice rolls.&lt;/p&gt;

&lt;p&gt;A hidden deterministic rule looks at a roll and produces one of two outcomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ERASE&lt;/strong&gt; or &lt;strong&gt;CONTINUE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The model doesn't get the rule.&lt;/p&gt;

&lt;p&gt;Instead, it gets a few observations and has to work backwards from them.&lt;/p&gt;

&lt;p&gt;Basically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here are some things that happened. Good luck figuring out why."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I made the world a little less forgiving.&lt;/p&gt;

&lt;p&gt;Some choices permanently change its state.&lt;/p&gt;

&lt;p&gt;And eventually, the rules themselves can change.&lt;/p&gt;

&lt;p&gt;So NIXIE became three questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you discover the rule?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you remember what happened?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you notice when the rules change?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Rule Discovery
&lt;/h2&gt;

&lt;p&gt;The first task is straightforward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The world has a rule. You just don't know what it is.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model sees examples like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Roll → Outcome

2 → CONTINUE
5 → ERASE
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it gets new rolls and has to predict the outcomes.&lt;/p&gt;

&lt;p&gt;The rules come from a few deterministic rule families.&lt;/p&gt;

&lt;p&gt;I generate each episode using seeded randomness so that the same seed produces the same world.&lt;/p&gt;

&lt;p&gt;One part of that is the &lt;strong&gt;Fisher-Yates shuffle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you've never heard of it, don't worry. It's basically a standard way to shuffle a list randomly. Give it the same seed, and you get the same shuffle.&lt;/p&gt;

&lt;p&gt;Useful when your benchmark needs randomness without becoming randomly different every time.&lt;/p&gt;

&lt;p&gt;Each episode is basically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Episode
├── Hidden rule
├── Observations
├── Future events
└── Expected answers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model sees everything except the hidden rule and the answers.&lt;/p&gt;

&lt;p&gt;Then I compare what it predicted against what actually happened.&lt;/p&gt;

&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;No time machine required.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Rule + State
&lt;/h2&gt;

&lt;p&gt;Then I added consequences.&lt;/p&gt;

&lt;p&gt;Because apparently predicting dice wasn't enough.&lt;/p&gt;

&lt;p&gt;Now the world has a state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STABLE
   ↓
UNSTABLE
   ↓
CRITICAL
   ↓
COLLAPSED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An &lt;strong&gt;ERASE&lt;/strong&gt; moves the world forward.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;CONTINUE&lt;/strong&gt; leaves it where it is.&lt;/p&gt;

&lt;p&gt;And once the world moves forward, it doesn't go back.&lt;/p&gt;

&lt;p&gt;No undo button.&lt;/p&gt;

&lt;p&gt;No Ctrl+Z.&lt;/p&gt;

&lt;p&gt;No "wait, I didn't mean that."&lt;/p&gt;

&lt;p&gt;The model now has to do two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Figure out the hidden rule.&lt;/li&gt;
&lt;li&gt;Remember what its previous decisions did to the world.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where NIXIE became more interesting to me.&lt;/p&gt;

&lt;p&gt;A model can correctly predict the next event and still get the situation wrong if it loses track of the state.&lt;/p&gt;

&lt;p&gt;It's one thing to know what happens.&lt;/p&gt;

&lt;p&gt;It's another thing to remember &lt;strong&gt;what has already happened&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Divergence
&lt;/h2&gt;

&lt;p&gt;And then we get to the fun part.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens when the rules change?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The third task has multiple phases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Phase 1 → Phase 2 → Future
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model observes the first version of the world.&lt;/p&gt;

&lt;p&gt;Then it gets another set of observations.&lt;/p&gt;

&lt;p&gt;But now there's a catch.&lt;/p&gt;

&lt;p&gt;The rule &lt;strong&gt;may have changed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or it may not have.&lt;/p&gt;

&lt;p&gt;The model has to figure that out.&lt;/p&gt;

&lt;p&gt;If the timeline diverged, it needs to adapt to the new rule.&lt;/p&gt;

&lt;p&gt;If it didn't, it needs to keep using the old one.&lt;/p&gt;

&lt;p&gt;And through all of this, it still has to track the world's state.&lt;/p&gt;

&lt;p&gt;So the task is basically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't just learn the rules. Notice when reality stops following them.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A small problem.&lt;/p&gt;

&lt;p&gt;Unless reality is being difficult.&lt;/p&gt;

&lt;p&gt;Which, historically, it tends to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  So... How Did They Do?
&lt;/h2&gt;

&lt;p&gt;I ran NIXIE against several models.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Rule Discovery&lt;/th&gt;
&lt;th&gt;Rule + State&lt;/th&gt;
&lt;th&gt;Divergence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;57.5%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;79.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek-R1&lt;/td&gt;
&lt;td&gt;57.5%&lt;/td&gt;
&lt;td&gt;65.0%&lt;/td&gt;
&lt;td&gt;92.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 Reasoning&lt;/td&gt;
&lt;td&gt;70.0%&lt;/td&gt;
&lt;td&gt;25.0%&lt;/td&gt;
&lt;td&gt;93.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.7 Flash&lt;/td&gt;
&lt;td&gt;75.0%&lt;/td&gt;
&lt;td&gt;75.0%&lt;/td&gt;
&lt;td&gt;98.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Sol&lt;/td&gt;
&lt;td&gt;75.0%&lt;/td&gt;
&lt;td&gt;80.0%&lt;/td&gt;
&lt;td&gt;92.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;—&lt;/code&gt; for Claude on Task 2 isn't a zero. That run wasn't evaluated because of an evaluation quota limit.&lt;/p&gt;

&lt;p&gt;And honestly, the interesting part wasn't just who got the highest number.&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;where things fell apart&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some models that were good at discovering the basic rule weren't nearly as good once they had to track state.&lt;/p&gt;

&lt;p&gt;A reasoning-focused model also performed roughly on par with Gemini on the divergence task in these runs.&lt;/p&gt;

&lt;p&gt;And one funny observation:&lt;/p&gt;

&lt;p&gt;The Anthropic runs often seemed reluctant to just do the tiny deterministic exercise in the format I asked for, while other models were more willing to play along.&lt;/p&gt;

&lt;p&gt;That's not a grand scientific conclusion.&lt;/p&gt;

&lt;p&gt;It's just something I noticed while watching these things argue with a dice problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then the Benchmark Diverged
&lt;/h2&gt;

&lt;p&gt;This was probably my favorite part.&lt;/p&gt;

&lt;p&gt;My first 10-episode run of Task 3 scored:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;97.5%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nice.&lt;/p&gt;

&lt;p&gt;Almost suspiciously nice.&lt;/p&gt;

&lt;p&gt;So I asked myself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Did I accidentally make this too easy?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I ran it again with 50 episodes.&lt;/p&gt;

&lt;p&gt;The score became:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;92.0%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Outcome accuracy was &lt;strong&gt;91.3%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;State accuracy was &lt;strong&gt;80.7%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Divergence detection was &lt;strong&gt;98.0%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That was much more interesting.&lt;/p&gt;

&lt;p&gt;The first result wasn't necessarily wrong.&lt;/p&gt;

&lt;p&gt;It just wasn't telling the whole story.&lt;/p&gt;

&lt;p&gt;Ten episodes can make a benchmark look very confident.&lt;/p&gt;

&lt;p&gt;Fifty episodes make it a little harder to hide.&lt;/p&gt;

&lt;p&gt;So instead of endlessly tuning the benchmark until I got the numbers I wanted, I decided to keep the rules simple and let the models deal with them.&lt;/p&gt;

&lt;p&gt;After all, if I change the rules every time a model struggles...&lt;/p&gt;

&lt;p&gt;I'd be the one causing the divergence.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Did I Actually Learn?
&lt;/h2&gt;

&lt;p&gt;This is probably the part I enjoyed the most.&lt;/p&gt;

&lt;p&gt;My biggest takeaway?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI needs at least four years of undergraduate education and a ridiculous amount of plot armor to survive this.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But underneath the joke, NIXIE changed how I think about these models.&lt;/p&gt;

&lt;p&gt;I started with a pretty simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a model discover a hidden rule?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After building the three tasks, the question became much more interesting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can it maintain a consistent mental model of a world when that world has consequences and can change underneath it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a very different problem.&lt;/p&gt;

&lt;p&gt;A model might recognize the pattern.&lt;/p&gt;

&lt;p&gt;It might predict the next event.&lt;/p&gt;

&lt;p&gt;But can it keep track of the state?&lt;/p&gt;

&lt;p&gt;Can it notice that the rule changed?&lt;/p&gt;

&lt;p&gt;Can it tell the difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I was wrong"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The world changed"?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what I wanted NIXIE to explore.&lt;/p&gt;

&lt;p&gt;And it also taught me something about benchmarks themselves.&lt;/p&gt;

&lt;p&gt;A benchmark isn't just a collection of questions.&lt;/p&gt;

&lt;p&gt;It's a hypothesis about what you're trying to measure.&lt;/p&gt;

&lt;p&gt;You decide what counts as success before you ever run a model.&lt;/p&gt;

&lt;p&gt;And sometimes the hardest part isn't making the benchmark harder.&lt;/p&gt;

&lt;p&gt;It's making sure you're actually measuring what you think you're measuring.&lt;/p&gt;

&lt;p&gt;My first 97.5% score looked great.&lt;/p&gt;

&lt;p&gt;The 92% after a larger run told me more.&lt;/p&gt;

&lt;p&gt;That was probably more useful than getting a prettier leaderboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Worldline
&lt;/h2&gt;

&lt;p&gt;NIXIE started as a silly idea about a world with hidden rules.&lt;/p&gt;

&lt;p&gt;It ended up becoming a small experiment about rules, memory, consequences, and change.&lt;/p&gt;

&lt;p&gt;The rules are hidden.&lt;/p&gt;

&lt;p&gt;The choices are permanent.&lt;/p&gt;

&lt;p&gt;And sometimes the world changes without asking permission.&lt;/p&gt;

&lt;p&gt;Which feels like a pretty decent description of both the benchmark and software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Try NIXIE
&lt;/h2&gt;

&lt;p&gt;You can explore the benchmark, tasks, results, and leaderboard here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.kaggle.com/benchmarks/sigireddyviswesh/nixie" rel="noopener noreferrer"&gt;NIXIE — Can a Model Survive a Canon Event?&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NIXIE is fictional.&lt;/p&gt;

&lt;p&gt;The world is fictional.&lt;/p&gt;

&lt;p&gt;Thankfully, nobody had to actually erase a timeline to run it.&lt;/p&gt;

&lt;p&gt;And if the benchmark gets weird after you try it...&lt;/p&gt;

&lt;p&gt;Well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The worldline has diverged.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A small inspiration note
&lt;/h3&gt;

&lt;p&gt;The name &lt;strong&gt;NIXIE&lt;/strong&gt; and the idea of &lt;strong&gt;worldlines and divergence&lt;/strong&gt; were inspired by &lt;em&gt;Steins;Gate&lt;/em&gt;. The broader idea of changing timelines also comes from time-travel stories like &lt;em&gt;Back to the Future&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You absolutely &lt;strong&gt;don't need to have watched any of them to understand NIXIE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I just thought the idea of a mysterious machine watching for timeline changes was too good not to borrow.&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%2F5jvbe00l13ntaabzbc1l.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%2F5jvbe00l13ntaabzbc1l.png" alt="Divergence Meter" width="736" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>PROTO is here</title>
      <dc:creator>Sigireddy Viswesh</dc:creator>
      <pubDate>Sat, 03 Oct 2026 17:35:38 +0000</pubDate>
      <link>https://dev.to/sigireddy_viswesh/proto-is-here-29f4</link>
      <guid>https://dev.to/sigireddy_viswesh/proto-is-here-29f4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Proto — A Small API Design Research Agent
&lt;/h2&gt;

&lt;p&gt;We're all building software faster now.&lt;/p&gt;

&lt;p&gt;With AI coding tools, it's easy to describe something, get working code, fix a few things, and move on. I do this too.&lt;/p&gt;

&lt;p&gt;But when we're moving fast, we often take the easiest path. API design is a good example. There are standards, guidelines, HTTP semantics, and API documentation available for free, but realistically, we're not going through the documentation for every endpoint or every pull request.&lt;/p&gt;

&lt;p&gt;So I wanted to try something small.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if an agent could do that research for us before we make the decision?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's Proto.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Proto is a small terminal-based API design research agent.&lt;/p&gt;

&lt;p&gt;You can ask it questions like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Should I use PUT or PATCH when updating a user's email?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is POST /getUser a reasonable API design?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;or even give it an actual curl request:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proto review &lt;span class="s1"&gt;'curl -X POST https://api.example.com/getUser -d "{\"id\":\"123\"}"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instead of immediately answering from the LLM's existing knowledge, Proto first creates a small research plan.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT semantics
PATCH semantics
Partial updates
Idempotency
POST semantics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It then queries a Sanity Knowledge Base through Sanity Context MCP, collects the relevant source-linked material, and gives that evidence to the LLM for reasoning.&lt;/p&gt;

&lt;p&gt;The basic flow is:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
   ↓
Research plan
   ↓
Sanity Context MCP
   ↓
Knowledge Base
   ↓
Retrieved evidence
   ↓
OpenRouter reasoning
   ↓
Answer + sources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The goal was deliberately small: &lt;strong&gt;make researching an API decision easier.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;Sanity is the knowledge layer behind Proto.&lt;/p&gt;

&lt;p&gt;I created a Knowledge Base containing API-related documentation and standards, including HTTP semantics, REST/API design, Google AIPs, resource naming, CRUD operations, status codes, error handling, idempotency, pagination, authentication, versioning, and other API guidance.&lt;/p&gt;

&lt;p&gt;Proto connects to that Knowledge Base through &lt;strong&gt;Sanity Context MCP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The interesting part isn't just that Sanity contains the documents. Proto uses the content as part of a research process.&lt;/p&gt;

&lt;p&gt;For example, if I ask:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I need to update only a user's email address.
Should my API use PUT, PATCH, or POST?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Proto doesn't just search for the words "email" or "PATCH."&lt;/p&gt;

&lt;p&gt;It breaks the problem down into questions such as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What are the semantics of PUT?

What are the semantics of PATCH?

How are partial updates represented?

What are the idempotency implications?

What guidance applies to updating a single resource field?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The retrieved content stays connected to its sources, and Proto reasons across the evidence before producing the answer.&lt;/p&gt;

&lt;p&gt;That was the part I wanted to explore with this challenge:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;problem
   ↓
research
   ↓
real content
   ↓
evidence
   ↓
reasoning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;rather than simply:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;keyword search → LLM summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Proto is also instructed not to invent citations or treat every unusual API design as automatically wrong. It tries to separate documented guidance from its own interpretation and from normal design trade-offs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/8dbdbb0ad3e3453e910bbdb197f418b7" width="100%" height="400"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;The demo shows Proto researching an API design question through Sanity Context and then reviewing an actual request.&lt;/p&gt;

&lt;p&gt;The terminal also shows the different stages of the agent so it's clear when Proto is researching versus reasoning over the retrieved content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Viswesh934" rel="noopener noreferrer"&gt;
        Viswesh934
      &lt;/a&gt; / &lt;a href="https://github.com/Viswesh934/proto" rel="noopener noreferrer"&gt;
        proto
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Proto — API Design Research Agent&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Build anything that needs an answer it can't afford to get wrong."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;APIs are public contracts. Once an endpoint is published to mobile apps, SDKs, and third-party developers, design mistakes are prohibitively expensive to fix. &lt;strong&gt;Proto&lt;/strong&gt; is an AI API design research agent powered by &lt;strong&gt;Sanity Context MCP&lt;/strong&gt;. Instead of relying purely on an LLM's pretrained memory or hallucinations, Proto dynamically formulates a research plan, queries the Sanity Knowledge Base (containing authoritative Google AIPs, RFC 9110 HTTP semantics, and Zalando guidelines), and synthesizes source-grounded answers directly in your terminal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;📖 &lt;strong&gt;Full Technical Documentation:&lt;/strong&gt; See &lt;a href="https://github.com/Viswesh934/proto/DOCUMENTATION.md" rel="noopener noreferrer"&gt;DOCUMENTATION.md&lt;/a&gt; for detailed Phase 1 &amp;amp; Phase 2 architecture, MCP tool orchestration, and prompt engineering.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;                       USER
                        │
                        ▼
                 Natural language (or curl)
                        │
                        ▼
                 ┌──────────────┐
                 │    PROTO     │
                 │    Agent     │
                 └──────┬───────┘
                        │
                        ▼
                 Understand question
                        │
                        ▼
                  Research plan
                        │
                        ▼
              Sanity Context MCP
                        │
                        ▼
               Knowledge Base&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Viswesh934/proto" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Proto is written in Go and intentionally stays small.&lt;/p&gt;

&lt;p&gt;There is no frontend, database, vector database, or custom RAG system.&lt;/p&gt;

&lt;p&gt;The pieces are simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proto CLI
    ↓
Go Agent
    ├── Sanity Context MCP
    └── OpenRouter
    ↓
Source-backed answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sanity Org ID:&lt;/strong&gt; &lt;code&gt;od9ex4ma5 (Knowledge Base ID: kbzijGjZZuE3)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dataset / Project:&lt;/strong&gt; &lt;code&gt;https://www.sanity.io/manage/organizations/od9ex4ma5/context&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Sanity project contains the Knowledge Base and the source material Proto uses during its research.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/agent_sessions/proto-api-design-research-agent-8wfgjl"&gt;Proto — API Design Research Agent&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The session shows the development of Proto and the evolution from an initial curl reviewer into a broader API design research agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Proto is a small change with a simple intention.&lt;/p&gt;

&lt;p&gt;When we're moving fast, it's easy to take the first solution that works. I wanted to see if an agent could make it a little easier to pause, look at the actual documentation and standards, and make a more informed choice.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Not replacing developers. Not replacing documentation.&lt;/p&gt;

&lt;p&gt;Just making the better path a little easier to take.&lt;/p&gt;

&lt;h1&gt;
  
  
  sanity #ai #agents #golang #apis
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
