Ola 3 · 3.1 (de Neid, hecha por el carril de Sebas): evento_caso + RegistroService - #20
Open
heysebitas wants to merge 2 commits into
Open
heysebitas wants to merge 2 commits into
heysebitas wants to merge 2 commits into
Conversation
⚠️ Tarea del carril de NEID, escrita desde el carril de Sebas porque bloqueaba 3.2, 3.10, 4.1 y 4.5, y la ola 3 no podia empezar sin ella. Neid: revisala como tuya y cambia lo que no te convenza. De los 22 eventos del sistema, 3 se guardaban: 6 vivian en memoria y 13 no existian o se descartaban. El re-ruteo automatico —el mejor momento del producto— no quedaba registrado, y el override del CRUE, que es una decision con potestad legal, vivia en el localStorage del navegador. - `RegistroService.registrar()` es el UNICO punto de escritura. Una sola firma, un solo sitio donde arreglar idempotencia, actor y orden — y es lo que hace posible el test de cobertura de eventos de 5.12. - **No lanza nunca.** Si la base esta caida se pierde el evento y se grita en el log, pero el traslado sigue: un paciente no se queda sin hospital porque no se pudo escribir su linea de tiempo. - Idempotencia por (caso, tipo, clave): el paramedico toca "ya llegue" dos veces con mala señal y eso es UNA llegada. - `corregir()` escribe una fila nueva con `corrige_a`. El original se queda: un UPDATE habria borrado el error, que es justo lo que un auditor necesita ver. - Migracion 0006 con el trigger append-only (calcado del de 0002), el indice unico parcial de idempotencia, `corrige_a` y RLS. - `GET /casos/:id/eventos` y los dos almacenes (memoria y Postgres) detras de una interfaz, con la misma degradacion declarada del resto del repo. Lo que queda fuera y esta escrito en docs/tareas/neid.md: el evento en la misma transaccion que el cambio de estado (necesita 1.2), el filtro por organizacion de la lectura (1.2 + 1.6), la FK a `actor` (1.1) y correr la migracion contra un Postgres real.
3 tasks
heysebitas
added a commit
that referenced
this pull request
Aug 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tarea 3.1 — es del carril de Neid. La escribí desde el mío porque bloqueaba cuatro tareas mías (3.2, 3.10, 4.1, 4.5) y la ola 3 no podía empezar sin ella. Va sobre #16.
El problema
De los 22 eventos del sistema, 3 se guardaban: 6 vivían en memoria y 13 no existían o se descartaban. Los dos momentos más vendibles del producto eran invisibles:
rerouteado— "el hospital dijo que no y el sistema siguió solo", el mejor momento del demo, no quedaba registrado en ninguna parte.override_crue— una decisión con potestad legal, guardada en ellocalStoragedel navegador de quien la tomó.Qué trae
RegistroService.registrar()es el único punto de escritura. Una sola firma, un solo sitio donde arreglar idempotencia, actor y orden — y es lo que hace posible el test de cobertura de eventos de 5.12. La tentación de dejar que cada servicio inserte directo es justo la que convierte un registro de auditoría en eventos con formas distintas para lo mismo.(caso, tipo, clave)— el paramédico toca "ya llegué" dos veces con mala señal y eso es UNA llegada.corregir()escribe una fila nueva concorrige_a. El original se queda: unUPDATEhabría borrado el error, que es justo lo que un auditor necesita ver.0006con el trigger append-only (calcado del de0002), el índice único parcial de idempotencia,corrige_ay RLS.GET /casos/:id/eventosy los dos almacenes (memoria y Postgres) detrás de una interfaz, con la degradación declarada de siempre.demora_detectada,tramite_firmadoeintento_cruzado, que sí están en la tabla de §11.2. La migración usa la unión de las dos listas (24 entradas para los 22 eventos, porque dos filas de la tabla llevan dos eventos cada una).Lo que NO quedó hecho, y por qué
1.2, que sigue sin existir. El paso 5 —"evento_casoen la misma transacción que el cambio de estado"— no se puede cumplir mientras el estado sea unMap. La firma para hacerlo está anotada enregistro.service.ts.GET /casos/:id/eventosno filtra por organización:casotodavía no tiene dueño. Llega con1.2+ las policies de1.6. No expongan esa ruta fuera del equipo mientras tanto.actor_idsin FK aactor(id)— esa tabla es de1.1(Zaid) y sin ella la migración no corre sola. Quedatextpara admitir los ids sintéticos que ya existen (legado:operador,llave:<uuid>).SedeEstadoyCapacidadDeclarada(los otros dos tipos que 3.1 debía mergear) no están: son de3.3, de Zaid.Hecho cuando
UPDATEsobreevento_casolanza excepción9 tests nuevos ·
tscy lint limpios.0004(#12),0005(#15) y0006. La de identidad de Zaid (1.1) es la0007.