← volver al blog

El costo del contexto: cómo un cambio de precios me llevó a meter embeddings y grafos estructurales en mi CLI de desarrollo

Tengo un proyecto que empecé en 2020: IUNCI, un POS e inventario Local-First para Pymes latinoamericanas. Con el tiempo superó las 40 tablas, múltiples servicios distribuidos entre Windows y WSL, y una migración arquitectónica que terminó siendo el catalizador de todo lo que vino después.

La historia real de void-stack — de simple lanzador de proyectos a GraphRAG local en dos meses.


Tengo un proyecto que empecé en 2020: IUNCI, un POS e inventario Local-First para Pymes latinoamericanas. Con el tiempo superó las 40 tablas, múltiples servicios distribuidos entre Windows y WSL, y una migración arquitectónica que terminó siendo el catalizador de todo lo que vino después.

Pero esta historia no es sobre IUNCI. Es sobre el momento en que los límites de contexto dejaron de ser un problema técnico y se convirtieron en un problema económico.


El punto de partida: solo quería un lanzador de proyectos

En marzo de 2026 tenía un problema concreto: varios proyectos activos, todos con stacks distintos. Para IUNCI solo, tenía que recordar qué servicio iba en WSL y cuál en Windows, qué puerto usaba cada uno, y en qué orden levantarlos. Multiplica eso por seis proyectos paralelos.

La primera versión de void-stack fue exactamente eso — un lanzador. Un solo comando para arrancar todo. void start, void stop, void status. El ejecutable pesaba 5MB y estaba satisfecho con eso.


El punto de quiebre: cuando el contexto se volvió caro

Al principio trabajaba con la IA de forma directa: copiaba y pegaba en el chat cuando era necesario. Funcionaba porque las sesiones de Claude eran generosas.

Cuando Anthropic ajustó los costos y los límites, eso cambió. De repente, orientar a la IA en un proyecto grande costaba 35% del contexto disponible antes de llegar al problema real. No era un problema de capacidad — era un problema económico. Cada sesión empezaba en déficit.

Ahí dije: tengo que hacer algo.

La búsqueda semántica existe en Python — hay herramientas que hacen esto. Pero quería algo completamente local, sin enviar código fuente a servicios externos y sin depender de costos por consulta. Y ya tenía void-stack en Rust. No quería otra herramienta separada.


La evolución: embeddings y búsqueda semántica local

La v0.23.0 salió el 7 de abril de 2026 — un mes después del lanzador original. Agregó el índice semántico completo: BAAI/bge-small-en-v1.5 corriendo localmente con fastembed, HNSW para las búsquedas, y .claudeignore para no indexar lo que no tiene valor.

El resultado medido después de 135 búsquedas reales en mi propio codebase: 97.5% menos tokens que leer archivos directamente.

¿Cómo se mide? void-stack registra los bytes de los chunks retornados versus los bytes de todos los archivos fuente únicos relevantes, dividido por 4 para estimar tokens. El comando void stats muestra el ahorro acumulado por proyecto y operación.

# El problema: orientar a la IA costaba 35% del contexto en cada sesión
# La solución con void-stack:

void search iunci "sync falla cuando hay conflicto offline"

# Resultado: los 5 chunks más relevantes del sistema de sync
# y los repositorios involucrados — sin explorar el resto del proyecto

Cruzando datos: del concepto al grafo estructural (GraphRAG)

Poco después, una publicación en LinkedIn me mostró code-review-graph. Lo descargué, lo analicé con Claude usando void-stack para entender la arquitectura, y vi que hacía algo que yo necesitaba: construir un grafo de llamadas con Tree-sitter. Entendí qué problema resolvía, extraje las ideas que me servían e implementé una versión nativa en Rust dentro de void-stack.

Eso faltaba. La búsqueda semántica te dice qué es conceptualmente similar. El grafo estructural te dice qué se rompe si cambias esto. Son complementarios.

Cómo GraphRAG combina búsqueda semántica y estructural en void-stack Tu proyecto alimenta una búsqueda semántica (¿qué es similar?) y un grafo estructural (¿qué se rompe?). GraphRAG fusiona ambos en un ranking combinado y entrega solo los chunks relevantes a Claude Code y Claude Desktop. Tu proyecto Búsqueda semántica BAAI embeddings · HNSW ¿qué es similar? Grafo estructural Tree-sitter · BFS SQLite ¿qué se rompe? GraphRAG ranking combinado Claude Code / Claude Desktop recibe solo los chunks relevantes
GraphRAG en void-stack — 97.5% menos tokens, medido sobre 135 búsquedas reales.

La v0.23.5 (13 de abril) agregó el structural graph: Tree-sitter para 10 lenguajes, BFS bidireccional en SQLite para blast radius. La v0.26.0 (7 de mayo) los fusionó en GraphRAG. Tras varias pruebas sobre mi propio codebase, una ponderación 60/40 entre señal semántica y estructural produjo los resultados más útiles — pero la estrategia exacta de ranking merece un artículo aparte.

El README cita a code-review-graph explícitamente: “Structural analysis inspired by code-review-graph (MIT) — AST node mappings and BFS query logic reimplemented natively in Rust.”

Así se ve una consulta real de GraphRAG sobre IUNCI:

$ void graphrag iunci "modificar sincronización offline"

Semántico (3 seeds encontrados):
  sync_repository_registry.dart    [score: 0.94]
  hybrid_inventory_repository.dart [score: 0.89]
  sync_status_notifier.dart        [score: 0.82]

Estructural (BFS depth 2):
 HybridInventoryRepository llama a SyncRepositoryRegistry
 SyncRepositoryRegistry llama a HybridSalesRepository
 SyncRepositoryRegistry llama a HybridSupplierRepository

Total: 5 chunks · ~2,800 tokens
vs explorar 48 archivos relacionados · ~96,000 tokens estimados

El flujo de trabajo: dirigir, no escribir

No escribí todo esto línea por línea. Lo dirigí.

Mi ciclo real:

  1. Identifico el problema y diseño la solución
  2. Claude Desktop lo analiza y genera el prompt de implementación
  3. Claude Code implementa, escribe los tests, hace el commit
  4. Yo pruebo en hardware real y reporto lo que no funciona
  5. Volvemos al paso 1

Aprender Rust mientras construyes un CLI con backend SQLite y FastEmbed local suena a receta para el desastre. Pero delegar la implementación pesada y el tipado estricto a la IA, mientras te enfocas en la arquitectura y el comportamiento del sistema, acelera la curva de aprendizaje de forma absurda.

No era mi primer encuentro con Rust. Lo había usado en 2021 trabajando con smart contracts en Solana para un proyecto de realidad virtual. Un curso básico de Microsoft en 2024 refrescó lo que ya sabía. Pero void-stack fue donde realmente lo usé en serio: aprendiendo lo que necesitaba mientras construía lo que necesitaba.

Ese proceso produjo 7 crates, 1010 tests, 80.5% de cobertura, y 4 interfaces (CLI, TUI, app de escritorio, servidor MCP) — todo en aproximadamente dos meses. Todo para resolver un problema que originalmente parecía mucho más pequeño: el costo de explicarle un proyecto grande a una IA.


El impacto real en IUNCI

Con void-stack, la migración que llevaba meses bloqueada empezó a avanzar de forma constante. Cosas que antes tomaban días tomaron horas. La IA tiene el contexto exacto del estado de cada módulo — qué está migrado, qué tiene deuda técnica pendiente — y da diagnósticos precisos desde la primera respuesta, sin reconstruir el proyecto desde cero en cada sesión.


Conclusión

Empecé construyendo un lanzador para no recordar comandos. Terminé construyendo una forma de reducir el costo del contexto en proyectos que ya no cabían en una ventana de chat.

Disponible en void-stack.dev y en GitHub.


Sobre el autor

Ingeniero de sistemas, Venezuela. Construyo herramientas para desarrolladores y productos para el mercado LATAM.

void-stack.dev · github.com/mague