# Lotes del tablero Un **lote** es la lista de cambios al tablero de pendientes que deja una tarea terminada: qué se cerró, qué se abrió, qué se movió y por qué. Lo escribe Claude (que no llega al servidor) y lo aplica Leo: ```bash ./scripts/tablero.sh revisar # qué haría cada lote nuevo, contra el tablero de ahora; no escribe nada ./scripts/tablero.sh aplicar # lo aplica y baja la foto nueva a _estado/ ``` `backend/tablero.py` hace el trabajo en el servidor: llama al mismo backend que el sitio (`127.0.0.1:8081`) con el usuario del campo `autor`, así que cada cambio pasa por las mismas validaciones y queda en el historial del pendiente con su autor y su nota. En la página de inicio se ve en **Actividad** como cualquier otro cambio («Claude terminó …»). ## Reglas 1. **Un lote por tarea terminada**, con nombre `AAAA-MM-DD_tema.json` igual a su campo `lote`. 2. **Un lote aplicado no se edita.** Si algo salió mal, se escribe otro lote. `tablero.py` se niega a seguir si un cambio ya aplicado no es igual al del archivo. 3. **Nunca se reaplica.** Lo aplicado se anota en `/srv/projects/drogheda/lotes-aplicados.json`; si alguien deshace un cambio a mano, el lote no lo vuelve a hacer. 4. **No se toca lo que ya está en Hecho**, salvo que el cambio lo diga con `si_estado`. 5. **Cada cambio a un pendiente existente lleva `nota`**: el porqué, en una o dos frases (≤ 300 caracteres; si es más larga, se recorta a 300 y `revisar` lo avisa). Es lo que la gente lee en el historial. 6. **Un lote con errores de formato se salta** (y `revisar` dice por qué); los demás lotes sí se aplican. 7. **Se busca antes de crear.** `crear` usa un `id` fijo (si ya existe, se salta) y `si_no_hay` evita duplicar un pendiente que alguien ya abrió a mano con otro id. 8. **Leo revisa antes de aplicar.** `revisar` muestra cada cambio contra el tablero real; lo que no cuadra se salta y se dice por qué (no existe, ya está en Hecho, el título coincide con varios…). ## Formato ```json { "lote": "2026-10-21_pasada-6", "autor": "claude", "motivo": "Pasada 6 de V5.6 y V5.7 hecha por Claude: cobre listo para Gerber", "fuente": "/hardware/v56-v57-auditoria-21oct/#6-pasada-6-hecha-por-claude-t34-a-t37", "cambios": [ { "id": "t-v56-pasada-2", "poner": { "estado": "hecho" }, "nota": "Cerrado: le siguieron las pasadas 3 a 6." }, { "buscar": "pasada 3", "todos": true, "poner": { "estado": "hecho" }, "nota": "Cerrado: la pasada 6 dejó el cobre listo para Gerber." }, { "buscar": ["revisión pad a pad", "-v6"], "si_estado": ["por-hacer", "bloqueado"], "poner": { "estado": "en-curso", "responsable": "leo, claude", "fecha_limite": "2026-10-22" }, "nota": "Revisión hecha; falta el paquete de fabricación." }, { "crear": { "id": "d-21-2-c149-c150", "titulo": "D-21-2: ¿C149/C150 se quedan?", "pista": "ingenieria", "estado": "por-hacer", "responsable": "leo", "version_tarjeta": "V5.7", "fecha_limite": "2026-10-22", "descripcion": "…", "enlaces": [{ "titulo": "Por qué", "url": "/hardware/…" }], "etiquetas": ["decisión"] }, "si_no_hay": ["D-21-2"] } ] } ``` | Llave | Dónde | Qué hace | |---|---|---| | `lote`, `autor`, `motivo` | lote | Obligatorias. `autor` es el usuario con el que se escribe (`claude`; Leo usa `leo`). `fuente`: liga opcional al documento que respalda el lote | | `id` / `buscar` | cambio | El pendiente: por su id, o por un texto de su título, sin importar acentos, mayúsculas ni signos. `buscar` también puede ser una lista: el título debe tener todos los textos y `"-texto"` quiere decir «que no lo tenga» (`["piloto", "v5.6", "-banco"]`). Tiene que coincidir con **uno solo**, primero entre los abiertos | | `todos` | cambio | Con `buscar`: aplica el cambio a **todos** los abiertos que coincidan (por ejemplo, cerrar todas las «pasada 3») | | `si_estado` | cambio | Solo aplica si el pendiente está en uno de estos estados. Por omisión: por hacer, en curso o bloqueado | | `poner` | cambio | Los campos que cambian: `titulo`, `descripcion`, `pista`, `estado`, `responsable`, `fecha_limite`, `enlaces`, `etiquetas`, `bloqueada_por`, `version_tarjeta`. Lo que ya tiene ese valor no se manda | | `nota` | cambio | Obligatoria. Comentario en el historial; sin `poner`, el cambio es solo el comentario | | `crear` | cambio | Pendiente nuevo, con los mismos campos que el formulario del sitio más un `id` fijo (`t-…`, `d-…`): `titulo`, `pista`, `responsable` obligatorios | | `si_no_hay` | cambio | Con `crear`: no lo crea si hay un pendiente abierto cuyo título contenga alguno de estos textos | Valores: `pista` ∈ ingenieria · produccion · mecanica · compras · campo · gestion (desde el 22-oct); `estado` ∈ por-hacer · en-curso · bloqueado · hecho; `version_tarjeta` ∈ V5.5 · V5.6 · V5.7 · v6 · —; `responsable`, ids del [Equipo](https://drogheda.helgen.online/tableros/equipo/) separados por coma; `fecha_limite` AAAA-MM-DD; `sitios` (desde el 22-oct) = lista de icave (Veracruz) · timsa (Manzanillo) · eit (Ensenada) · lzc (LCT) · qro (Querétaro: fabricación e ingeniería) — un pendiente puede tener varios; sin `sitios`, cuenta como Querétaro. Con un backend sin reiniciar, `revisar` marca los cambios con `sitios` como inválidos. ## La foto `./scripts/tablero.sh foto` (y cada `./scripts/deploy.sh`) baja el tablero a `_estado/` en la Mac: `tablero.json` (pendientes con su historial, enfoque de la semana, actividad de 14 días y lotes aplicados) y `tablero.md` (lo mismo para leer). `_estado/` no va a git. Claude la lee al empezar una tarea para saber qué hay, quién lo tiene y qué ids usar.