Skip to content

feat(h4-5): calibración parcial CP-01c + ADR-0020 (CP-01c)#29

Merged
Jacket-69 merged 2 commits into
mainfrom
feat/h4-5-calibracion-cp01c
May 21, 2026
Merged

feat(h4-5): calibración parcial CP-01c + ADR-0020 (CP-01c)#29
Jacket-69 merged 2 commits into
mainfrom
feat/h4-5-calibracion-cp01c

Conversation

@Jacket-69
Copy link
Copy Markdown
Owner

Resumen

Quinta y última fase técnica de H4: ejecuta las tareas H4-cal-1 y H4-cal-2 del ADR-0013. El criterio CP-01c (duration ±15 % en ≥ 85/100) no se alcanza con solo estas dos mejoras — se cierra empíricamente que snap-to-edge (H5) es necesario. Resultado documentado en ADR-0020.

Cambios

Producción (calibración integrada, opt-in):

  • adapters/grafo_osmnx.py: parámetro factor_calibracion: float = 1.0 agregado a cargar_grafo_iv_region. Aplica multiplicador al speed_kph in-memory tras la carga. Default 1.0 = sin cambio (preserva paridad RT-02). Helper _aplicar_factor_calibracion(grafo, factor).

Experimental (NO usado en orquestador):

  • domain/routing/a_estrella_calibrado.py: A* con state extendido (nodo, nodo_previo) y turn_penalty_s=2.0 por giro >30°. Helpers _bearing_grados y _delta_bearing. No reemplaza al A* operativo — vive aislado para no romper paridad bit-exacta con Java.

Tests:

  • 10 UT del A* calibrado (bearing/delta + 6 tests algoritmo).
  • 5 UT del factor_calibracion (escala, identidad, fallback, ValueError).
  • 1 IT nuevo test_cp01c_calibracion_y_turn_penalty marcado @pytest.mark.xfail(strict=True).

Resultado experimental (corrida 2026-05-21)

Métrica Valor
dentro ±15 % 27/100 (mínimo CP-01c: 85/100)
mediana 0.250
p75 0.367
±20 % 37/100
±30 % 65/100

Veredicto: CP-01c NO alcanzado. Mejora real vs A* original (mediana cae de ~0.38 a 0.25), pero el 68 % de la dispersión sigue atribuida a snap-to-node — predicho por ADR-0011 §Diagnóstico.

Decisión documental

ADR Status Razón
ADR-0013 proposed (sigue) Criterio numérico no alcanzado; promoverá a accepted cuando H5-cal-3 entregue snap-to-edge.
ADR-0020 (nuevo) accepted Congela el parcial, eleva H5-cal-3 de "stretch" a "bloqueante".
Test integration xfail strict=True con razón apuntando a ADR-0020 Recordatorio público de la deuda.

Validación local

  • ruff check + ruff format --check: ✓ (73 archivos).
  • mypy src/sentinel_dispatch: ✓ (39 archivos).
  • pytest tests/unit tests/integration --no-cov -m 'not slow': 265 passed + 3 deselected.
  • Suite incluye 1 xfail intencional (test_cp01c_calibracion_y_turn_penalty).
  • Cobertura global: 90.33 %.

DoD

  • Tareas H4-cal-1 y H4-cal-2 ejecutadas y persistidas en código.
  • ADR-0013 actualizado con sección "Resultado de ejecución".
  • ADR-0020 nuevo accepted con plan H5-cal-3 detallado.
  • Test xfail strict con razón concreta.
  • Trazabilidad CP-01c → 🟡 H5 con referencias a ambos ADRs.
  • CHANGELOG entry bajo [Unreleased].
  • CI compare debe seguir 12/12 OK bit-exacto (calibración opt-in; A* calibrado aislado del operativo).

Commits

  1. fa76357 feat(h4-5): calibración parcial CP-01c + ADR-0020
  2. 273ad2f docs(quality): CP-01c 🟡 H5 + CHANGELOG

Próximo paso

H4 fase 6 (Fase 8 del plan global): FTR-03 formal de cierre H4. Suite estable, cobertura ≥ 90 %, RFs 06/11/12 cerrados, CP-12 y CP-01c documentados con sus respectivos ADRs.

Jacket-69 added 2 commits May 21, 2026 13:51
Tareas H4-cal-1 y H4-cal-2 del ADR-0013 ejecutadas:

H4-cal-1: `cargar_grafo_iv_region(factor_calibracion: float = 1.0)`.
Aplica multiplicador al speed_kph de cada arista in-memory tras la
carga (no persiste al GraphML). Default 1.0 preserva paridad RT-02
12/12 OK; tests del adapter no afectados.

H4-cal-2: nuevo módulo experimental `domain/routing/a_estrella_calibrado.py`
con state extendido `(nodo, nodo_previo)` y turn_penalty_s=2.0 por
giro >30°. NO reemplaza al A* operativo — vive separado para no romper
la paridad bit-exacta con Java. Helpers `_bearing_grados` y
`_delta_bearing` para cálculo angular sobre coordenadas geográficas.

H4-cal-eval: nuevo test integration `test_cp01c_calibracion_y_turn_penalty`
medido sobre los 100 pares del fixture OSRM. Resultado: 27/100 dentro
de ±15 % (mediana 0.250, p75=0.367). El criterio CP-01c (≥85/100) NO
se alcanza — consistente con la predicción de ADR-0011 §Diagnóstico
(68 % de outliers atribuidos a snap-to-node, no tratado en H4).

Decisión documental:
- ADR-0013 sigue `proposed` con sección "Resultado de ejecución".
- ADR-0020 nuevo, `accepted`: congela el resultado parcial y eleva
  H5-cal-3 snap-to-edge de "stretch" a "bloqueante" para promover
  ADR-0013 a accepted.
- Test marcado `@pytest.mark.xfail(strict=True)` con razón que apunta
  a ADR-0020. Al cerrar H5-cal-3, quitar el xfail + promover 0013
  en el mismo PR.

Tests:
- 10 UT del A* calibrado experimental (bearing, delta-bearing, ruta
  recta, giro 90° penalty, origen=destino, sin ruta, factor inválido,
  turn_penalty=0 equivale al A* simple).
- 5 UT del factor_calibracion (escala 0.85, identidad 1.0, fallback
  para aristas sin speed_kph, ValueError para factores ≤ 0).

Suite total 257/257 + 1 xfail intencional. Cobertura global 90.33%.
Trazabilidad: nueva fila para CP-01c apuntando a `grafo_osmnx.py`
(`cargar_grafo_iv_region(factor_calibracion=0.85)`) y a
`domain/routing/a_estrella_calibrado.py`. Estado 🟡 H5 (calibración
parcial en H4, snap-to-edge bloqueante en H5). Referencias a ADR-0013
y ADR-0020.

CHANGELOG: entrada "H4 fase 5: calibración parcial CP-01c + ADR-0020"
con los números medidos (27/100 ±15 %, mediana 0.250) y la decisión
de mantener ADR-0013 proposed.
@Jacket-69 Jacket-69 merged commit 45a15fb into main May 21, 2026
6 checks passed
@Jacket-69 Jacket-69 deleted the feat/h4-5-calibracion-cp01c branch May 21, 2026 17:53
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-5): calibración parcial CP-01c + ADR-0020 (CP-01c)
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-5): calibración parcial CP-01c + ADR-0020 (CP-01c)
Jacket-69 added a commit that referenced this pull request May 29, 2026
feat(h4-5): calibración parcial CP-01c + ADR-0020 (CP-01c)
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