Comment notification quotes empty-content comments and fires on aprobado practicas
SOP-PLUTO-12 root cause. A JTP (Silvia Toranzo) received "Nuevo comentario del alumno - HC 86579" quoting a comment whose literal text was "Sin comentarios", on a practica already in reviewState=aprobado, and read it as an announcement about changing her asistente. Two defects: (1) the mail quotes a null-content comment as if it were content - no guard for placeholder/empty-ish bodies; (2) comment notifications keep paging the assigned JTP after the practica is aprobado, which is a product question about whether a closed practica should still notify. Evidence: db-pluto-cc prod reads 2026-08-17 - vPracticaComentarios shows two comments at 19:01:50 and 19:01:53 UTC on 2026-08-07, outbox row sent 19:01:58, ticket filed 22:02. Practica 3c922125-a9cd-419a-91fc-b0090cf0e389, HC 86579.
Activity
-
coder-pluto-cc
-
DB gate (migration 111, esAprobada-only suppression, student->reviewer arm) applied and TS-side wired: db-pluto-cc PASS via audit-pluto-ca (SHA of DB apply confirmed prosrc), coder-pluto-cc 71afe5e v2.23.9. Outstanding: in-app exercise (approved-student-author expect zero notif, approved-teacher-author control expect notif) needs real role sessions - blocked on eq#44 proxy-pluto trust-dialog gap, or Elazar manual.
-
in-app verification needs real role sessions via proxy-pluto (blocked eq#44 trust-dialog gap) or Elazar manual exercise; DB gate + TS side already shipped
-
Revisado 2026-09-11 a pedido de pmmaster (regla: arreglar la mitad de 'contenido vacio' porque no necesita a Elazar). MEDIDO EN EL CODIGO: esa mitad no tiene codigo pendiente, ya esta cerrada por DOS mecanismos distintos, asi que no hay nada que arreglar. 1) Un comentario vacio no se puede crear. comentario-actions.ts:46-48 hace texto.trim() y devuelve 'El comentario no puede estar vacio' ANTES de withAuth y antes de pool.connect(). fn_createPracticaComentario recibe el valor ya trimmeado, y el mail cita esa misma variable (comentario: trimmed en las dos ramas, teacher y student). O sea que la premisa 'el mail cita un comentario de contenido nulo' no es alcanzable por esta accion. 2) Lo que realmente paso en SOP-PLUTO-12 no fue un cuerpo vacio sino el texto literal 'Sin comentarios', que es RELLENO TIPEADO POR UNA PERSONA, no un placeholder del sistema. La causa raiz era un campo obligatorio en la UI sobre una accion cuyo servidor siempre lo acepto opcional: practica-detail.tsx deshabilitaba el boton con texto en blanco mientras complementarPractica ya saltea el INSERT de la nota cuando viene vacio, entonces el asistente sin nada que reportar tipeaba relleno para poder apretar el boton. Medido: 5/5 de esas notas eran alumnos actuando de asistente. Ya remediado - la UI se relajo al contrato del servidor y la cobertura de regresion esta en src/lib/complementar-practica-optional-note.test.ts (gate pedido por audit-pluto-ca). Un guard de 'cuerpo tipo placeholder' encima de esto seria adivinar que texto humano es real, y eso no se puede hacer sin falsos positivos. 3) La mitad 'dispara en practicas aprobadas' tambien tiene el codigo puesto: migracion 111 + supresion solo-esAprobada, brazo alumno->revisor, 71afe5e v2.23.9, con la asimetria documentada en comentario-actions.ts:98-112 (el comentario de un DOCENTE sigue notificando a los alumnos, a proposito). CONCLUSION: no queda codigo en esta fila. Lo unico pendiente es la VERIFICACION in-app de (3) con sesiones de rol reales - que es exactamente lo que ya dice blockedReason - y depende de proxy-pluto (eq#44, dialogo de confianza) o de que Elazar la ejercite a mano. La fila sigue blocked por eso y por nada mas.
-
unassigned
-
Assignee cleared by pmmaster-evolutiva-cc 2026-09-12: coder-venus-cc / db-venus-cc / coder-pluto-cc / db-pluto-cc are absent from the hub roster and have no pane, and venus and pluto have no staffed coder or db lane. STATUS DELIBERATELY LEFT AS blocked - the blocker is a fact about the work and does not depend on who was holding the row, so it survives the unassignment. The blockedReason has NOT been re-verified in this pass; treat its age as unknown until someone reads the rows own events. Restaffing is Elazars call.