Skip to content

feat(h4-1): log de eventos JSONL append-only + ADR-0018 (RF-06/RN-03/RN-07/CP-08)#25

Merged
Jacket-69 merged 2 commits into
mainfrom
feat/h4-1-log-jsonl-adapter
May 21, 2026
Merged

feat(h4-1): log de eventos JSONL append-only + ADR-0018 (RF-06/RN-03/RN-07/CP-08)#25
Jacket-69 merged 2 commits into
mainfrom
feat/h4-1-log-jsonl-adapter

Conversation

@Jacket-69
Copy link
Copy Markdown
Owner

Resumen

Primera fase de H4: log canónico de eventos del sistema en JSONL append-only. Cierra cuatro requisitos del SRS de un golpe — RF-06 (log inmutable), RN-03 (log inmutable estructural), RN-07 (append-only) y CP-08 (spike: intento de edición detectable).

Cambios

Port RepositorioEventos (ports/repositorio_eventos.py):

  • EventoLog Pydantic frozen + extra=\"forbid\" + strict.
  • TipoEvento StrEnum cerrado de 7 valores alineado a docs/data-model.md.
  • Protocol @runtime_checkable SIN métodos update/delete por diseño.
  • EventoDuplicadoError(ValueError) para idempotencia ante reintentos.

Adapter JsonlRepositorioEventos (adapters/repositorio_jsonl.py):

  • open(\"a\") puro + validación Pydantic en escritura y lectura.
  • Dedupe por evento_id con set in-memory cargado desde disco al construir.
  • Generador determinístico EVT-<YYYYMMDDTHHMMSS>-<seq04>.

Extracción serializar_resultado_despacho a application/serializacion:

  • Punto único de verdad del schema RT-02 (ADR-0017) reutilizado como payload de despacho_creado (ADR-0018). Bit-exactitud por construcción.

CLI sentinel run-dataset --log-eventos PATH (opcional):

  • Sin el flag, comportamiento RT-02 preservado 100% (cero impacto en CI compare).
  • Con el flag, persiste un evento despacho_creado por incidente en el log canónico.

ADR-0018 congela el schema del evento_log y documenta el spike CP-08 ejecutado: el adapter detecta duplicación externa via EventoDuplicadoError y schema drift via pydantic.ValidationError al reabrir.

Decisiones arquitectónicas no triviales

  • Saturación se persiste como despacho_creado con payload.unidad_seleccionada=null y payload.motivo=\"saturacion\". Se descarta crear un tipo despacho_saturacion aparte (no agrega valor consultable; rompería el modelo de datos sin justificación).
  • Sin lock externo en v1: ADR-0007 asume 1 operador. Si Fase 5 (simulación concurrente) o F4 lo requieren, agregar fcntl.flock. Documentado en ADR-0018 §"Concurrencia".
  • Sin firma criptográfica: la inmutabilidad es estructural (sin API de mutación), no contra ataque externo al filesystem. Auditoría criptográfica queda para F4+ si el proyecto lo justifica.

Validación local

  • ruff check + ruff format --check: ✓ All checks passed (65 archivos).
  • mypy src/sentinel_dispatch: ✓ Success en 34 archivos.
  • pytest tests/unit tests/integration --no-cov: 235 passed in 3.45s (213 baseline + 22 nuevos).
  • pytest tests/unit (cov-fail-under=90): cov global 91.93%, repositorio_jsonl.py 100%, serializacion.py 96%, repositorio_eventos.py 90%.

DoD

  • Sin cambios funcionales al schema RT-02 — el CI compare debe seguir 12/12 OK bit-exacto.
  • ADR-0018 nuevo (decisión costosa de revertir: schema de archivos persistidos).
  • Trazabilidad actualizada: RF-06, RN-03, RN-07 → ✅.
  • CHANGELOG entry bajo [Unreleased].
  • Spike CP-08 documentado en ADR + cubierto por tests IT.
  • No requiere migración de datos (es la primera implementación; no hay logs históricos).

Commits

  1. b04cf1f feat(h4-1): log de eventos JSONL append-only + ADR-0018
  2. 035aa60 docs(quality): RF-06/RN-03/RN-07 ✅ + entrada H4-1 en CHANGELOG

Trazabilidad

Cierra 3 de 4 RFs originalmente pendientes para H4 (queda RF-11 y RF-12). Ejecuta la convención spike-before-CP sobre CP-08. Próxima fase: exportador CSV/JSON (RF-11, ADR sin nuevo) según plan H4.

Jacket-69 added 2 commits May 21, 2026 13:17
Cierra RF-06 (log inmutable), RN-03/RN-07 (append-only) y CP-08 (intento
de edición) — primera fase de H4.

Nuevo port `RepositorioEventos` (ports/repositorio_eventos.py):
- `EventoLog` Pydantic frozen con extra="forbid" + strict.
- `TipoEvento` StrEnum cerrado de 7 valores alineado a data-model.md.
- Protocol `@runtime_checkable` sin update/delete por diseño.
- `EventoDuplicadoError(ValueError)` para idempotencia.

Nuevo adapter `JsonlRepositorioEventos` (adapters/repositorio_jsonl.py):
- Append puro con `open("a")`, validación Pydantic en escritura y
  lectura, dedupe por evento_id con set in-memory cargado desde disco.
- Generador `EVT-<YYYYMMDDTHHMMSS>-<seq04>` único monotónico.

Extracción `serializar_resultado_despacho` a application/serializacion:
- Punto único de verdad del schema RT-02 (ADR-0017) reutilizado por el
  payload de `despacho_creado` (ADR-0018). Bit-exactitud por construcción.

CLI `sentinel run-dataset` admite flag opcional `--log-eventos PATH`:
- Si presente, persiste un evento `despacho_creado` por incidente.
- Sin el flag, comportamiento RT-02 preservado 100%.

ADR-0018 congela el schema del evento_log e incluye spike CP-08 que
documenta: duplicación de línea detectable via EventoDuplicadoError y
schema drift via ValidationError al reabrir.

Tests: 22 nuevos verdes (16 UT adapter + 4 IT + 2 CLI). Suite total
235/235 verde. Cobertura repositorio_jsonl 100%, serializacion 96%,
global 91.93%.
…CHANGELOG

Trazabilidad:
- RF-06 ✅: apunta a `adapters/repositorio_jsonl.py` + ADR-0018; el caso
  de prueba referencia el spike CP-08.
- RN-03 ✅: el Protocol no expone `update`/`delete` y el adapter rechaza
  re-escritura con EventoDuplicadoError.
- RN-07 ✅: append puro verificado por `test_dos_appends_consecutivos_solo_crecen_el_archivo`.
- §5.7 actualizada: el adapter ya implementado en H4-1; quedan
  exportador (RF-11), simulación (RF-12) y calibración (ADR-0013) para
  fases siguientes de H4.

CHANGELOG: nueva entrada "H4 fase 1: log de eventos JSONL append-only"
bajo [Unreleased] con resumen del port, adapter, serializador extraído,
flag CLI, ADR-0018 + spike CP-08, y métricas de la suite (235/235, cov
91.93%).
@Jacket-69 Jacket-69 merged commit 8235524 into main May 21, 2026
6 checks passed
@Jacket-69 Jacket-69 deleted the feat/h4-1-log-jsonl-adapter branch May 21, 2026 17:20
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-1): log de eventos JSONL append-only + ADR-0018 (RF-06/RN-03/RN-07/CP-08)
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-1): log de eventos JSONL append-only + ADR-0018 (RF-06/RN-03/RN-07/CP-08)
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-1): log de eventos JSONL append-only + ADR-0018 (RF-06/RN-03/RN-07/CP-08)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant