Meltemi frente a Orca — qué falta para ser world-class
2026-09-24 · main @ 4bc8e9e · Fuente: onorca.dev (landing, README de stablyai/orca, changelog), el árbol del repo verificado por 23 agentes (7 lectores por dimensión, 14 verificadores —evidencia en código y lente constitucional—, un crítico de completitud y una síntesis), y una prueba integrada real en esta máquina Windows 11 con Claude Code 2.1.280, Codex 0.77.0 → 0.156.1 y OpenCode 1.14.33 → 1.18.32 sobre un daemon meltemid aislado construido hoy en release.
0. Prueba integrada de hoy — lo medido, no lo supuesto
Sección titulada «0. Prueba integrada de hoy — lo medido, no lo supuesto»Entorno: daemon y adaptadores compilados desde main (cargo build --workspace --release), MELTEMI_DATA_DIR/MELTEMI_CONFIG_DIR aislados en el scratchpad, endpoint propio \\.\pipe\meltemid-smoke-orca, repo fixture temporal (README.md + src/lib.rs con add). Nada tocó tu daemon ni tus datos.
| Paso | Resultado | Evidencia |
|---|---|---|
meltemi fleet |
OpenCode L1 ready; Claude Code L2 ready (CLI + adaptador bundled); Codex L2 ready. Gemini/Copilot/Cursor/Kiro/Kilo/Aider/Antigravity no instalados |
out/fleet-release.out |
meltemi tunnel en Windows |
Rehúsa honesto: named pipe no reenviable; el remedio nombra meltemi bridge |
out/tunnel.txt |
| OpenCode 1.14.33, sesión libre de solo lectura | status: completed, 0 permisos denegados, transcript vacío: ni un agent_message_chunk, usage_update con 0 tokens. Causa: sus tres credenciales estaban rotas (Anthropic → 404, Copilot → 401, tier gratuito exige ≥ 1.18). Meltemi reportó éxito con salida nula. |
logs 1e258e5b, bc5f7666 |
| OpenCode 1.18.32 (actualizado), misma sesión | 20 s, 2 tool_call read, respuesta correcta en una frase, usage_update = 12 267 tokens. meltemi usage sigue diciendo protocol_carries_no_usage |
log dd976fef |
meltemi session … --model anthropic/claude-haiku-4-5 --agent opencode |
Rehusado 2006 «no documented place for a per-session model» aunque OpenCode anunció config_options con la lista de modelos en el mismo handshake |
core/meltemid/src/levels.rs:1037-1060 decide por nombre de binario |
| Claude Code 2.1.280, sesión libre de solo lectura por CLI | completed pero 12 permisos denegados (kind read): el CLI no tiene aprobador («interactive approval arrives in a later release», tui/src/run.rs:221-232). El agente intentó Read, Bash cat, PowerShell Get-Content, Grep, Glob y un subagente; todo cancelado; respondió que no pudo leer |
log 9eb77566 |
| Claude Code, sesión de escritura por CLI | 3 denegados (kind edit), HELLO.txt no se creó: el proxy deny-by-default funciona |
log a723cf9a |
Claude Code vía meltemi-devclient propose (aprobador automático) |
175 s, 7 permisos pedidos y aprobados, 0 denegados, proposal.md de 27 líneas de calidad real (Why / What Changes / Impact, semántica de overflow, alcance), src/ intacto. El hito de fase 0 con agente real, hoy |
out/devclient-propose3.out, proposal.md |
| Codex 0.77.0 | Handshake OK; el proveedor rechaza el turno: gpt-5.6-sol exige CLI más nuevo; --model gpt-5.1-codex-max «not supported with a ChatGPT account» |
error 2002 con remedy |
| Codex 0.156.1 (actualizado) | El adaptador rehúsa el handshake: el user agent ahora es meltemi-codex-acp/0.156.1 (Windows…) (Codex ecoa el nombre del cliente) y version::of busca el token codex_cli_rs/ (core/meltemi-adapters/src/codex/version.rs:26-29, wire.rs:52). (Una versión anterior de este informe añadía que el techo < 1.0.0 también la rehusaría; es falso, 0.156.1 < 1.0.0, corregido por codex-al-dia.) Codex no funciona con ninguna versión disponible hoy. |
error provider_version_unreadable |
| Modelos locales | Sin ollama, LiteLLM, LM Studio ni claves (OPENROUTER_API_KEY, etc.) en esta máquina. La conexión por configuración sí queda demostrada: opencode.json con proveedores ollama (http://localhost:11434/v1) y litellm (http://localhost:4000/v1) es aceptado y opencode models ollama lista ollama/qwen2.5-coder:7b. Falta el modelo vivo |
fixture-local-models/opencode.json |
GUI (Tauri, construida hoy con tauri build --no-bundle) |
Arranca contra el daemon aislado, lista las 10 sesiones del fixture en la barra lateral con avatar por agente y título. Mientras el propose corría (40 s de 175), la barra mostraba la sesión bajo «Stopped» y la barra de estado «0 working»: la GUI no ve sesiones activas que otro cliente arrancó |
meltemi-gui-real-2026-09-24.png |
| Captura oficial del sitio | scripts/capture-desktop.ps1 corre limpio sobre mock-agent y produce la vista Sessions |
meltemi-gui-sessions-2026-09-24.png |
Cambios que hice en tu máquina (reversibles): npm i -g @openai/codex@latest (0.77.0 → 0.156.1) y npm i -g opencode-ai@latest (1.14.33 → 1.18.32). Para volver: npm i -g @openai/codex@0.77.0 · npm i -g opencode-ai@1.14.33. No instalé ollama: es un servicio con descarga de varios GB y lo dejo a tu decisión (abajo está la receta exacta).
Trampas del entorno encontradas (van a memoria): desde git-bash y desde un pwsh hijo el cliente no alcanza el named pipe (os error 3) — solo el PowerShell de esta sesión, que corre en integridad alta, conecta; meltemi … | Out-File se cuelga porque el daemon hereda el pipe (usar Start-Process con redirección a archivo); meltemi-devclient --help sin MELTEMI_ENDPOINT arrancó un daemon en tu endpoint por defecto (lo detuve).
1. Veredicto en diez líneas
Sección titulada «1. Veredicto en diez líneas»- Meltemi va por delante en lo que Orca no tiene ni puede copiar sin cambiar de negocio: gobierno de toda sesión (proxy deny-by-default, registro apend-only, checkpoint declarado — hoy comprobado con Claude Code: 15 peticiones gobernadas, 0 escrituras furtivas), método spec-first hospedado en
.meltemi/(57 changes archivadas, 36 specs vivas), procedencia de release (SHA256SUMS y atestación; falta la clave minisign en el árbol), cero nube y cero cuentas, y una vía BYO-modelo real por OpenCode. - Orca va por delante en todo lo que el visitante ve el primer minuto: app móvil (iOS/Android por relé), 27 agentes frente a 10 (y de los 6 L1 de Meltemi solo OpenCode se ha ejercido; Codex hoy no arranca), terminal integrada, transcript rico (tool calls con resultado, diffs inline, spinner), estados de carga y movimiento, cadencia diaria frente a 7 semanas y 198 commits sin release, y comunidad (77k estrellas frente a 0).
- La brecha más honesta no es de features sino de evidencia y embudo: las dos cuñas (gobierno y BYO-modelo) están construidas pero no publicadas, no documentadas y —hasta hoy— no medidas contra los CLIs instalados. La prueba de hoy encontró tres defectos reales en una tarde: Codex roto por formato de user agent, turno vacío reportado como éxito, y
--modelrehusado a un agente que sí anuncia modelos. - Ninguna de las seis necesidades exige enmendar la constitución. Dos posturas piden enmienda de rumbo/§11 (terminal como no-objetivo; idioma de la documentación). Lo único estructuralmente fuera es el relé en la nube y el push sin túnel de Orca (§3, rumbo «ni un servicio en la nube»); el resultado de usuario se alcanza con infraestructura del propio usuario.
- El orden importa: sin estado vivo toda animación miente; sin clave publicada todo anuncio quema la primera impresión; sin corrida integrada los niveles declarados son papel.
2. Lo que pediste, uno por uno
Sección titulada «2. Lo que pediste, uno por uno»App móvil
Sección titulada «App móvil»- Estado: spec
.meltemi/specs/mobile-companion/spec.md(monitorear/aprobar/revisar/dirigir, regla de subconjunto, solo túnel SSH) y maquetadesign-system/Meltemi Mobile.dc.html. Cero código:desktop/tauri.conf.jsonsolo declara msi/dmg/deb, singen/android|apple, sinmobile/. Los tres prerrequisitos de daemon de fase 3 están archivados y verificados: espera humana configurable (core/meltemid/src/config.rs:131-166),waiting_permission/gatePendingreales,session/watchpara clientes tardíos. Lo que ya llega a un teléfono hoy y nadie documenta: la TUI porssh -t pc meltemidesde Termius/Blink/Termux (exige 80×24,tui/src/shell/render.rs:91-97) y la campanaMELTEMI_BELL=1(tui/src/shell/bell.rs), que esas apps convierten en notificación local: un push de facto. - Brecha: app (MOB-1); cliente SSH embebido sin decidir y
deny.tomlprohíbe las candidatas con TLS (MOB-2); emisor del aviso de espera opt-in inexistente (MOB-3; distinto del aviso de escritorio, que sí existe:avisos-de-escritorio11/11); gracia de 30 s frente a suspensión en background (MOB-4);permission/pending|decide,session/watch|log|cancelsin verbo CLI (MOB-5,docs/paridad-nucleo.md:28-30,59-60); identidad y selector (MOB-7,identidad-propia0/8); transporteexec:en el cliente (MOB-8). - Camino conforme: (1) push con infraestructura del usuario:
[notices] on-waiting = "<comando>"de ámbito usuario, ejecutado por GUI/TUI conectadas (nuncameltemid), recetas ntfy/Gotify/Apprise autohospedadas, contenido mínimo publicado antes de existir (§9), clave leída solo de<config>/meltemi/, jamás del repo; (2) app Android primero (Tauri 2 móvil reutilizandodesktop/ui),russhsolo en el crate móvil con excepción acotada endeny.tomly prueba de que la suite de escritorio sigue verde en Windows (§7), canalexec→meltemi bridge(funciona contra daemon Windows), clave del usuario en Keystore, sin importar claves de otras apps (§2); (3) presencia poridentity/statusleyendo el binario oficial de la malla. Orden único: MOB-5 → MOB-8 → perfiles de máquinas →identidad-propia→companero-movil. - Changes:
companero-movil(nombrada, sin abrir),identidad-propia(abierta, 0/8); nuevas vía rápidaverbos-del-agent-boss,via-ssh-del-cliente,aviso-de-espera-opt-in,acceso-remoto-documentado. Esfuerzo: días para las vías rápidas; meses para la app.
App de escritorio
Sección titulada «App de escritorio»- Estado: tablero de carrera con calles, diff por hunk y merge por archivo (
desktop/ui/src/lib/views/Review.svelte); editor utilitario con LSP BYO; pestañas estilo Chrome con grupos; transcript con pensamiento en vivo (pensamiento-a-la-vista: 4/4 implementada, pendiente de archivo); compositor con encolar/relevar/detener; paleta Ctrl+K generada desde los schemas; uso y suscripciones; checkpoints. - Brecha confirmada: las tool calls son una píldora título·estado; el daemon persiste
content/diff/locations(core/meltemid/src/acp.rs:739-742) y ni la GUI (desktop/ui/src/lib/conversation.ts:133-141) ni la TUI (tui/src/shell/conn.rs:835-845) lo pintan. Sin adjuntos de imagen ni arrastre (@rutacubre texto víacore/meltemid/src/repo_map.rs:107-111). Sin splits. Markdown crudo. Sin anotar diff. Sin rewind por turno. Columna worktree/rama que la spec exige (parcial:projectRootya es la ruta del worktree). Slash commands: el anuncio llega al log y asession/watchpero ninguna superficie lo lee. Añadidos por el crítico: sin vista previa de imágenes/PDF aunque el CSP ya admiteimg-src data:; ventana única (minWidth: 900); sin historial de avisos (desktop/ui/src/lib/notices.ts:22-40los retira a los 6 s); pestañas que no sobreviven al reinicio (desktop/ui/src/lib/ui-state.ts:16-40); sin updater; sin menú nativo; sin exportar sesión. - Fuera por rumbo, con equivalente conforme: Design Mode → receta de servidor MCP de navegador inyectado por
mcp-passthrough(nunca CDP desde el daemon, nunca segundo webview); GitHub/Linear nativos → «Abrir PR con…» como plantillaopenWith(desktop/src/fsops.rs:148) que lanza elghdel usuario con su auth (§2); terminal embebido → «Abrir terminal aquí» hoy, y enmienda de rumbo que lo declare no-objetivo. - Changes:
herramientas-a-la-vista(nueva; absorbe la tarjeta de herramienta, diffs ACP y el mapeo Edit/Write →ToolCallContent::Diffen los adaptadores),comandos-del-agente,arrastrar-referencias,adjuntos-en-el-compositor,panel-dividido,markdown-que-se-lee,anotar-el-diff,volver-a-este-turno,la-sesion-dice-su-rama,previsualizar-binarios,bandeja-de-avisos,pestanas-que-vuelven,abrir-pr-con,abrir-terminal-aqui. Esfuerzo: días por vía rápida; semanaspanel-dividido,adjuntos-en-el-compositor,volver-a-este-turno.
Conexión remota (monitorear y hacer un cambio)
Sección titulada «Conexión remota (monitorear y hacer un cambio)»- Estado:
meltemi tunnel(formateassh -R, rehúsa honesto en Windows — comprobado hoy),meltemi bridge(canal JSON-RPC completo por stdio, funciona con named pipe;tui/src/run.rs:1642-1689; smoke de 2026-08-15), reconexión con backoff en GUI y TUI, cola de permisos que sobrevive,session/directconinterrupt/detach, punto de encuentro documentado (docs/acceso-remoto.md:84-146). Monitorear y dirigir existen en el daemon. «Hacer un cambio» tiene la mitad: las escrituras van porworktree/apply-edit(RPC), perotree_read/tree_search/open_withy el LSP leen el disco del cliente (desktop/src/fsops.rs:54-148,desktop/ui/src/lib/editor/lsp.ts:38-59), ySettings.svelte:36-40lee elconfig.tomllocal. - Brecha: ningún cliente propio consume
bridge(parcial: en macOS/Linux-R+MELTEMI_ENDPOINTsí sirve a GUI y TUI; desde o hacia Windows, nada); sin perfiles, prueba ni respawn delssh;connect_or_startarranca un daemon local sobre un endpoint remoto caído (core/meltemi-client/src/bootstrap.rs:33-53— hoy lo vi ocurrir con el devclient); Windows como PC servido sin guía ni medición (docs/plataformas.md:46-52recomienda-Lcontra el-Rdel helper); túnel sin keepalive niExitOnForwardFailure(tui/src/tunnel.rs:77);no-client-grace/waitconfigurables pero no expuestos. La ruta GUI/TUI-sobre-túnel nunca se ha medido: 0 smokes endocs/qa/. - Camino conforme: transporte
exec:encore/meltemi-client(el cliente lanza elsshdel usuario conmeltemi bridgefijo y habla por su stdio; cero crates; comando solo de ámbito usuario;connect_or_startno arranca daemon paraexec:) → sección «Máquinas» con perfiles sinIdentityFileni passphrases (delegar a ssh-agent/Pageant), presencia a demanda, ningúnsshhuérfano al cerrar → degradación honesta de editor/búsqueda/LSP con daemon remoto y, para editar de verdad,lectura-por-el-daemon: RPC de lectura acotado a raíces registradas y worktrees, con paridad TUI por §4. - Changes:
via-ssh-del-cliente,maquinas-remotas(trasidentidad-propia),lectura-por-el-daemon(nuevas);arranque-solo-en-endpoint-propio,tunel-resiliente,acceso-remoto-documentado(vías rápidas). Esfuerzo: vías rápidas en días; transporte y perfiles en semanas.
Prueba integrada con agentes locales
Sección titulada «Prueba integrada con agentes locales»- Estado (docs): Claude Code alcanzó nivel verificado 2 contra
claude 2.1.167; AskUserQuestion y--modelsolo contra mock; Codex nivel verificado 0 con esquema anclado a 0.77.0; OpenCode y los otros cinco L1 nunca ejercidos; el informe de aceptación v0.1 con dos agentes reales no existe (docs/hito-v01.mdes plantilla). - Estado (hoy, sección 0): Claude Code completa
proposede punta a punta con aprobaciones; OpenCode completa sesión libre tras actualizar; Codex no arranca con ninguna versión disponible (0.77 por modelo de cuenta, 0.156 por user agent); el CLIsessionno tiene aprobador, así que con Claude Code solo sirve para charlar. - Brechas nuevas encontradas hoy: (a) turno «completed» con transcript vacío se reporta como éxito — un turno sin ningún
agent_message_chunknitool_calldebería cerrar comoempty_turncon remedio; (b)usage_updatede ACP llega al log ymeltemi usageno lo pliega; (c)--modelse rehúsa por nombre de binario aunque el agente anuncie opciones; (d) el passthrough MCP solo reconoce http/sse (core/meltemid/src/mcp.rs:17-18). - Camino:
codex-al-dia(aceptar<producto>/<semver>con producto anunciado por el cliente ocodex_cli_rs, re-vendorizar concodex app-server generate-json-schema, subir el piso a la versión verificada y declarar lo no verificado, corrida de dos piernas hasta nivel 2; manual y opt-in, nunca en CI) →turno-vacio-es-error(vía rápida) →corrida-integrada: matriz {Claude 2.1.280, Codex actual, OpenCode 1.18 + ollama} × {session, propose, dispatch, implement, permiso, cancelar, direct, pregunta} × {CLI, TUI, GUI} sobre repos fixture, condocs/conformidad-manual.mdcomo molde, y publicardocs/qa/<fecha>-hito-v01-aceptacion.md. Mientras el CLI no tenga aprobador, documentarmeltemi-devclient proposecomo la vía scriptable con aprobación, o darle al CLI un--approve-reads. - Changes:
codex-al-dia,turno-vacio-es-error,aprobador-en-el-cli,corrida-integrada,codex-reanudar-y-mcp,mcp-stdio-passthrough,usage-desde-acp. Esfuerzo: días.
Modelos locales vía LiteLLM / ollama / OpenRouter
Sección titulada «Modelos locales vía LiteLLM / ollama / OpenRouter»-
Estado: la única vía que funciona hoy es OpenCode (L1): anuncia
configOptions.modely admite proveedores OpenAI-compatible y OpenRouter por su propioopencode.json; un[[fleet.profile]]conenv = { OPENCODE_CONFIG = ... }y referencias${VAR}lo envuelve sin tocar Meltemi (core/meltemid/src/config.rs:50-70, lint de secretos en:520-531). Aider (L3) no es lanzable: los cinco verbos rehúsanlevel_not_pilotable(core/meltemid/src/free_session.rs:101-112,propose.rs:102-113,sdd_flow.rs:477-486,server.rs:785-794,1724-1733); la frase «Aider funciona hoy» dedocs/plan-de-cambios.md:258-261y de la proposal demotor-propio-byokes falsa.motor-propio-byokes solo proposal ydeny.toml:62-109prohíbe HTTP/TLS en todo el workspace. -
Receta que funciona hoy (verificada en forma, no en modelo vivo por falta de ollama):
{ "$schema": "https://opencode.ai/config.json","model": "ollama/qwen2.5-coder:7b","provider": {"ollama": { "npm": "@ai-sdk/openai-compatible", "name": "Ollama (local)","options": { "baseURL": "http://localhost:11434/v1" },"models": { "qwen2.5-coder:7b": { "name": "Qwen2.5 Coder 7B" } } },"litellm": { "npm": "@ai-sdk/openai-compatible", "name": "LiteLLM proxy","options": { "baseURL": "http://localhost:4000/v1", "apiKey": "{env:LITELLM_API_KEY}" },"models": { "gpt-5-mini": {} } },"openrouter": { "models": { "moonshotai/kimi-k2": {} } } } }Con
ollama pull qwen2.5-coder:7bcorriendo,meltemi session "…" --agent opencodeen ese proyecto ya usa el modelo local; OpenRouter tomaOPENROUTER_API_KEYdel entorno del daemon; LiteLLM es el endpoint único para N proveedores. -
Brecha: cero guía (grep
ollama|litellm|openrouter→ solo el backlog);--modelrehusado con remedio engañoso; elmodeldel perfil se pierde en silencio enpropose/dispatch/implement(solofree_session.rs:119aplicawith_session_levers); el picker de la GUI no sabe qué agente admite modelo; sin tokens ni tokens/s aunque ACP ya los transporta (hoy: 12 267 tokens en el log, «no reportado» enusage). -
Camino conforme:
guia-modelos-locales(docs/local-models.mdcon las tres recetas verificadas y fechadas, un perfil por receta, pierna «proveedor local» endocs/conformidad-manual.md, enlace desdedocs/agentes.md:104y la sección BYO del sitio; corrige la afirmación sobre Aider);modelo-por-opcion-anunciada(trassession/new, si el agente anuncia opción de categoríamodel, enviarset_config_optioncon el valor verbatim, rehusar listando lo anunciado si no coincide, y aplicarwith_session_leversen todos los verbos);perfil-con-entorno;usage-desde-acp.motor-propio-byoksigue siendo la cuña estratégica (meses; no adelantar; LiteLLM como fixture manual).
World-class y atractivo visual
Sección titulada «World-class y atractivo visual»- Estado: un solo movimiento en el producto, el anillo cónico «composer-wind» (2.4 s) en Home y SessionDetail; reduced-motion honrado en dos capas (
desktop/ui/src/app.css:378-386); regla dura pineada de que bandeja, tarjeta de permiso, avisos y barra lateral jamás animan (desktop/tests/scenarios_shell.rs:258-272,4814-4832); carga = texto «cargando…» en Project/Review/Fleet/Settings/Usage; TUI con glifos fijos y sin spinner aunque.meltemi/specs/tui-shell/spec.md:336-339reserva el gemelo ASCII. Las capturas de hoy lo muestran: una superficie densa, limpia y quieta; correcta como plano de control, muda como escaparate. - Brecha: la señal «trabajando» llega tarde o no llega — anillo de SessionDetail, cubeta ▸ Trabajando y glifo de pestaña derivan de
refreshSessions(), que solo corre al conectar, conmutar o enviar (desktop/ui/src/lib/stores.ts:258-262); hoy la GUI mostró «Stopped» y «0 working» mientras Claude Code llevaba 40 s trabajando. Sin esqueletos; cronómetro congelado (SessionDetail.svelte:753); «sin salida» mientras el turno vuela sin partes (:898-900); sin cursor de flujo; sin tokens de duración ni transiciones; TUI sin tick fino; calles sin progreso intra-turno; ventana que puede pintar el fondo del SO antes del primer frame. En producto: clave minisign fuera del árbol; 0 estrellas y Discussions desactivado; quickstart que empieza encargo buildy TOML a mano aunque--agenty el chip de flota ya lo evitan; sitio sin producto en movimiento y sin nombrar un agente; 198 commits sin release ni CHANGELOG; docs sin sitio e idioma contradictorio con §11; sin winget/brew/scoop; sinmeltemi doctor, FAQ ni página de privacidad; sin aviso de versión nueva. - Camino:
estado-en-vivoprimero (notificaciónsession/statea todo cliente por JSON-RPC, declarada enproto/schemas/v1; la TUI la consume en vez de sondear), porque sin estado vivo toda animación de trabajo miente; luego el vocabulario de la sección 4; en producto, cerrar procedencia, abrir canales y publicar la cuña antes de anunciar. - Changes:
estado-en-vivo,estados-de-carga,pulso-de-la-tui,senal-de-vida-del-turno,vocabulario-de-movimiento,ventana-hasta-el-primer-frame; producto:procedencia-de-release(cerrar),canales-de-comunidad,quickstart-sin-cargo,cadencia-y-changelog,demo-animada-del-sitio,meltemi-doctor,docs-en-el-sitio(con enmienda de §11),distribucion-gestores-paquetes,demo-guiada.
3. Tabla de brechas verificadas
Sección titulada «3. Tabla de brechas verificadas»Verificación: C confirmada, P parcial (con lo que existe). Constitución: sí / reencuadre / enmienda. Filas fusionadas cuando dos dimensiones describen el mismo hecho. Las filas marcadas ★ las confirmó además la prueba de hoy.
| Id | Dimensión | Severidad | Verificación | Constitución | Change | Esfuerzo |
|---|---|---|---|---|---|---|
| AI-1 ★ | Agentes | crítica | C: Codex no arranca con 0.77 ni con 0.156 | sí (manual, nunca en CI) | codex-al-dia (nueva) | días |
| AI-2 ★ | Agentes | alta | C: sin corrida integrada publicada | sí (fixtures, no este repo) | corrida-integrada (nueva) | días |
| AI-11 ★ | Agentes | alta | C: turno vacío = «completed» | sí | turno-vacio-es-error (nueva) | días |
| AI-12 ★ | Agentes | alta | C: el CLI session deniega todo permiso; solo devclient aprueba |
sí (§3: la decisión sigue siendo humana o de regla) | aprobador-en-el-cli (nueva) | días |
| LM-3 ★ | Modelos | alta | P: el daemon rehúsa --model por nombre de binario; OpenCode sí anuncia |
sí | modelo-por-opcion-anunciada (nueva) | días |
| LM-7 / AI-6 ★ | Modelos·Agentes | media | C: usage_update en el log, usage dice «no reportado» |
sí (_meta namespaced; §2) |
usage-desde-acp · extension-acp-usage | días / semanas |
| VIS-1 ★ | Visual | crítica | P: el anillo del Home usa running local; el resto depende de refreshSessions |
sí (notificación JSON-RPC; §4) | estado-en-vivo (nueva) | semanas |
| R3 ★ | Remoto | alta | C: cliente arranca daemon local sobre endpoint ajeno | sí (refuerza §3) | arranque-solo-en-endpoint-propio (vía rápida) | días |
| MOB-1 | Móvil | crítica | C | sí (§10 por plugin; mobile/ al rumbo) |
companero-movil (sin abrir) | meses |
| MOB-2 | Móvil | crítica | C | sí (russh solo en crate móvil; excepción deny.toml) |
companero-movil | semanas |
| MOB-3 / R6 | Móvil·Remoto | alta | P: MELTEMI_BELL ya es push por ssh -t; gracia configurable sin exponer; emisor del aviso ausente |
sí (ámbito usuario; nunca el daemon; §9 antes) | aviso-de-espera-opt-in (nueva) | días |
| MOB-4 | Móvil | alta | C | sí (gracia finita, sin keep-alive) | companero-movil (design) | días |
| MOB-5 | Móvil | alta | C | sí (refuerza §4) | verbos-del-agent-boss (nueva) | días |
| MOB-6 / R5 | Móvil·Remoto | media | C | sí (es la TUI, no el compañero) | acceso-remoto-documentado · modo-estrecho-tui | días |
| MOB-7 / R8 | Móvil·Remoto | media | C | sí (sin sondeo silencioso; BYO-network) | identidad-propia (0/8) → maquinas-remotas | semanas |
| MOB-8 / R1 | Móvil·Remoto | crítica | P: -R + MELTEMI_ENDPOINT sirve en macOS/Linux; sin exec:; Windows sin camino |
sí (comando solo de ámbito usuario) | via-ssh-del-cliente (nueva) | semanas |
| MOB-9 | Móvil | media | C | sí (confirmación explícita por archivo) | diferida con razón (eventos-para-tardios) | semanas |
| D1 / VIS-2 / AI-4 / D9 / VIS-8 | Escritorio·Visual·Agentes | alta | C (GUI y TUI; calles con glifo por turno, sin lo vivo) | sí (§5: estructura ACP genérica; rawInput plegado) |
herramientas-a-la-vista (nueva) | semanas |
| D2 / AI-7 | Escritorio·Agentes | alta | P: llega al log y a session/watch; nadie lo lee |
sí (texto al agente, sin interpretar) | comandos-del-agente (nueva) | días |
| D3 / AI-5 | Escritorio·Agentes | alta | C para imágenes/arrastre; @ruta cubre texto |
sí (log sin bytes; gating por prompt_capabilities.image) |
arrastrar-referencias · adjuntos-en-el-compositor | días / semanas |
| D4 | Escritorio | alta | C | sí (2 paneles, dentro de edit-surface) | panel-dividido (nueva) | semanas |
| D5 | Escritorio | media | C | reencuadre: imágenes vía daemon, no bridge Rust | markdown-que-se-lee (nueva) | días |
| D6 | Escritorio | media | C | sí (cierra meltemi.md §6.8) | anotar-el-diff (nueva) | días |
| D7 | Escritorio | media | P: filtro por texto en Sesiones, búsqueda por transcript, Ctrl+P en Editor | sí (§4 TUI + CLI) | paleta-que-encuentra · buscar-en-las-sesiones | días |
| D8 | Escritorio | media | C | sí (§4: TUI y CLI también) | volver-a-este-turno (nueva) | semanas |
| D10 | Escritorio | baja | C | sí como receta MCP; motor embebido prohibido | receta en docs/agentes.md | días |
| D11 | Escritorio | baja | C | sí (plantilla, --web, §2) |
abrir-pr-con (nueva) | días |
| D12 | Escritorio | baja | C | enmienda para la postura; atajo sí | abrir-terminal-aqui + enmienda rumbo | días |
| D13 | Escritorio | baja | P: projectRoot es el worktree; falta rama y columna |
sí (repara spec viva) | la-sesion-dice-su-rama (nueva) | días |
| D-V1 | Escritorio | media | C: sin updater, menú nativo ni exportar sesión | sí (aviso opt-in, solo cliente; §9 antes) | avisos-de-version · menu-nativo-aplicacion | días |
| R2 | Remoto | alta | P: chip ◌/●/▲ y backoff existen; sin perfiles, prueba ni respawn | sí (sin IdentityFile; sin ssh huérfano) |
maquinas-remotas (nueva) | semanas |
| R4 | Remoto | alta | C | sí (§7 lo exige) | acceso-remoto-documentado + smoke | días |
| R7 | Remoto | media | C (también Settings.svelte lee config local) |
sí (→ §4; acotado a raíces) | lectura-por-el-daemon (nueva) | semanas |
| R9 | Remoto | baja | C | sí | tunel-resiliente (vía rápida) | días |
| R-V1 | Remoto | media | C: GUI/TUI sobre túnel nunca medidos | sí | smoke en corrida-integrada | días |
| AI-3 | Agentes | alta | P: [[fleet.custom]] ya admite cualquier ACP nativo; faltan datos de registro |
sí (grey por defecto; verificar vendor por vendor) |
flota-ampliada / registro-agentes-en-superficie | días |
| AI-8 | Agentes | media | C | sí (override por cable, no archivos del CLI) | codex-reanudar-y-mcp | días |
| AI-9 | Agentes | media | C | sí para L1 + L3; pty = enmienda | flota-ampliada · runner-nivel-3 | meses |
| AI-V1 | Agentes | alta | C: 5/6 L1 nunca ejercidos; MCP stdio omitido (mcp.rs:17-18) |
sí | corrida-integrada · mcp-stdio-passthrough | días |
| LM-1 | Modelos | crítica | C: «Aider funciona hoy» es falso | reencuadre: modelo verbatim por dato del registro | corrección de texto (vía rápida) · runner-nivel-3 | días / semanas |
| LM-2 / LM-5 / LM-8 / P5 | Modelos·Producto | alta | C: cero guía | sí (claves solo por ${VAR}) |
guia-modelos-locales (nueva) | días |
| LM-4 | Modelos | alta | C | sí (excepción deny.toml acotada + test) |
motor-propio-byok | meses |
| LM-6 | Modelos | media | C | sí (§4 ×3; lint de secretos) | perfil-con-entorno (nueva) | días |
| VIS-3 | Visual | alta | C | sí (keyframes en app.css) |
estados-de-carga (vía rápida) | días |
| VIS-4 | Visual | media | P: ticker de 2 s ya redibuja; sin tick fino ni frames | sí (usar --ascii existente; probar en conhost) |
pulso-de-la-tui (vía rápida) | días |
| VIS-5 / VIS-6 | Visual | media | C | sí (cursor fijo, o enmendar «uno por vista») | senal-de-vida-del-turno (vía rápida) | días |
| VIS-7 | Visual | media | C | sí (no relajar las guardias) | vocabulario-de-movimiento (vía rápida) | días |
| VIS-9 | Visual | baja | P: flash de tema mitigado; ventana sin visible:false; onboarding estático |
sí (allow-show o show() desde lib.rs; tope 500 ms) |
ventana-hasta-el-primer-frame | días |
| P1 | Producto | crítica | P: SHA256SUMS y atestación ejecutables; sin clave minisign ni firma de plataforma | sí (firma manual fuera de CI) | procedencia-de-release (6/8) · firma-de-plataforma | días |
| P2 | Producto | crítica | P: docs de gobernanza existen; canales no | sí (badges no en site/) |
canales-de-comunidad (nueva) | días |
| P3 | Producto | alta | P: --agent y chip de flota ya evitan el TOML; docs desactualizados; sin demo |
sí (mock-agent es binario propio) | quickstart-sin-cargo · demo-guiada | días / semanas |
| P4 | Producto | alta | C | sí (sin JS; reduced-motion; «simulado» declarado) | demo-animada-del-sitio (nueva) | días |
| P6 | Producto | media | C (198 commits sin release) | sí | cadencia-y-changelog (nueva) | días |
| P7 | Producto | media | P: site/es/ existe; CONTRIBUTING tiene política |
enmienda §11; sin buscador JS | docs-en-el-sitio + enmienda-idioma | semanas |
| P8 | Producto | media | C | sí (tras release: published) |
distribucion-gestores-paquetes | semanas |
| P9 | Producto | media | P: e2e_hito y dos procedimientos manuales existen; falta el informe |
sí | corrida-integrada (mantenedor) | días |
| P-V1 | Producto | media | C: sin meltemi doctor, FAQ, página de privacidad, completions ni SBOM |
sí | meltemi-doctor · faq-y-privacidad | días |
| C-A | Escritorio | media | C: 0 <img>; CSP ya admite data: |
sí (edit-surface) | previsualizar-binarios | días |
| C-B | Escritorio | baja-media | C: ventana única | sí | segunda-ventana | semanas |
| C-C | Escritorio | media | C: notices.ts:22-40 sin archivo |
sí (§4 si toca el daemon) | bandeja-de-avisos | días |
| C-D | Escritorio | baja-media | C: ui-state.ts sin pestañas |
sí | pestanas-que-vuelven | días |
| C-F | Agentes | baja | C: ningún verbo de Meltemi expuesto a un agente | sí | receta CLI-como-herramienta + MOB-5 | días |
4. Vocabulario de movimiento propuesto
Sección titulada «4. Vocabulario de movimiento propuesto»Compatible con docs/ux/design-system.md (Motion: 120–160 ms, ease-out, solo opacidad/transform, un indicador ambiental por vista) y con las guardias pineadas. Tokens en desktop/ui/src/app.css: --dur-1: 120ms (llegada), --dur-2: 160ms (cambio de estado), --dur-ambient: 2.4s (existe), --dur-pulse: 1.2s (esqueleto), --ease-out: cubic-bezier(0.2, 0, 0, 1). Jamás altura, posición ni color de fondo animados.
| Clase | Qué | Dónde | Duración · easing | Reduced-motion | Regla que respeta |
|---|---|---|---|---|---|
| A · Ambiental | anillo cónico (existe) | compositor de Home y SessionDetail; tablero | 2.4 s lineal | se retira (display:none), no se congela |
«uno por vista»; encendido solo por estado vivo (VIS-1) |
| B · Llegada | .arrive opacidad 0→1 |
<main> al conmutar vista; ítems nuevos del transcript; resultados de paleta; contenido del cajón |
100–120 ms · ease-out | kill-switch global (app.css:378-386) |
nunca en bandeja, tarjeta de permiso, avisos ni barra lateral (llegada en seco) |
| C · Cambio de estado | crossfade de glifo/píldora (▸→●, ○→◔→✓/✕) | filas de herramienta; cabecera de sesión; calles; pestañas (un solo parpadeo) | 160 ms · ease-out | cambio en seco | contadores de la barra lateral cambian en seco (guardias scenarios_shell.rs:4814-4832) |
| D · Esqueleto | filas de 32 px, barras 62/38/48/55/70/30 % (del mockup móvil), aria-busy |
Project, Review, Fleet, Settings, Usage, paleta; solo si la espera supera 150 ms | pulso de opacidad 0.55↔1 · 1.2 s ease-in-out | barras estáticas + «cargando…» | nunca gradiente en barrido (reserva de marca); keyframes en app.css |
| E · Flujo | «◔ trabajando… m:ss» en turno abierto sin partes; cursor ▍ fijo tras el último chunk; sin typewriter | transcript | texto; cronómetro tabular 1 s | no aplica | cursor fijo para no ser segundo ambiental |
| F · Herramientas | fila de 32 px: glifo de estado, título mono, 0:07, línea ⎿ resultado (n líneas, +a −r), diff plegable cerrado, lotes «Leyó 4 archivos» |
transcript GUI; TUI como ◔ 0:07 Read src/x.rs + ⎿ |
llegada B + estado C | glifo en seco | ACP puro (kind, content, locations); rawInput solo plegado bajo demanda |
| G · TUI | frames braille ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ con gemelo -|/; cronómetro mm:ss en header y drill-in |
glifo ACTIVE; tercer arm de select! en tui/src/shell/mod.rs:82-117 armado solo con is_working() |
80–100 ms/frame; tick de 1 s | --ascii/MELTEMI_ASCII → ▶ + «trabajando…» |
spec tui-shell:336-339 (gemelo ASCII); cero CPU en reposo; probar en conhost (§7) |
| H · Marca | trazo del mark una sola vez | onboarding | 600 ms · ease-out | estático | único sitio con animación de marca; sin splash ni glow |
| I · Ventana | visible:false + show() tras el primer frame |
desktop/tauri.conf.json, desktop/src/lib.rs |
tope 500 ms aunque el frontend no señale | no aplica | capability core:window:allow-show justificada, o show() desde Rust |
5. Hoja de ruta en tres tandas
Sección titulada «5. Hoja de ruta en tres tandas»Tanda 1 — ≤ 2 semanas: confianza ejecutable, prueba integrada y quick wins
Sección titulada «Tanda 1 — ≤ 2 semanas: confianza ejecutable, prueba integrada y quick wins»| Change | Por qué | Dependencia |
|---|---|---|
| codex-al-dia | Codex hoy no arranca con ninguna versión; el parser de user agent, el piso y la compuerta de aprobación que el cable nuevo exige gobernar, más la re-vendorización | — |
| turno-vacio-es-error · aprobador-en-el-cli | los dos defectos que la prueba de hoy vio primero; sin aprobador el CLI no sirve con Claude Code | — |
| procedencia-de-release (cerrar 2/8) | minisign.pub en el árbol, lint de clave, v0.1.2 firmada: sin esto todo anuncio quema la primera impresión |
mantenedor |
| corrida-integrada | la matriz agente × verbo × superficie; publica el informe de aceptación v0.1 | codex-al-dia |
| guia-modelos-locales | única vía funcional (OpenCode) sin escribir; corrige lo de Aider; nombra LiteLLM; receta de arriba | instalar ollama para la pierna local |
| modelo-por-opcion-anunciada · usage-desde-acp | hacen funcionar el picker y --model con OpenCode; muestran los tokens que ya llegan |
— |
| verbos-del-agent-boss | meltemi permissions/decide/watch: aprobar desde el teléfono por SSH y script del aviso |
— |
| arranque-solo-en-endpoint-propio · tunel-resiliente | un día cada una; hoy un endpoint caído arranca un daemon equivocado | — |
| acceso-remoto-documentado | Windows como PC servido, «desde el teléfono, hoy», MELTEMI_BELL, ajustes de gracia; corrige docs/plataformas.md |
— |
| comandos-del-agente · arrastrar-referencias | ≤ 2 días cada una | — |
| estados-de-carga · pulso-de-la-tui · senal-de-vida-del-turno · ventana-hasta-el-primer-frame | quick wins visuales sin tocar el daemon | — |
| canales-de-comunidad · cadencia-y-changelog · quickstart-sin-cargo | Discussions, plantillas, badges, CHANGELOG desde el archivo, quickstart sin cargo ni TOML |
anunciar solo tras procedencia |
Tanda 2 — 1 a 2 meses: estado vivo, transcript rico, remoto usable
Sección titulada «Tanda 2 — 1 a 2 meses: estado vivo, transcript rico, remoto usable»| Change | Por qué | Dependencia |
|---|---|---|
| estado-en-vivo | sin session/state toda animación de trabajo miente (hoy: «0 working» con un agente trabajando); TUI deja de sondear |
— |
| herramientas-a-la-vista | tarjeta de herramienta, diffs ACP en el transcript, subagentes, calles vivas | estado-en-vivo; adaptadores emiten ToolCallContent::Diff |
| via-ssh-del-cliente → maquinas-remotas → lectura-por-el-daemon | GUI/TUI marcan a ssh pc meltemi bridge, perfiles, chip, y editar de verdad en remoto |
identidad-propia (terminar 0/8) |
| aviso-de-espera-opt-in | push con ntfy/Gotify del usuario; contenido publicado antes (§9) | archivar avisos-de-escritorio |
| flota-ampliada · codex-reanudar-y-mcp · mcp-stdio-passthrough | de 10 a ~18 agentes L1 con estatus grey verificado; Codex reanuda y recibe MCP |
codex-al-dia |
| extension-acp-usage | tokens y rate-limits por _meta namespaced; propuesta upstream |
usage-desde-acp |
| markdown-que-se-lee · anotar-el-diff · paleta-que-encuentra · la-sesion-dice-su-rama · previsualizar-binarios · bandeja-de-avisos · pestanas-que-vuelven · avisos-de-version | pulido de escritorio, todas vías rápidas | — |
| vocabulario-de-movimiento | tokens y utilidades de la sección 4 en app.css y design-system |
estados-de-carga |
| demo-animada-del-sitio · meltemi-doctor · docs-en-el-sitio (+ enmienda §11) · distribucion-gestores-paquetes · perfil-con-entorno | embudo: producto vivo en la portada, diagnóstico, docs navegables, brew/winget/scoop |
procedencia cerrada; enmienda ratificada |
Tanda 3 — apuestas grandes
Sección titulada «Tanda 3 — apuestas grandes»| Change | Por qué | Dependencia |
|---|---|---|
| companero-movil | Android primero, russh acotado, canal exec → bridge, reconexión al frente, gracia larga por config con techo |
identidad-propia, via-ssh-del-cliente, estado-en-vivo, aviso-de-espera-opt-in, verbos-del-agent-boss |
| motor-propio-byok | la cuña BYO-modelo sin depender de OpenCode; excepción deny.toml acotada a core/meltemi-engine con test de que meltemid sigue sin HTTP; LiteLLM como fixture manual |
guia-modelos-locales, extension-acp-usage |
| panel-dividido · volver-a-este-turno · demo-guiada · segunda-ventana | dos paneles dentro de edit-surface; checkpoint por turno con confirmación; meltemi demo con mock-agent etiquetado «simulado» |
vocabulario-de-movimiento |
| runner-nivel-3 (opcional) | solo si Aider u otro CLI headless lo justifica | corrección de texto ya hecha |
| enmiendas: terminal como no-objetivo, §11 idioma, sucesion-y-custodia | posturas escritas antes de que la comunidad las pregunte | firma del mantenedor |
6. Lo que Meltemi NO debe copiar de Orca
Sección titulada «6. Lo que Meltemi NO debe copiar de Orca»- Relé en la nube, pairing por código y push sin túnel: §3, rumbo product («ni un servicio en la nube»), spec
remote-access. Equivalente: bastión o malla del usuario + aviso opt-in a ntfy/Gotify autohospedado. - Cuentas, login y usage por API del proveedor: §2 prohíbe leer credenciales o llamar a la API con el token del CLI; §5 y rumbo prohíben cuentas. El uso solo entra por la salida oficial del agente (
_metaACP). - Hot-swap de cuentas y caché de passphrases: tocar
~/.claude,~/.codexo retener passphrases roza material de claves (§2). Se elige por perfil al abrir sesión y se delega a ssh-agent/Pageant. - «Any CLI» en terminal pty: una pty esquiva el proxy deny-by-default y el registro apend-only que el rumbo declara piso de toda sesión; exigiría enmienda y un quinto nivel «sin gobierno». La amplitud se cubre por ACP nativo (L1) y headless con salida JSON (L3).
- Chromium embebido por worktree (Design Mode): meltemi.md §7.1/§7.4 e
instaladores-linux-sin-webviewrechazan empaquetar un motor de navegador. Vía: MCP de navegador del agente. - GitHub/Linear/CI nativos en el daemon: rumbo «ni CI/CD», sin red en el daemon (§3). Vía:
ghdel usuario por plantilla y MCP declarado. - Permisos Yolo por defecto: §3 deny-by-default; lo irreversible exige aprobación explícita incluso en modo autónomo.
- Búsqueda de sesiones entre máquinas por agregador: un daemon por túnel; nada de índice central.
- Heartbeats, telemetría o métricas remotas: §9.
- Releases automáticas, nightlies o firma en CI:
procedencia-de-releasey SLSA v1.2; los builds debuild.ymlson artefactos sin firmar de 7 días. - JavaScript o widgets externos en el sitio: spec
product-site; el demo animado va en SVG/WebM autoalojado conprefers-reduced-motion. - Splits infinitos y terminal WebGL: §10 y edit-surface; como máximo dos paneles.
7. Lo que solo una medición real puede confirmar (y hoy no se pudo)
Sección titulada «7. Lo que solo una medición real puede confirmar (y hoy no se pudo)»- Un modelo local vivo bajo Meltemi: falta
ollamaen esta máquina (winget install Ollama.Ollama+ollama pull qwen2.5-coder:7b; luego la receta de la sección 2 ymeltemi session "…" --agent opencode). - Codex con el adaptador corregido: nivel alcanzable,
thread/resume, MCP. - GUI y TUI sobre un socket reenviado por SSH y
sshd → meltemi bridgeen Windows (sin OpenSSH Server aquí). set_config_optiona un modeloollama/…en OpenCode 1.18; forma deupdatedInputpara AskUserQuestion en Claude 2.1.280.- Gemini/Copilot/Cursor/Kiro/Kilo:
bin/acp-argsdel registro nunca ejecutados. russhen el toolchain Windows; render braille en conhost; costo de CPU del tick de la TUI.- Los tres jobs de
build.ymlen runner real y el DMG de macOS por esa ruta.
Anexo — evidencia de la prueba integrada
Sección titulada «Anexo — evidencia de la prueba integrada»- Capturas y logs de la corrida (sesiones JSONL, salidas por paso, dos capturas de la GUI) quedaron en el scratchpad de la sesión de trabajo y no se versionan; la corrida reproducible es la change
corrida-integrada. - Las 39 propuestas que cubren las brechas viven en
.meltemi/changes/y su orden endocs/plan-de-cambios.md(«Orden de abordaje tras el comparativo con Orca»).