Dashboard de ingeniería · arquitectura · estándares ideales · roadmap a la perfección
TUNIX es un solo agente con 3 modos:
Capa de tools agregadoras pre-cocinadas que Gemini llama directo sin delegar. Permiten respuestas instantáneas a preguntas frecuentes.
| Etapa | Cómo funciona | Latencia | Frescura | Estado |
|---|---|---|---|---|
| 1. Promise.all paralelo | 1 tool hace N queries SQL en paralelo, devuelve JSON combinado | 300-500ms | Real-time | ACTIVA |
| 2. Materialized snapshots | Cron actualiza tabla forge_instant_snapshots cada 5min, tool solo SELECT | 50-100ms | 5min stale OK | PRÓXIMA |
| 3. Pre-cocción narrativa | Sonnet/Haiku genera texto pre-armado cada hora, Gemini solo lee | 50-100ms | 1h stale OK | FUTURO |
| Tool | Qué devuelve | Triggers de voz |
|---|---|---|
sync_forge_now |
Tareas pendientes + reuniones 48h + audios WSP + agentes corriendo + estado emocional + recent talks | "qué hay ahora", "dame el estado", "ponte al día", "qué pasa" |
briefing_today_snapshot — agenda + reuniones + reminders + clima + estado emocional en 1 fraseholdings_health_snapshot — KPIs Emabel + TensorMed (clientes activos, propuestas, MRR)daily_focus_snapshot — top 3 prioridades del día con contexto recientewsp_pulse_snapshot — actividad WSP 24h por brand (in/out/urgentes)Tools que Gemini puede invocar SIN delegar a Haiku/Sonnet/Opus. Definidas en api/gemini-live-config.js constante GEMINI_DIRECT_WHITELIST.
| Tool | Tipo | Latencia |
|---|---|---|
query_reminders | cero-args | ~200ms |
query_meetings_today | cero-args | ~200ms |
query_meetings_upcoming | cero-args | ~200ms |
query_tasks | cero-args | ~200ms |
query_recent_wsp_audios | cero-args | ~200ms |
recent_channel_events | cero-args | ~300ms |
calendar_today | cero-args | ~700ms |
check_code_session | cero-args | ~150ms |
sync_forge_now INSTANT | cero-args | ~500ms |
recall(query, hours_back?) | 1-2 args | ~1.5s |
memory_librarian(query) | 1 arg | ~6s |
quick_via_haiku(task) | brain delegate | ~3-8s |
quick_via_sonnet(task) | brain delegate | ~8-15s |
delegate_to_claude_max(task) | brain delegate | ~30-90s |
run_in_background(task, ...) | bg async | ~100ms ack |
compare_models(task, models) | Sonnet+Opus // | ~max(s,o) |
publish_plan | UI | ~50ms |
update_plan_step | UI | ~50ms |
send_to_code | puente | ~200ms |
recent_talk_sessions | puente | ~150ms |
respond_to_approval | approval | ~200ms |
Cuando Gemini delega a quick_via_haiku o quick_via_sonnet, el backend intercepta primero con regex matching y ejecuta la tool Forge ANTES de llamar al modelo. El resultado va cocinado en el prompt. Modelo solo verbaliza.
drive_search, drive_list_folder, drive_readgmail_search, gmail_readrecall, memory_librarian, deep_search, forge_global_search, search_entities, search_talk_historyquery_reminders, query_meetings_today, query_tasks| Capa | Tool | Latencia | Cuándo |
|---|---|---|---|
| 1. Auto-recencia | (inyectada al prompt) | 0ms | Índice 5 sesiones 72h, siempre disponible |
| 2. Vector directo | recall(query, hours_back?) | ~1.5s | "qué te dije sobre X", "te acuerdas cuando…" |
| 3. Síntesis Sonnet | memory_librarian(query) | ~6s | "hazme un resumen de todo lo de X esta semana" |
Estática (canon documental):
read_memory(slug) — lee memoria específica de forge_memorylist_memories() — lista todas disponiblesrecall_lessons(query) — lecciones consolidadas por REM agent nocturnoforge_global_search(query) — full-text 30+ tablas con embeddingsCatálogo consolidado de tools que Sonnet/Haiku/Opus pueden invocar nativo via MCP server stdio (scripts/tunix-claude-agent/forge-tools-mcp.mjs). Refactorizado 64→30 tras análisis Opus 26-may.
| Familia | Tools | Args clave |
|---|---|---|
| Memoria | memory_search, memory_read | mode: recent|synthesis|entities|lessons|broad|wsp |
| Queries | query_forge_data | type: tasks|reminders|meetings_today|meetings_upcoming|wsp_audios |
| Calendar | calendar_query, create, update, delete | range: today|week|month |
| Gmail | gmail_search, read, send, modify | q, id, body |
| Drive | drive_search, drive_read | text, folders_only, id |
| Acciones | create_task, mark_task_done, create_reminder, cancel_meeting, save_person_note | title, when_text, etc |
| WSP | send_wsp_text, send_wsp_audio | DESTRUCTIVE confirmar siempre |
| Brain delegate | delegate_to_brain | model: haiku|sonnet|opus |
| Sistema | sync_forge_now, recent_pc_activity, recent_channel_events, check_code_session, send_to_code | cero o pocos args |
| Background | run_in_background, respond_to_approval, tunix_self_improve | task, request_token |
| PC | delegate_to_pc | task |
Para que una tool nueva entre al whitelist directo Gemini, debe cumplir TODOS los 7 criterios:
Si una tool falla un criterio → delegar a Sonnet/Opus/Haiku.
Documentado en _core/feedback_gemini_delegate_framework.md.
Decisión 25-may: aprobaciones destructivas NUNCA por voz (riesgo "sí" accidental). Siempre por botón manual rojo en pantalla.
tunix_approval_requests (UUID, action, why, plan, status, TTL 5min)tunix_approval_decide(token, approved)/api/tunix-approvalmetadata.kind=approval_request → muestra panel rojo en /talkrespond_to_approval(request_token, approved) en whitelist GeminiFlujo típico:
Búnker: bunker_request_approval.sh "git push --force" "fix bug" "plan"
↓ insert en tunix_bridge_queue
TUNIX Talk: voz Aoede lee el pedido informativo + muestra panel rojo
↓ Patricio tap APROBAR
respond_to_approval → tunix_approval_decide → script Búnker exit 0
Búnker hace el push.
Tabla forge_tunix_tool_audit + columna path registra cómo se ejecutó cada tool:
| Path | Significado |
|---|---|
direct | Gemini whitelist directo (~200ms-2s) |
bypass | Pre-execute pattern match → cocido para Haiku/Sonnet (~3-8s) |
mcp | SDK Anthropic loop con MCP forge (~8-30s) |
cache | Cache hit (CACHEABLE_TOOLS, TTL variable) |
Query útil para análisis:
SELECT path, count(*) AS calls, ROUND(AVG(duration_ms)::numeric, 0) AS avg_ms FROM forge_tunix_tool_audit WHERE created_at > now() - interval '7 days' GROUP BY path ORDER BY calls DESC;
bypass domina = bypass patterns valen oro. Si mcp domina = tools complejas, considerar Tool Retrieval (Etapa 3). Si direct domina = filosofía instant funciona.
Comparación brutal honesta por área. Objetivo: que TUNIX trabaje en cada dimensión al estándar "espectacular" sin latencia. Verde = en el ideal · Amarillo = aceptable, mejorable · Rojo = gap importante.
| Tipo respuesta | Ideal | Actual | Estado |
|---|---|---|---|
| Identidad/quién soy | <1s | ~1-2s | OK |
| Snapshot Instant Layer | <500ms | ~500ms | OK |
| Queries datos cero-args | <300ms | ~200ms | OK |
| Memoria capa 2 (recall) | <1.5s | ~1.5s | OK |
| Memoria capa 3 (librarian) | <6s | ~6s | OK |
| Bypass quick_via_haiku | <5s | ~8-15s | MEJORABLE |
| Análisis profundo Opus | 30-60s | ~30-90s | VARIABLE |
| Pre-cocción narrativa (futuro) | <100ms | N/A | NO IMPLEMENTADO |
| Capa | Ideal | Actual | Estado |
|---|---|---|---|
| Gemini whitelist directo | 25-30 max | 21 | EN MARGEN |
| Instant Layer tools | 8-12 | 1 (sync_forge_now) | GAP IMPORTANTE |
| Bypass pre-execute patterns | 25-30 | 15 | CRECER |
| MCP forge Búnker consolidado | 30-35 | 30 | PERFECTO |
| Materialized snapshots (cron) | 10-15 | 0 | NO IMPLEMENTADO |
| Pre-cocción narrativa Sonnet | 3-5 | 0 | NO IMPLEMENTADO |
| Tools sin uso 30d | 0 | 0 (post limpieza) | LIMPIO |
| Métrica | Ideal | Actual | Estado |
|---|---|---|---|
| Distribución path (direct/bypass/mcp/cache) | 40/30/20/10 | Datos en construcción (1-2 sem) | RECIÉN MIDIENDO |
| Cache hit rate tools cacheables | >50% | ~25% observado | SUBIR |
| Fail rate por tool | <5% | 3 tools post-fix (verificar 7d) | A MEDIR |
| P50 latencia turno completo | <1s | No medido | FALTA INSTRUMENTAR |
| P95 latencia turno completo | <8s | No medido | FALTA INSTRUMENTAR |
| Tokens promedio/turno | <3K | No medido | FALTA |
| Área | Ideal | Actual | Estado |
|---|---|---|---|
| Capa 1 (recencia) en system prompt | Siempre cargada | ✅ cargada 5 sesiones 72h | OK |
| Capa 2 (recall) latencia | <1.5s | ~1.5s | OK |
| Capa 3 (librarian) latencia | <6s | ~6s | OK |
| Embeddings actualizados post-turn | <1h | Background, ~minutos | OK |
| forge_memory ↔ _core/ sync | Continuo | Manual al guardar | MEJORABLE |
| Feature | Ideal | Actual | Estado |
|---|---|---|---|
| Diarización por nombre (no Speaker N) | >85% accuracy | 0% (voice profiles vacíos) | ENTRENAR VOZ |
| Auto-save cada 60s + beforeunload | Funcional | ✅ deployado | OK |
| Frase puente (capa 1) | <2s | ~2s | OK |
| Sonnet primera lectura (capa 2) | <10s | ~8-15s | VARIABLE |
| Opus profundo (capa 3) | 60-90s | ~60-90s | OK |
| Modo background (bg) | Funcional | ✅ con wake phrases | OK |
| Feature | Ideal | Actual | Estado |
|---|---|---|---|
| Celu bloqueado + BT funciona | >30min sin cortes | ✅ Patricio confirmó 26-may | OK |
| APK con WakeLock+WifiLock nativo | Refuerzo extra | Frontend OK, APK rebuild pendiente | BONUS PENDIENTE |
| WebView mic estable | 0 NotReadableError | ✅ bypass ForgeRecording plugin | OK |
| Feature | Ideal | Actual | Estado |
|---|---|---|---|
| Voice profile Patricio entrenado | 60s muestra limpia | 0 (sin entrenar) | P0 |
| Voice profiles 3-5 contactos clave | Sebastián, Nicolás, etc | 0 | PRÓXIMO |
| WeSpeaker model on-device | Cargado al activar reunión | ✅ código deployado | OK |
| Feature | Ideal | Actual | Estado |
|---|---|---|---|
| MCP forge custom visible al SDK | 64 tools listadas | ✅ 64 forge_match (canUseTool) | RESUELTO |
| OAuth Max activo (no 401) | Sin expiración | ✅ activo | OK |
| Container always-on | Restart auto | ✅ docker restart=always | OK |
| MCPs nativos (Supabase, GitHub, etc) | 5+ activos | ✅ 6 connected | OK |
forge_instant_snapshots(slug, data, refreshed_at, ttl_min)holdings_health_snapshot (KPIs Emabel + TensorMed)p50_ms, p95_ms a tablas o vista materializada.Queries SQL útiles para revisar el pulso del sistema. Correlas semanalmente en Supabase SQL Editor.
SELECT path, count(*) AS calls, ROUND(AVG(duration_ms)::numeric, 0) AS avg_ms, ROUND(percentile_cont(0.5) WITHIN GROUP (ORDER BY duration_ms)::numeric, 0) AS p50_ms, ROUND(percentile_cont(0.95) WITHIN GROUP (ORDER BY duration_ms)::numeric, 0) AS p95_ms, ROUND(100.0 * count(*) FILTER (WHERE success=false) / count(*), 1) AS fail_pct FROM forge_tunix_tool_audit WHERE created_at > now() - interval '7 days' GROUP BY path ORDER BY calls DESC;
SELECT tool_name, count(*) AS calls, ROUND(AVG(duration_ms)::numeric, 0) AS avg_ms, count(*) FILTER (WHERE path='direct') AS direct, count(*) FILTER (WHERE path='bypass') AS bypass, count(*) FILTER (WHERE path='mcp') AS mcp, count(*) FILTER (WHERE path='cache') AS cache FROM forge_tunix_tool_audit WHERE created_at > now() - interval '7 days' GROUP BY tool_name ORDER BY calls DESC LIMIT 20;
SELECT tool_name, count(*) AS calls, count(*) FILTER (WHERE success=false) AS fails, ROUND(100.0 * count(*) FILTER (WHERE success=false) / count(*), 1) AS fail_pct FROM forge_tunix_tool_audit WHERE created_at > now() - interval '7 days' GROUP BY tool_name HAVING count(*) FILTER (WHERE success=false) > 0 AND count(*) >= 3 ORDER BY fail_pct DESC;
SELECT tool_name, count(*) FILTER (WHERE path='cache') AS hits, count(*) FILTER (WHERE path!='cache') AS misses, ROUND(100.0 * count(*) FILTER (WHERE path='cache') / count(*), 1) AS hit_pct FROM forge_tunix_tool_audit WHERE created_at > now() - interval '7 days' GROUP BY tool_name HAVING count(*) > 5 ORDER BY hit_pct DESC;
SELECT
CASE
WHEN tool_name = 'quick_via_haiku' THEN 'Haiku'
WHEN tool_name = 'quick_via_sonnet' THEN 'Sonnet'
WHEN tool_name = 'delegate_to_claude_max' THEN 'Opus'
ELSE 'Other'
END AS model,
count(*) AS calls,
ROUND(AVG(duration_ms)::numeric, 0) AS avg_ms,
ROUND(percentile_cont(0.95) WITHIN GROUP (ORDER BY duration_ms)::numeric, 0) AS p95_ms
FROM forge_tunix_tool_audit
WHERE created_at > now() - interval '7 days'
AND tool_name IN ('quick_via_haiku','quick_via_sonnet','delegate_to_claude_max')
GROUP BY model ORDER BY calls DESC;
bypass, considerá agregarla al whitelist directo o crear un Instant Snapshot que la cubra. Los 7 criterios de framework aplican.
Cosas que romperían la eficiencia del sistema. Revisar antes de cualquier cambio estructural.
| Anti-patrón | Por qué es malo | Qué hacer en cambio |
|---|---|---|
| Agregar tools al whitelist Gemini "por las dudas" | Cada tool +200 tokens system prompt. Gemini se confunde eligiendo entre muchas. | Aplicar los 7 criterios estrictos. Si dudás, NO escalar. |
| Flexibilizar Regla #0 con frases vagas ("usá tu criterio") | Modelo nunca usa criterio bien — delega incorrectamente o resuelve directo cuando no debería. | Excepciones nominales con triggers exactos (ej. "qué hablamos de X → recall"). |
| Hacer tools write (create/delete) en Instant Layer | Instant Layer es solo lectura por diseño. Writes requieren confirmación, no instant. | Writes siempre via wrapper Sonnet/Haiku + approvals si tercero. |
| No instrumentar telemetría path | Optimizar a ciegas. Decisiones basadas en intuición no en data. | Ya activo. Correr queries de sección 13 semanal. |
| Pasar de 30 tools en Gemini whitelist | Catálogo >7K tokens → latencia primer token sube exponencial. | Si llegás a 30, consolidá familias o pasá tools al bypass. |
| Llamar bypassPermissions en SDK Claude Code corriendo root | SDK lo bloquea con exit code 1 (caso real 26-may). | Usar canUseTool callback en su lugar (ya implementado). |
| Push notifs con curl directo en bash Windows | Rompe UTF-8 (tildes/ñ → ?). | SIEMPRE python scripts/forge_push.py. |
| Usar argentinismos en regex de detección de frases | Patricio habla chileno, no coincide con "resumime" sino con "hazme un resumen". | Regex con vocabulario chileno + argentinismos como fallback compat. |
Modificar SWARM V10 sin safe_put_workflow |
Sin backup auto + verify, puedes romper producción sin rollback. | SIEMPRE scripts/lib/n8n_safe.py con verify_callback. |
| Inyectar audio Gemini Live en modo reunión LISTEN | Gemini interpreta + responde rompiendo el prompt "callate". | NO enviar audio a Gemini en LISTEN/THINK/SPEAK (solo a Deepgram). |
| Aprobar destructivos por voz | "Sí" accidental puede disparar git push --force u otra acción irreversible. | SIEMPRE botón manual rojo en pantalla. Voz solo informa. |
Cálculo automático con tu data real de forge_tunix_talk_sessions + forge_tunix_tool_audit. Pricing 2026 verificable.
OpenAI cobra audio nativo a precio premium (procesa speech-to-speech end-to-end). Gemini Live Native Audio es misma arquitectura speech-to-speech pero ~20x más barato porque Google está agresivo capturando market share contra OpenAI.
| Modelo | Input audio /M | Output audio /M | Tu uso 30d aprox |
|---|---|---|---|
| Gemini 2.5 Flash Live Native Audio ✅ actual | $0.50 | $2.00 | ~$18/mes |
| OpenAI gpt-realtime-mini (Cedar voice, lo que usabas) | $10 | $20 | ~$213/mes |
| OpenAI gpt-realtime (premium) | $32 | $64 | ~$680/mes |
| Componente | Costo | Notas |
|---|---|---|
| Gemini Live (voz) | ~$18 | Variable según uso real |
| Anthropic Claude Pro (OAuth Max) | $100 | Plan Pro · Sonnet+Haiku+Opus con cuota generosa |
| Vercel Pro | $20 | Functions + bandwidth |
| Supabase | $0 | Plan FREE (500MB DB, 50K MAU, suficiente hoy) |
| VPS Bunker MK4 | $20 | Self-hosted container always-on |
| Embeddings Gemini 768d | $0 | Dentro free tier |
| Google APIs (Gmail/Calendar/Drive) | $0 | Cuenta personal, free |
| Deepgram (diarización reuniones) | ~$1-3 | Solo cuando uses Modo Reunión |
| TOTAL | ~$158/mes | Stack completo |
| Mensual | Anualizado | |
|---|---|---|
| vs OpenAI mini (lo que usabas) | $195/mes | ~$2.340/año |
| vs OpenAI premium (si hubieras escalado) | $662/mes | ~$7.944/año |
| Escenario | Voz Gemini | Voz OpenAI mini | Voz OpenAI premium | Ahorro vs premium |
|---|---|---|---|---|
| Actual (5h/mes) | $18 | $213 | $680 | $662/mes |
| 3x más (15h/mes) | $54 | $639 | $2.040 | $1.986/mes |
| 5x más (25h/mes) | $90 | $1.065 | $3.400 | $3.310/mes |
| 10x más (50h/mes) | $180 | $2.130 | $6.800 | $6.620/mes |
-- Costo Gemini Live aproximado últimos 30d SELECT count(*) AS sessions, ROUND(SUM(duration_sec)/60.0, 1) AS minutos_voz, ROUND(SUM(duration_sec) * 100 * 0.50 / 1e6, 2) AS cost_input_audio_usd, ROUND(SUM(duration_sec) * 70 * 2.00 / 1e6, 2) AS cost_output_audio_usd FROM forge_tunix_talk_sessions WHERE started_at > now() - interval '30 days' AND duration_sec > 30; -- Anthropic equivalent sin Max SELECT count(*) FILTER (WHERE tool_name='quick_via_haiku') * 0.10 AS haiku_usd, count(*) FILTER (WHERE tool_name='quick_via_sonnet') * 0.30 AS sonnet_usd, count(*) FILTER (WHERE tool_name='delegate_to_claude_max') * 1.50 AS opus_usd FROM forge_tunix_tool_audit WHERE created_at > now() - interval '30 days';
Patricio: "necesito crear más proyectos paralelos para llegar al tope del Pro, que vaya orquestando y dirigiendo".
Objetivo: pasar de **~30-50% utilización** a **80-100%**, generando valor real con cada llamada Opus/Sonnet en background. Si llenás el Pro consistentemente 3 meses seguidos, conviene migrar a plan Team $200.
Cada uno suma ~$8-20/mes equivalente. Eligiendo 5-7 llegás al tope del Pro.
| # | Proyecto | Modelo | Freq | $/mes equiv | Valor que genera |
|---|---|---|---|---|---|
| 1 | Morning briefing rico con narrativa | Sonnet | Diario 06:25 | ~$9 | 30 narrativas/mes pre-cocidas con análisis del día: agenda + prioridades + clientes + estado holdings + clima emocional. Pre-cocción Etapa 3 Instant Layer. |
| 2 | Análisis semanal holdings (Emabel + TensorMed) | Opus | Lunes 09:00 | ~$6 | 4 análisis profundos/mes: KPIs, churn risk clientes, oportunidades cross-sell, gaps operativos. Push notif con recomendaciones accionables. |
| 3 | Auto-redacción WSP drafts para clientes pendientes | Sonnet | 3x/día | ~$27 | ~90 drafts/mes pre-armados para cada conversación WSP sin responder >2h. Patricio solo revisa + aprueba o ajusta. Mucho más rápido que redactar desde cero. |
| 4 | Análisis post-reunión automático | Opus | Cada reunión grabada | ~$8 | Insights brutales después de cada reunión Sebastián/clientes/prospects: temas tratados, decisiones tomadas, action items, próximos pasos, riesgos detectados. |
| 5 | Code review nocturno de commits | Sonnet | Diario 02:00 | ~$15 | Revisión de commits del día con sugerencias mejora (perf, seguridad, anti-patrones). Reporte matutino. Acumula deuda técnica visible. |
| 6 | Research swarms (DEVIX/GOJAN/TRUNKS en paralelo) | Opus + Sonnet | On-demand | ~$15 | Cuando pidas investigar tema (ej. "investigá competencia TensorMed"), spawn 3 agentes paralelos: market research, competitive intel, deep tech. ~10 swarms/mes. |
| 7 | Auto-generación contenido marca (Tungsteno YouTube + posts) | Opus | 2x/semana | ~$12 | 8 piezas/mes (script video, post LinkedIn, hilo Twitter) ajustadas a tu voz. Pre-cocidas para que solo revises y publiques. |
| 8 | Análisis prospectos B2B (Emabel) | Opus | Por prospect | ~$8 | Antes de cada reunión con cliente nuevo: investiga LinkedIn, web, contexto industria, propone ángulo de venta. ~5-8 prospects/mes. |
| 9 | Memory consolidation nocturna profunda (REM) | Opus | Diario 03:00 | ~$12 | Reemplazar REM con Haiku actual por Opus 1x semana: análisis profundo de patrones, detección lecciones nuevas no obvias, actualización Memory Forge. Sistema aprende solo. |
| 10 | Auto-mejora código proactiva (tunix_self_improve) | Opus | Semanal | ~$10 | 4 auto-mejoras/mes: TUNIX detecta gaps en su propio código, propone refactor, aplica con tu OK. Sistema se vuelve más fluido solo. |
| Fase | Proyectos | Esfuerzo | Cuándo |
|---|---|---|---|
| 🔴 Fase 1 (esta semana) | #1 Briefing rico · #4 Análisis post-reunión · #9 REM con Opus | ~3-4 hs total | Activable ahora, solo cron + prompt |
| 🟡 Fase 2 (próx 2 semanas) | #2 Semanal holdings · #5 Code review · #10 Auto-mejora | ~6-8 hs total | Requiere tablas + crons + prompts diseñados |
| 🟢 Fase 3 (próx mes) | #3 WSP drafts · #8 Prospects · #6 Research swarms · #7 Contenido marca | ~12-15 hs total | Más complejos, requieren UI de revisión + approval batch |
🧬 TUNIX Blueprint v4 · actualizado 26-may-2026 · también ver /forge-help
Este dashboard se actualiza con cada cambio mayor al sistema. Vení a chequear el estado real.