plantas-vs-zombies

Cambios del 14 de octubre de 2026: más rápida, más segura y con interfaz nueva

Antes de usarla: 3 pasos que te tocan a ti (5 minutos)

  1. Aplica la migración nueva en Supabase. Abre tu proyecto → SQL Editor → New query, pega todo el archivo supabase/migrations/20261014000005_rendimiento_seguridad_privacidad.sql y pulsa Run. No borra datos de nadie (solo el esquema temporal tmp_imagenes, que sobró de la carga de fotos del catálogo y ya está en seed_imagenes.sql). Yo no pude aplicarla: el permiso para cambiar tu base de datos en la nube fue rechazado las dos veces que lo intenté, así que todo se probó en una copia local con las mismas migraciones. Sin este paso la API nueva no puede identificar (le faltan las funciones nuevas); python -m scripts.diagnostico te lo avisa.
  2. Activa “entrar sin cuenta” (modo invitado): Authentication → Sign In / Providers → Allow anonymous sign-ins → activar. Sin esto, el botón “Empezar sin cuenta” muestra un aviso y te lleva a crear una cuenta.
  3. En Authentication → URL Configuration → Redirect URLs agrega http://localhost:4200/** si no está (el correo que confirma la cuenta de un invitado lleva a /nueva-contrasena para elegir su contraseña).

Opcional: hazte administrador para usar el panel de revisión (ver COMO_EJECUTAR.md).

Velocidad: de ~10 s a ~4 s, con el nombre visible a los ~3 s

Medido con Claude y GBIF reales (5 fotos, base de datos local; con Supabase en la nube súmale unas décimas):

  Antes Ahora
Nombre de la especie visible al final (~10 s en la app) 3.2 s (mediana)
Resultado guardado ~10 s 4.4 s (mediana)

Qué cambió:

Precisión (sin perderla): se midió con python -m scripts.evaluar_ia y 33 fotos reales de iNaturalist de especies conocidas. Antes: 68 % de aciertos de especie (promedio de 2 corridas); ahora: 68 % (promedio de 3). La especie correcta aparece entre las parecidas en el 84 % de los casos (antes 78 %), justo lo que aprovecha “¿Cuál de estas es?”. También se probó responder sin razonar: casi el doble de rápido, pero acertaba 54-58 %, así que se descartó (IA_RAZONAMIENTO=bajo, el valor por defecto). Gasto total en IA de todo este trabajo (evaluaciones y pruebas reales): unos 0.13 dólares.

Seguridad y privacidad

Interfaz nueva

Sistema de diseño propio (“guía de campo moderna”): verde musgo y maíz, tipografía Fraunces (títulos y nombres científicos en cursiva) y Manrope, un color por grupo, modo oscuro (automático o elegido) y fuentes incluidas en la app (no dependen de internet).

Archivos

Pruebas que pasaron

Lo que falta o depende de ti


Cambios del 13 de octubre de 2026 (madrugada del 14): solo Claude, revisión completa

Por qué Claude rechazaba las fotos

Probé tu clave directamente contra Claude. La respuesta real fue: “This API key is not scoped to a workspace, so this request must include the anthropic-workspace-id header”. Tu clave era de ámbito “Organización”, y ese tipo de clave no sirve sola. La API solo mostraba “Claude rechazó la petición” y escondía el motivo. Antes de eso hubo otros dos problemas: en api/.env estaba el identificador de la clave (apikey_…) y después la clave abreviada que muestra la consola (con “…”).

Solución: una clave nueva del espacio de trabajo “Default” (ver COMO_EJECUTAR.md, paso 3b). Si prefieres conservar una clave de Organización, la API ahora acepta ANTHROPIC_WORKSPACE_ID en api/.env.

Qué cambió

Archivos

api/app/ia.py, api/app/config.py, api/app/main.py, api/.env.example (nuevo), api/scripts/diagnostico.py, api/scripts/prueba_real.py, api/tests/conftest.py, api/tests/test_ia.py, api/tests/test_api.py, app/src/app/core/api.service.ts, app/src/app/core/api.service.spec.ts, pruebas/e2e/fake_ia.py, pruebas/e2e/levantar.sh, pruebas/e2e/prueba_e2e.py, .gitattributes (nuevo), COMO_EJECUTAR.md, README.md, CAMBIOS.md. No cambia nada en la base de datos.

Pruebas


Cambios del 13 de octubre de 2026 (noche): la identificación ya funciona de punta a punta

Qué estaba fallando

En los registros de Supabase se veía lo mismo en cada intento: la API validaba la sesión, revisaba el límite y descargaba la foto, pero nunca guardaba el resultado. La falla estaba en Gemini: en varios intentos tardó más de los 45 s que la API esperaba (la app borraba la foto unos 46 s después), y en otros lo rechazó al instante. Nunca se había guardado ni una observación.

Qué cambió

Pruebas que pasaron


Cambios del 13 de octubre de 2026: más rápida y sin límite a Puebla

Por qué tardaba y fallaba

  1. Gemini tardaba más de 60 segundos y la API se rendía (“Gemini tardó demasiado en responder”). Había tres causas:
    • Razonamiento largo: los modelos Gemini 3 “piensan” a fondo por defecto, y eso es lo más lento.
    • Petición pesada: en cada foto se le mandaba el catálogo completo de 95 especies.
    • Fotos grandes: se mandaban a 1600 px.
  2. gemini-2.5-flash ya no está disponible para claves nuevas (corregido el mismo día: ahora se usa gemini-3.8-flash).
  3. Fuera de Puebla la app rechazaba la foto.

Qué cambió

Velocidad

Especies de cualquier lugar, sin guardar de más (“catálogo que crece solo”)

Pantallas

Base de datos: migración supabase/migrations/20261013000004_catalogo_abierto.sql, ya aplicada en tu Supabase. Solo agrega la columna especies.verificada y no borra nada.

Se eliminaron (ya no se usan): api/app/puebla.py, api/app/data/puebla.geojson, api/tests/test_puebla.py.

Pruebas: API 31 de 31, app 14 de 14, base de datos completa y navegador 21 de 21. Las pruebas del navegador incluyen una especie nueva fotografiada en la CDMX que se agrega sola al catálogo. Sin probar todavía: con tu clave real de Gemini y la búsqueda de fotos en Wikipedia, porque desde aquí no hay acceso a esos servicios.


Cambios del 12 de octubre de 2026: correcciones y mejoras

1. Error al subir imágenes (“no tienes internet”)

Causa real: la foto sí se subía a Supabase (se ve en los registros de Storage a las 22:06). Lo que fallaba era el paso siguiente: la API de Python no tenía su configuración (archivo api/.env ausente o incompleto). Al intentar hablar con Supabase con una URL vacía se caía con un error 500 sin los encabezados CORS. Por eso el navegador no podía leer la respuesta y la app lo mostraba como “sin internet”.

Corrección:

2. Base de datos en español

Migración supabase/migrations/20261012000003_base_en_espanol.sql, ya aplicada en tu proyecto de Supabase. Solo renombra objetos, no borra nada. Se conservaron tu perfil, las 95 especies y todo lo que ya existía.

Antes Ahora
profiles (username, role, created_at) perfiles (nombre_usuario, rol, creado_en). Valores de rol: usuario / admin
species (common_name, scientific_name, kingdom, is_protected, …) especies (nombre_comun, nombre_cientifico, reino, protegida, categoria_nom059, introducida, familia, descripcion, imagen_url, imagen_fuente nueva, …)
observations (user_id, photo_path, species_id, ai_confidence, status, is_public, …) observaciones (usuario_id, ruta_foto, especie_id, ia_confianza, estado, es_publica, …)
vista public_observations vista observaciones_publicas
funciones is_admin, handle_new_user, username_disponible es_admin, crear_perfil, nombre_usuario_disponible

También se renombraron índices, restricciones y disparadores. La app, la API, el catálogo, las pruebas y la guía usan los nombres nuevos.

3. Imágenes que no cargaban

Causa: ninguna especie del catálogo tenía foto (imagen_url vacía), y la app no tenía qué mostrar cuando una imagen fallaba.

Corrección:

4. Tamaño y proporciones de las imágenes

5. Revisión general

Archivos modificados

API (Python): api/app/main.py, api/app/config.py, api/app/supabase_client.py, api/app/ia.py, api/.env.example, api/requirements.txt, api/scripts/catalogo_gbif.py, api/tests/conftest.py, api/tests/test_api.py, api/tests/test_ia.py, api/tests/test_catalogo_gbif.py

App (Angular/Ionic):

Base de datos: supabase/migrations/20261012000003_base_en_espanol.sql (nuevo), supabase/seed_imagenes.sql (nuevo), supabase/seed.sql, supabase/tests/01_pruebas_rls.sql

Pruebas y documentación: pruebas/e2e/levantar.sh, pruebas/e2e/prueba_e2e.py, pruebas/e2e/fake_ia.py, COMO_EJECUTAR.md, README.md, CAMBIOS.md

Pruebas que pasaron

Sin probar todavía: la app conectada a tu Supabase real con Gemini real. Desde aquí no hay acceso de red a Supabase, así que esa prueba la haces tú.