<?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: Fenix</title>
    <description>The latest articles on DEV Community by Fenix (@magopredator).</description>
    <link>https://dev.to/magopredator</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%2F3981057%2Fe5877943-3569-4c4d-b7f1-7490f73e13b5.jpeg</url>
      <title>DEV Community: Fenix</title>
      <link>https://dev.to/magopredator</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/magopredator"/>
    <language>en</language>
    <item>
      <title>Open Source. Código Abierto.</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Thu, 23 Jul 2026 14:10:07 +0000</pubDate>
      <link>https://dev.to/magopredator/open-source-codigo-abierto-4jfe</link>
      <guid>https://dev.to/magopredator/open-source-codigo-abierto-4jfe</guid>
      <description>&lt;p&gt;La dependencia del sistema mundial actual del código abierto es prácticamente absoluta. No se trata de una alternativa opcional, sino del cimiento invisible sobre el que opera la economía global.&lt;/p&gt;

&lt;p&gt;Las Tasas de Dependencia Clave.&lt;/p&gt;

&lt;p&gt;La dependencia se mide a través de métricas extraídas de auditorías de ciberseguridad e investigaciones globales:&lt;/p&gt;

&lt;p&gt;96% de las bases de código comercial del mundo contienen componentes de código abierto. Esto abarca desde el software de tu banco hasta los sistemas de aviación y plataformas médicas.&lt;/p&gt;

&lt;p&gt;77% del volumen total de código en las aplicaciones modernas promedio está compuesto estrictamente por librerías open source. El software comercial actual es, en realidad, un cascarón propietario construido encima de un enorme bloque comunitario.&lt;/p&gt;

&lt;p&gt;70% a 90% de la infraestructura en la nube global (servidores de AWS, Google Cloud, Microsoft Azure) corre sobre Linux y herramientas de orquestación de código abierto, la espina dorsal de internet.&lt;/p&gt;

&lt;p&gt;El Valor Económico de esta Dependencia.&lt;/p&gt;

&lt;p&gt;Un estudio histórico de la Harvard Business School estimó el impacto financiero global si el código abierto dejara de existir repentinamente:&lt;/p&gt;

&lt;p&gt;$8.8 billones de dólares ($8.8 Trillion en inglés) es el valor de reemplazo de la demanda del open source. Si todas las empresas del planeta tuvieran que reescribir desde cero ese código comunitario para mantener sus negocios en marcha, el coste global ascendería a esa cifra.&lt;/p&gt;

&lt;p&gt;Las empresas tendrían que multiplicar por 3.5 veces su presupuesto de TI actual para sostener sus operaciones sin la existencia de este ecosistema gratuito.&lt;/p&gt;

&lt;p&gt;La Paradoja de la Fragilidad Mundial.&lt;/p&gt;

&lt;p&gt;El sistema es tan dependiente que la seguridad global descansa en muy pocas manos. El mismo estudio de Harvard descubrió que el 96% del valor económico total del código abierto es mantenido por apenas el 5% de los desarrolladores.&lt;/p&gt;

&lt;p&gt;Muchos de estos componentes críticos que sostienen la banca, las telecomunicaciones y la energía global dependen del mantenimiento voluntario de pequeños grupos de personas, lo que genera riesgos estructurales ante ataques de inyección de código o agotamiento informático.&lt;/p&gt;

&lt;p&gt;Teniendo en cuenta que el código abierto sostiene casi el 80% de las aplicaciones comerciales, ¿te interesa saber qué mecanismos de auditoría (como las regulaciones SBOM) están implementando los gobiernos para proteger esta infraestructura crítica? &lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/gL3xNr3-7zo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>software</category>
    </item>
    <item>
      <title>Archivos Predator. Anmistia Internacional.</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Thu, 23 Jul 2026 10:15:33 +0000</pubDate>
      <link>https://dev.to/magopredator/archivos-predator-anmistia-internacional-fg7</link>
      <guid>https://dev.to/magopredator/archivos-predator-anmistia-internacional-fg7</guid>
      <description>&lt;p&gt;Global: El escándalo de los ‘Archivos Predator’ revela ataques descarados con software espía contra la sociedad civil, figuras políticas y altos cargos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amnesty.org/es/latest/news/2023/10/global-predator-files-spyware-scandal-reveals-brazen-targeting-of-civil-society-politicians-and-officials/" rel="noopener noreferrer"&gt;https://www.amnesty.org/es/latest/news/2023/10/global-predator-files-spyware-scandal-reveals-brazen-targeting-of-civil-society-politicians-and-officials/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez más, tenemos pruebas de que se están usando potentes herramientas de vigilancia en ataques descarados. En esta ocasión, los objetivos son periodistas en el exilio, figuras públicas y funcionarios y funcionarias intergubernamentales. Pero no nos equivoquemos: las víctimas somos toda la población, nuestras sociedades, la buena gobernanza y los derechos humanos de todas las personas.&lt;br&gt;
Agnès Callamard, secretaria general de Amnistía Internacional.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fortalecimiento de Agentes de IA en Producción: Arquitectura de Defensa</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Wed, 22 Jul 2026 14:19:21 +0000</pubDate>
      <link>https://dev.to/magopredator/fortalecimiento-de-agentes-de-ia-en-produccion-arquitectura-de-defensa-3c4e</link>
      <guid>https://dev.to/magopredator/fortalecimiento-de-agentes-de-ia-en-produccion-arquitectura-de-defensa-3c4e</guid>
      <description>&lt;h1&gt;
  
  
  Fortalecimiento de Agentes de IA en Producción: Una Arquitectura Completa de Defensa en Profundidad para Implementaciones Corporativas y Científicas
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;El panorama actual del despliegue de IA en entornos corporativos y científicos es similar a navegar por un campo minado. Las empresas están desplegando cada vez más agentes de IA autónomos sin protecciones adecuadas en tiempo de ejecución, exponiéndose a una miríada de vulnerabilidades y fallos lógicos. Este artículo tiene como objetivo abordar estos problemas críticos al introducir un ecosistema completo de 46 repositorios de GitHub diseñados para fortalecer agentes de IA en entornos de producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  La Arquitectura de Tres Capas (Runtime &amp;amp; Orquestación)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hermes Crew Hybrid
&lt;/h3&gt;

&lt;p&gt;El repositorio &lt;code&gt;hermes-crew-hybrid&lt;/code&gt; propone un modelo soberano con micro-tripulaciones de CrewAI aisladas en contenedores Docker. Esta arquitectura asegura que cada agente de IA opere dentro de un entorno seguro y controlado, minimizando el riesgo de contaminación cruzada y acceso no autorizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent Shield Runtime
&lt;/h3&gt;

&lt;p&gt;El repositorio &lt;code&gt;agent-shield-runtime&lt;/code&gt; incluye cinco sensores esenciales:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;scope-lib&lt;/strong&gt;: Asegura que los agentes de IA operen dentro de su alcance definido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;adi-shield&lt;/strong&gt;: Proporciona una capa adicional de seguridad contra ataques adversarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wallet-guard&lt;/strong&gt;: Protege contra vulnerabilidades financieras como ataques de Denegación de Wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;goal-anchor&lt;/strong&gt;: Asegura que los agentes de IA permanezcan alineados con sus objetivos previstos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;trajectory-sentinel&lt;/strong&gt;: Monitorea la trayectoria de los agentes de IA para detectar y prevenir cualquier desviación de su camino previsto.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Fortalecimiento y Validación en Ciencias Duras e Industria Crítica
&lt;/h2&gt;

&lt;p&gt;Nuestra suite no es solo software común; incluye capas de validación científica ultra-estrictas y soluciones CPU-only para bioinformática, ciencia de materiales y astronomía. Herramientas clave incluyen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;astrocp&lt;/strong&gt;: Para el procesamiento de datos astronómicos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ssb-validate&lt;/strong&gt;: Para la validación de enlaces de hebra única.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;qchem-leak-screen&lt;/strong&gt;: Para la detección de fugas en química cuántica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rnvalidate&lt;/strong&gt;: Para la validación de ARN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cryoval&lt;/strong&gt;: Para la validación criogénica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EnzyOrchestra&lt;/strong&gt;: Para la orquestación enzimática.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dock-confidence&lt;/strong&gt;: Para la validación de confianza en el acoplamiento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Auditoría, Privacidad y Proxies (MCP &amp;amp; PII)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  MCP Core Defense
&lt;/h3&gt;

&lt;p&gt;El repositorio &lt;code&gt;mcp-core-defense&lt;/code&gt; ofrece un proxy de siete fases contra el envenenamiento de herramientas, asegurando que todas las herramientas utilizadas por los agentes de IA sean seguras y estén libres de código malicioso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Corpus Scrub
&lt;/h3&gt;

&lt;p&gt;El repositorio &lt;code&gt;corpus-scrub&lt;/code&gt; proporciona la redacción local de Información de Identificación Personal (PII), asegurando que todos los datos sensibles sean manejados y protegidos de manera segura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelo de Licencia Comercial y Consultoría a Medida
&lt;/h2&gt;

&lt;p&gt;Todo el ecosistema está disponible bajo la estricta licencia de código abierto AGPL-3.0, que protege el software y asegura su integridad. Para empresas que requieren:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Licencias comerciales privadas para cerrar el código e integrarlo sin restricciones de copyleft.&lt;/li&gt;
&lt;li&gt;Consultoría experta y servicios de fortalecimiento para arquitecturas Docker y diseño de gateways seguros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por favor, contáctenos directamente a través de correo &lt;a href="mailto:amurlaniakea@gmail.com"&gt;amurlaniakea@gmail.com&lt;/a&gt; para consultas comerciales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/amurlaniakea" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En conclusión, nuestro ecosistema de 46 repositorios de amurlaniakea en GitHub ofrece una solución completa para el fortalecimiento de agentes de IA en entornos de producción. Al aprovechar nuestras herramientas y arquitecturas avanzadas, las empresas pueden asegurar la seguridad, integridad y confiabilidad de sus implementaciones de IA.&lt;/p&gt;

&lt;p&gt;P.D. Y lo voy a dejar aqui porque son tantisimos los agujeros de seguridad que generan los agentes IA y las tecnologias IAs que sencillamente no es solo una persona o un canal de github quien lo va a solucionar, ni con un manojo de repos. Es una labor colectiva del open source y de empresas, desarrolladores, programadoras y todo el sector de investigacion, innovacion y desarrollo y heuristica quien podria solucionarlo. Gracias. Aloha. Atte. MagoPredator. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>agent-shield-runtime v0.1.0: hook de despliegue que conecta 5 sensores de defensa de agentes IA</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Mon, 20 Jul 2026 09:22:55 +0000</pubDate>
      <link>https://dev.to/magopredator/agent-shield-runtime-v010-hook-de-despliegue-que-conecta-5-sensores-de-defensa-de-agentes-ia-4bg3</link>
      <guid>https://dev.to/magopredator/agent-shield-runtime-v010-hook-de-despliegue-que-conecta-5-sensores-de-defensa-de-agentes-ia-4bg3</guid>
      <description>&lt;h1&gt;
  
  
  agent-shield-runtime v0.1.0: hook de despliegue que conecta 5 sensores de defensa de agentes IA
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Los sensores de defensa de un agente no sirven si nada los invoca. Este repo intercepta cada tool-call y lo evalúa contra 5 sensores antes de ejecutarlo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;En el ecosistema de defensa de agentes IA (scope-lib, adi-shield, wallet-guard, goal-anchor, trajectory-sentinel) los 5 sensores están implementados y auditados. Pero son librerías: nadie los invoca en un agente real. Con los paquetes instalados y sin un hook, el agente ejecuta sus tool-calls directos y los sensores se quedan en disco. La detección que demostramos en tests unitarios no ocurre en producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solución
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;agent-shield-runtime&lt;/code&gt; es el sexto repositorio: un hook de despliegue que intercepta &lt;strong&gt;cada tool-call&lt;/strong&gt; del agente y lo despacha a los 5 sensores en orden, antes de ejecutarlo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;scope-lib&lt;/code&gt; — evaluación de alcance (3 criterios, fail-safe).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;adi-shield&lt;/code&gt; — detección de inyección de prompt (ADI) en 5 vectores.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wallet-guard&lt;/code&gt; — guardrails de bucle y presupuesto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;goal-anchor&lt;/code&gt; — integridad de objetivo (deriva brusca).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trajectory-sentinel&lt;/code&gt; — correlación agregada de señales vía bus compartido.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si cualquier sensor dice &lt;code&gt;block&lt;/code&gt;, la acción NO se ejecuta. Si hay &lt;code&gt;confirm&lt;/code&gt;, se pausa a humano. Solo si todos dicen &lt;code&gt;allow&lt;/code&gt; se ejecuta el tool nativo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&gt;

&lt;p&gt;El runtime envuelve el executor del agente. El núcleo solo conoce &lt;code&gt;GenericToolCall&lt;/code&gt;; los adaptadores de framework (LangChain, AutoGen, loop propio) traducen el tool-call nativo a ese formato y viven aislados. Así el runtime es reutilizable sin acoplarse a ningún agente concreto, y los 5 sensores no cambian: este repo solo orquesta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados verificados
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;5 tests de integración end-to-end (&lt;code&gt;tests/test_integration_e2e.py&lt;/code&gt;) contra los 5 sensores REALES instalados (sin mocks de sensor): AC1 (deny bloquea y no ejecuta), AC2 (inyección ADI bloquea), AC3 (deriva brusca confirma), AC5 (integración sin modificar los sensores).&lt;/li&gt;
&lt;li&gt;CI verde en GitHub Actions (ruff + pytest + bandit + gitleaks) en entorno limpio.&lt;/li&gt;
&lt;li&gt;Licencia AGPL-3.0-or-later (texto oficial FSF verbatim).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que queda abierto (honestamente)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WebTrap sutil no se cierra.&lt;/strong&gt; El hook extiende la &lt;em&gt;cobertura de despliegue&lt;/em&gt;, no la de detección. Los vectores de deriva sutil que preservan apariencia de alcance (T1/T2/T4) siguen sin detectarse en la Capa 1 de goal-anchor (benchmark corregido: TPR=0.25 real, FPR=0.0). Cerrarlos requiere semántica real, descartada por peso en esta fase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptador de framework real pendiente.&lt;/strong&gt; Hoy solo el adaptador genérico; el cableado al executor nativo de LangChain/AutoGen es el siguiente hito (H3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditoría independiente en curso.&lt;/strong&gt; El repo se hizo público para que un auditor externo lo clone y verifique en fresco.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/amurlaniakea/agent-shield-runtime.git
&lt;span class="nb"&gt;cd &lt;/span&gt;agent-shield-runtime
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
pytest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Rol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ShieldRuntime&lt;/td&gt;
&lt;td&gt;intercepta y decide block/confirm/allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GenericToolCall&lt;/td&gt;
&lt;td&gt;formato interno neutro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LocalSignalBus&lt;/td&gt;
&lt;td&gt;bus compartido de señales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;los 5 sensores&lt;/td&gt;
&lt;td&gt;evaluación por especialidad&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/agent-shield-runtime" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/agent-shield-runtime&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sensores: &lt;a href="https://github.com/amurlaniakea/scope-lib" rel="noopener noreferrer"&gt;scope-lib&lt;/a&gt;, &lt;a href="https://github.com/amurlaniakea/adi-shield" rel="noopener noreferrer"&gt;adi-shield&lt;/a&gt;, &lt;a href="https://github.com/amurlaniakea/wallet-guard" rel="noopener noreferrer"&gt;wallet-guard&lt;/a&gt;, &lt;a href="https://github.com/amurlaniakea/goal-anchor" rel="noopener noreferrer"&gt;goal-anchor&lt;/a&gt;, &lt;a href="https://github.com/amurlaniakea/trajectory-sentinel" rel="noopener noreferrer"&gt;trajectory-sentinel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later · Autor: Pedro Sordo Martínez&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>trajectory-sentinel v0.1.0: correlación de señales de defensa de agentes</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:53:19 +0000</pubDate>
      <link>https://dev.to/magopredator/trajectory-sentinel-v010-correlacion-de-senales-de-defensa-de-agentes-4jmh</link>
      <guid>https://dev.to/magopredator/trajectory-sentinel-v010-correlacion-de-senales-de-defensa-de-agentes-4jmh</guid>
      <description>&lt;h1&gt;
  
  
  trajectory-sentinel v0.1.0: correlación de señales de defensa de agentes
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Monitor que junta las señales de &lt;code&gt;adi-shield&lt;/code&gt;, &lt;code&gt;wallet-guard&lt;/code&gt; y&lt;br&gt;
&lt;code&gt;goal-anchor&lt;/code&gt; y detecta ataques que un solo sensor no ve.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Cada sensor ve una parte. Un atacante puede pasar por uno que dice "allow" si&lt;br&gt;
otro ve deriva. Hace falta una capa que correlacione las señales y decida por&lt;br&gt;
la trayectoria completa, no por cada tool-call aislado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;trajectory-sentinel&lt;/code&gt; expone &lt;code&gt;TrajectorySentinel&lt;/code&gt; y &lt;code&gt;correlate()&lt;/code&gt;. Reglas&lt;br&gt;
deterministas (0-LLM):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;block&lt;/code&gt;/&lt;code&gt;kill&lt;/code&gt; de cualquier sensor corta.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;goal-anchor&lt;/code&gt; ve deriva mientras los demás dicen &lt;code&gt;allow&lt;/code&gt; → confirma riesgo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;goal-anchor&lt;/code&gt; emite &lt;code&gt;drift_retract&lt;/code&gt; (ampliación humana tardía) → revisa el
veredicto a &lt;code&gt;allow&lt;/code&gt;, sin congelarse ni ocultar la alerta previa.&lt;/li&gt;
&lt;li&gt;≥2 sensores en &lt;code&gt;confirm&lt;/code&gt; → confirm agregado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&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;trajectory_sentinel.monitor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TrajectorySentinel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;adi_shield.bus&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LocalSignalBus&lt;/span&gt;
&lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalSignalBus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;sentinel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TrajectorySentinel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# Signal de cualquier sensor
&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sentinel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correlated&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;verdict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El bus real (&lt;code&gt;LocalSignalBus&lt;/code&gt;) se usa en los tests E2E; la integración con&lt;br&gt;
&lt;code&gt;goal-anchor&lt;/code&gt; está verificada de punta a punta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados de la auditoría
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;13 tests en &lt;code&gt;trajectory-sentinel&lt;/code&gt;, todos verdes; &lt;code&gt;ruff&lt;/code&gt; limpio.&lt;/li&gt;
&lt;li&gt;Auditado en clone fresco (rama &lt;code&gt;main&lt;/code&gt;, commit &lt;code&gt;35c02e2&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitaciones (honestamente)
&lt;/h2&gt;

&lt;p&gt;La retractación es &lt;strong&gt;por tarea completa&lt;/strong&gt;, no por sub-objetivo: si dos&lt;br&gt;
sub-objetivos derivan y solo uno se retracta, la tarea baja a &lt;code&gt;allow&lt;/code&gt; entera.&lt;br&gt;
Está documentado en el README. El sistema no está desplegado como middleware de&lt;br&gt;
un agente real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; main https://github.com/amurlaniakea/trajectory-sentinel.git
&lt;span class="nb"&gt;cd &lt;/span&gt;trajectory-sentinel &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; ../adi-shield &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; ../goal-anchor
pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/trajectory-sentinel" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/trajectory-sentinel&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>goal-anchor v0.1.0: integridad de objetivo para agentes multi-paso</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:53:16 +0000</pubDate>
      <link>https://dev.to/magopredator/goal-anchor-v010-integridad-de-objetivo-para-agentes-multi-paso-1cic</link>
      <guid>https://dev.to/magopredator/goal-anchor-v010-integridad-de-objetivo-para-agentes-multi-paso-1cic</guid>
      <description>&lt;h1&gt;
  
  
  goal-anchor v0.1.0: integridad de objetivo para agentes multi-paso
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Sensor contra Agent Goal Hijack: detecta desviación del objetivo acordado,&lt;br&gt;
con ancla confirmada por humano y ampliación autorizada en medio del paso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;En tareas largas, un atacante puede redirigir al agente hacia un objetivo&lt;br&gt;
distinto manteniendo apariencia de éxito (WebTrap). Hace falta una referencia&lt;br&gt;
de objetivo que el humano confirma y que el agente no puede reescribir solo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;goal-anchor&lt;/code&gt; expone &lt;code&gt;GoalAnchor&lt;/code&gt;, &lt;code&gt;AnchorProposal&lt;/code&gt; y &lt;code&gt;DriftMonitor&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capa 1 (estructural, 0-LLM):&lt;/strong&gt; señal acumulada de hitos reclamados fuera
del ancla. Detecta deriva &lt;strong&gt;brusca&lt;/strong&gt; (caso T3 del corpus).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capa 2 (semántica):&lt;/strong&gt; interfaz pluggable de embedder. El stub por defecto
&lt;strong&gt;no es operacional&lt;/strong&gt; a propósito — documentado como gap conocido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;confirm_amplification():&lt;/strong&gt; ampliación tardía validada (el ancla debe estar
confirmada primero) que retrata cicatrices sin borrar el rastro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&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;goal_anchor.anchor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GoalAnchor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AnchorProposal&lt;/span&gt;
&lt;span class="n"&gt;ga&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GoalAnchor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;human_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;propose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AnchorProposal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&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;precios de vuelos a Madrid&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research_prices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="n"&gt;ga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                      &lt;span class="c1"&gt;# ancla fijada por humano
&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;report_drift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&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;iii_transitive&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;otra_cosa&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;soft_score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# 0.0..1.0, determinista
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resultados de la auditoría
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;18 tests en &lt;code&gt;goal-anchor&lt;/code&gt;, todos verdes; &lt;code&gt;ruff&lt;/code&gt; limpio.&lt;/li&gt;
&lt;li&gt;Auditado en clone fresco (rama &lt;code&gt;main&lt;/code&gt;, commit &lt;code&gt;7b10ce2&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitaciones (honestamente)
&lt;/h2&gt;

&lt;p&gt;La Capa 2 no cierra el vector WebTrap &lt;strong&gt;sutil&lt;/strong&gt; (T1/T2/T4): redirecciones con&lt;br&gt;
texto lexicalmente ortogonal al ancla. Lo verifiqué contra el corpus — ninguna&lt;br&gt;
técnica léxica sin modelo (n-gramas, TF-IDF, edición) da señal sobre 0.00 ahí.&lt;br&gt;
Quedó como gap documentado, no maquillado. El hook de ejecución real no está&lt;br&gt;
desplegado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; main https://github.com/amurlaniakea/goal-anchor.git
&lt;span class="nb"&gt;cd &lt;/span&gt;goal-anchor &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/goal-anchor" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/goal-anchor&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>wallet-guard v0.1.0: guardrails de bucle y presupuesto para agentes</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:53:13 +0000</pubDate>
      <link>https://dev.to/magopredator/wallet-guard-v010-guardrails-de-bucle-y-presupuesto-para-agentes-3p0h</link>
      <guid>https://dev.to/magopredator/wallet-guard-v010-guardrails-de-bucle-y-presupuesto-para-agentes-3p0h</guid>
      <description>&lt;h1&gt;
  
  
  wallet-guard v0.1.0: guardrails de bucle y presupuesto para agentes
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Sensor que corta bucles de reintento sin progreso y fuerza límites de&lt;br&gt;
gasto, sin bloquear permanentemente por una confirmación legítima.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Un agente puede quedarse en un bucle de reintentos que nunca avanza, o gastar&lt;br&gt;
más de lo autorizado. El riesgo opuesto es el bloqueo permanente: si una simple&lt;br&gt;
petición de confirmación del usuario se trata como error, el agente se para&lt;br&gt;
para siempre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;wallet-guard&lt;/code&gt; expone &lt;code&gt;LoopGuard&lt;/code&gt; y un presupuesto. Dos comportamientos&lt;br&gt;
verificados por tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corte de bucle:&lt;/strong&gt; si N reintentos no producen progreso medible, detiene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presupuesto:&lt;/strong&gt; respeta un límite de gasto/configuración.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No bloqueo por confirmación:&lt;/strong&gt; una petición de confirmación del usuario no
cuenta como fallo irreversible (bug encontrado y corregido en auditoría).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&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;wallet_guard.guard&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LoopGuard&lt;/span&gt;
&lt;span class="n"&gt;guard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoopGuard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;progress_fn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# registra intento
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;should_stop&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucle sin progreso: cortado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resultados de la auditoría
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;8 tests en &lt;code&gt;wallet-guard&lt;/code&gt;, todos verdes; &lt;code&gt;ruff&lt;/code&gt; limpio.&lt;/li&gt;
&lt;li&gt;Auditado en clone fresco (rama &lt;code&gt;main&lt;/code&gt;, commit &lt;code&gt;372b2a9&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitaciones (honestamente)
&lt;/h2&gt;

&lt;p&gt;El progreso se mide con un predicado que el integrador debe definir; el paquete&lt;br&gt;
no infiere "progreso" por sí solo. No está enganchado aún como middleware de un&lt;br&gt;
agente en producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; main https://github.com/amurlaniakea/wallet-guard.git
&lt;span class="nb"&gt;cd &lt;/span&gt;wallet-guard &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/wallet-guard" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/wallet-guard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>adi-shield v0.1.0: detección de inyección de prompt en 5 vectores</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:53:10 +0000</pubDate>
      <link>https://dev.to/magopredator/adi-shield-v010-deteccion-de-inyeccion-de-prompt-en-5-vectores-2fh4</link>
      <guid>https://dev.to/magopredator/adi-shield-v010-deteccion-de-inyeccion-de-prompt-en-5-vectores-2fh4</guid>
      <description>&lt;h1&gt;
  
  
  adi-shield v0.1.0: detección de inyección de prompt en 5 vectores
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Sensor de defensa que marca datos no confiables y detecta instrucciones&lt;br&gt;
inyectadas antes de que el agente las ejecute, sin depender del modelo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;La inyección de prompt (CWE-1427) es el vector principal contra agentes:&lt;br&gt;
instrucciones embebidas en un email, una página web, un ticket o un repo que&lt;br&gt;
el agente trata como mandato propio. Detectarlo requiere marcar el origen de&lt;br&gt;
cada dato, no pedirle al LLM que se autodefenda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;adi-shield&lt;/code&gt; expone &lt;code&gt;InjectionShield&lt;/code&gt; y &lt;code&gt;evaluate()&lt;/code&gt;. Cubre cinco vectores&lt;br&gt;
motivados por el paper que origina el proyecto:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vector&lt;/th&gt;
&lt;th&gt;Origen del dato&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;mensaje entrante&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;web&lt;/td&gt;
&lt;td&gt;contenido scrapeado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ticket&lt;/td&gt;
&lt;td&gt;issue/tarea externa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;repo&lt;/td&gt;
&lt;td&gt;código de terceros&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;calendar&lt;/td&gt;
&lt;td&gt;invitación de agenda&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cuando el dato viene marcado como &lt;strong&gt;no confiable&lt;/strong&gt; y contiene instrucciones de&lt;br&gt;
acción, &lt;code&gt;evaluate&lt;/code&gt; devuelve un veredicto de inyección. Distingue eso de un&lt;br&gt;
reenvío legítimo ya autorizado por el usuario.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&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;adi_shield.shield&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InjectionShield&lt;/span&gt;
&lt;span class="n"&gt;shield&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InjectionShield&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;verdict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shield&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;haz esto ahora&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;web&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;trusted&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;injection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# True/False, determinista
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El bus de señales (&lt;code&gt;adi_shield.bus.Signal&lt;/code&gt;) es la interfaz que &lt;code&gt;trajectory-sentinel&lt;/code&gt;&lt;br&gt;
consume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados de la auditoría
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;10 tests en &lt;code&gt;adi-shield&lt;/code&gt;, todos verdes; &lt;code&gt;ruff&lt;/code&gt; limpio.&lt;/li&gt;
&lt;li&gt;Auditado en clone fresco (rama &lt;code&gt;main&lt;/code&gt;, commit &lt;code&gt;c125db4&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitaciones (honestamente)
&lt;/h2&gt;

&lt;p&gt;Es detección de &lt;em&gt;instrucciones embebidas en datos marcados&lt;/em&gt;, no un clasificador&lt;br&gt;
semántico profundo. El hook real delante de un agente (llamar &lt;code&gt;evaluate()&lt;/code&gt;&lt;br&gt;
antes de cada tool-call) no está desplegado todavía; las pruebas usan fixtures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; main https://github.com/amurlaniakea/adi-shield.git
&lt;span class="nb"&gt;cd &lt;/span&gt;adi-shield &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/adi-shield" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/adi-shield&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>scope-lib v0.1.0: evaluación de alcance para agentes de IA en 3 criterios</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Sun, 19 Jul 2026 20:53:07 +0000</pubDate>
      <link>https://dev.to/magopredator/scope-lib-v010-evaluacion-de-alcance-para-agentes-de-ia-en-3-criterios-1edb</link>
      <guid>https://dev.to/magopredator/scope-lib-v010-evaluacion-de-alcance-para-agentes-de-ia-en-3-criterios-1edb</guid>
      <description>&lt;h1&gt;
  
  
  scope-lib v0.1.0: evaluación de alcance para agentes de IA en 3 criterios
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Capa base de un sistema de defensa para agentes LLM. Decide si una acción&lt;br&gt;
está dentro del alcance autorizado antes de ejecutarla, con fail-safe&lt;br&gt;
determinista.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Un agente autónomo recibe una tarea y ejecuta tool-calls. Sin una frontera de&lt;br&gt;
alcance, cualquier dato no confiable (un email, una web) puede desviarlo hacia&lt;br&gt;
acciones fuera de lo acordado. Hace falta un punto de decisión explícito y&lt;br&gt;
revisable, no enterrado en el prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;scope-lib&lt;/code&gt; expone &lt;code&gt;PolicyStore&lt;/code&gt; y &lt;code&gt;load_policy_store&lt;/code&gt;, y evalúa cada acción&lt;br&gt;
contra tres criterios (&lt;code&gt;ScopeVerdict.criterion&lt;/code&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;i_subobjective&lt;/strong&gt; — la acción sirve a un sub-objetivo del ancla.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ii_resource&lt;/strong&gt; — usa recursos declarados (no laterales).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iii_transitive&lt;/strong&gt; — el apoyo entre sub-objetivos es transitivo y acotado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El fallo por defecto es &lt;strong&gt;deny&lt;/strong&gt;: si no hay ancla confirmada, nunca se permite.&lt;br&gt;
Eso es el fail-safe "sin ancla = nunca allow".&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&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;scope_lib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_policy_store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ScopeVerdict&lt;/span&gt;
&lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_policy_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;policy.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ScopeVerdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;verdict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criterion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;i_subobjective&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;claimed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;research_prices&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# True/False, determinista
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El store se versiona y persiste; &lt;code&gt;goal-anchor&lt;/code&gt; y &lt;code&gt;adi-shield&lt;/code&gt; lo reutilizan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados de la auditoría
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;10 tests en &lt;code&gt;scope-lib&lt;/code&gt;, todos verdes; &lt;code&gt;ruff&lt;/code&gt; limpio.&lt;/li&gt;
&lt;li&gt;Auditado de forma independiente en clone fresco público (rama &lt;code&gt;main&lt;/code&gt;,
commit &lt;code&gt;83b626f&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitaciones (honestamente)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;scope-lib&lt;/code&gt; es la capa de decisión, no el runtime que la invoca. Nadie ha&lt;br&gt;
enganchado todavía este paquete como middleware delante de un agente real;&lt;br&gt;
las pruebas son contra fixtures sintéticos, no tráfico de producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; main https://github.com/amurlaniakea/scope-lib.git
&lt;span class="nb"&gt;cd &lt;/span&gt;scope-lib &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
pytest tests/ &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/scope-lib" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/scope-lib&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>variant-confidence v0.1.0: a calibrated confidence layer for variant-effect pathogenicity scores</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Sat, 18 Jul 2026 03:30:30 +0000</pubDate>
      <link>https://dev.to/magopredator/variant-confidence-v010-a-calibrated-confidence-layer-for-variant-effect-pathogenicity-scores-30e2</link>
      <guid>https://dev.to/magopredator/variant-confidence-v010-a-calibrated-confidence-layer-for-variant-effect-pathogenicity-scores-30e2</guid>
      <description>&lt;h1&gt;
  
  
  variant-confidence v0.1.0: a calibrated confidence layer for variant-effect pathogenicity scores
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;State-of-the-art variant-effect models are accurate in cross-validation but their scores are poorly calibrated on temporal data. variant-confidence adds an auditable calibration layer on top of existing predictors — it does not train a new model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem: accuracy is not trust
&lt;/h2&gt;

&lt;p&gt;Protein variant-effect predictors (AlphaMissense, ESM-1v, EVE) report pathogenicity scores, but a clinician or researcher needs to know &lt;em&gt;how much to trust the number&lt;/em&gt;, not just its rank. The gap is calibration, not accuracy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AnnotateMissense (2026) reports MCC 0.94 in cross-validation, dropping to 0.76 on temporal ClinVar, accuracy 0.8798.&lt;/li&gt;
&lt;li&gt;A raw score near 0.9 may not mean 90% probability. Acting on an uncalibrated score is a risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;variant-confidence wraps an existing predictor's score and produces a calibrated, uncertainty-aware output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Probability calibration (AC1):&lt;/strong&gt; Platt scaling or isotonic regression over a separate holdout. Selectable, not hardcoded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conformal prediction (AC1b):&lt;/strong&gt; coverage &lt;code&gt;1−α&lt;/code&gt; intervals, split or Mondrian by gene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECE (AC2, AC9):&lt;/strong&gt; Expected Calibration Error reported before/after calibration, with bootstrap CI and per-bin counts. Bins with too few samples are flagged as low-reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leakage-free split (AC3):&lt;/strong&gt; temporal split by ClinVar release date with gene isolation — the same gene never appears in both train and test. This is unit-tested.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing-score handling (AC4):&lt;/strong&gt; works with AlphaMissense or ESM-1v alone; emits an explicit warning instead of failing silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-deceptive reporting (AC7):&lt;/strong&gt; every result includes interval/ECE + method + threshold, never a bare calibrated score.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verification (clean clone, no network)
&lt;/h2&gt;

&lt;p&gt;Built under a three-party governance loop: implement → independent audit in a clean clone → merge approval.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ruff check .&lt;/code&gt; → All checks passed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pytest tests/&lt;/code&gt; → 28 passed in 8.90s (offline fixture).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  An honest bug we caught in audit
&lt;/h2&gt;

&lt;p&gt;The first ECE test reported a "perfect" drop from raw ECE 0.4275 to ~0 after calibration. The audit found this was &lt;strong&gt;degenerate&lt;/strong&gt;: the synthetic score generator ignored the real labels and produced an independent random &lt;code&gt;true_p&lt;/code&gt;, so the calibrator simply collapsed to the base rate (91.5% pathogenic) — ECE≈0 by construction, not by merit. AUC of the raw score vs real labels was 0.51.&lt;/p&gt;

&lt;p&gt;The fix derives &lt;code&gt;true_p&lt;/code&gt; from the real label with noise, so the synthetic score is genuinely discriminative but miscalibrated. The acceptance criterion is now: ECE drops &lt;strong&gt;and&lt;/strong&gt; AUC is preserved after calibration. This is in the committed code and the 28 passing tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What remains open (honestly)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AlphaMissense license ambiguity:&lt;/strong&gt; the official README says CC BY 4.0, but the distributed TSV header, Ensembl VEP plugin, and EBI page state CC BY-NC-SA 4.0. The contradiction is unresolved; treat the data as restricted (non-commercial) until clarified. The software is AGPL-3.0-or-later and fully self-contained.&lt;/li&gt;
&lt;li&gt;The end-to-end join with real AlphaMissense scores is implemented, but the flagship path is covered by an offline fixture, not a live download in CI.&lt;/li&gt;
&lt;/ul&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;pip &lt;span class="nb"&gt;install &lt;/span&gt;variant-confidence
variant-confidence &lt;span class="nt"&gt;--method&lt;/span&gt; platt &lt;span class="nt"&gt;--offline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python &amp;gt;=3.10, numpy, pandas, scikit-learn&lt;/li&gt;
&lt;li&gt;AGPL-3.0-or-later&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/variant-confidence" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/variant-confidence&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release v0.1.0:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/variant-confidence/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/variant-confidence/releases/tag/v0.1.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;License: AGPL-3.0-or-later — Pedro Sordo Martínez (&lt;a href="mailto:amurlaniakea@gmail.com"&gt;amurlaniakea@gmail.com&lt;/a&gt;), 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>bioinformatics</category>
      <category>showdev</category>
    </item>
    <item>
      <title>astrocp: Conformal Prediction con cobertura condicional por clase para astronomía</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Fri, 17 Jul 2026 21:02:54 +0000</pubDate>
      <link>https://dev.to/magopredator/astrocp-conformal-prediction-con-cobertura-condicional-por-clase-para-astronomia-31ha</link>
      <guid>https://dev.to/magopredator/astrocp-conformal-prediction-con-cobertura-condicional-por-clase-para-astronomia-31ha</guid>
      <description>&lt;h1&gt;
  
  
  astrocp: Conformal Prediction con cobertura condicional por clase para astronomía
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Una librería pequeña (AD-MCP) que da conjuntos de predicción con cobertura&lt;br&gt;
&lt;em&gt;por cada clase&lt;/em&gt; en datasets astronómicos con clases raras — y el registro&lt;br&gt;
honesto de cómo pasó de "funciona" a "funciona y está verificado".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;En sondeos astronómicos (PLAsTiCC, SDSS) las clases raras —supernovas&lt;br&gt;
poco frecuentes, quasars raros— conviven con clases mayoritarias. Un&lt;br&gt;
clasificador bien calibrado puede dar una cobertura marginal del 90% y,&lt;br&gt;
aun así, dejar a la clase rara en un 40%. &lt;strong&gt;La cobertura marginal engaña:&lt;/strong&gt;&lt;br&gt;
oculta que el modelo falla justo donde importa.&lt;/p&gt;

&lt;p&gt;Conformal Prediction (CP) controla la cobertura con garantía de muestra&lt;br&gt;
finita. Pero la variante estándar (un solo cuantil global) repite el mismo&lt;br&gt;
defecto: protege el promedio, no a cada clase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué existe ya (y qué no)
&lt;/h2&gt;

&lt;p&gt;La predicción conformista &lt;em&gt;sí&lt;/em&gt; se ha aplicado a astronomía:&lt;br&gt;
&lt;a href="https://arxiv.org/abs/2412.10544" rel="noopener noreferrer"&gt;Giertych, Williams &amp;amp; Ghosh (2024) — "Conformal Prediction for Astronomy&lt;br&gt;
Data with Measurement Error"&lt;/a&gt; construye&lt;br&gt;
intervalos de predicción para &lt;strong&gt;regresión&lt;/strong&gt; con error de medición&lt;br&gt;
heterocedástico (masas de exoplanetas).&lt;/p&gt;

&lt;p&gt;El gap que &lt;code&gt;astrocp&lt;/code&gt; aborda es distinto y más estrecho:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;No existe una librería mantenida de Conformal Prediction para&lt;br&gt;
clasificación multi-clase con incertidumbre condicional por clase en&lt;br&gt;
astronomía&lt;/strong&gt; — es decir, que controle la cobertura de &lt;em&gt;cada&lt;/em&gt; clase&lt;br&gt;
(incluidas las raras) por separado, no solo la marginal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AD-MCP es clasificación multi-clase con estratificación Mondrian por&lt;br&gt;
anomaly score; el paper de 2024 es regresión. No se solapan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona AD-MCP
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ADMCP&lt;/code&gt; combina dos piezas sobre &lt;a href="https://github.com/scikit-learn-contrib/mapie" rel="noopener noreferrer"&gt;MAPIE&lt;/a&gt; 1.4.1:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Un modelo base global (RandomForest).&lt;/li&gt;
&lt;li&gt;Cuantiles de conformidad &lt;strong&gt;RAPS&lt;/strong&gt; por &lt;em&gt;bin&lt;/em&gt; del anomaly score
(IsolationForest), en vez de un único cuantil global. Cada punto usa el
cuantil de su estrato de anomalía.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El conjunto de predicción = { clases c : score_c &amp;lt;= q_estrato }.&lt;/p&gt;

&lt;p&gt;El cuantil se fija por validación cruzada (&lt;code&gt;select_lambda&lt;/code&gt;), no a ojo.&lt;/p&gt;

&lt;h2&gt;
  
  
  El guardrail que el método necesitaba
&lt;/h2&gt;

&lt;p&gt;Con clases de 16-30 muestras en calibración, repartidas en varios estratos,&lt;br&gt;
el cuantil por estrato es &lt;strong&gt;ruido puro&lt;/strong&gt;: ninguna estratificación (por&lt;br&gt;
anomaly o por cualquier otra variable) es viable por falta de señal. No es&lt;br&gt;
fallo del método, es falta de datos.&lt;/p&gt;

&lt;p&gt;Por eso &lt;code&gt;ADMCP&lt;/code&gt; marca las clases con menos de &lt;code&gt;n_min_class&lt;/code&gt; muestras en&lt;br&gt;
calibración como &lt;strong&gt;inviable&lt;/strong&gt; y delega a un cuantil global para ellas. El&lt;br&gt;
paquete &lt;em&gt;avisa&lt;/em&gt; cuándo no debe estratificar, en vez de ocultar la&lt;br&gt;
limitación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados (sin inflar)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AD-MCP &lt;strong&gt;mejora la cobertura condicional relativa&lt;/strong&gt; vs baseline en régimen
favorable (SDSS; PLAsTiCC con features pobres).&lt;/li&gt;
&lt;li&gt;Con features ricas, el baseline de conformalización global puede superar a
AD-MCP en la peor clase: el límite real no es de "régimen de anomaly" sino
de &lt;strong&gt;muestras mínimas por clase&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lambda_reg&lt;/code&gt; se fija por CV con un criterio compuesto, no a dedo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La comparación que importa es &lt;em&gt;relativa&lt;/em&gt; (AD-MCP vs baseline, mismo&lt;br&gt;
dataset, mismo modelo), no contra un umbral absoluto que se haya movido en&lt;br&gt;
el camino.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se verificó (la parte que importa)
&lt;/h2&gt;

&lt;p&gt;El repo no se fusionó a &lt;code&gt;main&lt;/code&gt; porque "Hermes dijo que pasaba". Pasó por&lt;br&gt;
auditoría ciega desde clone limpio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone en directorio nuevo, &lt;code&gt;.venv&lt;/code&gt; nuevo, 27 dependencias desde cero.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pytest&lt;/code&gt; → &lt;strong&gt;11 passed, 2 failed&lt;/strong&gt;. Los 2 fallidos son el criterio de
aceptación &lt;em&gt;original&lt;/em&gt;, preservado a propósito en rojo porque se relajó
tras ver los datos (trazabilidad de los postes movidos, no borrar el test
que falla).&lt;/li&gt;
&lt;li&gt;La auditoría encontró y corrigió 3 bugs de reproducibilidad que el entorno
local ocultaba: dependencia &lt;code&gt;astroML&lt;/code&gt; no declarada, datos en &lt;code&gt;.gitignore&lt;/code&gt;,
y un cache de features que no codificaba el tamaño de muestra.&lt;/li&gt;
&lt;li&gt;El autor (Sil) reprodujo el clone limpio por su cuenta: mismo resultado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto es la prueba de calidad, no un adjetivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/amurlaniakea/astrocp.git
&lt;span class="nb"&gt;cd &lt;/span&gt;astrocp &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[test]"&lt;/span&gt;
pytest   &lt;span class="c"&gt;# esperado: 11 passed, 2 failed (test_coverage_red.py rojo a propósito)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Rol&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MAPIE 1.4.1&lt;/td&gt;
&lt;td&gt;Conformal Prediction base (RAPS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scikit-learn&lt;/td&gt;
&lt;td&gt;RandomForest, IsolationForest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;astroML&lt;/td&gt;
&lt;td&gt;Carga de SDSS (local, sin red)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PLAsTiCC&lt;/td&gt;
&lt;td&gt;Lightcurves de supernova (Zenodo)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/amurlaniakea/astrocp" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/astrocp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap previo (regresión):&lt;/strong&gt; &lt;a href="https://arxiv.org/abs/2412.10544" rel="noopener noreferrer"&gt;Giertych et al. (2024)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Copyright © 2026 Pedro Sordo Martínez.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>corpus-scrub 0.1.0: detecta y redacta PII y secretos en corpus de entrenamiento antes del entrenamiento LLM</title>
      <dc:creator>Fenix</dc:creator>
      <pubDate>Fri, 17 Jul 2026 01:21:29 +0000</pubDate>
      <link>https://dev.to/magopredator/corpus-scrub-010-detecta-y-redacta-pii-y-secretos-en-corpus-de-entrenamiento-antes-del-432h</link>
      <guid>https://dev.to/magopredator/corpus-scrub-010-detecta-y-redacta-pii-y-secretos-en-corpus-de-entrenamiento-antes-del-432h</guid>
      <description>&lt;h1&gt;
  
  
  corpus-scrub 0.1.0: detecta y redacta PII y secretos en corpus de entrenamiento antes del entrenamiento
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Los modelos memorizan y filtran lo que hay en los datos de entrenamiento. &lt;code&gt;corpus-scrub&lt;/code&gt; los limpia antes de entrenar: detecta PII (email, teléfono, IBAN, tarjeta, nombres) y secretos (API keys, tokens) y los redacta localmente, sin enviar nada a ningún servicio.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Los corpus raspados de la web contienen rutinariamente datos personales y credenciales. La literatura lo deja claro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modelos de síntesis de imágenes que retroalimentan riesgos de privacidad amplificados en mezclas real-sintético (&lt;a href="https://arxiv.org/abs/2607.13541" rel="noopener noreferrer"&gt;arXiv 2607.13541&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Memorización no intencionada de información sensible en fine-tuning (&lt;a href="https://arxiv.org/abs/2601.17480" rel="noopener noreferrer"&gt;arXiv 2601.17480&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Direcciones de activación universales para fuga de PII (UniLeak) (&lt;a href="https://arxiv.org/abs/2602.16980" rel="noopener noreferrer"&gt;arXiv 2602.16980&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GDPR y el art. 10 de la EU AI Act prohíben datos personales no estructurados en conjuntos de entrenamiento sin consentimiento. La solución barata es limpiar el corpus antes de entrenar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;corpus-scrub&lt;/code&gt; es una CLI local-first (AGPL-3.0-or-later) que escanea JSONL/TXT/Parquet y:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PII&lt;/strong&gt;: Presidio (NER spaCy &lt;code&gt;en_core_web_lg&lt;/code&gt; para PERSON) + regex propios para EMAIL / IBAN / CARD / PHONE que no dependen de modelo y funcionan en cualquier idioma.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secretos&lt;/strong&gt;: un ruleset de 16 reglas portadas verbatim de gitleaks (commit fijado &lt;code&gt;4c232b5&lt;/code&gt;), verificadas regla por regla contra el &lt;code&gt;gitleaks.toml&lt;/code&gt; original en los tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redacción&lt;/strong&gt;: &lt;code&gt;mask&lt;/code&gt; (&lt;code&gt;&amp;lt;TYPE&amp;gt;&lt;/code&gt;), &lt;code&gt;hash&lt;/code&gt; (sha256 truncado) o &lt;code&gt;drop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reporte&lt;/strong&gt;: JSON de auditoría con conteo por tipo y localizaciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multi-idioma para nombres (ES/DE/FR) vía modelos spaCy &lt;code&gt;_lg&lt;/code&gt; dedicados, con fallback multilingüe explícito y tests que fallan si el fallback se usa por accidente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instalar&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="c"&gt;# el primer run descarga spaCy en_core_web_lg (~400 MB)&lt;/span&gt;

&lt;span class="c"&gt;# Escanear y enmascarar&lt;/span&gt;
corpus-scrub scan &lt;span class="nt"&gt;--input&lt;/span&gt; corpus.jsonl &lt;span class="nt"&gt;--policy&lt;/span&gt; mask &lt;span class="nt"&gt;--out&lt;/span&gt; redacted.jsonl &lt;span class="nt"&gt;--report&lt;/span&gt; report.json

&lt;span class="c"&gt;# Solo inglés en el MVP; otros idiomas error explícito&lt;/span&gt;
corpus-scrub scan &lt;span class="nt"&gt;--input&lt;/span&gt; corpus.jsonl &lt;span class="nt"&gt;--lang&lt;/span&gt; en
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los detectores universales (email/teléfono/IBAN/tarjeta) son regex, así que no necesitan modelo y cubren cualquier idioma. El NER de PERSON usa Presidio para EN y spaCy directo para ES/DE/FR.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits honestos
&lt;/h2&gt;

&lt;p&gt;No todo está garantizado, y está documentado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AC-1 garantiza recall &amp;gt;= 0.95 para EMAIL, PERSON y CREDIT_CARD. &lt;strong&gt;PHONE e IBAN no están garantizados&lt;/strong&gt; en el MVP: Presidio puntúa el teléfono bajo el umbral y el reconocedor de IBAN falla en algunos formatos EN. Es un KNOWN_ISSUE, no una sorpresa.&lt;/li&gt;
&lt;li&gt;NER multilingüe exige los modelos &lt;code&gt;_lg&lt;/code&gt; descargados; si faltan, los tests de precisión fallan en vez de pasar silenciosamente contra el fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Auditoría y gobernanza
&lt;/h2&gt;

&lt;p&gt;El ruleset de secretos pasó una auditoría regla-por-regla contra la fuente de gitleaks. Se encontró y corrigió una divergencia real: la regla &lt;code&gt;pypi-upload-token&lt;/code&gt; usaba un comodín en vez del prefijo base64 fijo del token real, lo que generaba falsos positivos demostrados. El fix añadió un test que compara cada regla portada contra el &lt;code&gt;gitleaks.toml&lt;/code&gt; embebido como fixture, así que futuras derivas se detectan solas.&lt;/p&gt;

&lt;p&gt;Cobertura de tests: 82% (fast suite sin descarga de modelos; slow suite con los &lt;code&gt;_lg&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Presidio + spaCy&lt;/td&gt;
&lt;td&gt;NER PERSON (EN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;spaCy &lt;code&gt;es/de/fr_core_news_lg&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;NER PERSON multilingüe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;regex gitleaks&lt;/td&gt;
&lt;td&gt;detección de secretos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pytest + CI&lt;/td&gt;
&lt;td&gt;fast/slow suites, cobertura&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/amurlaniakea/corpus-scrub
&lt;span class="nb"&gt;cd &lt;/span&gt;corpus-scrub
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
pytest &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"not slow"&lt;/span&gt;   &lt;span class="c"&gt;# suite rápida, sin descargas&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/amurlaniakea/corpus-scrub" rel="noopener noreferrer"&gt;https://github.com/amurlaniakea/corpus-scrub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez — &lt;a href="mailto:amurlaniakea@gmail.com"&gt;amurlaniakea@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
