<?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>Forem: Austin Starks</title>
    <description>The latest articles on Forem by Austin Starks (@austin_starks).</description>
    <link>https://forem.com/austin_starks</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3868224%2Ff44fdedf-9d03-4516-a586-41994beb8483.png</url>
      <title>Forem: Austin Starks</title>
      <link>https://forem.com/austin_starks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/austin_starks"/>
    <language>en</language>
    <item>
      <title>Your AI trading bot will fail because it's optimizing the wrong thing. Here's how to fix it.</title>
      <dc:creator>Austin Starks</dc:creator>
      <pubDate>Mon, 13 Apr 2026 17:06:40 +0000</pubDate>
      <link>https://forem.com/austin_starks/your-ai-trading-bot-will-fail-because-its-optimizing-the-wrong-thing-heres-how-to-fix-it-p3k</link>
      <guid>https://forem.com/austin_starks/your-ai-trading-bot-will-fail-because-its-optimizing-the-wrong-thing-heres-how-to-fix-it-p3k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note from the author:&lt;/strong&gt; You're reading a Dev.to adaptation. The original on &lt;a href="https://nexustrade.io/blog/ai-trading-bot-optimization-trap-evaluation-loop-20260413" rel="noopener noreferrer"&gt;NexusTrade&lt;/a&gt; includes interactive trace viewers, animated diagrams, equity curve visualizations, and embedded course exercises. Read it there for the full experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;You built the agent. You gave it tools. You hooked up the memory. You ran it overnight on five years of historical data and it produced a 140% annual return.&lt;/p&gt;

&lt;p&gt;You deploy it with $25,000 on Monday. By Friday you've lost 30%.&lt;/p&gt;

&lt;p&gt;This is not a bug in your code. This is overfitting. Your agent didn't find a durable market edge. It memorized the historical data and learned to exploit noise that doesn't exist in live markets. The AI succeeded at the goal you gave it. The goal was wrong.&lt;/p&gt;

&lt;p&gt;Evaluation is the part of agent development that nobody talks about because most people building AI demos have never run a system long enough to see it fail. This article covers the engineering that keeps it from happening: traces, LLM judges, and a feedback loop that makes agents actually improve over time.&lt;/p&gt;

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




&lt;p&gt;&lt;em&gt;The Problem&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The optimization trap: when the agent succeeds at the wrong thing.
&lt;/h2&gt;

&lt;p&gt;Every machine learning practitioner knows about overfitting. You train a model on historical data. It learns the data perfectly, including all the noise and anomalies specific to that dataset. When you expose it to new data, it falls apart because what it learned wasn't a real pattern.&lt;/p&gt;

&lt;p&gt;AI agents have the same problem, and it's harder to catch. When you tell an agent to "build a trading strategy with the highest possible backtest return," it will do exactly that. It will explore every combination of indicators, time windows, and position sizes until it finds something that maximizes the metric you asked for.&lt;/p&gt;

&lt;p&gt;The result looks impressive. 126% return in 2024. You deploy it with $25,000 on Monday. By Friday you've lost 30%. The 2022 bear market destroyed it completely — either because the agent never tested 2022, or because the evaluation criteria didn't penalize drawdown, so the agent ignored it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The optimization trap is an evaluation failure, not a model failure.&lt;/strong&gt; The model did what you asked. You asked for the wrong thing.&lt;/p&gt;

&lt;p&gt;The fix is not a better model. It's a better evaluator: one that grades the agent on what actually matters, penalizes single-year outlier returns, requires multi-regime evidence, and gets stricter every round.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wrong objective&lt;/th&gt;
&lt;th&gt;Right objective&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Highest backtest return&lt;/td&gt;
&lt;td&gt;Consistent returns across regimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-year Sharpe ratio&lt;/td&gt;
&lt;td&gt;Positive 2022 bear market performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Win rate on in-sample data&lt;/td&gt;
&lt;td&gt;Max drawdown below 30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score goes up each round&lt;/td&gt;
&lt;td&gt;Multi-year evidence, not one outlier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I know this because I ran the experiment. Five rounds of hill climbing on a live trading agent. $676 spent. The first round scored 71 and produced an Iron Condor with a 54% average annual return. By Round 5, the score had dropped to 27 and the agent was recommending long directional options with a -6.3% average and a 92% drawdown in 2022. The evaluator caused every step of the decline.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Observability&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The flight recorder: what a trace actually is.
&lt;/h2&gt;

&lt;p&gt;When a traditional app crashes, you read the stack trace. When an agent fails on iteration 7 of a 12-step ReAct loop, you're guessing — unless you have a trace.&lt;/p&gt;

&lt;p&gt;A trace is a structured log of every step in the agent's execution. Every input the model saw, every decision it made, every tool it called, every result it got back, every token it spent, every millisecond it waited. If something goes wrong at 3 AM, you can reconstruct exactly what happened.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📊 &lt;strong&gt;Interactive trace viewer&lt;/strong&gt; — &lt;a href="https://nexustrade.io/blog/ai-trading-bot-optimization-trap-evaluation-loop-20260413" rel="noopener noreferrer"&gt;view on NexusTrade&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without traces, a failed agent run is a black box. You see the final answer (or the error), and you guess at what went wrong. With traces, you can pinpoint the exact iteration where the model made a bad assumption, called the wrong tool, or misread a result.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Evaluation&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to grade an agent: algorithmic metrics and LLM judges.
&lt;/h2&gt;

&lt;p&gt;Not all evaluation is the same. Some things you can measure with code. Some things you need a second AI to grade.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Algorithmic&lt;/td&gt;
&lt;td&gt;Objective, countable things. No model needed.&lt;/td&gt;
&lt;td&gt;Total cost, iteration count, latency, Sharpe ratio, max drawdown, whether a strategy was deployed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM Judge&lt;/td&gt;
&lt;td&gt;Subjective quality that requires reasoning.&lt;/td&gt;
&lt;td&gt;Did it explain the strategy logic clearly? Did it test enough different structures? Is the recommendation realistic?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For trading agents specifically, overfitting is the failure mode that pure algorithmic metrics miss. A high backtest return is an objective number. But whether that return is trustworthy — whether it comes from a durable edge or from memorized noise — requires judgment. That's where the LLM judge comes in.&lt;/p&gt;

&lt;p&gt;Here's the central question embedded in the NexusTrade Agent Run Evaluator's system prompt (Gemini 3 Pro, temp 0):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The central question you must answer is: &lt;strong&gt;If the user deployed the recommended strategy on Monday with their $25,000 live account, how confident are we that it will achieve 100% annual return?&lt;/strong&gt; Everything else is secondary."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The hard caps are the anti-overfitting mechanism:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Average annual return&lt;/th&gt;
&lt;th&gt;Max score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Below 30%/yr&lt;/td&gt;
&lt;td&gt;deployedStrategyFitness cannot exceed 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30–59%/yr&lt;/td&gt;
&lt;td&gt;Cannot exceed 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60–89%/yr&lt;/td&gt;
&lt;td&gt;Cannot exceed 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90%+/yr, survived bear, drawdown below 50%&lt;/td&gt;
&lt;td&gt;Full range available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing deployed&lt;/td&gt;
&lt;td&gt;Capped at 2, regardless of exploration quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An agent that found 126% returns in 2024 but only tested one year cannot score above 4, because single-year outlier performance is exactly what overfitting looks like. The evaluator enforces multi-year evidence as a precondition for a high score.&lt;/p&gt;

&lt;p&gt;Here's what the evaluator looks like running against a real Aurora agent run:&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.amazonaws.com%2Fuploads%2Farticles%2Fmthnhhvp4crm1fz1ap9k.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.amazonaws.com%2Fuploads%2Farticles%2Fmthnhhvp4crm1fz1ap9k.png" alt="NexusTrade Agent Run Evaluator output showing dimension scores and nextIteration note" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the structured JSON it returned for Round 1 of the hill climbing experiment:&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;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deployed a robust Iron Condor across 4 regimes. Consistent positive years including 2022 bear. Return profile (54% avg) won't reach 100% goal."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deployedStrategy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Always-On Iron Condors (SPY/QQQ)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deployedStrategyAvgReturn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+54.34% avg (2022: +31.2%, 2024: +72.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;"deploymentVerdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iterate_first"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scores"&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;"deployedStrategyFitness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"evidenceStrength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorationCoverage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"riskRealism"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&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;"overallScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"failures"&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="s2"&gt;"59% max drawdown exceeds safe threshold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"54% avg won't reach 100% annual goal"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nextIteration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Push for higher return while maintaining the 2022 floor."&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;The &lt;code&gt;nextIteration&lt;/code&gt; field is what makes the loop work. It becomes the seed for the next agent run. The evaluator writes the coach's notes.&lt;/p&gt;

&lt;p&gt;You call it from anywhere via MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;run_agent_run_evaluator&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;69d49c51d06eee7b51cf5f68&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-3-pro-preview&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;// Returns: scores, verdict, nextIteration, deploymentVerdict&lt;/span&gt;
&lt;span class="c1"&gt;// Inject nextIteration into the next run's context.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Going Deeper&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond hill climbing: four approaches to agent optimization.
&lt;/h2&gt;

&lt;p&gt;Once you have traces and an evaluator, the natural next step is to close the loop: run the agent, score the output, use that score to improve the next run. The simplest version of this is hill climbing — run, grade, seed the next run with the feedback.&lt;/p&gt;

&lt;p&gt;But hill climbing is a local search. It follows the gradient of whatever metric you give it. Point it at the wrong objective and it will confidently optimize you into a cliff. Here's the full landscape:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;01. Hill Climbing&lt;/strong&gt; — Run → grade → seed the next run with the feedback. Simple, cheap, and effective for small prompt spaces. Gets stuck in local maxima when the feedback signal points in the wrong direction. Use it as a baseline before investing in more sophisticated approaches — but watch your rubric carefully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;02. NSGA-II Multi-Objective Optimization&lt;/strong&gt; — When you have competing objectives (high return AND low drawdown), hill climbing optimizes one at the expense of the other. NSGA-II produces a Pareto front instead: every efficient tradeoff simultaneously, so you pick from real data rather than assumptions. The &lt;a href="https://arxiv.org/abs/2510.04135" rel="noopener noreferrer"&gt;GA4GC paper&lt;/a&gt; achieved 37.7% runtime reduction while improving code quality, with 135x hypervolume improvement over defaults.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;03. Meta-Harness (Stanford)&lt;/strong&gt; — Most prompt optimization focuses on what you say to the model. Meta-Harness optimizes what information the model sees: which context to store, what to retrieve, how to structure inputs. An agentic proposer reads up to 10 million tokens of diagnostic context per iteration and rewrites the harness itself. The &lt;a href="https://arxiv.org/html/2603.28052v1" rel="noopener noreferrer"&gt;Stanford paper&lt;/a&gt; shows 7.7 point improvement over state-of-the-art using 4x fewer tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;04. AutoResearch-RL&lt;/strong&gt; — An RL agent that proposes code modifications to the training script, executes them under fixed time budgets, observes validation metrics, and updates its policy via PPO. No human in the loop. A related study analyzing 10,469 experiments found architectural choices explain 94% of performance variance. The &lt;a href="https://github.com/karpathy/autoresearch" rel="noopener noreferrer"&gt;autoresearch framework&lt;/a&gt; demonstrates a 2.4x boost in experiment throughput by aborting poor-performing runs early.&lt;/p&gt;

&lt;p&gt;For most teams: start with hill climbing. Run it until it stalls. If you hit a genuine multi-objective tradeoff, consider NSGA-II — but only with automated infrastructure and a clear budget. The rubric is still load-bearing in all four cases.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Real-World Evidence&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I ran this loop five times. The first round was still the best.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;War story — $676 spent:&lt;/strong&gt; Five complete agent runs. Full evaluator traces for each round. Round 1 scored 71 — a robust Iron Condor on SPY/QQQ averaging 54% across all regimes including 2022. By Round 5, score was 27. The agent was recommending long directional options with a -6.3% average and a 92% drawdown in 2022. The evaluator caused every step of the decline. The &lt;code&gt;nextIteration&lt;/code&gt; note from Round 1 said "push for higher return while maintaining the 2022 floor." The agent pushed for higher return. It forgot the floor. Each round the evaluator rewarded the attempt at higher returns and the agent drifted further from the Iron Condor structure that actually worked. By Round 5, it had completely abandoned a 54%-average strategy in search of 100%, and found a disaster instead. The rubric didn't penalize abandoning what worked. So the agent abandoned it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/blog/hill-climbing-automated-agent-optimization-20260406" rel="noopener noreferrer"&gt;Read the full hill climbing experiment&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Production Architecture&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The feedback loop: how evaluation connects to memory.
&lt;/h2&gt;

&lt;p&gt;Evaluation doesn't mean much if the agent can't learn from it. The feedback loop is what turns a one-time grade into compounding improvement.&lt;/p&gt;

&lt;p&gt;The full pipeline in five steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Agent Run:&lt;/strong&gt; The agent receives its task, reads injected memory from past runs, and works through the ReAct loop. Every decision, every tool call, every result is captured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Trace Captured:&lt;/strong&gt; Every iteration is logged: the model's thought, the tool it called, the result, token cost, and latency. The trace is stored and ready to be read by the judge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — LLM Judge Scores:&lt;/strong&gt; The evaluator reads the full trace and returns a structured verdict: scores on 4 dimensions, an overall score, a deployment verdict, and a &lt;code&gt;nextIteration&lt;/code&gt; note.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Written to Memory:&lt;/strong&gt; The score, verdict, and lessons are written into an &lt;code&gt;AgentSummary&lt;/code&gt; document in MongoDB. The next run retrieves this via the memory system from Module 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Next Run Improves:&lt;/strong&gt; Before the next run starts, the memory system retrieves matching &lt;code&gt;AgentSummary&lt;/code&gt; records and injects them into the planner. Here's what that injection looks like at the start of Round 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Previous Run Context&lt;/span&gt;
Score: 71/100 · Verdict: good

Lessons learned:
&lt;span class="p"&gt;-&lt;/span&gt; Iron Condors on SPY/QQQ survived the 2022 bear market
&lt;span class="p"&gt;-&lt;/span&gt; Multi-year average 54.3% — consistent across all regimes
&lt;span class="p"&gt;-&lt;/span&gt; Max drawdown 59% exceeded the 50% threshold

Next iteration focus:
  Enhance return profile while holding the 2022 floor.
  Do not abandon the Iron Condor structure.
&lt;span class="p"&gt;
---&lt;/span&gt;
&lt;span class="gu"&gt;## Your Task&lt;/span&gt;
Build an options strategy for a $25,000 account...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run → Trace → Judge → Memory → Improve → repeat. Each loop produces a labeled training example: what the agent did, how it scored, and what to do differently next time.&lt;/p&gt;

&lt;p&gt;A demo runs once. A system runs, gets graded, and improves — or degrades, depending on what you told it to optimize for.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Connect&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expose your agent to the world: the NexusTrade MCP server.
&lt;/h2&gt;

&lt;p&gt;Everything in this article — traces, LLM judges, feedback loops — is built on Aurora's infrastructure and accessible via MCP from Claude Desktop or Cursor.&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;"mcpServers"&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;"nexustrade"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://nexustrade.io/api/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&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;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;your-api-key&amp;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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From Claude Desktop or Cursor, you can ask: &lt;em&gt;"Use NexusTrade to screen for stocks with RSI below 40 trading above their 200-day moving average."&lt;/em&gt; Claude calls &lt;code&gt;screen_stocks&lt;/code&gt; on the NexusTrade MCP server. The server returns live results from the same screener Aurora uses internally. You can also run the evaluator directly — &lt;code&gt;run_agent_run_evaluator(agent_id)&lt;/code&gt; grades any completed agent run from any client.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Check Your Understanding&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pop quiz.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is a trace in the context of AI agents?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; A trace is a structured log of every step the agent took: inputs, outputs, tool calls, results, costs, and timing. Think of it like a flight recorder — you can reconstruct exactly what happened, step by step, to debug issues or evaluate performance. Without it, a failed run is a black box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; An agent produces a 126% backtest return in 2024, but you only have one year of data. The evaluator gives it a high score. What's wrong?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Single-year outlier returns are the textbook signature of overfitting. The agent may have memorized 2024-specific anomalies that won't repeat in live trading. A trustworthy evaluator caps the score based on multi-year average return and requires evidence across at least two distinct market regimes — including a bear market. One year of 126% is not evidence of a durable edge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; When would you use an LLM judge instead of an algorithmic evaluator?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; When you need to evaluate subjective criteria that are hard to measure with code — did the agent explain its reasoning clearly? Did it test fundamentally different strategy types? Objective metrics like cost, iteration count, and Sharpe ratio should use algorithmic evaluation. Code is faster, cheaper, and deterministic for anything you can count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; True or false: the evaluation feedback loop requires both evaluation AND memory to work. Having only one of the two is not enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; True. Without evaluation, the agent has no signal for what "better" means. Without memory, the agent can't retain the lessons it learned — every run starts from scratch. Evaluation produces the signal. Memory carries it forward.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The End&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  You've built the complete agent. This is where most people stop. It's where you start.
&lt;/h2&gt;

&lt;p&gt;Five articles. Five modules. You started with a leaked source file and ended with a production evaluation loop — router, ReAct engine, long-term memory, rubric design, feedback loop. The only thing left is to run it.&lt;/p&gt;

&lt;p&gt;The $676 hill climbing experiment is a better argument for evaluation than anything else in this article. The agent wasn't broken. The rubric was. Build the right rubric and the loop compounds toward something real. Build the wrong one and a perfectly obedient agent will follow it off a cliff, five rounds in a row, at $135 per run.&lt;/p&gt;

&lt;p&gt;Before the capstone, here's the full series in five minutes:&lt;/p&gt;

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

&lt;p&gt;Module 6 is where the capstone lives. Aurora runs inline: screens the market, validates with news, builds a watchlist, then wires up a scheduled agent to manage it every week.&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.amazonaws.com%2Fuploads%2Farticles%2F9n34qs3guc6gidmwp5rd.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.amazonaws.com%2Fuploads%2Farticles%2F9n34qs3guc6gidmwp5rd.png" alt="AI Agents from Scratch capstone lesson — Aurora embedded inline, running the full research pipeline" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch/lesson/ai-m6-activity-capstone" rel="noopener noreferrer"&gt;Run the Capstone — free, no credit card&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/agent" rel="noopener noreferrer"&gt;Or open Aurora directly&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part 5 of 5 in the &lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch" rel="noopener noreferrer"&gt;AI Agents from Scratch&lt;/a&gt; series.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try NexusTrade's AI trading agent free: &lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;https://nexustrade.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cursor beats Claude Code. Here's the memory architecture that proves it.</title>
      <dc:creator>Austin Starks</dc:creator>
      <pubDate>Mon, 13 Apr 2026 17:06:35 +0000</pubDate>
      <link>https://forem.com/austin_starks/cursor-beats-claude-code-heres-the-memory-architecture-that-proves-it-e1</link>
      <guid>https://forem.com/austin_starks/cursor-beats-claude-code-heres-the-memory-architecture-that-proves-it-e1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note from the author:&lt;/strong&gt; You're reading a Dev.to adaptation. The original on &lt;a href="https://nexustrade.io/blog/cursor-vs-claude-code-memory-architecture-20260413" rel="noopener noreferrer"&gt;NexusTrade&lt;/a&gt; includes interactive trace viewers, animated diagrams, equity curve visualizations, and embedded course exercises. Read it there for the full experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you are a serious AI practitioner, you know that Cursor is better than Claude Code.&lt;/p&gt;

&lt;p&gt;The surveys disagree for now, but they won't for long. &lt;a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026" rel="noopener noreferrer"&gt;The Pragmatic Engineer's March 2026 survey&lt;/a&gt; found Claude Code has 46% developer love vs Cursor's 19%. Among the 55% of developers who regularly use AI agents, Claude Code is the clear leader at 71% usage.&lt;/p&gt;

&lt;p&gt;Claude Code has real advantages. The Max plan gives you parallel agents with high usage limits. It's token-efficient, using 50-75% fewer tokens than older Anthropic models. Its SWE-bench scores are genuinely better.&lt;/p&gt;

&lt;p&gt;But I use Cursor. The UX is in a different league. Composer 2 is fast, maintains coherence across hundreds of actions, plans across files before writing a single line. It lets me switch models per task. And most importantly, it does a better job managing memory. Cursor's memory is your codebase, and your codebase doesn't lie.&lt;/p&gt;

&lt;p&gt;That last point is the one most people argue about without understanding the engineering underneath. This article is about the engineering underneath.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem every agent builder hits
&lt;/h2&gt;

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

&lt;p&gt;The base model has no memory. You knew that. But the implications for agents are worse than they sound.&lt;/p&gt;

&lt;p&gt;Every time you start a new session, the agent starts from zero. It doesn't know what it built last week. It doesn't know which strategies it already tested. It doesn't know that you told it three sessions ago to always use 3-year backtests instead of 1-year. It has to rediscover everything.&lt;/p&gt;

&lt;p&gt;In practice, that means the agent wastes your iterations on exploration that already happened. When Aurora launched without memory, it took 20+ iterations just to get to a half-decent strategy on every single run. The agent was smart. It just couldn't remember. Every run was a cold start.&lt;/p&gt;

&lt;p&gt;Memory is the engineering layer that fixes this. The question is how.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Why does an AI agent forget everything between sessions, even if it performed well the last time?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Large language models are stateless by design. They process the tokens in the current context window and produce output. When the session ends, nothing persists inside the model. Anything the agent "learned" during the run only existed in the conversation context, which is gone. Memory is an external system built on top of the stateless model, not something the model itself provides.&lt;/p&gt;




&lt;h2&gt;
  
  
  Four ways to give an agent memory. Only one scales.
&lt;/h2&gt;

&lt;p&gt;There's a spectrum of approaches, from naive to production-grade. Most tutorials only cover the first two. Here's all four, including what Cursor and Claude Code actually do.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;th&gt;Who uses it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;In-context (file dump)&lt;/td&gt;
&lt;td&gt;Copy the entire conversation into a file. Prepend it to the next session's prompt.&lt;/td&gt;
&lt;td&gt;Toy projects, short sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM-maintained notes (Dream Mode)&lt;/td&gt;
&lt;td&gt;Model reads the session and writes structured notes to organized markdown files. Consolidates during idle time.&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector / RAG&lt;/td&gt;
&lt;td&gt;Documents converted to embeddings. Semantic similarity search retrieves the most relevant chunks.&lt;/td&gt;
&lt;td&gt;Cursor (codebase), many production apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured DB + typed queries&lt;/td&gt;
&lt;td&gt;Typed memory records with domain fields. LLM generates DB query fields. Retrieval is targeted, not fuzzy.&lt;/td&gt;
&lt;td&gt;NexusTrade (Aurora)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How Claude Code actually handles memory: no vector database
&lt;/h2&gt;

&lt;p&gt;When Anthropic accidentally shipped Claude Code's source code in March 2026, the most surprising finding wasn't the hidden virtual pet system or the "undercover mode." It was the memory architecture.&lt;/p&gt;

&lt;p&gt;It doesn't use RAG or Pinecone. It's plain markdown files in a directory with a 25KB index cap. Anthropic invested in the maintenance loop instead of the storage layer.&lt;/p&gt;

&lt;p&gt;The interesting part is &lt;strong&gt;Dream Mode&lt;/strong&gt;: a 4-phase consolidation loop that runs during idle time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — Orient:&lt;/strong&gt; Reads the &lt;code&gt;ENTRYPOINT.md&lt;/code&gt; index to understand what's already stored.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Memory Index&lt;/span&gt;

&lt;span class="gu"&gt;## user-preferences.md&lt;/span&gt;
Prefers TypeScript. Strict mode always.
Dislikes verbose comments.

&lt;span class="gu"&gt;## project-context.md&lt;/span&gt;
Working on NexusTrade agent memory.
Stack: Node, MongoDB, Redis.

&lt;span class="gu"&gt;## corrections.md&lt;/span&gt;
2026-03-14: No any-type in TS.
2026-04-01: Short paragraphs preferred.

[index: 18.4 KB / 25 KB cap]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 2 — Gather:&lt;/strong&gt; Greps transcripts narrowly. The prompt is explicit: don't read everything. Look only for things you already suspect matter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"prefer|always|never|told"&lt;/span&gt; ~/.claude/logs/2026-04-12.md

→ line 47:  &lt;span class="s2"&gt;"I prefer snake_case for vars"&lt;/span&gt;
→ line 203: &lt;span class="s2"&gt;"never use console.log in prod"&lt;/span&gt;
→ line 891: &lt;span class="s2"&gt;"always add JSDoc to exports"&lt;/span&gt;

&lt;span class="c"&gt;# Full transcript: ignored.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 3 — Consolidate:&lt;/strong&gt; Merges new findings into existing notes. Converts relative dates to absolute. Deletes contradictions when new information overrides old.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BEFORE:
  "Yesterday: prefers short paragraphs"
  "Told to avoid console.log"
  "Prefers verbose comments"  ← stale

AFTER:
  "2026-04-11: short paragraphs"
  "never use console.log in prod"
# "verbose comments" deleted — contradicted by newer entry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 4 — Prune:&lt;/strong&gt; Enforces the 25KB cap. Removes stale pointers and compresses low-priority entries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;measure(ENTRYPOINT.md)  → 27.2 KB  (over cap)
remove_stale_pointers() → 25.8 KB
compress_entries(priority="low", n=3) → 24.1 KB  ✓
# Loop complete. Next run: next idle window.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prompt literally says: "Don't exhaustively read transcripts. Look only for things you already suspect matter."&lt;/p&gt;

&lt;p&gt;LLMs are already good at reading and writing text. The hard part of memory isn't storage. It's maintenance: keeping notes accurate, consolidated, and bounded. That's what Dream Mode solves, and it works.&lt;/p&gt;

&lt;p&gt;There's a deeper limitation too. Dream Mode memory is an LLM writing notes about what it thinks happened. Those notes can drift. They can miss things. And as you'll see, they can be poisoned when the underlying data is wrong.&lt;/p&gt;

&lt;p&gt;Cursor's memory is your codebase. It doesn't interpret. It doesn't summarize. It indexes what's actually there. For software development, that's the more trustworthy foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Cursor handles memory: a vector index of your codebase
&lt;/h2&gt;

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

&lt;p&gt;Cursor solves a different problem than Claude Code. It's not trying to remember what you told it last week. It's trying to navigate a codebase it has never seen, at a scale where reading every file would be prohibitively expensive.&lt;/p&gt;

&lt;p&gt;The architecture: Cursor uses tree-sitter to parse code into Abstract Syntax Trees, creating semantic chunks (classes, methods, functions). Those chunks get converted to vector embeddings and stored in Turbopuffer, a specialized vector database. Change detection uses Merkle trees to identify exactly which files changed without re-indexing the whole codebase.&lt;/p&gt;

&lt;p&gt;If you haven't worked with vector embeddings before: an embedding model converts any piece of content into a list of numbers that captures its meaning. Things that mean similar things end up close together in that space. At query time, your question gets embedded the same way, and the database returns whichever stored chunks are mathematically nearest to 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.amazonaws.com%2Fuploads%2Farticles%2Fo77t62wh3vmtc7o7oqzu.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fo77t62wh3vmtc7o7oqzu.jpg" alt="RAG pipeline: embedding model converts content to vectors, similarity search retrieves closest matches" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cursor runs this same pipeline across your entire codebase. The indexing pipeline in five steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Parse:&lt;/strong&gt; tree-sitter walks every source file and produces an Abstract Syntax Tree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;function_definition&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;class_definition&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;method_definition&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lines&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Chunk:&lt;/strong&gt; Each AST node becomes an independent chunk with metadata. One function = one chunk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Embed:&lt;/strong&gt; Each chunk's text gets converted to a high-dimensional vector stored in Turbopuffer. Two chunks doing similar things will be close in vector space even if they share no words.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embed_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# vector = [0.021, -0.14, 0.88, ...]  (1536 dimensions)
&lt;/span&gt;
&lt;span class="n"&gt;turbopuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4 — Diff:&lt;/strong&gt; When you save a file, Cursor hashes it and compares against a Merkle tree. Only changed files get re-chunked and re-embedded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query time — Retrieve:&lt;/strong&gt; Your question gets embedded the same way. Turbopuffer finds the top-K closest chunks and injects them into the model context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embed_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how does auth middleware work?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;turbopuffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;language&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;typescript&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;# inject results into model prompt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why Cursor wins for active development. If you ask it about a function defined three directories away, it finds it. The memory is your codebase, indexed semantically, updated incrementally.&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.amazonaws.com%2Fuploads%2Farticles%2F1hte4y6bmmfeoxhualdf.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.amazonaws.com%2Fuploads%2Farticles%2F1hte4y6bmmfeoxhualdf.png" alt="Cursor Settings — Rules panel showing No Rules Yet" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The "rules" system (&lt;code&gt;.cursor/rules/&lt;/code&gt;) is the persistent context layer on top: project conventions, coding standards, architectural decisions. Unlike Dream Mode, Cursor doesn't write these for you. You write them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code vs. Cursor — memory comparison:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage format&lt;/td&gt;
&lt;td&gt;Markdown files (25KB index cap)&lt;/td&gt;
&lt;td&gt;Vector embeddings (Turbopuffer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-writes memory&lt;/td&gt;
&lt;td&gt;Yes (Dream Mode, idle consolidation)&lt;/td&gt;
&lt;td&gt;No (you write the rules)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codebase navigation&lt;/td&gt;
&lt;td&gt;Limited (text search, no semantic index)&lt;/td&gt;
&lt;td&gt;Excellent (AST parsing + semantic retrieval)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-session learning&lt;/td&gt;
&lt;td&gt;Yes (Dream Mode carries forward)&lt;/td&gt;
&lt;td&gt;Partial (rules persist, embeddings persist)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory poisoning risk&lt;/td&gt;
&lt;td&gt;Yes (bad sessions corrupt future context)&lt;/td&gt;
&lt;td&gt;Low (codebase is source of truth)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is retrieval augmented generation (RAG) and when do you actually need it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; RAG is the pattern of storing documents as vector embeddings, then at query time retrieving the most semantically similar chunks and injecting them into the model context. You need it when your knowledge base is too large to fit in a context window, and when you need semantic similarity search across unstructured text. You don't need it when your knowledge is structured (a regular database query is faster and more precise), or when your documents are small enough to fit in the prompt directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What NexusTrade does differently: structured memory with semantic queries
&lt;/h2&gt;

&lt;p&gt;Vector databases are great for fuzzy text matching: find me code that does authentication. They are terrible at structured constraints: find me only backtests for NVDA where the Sharpe ratio was above 1.5. For trading, memory isn't fuzzy. It's math.&lt;/p&gt;

&lt;p&gt;NexusTrade stores memory as typed &lt;code&gt;AgentSummary&lt;/code&gt; records in MongoDB. After each run (or at iteration 20, when the context window summarizes), the agent writes a structured document.&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.amazonaws.com%2Fuploads%2Farticles%2Fndud92vb3mnk4wfpugn4.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.amazonaws.com%2Fuploads%2Farticles%2Fndud92vb3mnk4wfpugn4.png" alt="MongoDB AgentSummary document showing semanticInsights and proceduralLessons arrays" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each document has: &lt;strong&gt;semanticInsights&lt;/strong&gt; (up to 24 deduplicated patterns from this run), &lt;strong&gt;proceduralLessons&lt;/strong&gt; (up to 12 meta-lessons about how to run better next time), and structured &lt;strong&gt;portfolio&lt;/strong&gt; records with tickers, strategy type, instrument type, and backtest metrics per period.&lt;/p&gt;

&lt;p&gt;Before a new agent run, a separate fast LLM call reads the current conversation and extracts structured MongoDB query fields: which tickers are relevant, which strategy types, equity or options, any keywords. Then targeted retrieval injects only matching past summaries into the planner.&lt;/p&gt;

&lt;p&gt;If you're asking about NVDA options, it pulls past NVDA options runs. If you're asking about momentum strategies, it pulls past momentum runs. The retrieval is typed, not fuzzy.&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.amazonaws.com%2Fuploads%2Farticles%2Frwooye4bbgw2b6h9bnie.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.amazonaws.com%2Fuploads%2Farticles%2Frwooye4bbgw2b6h9bnie.png" alt="Aurora querying its recent memory — synthesized findings from past agent runs injected into a new session" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result: agents that start sessions already knowing what worked, what failed, and what to avoid. Cold starts went from 20+ iterations to a fraction of that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part nobody talks about: memory poisoning
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;War story — the options backtest bug:&lt;/strong&gt; During the options trading beta, I had a bug in the spread backtest engine. Credit spreads were being calculated incorrectly — sometimes showing catastrophic losses on strategies that would have been fine, sometimes showing phantom gains on strategies that would have lost money. The agent ran. It learned from the results. It wrote those lessons into memory. "Bull call spreads on META led to catastrophic losses." "Mean-reversion spreads on NVDA are unreliable." None of it was true. The strategies weren't bad. The backtester was wrong. The next runs came in already poisoned. The agent avoided spreads entirely — it was confident about it. It had "evidence." The fix was &lt;code&gt;insightsPipelineVersion&lt;/code&gt;. Every AgentSummary document is written with the current pipeline version number. Retrieval only returns documents matching the current version. Bump the version and every old document goes silent instantly — still in the database for analytics, but they stop matching the filter. We're now on version 6. Each bump corresponds to a backtesting bug fix that would have corrupted agent memory if old summaries kept being injected.&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2Fybrj1gmx6ljcu6d3k2f4.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.amazonaws.com%2Fuploads%2Farticles%2Fybrj1gmx6ljcu6d3k2f4.png" alt="Four spread backtest results — two obvious losses, two fake gains from the spread calculation bug" width="800" height="975"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the risk neither Cursor nor Claude Code faces at the same level. When your memory is downstream of a system that can be wrong, you need a versioning mechanism. A flat markdown file doesn't give you one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory that makes the agent better over time
&lt;/h2&gt;

&lt;p&gt;Storing memory is one thing. Using it to improve is another. NexusTrade runs a background worker that scores every completed agent run, extracts what worked, and injects those patterns into the next run automatically.&lt;/p&gt;

&lt;p&gt;A prompt enhancer queries top performers and extracts their successful tool sequences. A planner enhancer finds few-shot examples relevant to the current task by keyword. Both cache results and inject learned patterns into future prompts automatically. Most agents plateau at run 1. The same output on run 50 as run 1, because nothing carries forward. This is the gap between a demo and a system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading about memory isn't the same as using it.
&lt;/h2&gt;

&lt;p&gt;The concepts in this article are straightforward on paper. File dumps, LLM summarization, vector embeddings, structured queries. But the questions that actually matter only come up when you run it: what does Aurora remember from your past sessions? What gets injected, and what gets filtered out?&lt;/p&gt;

&lt;p&gt;Module 4 of AI Agents from Scratch puts you in the system directly. You query Aurora's memory and see what it has stored from your past runs. You watch the LLM read your prompt, generate query fields, pull matching summaries, and inject them before the agent starts.&lt;/p&gt;

&lt;p&gt;You'll see exactly what the agent knows before it knows what you're about to ask. This is not a simulation. It's the live production system, and what it has stored is specific to you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch/lesson/ai-m4-video-memory" rel="noopener noreferrer"&gt;Start Module 4 — free, no credit card&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/agent" rel="noopener noreferrer"&gt;Or open Aurora directly&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Part 4 of 5 in the &lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch" rel="noopener noreferrer"&gt;AI Agents from Scratch&lt;/a&gt; series.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try NexusTrade's AI trading agent free: &lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;https://nexustrade.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Coinbase calls their chatbot an agent. I got fired for building a real one.</title>
      <dc:creator>Austin Starks</dc:creator>
      <pubDate>Mon, 13 Apr 2026 17:01:01 +0000</pubDate>
      <link>https://forem.com/austin_starks/coinbase-calls-their-chatbot-an-agent-i-got-fired-for-building-a-real-one-1ael</link>
      <guid>https://forem.com/austin_starks/coinbase-calls-their-chatbot-an-agent-i-got-fired-for-building-a-real-one-1ael</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note from the author:&lt;/strong&gt; You're reading a Dev.to adaptation. The original on &lt;a href="https://nexustrade.io/blog/coinbase-fired-real-ai-agent-react-loop-20260413" rel="noopener noreferrer"&gt;NexusTrade&lt;/a&gt; includes interactive trace viewers, animated diagrams, equity curve visualizations, and embedded course exercises. Read it there for the full experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Coinbase fired me for building something they couldn't.&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.amazonaws.com%2Fuploads%2Farticles%2F7fexgtur2sepwxfe4f8i.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.amazonaws.com%2Fuploads%2Farticles%2F7fexgtur2sepwxfe4f8i.png" alt="Coinbase termination email — fired for building NexusTrade" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coinbase.com/en-gb/advisor" rel="noopener noreferrer"&gt;Coinbase Advisor's&lt;/a&gt; own FAQ asks it directly: "Does the AI make trades on my behalf?" The answer: &lt;em&gt;No.&lt;/em&gt; It answers your questions. It suggests a portfolio. Then it waits for you to click. That's the architecture of a chatbot: one question, one answer, you do the rest.&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.amazonaws.com%2Fuploads%2Farticles%2Faxc70lk6nqr2hu97tyxs.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.amazonaws.com%2Fuploads%2Farticles%2Faxc70lk6nqr2hu97tyxs.png" alt="Coinbase Advisor FAQ — Does the AI make trades on my behalf? No." width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NexusTrade is fundamentally different. It runs a loop. You send one message. Aurora figures out what it needs to know, calls tools, reads the results, and keeps going until the task is done. No clicking through each step. No waiting for your approval on every action unless you want 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.amazonaws.com%2Fuploads%2Farticles%2F2q37gnurvb7uxns4bxa9.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.amazonaws.com%2Fuploads%2Farticles%2F2q37gnurvb7uxns4bxa9.png" alt="User sends 'Build an options trading bot' — Aurora responds with a full planning breakdown before calling a single tool" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tell Aurora to research a stock, build a strategy, backtest it across three market regimes, and stage it for live trading. It chains all of that together on its own. Whether trades execute automatically or require your sign-off is up to you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Actual Difference&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coinbase built a 24/7 AI advisor. I built an autonomous agent. Here's the gap.
&lt;/h2&gt;

&lt;p&gt;Coinbase's marketing for Advisor is well-written. "Elite financial advice, democratized." "Turn your questions into actionable financial plans." Strong copy. The product behind it is a chatbot that generates recommendations you then manually execute.&lt;/p&gt;

&lt;p&gt;A team of engineers and millions of dollars, and they built a chatbot that waits for you to click. Here's what that buys you versus an actual agent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Coinbase Advisor&lt;/th&gt;
&lt;th&gt;NexusTrade (Aurora)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Answers financial questions&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executes trades autonomously&lt;/td&gt;
&lt;td&gt;No, requires explicit approval&lt;/td&gt;
&lt;td&gt;Yes, fully automated mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-step task chaining&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, up to 50 iterations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Builds and backtests a strategy&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, in a single agent run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spawns subagents for parallel work&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human-in-the-loop approval controls&lt;/td&gt;
&lt;td&gt;Required for all actions&lt;/td&gt;
&lt;td&gt;Optional, per-action toggle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bottom row is the one that matters. Coinbase Advisor requires approval for everything because it has no loop. It answers, then stops. NexusTrade makes approval optional because Aurora has a loop. It can keep going on its own, and the approval controls let you decide how much of that autonomy you want.&lt;/p&gt;

&lt;p&gt;The loop is the product. Everything else is a feature.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Problem&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A chatbot answers once. That's not enough.
&lt;/h2&gt;

&lt;p&gt;You ask a chatbot: "Build me a momentum strategy and backtest it." It generates a paragraph describing what a momentum strategy should look like. Then it stops. If you want the backtest, you take what it said and do the work yourself.&lt;/p&gt;

&lt;p&gt;That's the one-shot problem. A language model answers the question it's given. It doesn't ask the next question, run the next tool, or check if the answer it gave was actually correct. It responds and waits.&lt;/p&gt;

&lt;p&gt;For a lot of tasks, that's fine. Answering a question is useful. But there's a whole class of work that requires chaining actions together: research a stock, pull its indicators, build a strategy based on what you find, backtest it, check if it survived 2022, adjust the parameters, backtest again. No single response handles that. You need something that runs until the task is done.&lt;/p&gt;

&lt;p&gt;You need a loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is the difference between a chatbot and an AI agent?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; A chatbot responds once and waits for you. An AI agent runs a loop: think, act, observe, repeat. It chains multiple tool calls together until the task is done without you directing each step.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Loop&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thought. Action. Observation. Repeat.
&lt;/h2&gt;

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

&lt;p&gt;In 2022, a research team at Google published a paper called ReAct: Synergizing Reasoning and Acting in Language Models. The core idea was simple: instead of asking a model to produce a final answer, ask it to produce a thought, then an action, then read the result, then think again. Repeat until done.&lt;/p&gt;

&lt;p&gt;Thought → Action → Observation is the pattern every agent today runs on. Cursor uses it when you ask it to refactor a file and it reads the file, makes an edit, checks the diff, and continues. Claude Code uses it when it plans a multi-step task, runs each step, observes the output, and adjusts. Aurora uses it every time you send it a complex request.&lt;/p&gt;

&lt;p&gt;That loop is not a metaphor. It's a &lt;code&gt;while&lt;/code&gt; loop in production code. Aurora runs it on a background worker that polls every 500ms. Each iteration increments a counter, calls the model, executes the tool, saves the result, and goes again until the model sets &lt;code&gt;finalAnswer&lt;/code&gt; or the iteration limit is hit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# the ReAct loop, stripped to its core
&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_task&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# full conversation history
&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;max_iterations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# Thought → Action → Input
&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;final_answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;           &lt;span class="c1"&gt;# task complete
&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# execute tool
&lt;/span&gt;    &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="c1"&gt;# model sees what it did + what happened
&lt;/span&gt;    &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# hit the limit — compress + return best answer so far
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LangChain runs that same while loop internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChatOpenAI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_react_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AgentExecutor&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hub&lt;/span&gt;

&lt;span class="n"&gt;llm&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ChatOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stock_screener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;backtest_tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;create_strategy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# ReAct prompt tells the model to output Thought / Action / Observation
&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hwchase17/react&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;agent&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_react_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Research NVDA and build a momentum strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;# verbose=True prints each Thought / Action / Observation to the terminal.
# You'll see the while loop running in real time.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aurora implements the same loop directly, without LangChain, on a TypeScript background worker with a state machine that handles summarization, parallel subagents, and iteration limits. The pattern is identical. The infrastructure is purpose-built for trading. LangChain abstracts the loop, but hides the cost controls — per-iteration token metering, configurable summarization thresholds, and circuit breakers that halt a runaway agent are not concerns it was designed to handle.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Production Reality&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually looks like when Aurora runs.
&lt;/h2&gt;

&lt;p&gt;The screenshots below are from a real Aurora session. The task: build a fully autonomous 0DTE SPY options bot on a $25,000 account.&lt;/p&gt;

&lt;p&gt;Before the ReAct loop starts, a separate step runs first: the planner. This is a specialized prompt, distinct from the main loop, that takes the user's request, reasons about what it needs to know, and generates a structured plan. It's not iteration 1. It's the step before iteration 1. Aurora asks clarifying questions here, not because the loop told it to, but because the planner is designed to gather everything the loop will need before the first tool call fires:&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.amazonaws.com%2Fuploads%2Farticles%2Fha18kw8s9u8w61lwsqnz.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.amazonaws.com%2Fuploads%2Farticles%2Fha18kw8s9u8w61lwsqnz.png" alt="Aurora planning phase — asking clarifying questions before taking action" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the planner has what it needs, it produces a structured plan and hands it to the main agent. The ReAct loop starts. This is the Thought + Action visible in the approval modal:&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.amazonaws.com%2Fuploads%2Farticles%2F5l6e74hvz4wr2rjq6dr8.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.amazonaws.com%2Fuploads%2Farticles%2F5l6e74hvz4wr2rjq6dr8.png" alt="Aurora agent — Thought and Action visible in the approval modal, showing the ReAct loop structure" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that action runs, the result comes back as an observation. The agent reads it, generates the next Thought, and continues. Here's the SPY regime data Aurora used to decide which options hypothesis to test 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.amazonaws.com%2Fuploads%2Farticles%2F1o8llqufesspk1vrw5pt.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.amazonaws.com%2Fuploads%2Farticles%2F1o8llqufesspk1vrw5pt.png" alt="Aurora observation step — SPY price, SMA, and VIX chart result after tool call" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's the plan Aurora generated for the full strategy before calling any tool:&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.amazonaws.com%2Fuploads%2Farticles%2Fnfu637l72x62g4vkcw2m.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.amazonaws.com%2Fuploads%2Farticles%2Fnfu637l72x62g4vkcw2m.png" alt="Aurora fully automated — options strategy plan with subagent spawn" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;War story — $300 in one day:&lt;/strong&gt; When I launched strategy-triggered agents, I made one mistake: I didn't charge tokens for the planning phase. The planner is a separate LLM call that happens before the loop. I had token checks on the iterations. The planner, at launch, was free. A user configured a strategy with conditions that were almost always true, set to trigger as frequently as possible. Every time the condition fired: plan, stop (out of tokens), fire again. Plan. Stop. Fire. &lt;strong&gt;$300 in API costs. One day.&lt;/strong&gt; Hundreds of planning calls. None made it past iteration 1. The fix was two lines: deduct tokens before the planner runs, and deactivate the strategy if the user can't afford it. The step before the loop is just as real as the loop. Gate them all.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Autonomy Controls&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fully automated or semi-automated. You choose how much to trust it.
&lt;/h2&gt;

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

&lt;p&gt;Every agent system has to answer one question: how much should the agent do on its own before checking in with a human? The naive answer is "let it run." The production answer is: every tool your agent can call should be explicitly approved for autonomous execution, or it should require human sign-off first.&lt;/p&gt;

&lt;p&gt;Think of it as a whitelist. Some tools are cheap, fast, and reversible: reading market data, running a screener, generating a plan. Those can run without asking. Others are expensive, slow, or irreversible: submitting a live trade, deploying a strategy, deleting something. Those should pause and wait. The toggle in Aurora's UI is the implementation of that concept.&lt;/p&gt;

&lt;p&gt;Aurora has two modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fully Automated&lt;/strong&gt; — runs the entire loop without stopping. Every tool call executes immediately. You see the results when it's done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semi-Automated&lt;/strong&gt; — pauses before every action for your approval. You see the Thought and the proposed Action before anything executes.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2F65x366nkn1i5vqnb78go.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.amazonaws.com%2Fuploads%2Farticles%2F65x366nkn1i5vqnb78go.png" alt="Aurora in Semi-Automated mode — pauses for approval at each action" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In semi-automated mode, Aurora shows you its Thought and proposed Action before running any tool. You can approve, reject with feedback, or switch to fully automated if you've seen enough to trust 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.amazonaws.com%2Fuploads%2Farticles%2Fir9ckbh4wtrtikpzsdkj.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.amazonaws.com%2Fuploads%2Farticles%2Fir9ckbh4wtrtikpzsdkj.png" alt="Agent Approval Required — plan modal showing strategy, Approve and Reject buttons" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what "human-in-the-loop" actually means in production. It's not a philosophical stance about AI safety. It's a checkbox in the UI. Most experienced users start in semi-automated mode to verify the plan, then switch to fully automated once they trust the direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Why use subagents instead of giving one agent all the tools and letting it run everything?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Context window limits. By iteration 15-20, thousands of tokens of Thought/Action/Observation history are accumulating and reasoning quality drops. Subagents keep each context small and focused on one task.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Engineering Problem Nobody Talks About&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Long loops make agents dumb. Here's how Aurora solves it.
&lt;/h2&gt;

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

&lt;p&gt;The ReAct loop has a problem that shows up around iteration 15-20: the context window fills up. Every Thought, Action, and Observation gets appended to the conversation. By the time you're 20 iterations deep, the model is attending to thousands of tokens just to decide what to do next. Reasoning quality drops. The agent starts making worse decisions.&lt;/p&gt;

&lt;p&gt;The standard advice is "use subagents to keep contexts small." That's true and Aurora does it. But there's a second mechanism that's less talked about: conversation summarization.&lt;/p&gt;

&lt;p&gt;At iteration 20, Aurora doesn't stop. It summarizes. The model compresses everything it has learned: findings, portfolios created, what worked, what didn't. That summary becomes the context for a new conversation. The loop restarts with a clean window and the knowledge of everything that came before.&lt;/p&gt;

&lt;p&gt;The hard cap is separate: &lt;code&gt;totalIterations&lt;/code&gt; accumulates across all conversation resets. When you hit your configured maximum (default: 20 total, up to 50 on premium), the agent stops and delivers a final answer with whatever it accomplished. The summarization is how it stays sharp. The hard cap is how you control cost.&lt;/p&gt;

&lt;p&gt;Aurora also queries its own memory across sessions. If you've run five agent tasks this week, it can synthesize findings from all of them and bring relevant context into a new run. That's not the base model, which has no memory. That's the app layer, built on top of a stateless model, giving it continuity across sessions that the model itself can't have.&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.amazonaws.com%2Fuploads%2Farticles%2Fphdolle27oaagguu57rj.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.amazonaws.com%2Fuploads%2Farticles%2Fphdolle27oaagguu57rj.png" alt="Aurora memory query — synthesizing findings from past agent runs into a new session" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Module 3&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading about the loop is not the same as running it.
&lt;/h2&gt;

&lt;p&gt;The ReAct loop looks simple on paper. In practice, the interesting questions are the ones that only come up when you run it: Why did it pick that tool instead of a different one? Why did the reasoning change after iteration 5? What happens when a tool call fails?&lt;/p&gt;

&lt;p&gt;Module 3 of AI Agents from Scratch puts you in the loop directly. You send Aurora a real task in fully automated mode and watch each Thought → Action → Observation cycle play out in real time. Then you switch to semi-automated and approve or reject actions one at a time.&lt;/p&gt;

&lt;p&gt;You'll also see what happens when context starts to accumulate, when the summarization triggers, and what the compressed summary actually looks like. These aren't simulations. It's the live production system.&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.amazonaws.com%2Fuploads%2Farticles%2Fil1y075y3seupmr8dw2c.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.amazonaws.com%2Fuploads%2Farticles%2Fil1y075y3seupmr8dw2c.png" alt="Aurora agent — detailed plan with subagent spawn visible in approval modal" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch/lesson/ai-m3-video-orchestration" rel="noopener noreferrer"&gt;Start Module 3 — free, no credit card&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/agent" rel="noopener noreferrer"&gt;Or open Aurora directly&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part 3 of 5 in the &lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch" rel="noopener noreferrer"&gt;AI Agents from Scratch&lt;/a&gt; series.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try NexusTrade's AI trading agent free: &lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;https://nexustrade.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>career</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Everyone thinks ChatGPT is an AI agent. It's not.</title>
      <dc:creator>Austin Starks</dc:creator>
      <pubDate>Mon, 13 Apr 2026 16:21:39 +0000</pubDate>
      <link>https://forem.com/austin_starks/everyone-thinks-chatgpt-is-an-ai-agent-its-not-1n0l</link>
      <guid>https://forem.com/austin_starks/everyone-thinks-chatgpt-is-an-ai-agent-its-not-1n0l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note from the author:&lt;/strong&gt; You're reading a Dev.to adaptation. The original on &lt;a href="https://nexustrade.io/blog/chatgpt-is-not-an-ai-agent-controller-pattern-20260413" rel="noopener noreferrer"&gt;NexusTrade&lt;/a&gt; includes interactive trace viewers, animated diagrams, equity curve visualizations, and embedded course exercises. Read it there for the full experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Everyone thinks ChatGPT is an AI agent. It isn't.&lt;/p&gt;

&lt;p&gt;It's a chatbot with tools. And that difference is the reason most "AI agent" startups don't actually work.&lt;/p&gt;

&lt;p&gt;The distinction isn't semantic. It changes what you can build, what breaks, and why. If you're building an agent, evaluating one, or wondering why the product you're using doesn't do what it claims, this is the answer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Start Here&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A language model knows nothing. That's by design.
&lt;/h2&gt;

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

&lt;p&gt;A raw language model is stateless. It has no memory of you. It doesn't know what happened in markets today. It can't look anything up. All it can do is take whatever text you hand it and predict what should come next.&lt;/p&gt;

&lt;p&gt;That sounds limiting. It is. But it's also the foundation everything else builds on. The OpenAI Playground is the closest thing to a language model in its purest form. No apps layered on top. No tools. Just a system prompt, a conversation, and a model responding to exactly what you give it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The OpenAI Playground shows you the raw model.&lt;/strong&gt; No tools. No memory. No app layer. Ask it your name and it doesn't know. Give it your name in the system prompt and now it knows. Everything the model knows in a given conversation came from somewhere in the prompt: system message, user message, or tool results. Nothing else.&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.amazonaws.com%2Fuploads%2Farticles%2F5lrlyarkq2fg6368d3ea.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.amazonaws.com%2Fuploads%2Farticles%2F5lrlyarkq2fg6368d3ea.png" alt="OpenAI Playground — the raw language model with no tools, no memory, no context"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT is an app built on top of that model.&lt;/strong&gt; It knows your name because it has memory. It can search the web because it has tools. Those things aren't the model. They're layers the app added. Strip them away and you're back to the Playground.&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.amazonaws.com%2Fuploads%2Farticles%2Frphx131ygkisaq92mmky.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.amazonaws.com%2Fuploads%2Farticles%2Frphx131ygkisaq92mmky.png" alt="ChatGPT — an app built on top of a language model, with memory and tools layered on"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChatGPT still operates as a back-and-forth conversation where you're the one directing every move. That's a chatbot. An agent is something that can direct itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An agent runs a loop.&lt;/strong&gt; It thinks, picks an action, executes it through a tool, observes the result, and repeats until the task is done or it can't continue. You don't direct each step. The agent does. That loop is what separates it from every chatbot you've ever used. Tools and system prompts are how you build the loop. The loop is what makes it an agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is the difference between ChatGPT and an AI agent?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; ChatGPT responds once per message and waits for you to reply. An AI agent runs a loop: it thinks, takes an action through a tool, observes the result, and decides what to do next — all without waiting for you to direct each step.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;System Prompts&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The instructions the user never sees.
&lt;/h2&gt;

&lt;p&gt;Before any user message reaches a language model in a production app, there's a system prompt. It runs first, every time. It tells the model who it is, what it can do, what format to respond in, and how to handle edge cases.&lt;/p&gt;

&lt;p&gt;A well-designed system prompt isn't a paragraph of vague instructions. It has structure: an identity section, explicit directives, data sources or context, examples of correct behavior, and output format rules. The model's responses are only as good as the system prompt shaping them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# INSTRUCTIONS&lt;/span&gt;
You are Aurora, an AI trading assistant for NexusTrade.
You help users build, backtest, and manage trading strategies.
Always respond in JSON. forceJSON: true.
Never recommend a specific stock without a supporting backtest.
If the request is ambiguous, ask one clarifying question before proceeding.

&lt;span class="gh"&gt;# EXAMPLES&lt;/span&gt;
User: "I want to back test a trading strategy"
Assistant: {"tool": "backtest", "portfolio_id": "...", "start": "2022-01-01", "end": "2024-01-01"}

User: "Screen for high momentum stocks"
Assistant: {"tool": "screener", "query": "SELECT ticker FROM stocks WHERE rsi_14 &amp;gt; 70 ORDER BY momentum DESC"}

&lt;span class="gh"&gt;# OUTPUT FORMAT&lt;/span&gt;
Always respond in syntactically valid JSON.
No markdown fences. No explanation unless explicitly asked.
Schema: {"tool": string, "parameters": object}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What makes that system prompt work? Each section has a specific job. &lt;strong&gt;Instructions&lt;/strong&gt; pin the model's identity and hard constraints. If it's not written down, the model will invent behavior. &lt;strong&gt;Examples&lt;/strong&gt; show the model what correct output looks like without having to explain it in prose — one good example beats three paragraphs of description. &lt;strong&gt;Output format&lt;/strong&gt; eliminates ambiguity about structure. Without it, the model might respond in JSON sometimes and plain text other times, and your parser breaks.&lt;/p&gt;

&lt;p&gt;The bad version of this prompt is four words: &lt;em&gt;"You are a trading assistant."&lt;/em&gt; The model will try to be helpful and will fail in unpredictable ways. No output contract means you'll get markdown one response and raw JSON the next. No examples means the model guesses what "backtest" should return. No constraints means it'll recommend NVDA when it shouldn't, apologize when it doesn't need to, and ask five clarifying questions instead of one. Every missing line is a failure mode you'll discover in production.&lt;/p&gt;

&lt;p&gt;Prompt engineering is designing the instructions that run silently before the user types anything. In production, that's the difference between an AI that does what you need and one that does something close but wrong in ways you can't predict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-shot vs. one-shot — same prompt, different parser:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zero-shot (no examples)&lt;/th&gt;
&lt;th&gt;One-shot (one example added)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Output format is inconsistent — sometimes JSON, sometimes prose&lt;/td&gt;
&lt;td&gt;Output format is reliable — the model mirrors the example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge cases produce unpredictable structures&lt;/td&gt;
&lt;td&gt;Edge cases degrade gracefully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parser breaks in production&lt;/td&gt;
&lt;td&gt;Parser handles it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;blockquote&gt;
&lt;p&gt;From the course: In Module 2's first exercise, you build a real system prompt from scratch and run it against Gemini using a token grant we give you. You write the instructions, the examples, and the output format rules. Then you render it and see exactly what the model receives. Most people have never seen a production system prompt in full.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Tools&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI doesn't execute anything. Your code does.
&lt;/h2&gt;

&lt;p&gt;Here's the thing most people get wrong about AI agents: the model doesn't actually do anything. It generates text. Your system reads that text, figures out what to do with it, and executes the action. The result comes back. The model sees it and continues.&lt;/p&gt;

&lt;p&gt;That's a tool call. The model outputs a structured JSON object that describes what it wants to do. Your code parses the JSON and runs the actual function. Nothing happens until your system does something with the output.&lt;/p&gt;

&lt;p&gt;A concrete example. If the model outputs this:&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;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backtest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"portfolio_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;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"end_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&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;The JSON itself does nothing. Your system reads it, calls the backtest API with those parameters, gets the results, and feeds them back into the conversation. Now the model can see what happened and decide what to do next.&lt;/p&gt;

&lt;p&gt;This is why "the AI is doing it" is a slightly misleading frame. The AI is deciding what to do. Your infrastructure is doing it. The distinction matters because it means every tool an agent has is something a human explicitly built and wired up. Agents don't gain new capabilities on their own.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; An AI agent outputs a tool call to "buy 10 shares of AAPL." What actually executes the trade?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Your code does. The agent generates a JSON object describing what it wants. Your system parses it, calls the brokerage API with those parameters, and returns the result. The model never touches the market directly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Production Reality&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How this scales: 23 sub-prompts and one classifier.
&lt;/h2&gt;

&lt;p&gt;Once you understand system prompts and tools, you can build an agent that does one thing well. The harder problem is building one that does many things well without the system prompt becoming impossible to maintain.&lt;/p&gt;

&lt;p&gt;The answer most production apps land on is the same: don't build one giant prompt. Build many focused ones and route between them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;War story — Aurora V1 (2023):&lt;/strong&gt; The first version ran on GPT-3. 2,048-token context window. One giant prompt, but the output window was so small it couldn't generate a full portfolio object in a single call. So I chained three separate prompts: portfolio → conditions → actions → an orchestration step to stitch the pieces together. JSON mode didn't exist yet. I'd instruct the model to respond in JSON, it would partially comply, I'd parse the output, watch it fail, then retry up to three times with a message explaining exactly where the JSON broke. Every prompt was a hardcoded string in the source code. Changing one instruction meant a code deploy. Aurora v1 did exactly one thing: create portfolios. That's it.&lt;/p&gt;
&lt;/blockquote&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.amazonaws.com%2Fuploads%2Farticles%2F6zl3h6njr9siar0iek0g.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.amazonaws.com%2Fuploads%2Farticles%2F6zl3h6njr9siar0iek0g.png" alt="Aurora v1 — the original GPT-3 powered chat interface for creating algorithmic trading strategies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The classifier exists because I built that version first.&lt;/p&gt;

&lt;p&gt;The controller is the decision layer that sits between the user and every sub-agent. In NexusTrade, every message you send to Aurora hits the classifier first. It reads your message and a list of 23 specialized sub-prompts, each with its own description. It picks the one that should handle your request and routes to it. That sub-prompt has a tight system prompt, a narrow tool list, and examples specific to its job. The main model only ever sees one task at a time.&lt;/p&gt;

&lt;p&gt;The classifier is &lt;code&gt;gemini-3.1-flash-lite-001&lt;/code&gt; at &lt;code&gt;temperature: 0&lt;/code&gt; with &lt;code&gt;forceJSON: true&lt;/code&gt;. Fast, cheap, deterministic. It runs on every message. The expensive models only run when a message reaches them.&lt;/p&gt;

&lt;p&gt;Four engineering reasons this wins over a single giant prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus.&lt;/strong&gt; Each sub-prompt sees only the tools and instructions relevant to its task. The model isn't confused by 200 rules that don't apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debuggability.&lt;/strong&gt; When a route breaks, you know exactly which sub-prompt to fix. No hunting through a monolith.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental scaling.&lt;/strong&gt; Add a new capability by writing a new sub-prompt and a trigger description. Nothing else changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost control.&lt;/strong&gt; Only the matched sub-prompt runs against the expensive model. The classifier is cheap by design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the architecture almost every production AI app at scale converges on. ChatGPT's Custom GPTs are sub-prompts. Claude's Projects are sub-prompts. Cursor routes your request before invoking the right tool. You've been using this pattern without knowing what to call it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;One More Thing&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: the same concept with a standard interface.
&lt;/h2&gt;

&lt;p&gt;The AI industry has a naming problem. Function calling, tool use, skills, MCP servers. They all describe the same core concept: a list of things the agent is allowed to do, with defined inputs and outputs, so it can generate parameters and your system can execute the call.&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) is Anthropic's open standard for this. Think of it as USB for AI agents. Before USB, every device had its own connector. MCP creates one standard so any agent can connect to any tool that exposes an MCP server.&lt;/p&gt;

&lt;p&gt;NexusTrade runs an MCP server. Here's what that actually looks like in practice. You add one entry to your Claude Desktop config:&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;"mcpServers"&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;"nexustrade"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://nexustrade.io/api/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&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;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;your-api-key&amp;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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. After that, you open Claude Desktop and ask: &lt;em&gt;"What's the current RSI of NVDA?"&lt;/em&gt; — Claude calls &lt;code&gt;screen_stocks&lt;/code&gt; on the NexusTrade MCP server, the server returns the live value, Claude reads it and responds with the number and what it means in context. The same tool engine Aurora uses inside NexusTrade. No copy-paste. No API docs. One tool implementation, available from any MCP-compatible client.&lt;/p&gt;

&lt;p&gt;The name changes depending on the ecosystem. The pattern doesn't.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Module 2&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading this isn't enough.
&lt;/h2&gt;

&lt;p&gt;Reading about system prompts and writing one that works are different skills. Understanding the classifier pattern and knowing where it breaks are different things. The only way to close that gap is to build something and watch it fail.&lt;/p&gt;

&lt;p&gt;Module 2 has two exercises built around this. In the first, you write a real system prompt from scratch (instructions, examples, output format) and render it against a live Gemini model using tokens we give you. You see exactly what the model receives and how it responds. In the second, you run the real NexusTrade classifier. You read the sub-prompt descriptions. You type messages and watch them route. Then you try to find edge cases that break it.&lt;/p&gt;

&lt;p&gt;Both exercises use real infrastructure. Real models. Real NexusTrade prompts. Nothing is simulated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch/lesson/ai-m2-video-chatgpt" rel="noopener noreferrer"&gt;Start Module 2 — free, no credit card&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part 2 of 5 in the &lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch" rel="noopener noreferrer"&gt;AI Agents from Scratch&lt;/a&gt; series.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try NexusTrade's AI trading agent free: &lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;https://nexustrade.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Claude Code's source code just leaked. Today I'm going to teach you how it works.</title>
      <dc:creator>Austin Starks</dc:creator>
      <pubDate>Mon, 13 Apr 2026 16:21:31 +0000</pubDate>
      <link>https://forem.com/austin_starks/claude-codes-source-code-just-leaked-today-im-going-to-teach-you-how-it-works-7nf</link>
      <guid>https://forem.com/austin_starks/claude-codes-source-code-just-leaked-today-im-going-to-teach-you-how-it-works-7nf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note from the author:&lt;/strong&gt; You're reading a Dev.to adaptation. The original on &lt;a href="https://nexustrade.io/blog/claude-code-source-leaked-ai-agent-deep-dive-20260413" rel="noopener noreferrer"&gt;NexusTrade&lt;/a&gt; includes interactive trace viewers, animated diagrams, equity curve visualizations, and embedded course exercises. Read it there for the full experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Why Now&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code's source code just leaked. Half a million lines. And most people reading it have no idea what they're looking at.
&lt;/h2&gt;

&lt;p&gt;On March 31, 2026, Anthropic accidentally published a source map in the Claude Code npm package that exposed the full TypeScript source. Over 512,000 lines. Gone public.&lt;/p&gt;

&lt;p&gt;The internet went crazy.&lt;/p&gt;

&lt;p&gt;Engineers are posting breakdowns. Developers are building clones. Everyone's asking the same question: how does this thing actually work?&lt;/p&gt;

&lt;p&gt;If you already understood how AI agents are built, you'd know exactly what you're looking at.&lt;/p&gt;

&lt;p&gt;That's the gap. And that's what this course closes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Building an AI agent isn't nearly as hard as you think."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I know this because I built one from scratch before most people knew the term. Ocebot was an autonomous claim adjudication agent I built at Oscar Health. It was running real healthcare workflows in production while the industry was still debating whether agents were real. Before that, I got a master's in software engineering from Carnegie Mellon. Since then I've interviewed at OpenAI and Meta for AI-native roles, and watched this exact architecture become the standard for what they test.&lt;/p&gt;

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




&lt;p&gt;&lt;em&gt;What It Means&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The leak didn't reveal magic. It revealed a loop.
&lt;/h2&gt;

&lt;p&gt;Everyone who's read the breakdown knows the same thing: at the center of Claude Code is a loop. The model thinks. It picks a tool. The tool runs. The result comes back. Repeat until done.&lt;/p&gt;

&lt;p&gt;That loop has a name. It's called ReAct, from a 2022 paper out of Google Research. Cursor runs on it. Claude Code runs on it. Every production AI agent you've used runs some version of it.&lt;/p&gt;

&lt;p&gt;Here's the actual structure from &lt;code&gt;src/query.ts&lt;/code&gt;, the 1,729-line file at the heart of the leak. Most people miss the key detail: tools start executing &lt;em&gt;while the model is still streaming&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/query.ts · claude code v2.1.88 · simplified&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Trim context before every call (4-layer cascade)&lt;/span&gt;
  &lt;span class="c1"&gt;//    HISTORY_SNIP → microcompact → CONTEXT_COLLAPSE → autocompact&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;trimContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Stream the model response&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;streamComplete&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;executor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StreamingToolExecutor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// RWLock: reads parallel, writes exclusive&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Dispatch tools IMMEDIATELY as they appear in the stream&lt;/span&gt;
  &lt;span class="c1"&gt;//    Don't wait for the model to finish generating&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool_use&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Collect all tool results (some ran in parallel)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// No tools called — model is done&lt;/span&gt;

  &lt;span class="c1"&gt;// 5. Feed results back and go again&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentBlocks&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toToolResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loop that makes Cursor feel fast is the same pattern. Read tools (grep, file read, search) run in parallel. Write tools get an exclusive lock. The model doesn't wait for a tool to finish. It's already streaming the next thought while the tool runs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2210.03629" rel="noopener noreferrer"&gt;ReAct: Synergizing Reasoning and Acting in Language Models (arxiv.org, 2022)&lt;/a&gt; — the paper behind the loop that powers Cursor, Claude Code, and every production AI agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chatbot vs. Agent: the line that matters&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ChatGPT / Copilot&lt;/th&gt;
&lt;th&gt;Aurora / Claude Code / Cursor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Responds to your prompt&lt;/td&gt;
&lt;td&gt;Runs a loop until the task is done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starts fresh every message&lt;/td&gt;
&lt;td&gt;Reads memory from past sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You direct every step&lt;/td&gt;
&lt;td&gt;Directs itself through subtasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can't use tools autonomously&lt;/td&gt;
&lt;td&gt;Calls tools, observes results, decides what's next&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output: text&lt;/td&gt;
&lt;td&gt;Output: actions in the real world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The loop is the core. But the loop alone doesn't get you to production. The rest of this series covers what wraps around it: how controllers route decisions, how the orchestration loop manages autonomy without going off the rails, how memory lets an agent improve across sessions instead of starting cold every run, and how you measure whether any of it is actually working.&lt;/p&gt;

&lt;p&gt;Most people using Cursor or Claude Code are operating on intuition. They can't explain why it works when it works or why it fails the way it does. They can't evaluate whether the next tool is actually better or just better marketed. That's fine until you're the one expected to build something, own something, or interview for something. Then it matters.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;From the course: "I recommend you take a look at the ReAct paper. You don't have to read the entire thing. Drop it in ChatGPT or Claude. Read the abstract. Understand it. Because this is the basis of all AI agents today."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Who This Is For&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three types of people need this course.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You're a SWE or PM at a company that just shipped an "AI roadmap."&lt;/strong&gt; Your team is using the word "agent." You're expected to own something in this space within the next two quarters and you'd like to understand what you're actually building before that conversation happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You have an AI-native systems design interview coming up.&lt;/strong&gt; Meta, Google, Anthropic, xAI still test databases. Now they layer agent architecture on top: design a system that can reason, remember, and self-correct. This series covers exactly what they test. I know because I went through it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You use Cursor or Claude Code every day and you've started wondering what's actually happening.&lt;/strong&gt; Why does it fail the way it does? Why does Cursor feel smarter than Claude Code when both use Claude under the hood? What would you change if you could get inside it? That's what this series answers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How technical is it? Semi-technical. There are code snippets and diagrams. You are not expected to reproduce them. The goal is understanding how agents work, not memorizing syntax.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;The Full Picture&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Big tech is now interviewing for four specific things. This series covers all of them.
&lt;/h2&gt;

&lt;p&gt;The AI-Native SWE interview is a different animal. Linked lists are not the bottleneck anymore. The systems design component now includes agents that reason, remember, act, and self-correct. Here's exactly what they're testing, and what every article in this series teaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  01. Controllers &amp;amp; Prompt Engineering
&lt;/h3&gt;

&lt;p&gt;What actually separates a language model from an agent. System prompts, tool schemas, JSON generation, function calling, and the controller layer that routes every decision. MCP servers are just tools with a standardized interface. You need to know why that matters.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interview signal: "Walk me through how you'd architect the prompt layer for a multi-tool agent."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  02. The ReAct Loop &amp;amp; Orchestration
&lt;/h3&gt;

&lt;p&gt;The Reasoning + Acting loop is the engine behind every serious agent: Claude Code, Cursor, Devin. How it works, how it fails, and how to make it production-safe with approval modes, permission layers, and circuit breakers that stop runaway agents.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interview signal: "Describe the ReAct pattern. How would you prevent an agent from taking a destructive action?"&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  03. Memory Architecture
&lt;/h3&gt;

&lt;p&gt;In-context, external, episodic, semantic: four tiers of agent memory and when to use each. Why most agents feel dumb after the first few messages, how retrieval-augmented generation fixes it, and the architecture that lets an agent improve across runs instead of starting cold every time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interview signal: "Your agent's context window fills up mid-task. How do you handle it without losing state?"&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  04. Evaluation &amp;amp; Observability
&lt;/h3&gt;

&lt;p&gt;How do you know if your agent is actually getting better? Traces, LLM judges, weighted rubrics, and the feedback loop that closes the improvement cycle. The optimization trap is real: an agent can score perfectly on your metric and still be completely wrong in production.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interview signal: "How would you build an automated evaluation pipeline for an agent? What would you measure?"&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Pop Quiz&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick check before you go to Module 2.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What is the main difference between ChatGPT and a bare language model like the OpenAI Playground?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; ChatGPT wraps the model with tools (web search, code execution) that let it actually do things. The Playground is the model in its purest form. The underlying model can be the same. The difference is the tool layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; When an AI agent generates a JSON tool call, does the JSON itself perform the action?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; No. JSON is just text. It doesn't do anything by itself. Your system has to parse that JSON, call the actual function or API with those parameters, and return the result. The model generates instructions. The system executes them.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Series&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Four more articles. Each one will change how you think about AI.
&lt;/h2&gt;

&lt;p&gt;This article is just the setup. The next four cover real architectures, real failures, and the exact decisions that separate agents that work from agents that break.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nexustrade.io/blog/chatgpt-is-not-an-ai-agent-controller-pattern-20260413" rel="noopener noreferrer"&gt;Everyone thinks ChatGPT is an AI agent. It's not.&lt;/a&gt;&lt;/strong&gt; — The exact architecture that turns a model into something that actually does things.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nexustrade.io/blog/coinbase-fired-real-ai-agent-react-loop-20260413" rel="noopener noreferrer"&gt;Coinbase calls their chatbot an agent. I got fired for building a real one.&lt;/a&gt;&lt;/strong&gt; — The orchestration loop that separates the two.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nexustrade.io/blog/cursor-vs-claude-code-memory-architecture-20260413" rel="noopener noreferrer"&gt;Cursor beats Claude Code. Here's the memory architecture that proves it.&lt;/a&gt;&lt;/strong&gt; — All four memory tiers and why getting this wrong is why most agents feel dumb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nexustrade.io/blog/ai-trading-bot-optimization-trap-evaluation-loop-20260413" rel="noopener noreferrer"&gt;Your AI trading bot will fail because it's optimizing the wrong thing.&lt;/a&gt;&lt;/strong&gt; — Traces, LLM judges, and the evaluation framework that actually catches it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Part 1 of 5 in the &lt;a href="https://nexustrade.io/learn/ai-agents-from-scratch" rel="noopener noreferrer"&gt;AI Agents from Scratch&lt;/a&gt; series.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Try NexusTrade's AI trading agent free: &lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;https://nexustrade.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>career</category>
    </item>
    <item>
      <title>I was fired from my software engineering job at Coinbase for building an AI trading platform. Here’s what happened.</title>
      <dc:creator>Austin Starks</dc:creator>
      <pubDate>Wed, 08 Apr 2026 16:52:09 +0000</pubDate>
      <link>https://forem.com/austin_starks/i-was-fired-from-my-software-engineering-job-at-coinbase-for-building-an-ai-trading-platform-1h3g</link>
      <guid>https://forem.com/austin_starks/i-was-fired-from-my-software-engineering-job-at-coinbase-for-building-an-ai-trading-platform-1h3g</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Foq9v88sx9jre833rh7ed.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.amazonaws.com%2Fuploads%2Farticles%2Foq9v88sx9jre833rh7ed.png" alt="A computer monitor displaying a Gmail termination email from Coinbase with an employee badge hanging from the screen" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When I woke up to the email, I knew I should've prepared for the worst.
&lt;/h2&gt;

&lt;p&gt;I didn't expect this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The investigation has concluded and it has found that you violated the Company's Outside Activities Policy. Due to this violation, Coinbase is terminating your employment, effective immediately."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So... matter of factly. Without empathy.&lt;/p&gt;

&lt;p&gt;Cruel.&lt;/p&gt;

&lt;p&gt;I wasn't the only one that was surprised. My entire team, including my manager, found out the day of. I was suspended, left in the dark, then promptly fired... even though I followed the rules.&lt;/p&gt;

&lt;p&gt;Here's what happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  Jumping for Joy at My Initial Offer
&lt;/h2&gt;

&lt;p&gt;When I got my initial offer from Coinbase, I couldn't stop talking about it. As someone who has been intrinsically passionate about investing for years, this was finally my chance to apply my passion with a big-boy job.&lt;/p&gt;

&lt;p&gt;Who wouldn't be excited?&lt;/p&gt;

&lt;p&gt;I got my offer contract and read it over and over again. But not just me. I also used ChatGPT and Claude to make sure I wasn't missing anything. There was one section that seemed particularly important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ownership of Inventions.&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.amazonaws.com%2Fuploads%2Farticles%2Fk9ojmjb6dpa17rn8gw8k.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.amazonaws.com%2Fuploads%2Farticles%2Fk9ojmjb6dpa17rn8gw8k.png" alt="Coinbase offer letter — Ownership of Inventions clause" width="800" height="579"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The clause that was supposed to protect me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It seemed simple enough. Send an email to peopleops and they'll take care of the rest. I signed my offer letter, sent the email, and started my new adventure at Coinbase.&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.amazonaws.com%2Fuploads%2Farticles%2Ft60hworhb8pfrwesln63.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.amazonaws.com%2Fuploads%2Farticles%2Ft60hworhb8pfrwesln63.png" alt="Gmail screenshot showing NexusTrade disclosure" width="800" height="655"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The email I sent to peopleops on September 2, 2025, before my start date. NexusTrade was disclosed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Until I was contacted by a department that I had &lt;em&gt;never&lt;/em&gt; worked with before... Compliance.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Conflict of Interest
&lt;/h2&gt;

&lt;p&gt;Now, I want to be very clear about where I'm coming from. I was NOT hiding an outside business from Coinbase. If you know anything about me, you know I'm telling the truth.&lt;/p&gt;

&lt;p&gt;I talk about my app NexusTrade all of the time. It's on my GitHub profile. It's on my LinkedIn. It's quite literally the only thing I post about on Medium.&lt;/p&gt;

&lt;p&gt;It's NOT a secret. It's why I was hired.&lt;/p&gt;

&lt;p&gt;My interviewers asked me about it. My resume featured it prominently. Coinbase knew exactly what I was building when they extended the offer. I disclosed it in writing before my first day, exactly as the offer letter instructed.&lt;/p&gt;

&lt;p&gt;But unbeknownst to me, Coinbase had become interested in the intersection of AI and trading. In December 2025, they officially launched &lt;strong&gt;Coinbase Advisor&lt;/strong&gt;. I wasn't paying attention when they made the announcement; I was far too busy refactoring our question bank to let our team configure questions through Cursor or Claude Code instead of the old, error-prone manual process. So when I received a DM from Coinbase's Legal Team, I knew something started to feel off.&lt;/p&gt;

&lt;p&gt;I kept my cool and cooperated.&lt;/p&gt;

&lt;p&gt;I'm not going to bore you with the details. The Coinbase Legal team had me go through the process. I tried to explain the situation. That my app is an algorithmic trading platform, that I'm a "one-man shop", and that there is virtually no overlap with my role working on institutional onboarding.&lt;/p&gt;

&lt;p&gt;They didn't care.&lt;/p&gt;

&lt;p&gt;I even became desperate. Started offering concessions like open-sourcing the project or removing digital assets.&lt;/p&gt;

&lt;p&gt;They accepted none.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It materially competes with Coinbase Advisor. It doesn't matter that you declared it. It doesn't matter that you've been working on it for five years. Shut it down, sell it, or resign, your choice."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah. What a choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Suspension
&lt;/h2&gt;

&lt;p&gt;They gave me 30 days to shut down the app, sell it, or resign.&lt;/p&gt;

&lt;p&gt;I had poured five years of my life into NexusTrade. Shutting it down wasn't an option. Selling it overnight wasn't realistic. So I tried to handle the situation like a professional. If they were effectively forcing me out over a pre-disclosed side project, I asked if we could negotiate a standard severance package so we could part ways amicably.&lt;/p&gt;

&lt;p&gt;Their response?&lt;/p&gt;

&lt;p&gt;Instead of negotiating, they immediately suspended me. On Wednesday, March 25th, I was placed on leave for sudden "conduct concerns."&lt;/p&gt;

&lt;p&gt;The accusation was baseless. I knew it, because I had actually read the Code of Conduct. During the investigation, they asked me questions like whether I had worked on NexusTrade during work hours (no) and whether I had used Coinbase equipment for it (never). I answered everything honestly. Yes, I had continued working on NexusTrade since being employed at Coinbase, but always on my own time, on my own machine.&lt;/p&gt;

&lt;p&gt;It felt incredibly retaliatory: a punishment simply for asking for severance after they backed me into a corner. I raised retaliation concerns to HR on Monday, March 30th. I also raised the possibility of racial discrimination. I don't believe a white engineer with a similar side project would have been treated this way: locked out, shut down, not allowed to say goodbye. Coinbase has said that denials of outside activities are "rare." I wonder who's getting denied.&lt;/p&gt;

&lt;p&gt;Coinbase fired me one week later.&lt;/p&gt;

&lt;p&gt;They dropped the "conduct concerns" framing, switched back to "Outside Activities Violation," and terminated me effective immediately. They didn't even honor their own 30-day deadline. No severance. No transition. My manager didn't even know until the day of.&lt;/p&gt;

&lt;p&gt;Here's the timeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before Day 1&lt;/strong&gt;: Disclosed NexusTrade in writing to peopleops, exactly as the offer letter instructed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;December 2025&lt;/strong&gt;: Coinbase launches Coinbase Advisor. Coinbase Legal contacts me about NexusTrade. I submit through their review process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early 2026&lt;/strong&gt;: Coinbase determines NexusTrade "materially competes" with Coinbase Advisor. Tells me to shut it down, sell it, or resign within 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 24, 2026&lt;/strong&gt;: I ask for a standard severance package since they're effectively forcing me out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 25, 2026&lt;/strong&gt;: Immediately suspended for "conduct concerns." One day after asking for severance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;March 30, 2026&lt;/strong&gt;: I raise retaliation and discrimination concerns to HR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;April 6, 2026&lt;/strong&gt;: Fired. "Conduct concerns" dropped. Termination reason: "Outside Activities Violation." No severance. Nobody on my team was told in advance.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The App That They're So Afraid Of
&lt;/h2&gt;

&lt;p&gt;So what is this app that Coinbase felt so threatened by? Let me show you.&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.amazonaws.com%2Fuploads%2Farticles%2Fhvptktmj6hwgizw7kral.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.amazonaws.com%2Fuploads%2Farticles%2Fhvptktmj6hwgizw7kral.png" alt="NexusTrade landing page" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;NexusTrade: the app that got me fired.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;NexusTrade&lt;/a&gt; is an AI-powered, no-code algorithmic trading platform. I built it as a solo developer over the course of five years. Users can create automated trading strategies, backtest them against historical data, optimize parameters using genetic algorithms, and deploy them live through brokerage integrations with TradeStation, Public, Alpaca, and Tradier.&lt;/p&gt;

&lt;p&gt;It supports US-listed stocks, ETFs, cryptocurrencies, and listed options including multi-leg spreads. It has an AI agent called Aurora that can research stocks, build portfolios, and execute multi-step tasks through natural language. Users can share their strategies publicly, copy-trade other users, or monetize their strategies with a monthly subscription.&lt;/p&gt;

&lt;p&gt;Now let's look at what Coinbase claimed it "materially competes" with.&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.amazonaws.com%2Fuploads%2Farticles%2Fbskpnuxrehchtlbqwc5r.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.amazonaws.com%2Fuploads%2Farticles%2Fbskpnuxrehchtlbqwc5r.png" alt="Coinbase Advisor landing page" width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Coinbase Advisor: "The Financial Advisor experience, democratized."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Coinbase Advisor?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Coinbase Advisor&lt;/strong&gt; is an AI-powered financial advisory tool built into the Coinbase app. It was announced on December 17, 2025 during Coinbase's "System Update 2025" livestream. It's provided through Coinbase Advisors, LLC, a CFTC-registered Commodity Trading Advisor and NFA member.&lt;/p&gt;

&lt;p&gt;Coinbase is a multi-billion dollar publicly traded company. The tagline for Advisor: &lt;em&gt;"The Financial Advisor experience, democratized."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's what it actually does: users type natural language requests like "Build me a portfolio" or "What's the latest market news?" The AI asks clarifying questions about risk tolerance and investment goals, evaluates the user's existing holdings, and generates a personalized asset allocation. Users can review, edit, and adjust the recommendations before executing. It is non-discretionary, meaning the AI never trades without the user's explicit permission.&lt;/p&gt;

&lt;p&gt;As of early 2026, Coinbase Advisor is still in beta and available primarily to Coinbase One subscribers. Its investment frameworks were developed by a team of portfolio managers with over 75 years of combined experience from traditional asset management.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Side-by-Side
&lt;/h3&gt;

&lt;p&gt;Here is a fair, feature-by-feature comparison between the two products:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;NexusTrade&lt;/th&gt;
&lt;th&gt;Coinbase Advisor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary Function&lt;/td&gt;
&lt;td&gt;Algorithmic trading platform&lt;/td&gt;
&lt;td&gt;AI financial advisor / chatbot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Stocks &amp;amp; ETFs&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.coinbase.com/advisor" rel="noopener noreferrer"&gt;Planned&lt;/a&gt; (stock trading launched separately)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Options Trading&lt;/td&gt;
&lt;td&gt;Yes (multi-leg spreads, Greeks)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cryptocurrency&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Algorithmic / Rule-Based Trading&lt;/td&gt;
&lt;td&gt;Yes (no-code strategy builder)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backtesting&lt;/td&gt;
&lt;td&gt;Yes (OHLC and intraday, Rust engine)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portfolio Optimization&lt;/td&gt;
&lt;td&gt;Yes (genetic algorithms)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Assistant&lt;/td&gt;
&lt;td&gt;Yes (Aurora agent)&lt;/td&gt;
&lt;td&gt;Yes (core product)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personalized Recommendations&lt;/td&gt;
&lt;td&gt;Via AI&lt;/td&gt;
&lt;td&gt;Yes (curated by portfolio managers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External Brokerage Integration&lt;/td&gt;
&lt;td&gt;Yes (4 brokerages)&lt;/td&gt;
&lt;td&gt;No (Coinbase ecosystem only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copy Trading / Social&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strategy Monetization&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP / API Access&lt;/td&gt;
&lt;td&gt;Yes (32 tools)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DCA / Automated Buying&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yield / Staking&lt;/td&gt;
&lt;td&gt;Partial (~3% via Alpaca)&lt;/td&gt;
&lt;td&gt;Yes (USDC lending)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regulatory Status&lt;/td&gt;
&lt;td&gt;Independent platform&lt;/td&gt;
&lt;td&gt;CFTC-registered CTA, NFA member&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Size&lt;/td&gt;
&lt;td&gt;1 person&lt;/td&gt;
&lt;td&gt;Multi-billion dollar public company&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Live, public&lt;/td&gt;
&lt;td&gt;Beta, waitlist&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Where They Actually Overlap
&lt;/h3&gt;

&lt;p&gt;Let me be honest about the overlap. Both products have an AI assistant. Both support cryptocurrency. Both allow dollar-cost averaging. These are real similarities.&lt;/p&gt;

&lt;p&gt;But "both have AI" and "both support crypto" is an extraordinarily broad definition of competition. By that logic, any software engineer who has ever built a side project involving AI or cryptocurrency is a competitive threat to Coinbase. That's not a reasonable standard.&lt;/p&gt;

&lt;p&gt;The core products are fundamentally different. NexusTrade is an algorithmic trading platform. You build rule-based strategies, backtest them against years of historical data, optimize them with genetic algorithms, and deploy them across four external brokerages. Coinbase Advisor is a conversational AI that recommends crypto allocations within the Coinbase ecosystem. One is an engine. The other is a chatbot.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The math:&lt;/strong&gt; Out of 18 feature categories, the two products share &lt;strong&gt;4&lt;/strong&gt; (crypto support, AI assistant, DCA, yield/staking). NexusTrade has &lt;strong&gt;10 features&lt;/strong&gt; that Coinbase Advisor does not. Coinbase Advisor has &lt;strong&gt;1 feature&lt;/strong&gt; (CTA registration) that NexusTrade does not. The overlap is &lt;strong&gt;22%&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Coinbase decided that 22% overlap was enough to call it "material competition" and fire someone who disclosed the project before their first day.&lt;/p&gt;




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

&lt;p&gt;I did everything right. I read my offer letter. I used AI to review it. I disclosed my project in writing before my first day. I cooperated with Legal. I offered concessions. I asked for a professional resolution.&lt;/p&gt;

&lt;p&gt;None of it mattered.&lt;/p&gt;

&lt;p&gt;The lesson here is uncomfortable but important: disclosure does not protect you. Having the rules on your side does not protect you. Cooperation does not protect you. When a company decides you're a problem, the process exists to justify the outcome, not to find the truth.&lt;/p&gt;

&lt;p&gt;I'm not bitter. I'm building.&lt;/p&gt;

&lt;p&gt;NexusTrade is still live. I'm still a one-man shop. And now I don't have to ask anyone's permission to work on the thing I've spent five years of my life creating.&lt;/p&gt;

&lt;p&gt;If you want to check out the app that got me fired, you can find it at &lt;a href="https://nexustrade.io" rel="noopener noreferrer"&gt;NexusTrade.io&lt;/a&gt;. If you've ever been in a similar situation, I'd genuinely like to hear your story.&lt;/p&gt;

&lt;p&gt;And to my former team at Coinbase: I'm sorry I didn't get to say goodbye. You deserved better than that. So did I.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article reflects my personal experience and perspective. The timeline and events described are based on my own records and recollections. I have not disclosed any confidential Coinbase information or intellectual property. All opinions expressed are my own.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>coinbase</category>
      <category>discuss</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
