Proyecto: apiforge-core · Release v0.4.0 · 18 Jun 2026 · Cliente: APIForge SaaS B2B
existing (referencia inmutable) sigue viva cuando se llama al insert mutable. Fix: .cloned() copia el valor y cierra el borrow inmutable antes de la inserción. Un carácter quirúrgico, cero riesgo funcional.
&self. Handler ya implementa Clone (derivado). Fix: .clone() produce una copia sin tocar el original. Alternativa swap_remove descartada porque el método es &self (no mutable).
? y .map_err requieren que el tipo implemente std::error::Error, que a su vez requiere Debug + Display. ApiError ya tenía Display pero le faltaba #[derive(Debug)] y el impl Error vacío. Fix mínimo: añadir derive y el impl sin body (usa defaults).
cache.entry() toma un borrow mutable que dura hasta que se usa el Entry. El cache.insert() posterior intenta un segundo borrow mutable simultáneo → E0499. Fix: usar la API idiomática .or_insert() que resuelve todo en una expresión y elimina el .unwrap() innecesario. Reduce de 3 líneas a 1.
&str por String (owned), pero se eligió la anotación 'a para preservar la semántica original y evitar allocations innecesarias. Se actualizaron también los 3 call-sites con RequestCtx<'_> (lifetime elision).
BTreeMap fue importado durante una refactorización anterior pero nunca se usa en este módulo. La configuración CI tiene -D warnings por lo que la advertencia se convierte en error de compilación. Fix: eliminación directa. Verificado que no se usa en ningún bloque condicional (#[cfg]).