<?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: Sergio Guadarrama</title>
    <description>The latest articles on DEV Community by Sergio Guadarrama (@sergegriimm).</description>
    <link>https://dev.to/sergegriimm</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%2F3793097%2Fd7e4ba0f-a148-484c-b1c3-df79b5512dda.png</url>
      <title>DEV Community: Sergio Guadarrama</title>
      <link>https://dev.to/sergegriimm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sergegriimm"/>
    <language>en</language>
    <item>
      <title>De Scripts CLI a un Orquestador "Agentic": Construyendo un Sistema Inmunológico para nuestro Codebase 🤖🛡️</title>
      <dc:creator>Sergio Guadarrama</dc:creator>
      <pubDate>Mon, 06 Apr 2026 16:17:38 +0000</pubDate>
      <link>https://dev.to/sergegriimm/de-scripts-cli-a-un-orquestador-agentic-construyendo-un-sistema-inmunologico-para-nuestro-4fbn</link>
      <guid>https://dev.to/sergegriimm/de-scripts-cli-a-un-orquestador-agentic-construyendo-un-sistema-inmunologico-para-nuestro-4fbn</guid>
      <description>&lt;p&gt;Todos amamos nuestro IDE vitaminado con IA (hola, Cursor / Copilot). Son asistentes geniales cuando estamos haciendo &lt;em&gt;pair-programming&lt;/em&gt;, pero son reactivos. Cuando cerramos la laptop, desaparecen. Y es justo ahí cuando la deuda técnica, el código espagueti y los imports huérfanos hacen fiesta.&lt;/p&gt;

&lt;p&gt;Hoy quiero compartirles un experimento arquitectónico en el que hemos estado trabajando. Lo que empezó como un montón de herramientas CLI aisladas para mi uso personal, evolucionó a un Orquestador de Agentes Autónomos que llamamos &lt;strong&gt;SKRYMIR&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%2Fds32q75do63x47hbyq9c.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%2Fds32q75do63x47hbyq9c.png" alt=" " width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;El problema de la IA Reactiva vs Proactiva&lt;/strong&gt; Las IAs tradicionales te ayudan a escribir nuevo código. Cerebro está diseñado como un &lt;strong&gt;SRE de código puro&lt;/strong&gt;: monitorea la salud del repositorio, detecta degradación en la complejidad ciclomática, e inyecta curas preventivas en la madrugada (lo que llamamos "Modo Nocturno").&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;La Anatomía de nuestro Pipeline: El "Tribunal Multi-Agente"&lt;/strong&gt; Actualmente nos encontramos realizando pruebas pesadas, afinando el flujo asíncrono y recolectando aprendizajes sobre cuánto nivel de autonomía puede manejar el sistema.&lt;/p&gt;

&lt;p&gt;El flujo que terminamos validando es un ciclo cerrado de CI/CD impulsado por agentes puros. Desde nuestro panel de control dicto un prompt general: "Integra la validación por horarios".&lt;/p&gt;

&lt;p&gt;Aquí va nuestro pipeline interno paso a paso:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La Codificación&lt;/strong&gt;: Se dispara Aider en una rama asolada (git checkout -b skrymir-feature/&lt;em&gt;). Analiza el repo y programa el requerimiento.&lt;br&gt;
**El Validation Gate&lt;/em&gt;&lt;em&gt;: El Executor toma el relevo. Antes de cualquier cosa, hace validaciones locales crudas (como npm run build o correr compiladores de Cargo si es Rust). Si la IA rompió la compilación, se rechaza la rama de inmediato.&lt;br&gt;
Smart Merge: Si todo es verde (Exit Code 0), Cerebro toma control, vuelve a main y realiza el auto-merge de la nueva feature de manera procedimental.&lt;br&gt;
**El Tribunal *&lt;/em&gt;(Aquí está la magia): Inmediatamente después del merge, se gatilla una validación en cadena donde 3 Agentes auditan exclusivamente el archivo editado:&lt;br&gt;
&lt;strong&gt;Sentinel&lt;/strong&gt;: Escanea código muerto e imports huérfanos estáticamente (vía su Core en Rust).&lt;br&gt;
&lt;strong&gt;Architect&lt;/strong&gt;: Evalúa que no se hayan violado contratos ni patrones de diseño globales.&lt;br&gt;
&lt;strong&gt;Warden&lt;/strong&gt;: Realiza pasadas preventivas de inyección y vulnerabilidades.&lt;br&gt;
💡 &lt;strong&gt;Siguientes Pasos y Aprendizajes&lt;/strong&gt; Nuestras validaciones de los últimos días nos enseñaron algo vital: la seguridad inicial. Para escalar esto y ganar la confianza de un equipo completo, estamos puliendo el "Modo Aprendiz", donde Cerebro simplemente emite Pull Requests con sugerencias de fixes en lugar de empujarlos en crudo a main, ganando la confianza del desarrollador gradualmente.&lt;/p&gt;

&lt;p&gt;Construir herramientas para construir herramientas es otro nivel de diversión. ¿Alguno de ustedes ha experimentado anidando flujos entre distintos agentes de IA locales? ¡Dejen sus aportes en los comentarios!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From 80% False Positives to 95% Accurate: How We Fixed Architecture Linting</title>
      <dc:creator>Sergio Guadarrama</dc:creator>
      <pubDate>Wed, 04 Mar 2026 15:39:28 +0000</pubDate>
      <link>https://dev.to/sergegriimm/from-80-false-positives-to-95-accurate-how-we-fixed-architecture-linting-4fg4</link>
      <guid>https://dev.to/sergegriimm/from-80-false-positives-to-95-accurate-how-we-fixed-architecture-linting-4fg4</guid>
      <description>&lt;h2&gt;
  
  
  The Starting Point
&lt;/h2&gt;

&lt;p&gt;Two months ago, we built Architect Linter to solve a real problem: &lt;strong&gt;teams'&lt;br&gt;
codebases fall apart as they grow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;v5 used simple pattern matching for security analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any function with "execute" in name → sink&lt;/li&gt;
&lt;li&gt;All parameters → potential sources&lt;/li&gt;
&lt;li&gt;Result: False positives everywhere
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Real code from a production NestJS app&lt;/span&gt;
&lt;span class="c1"&gt;// v5 would flag as CRITICAL VULNERABILITY&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;executeWithErrorHandling&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;executeWithErrorHandling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Do something safe with userInput&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM users WHERE name = ?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// v5: 🚨 CRITICAL: "executeWithErrorHandling is a sink"&lt;/span&gt;
&lt;span class="c1"&gt;//     🚨 CRITICAL: "executeWithErrorHandling receives user input"&lt;/span&gt;
&lt;span class="c1"&gt;// Reality: ✅ Code is 100% safe (parameterized query)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Developers ignored all findings. Security analysis became useless.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Rewrite: CFG-Based Analysis
&lt;/h2&gt;

&lt;p&gt;For v6, we completely rewrote the security engine using Control Flow Graphs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Parse code into a CFG&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;req.query.id (SOURCE)
    ↓
const id = ...
    ↓
escape(id)  (SANITIZER)
    ↓
db.query(id)  (SINK)
    ↓
Result: ✅ SAFE (data was sanitized)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Track actual data flow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which variables receive untrusted data?&lt;/li&gt;
&lt;li&gt;Where does that data go?&lt;/li&gt;
&lt;li&gt;Is it sanitized before reaching a sink?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Only report real issues&lt;/strong&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;// ✅ Safe: Data is parameterized&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM users WHERE id = ?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// ⚠️ Unsafe: Direct interpolation&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`SELECT * FROM users WHERE id = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Safe: Data is escaped&lt;/span&gt;
&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`SELECT * FROM users WHERE name = '&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;'`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Result: 95%+ Accuracy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;v5.0&lt;/th&gt;
&lt;th&gt;v6.0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;True Positives&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False Positives&lt;/td&gt;
&lt;td&gt;80%+&lt;/td&gt;
&lt;td&gt;&amp;lt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Trust&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;✅ High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise Ready&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Bonus: Zero-Config Setup
&lt;/h2&gt;

&lt;p&gt;While we were at it, we also fixed the friction of "I have to configure&lt;br&gt;
this for 30 minutes before I can use it":&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="nv"&gt;$ &lt;/span&gt;architect init
🔍 Detecting frameworks...
   ✓ NextJS &lt;span class="o"&gt;(&lt;/span&gt;from package.json&lt;span class="o"&gt;)&lt;/span&gt;
   ✓ Django &lt;span class="o"&gt;(&lt;/span&gt;from requirements.txt&lt;span class="o"&gt;)&lt;/span&gt;

✨ Generating config...
   Created: architect.json &lt;span class="o"&gt;(&lt;/span&gt;90% auto-complete&lt;span class="o"&gt;)&lt;/span&gt;

Ready to lint! Run: architect lint &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now supports many modern frameworks (TypeScript, Python, PHP).&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Teaches Us
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simple heuristics don't work for security&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Contains 'execute'" is a bad signal&lt;/li&gt;
&lt;li&gt;Need to understand actual control flow&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zero-config adoption beats "perfect but complex"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30-minute setup → Users abandon&lt;/li&gt;
&lt;li&gt;5-minute setup → Real usage&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Focus beats breadth&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supporting 11 languages poorly &amp;gt; supporting 3 languages well&lt;/li&gt;
&lt;li&gt;Dropped Go/Java, added Vue/Svelte (web-focused)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tests catch everything&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We rewrote the core logic (risky!)&lt;/li&gt;
&lt;li&gt;432+ tests meant we could refactor confidently&lt;/li&gt;
&lt;li&gt;Only broke 0 public APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;architect-linter-pro
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
architect init
architect lint &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/sergiogswv/architect-linter-pro" rel="noopener noreferrer"&gt;https://github.com/sergiogswv/architect-linter-pro&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Crates.io:&lt;/strong&gt; &lt;a href="https://crates.io/crates/architect-linter-pro" rel="noopener noreferrer"&gt;https://crates.io/crates/architect-linter-pro&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://github.com/.../docs/MIGRATION_v6.md" rel="noopener noreferrer"&gt;https://github.com/.../docs/MIGRATION_v6.md&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v6.1:&lt;/strong&gt; Variable tracking (catches injection in loops)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v7:&lt;/strong&gt; Pre-commit hooks + CI/CD templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v8:&lt;/strong&gt; VS Code extension (if there's interest)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Hit me in the comments.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>security</category>
      <category>linter</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The Missing Piece Between SonarQube and Code Review</title>
      <dc:creator>Sergio Guadarrama</dc:creator>
      <pubDate>Thu, 26 Feb 2026 00:55:16 +0000</pubDate>
      <link>https://dev.to/sergegriimm/the-missing-piece-between-sonarqube-and-code-review-16fg</link>
      <guid>https://dev.to/sergegriimm/the-missing-piece-between-sonarqube-and-code-review-16fg</guid>
      <description>&lt;p&gt;&lt;em&gt;Or: How we prevented architectural debt before it even happened&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SonarQube catches bugs &amp;amp; code smells&lt;/li&gt;
&lt;li&gt;Code review catches design decisions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing catches architectural violations&lt;/strong&gt; ← this gap exists&lt;/li&gt;
&lt;li&gt;architect-linter fills this gap&lt;/li&gt;
&lt;li&gt;Free, open source, multi-language&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Problem: The Architecture Gap
&lt;/h2&gt;

&lt;p&gt;Let me paint a picture you might recognize.&lt;/p&gt;

&lt;p&gt;You have a team of developers. Maybe 10, maybe 100. You've planned a beautiful architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────┐
│         Presentation Layer          │
│  (Components, Controllers, Pages)   │
└──────────────────┬──────────────────┘
                   │ (through services)
┌──────────────────▼──────────────────┐
│         Service Layer               │
│  (Business Logic, Domain Logic)     │
└──────────────────┬──────────────────┘
                   │ (through repositories)
┌──────────────────▼──────────────────┐
│         Data Access Layer           │
│  (Repositories, Queries, DB)        │
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beautiful. Clean. Maintainable.&lt;/p&gt;

&lt;p&gt;Then month 2 happens.&lt;/p&gt;

&lt;p&gt;A component directly imports from the database layer "just this once."&lt;br&gt;
A service calls another service that hasn't been created yet.&lt;br&gt;
A utility function imports from the presentation layer.&lt;/p&gt;

&lt;p&gt;Month 3? You don't have an architecture anymore. You have... spaghetti.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why This Happens
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SonarQube&lt;/strong&gt; catches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Code smells (naming, complexity, duplicates)&lt;/li&gt;
&lt;li&gt;✅ Bugs (null references, logic errors)&lt;/li&gt;
&lt;li&gt;✅ Security issues (SQL injection, XSS)&lt;/li&gt;
&lt;li&gt;❌ Architectural violations (layers crossed, bad imports)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Review&lt;/strong&gt; catches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Design decisions&lt;/li&gt;
&lt;li&gt;✅ Algorithm choice&lt;/li&gt;
&lt;li&gt;✅ Function complexity&lt;/li&gt;
&lt;li&gt;❌ Systematic architectural patterns (too slow to enforce manually)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Gap:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 imports per PR&lt;/li&gt;
&lt;li&gt;You check... maybe 5?&lt;/li&gt;
&lt;li&gt;95 could violate architecture&lt;/li&gt;
&lt;li&gt;Human reviewer can't check them all&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  The Solution: architect-linter
&lt;/h2&gt;

&lt;p&gt;Enter architect-linter. A linter specifically for architecture.&lt;/p&gt;

&lt;p&gt;Think ESLint (which catches code style), but for your system design.&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="nv"&gt;$ &lt;/span&gt;architect-linter-pro &lt;span class="nt"&gt;--check&lt;/span&gt;

❌ src/components/Button.tsx imports from src/api/user.ts
   Rule violation: Presentation layer cannot import from API layer
   Suggestion: Use src/services/UserService instead

❌ src/services/Auth.ts imports from src/components/LoginForm.tsx
   Rule violation: Service layer cannot import from Presentation layer

✅ Rest of architecture is clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define rules in architect.json:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;"architecture_pattern"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hexagonal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forbidden_imports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/presentation/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/infrastructure/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Presentation shouldn't depend on infrastructure details"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/application/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/infrastructure/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Application layer is infrastructure-agnostic"&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run in CI/CD:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/architecture.yml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check Architecture&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;architect --check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get violations before merge:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ PR blocked: Architecture violations detected
   - 2 violations found
   - Fix before merging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multi-Language Magic
&lt;/h3&gt;

&lt;p&gt;Unlike ESLint (JS only) or Pylint (Python only), architect-linter works across &lt;strong&gt;4 languages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript/JavaScript (ES6 imports)&lt;/li&gt;
&lt;li&gt;Python (import/from syntax)&lt;/li&gt;
&lt;li&gt;PHP (use statements)&lt;/li&gt;
&lt;li&gt;All in the same codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for monorepos with mixed stacks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frontend/          (TypeScript + React)
backend/           (Python + FastAPI)
services/          (PHP + Laravel)
                   ↓
architect-linter enforces SAME rules across all 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before architect-linter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ 40% of PRs rejected for architecture&lt;/li&gt;
&lt;li&gt;⚠️ Code review took 30 minutes per PR&lt;/li&gt;
&lt;li&gt;⚠️ Junior devs didn't understand implicit rules&lt;/li&gt;
&lt;li&gt;⚠️ Architecture debt accumulated slowly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After architect-linter (2 months):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ 5% of PRs rejected (mostly legitimate design changes)&lt;/li&gt;
&lt;li&gt;✅ Code review takes 5 minutes (humans focus on logic)&lt;/li&gt;
&lt;li&gt;✅ New devs self-correct with CI feedback&lt;/li&gt;
&lt;li&gt;✅ Zero new architectural violations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When to Use Each Tool
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Catch bugs&lt;/td&gt;
&lt;td&gt;SonarQube&lt;/td&gt;
&lt;td&gt;Finds logic errors, security issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review logic&lt;/td&gt;
&lt;td&gt;Code Review&lt;/td&gt;
&lt;td&gt;Humans are best here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enforce architecture&lt;/td&gt;
&lt;td&gt;architect-linter&lt;/td&gt;
&lt;td&gt;Automatic, systematic, consistent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All together&lt;/td&gt;
&lt;td&gt;All 3&lt;/td&gt;
&lt;td&gt;SonarQube + architect-linter in CI, code review for design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;architect-linter-pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initialize
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;architect-linter-pro &lt;span class="nt"&gt;--init&lt;/span&gt;
&lt;span class="c"&gt;# Interactive wizard creates architect.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;architect-linter-pro &lt;span class="nt"&gt;--check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CI/CD Integration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitHub Actions&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;architect-linter-pro --check&lt;/span&gt;

&lt;span class="c1"&gt;# GitLab CI&lt;/span&gt;
&lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;architect-linter-pro --check&lt;/span&gt;

&lt;span class="c1"&gt;# Pre-commit hook&lt;/span&gt;
&lt;span class="c1"&gt;# .pre-commit-config.yaml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/sergiogswv/architect-linter-pro&lt;/span&gt;
  &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v5.0.0&lt;/span&gt;
  &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;architect-linter-pro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Comparison: architect-linter vs Alternatives
&lt;/h2&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;architect-linter&lt;/th&gt;
&lt;th&gt;ESLint&lt;/th&gt;
&lt;th&gt;SonarQube&lt;/th&gt;
&lt;th&gt;Manual Review&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-language&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ JS only&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;Architecture rules&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;⚠️ Limited&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;✅ Rust, parallel&lt;/td&gt;
&lt;td&gt;✅ JS&lt;/td&gt;
&lt;td&gt;❌ Slow&lt;/td&gt;
&lt;td&gt;❌ Very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;✅ Open source&lt;/td&gt;
&lt;td&gt;✅ Open source&lt;/td&gt;
&lt;td&gt;❌ $10k+/year&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Easy setup&lt;/td&gt;
&lt;td&gt;✅ 5 min&lt;/td&gt;
&lt;td&gt;✅ 5 min&lt;/td&gt;
&lt;td&gt;❌ 2 hours&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation level&lt;/td&gt;
&lt;td&gt;✅ 100%&lt;/td&gt;
&lt;td&gt;✅ 100%&lt;/td&gt;
&lt;td&gt;✅ 90%&lt;/td&gt;
&lt;td&gt;❌ 0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Try It Now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;architect-linter-pro
architect-linter-pro &lt;span class="nt"&gt;--init&lt;/span&gt;
architect-linter-pro &lt;span class="nt"&gt;--check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Takes 5 minutes. Your architecture will thank you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Questions?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🐙 GitHub: &lt;a href="https://github.com/sergiogswv/architect-linter-pro" rel="noopener noreferrer"&gt;https://github.com/sergiogswv/architect-linter-pro&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 Docs: &lt;a href="https://architect-linter-pro.dev" rel="noopener noreferrer"&gt;https://architect-linter-pro.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎯 Crates.io: &lt;a href="https://crates.io/crates/architect-linter-pro" rel="noopener noreferrer"&gt;https://crates.io/crates/architect-linter-pro&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know what you think!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>codequality</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
