<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lucas Santana</title>
    <description>The latest articles on DEV Community by Lucas Santana (@luksantana).</description>
    <link>https://dev.to/luksantana</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F957450%2F7d120583-dad0-4fdb-87c1-d644d30f1d27.jpg</url>
      <title>DEV Community: Lucas Santana</title>
      <link>https://dev.to/luksantana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luksantana"/>
    <language>en</language>
    <item>
      <title>How we gate AI agent behavior in CI, not just code</title>
      <dc:creator>Lucas Santana</dc:creator>
      <pubDate>Wed, 05 Aug 2026 13:47:48 +0000</pubDate>
      <link>https://dev.to/luksantana/how-we-gate-ai-agent-behavior-in-ci-not-just-code-ihe</link>
      <guid>https://dev.to/luksantana/how-we-gate-ai-agent-behavior-in-ci-not-just-code-ihe</guid>
      <description>&lt;p&gt;Most CI pipelines gate what code does. Nothing gates what an agent is allowed to do, or whether a config change silently made it worse at picking the right tool for a task. We built that gate for sharekit and it's simpler than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Agent config (skills, hooks, routing logic) changes constantly, and none of it is covered by a type checker or a unit test. A regex tweak in a routing hook can silently make the agent pick the wrong skill for a task, and the first sign of it is a user complaint weeks later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gate
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;evals/routing/README.md&lt;/code&gt; in sharekit runs 40 frozen routing-task files against a pinned OpenRouter model on every PR. Offline validation always runs (&lt;code&gt;--validate-only&lt;/code&gt;, no key needed); the full regression check runs when &lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt; is configured, and fails CI on &amp;gt;5pp accuracy drop against a fingerprinted baseline.&lt;/p&gt;

&lt;p&gt;Why 40 frozen tasks and not a live curriculum? Because the fixed-catalog approach is deliberate: reproducibility over recency. A frozen set means a regression is always a regression, not "the eval also changed."&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that isn't visible from the gate
&lt;/h2&gt;

&lt;p&gt;The gate's shape (small-n statistical gating, a fixed task catalog, a pinned baseline) isn't arbitrary. It's downstream of an actual embedding/RAG research program: bake-offs across e5/bge/jina embedding models with Matryoshka dimension-truncation trials, a distilled-reranker-vs-RRF ablation that measured RRF winning at the label scale this system runs at, and a deliberately reproduced circularity-trap failure (a ranker validating itself against its own outputs) characterized before guarding against it.&lt;/p&gt;

&lt;p&gt;None of that shows up in the README. Full writeup: &lt;code&gt;docs/ml-rigor.md&lt;/code&gt; in the repo, if you want the methodology instead of the summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ＠lucassantana/sharekit &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;your-repo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gate fires on the next PR that touches routing config. Repo: &lt;a href="https://github.com/LucasSantana-Dev/sharekit-profile" rel="noopener noreferrer"&gt;https://github.com/LucasSantana-Dev/sharekit-profile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
