3e7b3adc16
Bug: Echo (gx-cli en WSL) recibia "disk I/O error" al INSERT en la tabla `agent_jobs` de graph_explorer.db. Causa: graph_explorer.exe mantiene esa BD abierta con journal_mode=WAL desde Windows, y SQLite WAL exige mmap del .shm compartido entre procesos. Cuando un escritor accede via /mnt/c (9p) y el otro nativo NTFS, ese mmap falla. El proyecto ya habia resuelto este patron antes: el contador de mutaciones (.mutations.marker) usa fichero plano en vez de SQL por exactamente la misma razon. agent_jobs era la unica cola que se quedo en SQLite — momento de aplicar el mismo fix. Cambios: * gx-cli cmd_enricher_run: en lugar de INSERT, escribe `<app_dir>/agent_jobs_queue/<req_id>.json` con el payload del job. Atomic write (tmp + rename, atomico tanto en NTFS como en 9p). * main.cpp polling: en lugar de SELECT/DELETE sobre agent_jobs, escanea ese directorio cada frame, lee cada JSON via json_extract (sqlite3 in-memory, sin tocar archivos en disco), llama jobs_submit, y borra el fichero. Throttle a 8 jobs por frame igual que antes. * main.cpp: anyade <filesystem> y <fstream>. * tests/test_gx_cli.py: 5 tests nuevos en TestCliEnricherRun: - escribe fichero JSON con req_id como nombre - NO crea tabla agent_jobs en graph_explorer.db (regresion) - errores claros si enricher o nodo no existen - no quedan .tmp tras encolado exitoso WSL 79 / Windows 68 + 11 skipped.