Skip to content

feat(h5-fix): fixture v3 (Ruta B) + CP-01a-95 cumplido (eval-95) + ADR-0016 accepted#32

Merged
Jacket-69 merged 4 commits into
mainfrom
feat/h5-fix-fixture-v3
Jun 3, 2026
Merged

feat(h5-fix): fixture v3 (Ruta B) + CP-01a-95 cumplido (eval-95) + ADR-0016 accepted#32
Jacket-69 merged 4 commits into
mainfrom
feat/h5-fix-fixture-v3

Conversation

@Jacket-69
Copy link
Copy Markdown
Owner

Resumen

Cierra la Ruta B del ADR-0016 (fixture v3, N≥300) y ejecuta la verificación final H5-eval-95. Resultado: CP-01a-95 ✅ CUMPLIDO con holgura, lo que promueve ADR-0016 a accepted y resuelve ADR-0011 §V/L#5.

El hallazgo central: el margen estrecho de v2 (78/100, IC95 inferior 69) era un artefacto del sesgo de muestra (jitter pequeño → rutas urbanas cortas donde el error de snap ~150 m domina el error relativo), no una limitación del A*. Con un fixture cartesiano que cubre todo el bbox (rutas largas inter-comuna), el mismo snap se diluye y la fidelidad de distance sube a 89.7 %.

Cambios

  • tools/generate_osrm_fixture.py (H5-fix-1) — nuevos flags --modo {basesxincidentes, cartesiano} y --n-objetivo. Modo cartesiano: grilla 8×8 de anclas sobre el bbox + jitter amplio 0.01° (~1.1 km) en ambos extremos. El fixture marca version: "3" y modo.
  • core-python/tests/fixtures/osrm_oracle_v3.json (H5-fix-2) — nuevo fixture, 300 pares contra OSRM 5.27.1 Docker. El v2 (osrm_oracle.json) queda intacto (línea histórica del experimento).
  • tools/bootstrap_cp01a.py + tools/analyze_outliers.py (H5-fix-3) — robustos a NoRutaDisponibleError: los pares que OSRM rutea (snapeando anclas oceánicas a la costa) pero el grafo propio no conecta (componentes desconectados) se cuentan como miss / outlier de conectividad, no se descartan (evita survivorship bias). Render parametrizado por N.
  • docs/quality/bootstrap-cp01a-v3.md + outliers-cp01a-v3.{md,csv} — evidencia re-corrida sobre v3.
  • test_routing_vs_osrm.py::test_cp01a_95_fixture_v3 — test slow que automatiza el criterio eval-95.
  • ADR-0016 accepted + §Resultado; ADR-0011 §V/L#5 RESUELTO; trazabilidad RF-03 + sección IT-01; CHANGELOG.

Métricas

Métrica Valor
Suite Python 290/290 (+1 eval-95), sin xfail
Suite Java sin cambios (Ruta B es Python-only) — 186/186
Lint + format + typecheck ✓ (ruff, ruff-format, mypy 41 files)
RT-02 (compare) intacto — no se tocó domain/ ni el path operativo
Fixture v3 300 pares, descartes {red:0, sin_ruta:0, distancia_corta:2}

Cumplimiento — CP-01a-95 (eval-95)

Sobre el fixture v3 (A* operativo, snap-to-node; bootstrap B=1000, semilla 2026):

Métrica (fracción dentro de ±30 %) Valor Umbral ¿Cumple?
Conteo real 269/300 = 0.897
IC95 inferior 258/300 = 0.860 ≥ 0.75
P(fracción ≥ 0.75) 100.0 % ≥ 0.95

13/300 pares irruteables por el grafo propio (anclas oceánicas, componentes desconectados) contados como miss — aun así pasa.

DoD

  • Criterios de aceptación: CP-01a-95 medido y asertado por test.
  • Tests: nuevo test de integración eval-95; tooling re-corrido sobre v3.
  • Lint + format + typecheck + tests verde local (ruff, mypy, pytest 290).
  • Sin secretos (gitleaks en CI). Fixture v3 = 73 KB (no es artefacto pesado).
  • Comportamiento/contrato → doc actualizada en el mismo PR (ADRs 0011/0016, trazabilidad, CHANGELOG).
  • Decisión costosa de revertir → ADR-0016 promovido a accepted con evidencia.
  • §Cumplimiento RT: el PR no toca domain/ ni el path operativo (solo tools/, tests/, fixture); RT-02 no se ve afectado.
  • Code review: auto-revisión documentada (Fernando Godoy no disponible).

Nota: el A* operativo (snap-to-node, sin calibrar) es el que mide CP-01a-95 (distance). Es independiente de CP-01c' (duration, ADR-0021), que vive en el camino experimental de calibración.

Jacket-69 added 4 commits June 2, 2026 22:32
…OSRM

Ruta B del ADR-0016. Nuevo --modo {basesxincidentes, cartesiano} y
--n-objetivo. El modo cartesiano genera una grilla 8×8 de anclas sobre el
bbox (-71.45,-30.10,-71.15,-29.85) + jitter amplio 0.01° (~1.1 km) en
ambos extremos: cubre todo el bbox con rutas largas inter-comuna, frente
al modo basesxincidentes (default, v2) anclado al clúster urbano. El
fixture marca version 3 y modo.
H5-fix-2/3. Nuevo fixture osrm_oracle_v3.json (300 pares cartesianos
contra OSRM 5.27.1 Docker); v2 se mantiene intacto. bootstrap_cp01a.py y
analyze_outliers.py ahora capturan NoRutaDisponibleError: los pares que
OSRM rutea (snapeando anclas oceánicas a la costa) pero el grafo propio
no conecta (componentes desconectados) se cuentan como miss/outlier de
conectividad, no se descartan (evita survivorship bias). Render de ambos
parametrizado por N. Re-corridos sobre v3: bootstrap-cp01a-v3.md +
outliers-cp01a-v3.{md,csv} (18 clasificados + 13 irruteables / 300).
test_cp01a_95_fixture_v3 (slow, fuera del CI rápido): sobre el fixture v3
(N≥300), assert IC95_inferior(fracción dentro de ±30%) ≥ 0.75 y
P(fracción ≥ 0.75) ≥ 0.95 vía bootstrap no paramétrico (B=1000, semilla
2026). Criterio sobre fracción (independiente de N). Irruteables por el
grafo propio contados como miss. Usa el A* operativo (mide distance,
distinto de CP-01c' que mide duration).
Resultado eval-95 sobre fixture v3 (A* operativo, B=1000, semilla 2026):
fracción dentro de ±30% = 0.897, IC95 inferior 0.860 ≥ 0.75,
P(fracción ≥ 0.75) = 100% ≥ 0.95. El margen estrecho de v2 (78/100) era
artefacto del sesgo a rutas urbanas cortas (ADR-0011 §V/L#3), no del A*.

- ADR-0016 → accepted, §Resultado + tabla de tareas Ruta A+B completas.
- ADR-0011 §V/L#5 → RESUELTO.
- trazabilidad.md: RF-03 + sección IT-01 con el cierre CP-01a-95.
- CHANGELOG: entradas H5-fix + H5-eval-95.
@Jacket-69 Jacket-69 merged commit 81b973c into main Jun 3, 2026
6 checks passed
@Jacket-69 Jacket-69 deleted the feat/h5-fix-fixture-v3 branch June 3, 2026 02:35
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