hbox-docs/backend/lotes/README.md

84 lines
5.1 KiB
Markdown

# 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). Es lo que la gente lee en el historial.
6. **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.
7. **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; `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.
## 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.