# EX-B3-01 · Mapa de refactor y contrato

Trabaja en un directorio temporal. La aplicación de partida ya publica:

| Método | Path | Resultado relevante |
|---|---|---|
| `GET` | `/health` | `200`, `{"status":"ok"}` |
| `POST` | `/expedientes` | `201`, modelo público |
| `GET` | `/expedientes/{expediente_id}` | `200` o `404` |

## 1. Predicción antes de editar

Completa esta tabla. No ejecutes el refactor hasta poder calcular cada ruta.

| Prefijo de `include_router` | Prefijo de `APIRouter` | Path del decorador | Ruta final |
|---|---|---|---|
|  |  |  | `/expedientes` |
|  |  |  | `/expedientes/{expediente_id}` |

## 2. Grafo de imports previsto

Escribe una flecha solo cuando el módulo de la izquierda importe el de la derecha:

```text
main.py ->
api/router.py ->
api/routes/expedientes.py ->
schemas/expediente.py ->
```

Marca cualquier camino que vuelva a `main.py`.

## 3. Baseline

Antes y después conserva:

```python
HTTP_METHODS = {"get", "post", "put", "patch", "delete"}

def public_operations(app):
    return {
        (method.upper(), path)
        for path, item in app.openapi()["paths"].items()
        for method in item
        if method in HTTP_METHODS
    }
```

Además del conjunto método/path, prueba status y JSON de un caso correcto, un
`404` y el filtrado del modelo público. No cambies `operation_id` durante el
movimiento.

## 4. Registro de evidencia

- Comando y resultado antes:
- Árbol final:
- Comando y resultado después:
- Diferencias en OpenAPI:
- Separación deliberadamente descartada:
- Condición que te hizo detener el refactor:
