hbox-docs/backend/lotes/README.md
Leopoldo Rodríguez 1e63a7c738 Pendientes: campeón por pendiente, flechas ← →, franja para soltar y columna en el detalle
Pedido de Leo (27-oct): mover un pendiente a otra columna sin arrastrar y bajar a la vez,
cambiar la columna desde el detalle, y un solo campeón por pendiente que es quien lo mueve.

- backend/app.py: campo «campeon» (uno de los responsables; por omisión el primero).
  PATCH /api/tarea y POST /api/tareas/orden solo cambian la columna o el campeón si quien
  escribe es el campeón, un administrador o TAREAS_MUEVEN_SIEMPRE (claude, por los lotes).
  GET /api/tareas trae campeon y mueven_siempre.
- kanban.js / tablero.css: avatar del campeón primero y con anillo; flechas ← → en la
  tarjeta; franja fija arriba con las 4 columnas mientras se arrastra; botones de Columna
  y selector de Campeón en el detalle; tarjetas de otros sin arrastre ni flechas.
- tablero.py y lotes/README.md: «campeon» se puede poner en un lote.
- tests-campeon.sh (25 pruebas); tests-1014.sh: el PATCH de bob ya no cambia la columna.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013SfRSvyewSyFLfK9mjbGL8
2026-10-28 08:38:56 -06:00

5.7 KiB

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:

./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

{
  "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, campeon (27-oct: uno de los responsables; es quien mueve el pendiente entre columnas), 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 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.