# Fermenty — El sistema de consejos y su pantalla de admin

> Briefing v2. Sustituye a v1, que partía de una lectura equivocada del inventario:
> **los consejos de paso no están publicados.** La Fase 0 (`docs/Consejos_Admin.md` §10)
> sigue siendo válida como inventario de tabla, modelo y lectores.
>
> Referencias: `docs/Consejos_Admin.md` (Fase 0), `docs/Planes.md` (§2, §3, §6a, §8),
> `docs/01_LEXICO.md` (§2 Consejo, §6 Herencia con sobreescritura).
>
> Documento vivo · v2 · 2026-08-03 · **Ejecutado el 2026-08-03** — pantalla en
> `/acp/consejos`, parches de §8 aplicados, ficha pública sin consejos de paso.
> §7a/§7b siguen abiertas: mientras tanto, categoría y fermento solo escriben
> con síntoma.

---

## 1. El modelo: el nivel no es la ventana

Éste es el punto donde v1 se equivocaba y del que sale todo lo demás.

**El nivel dice hasta dónde es cierto un consejo.** Cada uno vive en el nivel más general
en el que sigue siéndolo: general, categoría, fermento, paso.

**Los campos dicen por qué ventana sale.** `is_daily`, `symptom`, y la FK a paso.

Son **dos ejes independientes**, y hace falta que lo sean. La prueba es el moho: es un
síntoma y es general —«qué hacer si aparece moho» vale para cualquier fermento—. Si el
nivel determinara la ventana, un síntoma general sería irrepresentable.

Un mismo cerebro de conocimiento, tres ventanas.

---

## 2. Las tres ventanas

| Ventana | Qué filas lee | Cómo resuelve | Dónde sale |
|---|---|---|---|
| **Diario** | `general` con `is_daily` | Rotación por `dayOfYear` | Dashboard web, inicio PWA, y widget en la pública |
| **Proactivo** | Las que cuelgan de un paso | Solo ese paso | Guía, dentro de una tanda real |
| **Solucionador** | Las que tienen `symptom` | **Sube hasta encontrar**: fermento → categoría → general | 🔜 No existe |

**El solucionador es la cuarta instancia de herencia con sobreescritura**, y funciona
exactamente igual que las otras tres del Léxico §6: si el fermento no tiene remedio para
ese síntoma, se sube a la categoría; si tampoco, al general. Por eso *«la sal en
vegetales»* no necesita pantalla propia — **categoría es alcance, no destino.**

Las otras dos ventanas no heredan: el consejo del día es una rotación plana, y el
proactivo es del paso o no es.

### El consejo de fermento tiene dos usos, no uno

Un consejo de nivel fermento **con** síntoma alimenta el solucionador. Uno **sin**
síntoma —*«compra las verduras el mismo día de la preparación»*— no tiene hoy dónde
salir. La idea es que salga **al elegir la receta**, antes de arrancar la tanda.

Eso es una **cuarta ventana**, y hay que decidirla antes de abrir el nivel en el admin
(§7a). No es gratis: es un renderizador nuevo en una pantalla que hoy no pinta consejos.

---

## 3. Qué ve cada plan

| Qué | Ventana | Plan |
|---|---|---|
| Avisos del motor, barandillas, la ventana de corte | El mentor | **Gratis** — no se toca, y no es esto |
| Consejo del día | Portada y widget público | **Gratis** — ya lo está |
| Consejo de paso | Guía, dentro de la tanda | **Pro** |
| Solucionador síntoma → remedio | El 101 | **Pro**, salvo §5 |
| Consejo de fermento al elegir receta | 🔜 | 🔴 Sin decidir (§7b) |

**El mentor es gratis y da pistas. Los consejos son otra cosa.** Un aviso del motor sale
de tu formulación de hoy y vive en `notification_rules` / `insights` / la Voz. Un consejo
es conocimiento editorial que no depende de tu tanda. No se mezclan ni en la tabla ni en
el discurso.

**Esto es legítimo y es ahora.** Los de paso nunca se publicaron; el solucionador no
existe. Nada que estuviera gratis pasa a Pro (`Planes.md` §8), y §6a dice explícitamente
que con un puñado de usuarios éste es el único momento en que se puede hacer.

### El muro es invisible, y eso tiene un precio

Decidido: en público los consejos de paso **no existen**. No hay candado, ni teaser, ni
«desbloquea con Pro». Es coherente con el tono del proyecto y evita el peor patrón de la
categoría.

La contrapartida, para que esté escrita: **un usuario gratis nunca descubre que existen.**
No hay descubrimiento pasivo, así que la conversión tiene que venir de otro sitio —`/pro`,
el correo de cierre, la nota calibrada—. Si dentro de unos meses los consejos de paso no
mueven conversión, la causa candidata es ésta y no la calidad del contenido.

---

## 4. Qué niveles se abren en el admin

Los cuatro. Pero tres escriben para ventanas que aún no existen, y eso hay que verlo en
pantalla, no descubrirlo después.

| Nivel | Qué se puede escribir hoy | Ventana |
|---|---|---|
| `general` | `is_daily` (vivo) · `symptom` (sin lector) | Diario ✓ · Solucionador 🔜 |
| `category` | Solo `symptom` | Solucionador 🔜 |
| `ferment` | `symptom` · y sin síntoma solo si entra §7b | Solucionador 🔜 |
| `step` | Consejo del paso | Proactivo ✓ |

**Por qué se abre lo que no tiene lector todavía**, al revés que en v1: el cuello de
botella del solucionador no es la interfaz, es el contenido. Escribir remedios es
semanas; la pantalla que los muestra es una tarde. Cerrar el admin hasta que exista el
lector garantiza que el día que exista esté vacío.

**Pero se marca.** Toda fila con `symptom` lleva en el listado un distintivo de *«todavía
no sale en ninguna pantalla»*. Es la diferencia entre una pista de despegue y un cajón.

🔴 **Vencimiento:** si el solucionador no está construido cuando toque revisar este
documento, se revisa la decisión de seguir escribiendo contenido sin destino.

---

## 5. La excepción de seguridad

Dentro del solucionador, `moho` y `sobrepresion` **no son problemas de calidad, son
seguridad**, y salen para todos. Los otros cuatro —`flojo`, `demasiado_dulce`,
`demasiado_acido`, `sin_gas`— son «no salió como querías», y ésos son el 101.

`Planes.md` §3.2 prohíbe cobrar por barandillas. Son justo los dos casos en que el usuario
tiene delante algo que se va a comer o algo que puede reventar: es el peor momento posible
del producto entero para enseñar una pantalla de suscripción.

**Se deriva, no se marca.** No hay interruptor en el formulario:

```
es de Pro  ⟺  symptom IS NOT NULL  Y  symptom ∉ {moho, sobrepresion}
```

La pantalla enseña la consecuencia al elegir el síntoma —una línea diciendo si saldrá para
todos o solo para Pro—. Quien escribe tiene que saber para quién escribe.

---

## 6. La pantalla

### Listado

Tabla agrupada o filtrable por nivel. Columnas: nivel, dueño, título, `locale`,
`is_daily`, `symptom`, `order`, y el distintivo de §4. Filtros: nivel, dueño, `locale`.
Tres desplegables, no un panel.

**El agrupado por dueño es lo que la hace útil.** Ver los pasos de un fermento con sus
consejos debajo es lo que permite detectar el hueco; una lista plana por id, no.

**93 filas.** Sin buscador, sin paginación elaborada, sin importación masiva. Si una
decisión solo tiene sentido con miles de filas, está fuera.

### Formulario

| Campo | Control | Regla |
|---|---|---|
| `level` | Selector, `Hint::NIVELES` | Literal. Al cambiarlo cambia el selector de dueño |
| Dueño | Selector **dependiente** | `general` no lo tiene |
| `locale` | es / en / de | §6 idiomas |
| `title`, `content` | Texto | El formato que ya usan las 93 filas. No se introduce editor rico nuevo |
| `order` | Numérico | Dentro del mismo dueño y `locale` |
| `is_daily` | Interruptor | Solo en nivel `general` |
| `symptom` | Selector nullable | Los seis de §5, ni uno más |

**El selector de dueño dependiente es el 80 % del valor de la pantalla.** Elegido `step`,
primero fermento y luego paso *de ese fermento*. Un selector plano con todos los pasos del
sistema es inservible en cuanto haya diez fermentos. Es lo que no se recorta si la sesión
se alarga.

**La validación se apoya en el modelo, no lo duplica.** La regla de integridad —exactamente
la FK del nivel rellena, las demás nulas— ya vive en el evento `saving` de `Hint`. Si
rechaza, el error se enseña legible. No se escribe una segunda copia en el controlador ni
en un `FormRequest`: sería el problema del único dueño otra vez.

### Idiomas

Filas hermanas con `locale`, caída a español en `Hint::enLocale()`. **El esquema no se
toca.** Lo que la pantalla añade: al editar, enseñar si tiene hermanas y en qué idiomas, y
ofrecer «crear la versión en `en` / `de`» partiendo del texto actual, para que lo escriba
una persona. Sin eso, un consejo nace en español y nadie se entera de que faltan dos.

Estado real: los 30 diarios en los tres idiomas; los 3 de paso solo en español.

### El recuento de diarios

La rotación depende del **número de filas con `is_daily` en ese `locale`**. Borrar o añadir
una descoloca la rotación entera de ese idioma, y si los tres recuentos dejan de coincidir,
dos usuarios ven consejos distintos el mismo día sin motivo.

Al listar los diarios: enseñar el recuento por `locale` y marcarlo cuando no coincidan. Es
una línea y evita una clase entera de incidencia que si no se descubre por informe de
usuario.

---

## 7. 🔴 Decisiones abiertas

**a) ¿Entra la ventana de consejo de fermento al elegir receta?** Sin ella, el nivel
`ferment` solo sirve para escribir síntomas y el ejemplo de las verduras no tiene sitio.
Con ella, hace falta un renderizador nuevo en la pantalla de receta. No bloquea el admin,
pero sí decide si el nivel se abre entero o solo con síntoma.

**b) Y si entra, ¿es gratis o Pro?** Sale **antes** de arrancar la tanda, en el momento de
elegir. Argumento para gratis: es lo único de este sistema que un usuario sin suscripción
llegaría a ver, y da una muestra del oficio justo antes de decidir. Argumento para Pro:
coherencia con los de paso, que salen dos pantallas después. **Recomendación: gratis**, por
lo dicho en §3 sobre el muro invisible — es la única superficie donde el sistema puede
demostrar que existe.

**c) El documento base del mentor sigue sin escribir.** Ata la jerarquía de niveles con las
dos capas de valor y con el 101. Esta pantalla no lo necesita; el solucionador sí.

---

## 8. Parches a otros documentos, en el mismo commit

### `docs/Planes.md`

Dos sitios dicen hoy lo contrario de §3 y mandan sobre `/pro` y los candados:

- **§2, tabla de las tres capas.** La fila «Consejo (`guide_step_hints`) — De nada, es el
  mismo para todos — *Gratis, público, indexable*» es falsa en las dos mitades: la tabla ya
  no existe y los consejos de paso son Pro y no públicos. Se reescribe con las tres ventanas
  de §2 de este documento y su plan.
- **§3.1.** «Las guías completas: proceso, pasos, consejos, identidad pública» — quitar
  *consejos* de la enumeración. Lo que nunca va tras el muro sigue siendo el proceso, los
  pasos y la identidad; los consejos pasan a ser lo que Pro añade encima.
- **Fila nueva en el bloque «Contigo»:** el solucionador. Con la excepción de seguridad de
  §5 escrita, no implícita.

### `docs/01_LEXICO.md`

- **§2 Consejo.** Hoy lo define como prosa estática colgada de un paso, en
  `guide_step_hints`. Eso ya solo describe uno de los cuatro niveles y una tabla que no
  existe. Se reescribe con los dos ejes de §1: nivel (hasta dónde es cierto) y ventana
  (por dónde sale). El contraste *«no es un aviso del motor»* **se mantiene y se refuerza**:
  ahora es la frontera de plan, no solo conceptual.
- **§8 términos retirados:** entra `guide_step_hints`, absorbida por `hints`.
- **§6 Herencia con sobreescritura:** cuarta fila de la tabla — el solucionador sube
  fermento → categoría → general. La regla es idéntica a las otras tres.

---

## 9. Fuera de alcance

- Buscador, paginación avanzada, importación o exportación masiva
- Traducción automática o asistida
- Editor rico nuevo
- Vista previa del consejo tal como se ve en su ventana
- Historial o versionado de consejos. Un consejo es **definición**: se corrige en un sitio
  y vale para todos (`Lexico.md` §6)
- **El solucionador.** Aquí solo se escriben las filas; leerlas es otro briefing
- El renderizador de §7a, salvo que se decida que entra
- Cualquier cambio en `notification_rules`, `insights` o la Voz

---

## 10. Restricciones para la sesión de implementación

**No debe inventarse:**

- **Ningún nombre de campo, tabla o método** que no esté en la migración
  `2026_08_02_100000_unificar_consejos_en_hints.php` o en `Hint.php`. Se leen primero
- **Ningún contenido de consejo.** Se prueba con las 93 filas existentes. No se siembran
  ejemplos de fermento, categoría ni síntoma
- **Ningún valor nuevo en el enum `symptom`**
- **Ninguna regla de plan** más allá de §3 y §5. En particular no se toca el candado de
  `BatchController.php:324`, que es correcto: los consejos de paso son Pro

**Migración inmutable:** la del 2 de agosto no se edita. Cualquier corrección va en una
migración nueva.

**Un solo commit:** la pantalla y los parches de §8 van juntos. Lo que se reemplaza se
borra en el mismo commit.

---

*Documento vivo. Cuando una ventana nueva exista, se corrige §2 antes que el admin.*
