{
  "harness-local": {
    "fecha": "2026-08-15",
    "pregunta": "¿Sirve el DeepSeek Harness con un modelo local, y cuánto rinde en un benchmark estándar?",
    "por_que_importa": "Toda la cobertura describe el harness con la API oficial de DeepSeek. Nadie publicó qué pasa con un modelo local.",
    "montaje": {
      "harness": {
        "repo": "deepseek-ai/deepseek-harness",
        "commit": "47f9438",
        "licencia": "MIT",
        "tamano_clon_mb": 80,
        "archivos_ts_js": 2587,
        "instalacion_s": 28,
        "build_s": 147,
        "adaptadores_de_fabrica": [
          "llm-deepseek",
          "llm-pi-ai"
        ],
        "adaptador_openai_compatible": false,
        "hallazgo": "No trae adaptador para modelos locales, pero su ruta de proveedor personalizado habla el protocolo de OpenAI, que es el que expone ollama. No hace falta escribir código."
      },
      "modelo": {
        "id": "qwen3.8:27b",
        "parametros": "27.3B",
        "cuantizacion": "Q4_K_M",
        "blob_gb": 17,
        "contexto_nativo": 262144,
        "capacidades": [
          "texto",
          "visión",
          "herramientas",
          "razonamiento"
        ]
      },
      "hardware": {
        "gpu": "RTX 4070 Ti SUPER 16 GB",
        "cpu": "Ryzen 7 7800X3D",
        "ram_gb": 30,
        "runtime": "ollama 0.32.13"
      },
      "configuracion": "~/.dsh/settings.yaml: proveedor llm-pi-ai con api openai-completions apuntando a ollama, más agent-default-model"
    },
    "tropiezos": [
      {
        "sintoma": "412 al descargar el modelo",
        "causa": "ollama 0.20.3; el manifiesto exige 0.32.12",
        "fix": "actualizar ollama"
      },
      {
        "sintoma": "descarga muerta a los 4 GB",
        "causa": "TLS handshake timeout",
        "fix": "bucle de reintentos; ollama pull reanuda"
      },
      {
        "sintoma": "el agente respondía sobre una escena de Three.js sin relación con la tarea",
        "causa": "OLLAMA TRUNCABA EL PROMPT EN SILENCIO: limit=2050, prompt=8195, keep=4. Descartaba el 75%, incluida la tarea. Solo se ve en el log del servidor.",
        "fix": "OLLAMA_CONTEXT_LENGTH=32768",
        "importancia": "Este es el hallazgo central: explica por qué mucha gente cree que 'los modelos locales no sirven para agentes'."
      },
      {
        "sintoma": "MISSING_CREDENTIAL en fedora",
        "causa": "la configuración estaba en el Mac",
        "fix": "copiar settings.yaml al host que ejecuta"
      }
    ],
    "prueba_humo": {
      "nota": "Verificado por el resultado en disco, no por lo que dijo el agente",
      "tareas": [
        {
          "nombre": "escribir archivo de 3 líneas",
          "resultado": "OK",
          "segundos": 80
        },
        {
          "nombre": "leer JSON y editarlo",
          "resultado": "OK",
          "segundos": 166
        },
        {
          "nombre": "crear módulo + test y ejecutarlo",
          "resultado": "OK",
          "segundos": 150
        }
      ]
    },
    "swe_bench_verified": {
      "protocolo": "El agente ve SOLO el enunciado del issue. Nunca el parche de referencia ni los tests de evaluación. Repositorio en el commit base. Se extrae el diff, se aplica el test_patch oficial y se corren los FAIL_TO_PASS.",
      "muestra": "3 instancias de dificultad '<15 min fix', de repositorios distintos. NO es una medición estadística: es un termómetro.",
      "limite_por_instancia_s": 3600,
      "instancias": [
        {
          "id": "astropy__astropy-14309",
          "repo": "astropy/astropy",
          "archivos_py": 942,
          "segundos": 3581,
          "lineas_diff": 0,
          "resuelta": false,
          "nota": "No falló por incapacidad: agotó el límite. Su última salida era 'The checkout imports now. Reproduce the bug:', o sea iba por el camino correcto. 30 llamadas al modelo en esa hora."
        },
        {
          "id": "django__django-13297",
          "repo": "django/django",
          "segundos": 3377,
          "lineas_diff": 57,
          "resuelta": true,
          "test": "generic_views.test_base.DeprecationTests.test_template_params_filtering",
          "veredicto_test": "Ran 1 test OK, exit 0",
          "nota": "Eliminó el envoltorio de deprecación _wrap_url_kwargs_with_deprecation_warning y pasó los kwargs directos."
        },
        {
          "id": "matplotlib__matplotlib-13989",
          "repo": "matplotlib/matplotlib",
          "segundos": 2101,
          "lineas_diff": 13,
          "resuelta": true,
          "test": "lib/matplotlib/tests/test_axes.py::test_hist_range_and_density",
          "veredicto_test": "1 passed",
          "nota": "SEMÁNTICAMENTE IDÉNTICO al arreglo oficial: la referencia hace hist_kwargs['density']=density, el agente hist_kwargs.update(density=density). Encontró la misma línea sin ver el parche."
        }
      ],
      "marcador": "2 de 3",
      "honestidad": "Tres instancias no son una medición estadística y se eligieron entre las fáciles. El cuello de botella observado es el tiempo, no la capacidad."
    },
    "contexto_medido_previamente": {
      "referencia": "/blog/qwen38-27b-16gb",
      "dato_clave": "El blob de 17 GB no cabe en 16 GB de VRAM: hay derrame a CPU en todos los contextos (25% a ctx 4096, 34% a ctx 32768). La GPU baja al 15% de uso con contexto grande.",
      "implicacion": "Un agente genera contexto grande por diseño, así que el derrame no es opcional: es el precio de entrada."
    }
  },
  "colibri-deepseek-v4": {
    "fecha": "2026-08-15",
    "pregunta": "¿Se puede correr un modelo de 284B en una máquina de 30 GB de RAM?",
    "respuesta_corta": "Sí. Responde correcto, leyendo los expertos desde el disco.",
    "montaje": {
      "motor": {
        "proyecto": "JustVugg/colibri",
        "version": "1.5.0",
        "licencia": "no declarada en el clon; repo público",
        "lenguaje": "C puro, cero dependencias",
        "compilacion_cpu_s": 6.0,
        "compilacion_vulkan_s": 7.4,
        "compilacion_deepseek_v4_s": 7.3,
        "unidades_compilacion_v4": 26,
        "binario_v4_mb": 0.3
      },
      "modelo": {
        "id": "deepseek-ai/DeepSeek-V4-Flash-0731",
        "parametros_totales": "284B",
        "parametros_activos": "13B",
        "arquitectura": "DeepseekV4ForCausalLM",
        "capas": 43,
        "expertos_routed": 256,
        "expertos_por_token": 6,
        "cuantizacion": "fp8 e4m3, escalas ue8m0",
        "disco_gb": 166.9,
        "shards": 48,
        "descarga_horas_aprox": 4.5,
        "verificacion": "74 de 74 archivos con tamaño exacto contra el repositorio. 0 truncados, 0 ausentes.",
        "por_que_verificar": "La documentación advierte que una descarga puede terminar con un shard truncado y reportar éxito igual."
      },
      "hardware": {
        "cpu": "Ryzen 7 7800X3D",
        "ram_gb": 30,
        "disco": "NVMe",
        "gpu_usada": false
      }
    },
    "tropiezos": [
      {
        "sintoma": "coli doctor y coli plan reportan '166.9 GB dense' y fallan por RAM",
        "causa": "El planificador genérico no separa expertos de denso en este checkpoint",
        "realidad": "El motor específico sí lo hace: dense=resident(6.27GiB)",
        "leccion": "El diagnóstico genérico contradice al motor real; hay que probar el motor."
      },
      {
        "sintoma": "solo 14 GB de RAM disponibles",
        "causa": "llama-server de ollama con 21 GB de RSS",
        "fix": "descargar el modelo"
      },
      {
        "sintoma": "10.8 GB de VRAM ocupados",
        "causa": "ComfyUI abierto de otra tarea",
        "fix": "cerrarlo (aunque este motor no usa GPU)"
      }
    ],
    "corrida": {
      "prompt": "Responde en una linea: cuanto es 17 por 23?",
      "respuesta": "17 por 23 es 391.",
      "correcta": true,
      "ram_residente_gb": 6.267,
      "presupuesto_ram_gb": 20,
      "modo_lectura": "direct-aligned (sin respaldo a buffered: fallbacks=0)",
      "tokens_prompt": 18,
      "tokens_generados": 9,
      "peticiones_de_expertos": 6708,
      "aciertos_cache": 4119,
      "fallos_cache": 2589,
      "tasa_acierto_pct": 61.4,
      "bytes_leidos_disco": 32577159168,
      "gb_leidos_disco": 30.3,
      "time_to_first_token_s": 35.042,
      "resto_generacion_s": 10.382,
      "perfil_uso_guardado": ".coli_usage con 2192 expertos distintos de 6708 pedidos",
      "pin_slots_por_capa": 16
    },
    "lo_notable": "6.27 GB residentes para un modelo de 167 GB. No lo carga: lo transmite desde el disco. El 61% de aciertos en caché es lo que evita que sea inusable.",
    "harness_viabilidad": {
      "pregunta": "¿Sirve DeepSeek V4 Flash vía Colibrì como motor de un agente?",
      "respuesta": "No con este motor hoy. La velocidad lo impide.",
      "medicion": {
        "llamada_corta": {
          "segundos": 60.1,
          "prompt_tokens": 8,
          "salida_tokens": 16,
          "tok_s": 0.27,
          "estado": "medida"
        },
        "llamada_media": {
          "segundos": 179,
          "estado": "FALLO",
          "error": "HTTP 500 del servidor de colibri"
        },
        "llamada_larga": {
          "estado": "NO MEDIDA",
          "motivo": "se detuvo el servidor antes de ejecutarla (error de secuencia mio, no del motor)"
        },
        "nota": "Modelo ya cargado; no incluye arranque. El fallo 500 en la llamada media es del servidor y no se investigo a fondo."
      },
      "limites_del_servidor": {
        "concurrencia": "una peticion a la vez; las demas reciben 429",
        "espera_cola_por_defecto_s": 300,
        "implicacion": "Sin paralelismo: cada paso del agente espera al anterior."
      },
      "gpu": {
        "soportada": false,
        "evidencia": "deepseek_v4.c tiene 0 hooks CUDA y 0 Vulkan; el motor principal (colibri.c) tiene 112 y 42, y kimi_k3.c tiene 9 Vulkan.",
        "consecuencia": "Los 35 s hasta el primer token y los 30 GB leidos de disco se lograron SIN GPU."
      },
      "extrapolacion": "Una instancia de SWE-bench necesito 30 llamadas al modelo con Qwen. A 60 s por llamada corta, y creciendo con el contexto, serian horas por instancia."
    }
  },
  "bonsai-ternario": {
    "fecha": "2026-08-15",
    "pregunta": "¿Un 27B en 2 bits que cabe entero en la tarjeta rinde mejor como agente que uno de la misma familia que se derrama a CPU?",
    "respuesta_corta": "Empatan en aciertos. El que cabe entero lo hace once veces más rápido.",
    "modelo": {
      "id": "prism-ml/Ternary-Bonsai-27B-gguf",
      "archivo": "Ternary-Bonsai-27B-Q2_g64.gguf",
      "gb": 7.06,
      "base": "Qwen/Qwen3.6-27B",
      "cuantizacion": "ternaria 2 bits, agrupación 64",
      "licencia": "apache-2.0",
      "arquitectura_gguf": "qwen35",
      "afirmaciones_del_autor": {
        "reduccion_vs_fp16": "9.4x",
        "inteligencia_retenida_pct": 95,
        "promedio_15_benchmarks": 80.49,
        "conserva_comportamiento_agentico": true,
        "tok_s_en_m5_pro": 26
      }
    },
    "montaje": {
      "motor": "llama.cpp commit ece963f, compilado con Vulkan (sin CUDA toolkit en la máquina)",
      "hardware": "RTX 4070 Ti SUPER 16 GB · Ryzen 7 7800X3D · 30 GB RAM",
      "servicio": "systemd, /mnt/ai-fast/bonsai/up.sh"
    },
    "busqueda_del_tope_de_vram": {
      "metodo": "subir contexto hasta que falle y quedarse un escalón antes",
      "medidas": [
        {
          "ctx": 16384,
          "np": 4,
          "vram_mib": 8687,
          "margen_mib": 7689,
          "levanta": true
        },
        {
          "ctx": 32768,
          "np": 4,
          "vram_mib": 9716,
          "margen_mib": 6660,
          "levanta": true
        },
        {
          "ctx": 65536,
          "np": 4,
          "vram_mib": 11772,
          "margen_mib": 4604,
          "levanta": true
        },
        {
          "ctx": 131072,
          "np": 4,
          "vram_mib": 15884,
          "margen_mib": 492,
          "levanta": true,
          "nota": "techo real, margen demasiado fino"
        },
        {
          "ctx": 262144,
          "np": 4,
          "levanta": false
        }
      ],
      "elegido": {
        "ctx": 65536,
        "np": 1,
        "vram_mib": 11371,
        "n_ctx_slot": 65536
      }
    },
    "tropiezos": [
      {
        "sintoma": "systemd falla con 203/EXEC",
        "causa": "SELinux: binarios compilados en /mnt/ai-fast nacen sin etiqueta",
        "fix": "chcon -t bin_t sobre el binario y el script"
      },
      {
        "sintoma": "las tres instancias terminaban en menos de 60 s con diff vacío",
        "causa": "CONTEXT_WINDOW_EXCEEDED: -c es el contexto TOTAL y se reparte entre las ranuras (-np). Con -c 65536 -np 4 cada petición veía 16384 y el agente pedía 18180.",
        "fix": "-np 1: toda la ventana para una petición",
        "importancia": "Segundo caso del mismo patrón en el día (el primero fue el truncado silencioso de ollama): el modelo local parece incapaz cuando lo mal configurado es la ventana. Y el síntoma engaña: parecía velocidad, era el agente estrellándose."
      }
    ],
    "rendimiento": {
      "problema_canonico": {
        "correcta": true,
        "segundos": 13.0,
        "tokens_salida": 681,
        "tok_s": 52.3,
        "razonamiento_chars": 1675
      },
      "tarea_agente_simple": {
        "segundos": 15.7,
        "comparacion_qwen_s": 80
      }
    },
    "swe_bench_verified": {
      "protocolo": "idéntico al de Qwen: el agente ve solo el enunciado, nunca el parche ni los tests; límite 3600 s; misma máquina y mismo harness",
      "instancias": [
        {
          "id": "astropy__astropy-14309",
          "segundos": 314,
          "lineas_diff": 15,
          "resuelta": true,
          "test": "astropy/io/fits/tests/test_connect.py::test_is_fits_gh_14305",
          "veredicto": "1 passed",
          "nota": "Distinta del arreglo de referencia pero válida: protege el acceso a args cuando la tupla viene vacía, en vez de reordenar el retorno. Qwen NUNCA terminó esta instancia."
        },
        {
          "id": "django__django-13297",
          "segundos": 342,
          "lineas_diff": 24,
          "resuelta": false,
          "nota": "Entendió el problema (los objetos perezosos rompen en consultas) pero eligió un parche defensivo: desenvolverlos en ContextMixin. Plausible y bien razonado, pero no es lo que el test espera. Qwen sí acertó aquí."
        },
        {
          "id": "matplotlib__matplotlib-13989",
          "segundos": 132,
          "lineas_diff": 13,
          "resuelta": true,
          "test": "lib/matplotlib/tests/test_axes.py::test_hist_range_and_density",
          "veredicto": "1 passed"
        }
      ],
      "marcador": "2 de 3",
      "tiempo_total_s": 788
    },
    "comparacion_directa": {
      "nota": "Una sola variable cambia: si el modelo cabe entero en la tarjeta.",
      "qwen3.8_27b": {
        "gb": 17,
        "vram_mib": 14724,
        "ctx": 32768,
        "reparto": "34% CPU / 66% GPU",
        "tok_s": 28.9,
        "swe_bench": "2/3",
        "tiempo_total_s": 9059
      },
      "bonsai_27b_ternario": {
        "gb": 7.06,
        "vram_mib": 11371,
        "ctx": 65536,
        "reparto": "100% GPU",
        "tok_s": 52.3,
        "swe_bench": "2/3",
        "tiempo_total_s": 788
      },
      "conclusion": "Empatan en aciertos y resuelven instancias DISTINTAS. Bonsai es 11.5x más rápido en total. Para agentes locales pesa más que el modelo quepa entero que su precisión numérica."
    }
  }
}