Open-source, embedded-ML network detection and response system protecting critical infrastructure from ransomware and DDoS attacks.
📜 Living contracts: Protobuf schema · Pipeline configs · RAG API
- DEBT-RANSOMWARE-MODEL-DESYNC-001 DIRIMIDA por medición.
5bbddd11reentrenó pero de forma estructuralmente equivalente a un reescalado:feature[]ychildren_left[]idénticos en los 100 árboles entre830b0ec0y5bbddd11, solo cambian los thresholds (MinMaxScaler afín monótona,random_state=42intacto). Un único modelo.feature_importancesválidos para el desplegado; el veto demodel_infoen el paper se estrecha a rendimiento, no a importancias. Acción pendiente: regenerar header desde el JSON canónico de5bbddd11(tras verificar la escala de features en producción). - DEBT-RANSOMWARE-ML-HEAD-INERT-001 abierta (P1, pre-producción). La cabeza ML de ransomware es no funcional en red por SEMANTICS-001 (feature[1] = varianza long. paquete/1e5 vs entropía Shannon de fichero). El sistema detecta vía
fastpath;mldeprimido (~0.14). Bloquea fiarse de plugins ensemble. Reentreno diferido a post-circuito, contra ground truth de red. - LAB-RANSOMWARE-FIRETEST-SPEC creada —
docs/experiments/LAB-RANSOMWARE-FIRETEST-SPEC.md. Diseño de laboratorio para detonar ransomware real y medir detección. H1 registrada con fecha. E1 (detección, víctimas x86) y E2 (port ARM64, ejecutable ya) separados. Ejecución pendiente de hardware. - Decisión Alonso DAY 195: terminar el circuito completo (adapters/LZ/Arrow medallion/Kuzu/grafo) asumiendo la inferencia ML rota/incompleta. El reentreno es posterior, con microscopio afinado. "Es mejor saberlo que ignorarlo."
| Campo | Valor |
|---|---|
| DAY | 195 |
| Tag | v1.0.0-day191 |
| Branch | main |
| EMECAS++ OSS | ✅ verde — test-all + test-e2e-synthetic-full + test-e2e-synthetic-firewall |
| EMECAS++ Enterprise | ✅ VERDE — 3 actos + Jenkins gate (DAY 167) |
| Pipeline | 6/6 RUNNING |
| Frente seguridad — H-1 Cypher | ✅ mitigada (prepared statements ADR-057, path ejecutado Kuzu) |
| Frente seguridad — H-2 ipset (NÚCLEO 1+3) | ✅ DAY 189 (0db706c8) — set_name validado + shell eliminado, safe_exec, 0 focos de shell |
| Frente seguridad — H-2 comment (NÚCLEO 2) | ✅ DAY 191 CERRADO — comment rechaza \n/\"/\ fail-fast (is_valid_comment, allowlist). CWE-93. H-2 COMPLETA (NÚCLEOS 1+2+3) |
| CWE-78 autonomy.whitelist_cidrs (punto 1) | ✅ DAY 190 CERRADO Y PROBADO — parse_autonomy valida CIDR fail-fast, is_valid_ip_cidr extraído, 5 tests verdes |
| Auditoría firewall | ✅ DAY 190 — único system() vivo en scope (autonomy_reactor) mitigado en frontera; nosemgrep INTERINO justificado pegado al return |
| PR #103 | ✅ mergeado a main (395ee014) · commit DAY 190 68ab3eb9 (10 ficheros, 246+/61−) |
| Tests firewall | ✅ 79/79 sin root (73→79, +6 CommentValidator.*) · canario IPSetWrapperTest.CommentInjectionRejected 7/7 con sudo en guest |
| Consejo de Sabios | 8/8 — Claude, Grok, ChatGPT, DeepSeek, Qwen, Gemini, Kimi, Mistral |
| Arquitectura | ✅ ADR-046 v4 · ADR-052 v3.2 · ADR-051 v2.2 · ADR-055 v1 · ADR-057 v2 · ⏳ ADR-050/053/054 |
| Próximo hito (DAY 192) | H-1/H-2 cerradas (auditoría de seguridad del firewall completa) — siguiente frente por definir |
| Deudas abiertas DAY 190 | DEBT-AUTONOMY-REACTOR-SAFEEXEC-002 (P2 post-FEDER) · DEBT-AUDIT-VBOXSF-IO-001 (P2) |
| Gate UEx/INCIBE | Datasets de valor científico (no deadline duro) |
Nota DAY 187 — B4 cerrada: árbitro
build_rowBORRADO (Camino A).write_recordpasa porto_correlation_v1_row+serialize(notario único P3).build_row,compute_hmac,fmt_double,csv_stringytest_correlation_v1_oracleRETIRADOS. Validación: fuzz diferencial contra el oráculo vivo 240.810 runs / 61s, cero divergencias (pre-borrado) +test_correlation_roundtripverde + golden recongeladoWRITTEN=24 SKIPPED=1 REJECTED=2 mismatches=0+ grep de cierrebuild_row|compute_hmac= 0 + EMECAS++ 3 actos verdes.DEBT-CORRELATION-V1-EXTRACT-B4-REWIRE-001CERRADA (cierraDEBT-LIBCORRELATION-V1-EXTRACT-001). Deuda nueva honesta:fuzz-correlation-equivquedó roto al morirbuild_row(DEBT-FUZZ-EQUIV-HARNESS-ORPHANED-001, P2) — andamio cumplido, candidato a fusionar con el fuzz de propiedad permanente (DEBT-CORRELATION-V1-FUZZ-PROPERTY-001).
Nota DAY 185 — claim honesto de la extracción
libcorrelation_v1: Extracción de la capa de serialización del contratocorrelation_v1a librería compartida, verificada byte-idéntica contra el oráculobuild_rowsobre 27 vectores enumerados y bajo locale classic (3 tests verdes: lib P0-P3, oracle 27/27, scaffold 46 OK). Salvedades: (a) equivalencia general acotada por enumeración, no probada (D-B); (b) golden capturado en classic — locale de producción verificado a favor (bronce histórico en punto decimal, classic de facto), luego D-E es endurecimiento, no breaking change; (c)\nembebido rompe readersgetline(DEBT-BRONZE-EMBEDDED-NEWLINE-001); (d) guard de enum desconocido (D-D) diferido sin regresión; (e) la identidad cross-productor cubre cols 0-17, la col 18 (HMAC) depende de política de claves. B4 (rewire + borrarbuild_row) pendiente DAY 186.
Tag activo: v1.0.0-day166 | Branch activa: main
Keypair activo: c76e5e10e2a5a5ebcbf249a2d36a2a18d88b05aa75552bb7042353221484cf90 (regenera en cada EMECAS)
Paper: arXiv:2604.04952 · Draft v24 local · v3 en arXiv
Principio rector: calidad sobre fechas — los datasets se generan cuando el pipeline esté listo
Principio rector: calidad sobre fechas — los datasets se generan cuando el pipeline esté listo
- 6/6 componentes RUNNING — validado EMECAS DAY 145 ✅
make test-all: ALL TESTS COMPLETE (50/50 firewall · 3/3 etcd-server · 9/9 sniffer · 10/10 ml-detector · 8/8 rag-ingester · 1/1 argus-network-isolate) ✅make PROFILE=production all: Gate ODR — ALL COMPONENTS BUILT ✅make argus-network-isolate-test: dry-run PASSED ✅
- H-2 NÚCLEO 2 CERRADO Y PROBADO — campo
commentdeIPSetWrapper::add_batch. Inyección CWE-93 (newline/quote) DEMOSTRADA sobre Debian 12 Bookworm ipset v7.17: el payloadx"\nadd <set> 66.66.66.66 comment "y(la"cierra el token, el\nabre línea nueva) inyectó la entrada66.66.66.66en el set. La línea inyectada puede serflush/destroy→ vaciar la blocklist entera con un comentario. No es CWE-78: el shell ya se retiró en NÚCLEO 3.- Mitigación (allowlist fail-fast): nuevo
include/firewall/comment_validator.hpp—is_valid_comment()rechaza control chars (\n\r\t\0),"y\, longitud ≤255. Cableado enadd_batch→IPSetErrorCode::INVALID_COMMENT. Bloque de escape de comillas BORRADO: no funcionaba —"es delimitador del tokenizer de restore, no carácter embebible. - Lección transversal: la indulgencia del parser de
ipsetDIFIERE entre versiones (v7.17 abortó la comilla suelta, v7.19 la aceptó) → la defensa vive en la frontera C++, nunca delegada enipset. Mismo principio queis_valid_set_name/is_valid_ip_cidr. - Tests: 6 GTest puros
CommentValidator.*(version-independientes, sin root) + canario e2eIPSetWrapperTest.CommentInjectionRejected(kernel real, sudo): rechazoINVALID_COMMENT+ IP inyectada AUSENTE + atomicidad (get_entry_count == 0).make firewall && make test-firewall→ 79/79 sin root (73→79); canario 7/7 con sudo en el guest. - H-2 COMPLETA — NÚCLEO 1 (
set_name, DAY 189) + NÚCLEO 3 (retirada de shell, DAY 189) + NÚCLEO 2 (comment, hoy). El frente de auditoría de seguridad del firewall (H-1/H-2) queda cerrado. - Pregunta abierta (severidad): depende del origen del
commenten producción — derivado del tráfico observado (vector remoto) vs texto fijo del agente (defensa en profundidad). El fix es idéntico en ambos casos.
- Mitigación (allowlist fail-fast): nuevo
- H-2 NÚCLEO 1+3 CERRADO (DAY 189,
0db706c8) —set_namevalidado + shell eliminado deipset_wrapper,safe_exec, 0 focos de shell. - CWE-78 autonomy.whitelist_cidrs CERRADO Y PROBADO (DAY 190,
68ab3eb9) —parse_autonomyvalida cada CIDR antes de aceptarlo (throwfail-fast).is_valid_ip_cidrextraído afirewall/ip_cidr_validator.hpp(behavior-preserving;is_valid_ipdelega).parse_autonomymovido apublic(testabilidad directa, patrónparse_irp).- Tests: 4 GTest de inyección (
;,\n,$()→ throw; CIDRs legítimos → no throw) + 1 standalonetest_ip_cidr_validator(29 asserts).make firewall && make test-firewall→ 73/73, cero regresión. - system() interino: silenciado con
nosemgrepPEGADO alreturn(justificado, no huérfano). semgrep acotado al fichero = limpio. →DEBT-AUTONOMY-REACTOR-SAFEEXEC-002(refactor safe_exec post-FEDER). - H-2 NÚCLEO 2 CERRADO (DAY 191) —
commentdeadd_batchrechaza\n/\"/\fail-fast (is_valid_comment). CWE-93. H-2 COMPLETA. Ver Hitos DAY 191.
- Tests: 4 GTest de inyección (
- EMECAS++ 3 actos verde · PR #103 → main
395ee014. - Deudas nuevas:
DEBT-AUTONOMY-REACTOR-SAFEEXEC-002(P2 post-FEDER) ·DEBT-AUDIT-VBOXSF-IO-001(P2,make auditestrangulado por I/O vboxsf — workaround: semgrep acotado por fichero).
IGraphSink::flush()deja de devolvervoid→FlushResult(POD{bool ok; uint64_t rows_flushed; uint64_t rows_pending; explicit operator bool}).[[nodiscard]]sobre el TIPO, no sobre cada método → ningún sink presente o futuro puede descartar en silencio el fallo de durabilidad bajo-Werror. Cierre estructural (mismo espíritu que H-1, cerrado por parámetro tipado y no poresc()).main.cpp: flush fallido →EXIT_FAILURE(el harness E2E no lee "ok" sobre datos perdidos). 8 touchpoints deIGraphSinkrevisados por grep, cero fuga a otros componentes. Commit4e221ede.KuzuGraphSinkcableado en batch.write()acumula (copiaCorrelationRecord+flow_uidmaterializado +ingested_atsellado a la entrada).flush()ejecuta el batch en UNA transacción:BEGIN/loopexecute(prepared)/COMMIT;ROLLBACK+ buffer retenido en fallo (retry, nunca descarte silencioso). Cierra H-1 en el path EJECUTADO de Kuzu — el sink ya no correquery(string interpolado), correexecute(prepared, params). Orden de miembrosdb_→conn_→prep_*→accumulator_resuelve lifetimes por RAII. Destructor grita si el buffer no está vacío. Commit112b9df1.- VERIFY-3 — test de agrupación transaccional. Dos tests gemelos: mismas N filas, solo cambia
COMMITvsROLLBACK. COMMIT → 2 nodos durables; ROLLBACK → 0. Prueba queBEGIN/COMMITpor string envuelve losexecute(prepared)en UNA transacción = 1 checkpoint por batch (la premisa queflush()amortiza, ahora medida). Baselinetest_kuzu_graph_sink0.48s→0.86s (batch + aperturas extra de BD, contabilizado). 6/6 verde. - API Kuzu 0.11.3 verificada contra el header vendorizado (
/usr/local/include/kuzu.hpp, NO de memoria): (1) NO hay método de transacción tipado — el control es por stringquery("BEGIN TRANSACTION"/"COMMIT"/"ROLLBACK"), cada uno devuelveQueryResult, se compruebaisSuccess(); (2)execute(PreparedStatement*, pair<string,Args>...)variádico, clavesstd::string; (3)common::ValueSIN ctor desdestring_view, todos los ctorsexplicit→ materializar cada campo de texto astd::string(string_view::data()no termina en nul); (4) el header documenta el SIGSEGV de DAY 183 (preventTransactionRollbackOnDestruction: rollback en destrucción sobre Database cerrada = SEGFAULT). - Consejo de Sabios (8/8) — revisión del banco de tortura del DAY 185. Las 5 decisiones (medir-primero, Opción B, extraer librería, injector-a-fichero, HMAC=correctitud) aprobadas con condiciones de validez. Señal incorporada: CSV bronce en
/dev/shm(tmpfs, no disco — aísla I/O de la contención con los COMMIT de Kuzu); test de equivalencia sobre fuzzer de protobuf (1M iteraciones, no caso único); injector adversarial += nodo-estrella/alta cardinalidad + línea truncada + duplicado exacto con contador + out-of-order causal;libcorrelation_v1PURA (struct + serialización, cero I/O); HMAC por env var compartida, nunca hardcode, nunca--skip-hmac. Ruido rechazado:--skip-hmac(puerta trasera), clave HMAC hardcodeada (segunda fuente de verdad), "SQL injection" en payload (categoría errónea — Kuzu es Cypher, ya cubierto por H-1).
- Smoke de concurrencia/upsert Kuzu EJECUTADO (
DEBT-KUZU-CONCURRENCY-SMOKE-001, adelantado a Fase 0 por arbitraje DAY 181). D1 y D2 RESUELTAS POR MEDICIÓN (ADR-057 v2 §3.0):- D1 — un grafo vs N grafos → UN GRAFO. run3 (4 writers) midió 373.000 rechazos por la única write-tx del sistema, +37% throughput, lectura p99 ×11.37. Multi-writer no escala. Sharding —si alguna vez— TEMPORAL, nunca semántico.
- D2 — Kuzu stock vs fork Vela → KUZU STOCK, VELA NO. El cuello era el overhead por-
query(), no el escritor único. UNWIND batch (1 query = N upserts) da ×55–61 (run1 164–229 ups/s → run2 10.000–12.200 ups/s). Vela solo añade writers paralelos = lo que run3 probó que no escala. - Descomposición:
coste(n)=P+S+n·E→ E≈88 µs/fila (MERGE irreducible), P+S≈5.93 ms (parse/plan+fsync, fijo, amortizable). El ×55–61 es amortizar el coste fijo. - Lock medido: cross-proceso rechazado (exit=2 ✅); in-process 2º
DatabaseABRE (footgun → corrupción) →DatabaseRegistryobligatorio. - Corrección honesta (ninguno de los otros 7 modelos la cazó): el
unordered_map::atal reabrir tras crash fue auto-infligido (borrar.kuzudejando.walhuérfano = inconsistencia artificial), NO prueba de que la recuperación de Kuzu esté rota. La recuperación real queda sin validar (diferida, ADR-057 §8).
- Fase 0 del grafo verde (EMECAS DAY 182):
ingested_at(first_seen, wall clock) +temporal_anomalyunilateral (futuro-datación = firma de clock-injection) +build_cypher(ingested_at_ns)(función libre, testeable,locale::classic()). Tres guardas que protegen LA MEDICIÓN (que el andamiaje trague la tortura de datos a 33 Mb/s — y más en x86 RAW — sin perder/corromper): sink UNWIND-batch + flush-by-(size|time),DatabaseRegistry,bufferPoolSizecapado. NO production-readiness — distinción explícita en ADR-057 §7. correlation-engineygraph-engineseparados por Apache Iceberg: el primero alimenta bronce, el segundo lee GOLD y posee el.kuzu. Clases de grafo a extraer →DEBT-GRAPH-ENGINE-EXTRACTION-001.DEBT-CE-TESTS-UNGATED-001CERRADA —make test-componentscorrecorrelation-engine-testprimero; H-1 y el backend Kuzu ya gatean merges.- Consejo de Sabios (2ª vuelta, 8/8) sobre los datos del smoke: 5 "bloqueantes" leídos como production-readiness → reclasificados bajo ADR-057 §8 (endurecimiento DIFERIDO), porque el eje del proyecto es ¿aguanta el andamiaje la medición?, no ¿es production-ready?. Insight de síntesis: los 5 son UN problema — una cola hacia un único consumidor de tasa fija.
- DEBT-AUTONOMY-STATE-PERSISTENCE-001 CERRADA —
common/autonomy_state_writer.hheader-only. Escritura atómica fsync+rename, firma Ed25519, lectura fail-safe (AUTONOMOUS expirado >24h → NORMAL). 9/9 tests RED→GREEN. Integrado en etcd-server STEP 0c.- DEBT-BOOTSTRAP-STATUS-SIGNATURE-001 CERRADA —
bootstrap-status.jsonfirmado Ed25519. JSON canónico →crypto_sign_detached→signature_hex. Escritura atómica tmp→rename+fsync. Misma cadena de confianza que ADR-025. - DEBT-KEYPAIR-LIFECYCLE-PROD-001 CERRADA —
provision.shgenerate_keypair():ARGUS_ENV=prodsin keypair →exit 1. NUNCA genera silenciosamente en producción. 3 niveles: dev/staging=genera, prod=falla. - DEBT-CRYPTO-RECONCILIATION-001 CERRADA + STALENESS GUARD (B1 post-Consejo) —
AutonomySubscriber:shared_ptr<atomic<FirewallAutonomyMode>>+shared_ptr<atomic<int64_t>>(last_update_ns).poll_callback: sielapsed > staleness_timeout_sec→ NORMAL + log. Previene firewall congelado si etcd-server muere silenciosamente. 9/9 tests (T9: staleness guard). - Consejo 8/8 consultado — Dos bloqueantes identificados y resueltos antes del merge: B1 (staleness) + B2 (ExecStartPre= vs ExecStartPost= para fichero efímero, pendiente DAY 158).
- EMECAS DAY 157 VERDE —
vagrant destroy → up → make bootstrap → make test-all— TODO VERDE.
- DEBT-BOOTSTRAP-STATUS-SIGNATURE-001 CERRADA —
- Contrato bronce
correlation_v1en forma final + injectors sellados E2E. Tres cambios verificados sobre tráfico real (make pipeline-start+make test-e2e-synthetic-full):- (B) col 17
authoritative_source→ string simbólico.DetectorSource_Name()en el writer; el reader almacena string (engine limpio de protobuf, decisión DAY 174 #5). Round-trip unitario verde + bronce real con150 DETECTOR_SOURCE_ML_PRIORITY+9 DETECTOR_SOURCE_DIVERGENCE. Orden B-vs-A resuelto MIDIENDO (test_correlation_roundtripes injector-independiente) — "medir, no votar". - node_id sintético — DEBT-INJECTOR-NODEID-001 CERRADA (P0). Isomorfo
synth-node-00fijo, mocksynth:node:<id>.flow_uidya no degenera. 102 filassynth-node-00en bronce. - Proto benigno correlacionable (hallazgo de hoy, NO deuda — "completar A"). El injector ponía
protocol_number=rand[1,255]→ ~99% no-TCP/UDP →compute_community_id() nullopt→ bronce a 0 filas. Fix: coin flipuse_tcpgobierna number+name (antes divergían). community_id 0%→100% (159/1591:...=). - DEBT-INJECTOR-ROWGAP-001 REENCUADRADA y cerrada como característica. No es "se pierden filas": el
send(dontwait)reproduce fielmente la semántica de entrega no-garantizada de ZMQ PUSH (síntoma bidireccional — observados 2event_idduplicados concommunity_iddistinto). Decisión Q1 (arbitraje Alonso vs mayoría del Consejo): INSTRUMENTAR (diff de conjuntos), no re-arquitecturar — el suplantador no debe ser más fiable que el sniffer que imita (ADR-055 §0). - ADR-055 v1 RATIFICADA con enmiendas de fidelidad (DAY 178) (Inyectores Sintéticos: fidelidad, determinismo, entrega) — 8/8 confirman lo sustantivo. Enmiendas: DELIVERY-METRIC P2→P1; objeción formal de Kimi a la anulación de Q1 aceptada bajo protesta (condición P1 satisfecha); Q4 se mantiene 7/8 (Kimi sostiene 8/8, no verificable, decisión idéntica).
- Consejo 8/8 (1ª pasada): ratificaciones 8/8 · Q2 dos perillas + semilla fija · Q3 ADR-055 absorbe · Q4 no DEBT para proto (7/8) · Q5 preservar divergencia + "no aplanar" en gold. Q1 sin mayoría (3/3/2) → arbitraje. Deudas nuevas: DEBT-INJECTOR-DELIVERY-METRIC-001 (P1, elevada DAY 178), DEBT-INJECTOR-PROTO-MIX-001 (P2).
- (B) col 17
- Zona bronce
correlation_v1CABLEADA y verificada E2E. ElCorrelationWriter(productor, ml-detector) deja de estar suelto. Cadena completa con datos reales: sniffer eBPF → community_id → ZMQ → ml-detector → bronce →parse_and_verifydel correlation-engine. 3.712 filas reales en/vagrant/logs/correlation/argus/, todas con community_id poblado; una fila real validada con la clave de PRODUCCIÓN de etcd. 4 pasos verdes: alta CMake + hook en punto único (antes de la bifurcación rag/no-rag) + round-trip unitario (prueba de oro writer↔reader) + pipeline vivo.- Lección (DEBT-BRONZE-KEY-PROVISIONING-001): la clave HMAC del bronce no es
seed.hexsino la de etcd/secrets/<componente>. El round-trip con clave hardcodeada validaba el contrato pero ocultaba el provisioning. - REGLA PERMANENTE (DAY 175): construir siempre vía
make <target>(corre la dependenciaprotoy aplica-Werrordel Makefile), nuncacmakedirecto (riesgo de.pb.hrancio). - INVARIANTE: community_id es el punto de unión con Suricata/Zeek — TODAS las variantes del sniffer (x86/ARM, eBPF/libpcap) deben poblarlo.
- Consejo 8/8: injectors sintéticos primero (ambos modos: isomorfo + mock) ·
col 17
authoritative_source→ string simbólico · ADR-054 (modelo de confianza Ed25519 con/en-vez-de HMAC a escala multi-nodo) pendiente de redacción.
- Lección (DEBT-BRONZE-KEY-PROVISIONING-001): la clave HMAC del bronce no es
- ADR-051 v2.2 RATIFICADA — Consejo 8/8. Community ID Parity Gate & Correlation Health. Confirmación de fidelidad sin 3ª deliberación (precedente ADR-052). Renombrado desde "Seed Parity Gate" (el gate valida paridad de
community_idemitido, de la que el drift de seed es una causa, no la única). Decisión clave: Oracle Divergence — si los sensores heterogéneos coinciden entre sí pero no conpycommunityid, arranca con WARNING crítico, NO fail-closed (argumento N-version); fail-closed reservado a disparidad ENTRE sensores. Máquinas de estado del gate y de confianza del sensor (DEGRADED estadístico / QUARANTINED binario confirmado). Diseño ratificado para archivar — solo el gate de arranque mínimo (cross-check DAY 171/172) está en camino crítico; el resto duerme hasta que exista engine que proteger. EntregableADR-051_v2.2.md.- DEBTs nuevas (corte camino-crítico/diferible): P1
DEBT-CID-TEST-VECTORS-001(fixture compartido con FLOWUID),DEBT-SEED-GATE-DIAGNOSTIC-001,DEBT-CID-STATE-MACHINE-001,DEBT-CID-CROSSCHECK-CI-001; P2DEBT-CID-ORACLE-QUORUM-001,DEBT-SEED-CHAOS-TEST-001; P3 diferidaDEBT-SEED-ACTIVE-PROBE-001. MásDEBT-ARGUSPP-CLOCK-INJECTION-PROD-001(P1, hallazgo DAY 172: verificar que producción no heredó el reloj inyectado del cross-check). - Higiene DAY 173:
enterprise_vendor.pubhuérfana destrackeada de la raíz (commit5c8dc37d). Verificado sin fuga de clave privada.
- DEBTs nuevas (corte camino-crítico/diferible): P1
- ADR-052 v3.2 RATIFICADA — Consejo 8/8. Multi-node Flow Identity & Host↔Net Correlation. Confirmación de fidelidad unánime, sin tercera deliberación. Principio ordenador §0: "El grafo no es el producto. El producto es el corpus."
flow_uid = base64(BLAKE2b(node_id ‖ community_id ‖ flow_start_window [‖ seq_in_window]));node_id= string legible declarado en inventario firmado (NO derivado del keypair efímero);community_id= clave de correlación, nunca identidad. Dos anulaciones de árbitro: hash anclado a libsodium (§3.1.1) y señales TCP/TLS de host dentro del ADR (§3.11). EntregableADR-052_v3.2.md. DesbloqueaDEBT-NEO4J-FLOW-KEY-001.- DEBTs de identidad de flujo registradas (orden de dependencia P0→P3): P0
DEBT-NODEID-CRYPTO-IDENTITY-001(reescrita) +DEBT-FLOWUID-CANONICAL-ENCODING-001+DEBT-NEO4J-FLOW-KEY-001; P1DEBT-SENSOR-COVERAGE-MAP-001/DEBT-LABEL-WAL-001(hash-chain) /DEBT-ARGUSPP-ARP-MONITOR-001/DEBT-ARGUSPP-HOST-TCP-001; P2DEBT-CERT-EXPECTATION-STORE-001/DEBT-SEQWINDOW-PERSIST-001/DEBT-ARGUSPP-OOB-MITM-001/DEBT-CORPUS-QUALITY-METRICS-001; P3DEBT-ARCH-FLOW-OBSERVATION-001. - ADR-053 stub abierto — JA3/JA4, cadena TLS profunda, anomalía de ruta L3/BGP (diferido conscientemente de ADR-052 para evitar scope creep). ADR-050 (MITRE) y ADR-051 (Seed Parity Gate) siguen pendientes de redacción.
- DEBTs de identidad de flujo registradas (orden de dependencia P0→P3): P0
- Cross-check E2E community_id — paridad OPERACIONAL demostrada. El cliente
.50replaya el flujo Neris poreth1; aRGus + Suricata + Zeek capturan en paralelo (promiscuo) el MISMO paquete y los tres convergen STRING A STRING al diana1:IN7uqVpMWxpmuhQTowSQB2XEe0E=. Se cierra la paridad operacional (DAY 170 cerró especificación + provisión). Validación data-plane (P2 Consejo): se mide lo que el binario EMITE, no lo que dice la config.- aRGus surfacea community_id observable —
sniffer/src/flow/community_id_log.{hpp,cpp}.compute_community_idpermanece pura; el log vive en los 3 call-sites de sellado (ring_consumer.cpp×2,main_libpcap.cpp×1). Gateado porARGUS_CID_CROSSCHECK=1(OFF por defecto, coste nulo en hot path). TSV 7 campos a/vagrant/logs/lab/cid-xcheck-argus.tsvcon mutex +fflush. Compila en Variant A y B. Test TDHtest_community_id_log.cppPASSED. - Verificador de paridad —
tools/community_id_crosscheck.py(host). Paridad por VALOR del cid; 5-tupla como etiqueta forense (cada motor nombra el proto distinto). Categorías: agree / disagree / solo. - Criterio de aceptación congelado —
docs/acceptance_criteria.md, Consejo 8/8 sin tercera ronda. Refinamiento ChatGPT: categorías de presencia DROP/CONFIG/POLICY/BUG/UNKNOWN, precondición drop=0, nota de túneles de Gemini. - DEBT-ARGUSPP-COUNTER-DUMP-001 abierta (P1, DAY 172) — volcado de contadores de aRGus a fichero parseable (código nuevo, no "leer un log que existe" como Suricata/Zeek).
- Nota algoritmo:
community_idusa SHA1 (Corelight), no HMAC-SHA256.
- aRGus surfacea community_id observable —
- community_id cross-sensor sellado — aRGus (nativo, 8/8 tests contra oráculo pycommunityid v1.5.0 byte a byte, campo protobuf field 18), Zeek 8.2.0 (provisión
local.zeeksite/:@load community-id-logging+redef CommunityID::seed=0) y Suricata 7.0.10 (community-id:yes+community-id-seed:0). Diana E2E1:IN7uqVpMWxpmuhQTowSQB2XEe0E=sobre flujo Neris. Seed 0 explícito en los 3 garantizado por provisión.DEBT-ARGUSPP-COMMUNITY-ID-ARGUS-001+DEBT-ARGUSPP-COMMUNITY-ID-001CERRADAS.- DEBT-ZEEK-COMMUNITY-ID-PROVISION-001 CERRADA — guardas de idempotencia por línea en el Vagrantfile (no por bloque).
vagrant provision zeekdejalocal.zeekcon@load+seed=0sin intervención manual. - DEBT-DOCS-BACKLOG-DEDUP-001 CERRADA —
docs/BACKLOG.mdcorrupto desde DAY 158 (append manualcat>>, no el script). 5336->2839 líneas. Lección: verificar integridad congrep secciones | sort | uniq -ddel fichero completo, nogrep -cde cabecera. - Consejo de Sabios (8/8) — consenso unánime P1/P2/P3. Gate seed por data-plane (no config), identidad de flujo
hash(node_id || community_id || flow_start_window), doble arista host<->red con host_id canónico. ADR-051 (Seed Parity Gate) + ADR-052 (Multi-node Flow Identity & Host<->Net) pendientes de redacción. DEBT-NEO4J-FLOW-KEY-001 (P0 esquema).
- DEBT-ZEEK-COMMUNITY-ID-PROVISION-001 CERRADA — guardas de idempotencia por línea en el Vagrantfile (no por bloque).
- Día de arquitectura.
ADR-046 v4aprobado (Multi-Source Pipeline, separación de planos).AdapterSpec v1cerrado (contrato del adaptador por fuente).ADR-050pendiente de redacción (seis vectores de la sesión MITRE + corrección cripto telemetría).- DEBT-ARGUSPP-COMMUNITY-ID-ARGUS-001 abierta (P0) — community_id nativo en aRGus: campo en protobuf + cálculo SHA1 de la 5-tupla en el sniffer. Catch de Kimi: canonicalización idéntica byte a byte a Zeek/Suricata o el join cross-tool falla en silencio.
- Vagrantfile multi-VM — Suricata 7.0.10 + Zeek 8.2.0 + Wazuh 4.x + client en
ml_defender_gateway_lan(192.168.100.0/24,autostart: false). community-id habilitado en Suricata y Zeek. 50.248 reglas ET Open.WAZUH_MANAGER_PASSWORDeliminado (fix seguridad). Merge a main21642e87.- 3 reglas permanentes nuevas — nunca
set -een provisions (usar|| true/|| { exit 1; }); DNS fixchattr +iSIEMPRE tras chrony; nunca heredoccat << 'EOF'anidado en<<-SHELL(usarprintf).
- 3 reglas permanentes nuevas — nunca
- DEBT-ARGUSPP-NTP-001 CERRADA (P0) — chrony en todos los nodos, health-check rechaza arranque si offset >1s. Gate del correlation-engine: community_id es inútil sin timestamps sincronizados.
- correlation-engine scaffold (ADR-048 F2) — esqueleto C++20 con
source_wait_timeoutpor fuente ycrisis_idle_timeout120s. - BACKLOG-CI-ENTERPRISE-001 CERRADA — stage
make emecas++en Jenkinsfile.dev (11 pasadas hasta verde). Vault dev como precondición. Acto I/II/III rojo → no merge. Merge a main7b45feca.
- correlation-engine scaffold (ADR-048 F2) — esqueleto C++20 con
- Fix CMake: test_ntp_health_check triplicado —
test_ntp_health_checkdefinido 3 veces encommon/CMakeLists.txt. Bloqueaba EMECAS++ Acto I (-DARGUS_VAULT_ENABLED=ON). Fix:sed -i '291,302d;387,398d'. Un comando, dos minutos. Consejo DAY 163 (8/8): invarianteif(NOT TARGET)obligatorio. Los bloquesif(ARGUS_VAULT_ENABLED)no crean targets — solo añaden comportamiento. Nueva deuda:DEBT-CMAKE-GRAPH-INVARIANTS-001con lint CI (ChatGPT, Kimi). ADR propuesto:adr-028-cmake-target-naming.md.- BACKLOG-CRYPTO-VENDOR-KEY-001 CERRADA — Modelo B: keypair enterprise efímero por
vagrant up.vault-enterprise-bootstrap(run:always) genera Ed25519 + token + sube a Vault + limpia/tmp. vendor.key nunca en disco. CMakeLists guardFATAL_ERRORsin-DARGUS_ENTERPRISE_PUBKEY_HEX.enterprise_vendor.pub+enterprise.tokengitignored. - BACKLOG-CRYPTO-HOT-RELOAD-001 CERRADA —
common/crypto_provider_handle.hppRCU header-only.std::atomic<shared_ptr<ICryptoProvider>>.get()nunca null.reload()swap atómico lock-free. 9/9 tests incluyendo concurrencia 8 readers + 50 reloads y RCU survival viaweak_ptr. - ADR-045 v2 aprobado (Consejo 8/8) —
not_beforesuficiente (sin 2PC), grace period 10s global, etcd-server escritor único viaCryptoEpochCoordinatorenvault_client,EPOCH_TRANSITION+EPOCH_FAILED, wire header[uint32_t][uint16_t epoch_id][2B reserved][LZ4]. - DEBT-ETCD-REGISTRAR-REAL-001 descubierta —
StubEtcdRegistrares stub puro. Prerequisito bloqueante de FASE 2. P0 DAY 164. - 12/12 suite common verde — nuevo test target
test_crypto_provider_handleintegrado.
- BACKLOG-CRYPTO-VENDOR-KEY-001 CERRADA — Modelo B: keypair enterprise efímero por
- DEBT-ETCD-REGISTRAR-REAL-001 CERRADA (FASE 2a) —
HttpEtcdRegistrarREST real:register_status(),start_keepalive()(hilo heartbeat),watch_epoch()(polling 2s),last_seen_revision, WatchState CONNECTED/DEGRADED/STALE. 5/5 tests RED→GREEN.- BACKLOG-CRYPTO-EPOCH-001 CERRADA (FASE 2b) —
CryptoEpochCoordinator: watch/v1/epoch, callbackon_epoch_change→handle.reload(), ACK timestamp monotónico ns. 5/5 tests RED→GREEN. etcd-server: GET/PUT/v1/epoch+ EpochInfo thread-safe. - Fix ODR httplib —
CPPHTTPLIB_OPENSSL_SUPPORTvia CMake en todos los targets.alert_client.hpp#ifndef guard. vault-enterprise-bootstrap token via @file. - 12/12 suite common verde.
- BACKLOG-CRYPTO-EPOCH-001 CERRADA (FASE 2b) —
- BACKLOG-CRYPTO-DUAL-KEY-ZMQ-001 CERRADA (FASE 3) — Wire header enterprise:
[uint32_t size][uint16_t epoch_id][2B reserved][LZ4+encrypted]. Selección de clave ANTES de descifrar (seguridad crítica). 13/13 tests RED→GREEN.ml-detectorserializa,firewall-acl-agent/zmq_subscriberdeserializa.- EMECAS++ OSS verde —
test-all✅ ·test-e2e-synthetic-full✅ ·test-e2e-synthetic-firewall✅ (540 eventos, 0 crypto_errors). - FASE 4 parcial —
test_e2e_rotationFakeEtcdServer 5/5 PASSED +test-e2e-vaultPASSED. Live rotation pipeline activo pendiente. - Keypair efímero activo:
a2abfe43e349e86ddeb4a22496b007919c87bdb0f5dc88c17b57cabf0d61331f - Consejo de Sabios (8/8) — 6 preguntas EMECAS++. Unanimidades: targets anidados, EMECAS++ naming, Jenkins post-merge. Decisión Alonso: 3 actos obligatorios (Vault nominal + rotación + fallo componente). No merge hasta los 3 actos verdes.
- DEBT-FIREWALL-BUILD-LEGACY-001 descubierta (P3, no bloquea).
- EMECAS++ OSS verde —
- DEBT-AUTONOMY-CRYPTO-INTEGRATION-001 CERRADA —
CryptoAutonomyStateMachine+AutonomyPublisherintegrados enetcd-server/main.cpp. Health-check loop 5s disparaon_vault_unreachable/restored.FirewallAutonomyReactor+AutonomySubscriberintegrados enfirewall-acl-agent/main.cpp.AutonomyConfig.zmq_endpointañadido a struct y parser.autonomy_publisher.hañadido al install target de CMake.- Test B (unitario): 7/7 PASSED —
CryptoAutonomyStateMachine+AutonomyPublishervia ZMQ real. T1-T7 incluyendoHealthCheckLoopSimulation. - Test A (E2E): 4/4 PASSED — Pipeline
Publisher→IPC→Subscriber→Reactordry_run.VaultKoTriggersAutonomousMode,VaultRestoredLiftsAutonomousMode,FullCycleNormalAutonomousReconcileNormal,SubscriberRunsStableWithoutEvents. - Fix ZMQ slow joiner — publisher debe hacer
bind()ANTES de que cualquier subscriber conecte. Regla permanente para todos los pares PUB/SUB del proyecto. - EMECAS DAY 156 VERDE —
vagrant destroy → up → make bootstrap → make test-all— TODO VERDE. 50/50 firewall, 3/3 etcd-server, 9/9 sniffer, 10/10 ml-detector, 8/8 rag-ingester. - ADR-046 PENDING-REVISION — Multi-Source Enriched Pipeline aRGus++. Tres condiciones para cierre: §Label leakage policy, §Deployment matrix RPi5 vs edge server, §8 datos empíricos o hipótesis.
- Test B (unitario): 7/7 PASSED —
- DEBT-FIREWALL-DENY-SELECTIVE-001 CERRADA — Cadena dedicada
argus-autonomy: lo→ESTABLISHED→CIDRs→DROP→INPUT.whitelist_cidrsobligatorio desdefirewall.json.AutonomyConfig+parse_autonomy()fail-fast. 12/12 tests. 49/49 firewall tests verdes.- DEBT-AUTONOMY-ZMQ-EVENTS-001 CERRADA —
AutonomyPublisher(common/) +AutonomySubscriber(firewall-acl-agent/). Topicargus.crypto.autonomy. Transportipc:///run/argus/autonomy.sock. 4/4 + 6/6 tests PASSED. - BACKLOG-ZMQ-TUNING-001 CERRADA — HWM + RECONNECT_IVL en todos los sockets ZMQ del proyecto. Prerequisito de BACKLOG-BENCHMARK-CAPACITY-001 satisfecho.
- DEBT-AUTONOMY-CRYPTO-INTEGRATION-001 registrada — Integración en
etcd-server/main.cpppendiente (P0 DAY 156). Consejo 6/8: etcd-server como proceso propietario. - EMECAS HARDENED PASSED —
-Werror+-O3+-flto+ producción limpio. AppArmor 6/6. Falco 11 reglas. BSR verificado. Tagv0.9.0-day155.
- DEBT-AUTONOMY-ZMQ-EVENTS-001 CERRADA —
- ADR-045 VaultClient decomposition COMPLETA —
ICryptoDeriver+HkdfCryptoDeriver(6 tests),IEtcdRegistrar+StubEtcdRegistrar(4 tests). VaultClient por composición con 4º ctor inyectable. 7 tests common/. v0.8.0-adr045.- DEBT-FIREWALL-AUTONOMY-MODE-001 CERRADA —
FirewallAutonomyReactor: AUTONOMOUS/DEGRADED →iptables -I INPUT 1 argus-autonomy-deny DROP, NORMAL →iptables -D INPUT. Executor inyectable (testable sin root). 6 tests. 48/48 firewall tests verdes. - Fix EMECAS —
crypto_deriver.hyetcd_registrar.hañadidos al install target.test_auto_isolateT6 corregido para-Werroren production build. - Consejo 8/8 — ZMQ directo para señal autonomía (P0 DAY 155). Default-deny actual INCORRECTA para hospitales →
DEBT-FIREWALL-DENY-SELECTIVE-001P0 DAY 155. - EMECAS: bootstrap ✅ | test-all ✅ | hardened-full ✅ | check-prod-all ✅.
- DEBT-FIREWALL-AUTONOMY-MODE-001 CERRADA —
- DEBT-PARQUET-SCHEMA-001 CERRADA — Schema Arrow v1.0: ml_detector_events (15 fields) + firewall_acl_events (7 fields). 207,122 filas / 53 días. Ratio 11-12x.
make parquet-convert+make test-parquetentest-all. Tipos acordados Consejo 8/8.- Vault dev mode + K_pseudo prototipo — Vault v2.0.0. HMAC-SHA256 determinismo OK, aislamiento OK, post-destroy irrecuperable. Evidencia técnica GDPR para Dr. Andrés Caro Lindo.
- Ansible + Jinja2 CI/CD pipeline —
ansible/templates/*.json.j2,deploy_configs.yml. Ejecutado en VM: 9 OK, 3 changed, 0 failed.make deploy-configs. - ADR-044 aprobado (Consejo 8/8) — Jenkins como entropy orchestrator. Vault autoridad criptográfica. common/vault_client C++20. Paths por familia. etcd barrera pre-arranque. Rotación manual FEDER. Edge nodes autónomos con cache TTL 72h.
- Abstract v24 — "architecturally complementary by design". PR #63.
- 5 PRs mergeados. Main en 81490fcb.
- ADR-029 Variant A vs B x86 — libpcap ~2× eBPF en VirtualBox virtio (artefacto SKB mode). Equivalencia funcional confirmada.
- Bootstrap múltiple —
bootstrap-x86-ebpf+bootstrap-x86-libpcap.bootstrap= alias de A. - pipeline-status distingue Variant A/B + detecta invariant violation.
- Relay targets — resumen inline por velocidad + rutas log + nota MTU en banner.
- Paper v19 — §6 ADR-029, §10.9, §11.17, §12, abstract actualizado.
- Failed packets (2,630): artefacto fijo pcap CTU-13 Neris — frames jumbo MTU VirtualBox. No son errores del pipeline.
- Bootstrap múltiple —
- EMECAS verde — 4 deudas técnicas cerradas: DEBT-IRP-TMPFILES-001, DEBT-IRP-IPSET-TMP-001, DEBT-BOOTSTRAP-SNIFFER-VERIFY-001, DEBT-EMECAS-VERIFICATION-001.
- Experimento comparativo Suricata 6.0.10 vs aRGus NDR — CTU-13 Neris, mismas condiciones. Suricata: 0 alertas (ET Open no cubre Neris 2011). aRGus: F1=0.9985, Recall=1.0000.
- Makefile:
make up-argus,make up-suricata,make halt-argus,make halt-suricata,make experiment-suricata-run/results. - Paper Draft v20 generado — nueva §8.13 con comparativa directa, Tabla comparación actualizada con datos empíricos Suricata.
- Vagrantfile Suricata operativo —
nictype1 virtio(fix crítico DHCP NAT), 50,010 reglas ET Open cargadas.
- Suricata offline validation —
suricata -r neris.pcap -k none, 50,010 ET Open rules (251 IRC, 475 botnet/C2, 853 trojan). 323,154 paquetes. 0 firmas ET disparadas. 128 alertas internas de motor. Criterio de Kimi satisfecho — conclusión irrefutable.- §8.13 paper — párrafo "Offline validation with full ruleset enforcement" insertado (DAY 148).
- §8.14 paper — framing taxonómico: "decision architecture taxonomies", "measurement layer", "telemetry platform", "Observability does not imply classification".
- §10 Future Work — 5 subsecciones completas: baremetal, corpus, acrl, hardened, Zeek Phase 2 (
detect-botnets.zeek, Intel framework temporal limitation). - Tabla §8.2 — fila Zeek 8.1.2 añadida (F1=0.042, Prec=1.000, Recall=0.022).
- Abstract v23 — tres paradigmas + complementariedad (Zeek telemetry + Suricata signatures + aRGus ML behavioral).
- arXiv replace v19→v23 — submitted como v3 (submit/7576269).
- DEBT-IRP-FLOAT-TYPES-001 CERRADA —
IrpConfig::threat_score_thresholddouble→float. Parche IEEE 754 eliminado. EMECAS PROFILE=production ALL TESTS COMPLETE. - fix(.gitignore) — excluir protocol-EMECAS-output-.md, docs/argus_ndr_v.pdf, docs/latex/*.zip. Untrack build symlinks.
- Tag:
v0.7.1-day148.
- Bug fix pipeline-status — pgrep fallback para procesos huérfanos (tmux + pgrep OR). Commit
42c04b06.- Búsqueda ruleset ET Open 2011 — no encontrado en fuentes públicas. Hallazgo clave: Neris CTU-13 escenario 42 usa HTTP C2, no solo IRC. Paper v21 §8.13 actualizado.
- Experimento Zeek 8.1.2 (tres paradigmas) — modo offline (
zeek -r pcap), scripts por defecto, determinístico:- Suricata 6.0.10: F1=0.000, TP=0 (sin firmas para Neris 2011)
- Zeek 8.1.2 (default): F1=0.042, Precision=1.000, TP=14 (SSL::Invalid_Server_Cert)
- aRGus NDR: F1=0.9985, Recall=1.000, TP=646
- weird.log: Zeek observa IRC, HTTP beaconing, SMB lateral movement, spam — sin alertar. Distinción observabilidad vs detección.
- Paper Draft v21 — §8.13 hallazgos reales DAY 147 + Springer 2023 (signature aging).
- Paper Draft v22 — §8.14 Three Paradigms (tablas + análisis + §13 reproducibilidad Zeek).
- Makefile:
make experiment-zeek-up/run/results. Infraestructuraexperiments/zeek-comparative/. - Tag:
v0.7.1-day147.
- DEBT-IRP-NFTABLES-001 CERRADA — IRP completo: config → disparo → fork()+execv() → AppArmor 7/7 enforce → 12/12 tests.
- DEBT-IRP-SIGCHLD-001 CERRADA — SA_NOCLDWAIT. SigchldTest.NoZombiesAfterNForks PASSED.
- DEBT-IRP-AUTOISO-FALSE-001 CERRADA — isolate.json única fuente de verdad. 5 tests PASSED.
- DEBT-IRP-BACKUP-DIR-001 CERRADA — /run/argus/irp/. AppArmor + provision.sh actualizados.
- Gate ODR production SUPERADO — 3 ODR violations reales detectadas y corregidas bajo -flto.
| Deuda | Prioridad | Target |
|---|---|---|
| DEBT-IRP-TMPFILES-001 | ✅ CERRADA DAY 146 | tmpfiles.d + provision.sh |
| DEBT-IRP-IPSET-TMP-001 | ✅ CERRADA DAY 146 | ipset_wrapper /run/argus/irp/ |
| DEBT-EMECAS-VERIFICATION-001 | ✅ CERRADA DAY 146 | README.md blockquote EMECAS |
| DEBT-IRP-FLOAT-TYPES-001 | ✅ CERRADA DAY 148 | float consistente con Detection::confidence (protobuf) |
| DEBT-IRP-PROB-CONJUNTA-001 | 🟡 P1 | post-FEDER (señal conjunta) |
| DEBT-ETCD-HA-QUORUM-001 | 🔴 P0 | post-FEDER (OBLIGATORIO) |
| DEBT-IRP-QUEUE-PROCESSOR-001 | 🔴 Alta | post-merge |
| DEBT-JENKINS-SEED-DISTRIBUTION-001 | 🔴 Alta pre-FEDER | ADR-044 definido — implementación DAY 150+ |
| DEBT-CRYPTO-MATERIAL-STORAGE-001 | ✅ CERRADA DAY 149 | Vault dev mode + K_pseudo prototipo |
| DEBT-MUTEX-ROBUST-001 | 🟡 P1 | post-FEDER |
| DEBT-PARQUET-TIMESTAMP-NS-001 | 🟡 P2 | firewall-acl-agent ms→ns en origen |
| DEBT-ALERTING-EDGE-SOS-001 | 🔴 P1 pre-FEDER | SOS webhook edge→Discord/Telegram/email |
| DEBT-CRYPTO-STAMPEDE-001 | ✅ CERRADA DAY 150 | Jitter implementado en vault_client.cpp |
| DEBT-CRYPTO-HEARTBEAT-001 | 🟡 P1 | Heartbeat periódico etcd post-crypto_ready |
| DEBT-VAULT-HA-001 | 🟡 P1 post-FEDER | Vault HA backend raft para producción |
| DEBT-ADR040-001..012 | ⏳ | post-FEDER |
| DEBT-ADR041-001..006 | ⏳ | pre-FEDER |
| DEBT-PARQUET-SCHEMA-001 | ✅ CERRADA DAY 149 | Schema Arrow v1.0, 207K filas, 11-12x |
| DEBT-VAULT-FEDERATION-001 | 🟡 P1 pre-FEDER | Offboarding instalaciones: destrucción de claves, retención de datos GDPR |
| DEBT-LEGAL-DATA-RETENTION-001 | 🟡 P1 pre-FEDER | Dictamen jurídico GDPR retención datos pseudonimizados post-cliente |
| DEBT-KPSEUDO-ROTATION-MIGRATION-001 | 🟡 P1 pre-FEDER | Migración identidades Neo4j tras rotación K_pseudo |
| DEBT-GDPR-ERASURE-001 | 🟡 P1 pre-FEDER | Flujo derecho al olvido Art. 17 GDPR — comando borrado firmado |
| DEBT-CRYPTO-AUTONOMY-001 | 🔴 P1 pre-FEDER | Máquina de estados EXTENDED_AUTONOMY |
| DEBT-FIREWALL-AUTONOMY-MODE-001 | ✅ CERRADA DAY 154 | FirewallAutonomyReactor |
| DEBT-FIREWALL-DENY-SELECTIVE-001 | ✅ CERRADA DAY 155 | Cadena argus-autonomy selectiva, whitelist JSON |
| DEBT-CRYPTO-RECONCILIATION-001 | ✅ CERRADA DAY 157 | shared_mode + staleness guard 30s, 9/9 tests |
| DEBT-CRYPTO-CACHE-PERSISTENT-PROD-001 | 🟡 P1 pre-FEDER | Cache cifrada en prod edge (LUKS obligatorio) |
| DEBT-EMECAS-DUAL-COMPILATION-001 | 🟡 P1 | CI compila ARGUS_VAULT_ENABLED=ON y OFF |
| DEBT-CRYPTO-REVOCATION-LOCAL-001 | 🟡 P1 post-FEDER | Revocación offline sin Vault |
| DEBT-LICENSE-VAULT-001 | ⏳ P2 post-FEDER | Servidor licencias en Vault (plugin system) |
| DEBT-PLUGIN-ENTERPRISE-001 | ⏳ P2 post-FEDER | Definir plugins enterprise vs community |
| DEBT-KPSEUDO-HKDF-HIERARCHY-001 | ⏳ P3 post-FEDER | Jerarquía HKDF para K_pseudo (host/flow/model desde K_root) |
| DEBT-AUTONOMY-REACTOR-SAFEEXEC-002 | 🟢 P2 post-FEDER | Eliminar std::system de autonomy_reactor (safe_exec/execv); retirar nosemgrep interino |
| DEBT-AUDIT-VBOXSF-IO-001 | 🟢 P2 | make audit full-tree estrangulado por I/O vboxsf; workaround semgrep acotado por fichero |
- ✅ DEBT-AUTONOMY-CRYPTO-INTEGRATION-001 CERRADA DAY 156
2. ✅ DEBT-AUTONOMY-STATE-PERSISTENCE-001 CERRADA DAY 157
3. ✅ DEBT-BOOTSTRAP-STATUS-SIGNATURE-001 CERRADA DAY 157
4. ✅ DEBT-KEYPAIR-LIFECYCLE-PROD-001 CERRADA DAY 157
5. ✅ DEBT-CRYPTO-RECONCILIATION-001 CERRADA DAY 157 (staleness guard B1)
6. DEBT-BOOTSTRAP-STATUS-SIGNATURE-CONSUMERS-001 P2 —
ExecStartPre=+check-bootstrap-status.sh. Verificar firma Ed25519 antes de iniciar componentes dependientes. 7. DEBT-CRYPTO-AUTONOMY-001 P2 — Máquina de estados EXTENDED_AUTONOMY completa enetcd-server. 8. DEBT-ALERTING-EDGE-SOS-001 P1 — Webhook SOS configurable por despliegue. 9. BACKLOG-BENCHMARK-CAPACITY-001 — Benchmarks sintéticos VirtualBox (baseline) + hardware físico FEDER.
| Variante | Estado | Descripción |
|---|---|---|
| aRGus-dev | ✅ Activa (main) |
x86-debug, imagen Vagrant completa. Para investigación y desarrollo diario. |
| aRGus-production | 🟡 En construcción | x86-apparmor + arm64-apparmor. AppArmor enforce, cap_bpf, Falco, noexec. Para hospitales, escuelas, municipios. |
| aRGus-seL4 | ⏳ Research track post-FEDER | Kernel seL4, libpcap. Reescritura completa. Branch independiente. |
arXiv: arXiv:2604.04952 [cs.CR] Published: 3 April 2026 · Draft v19 (ADR-029 Variant A vs B) · MIT license Code: https://github.com/alonsoir/argus
Democratize enterprise-grade cybersecurity for hospitals, schools, and small organizations that cannot afford commercial solutions.
Philosophy: Via Appia Quality — Systems built like Roman roads, designed to endure.
"Un escudo que aprende de su propia sombra."
| Metric | Value | Notes |
|---|---|---|
| F1-score (CTU-13 Neris) | 0.9985 | Stable across 4 replay runs |
| Precision | 0.9969 | |
| Recall | 1.0000 | Zero missed attacks (FN=0) |
| Suricata 6.0.10 F1 (CTU-13 Neris) | 0.000 | 0 alerts — ET Open rules retired for 2011 threats |
| Zeek 8.1.2 F1 (CTU-13 Neris, default) | 0.042 | Precision=1.000, 14 TP (SSL::Invalid_Server_Cert) |
| XGBoost Precision (CIC-IDS-2017 val) | 0.9945 | In-distribution, threshold=0.8211 |
| XGBoost Wednesday OOD | Documented impossibility | Structural covariate shift — §8 paper |
| Inference latency (XGBoost) | 1.986 µs/sample | Gate <2µs ✅ |
| Inference latency (RF) | 0.24–1.06 µs | Per-class, embedded C++20 |
| Throughput ceiling (virtualized) | ~33–38 Mbps | VirtualBox NIC limit, not pipeline |
| Stress test | 2,374,845 packets — 0 drops | 100 Mbps requested, loop=3 |
| RAM (full pipeline) | ~1.28 GB | Stable under load |
| BSR — Dev VM | 719 pkgs / 5.9 GB | gcc, g++, clang, cmake present |
| BSR — Hardened VM | 304 pkgs / 1.3 GB | NONE (check-prod-no-compiler: OK) ✅ |
| AppArmor profiles | 6/6 enforce | cap_bpf (Linux ≥5.8), no cap_sys_admin |
| Falco rules | 11 aRGus-specific | modern_ebpf driver |
| Variant B tests | 9/9 PASSED | DAY 142 — buffer=8MB verificado |
| ADR-029 Variant A eBPF (VBox) | ~10 Mbps / 9,178 pps | DAY 145 — techo virtio SKB mode |
| ADR-029 Variant B libpcap (VBox) | ~19 Mbps / 17,614 pps | DAY 145 — ~2× eBPF en virtio |
| IRP cycle | PASS | NORMAL→ISOLATED→ROLLBACK→NORMAL DAY 142 |
Nota ADR-029 — Failed packets (2,630): Artefacto fijo del pcap CTU-13 Neris. Frames jumbo que superan el MTU 1500 de VirtualBox (
errno=90 EMSGSIZE). Conteo idéntico en los 6 runs — confirma origen en el fichero, no en el pipeline. El sniffer nunca ve esos frames. No son errores del pipeline.
| Environment | Packages | Disk | Compilers |
|---|---|---|---|
| Dev VM | 719 | 5.9 GB | gcc, g++, clang, cmake |
| Hardened VM | 304 | 1.3 GB | NONE ✅ |
| Component | Capabilities |
|---|---|
| sniffer | cap_net_admin,cap_net_raw,cap_bpf,cap_ipc_lock |
| firewall-acl-agent | cap_net_admin |
| etcd-server | cap_ipc_lock (+ LimitMEMLOCK=16M) |
| argus-network-isolate | cap_net_admin (AppArmor enforce — DAY 143) |
| ml-detector, rag-ingester, rag-security | none |
brew install --cask virtualbox
brew install --cask vagrant
xcode-select --installNote:
git clone --recurse-submodulesis required.third_party/llama.cppis a git submodule. Cloning without this flag leaves it empty andrag-securitybuilds without LLM support. Usemake submodule-initto fix an existing clone.
sudo apt-get update
sudo apt-get install -y makeVirtualBox from official repo (apt may be outdated):
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo gpg --dearmor -o /usr/share/keyrings/oracle-virtualbox.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/oracle-virtualbox.gpg] https://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list
sudo apt-get update && sudo apt-get install -y virtualbox-7.0Vagrant:
wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update && sudo apt-get install -y vagrantsudo dnf install -y makeVirtualBox:
sudo dnf install -y kernel-devel kernel-headers dkms
sudo dnf config-manager --add-repo https://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo
sudo dnf install -y VirtualBox-7.0Vagrant:
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo
sudo dnf install -y vagrantNote:
git clone --recurse-submodulesis required.third_party/llama.cppis a git submodule. Cloning without this flag leaves it empty andrag-securitybuilds without LLM support. Usemake submodule-initto fix an existing clone.
Note (RHEL/CentOS): VirtualBox requires Secure Boot to be disabled or the kernel module to be signed. On WSL2, VirtualBox is not supported — use a native Linux install.
⚠️ aRGus NDR only produces Linux binaries (x86-64 and ARM64). There are no Windows binaries and none are planned. The pipeline runs inside a Linux VM — Windows is only the host.
Prerequisites:
winget install Git.Git
winget install Oracle.VirtualBox
winget install Hashicorp.VagrantRun all commands from Git Bash (not CMD or PowerShell — the Makefile requires bash syntax).
⚠️ Hyper-V conflict: Windows 11 enables Hyper-V by default for WSL2. VirtualBox 7.0+ has experimental Hyper-V support but with ~30% performance penalty. You must choose one of:
- Disable Hyper-V (loses WSL2):
bcdedit /set hypervisorlaunchtype off+ reboot
- Use VirtualBox 7.0+ in Hyper-V mode (slower, less stable)
Not tested by the maintainer. If you hit issues on Windows 11, please open an issue — we'll help with the resources we have.
⚠️ Vagrant is required. Native Linux bootstrap without Vagrant is not yet implemented (DEBT-NATIVE-LINUX-BOOTSTRAP-001). Runningmakedirectly on a bare Linux host will fail.
# STEP 1 — Clone with submodules (mandatory — llama.cpp is a git submodule)
git clone --recurse-submodules https://github.com/alonsoir/argus.git
cd argus
# Already cloned without --recurse-submodules? Fix it:
# make submodule-init📦 TinyLlama model (
tinyllama-1.1b-chat-v1.0.Q4_0.gguf, ~700MB) is downloaded automatically duringvagrant up. It is gitignored and never committed to the repo.
# STEP 2 — Start VM and provision all dependencies (~20-30 min first time)
# Downloads TinyLlama, builds llama.cpp, installs FAISS/ONNX/XGBoost/libsodium
make up && make bootstrapvagrant destroy -f && vagrant up && make bootstrap && make test-all¿Por qué EMECAS? El protocolo garantiza reproducibilidad total: cada sesión parte de una VM limpia, claves criptográficas regeneradas, pipeline compilado desde cero y suite de tests completa. Un ❌ en cualquier punto es bloqueante — no se fusiona ni avanza trabajo hasta que
make test-alltermina con exit 0 ypipeline-statusmuestra 6/6 RUNNING. El sniffer puede tardar hasta 4 segundos en estabilizar su sesión tmux tras el arranque; sipipeline-statusmuestra ❌ sniffer inmediatamente después del bootstrap, esperar 5 segundos y repetirmake pipeline-statusantes de escalar.
Lecciones de la sesión de cableado/verificación del bronce. Operacionales, no de diseño.
- Recetas
makedesde el HOST. Los targets del Makefile raíz se ejecutan desde el anfitrión macOS; envolverlos envagrant ssh -crompe convagrant: not found(el binariovagrantno existe dentro del guest). El Makefile ya hacevagrant ssh -cinternamente donde corresponde. - Limpiar bronce SIEMPRE con el ml-detector parado. Secuencia correcta:
tmux kill-session→rmdel CSV →make ml-detector-start. Borrar el fichero en caliente deja un inode huérfano (el proceso sigue escribiendo al inode borrado) → filas perdidas silenciosamente. - El injector necesita
sudo env LD_LIBRARY_PATH=/usr/local/lib. Leeseed.bin(permisos0400 root), por lo que requieresudo; yenv LD_LIBRARY_PATH=/usr/local/libpara localizar las.soinstaladas (libsodium, crypto_provider, etc.).
make hardened-full # destroy → up → provision → build → deploy → check| Task | Result |
|---|---|
| EMECAS verde | ✅ 4 deudas cerradas |
| Experimento Suricata vs aRGus | ✅ 0 alertas Suricata vs F1=0.9985 aRGus |
| Makefile up/halt-argus/suricata | ✅ Topología dual |
| Paper Draft v20 | ✅ §8.13 + Tabla comparativa empírica |
| Task | Result |
|---|---|
| EMECAS ritual | ✅ 65/65 PASSED |
| PCAP relay x86 eBPF (Variant A) | ✅ ~10 Mbps, 320,524 pkts, exit=0 |
| PCAP relay x86 libpcap (Variant B) | ✅ ~19 Mbps, 320,524 pkts, exit=0 |
| Merge feature/variant-b-libpcap → main | ✅ v0.7.0-variant-b |
| Bootstrap múltiple (x86-ebpf / x86-libpcap) | ✅ Makefile actualizado |
| Paper Draft v19 | ✅ §6 ADR-029, §10.9, §11.17, §12 |
- DEBT-IRP-NFTABLES-001 CERRADA — IRP completo, AppArmor 7/7 enforce, 12/12 tests
- DEBT-IRP-SIGCHLD-001 CERRADA — SA_NOCLDWAIT
- DEBT-IRP-AUTOISO-FALSE-001 CERRADA — isolate.json única fuente de verdad
- DEBT-IRP-BACKUP-DIR-001 CERRADA — /run/argus/irp/
- Gate ODR production PASSED — 3 violations reales corregidas bajo -flto
- DEBT-CAPTURE-BACKEND-ISP-001 CERRADA —
CaptureBackend5 métodos puros- DEBT-VARIANT-B-PCAP-IMPL-001 CERRADA — pipeline pcap → proto → LZ4 → ChaCha20 → ZMQ
- DEBT-VARIANT-B-BUFFER-SIZE-001 CERRADA — pcap_create()+pcap_set_buffer_size()
- DEBT-VARIANT-B-MUTEX-001 CERRADA (Nivel 1) — exclusión mutua via tmux
- Suite 9 tests Variant B — 9/9 PASSED
- EMECAS dev + EMECAS hardened PASSED
- capture_backend.hpp · ebpf_backend.hpp/cpp · pcap_backend.hpp/cpp
- main_libpcap.cpp — Variant B sin #ifdef
- sniffer-libpcap compilable y arranca limpio
- make hardened-full EMECAS PASSED
- feature/adr030-variant-a → main MERGEADO
- Tag v0.9.3-day158-variant-a publicado
- arXiv replace v15 → v18 ENVIADO
- AppArmor 6/6 enforce · Falco 10 reglas · cap_bpf · Paper v18
- ADR-040 ML Retraining Contract (8/8, 17 enmiendas)
- ADR-041 Hardware Acceptance Metrics FEDER (8/8)
- Pipeline E2E hardened · check-prod-all PASSED
| Task | Result |
|---|---|
| ICryptoProvider interfaz abstracta (ADR-044) | ✅ SeedFileProvider + VaultProvider + factoría |
| #ifdef ARGUS_VAULT_ENABLED confinado en crypto_provider.cpp | ✅ único punto de decisión |
| libcrypto_provider.so instalada | ✅ /usr/local/lib |
| test_crypto_provider_community 10/10 | ✅ fixture propio sin root |
| etcd-server STEP 0: bootstrap status + fingerprint | ✅ 0079087736d9d62a... |
| Opción B SRP: SeedClient/CryptoTransport ≠ ICryptoProvider | ✅ responsabilidades separadas |
| DEBT-BOOTSTRAP-STATUS-SIGNATURE-001 registrada | ✅ P1 pre-FEDER |
| make test-all verde 55+ tests | ✅ pipeline 6/6 RUNNING |
| ADR-045 aprobado (VaultClient por composición) | ✅ Consejo 8/8 |
| Priority | Task |
|---|---|
| ✅ | DAY 149 — DEBT-PARQUET-SCHEMA-001: CERRADA. Schema Arrow v1.0, 207K filas, 11-12x |
| ✅ | DAY 149 — DEBT-CRYPTO-MATERIAL-STORAGE-001: CERRADA. Vault dev mode + K_pseudo prototipo |
| 🔴 P0 | DAY 150 — EMECAS + provision_crypto.sh + common/vault_client (ADR-044 implementación) |
| 🟡 P1 | DAY 153-155 — DEBT-JENKINS-SEED-DISTRIBUTION-001: CI/CD seed distribution |
| 🟡 P1 | DAY 156+ — feature/adr029-variant-c-arm64: solo si A+B+C verdes |
| 🟡 P1 | Esta semana — Email Dr. Andrés Caro Lindo: iniciar DEBT-LEGAL-DATA-RETENTION-001 |
- DEBT-PENTESTER-LOOP-001 — ACRL completo
- BACKLOG-FEDER-001 — presentación Andrés Caro Lindo
- aRGus-production ARM64
- aRGus-seL4 research branch (post-FEDER, equipo especializado)
- ✅ DAY 111: arXiv:2604.04952 PUBLICADO 🎉
- ✅ DAY 113: ADR-025 MERGED — v0.3.0-plugin-integrity 🎉
- ✅ DAY 118: PHASE 3 COMPLETADA — v0.4.0 🎉
- ✅ DAY 122: PHASE 4 COMPLETADA — v0.5.0-preproduction 🎉
- ✅ DAY 124: ADR-037 MERGED — v0.9.3-day158 🎉
- ✅ DAY 129: CWE-78 CERRADO — execv() sin shell 🎉
- ✅ DAY 130: REGLA EMECAS · libFuzzer 2.4M runs 🎉
- ✅ DAY 133: ADR-030 Variant A — cap_bpf · AppArmor 6/6 · Falco 10 reglas 🎉
- ✅ DAY 134: ADR-040 (8/8, 17 enmiendas) · ADR-041 FEDER HW Metrics (8/8) 🎉
- ✅ DAY 136: v0.9.3-day158-variant-a · merge main 🎉
- ✅ DAY 137: feature/variant-b-libpcap · sniffer-libpcap compilable · KISS 🎉
- ✅ DAY 138: ISP cerrado · pipeline Variant B completo · 8/8 tests · Consejo 8/8 🎉
- ✅ DAY 140: 192→0 warnings · -Werror activo · ODR limpio 🎉
- ✅ DAY 141: DEBT-VARIANT-B-CONFIG-001 · sniffer-libpcap.json · emails FEDER 🎉
- ✅ DAY 142: IRP pasos 1-6 · buffer=8MB · mutex Nivel 1 · Consejo 8/8 🎉
- ✅ DAY 143: DEBT-IRP-NFTABLES-001 sesión 3/3 CERRADA — IRP completo · AppArmor 7/7 · 12 tests 🎉
- ✅ DAY 144: 3 deudas P0 IRP cerradas · Gate ODR production · 65/65 tests 🎉
- ✅ DAY 145: ADR-029 Variant A vs B x86 · libpcap ~2× eBPF en virtio · Bootstrap múltiple · Paper v19 · v0.7.0-variant-b 🎉
- ✅ DAY 146: Experimento Suricata comparativo · 0 alertas ET Open vs F1=0.9985 aRGus · Paper v20 §8.13 · v0.7.1-day146 🎉
- ✅ DAY 147: Experimento tres paradigmas (Suricata+Zeek+aRGus) · Paper v22 §8.14 · HTTP C2 hallazgo · weird.log behavioral profile · v0.7.1-day147 🎉
- ✅ DAY 147: ADR-0043 v4 ACEPTADO — Memoria Episódica Distribuida, Consejo 8/8, 4 versiones 🎉
- ✅ DAY 149: Schema Parquet Arrow v1.0 · Vault CI/CD pipeline · ADR-044 · Ansible+Jinja2 · 5 PRs · v0.7.2-day149 🎉
- ✅ DAY 150: ADR-044 implementación completa · provision_crypto.sh · vault_client C++20 · Jenkinsfile Provision Crypto · EMECAS verde 🎉
- ✅ DAY 154: ADR-045 VaultClient decomposition · DEBT-FIREWALL-AUTONOMY-MODE-001 CERRADA · 48/48 tests · v0.8.0-adr045 🎉
- ✅ DAY 155: DEBT-FIREWALL-DENY-SELECTIVE-001 · DEBT-AUTONOMY-ZMQ-EVENTS-001 · BACKLOG-ZMQ-TUNING-001 · 49/49 tests · EMECAS HARDENED PASSED · v0.9.0-day155 🎉
- ✅ DAY 163: FASE 0+1 crypto lifecycle · Modelo B vendor.key efímero · CryptoProviderHandle RCU · ADR-045 v2 (Consejo 8/8) · 9/9 tests 🎉
- ✅ DAY 161: DEBT-WIRE-PROTOCOL-TEST-001 · Jenkinsfile.dev+prod · test-e2e-live delta · Consejo 8/8 · v0.9.5-day161 (pendiente) 🎉
- ✅ DAY 160: DEBT-ENTERPRISE-PLUGIN-001 · libvault_provider.so 6/6 tests · Jenkins 2.555.2 + Vault v2.0.1 · ADR-048 Dataset Production Roadmap definido · v0.9.4-day160 🎉
- ✅ DAY 157: 4 deudas cerradas · Consejo 8/8 · Staleness guard · Keypair lifecycle prod · Bootstrap firmado · EMECAS VERDE · v0.9.2-day157 🎉
- ✅ DAY 156: DEBT-AUTONOMY-CRYPTO-INTEGRATION-001 · Test B 7/7 + Test A 4/4 · Fix ZMQ slow joiner · EMECAS VERDE 50/50 · v0.9.1-day156 🎉
- ✅ DAY 151: ICryptoProvider + SeedFileProvider + VaultProvider · etcd-server STEP 0 · ADR-045 aprobado · 55+ tests verdes · v0.8.0-day151 🎉
- ✅ DAY 148: Suricata offline irrefutable · Paper v23 · arXiv replace v3 · DEBT-IRP-FLOAT-TYPES-001 cerrada · v0.7.1-day148 🎉
- ✅ DAY 164: FASE 2a+2b enterprise · HttpEtcdRegistrar + CryptoEpochCoordinator · 10/10 tests 🎉
- ✅ DAY 165: FASE 3 wire header epoch_id · 13/13 tests · EMECAS++ OSS verde · Consejo 8/8 protocolo 3 actos 🎉
- ✅ DAY 166: EMECAS++ 3 actos verdes · merge enterprise a main · VaultProvider caché RCU confirmado · vault-fault-inject PASSED · Zero downtime demostrado · Tag v1.0.0-day166 🎉
- ✅ DAY 167: DEBT-ARGUSPP-NTP-001 (P0) · correlation-engine scaffold ADR-048 F2 · BACKLOG-CI-ENTERPRISE-001 Jenkins gate · merge main 7b45feca 🎉
- ✅ DAY 168: Vagrantfile multi-VM Suricata 7.0.10 + Zeek 8.2.0 + Wazuh 4.x · community-id Suricata/Zeek · 3 reglas permanentes · merge main 21642e87 🎉
- ✅ DAY 169: Día de arquitectura · ADR-046 v4 + AdapterSpec v1 · separación de planos · ADR-050 pendiente · community_id nativo aRGus P0 abierto 🏛️
- ✅ DAY 171: Cross-check E2E community_id 3 ventanas VERDE · paridad operacional demostrada · helper observable + verificador + acceptance_criteria.md congelado (Consejo 8/8) · DEBT-COUNTER-DUMP-001 abierta 🎉
- ✅ DAY 170: community_id cross-sensor sellado (aRGus+Zeek+Suricata, seed 0, vs oráculo) · de-dup BACKLOG · Consejo 8/8 P1/P2/P3 · ADR-051/052 pendientes 🎉
- 🔜 DAY 172: volcado contadores aRGus a fichero parseable (DEBT-COUNTER-DUMP-001) + ADR-051/052 borrador + DEBT-NEO4J-FLOW-KEY-001 (esquema Neo4j) + ADR-050 MITRE borrador + DEBT-ARGUSPP-SURICATA-001 (eve.json → correlation-engine)
- ✅ DAY 173: ADR-052 v3.2 RATIFICADA (Consejo 8/8) — Multi-node Flow Identity & Host↔Net · DEBTs P0→P3 de identidad de flujo · ADR-053 stub (JA3/JA4/BGP) · desbloquea DEBT-NEO4J-FLOW-KEY-001 🏛️
- ✅ DAY 191: H-2 NÚCLEO 2 CERRADO — comment de add_batch rechaza \n/"/\ (CWE-93) · is_valid_comment allowlist · 79/79 sin root + canario 7/7 sudo · H-2 COMPLETA 🎉
- ✅ DAY 190: Auditoría de deuda de seguridad — CWE-78 autonomy.whitelist_cidrs CERRADO (parse_autonomy valida CIDR fail-fast) · H-2 NÚCLEO 1+3 (DAY 189) · is_valid_ip_cidr extraído · 73/73 tests · nosemgrep interino justificado · PR #103 → main 395ee014 🎉
- ✅ DAY 182: Smoke B1 ejecutado — D1 (un grafo) + D2 (Kuzu stock, Vela NO) RESUELTAS POR MEDICIÓN · UNWIND batch ×55–61 · Fase 0 grafo verde · ADR-057 v2 · graph-engine como componente 🎉
Claude (Anthropic) · Grok (xAI) · ChatGPT (OpenAI) · DeepSeek · Qwen (Alibaba) · Gemini (Google) · Kimi (Moonshot) · Mistral
Metodología: desacuerdo estructurado. Documentado en §6 del preprint.
make hardened-full # EMECAS sagrado — destroy → up → provision → build → deploy → check
make hardened-redeploy # iteración rápida sin destroy
make prod-deploy-seeds # deploy seeds explícito (nunca en EMECAS)
make check-prod-all # 5/5 gates: BSR + AppArmor + cap_bpf + permissions + FalcoMIT License — See LICENSE
Via Appia Quality 🏛️ — Built to last decades.