# Páginas mínimas creadas (módulos posteriores al Retiro 1)

Fecha: 3 de septiembre de 2026

La prueba de humo (`php docker/smoke_get_routes.php`) reportaba seis rutas GET con error 500
porque los controladores renderizaban componentes Inertia que no existían en `resources/js/Pages`.
Ninguna de esas rutas forma parte del Retiro 1 (DOFA en vivo), pero cualquiera podía abrirlas
por accidente frente al cliente y mostrar una pantalla de error.

Se crearon las seis páginas como **vista mínima de solo lectura**: presentan los datos que el
controlador ya envía, con estado vacío explícito y, cuando el módulo todavía no aplica, un aviso
discreto "Módulo disponible después del Retiro 1". No hay datos inventados ni de ejemplo.

## Qué quedó creado

| Ruta | Componente | Props que consume | Estado |
|---|---|---|---|
| `GET /organizations` | `Setup/Organizations.vue` | `organizations` (con `projects`) | Funcional: lista organizaciones, sus planes y permite crear una nueva (`POST organizations.store`). |
| `GET /projects/{project}/ai/history` | `Ai/History.vue` | `project`, `messages` (paginador) | Funcional: historial paginado de análisis de IA, con módulo, disparador, modelo, tokens y texto completo desplegable. |
| `GET /projects/{project}/cycles/{cycle}/champion` | `Champion/Dashboard.vue` | `project`, `cycle`, `tree`, `summary`, `pendingCheckins`, `cfragenda`, `recentCheckins`, `weekNum` | Vista mínima de lectura. |
| `GET /projects/{project}/cycles/{cycle}/champion/cfr` | `Champion/Cfr.vue` | `project`, `cycle`, `summary`, `tree`, `agenda` | Vista mínima de lectura. |
| `GET /projects/{project}/cycles/{cycle}/retrospective` | `Champion/Retrospective.vue` | `project`, `cycle`, `summary`, `tree`, `latestReport`, `previousCycles` | Vista mínima de lectura. |
| `GET /projects/{project}/cycles/{cycle}/initiatives` | `Okr/Initiatives.vue` | `project`, `cycle`, `initiatives` (agrupadas por título de objetivo) | Vista mínima de lectura. |

Componente auxiliar: `resources/js/Components/AvisoModulo.vue` (aviso discreto reutilizable,
props `texto` y `detalle`).

## Qué falta para completarlas

Estas acciones existen en el backend pero **no tienen botón en la interfaz**, de forma deliberada,
para que nadie dispare una llamada al modelo de IA o un cambio de datos durante el retiro:

- `Champion/Cfr.vue` y `Champion/Dashboard.vue`: falta el botón que llama a
  `POST champion.agenda` (`ChampionController::generateCfrAgenda`) para generar la agenda CFR
  con IA, y refrescar la agenda mostrada sin recargar.
- `Champion/Retrospective.vue`: falta el botón que llama a `POST retro.generate`
  (`RetrospectiveController::generate`, despacha `QuarterlyReportJob`) y el aviso de "informe en
  proceso" mientras la cola trabaja. Falta también la comparación real entre ciclos: hoy solo se
  listan los ciclos anteriores con enlace.
- `Okr/Initiatives.vue`: falta el alta de iniciativas (`POST okr.initiatives.store`, requiere elegir
  resultado clave, responsable y fechas) y la edición de estado y avance
  (`PATCH okr.initiatives.update`). Hoy la página es solo de lectura, incluida la barra de avance.
- `Champion/Dashboard.vue`: falta el enlace directo a registrar el check-in pendiente de cada
  resultado clave (hoy solo se listan) y la actualización en vivo por WebSocket, como sí hace
  `Okr/Tree.vue`.
- `Ai/History.vue`: falta filtrar por módulo o por rango de fechas; la paginación es de veinte
  registros por página, definida en el controlador.
- `Setup/Organizations.vue`: falta editar o desactivar una organización; el controlador solo expone
  `index` y `store`.

## Verificación realizada

- `php docker/smoke_get_routes.php consultor@fycls.com 1 1`: 65 rutas GET, 0 con error 5xx.
- `npm run build`: compilación correcta.
- Revisión en navegador de las seis rutas con sesión de consultor: todas cargan, sin errores de
  consola, con los estados vacíos correctos (el ciclo 1 del proyecto 1 todavía no tiene objetivos).
