# Estado del proyecto

Qué hay en producción, qué falta y qué está pendiente de decidir. Es la **lista
única de pendientes**: si algo no está aquí, no está pendiente. Se actualiza al
terminar cada tarea.

Última revisión: 24-oct-2026.

## En producción

- https://chat.englishworldcenter.com con `main` en `28ea7c8`, desplegado el
  24-oct-2026 con `./upgrade-production.sh` (sin migraciones). Qué incluye:
  [CHANGELOG.md](../CHANGELOG.md).

## Pendientes

### Seguridad (urgente)

- [ ] **Registro abierto: arreglado en el código, falta desplegarlo.**
  `POST /api/auth/register` era público y creaba el usuario con el `role` que
  llegara en la petición, `ADMIN` incluido. Desde `076e8b9` la ruta no existe
  (devuelve 404) y, si algún día se reactiva, solo crea alumnos. Probado en
  local. Falta:
  - desplegarlo con `./upgrade-production.sh`;
  - revisar en producción que no haya cuentas ADMIN o TEACHER desconocidas.
    Es una consulta de solo lectura, en el servidor:

    ```bash
    docker exec -e PGOPTIONS='-c default_transaction_read_only=on' ai-learning-platform-ewc-postgres psql -U postgres -d ai_learning_platform -c "select email, role, created_at from users where role in ('ADMIN', 'TEACHER') order by created_at;"
    ```

  - mirar en el log si alguien llegó a registrarse por esa vía. Si no sale
    nada, nadie lo usó, siempre que el log guarde el nivel `info`, que es el
    de por defecto:

    ```bash
    docker exec ai-learning-platform-ewc-backend grep -h "User registered successfully" /app/logs/combined.log
    ```
- [ ] **`GET /api/elevenlabs/conversation/:conversationId` no exige sesión**
  ([routes/elevenlabs.ts:97](../backend/src/routes/elevenlabs.ts#L97)); la
  propia ruta se describe como «temporal». Solo la protege la cabecera
  `x-elevenlabs-webhook-secret`, y únicamente si `ELEVENLABS_WEBHOOK_SECRET`
  está definida en el `.env` (no comprobado). Si no lo está, quien tenga un id
  de conversación de ElevenLabs puede leer su transcripción y su análisis. El
  webhook `POST /api/elevenlabs/webhooks/evaluation` tiene la misma
  comprobación opcional. Decidir si se quita la ruta o se protege.
- [ ] Contraseñas escritas en el repo:
  - `create-admin-user.js` crea un ADMIN con el email y la contraseña escritos
    en el propio script. Si se usó en producción, comprobar que esa contraseña
    se cambió.
  - Las cuentas demo del seed (`@example.com`) tienen sus contraseñas en
    `backend/src/prisma/seed.ts`. Comprobar que no existen en producción.

### Importantes

- [ ] **`scripts/migrate-database.sh` dice siempre «OK»** aunque `prisma
  migrate deploy` falle. En las líneas 68-69, el `$?` que va detrás de
  `local var=$(…)` recoge el código de `local`, no el del comando. Además,
  `test_all_migrations_applied` solo mira una migración (`add_openai_config`).
  Ya pasó: la migración `20260815120000_add_bot_transcription_language` quedó
  marcada como fallida en `_prisma_migrations` sin que el script avisara, y se
  resolvió a mano con `prisma migrate resolve --applied`. **Arreglarlo antes
  del próximo despliegue con migración.**
- [ ] Comprobar en producción el modal de cuota de 4 o 5 alumnos: tiene que
  poner «Contando desde el 1 oct 2026» y el mismo tiempo restante que el
  informe del 24-oct (`../encargos/2026-10-arreglo-cuotas-1-nov/sql/`, fuera
  del repo). Una vez comprobado, esa carpeta se puede borrar.
- [ ] **Guías de usuario desfasadas** (`../documentacion/`, fuera del repo).
  Antes de volver a entregarlas a EWC hay que corregir:
  - que el profesor gestiona cuotas: solo lo hace el admin desde `aea496b`
    (21-sep);
  - que la cuota es mensual: no se reinicia desde `2b9e5ce` (24-oct);
  - que el modal de cuota está en inglés: está traducido desde `216a279`
    (21-sep);
  - que la app habla de «bots» («Mis bots»): desde `7a7107a` (24-sep) dice
    «auxiliares» («Mis auxiliares»).

### Esperando a EWC

- [ ] Sistema nuevo de cuotas: paquetes, pausa, pantalla «Cuotas del
  alumnado», descargas y extras con fecha propia. La propuesta y el plan
  técnico están en `../encargos/2026-10-sistema-cuotas/` (fuera del repo); las
  decisiones abiertas D-1 a D-6, en el §7 del plan. Si EWC confirma, primero
  hay que arreglar `migrate-database.sh` (el sistema nuevo lleva migración) y
  después crear `specs/001-sistema-cuotas/` con la parte técnica del plan.

### Por confirmar (Carla)

- [ ] R3 (nota de asignación) y R4 (auxiliar equivocado): el plan de julio los
  dejó «pendientes de probar».
- [ ] F5, configuración de cada agente en el panel de ElevenLabs. Solo consta
  aplicado el párrafo de despedida en «maria»; falta en el resto (incluido
  «Max») y no consta el resto del checklist. Sin ese párrafo, el auxiliar
  ignora el aviso de los 40 s. Checklist y texto en
  [features/conversations.md](features/conversations.md#configuración-de-cada-agente-en-elevenlabs).

### Mejoras sin decidir

- [ ] Mostrar minutos y segundos en el modal de cuota. Hoy redondea hacia
  abajo: 26 s salen como «0 min».
- [ ] Quitar el botón «Ver» del historial del chat
  ([ConversationHistory.vue:76](../frontend/src/components/ConversationHistory.vue#L76)).
  Muestra lo mismo que la pestaña «Transcripción» del feedback, solo que en
  burbujas, y no existe en el resto de la app. Si se quita, sobran
  `isViewMode` y `viewedConversation` en `ChatView.vue`. Idea del 1-ago-2026.
- [ ] Rutas sin enlace en ningún menú: `/admin/feedbacks`, `/admin/settings` y
  `/teacher/progress`. Comprobado el 24-oct: solo aparecen en
  `router/index.ts`. Decidir si se enlazan o se quitan.
- [ ] Mensajes de error de la API: G2 no los tradujo. Revisar si salen en
  inglés en producción.
- [ ] Texto sin traducir: la etiqueta «Feedback Instructions» de
  [BotModal.vue:217](../frontend/src/components/BotModal.vue#L217) está
  escrita a mano, sin `t()`.

### Herramientas de desarrollo

- [ ] **El lint del backend no funciona**: ESLint 9 pide un `eslint.config.js`
  y `backend/` no lo tiene, así que `npm run lint` falla antes de revisar
  nada. Mientras tanto, la comprobación del backend es `npm run build`.
- [ ] `test/comprehensive-api-test.js` está desfasado. Lee `data.accessToken`,
  pero el login devuelve `data.token`, así que las pruebas con sesión no
  llegan a ejecutarse. Además, empieza registrando un alumno con el endpoint
  que ya está cerrado. Actualizarlo o retirarlo.

### Limpieza local

- [ ] BD local de Carla:
  - alumnos de prueba `fixbots-*`, dejados a propósito para buscar errores; se
    borran con `delete from student_bot_access where student_id like
    'fixbots-%'; delete from users where id like 'fixbots-%';`;
  - `student@example.com` con 120 s de cuota;
  - `system_config.quota_management_enabled` a `true`.
- [ ] 7 ramas locales ya mergeadas en `main` (`git branch --merged main`).
