BuildCv.Domain
Las entidades, los pesos y las bandas. Sin dependencias hacia afuera: acá vive la definición de qué significa que un CV coincida con una oferta, y se puede testear sin levantar nada.
BuildCv puntúa una hoja de vida contra una oferta concreta y explica de dónde salió cada punto. Sin modelo de lenguaje en ninguna parte del cálculo: los pesos, los umbrales y las reglas están publicados, y el mismo par CV/oferta devuelve el mismo número hoy y el mes que viene.
Quien busca empleo manda decenas de postulaciones y recibe silencio. Las herramientas que prometen 'optimizar tu CV para el ATS' devuelven un número sin explicación, y cuando hay un LLM detrás, el mismo CV puede dar 68 hoy y 74 mañana sin que nada haya cambiado. Un puntaje que no se puede reproducir no es un diagnóstico: es una opinión con formato de dato.
Arquitectura hexagonal real, no carpetas con nombres de capas. Las dependencias apuntan hacia adentro: el dominio no conoce a la base de datos ni a HTTP. El número a la derecha de cada capa es su cantidad de métodos de test.
Las entidades, los pesos y las bandas. Sin dependencias hacia afuera: acá vive la definición de qué significa que un CV coincida con una oferta, y se puede testear sin levantar nada.
El motor de scoring y el constructor de recomendaciones. Orquesta el dominio y define los puertos que la infraestructura implementa.
Implementa los puertos: repositorios, migraciones, cifrado. Sus tests corren contra un SQL Server real levantado con Testcontainers, no contra un doble.
Superficie HTTP. Segura por defecto: la política de autorización global exige sesión y hay que optar por salir explícitamente con AllowAnonymous.
El navegador nunca habla con la API. Los tokens viven en cookies httpOnly de este origen y cada llamada pasa por un route handler que hace de backend-for-frontend.
Seis secciones, cada una con una porción fija del total. La barra es esa porción: Skills ocupa el 45% de la barra porque pesa 0.45 del puntaje. Cualquiera puede tomar estos números y verificar su propio resultado.
| Skills | 0.45 | |
|---|---|---|
| Experience | 0.20 | |
| Education | 0.10 | |
| Certifications | 0.10 | |
| Languages | 0.10 | |
| Projects | 0.05 |
Una sección que la oferta no pide no consume peso: su porción se redistribuye proporcionalmente entre las que sí pide, así el techo es 100 para toda oferta. La versión anterior le daba 0.5 neutro a una sección no preguntada, y eso volvía inalcanzable la mitad de su peso — un CV impecable sacaba 95 sin que el candidato pudiera averiguar por qué. En un producto cuyo propósito es explicar el puntaje, eso era el peor bug posible.
Cuando BuildCv sugiere un cambio, no estima el beneficio: reejecuta la fórmula completa con esa única carencia cubierta y reporta la diferencia. Un '+3.2 puntos' es un puntaje que se calculó, no un pronóstico. Si el motor no puede medirlo, no lo afirma.
Que el código compile, que la imagen se comporte y que lo que está corriendo sea lo que subiste son tres afirmaciones distintas. Las tres se verifican por separado, y la tercera fue la que más sorpresas dio.
Los dos repositorios son públicos: la API en C# y el cliente en Next.js. Nada de lo que se afirma en esta página necesita que me creas.
Ver todos los proyectos