<?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: Anton Fedotov</title>
    <description>The latest articles on DEV Community by Anton Fedotov (@anviren).</description>
    <link>https://dev.to/anviren</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%2F3807721%2Ff8a186dc-afc0-476f-bf8e-b4cfd8939b94.jpg</url>
      <title>DEV Community: Anton Fedotov</title>
      <link>https://dev.to/anviren</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anviren"/>
    <language>en</language>
    <item>
      <title>We open-sourced Omega Walls: a stateful runtime defense for RAG and AI agents</title>
      <dc:creator>Anton Fedotov</dc:creator>
      <pubDate>Tue, 14 Apr 2026 13:48:14 +0000</pubDate>
      <link>https://dev.to/anviren/we-open-sourced-omega-walls-a-stateful-runtime-defense-for-rag-and-ai-agents-3o8a</link>
      <guid>https://dev.to/anviren/we-open-sourced-omega-walls-a-stateful-runtime-defense-for-rag-and-ai-agents-3o8a</guid>
      <description>&lt;p&gt;Most prompt-injection defenses still think in single turns.&lt;/p&gt;

&lt;p&gt;But many real agent failures do not happen in one prompt. They build across retrieved documents, memory carry-over, tool outputs, and later execution.&lt;/p&gt;

&lt;p&gt;That is the problem we built &lt;strong&gt;Omega Walls&lt;/strong&gt; for.&lt;/p&gt;

&lt;p&gt;Today we’re open-sourcing Omega Walls, a Python runtime defense layer for RAG and tool-using agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Omega Walls does
&lt;/h3&gt;

&lt;p&gt;Omega Walls sits at two important runtime points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Before final context assembly&lt;/strong&gt;&lt;br&gt;
Retrieved chunks, emails, tickets, attachments, and tool outputs can be inspected before they are allowed into model context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;At tool execution&lt;/strong&gt;&lt;br&gt;
Tool calls can be constrained or blocked when accumulated risk crosses the boundary.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of treating each chunk as an isolated moderation problem, Omega Walls turns untrusted content into &lt;strong&gt;session-level risk state&lt;/strong&gt; and emits deterministic runtime actions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;block&lt;/li&gt;
&lt;li&gt;freeze&lt;/li&gt;
&lt;li&gt;quarantine&lt;/li&gt;
&lt;li&gt;attribution / reason flags&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it is built for
&lt;/h3&gt;

&lt;p&gt;Omega Walls is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;indirect prompt injection&lt;/li&gt;
&lt;li&gt;distributed attacks across multiple chunks or turns&lt;/li&gt;
&lt;li&gt;cocktail attacks that combine takeover, exfiltration, tool abuse, and evasion&lt;/li&gt;
&lt;li&gt;multi-step flows where no single step looks obviously malicious in isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why we open-sourced it
&lt;/h3&gt;

&lt;p&gt;We think agent security needs more work on &lt;strong&gt;runtime trust boundaries&lt;/strong&gt;, not only better prompt scanning.&lt;/p&gt;

&lt;p&gt;If you are building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG pipelines&lt;/li&gt;
&lt;li&gt;internal copilots&lt;/li&gt;
&lt;li&gt;support or inbox agents&lt;/li&gt;
&lt;li&gt;tool-using workflows&lt;/li&gt;
&lt;li&gt;agent infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;we’d love your feedback.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/synqratech/omega-walls" rel="noopener noreferrer"&gt;https://github.com/synqratech/omega-walls&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://synqra.tech/omega-walls" rel="noopener noreferrer"&gt;https://synqra.tech/omega-walls&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PyPI: &lt;a href="https://pypi.org/project/omega-walls/" rel="noopener noreferrer"&gt;https://pypi.org/project/omega-walls/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you try it, tell us where it breaks, what attack patterns you think matter most, and where this layer should sit in a real stack.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>opensource</category>
      <category>rag</category>
      <category>security</category>
    </item>
    <item>
      <title>Why we didn’t use an LLM-first approach for architectural drift detection</title>
      <dc:creator>Anton Fedotov</dc:creator>
      <pubDate>Wed, 18 Mar 2026 08:44:29 +0000</pubDate>
      <link>https://dev.to/anviren/why-we-didnt-use-an-llm-first-approach-for-architectural-drift-detection-1ojc</link>
      <guid>https://dev.to/anviren/why-we-didnt-use-an-llm-first-approach-for-architectural-drift-detection-1ojc</guid>
      <description>&lt;h2&gt;
  
  
  Why we didn’t use an LLM-first approach for architectural drift detection
&lt;/h2&gt;

&lt;p&gt;LLMs are very good at a lot of things in software development.&lt;/p&gt;

&lt;p&gt;They can explain code, summarize pull requests, suggest fixes, and point out suspicious logic. For many review tasks, they are genuinely useful.&lt;/p&gt;

&lt;p&gt;But when we started working on architectural drift detection, we ran into a different kind of problem.&lt;/p&gt;

&lt;p&gt;Architectural drift is usually not a single “bad line of code”.&lt;br&gt;
It is a gradual shift in the shape of a codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;boundaries get blurred,&lt;/li&gt;
&lt;li&gt;hidden coupling appears,&lt;/li&gt;
&lt;li&gt;new state starts leaking into places that used to stay simple,&lt;/li&gt;
&lt;li&gt;control flow becomes more irregular,&lt;/li&gt;
&lt;li&gt;repo-specific patterns quietly erode over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that is where an LLM-first approach started to feel like the wrong primary layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core issue: architectural drift is not just code understanding
&lt;/h2&gt;

&lt;p&gt;A generic LLM can read code and reason about it.&lt;/p&gt;

&lt;p&gt;But architectural drift is not only about understanding what a piece of code does.&lt;br&gt;
It is about understanding whether a change is structurally abnormal &lt;strong&gt;for this repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;A pattern can be valid in isolation and still be a bad architectural move in a specific repo.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;introducing a new abstraction where the repo has stayed intentionally simple,&lt;/li&gt;
&lt;li&gt;adding hidden state into an area that has historically stayed stateless,&lt;/li&gt;
&lt;li&gt;crossing a module boundary that the team has treated as stable,&lt;/li&gt;
&lt;li&gt;making a PR that is locally reasonable but globally erosive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An LLM can often describe such code.&lt;br&gt;
But detecting that it is &lt;strong&gt;out of character for this codebase&lt;/strong&gt; is a different task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why LLM-first review was not enough for us
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The decision is often local, but the damage is global
&lt;/h3&gt;

&lt;p&gt;Large language models are very strong at local reasoning over the code they can see.&lt;/p&gt;

&lt;p&gt;But architecture is a global property.&lt;br&gt;
A pull request can look fine line by line while still moving the whole system in the wrong direction.&lt;/p&gt;

&lt;p&gt;That is why drift often survives normal review:&lt;br&gt;
tests pass, the code works, nothing looks obviously broken — but the shape of the system worsens.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Repo-specific baselines matter more than general code knowledge
&lt;/h3&gt;

&lt;p&gt;Most AI review tools are built around broad priors learned from many repositories.&lt;/p&gt;

&lt;p&gt;That is useful for generic review.&lt;br&gt;
It is less useful for questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Is this kind of abstraction typical here?”&lt;/li&gt;
&lt;li&gt;“Does this boundary crossing fit the historical structure of this repo?”&lt;/li&gt;
&lt;li&gt;“Is this new dependency normal for this subsystem?”&lt;/li&gt;
&lt;li&gt;“Is this complexity spike expected here or is it architectural drift?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not universal questions.&lt;br&gt;
They are baseline questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Drift detection needs stability, not just plausible reasoning
&lt;/h3&gt;

&lt;p&gt;For architecture work, noisy comments are deadly.&lt;/p&gt;

&lt;p&gt;If the system raises too many vague or unstable warnings, teams stop trusting it very quickly.&lt;/p&gt;

&lt;p&gt;We needed a layer that behaves more like structural instrumentation:&lt;br&gt;
repeatable, calibrated, and tied to measurable deviation — not just a smart narrative about code.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Explanation and detection are different jobs
&lt;/h3&gt;

&lt;p&gt;LLMs are often excellent at the second part:&lt;br&gt;
explaining why something may be risky.&lt;/p&gt;

&lt;p&gt;But the first part — consistently detecting structural deviation relative to a repo baseline — is a separate problem.&lt;/p&gt;

&lt;p&gt;We found it useful to separate those two jobs instead of forcing one model to do both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built instead
&lt;/h2&gt;

&lt;p&gt;We built a non-linguistic structural layer first.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;learn the repository’s structural baseline,&lt;/li&gt;
&lt;li&gt;compare each PR against that baseline,&lt;/li&gt;
&lt;li&gt;score the deviation,&lt;/li&gt;
&lt;li&gt;surface a short risk summary and a few hotspots directly in the PR.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In our case, this became &lt;a href="https://zenodo.org/records/17820299" rel="noopener noreferrer"&gt;PhaseBrain&lt;/a&gt; inside Revieko.&lt;/p&gt;

&lt;p&gt;The model is not trying to replace LLMs.&lt;br&gt;
It is trying to do something narrower and more structural:&lt;br&gt;
track roles, boundaries, deviations, and coherence in the evolution of a repo.&lt;/p&gt;

&lt;p&gt;That gives us a better primary signal for architectural drift.&lt;/p&gt;

&lt;p&gt;Then, if needed, language models can sit on top of that signal and help explain it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our view now
&lt;/h2&gt;

&lt;p&gt;For this problem, LLMs are useful — but not as the foundation.&lt;/p&gt;

&lt;p&gt;They are strong explainers.&lt;br&gt;
They are not the best primary detector of repo-specific architectural drift.&lt;/p&gt;

&lt;p&gt;Architectural drift is less about “what does this code mean?”&lt;br&gt;
and more about&lt;br&gt;
“what does this change do to the structure of this system over time?”&lt;/p&gt;

&lt;p&gt;That pushed us toward a structural model first, and a language layer second.&lt;/p&gt;

&lt;p&gt;That is the architecture we ended up building.&lt;/p&gt;

&lt;p&gt;If you work on long-lived repos, I’d be very interested in your view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have you seen PRs that looked reasonable locally but still degraded system structure?&lt;/li&gt;
&lt;li&gt;Do you think architectural drift is better modeled as a structural signal than as a pure language task?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Revieko:&lt;br&gt;
&lt;a href="https://synqra.tech/revieko" rel="noopener noreferrer"&gt;https://synqra.tech/revieko&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>automation</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
