# Fase A · Reconciliación con el Afinador — deuda y notas

Lo que la Fase A dejó pendiente, cada cosa **con vencimiento escrito**. Un campo o
una nota sin destino es sedimento; con destino, es deuda. La diferencia es esta
página.

## Campo dormido — con vencimiento

**`ingredients.profile.acid_per_unit` del `liquido-de-arranque` NO tiene lector hoy.**
El Afinador deriva el pH inicial del *porcentaje* de arrancador
(`pHInicial = 5,6 − 0,06 × arrancador`), no de este campo. Nadie lo consume.

- **Por qué se conserva:** la acidez del arranque (pH 2,8–3,3) es un dato real y
  distinto del vigor del cultivo. Este campo es su hogar natural.
- **Vencimiento — la pantalla de formular.** Cuando se construya la entrada
  opcional del *pH medido del arranque*, el pH inicial se calculará de verdad (y la
  fórmula del % pasa a ser el valor heredado por defecto — cadena de herencia). Ahí
  el campo tiene lector.
- **Si esa función se descarta**, el campo se retira: sin lector y sin vencimiento,
  es sedimento. Los campos dormidos sobreviven porque nadie recuerda por qué están;
  éste tiene por qué, escrito aquí.

## Anotado, no construido — con destino

- **Aviso «100 % melaza».** La melaza es un extremo real (mucho mineral y
  no-fermentable); en kombucha se usa mezclada, no sola. Sus coeficientes van con
  `estimado: true`. **Destino: los avisos del motor (Fase B).** Candidato, no
  construido.

- **pH del arranque, entrada opcional del usuario.** El pHmetro es barato; si el
  usuario mide el pH de su arranque, el pH inicial se calcula real. **Destino: la
  pantalla de formular** (donde se pregunta el contexto). Es la cadena de herencia
  otra vez: dato del usuario sobreescribe la fórmula heredada.

- **Separar acidez-de-arranque (medible) de vigor (estimado).** Veníamos
  mezclándolos bajo «vigor». La acidez (pH 2,8–3,3) determina el pH inicial y la
  ventana de riesgo, y se mide. El vigor afecta a la velocidad y se estima. **Datos
  distintos, tratamiento distinto** — a decidir cuando llegue la calibración por
  usuario (bucle 2).

## Para cuando toque `batches` — qué congelar

**Congelar entrada + ficha + versión (motor y ficha), NO el resultado.** Con esas
tres, cualquier salida se reconstruye, y el snapshot no engorda con datos derivados.
Los cuatro bloques expuestos (cantidades, ventanas, lo-que-pasa, avisos) son para
MOSTRAR, no para guardar. El `Motor::calcular` ya devuelve `version.motor` +
`version.ficha` con ese fin. Destino: las columnas de formulación de `batches`, que
se diseñan a partir del contrato de salida ya verificado.

## El borrador de tanda — HECHO el ciclo, PENDIENTE el reabrir

El ciclo **formular → borrador → arrancar** está construido (7.1, `formular()`/
`arrancar()`, la pantalla). Lo que queda es **recuperar el borrador**: hoy se crea
pero no aparece en ningún sitio (la home usa `active()`, «Mis lotes» filtra a
activos/pausados/completados). Es un **huérfano**: el sistema sabe que existe
—cuenta en `total_batches`— y no te deja llegar a él. Formulas el martes, sales,
vuelves el jueves, y no hay forma de encontrarlo. **No es rotura** (el asistente se
defiende del `start_date` null y los controles de activa están tras
`status==='active'`), es falta de sentido: guardar algo que nadie vuelve a ver.

**Decisiones del propietario para cuando se construya el reabrir (2026-07-24):**
- **Un borrador NO cuenta como tanda.** Es una intención, no una fermentación:
  visible y recuperable, pero fuera de `total_batches` (no infla lo que has hecho).
- **No se llama «borrador»** (palabra de software). Es una fórmula guardada
  esperando a que la empieces → **«sin empezar»** o **«pendientes»**.
- **Lista propia**, no mezclado con las activas, y al tocarlo lleva a la **fase de
  fórmula** (para arrancarlo o descartarlo), **no al asistente** (que espera activa).

## Reformulación de 2F — nivel 3 pendiente

`reformular` está en el **nivel 2**: el residual sale del DÍA de corte real
(`$estadoReal['dia_corte']`), no del predicho — casi nadie corta el día que le
dijeron. **Pendiente el nivel 3:** un residual MEDIDO (pH/densidad) que pise al
calculado. El evento ya registra `residual: medido|calculado` para distinguirlos, y
solo el medido calibra (bucle 2). El nivel 3 exige que el motor acepte un residual
conocido como entrada. Destino: la pantalla de corte, cuando pida el pH opcional.

## Contenido pendiente del motor (Fase B)

- **El consejo de presión va a `guide_step_hints` del paso de cierre.** «Si te
  olvidas la botella, esto llega a X bar» era un aviso que saltaba en 5 de 6
  formulaciones — ruido que hace dejar de leer los avisos. No es un aviso: es una
  propiedad de la kombucha (la 2F siempre deja residual). Se retiró del catálogo del
  motor; su sitio es el consejo editorial permanente del paso de cierre. **Destino:
  añadir un `guide_step_hint` a la 2F/embotellado de kombucha** (contenido del
  propietario). Como aviso solo queda `margen_estrecho`, que sí distingue.

- **Traducir `lang/es/motor.php` a DE y EN.** Las plantillas de voz están en ES;
  el motor ya devuelve `codigo + params`, así que traducir es copiar el fichero.
  Destino: cuando el producto salga a esos idiomas.

## La carta comercial exige lo que el novato no tiene — producto, para la pantalla

Destapado al renderizar una formulación real (parada 7.2). La **comercial** —la carta
que más pide un principiante— sale con **540 ml de arranque para 3 L: el 18 % del
lote**. Es medio litro de kombucha madura que casi seguro no tiene. Y es la misma
carta que más avisa (tres avisos, uno duro) y la que más presión genera.

Conecta directo con la bifurcación **«no tengo arrancador»** (fuera de alcance, §5 del
briefing de la pantalla): la carta más pedida es la más exigente. **Destino: la frase
de la carta (hueco #3) puede tener que decir algo de esto ANTES de elegirla, no
después** — que exige un arranque generoso, no solo que sale «comercial». No se
resuelve ahora; se ve, y se escribe cuando toque redactar las frases de las cartas.

## El slug al renombrar — regenerar en borrador, congelar al publicar

`updateBasics` NO regenera el slug al cambiar el nombre, y eso es **correcto para
publicadas** (cambiar la URL rompe enlaces y pierde posicionamiento) pero **un
problema para borradores**, donde nadie ha enlazado nada todavía: un slug feo
—o el de un nombre viejo— se queda congelado sin razón. La regla razonable:
**regenerar el slug mientras `status = 'draft'`, congelarlo al publicar.** Destino:
`RecipeWizardController::updateBasics`. No se hizo en el paso del duplicar (el modal
pide el nombre limpio de entrada, así que no bloquea), pero el hueco sigue para
cualquier borrador renombrado por otra vía.

## Coeficientes «a dedo» — pendientes de backtest

Las tablas de azúcar, té y saborizante del prototipo están marcadas «a dedo». La
melaza además es extrapolación pura (`estimado: true`). **Son los primeros
candidatos a que el backtest mueva** — y moverlos es cambiar un número en la ficha,
no reescribir PHP.
