¿Qué hace Evaluador de Ofertas de Empleo?
El usuario recibe mensajes de reclutadores con regularidad y desea el mismo análisis cada vez: ¿el rol encaja?, ¿las condiciones reales (netas) son mejores que las actuales?, ¿qué preguntar?, ¿qué responder?. Las cifras brutas entre diferentes tipos de contrato y países engañan, por lo que el núcleo de este skill es una comparación de salario neto real construida a partir de los datos que el usuario proporciona, nunca de datos que recuerdes o supongas.
Paso 0: Cargar contexto
Los datos personales residen fuera del skill, por lo que actualizar, copiar o publicar el skill nunca los expone ni sobrescribe. Resuelve la carpeta de datos <data_dir> una vez, en este orden:
$JOB_SEARCH_DIR, si está definida.job-search/dentro de la carpeta de configuración de usuario del agente que estés ejecutando:~/.claude/job-search/para Claude Code,~/.codex/job-search/para Codex CLI,~/.gemini/job-search/para Gemini CLI. Para cualquier otro agente, utiliza la carpeta de usuario equivalente.
Nunca uses una carpeta dentro del skill o dentro de un repositorio de proyecto. Si <data_dir> no existe, créala, copia templates/profile.md y templates/offers_log.md de este skill en ella, e informa al usuario qué ruta has utilizado.
- CV. Lee
cv_pathde<data_dir>/profile.md. Si es?, falta, o el archivo no se encuentra, pide al usuario un CV (ruta o texto pegado) y almacena la ruta en el perfil; no evalúes la adecuación sin uno. El CV es la fuente de verdad para habilidades y seniority; no inventes experiencia. - LinkedIn (opcional, mejor esfuerzo). LinkedIn normalmente bloquea las lecturas automatizadas detrás de un muro de inicio de sesión, así que intenta la URL de
linkedindel perfil una vez si existe, y si está bloqueada, omítela en silencio. Solo pide al usuario un perfil o exportación PDF cuando la oferta dependa de ello (por ejemplo, el reclutador afirma algo sobre su perfil, o el CV carece de algo que el rol requiere). El CV sigue siendo principal; LinkedIn es solo una verificación cruzada de lo que el reclutador vio. - Perfil. Lee
<data_dir>/profile.md(ver Paso 1). - Ofertas pasadas. Revisa
<data_dir>/offers_log.md. Menciona si la misma empresa o reclutador aparece de nuevo, o si la remuneración se compara útilmente con ofertas anteriores.
Paso 1: Confirmar o entrevistar (pregunta, no supongas)
Las cifras salariales y las condiciones cambian, y una suposición incorrecta arruina silenciosamente la comparación.
- El perfil tiene valores y
last_verifiedexiste: muestra un resumen compacto de los datos almacenados y pide al usuario que los confirme o indique qué ha cambiado. Haz una pregunta solo para los campos marcados con?o que el usuario corrija. Silast_verifiedtiene más de 6 meses, indícalo y recorre los campos con más cuidado. - El perfil está vacío o falta (primera ejecución): realiza la entrevista completa a continuación, luego escribe las respuestas en
<data_dir>/profile.mdy establecelast_verifieda la fecha actual. - Después de cualquier cambio, actualiza
profile.md(mantén el diseño existente) para que la próxima ejecución sea una confirmación rápida.
Envía las preguntas como un mensaje agrupado (usa tu herramienta de preguntas estructuradas si el agente la tiene), junto con cualquier detalle de la oferta que falte.
1. Base financiera y estructura contractual
- Salario bruto base actual y bono/parte variable anual objetivo (y con qué fiabilidad se paga).
- Tipo de contrato: indefinido/temporal español, EOR, autónomo/freelance, W2 estadounidense vs 1099, otro.
- Pagas (12 o 14). Esto cambia el flujo de caja mensual, no el neto anual, pero importa al comparar cifras mensuales.
2. Ubicación y contexto fiscal
- País y ciudad/región donde tributan ahora, y donde tributarían con la oferta (las tasas difieren por comunidad autónoma española, cantón suizo, estado estadounidense, etc.).
- Cualquier régimen especial o deducción (Beckham/régimen de impartriados, discapacidad, dependientes, hipoteca, deducciones regionales).
3. Beneficios y costes de bolsillo
- Beneficios no dinerarios actuales: seguro médico privado, aportación a pensiones, vales de comida, subsidio de transporte, acciones, presupuesto de formación, cada uno con un valor anual aproximado en EUR.
- Costes laborales que pagan ellos mismos: desplazamientos no compensados, equipamiento, coworking.
4. Estilo de trabajo e impacto en costes
- Modelo de trabajo actual (100% remoto, híbrido con días por semana, presencial) y su modelo preferido con cuánta oficina tolerarían.
- Si es híbrido o presencial: coste mensual de desplazamiento y tiempo semanal de desplazamiento.
5. Umbral de decisión
- El incremento neto mínimo que haría que un cambio valga la pena, por ejemplo "+15% neto efectivo" (sugiere alrededor de +15-20% para un cambio de trabajo, más para B2B u ofertas menos estables, y deja que el usuario lo anule). Pregunta sobre barreras absolutas (presencialidad, solo contratista, sector específico).
Por oferta (nunca almacenado en el perfil): para B2B/por hora, horas facturables realistas por año y brechas esperadas entre contratos; para pagos no en EUR, el tipo de cambio (Paso 2 lo obtiene).
Paso 2: Comparación de salario neto real
Compara neto, no bruto, para el trabajo actual y la oferta. Neto significa después de seguridad social, impuesto sobre la renta, y para autónomos los costes de trabajo por cuenta propia (cuota de autónomos, gestor, seguros). Luego suma el valor anual de los beneficios no dinerarios y resta los costes laborales de bolsillo para obtener un neto efectivo.
- FX: para ofertas no en EUR ejecuta
python3 scripts/fetch_fx.py USD(tipo ECB vía frankfurter.dev) y usa ese tipo, citando la fecha. Si la consulta falla, pide al usuario un tipo de cambio. - Ejecuta el script:
python3 scripts/net_compare.py(ver--help). El trabajo actual tributa en--country, la oferta en--offer-country(por defecto: el mismo). Toma el tipo de contrato actual, bruto (incluyendo variable esperada), beneficios, costes adicionales, ajuste regional y detalles de la oferta, e imprime neto, neto efectivo (en EUR), delta y, con--threshold, si el incremento supera el umbral.--irpf-shift(alias--region-adjust) es el ajuste regional para el país actual y--offer-region-adjustpara el país de la oferta; indica lo que has pasado.- España (ES): el ajuste es un desplazamiento de puntos porcentuales del IRPF (aproximadamente -0.01 a -0.015 para regiones con impuestos bajos como Madrid, +0.01 para regiones con impuestos más altos, 0 si no estás seguro).
- Estados Unidos (US): solo federal, soltero, deducción estándar, sin 401(k)/HSA, sin deducción QBI. El ajuste es la tasa media del impuesto estatal de la renta del usuario (0 para TX/FL/WA, pregunta el estado en caso contrario). Para trabajo 1099 incluye el seguro médico pagado por cuenta propia en
--expenses; para ofertas W-2 pon la cobertura sanitaria del empleador y la aportación al 401(k) en--offer-benefits. - Monedas: los importes de la oferta están en la moneda del país de la oferta.
--fxconvierte la moneda de pago a esa moneda (pago en USD con tributación en España:--fx 0.89), y--to-eurconvierte la moneda del país de la oferta a EUR (pago en USD con tributación en EE. UU.:--fx 1 --to-eur 0.89). Los beneficios y costes adicionales siempre están en EUR.
- Módulos fiscales: las reglas de los países residen en
scripts/tax/<cc>.pycon sus números endata/tax_<cc>.json; existen España (ES) y Estados Unidos (US). Para otros países (Suiza, Reino Unido, etc.) estima el neto manualmente a partir de los tramos impositivos y reglas de seguridad social actuales (búsqueda web de cifras del año en curso), muestra los pasos principales y etiquétalo como estimación aproximada. Si llegan ofertas de ese país con frecuencia, sugiere construir un módulo (references/adding-a-country.md). - Verificación de vigencia:
net_compare.pyimprime unWARNINGcuando los datos fiscales están desactualizados o no verificados. Cuando lo veas, informa al usuario y ofrece el procedimiento de actualización a continuación antes de confiar en las cifras. - Indica siempre los supuestos utilizados: tipo FX, horas facturables, gastos, región, año fiscal. Di que el resultado es una estimación y que un gestor/asesor fiscal debe confirmarlo para una decisión real.
- Para B2B, el neto sigue ignorando lo que un empleado obtiene gratis: vacaciones pagadas, baja por enfermedad pagada, protección por desempleo, acumulación de pensión, contribuciones del empleador. Proporciona el "equivalente a bruto de empleado" y señala los riesgos del contrato (cliente único, condiciones de aviso, riesgo de falso autónomo, exclusividad).
Paso 3: Adecuación y condiciones
Adecuación (CV vs rol). Puntúa de 0 a 10 con una línea de justificación. Enumera coincidencias (con evidencia del CV), carencias (reales frente a simplemente no listadas), y el probable día a día real y seniority en comparación con su rol actual. Los títulos de los reclutadores a menudo ocultan un trabajo más limitado de lo que anuncian, así que indica cuál es probablemente el rol.
Condiciones (prioridad: salario neto > remoto > trayectoria). Usa references/benefits-checklist.md para la lista de beneficios, y marca cada elemento como indicado / por defecto legal / desconocido:
- Salario y beneficios (salud, aportación a jubilación, tiempo libre remunerado, baja por enfermedad, permiso parental), especialmente para roles fuera de España donde los valores por defecto legales difieren.
- Modalidad de trabajo frente a su preferencia declarada, más superposición de husos horarios y viajes.
- Trayectoria profesional: camino de crecimiento, propiedad, reputación de la empresa y del cliente, si el trabajo contribuye a los
target_roles_and_topicsdel perfil o se aleja de ellos, estabilidad de la relación.
Señales del reclutador. Lee el mensaje en sí usando references/recruiter-signals.md (cliente final oculto, contacto masivo, salarios "hasta", forma de contrato frente a rol, alcance frente a título) y enumera las banderas y señales positivas encontradas. Opcionalmente, busca en la web la reputación de la empresa y del cliente final.
Paso 4: Veredicto, preguntas, respuesta
- Veredicto: Perseguir, Preguntar primero o Rechazar, con las 2-3 razones que lo decidieron, verificadas explícitamente contra su umbral y barreras absolutas.
- Preguntas para el reclutador: solo las 2-3 cuyas respuestas podrían cambiar la decisión (normalmente estructura salarial real y condiciones de tiempo libre remunerado, alcance real y equipo, duración del contrato y condiciones de finalización). Sin relleno genérico.
- Borrador de respuesta, una vez que la decisión esté clara o el usuario la indique, en el idioma del reclutador, corto, en la voz del usuario. Rechazo: dar las gracias, opcionalmente una línea de motivo. Pedir detalles: interés condicional más las preguntas; no revelar su salario actual (ofrecer un rango objetivo si es útil). Si aún indeciso, ofrecer ambos borradores brevemente. Un párrafo es una línea (sin saltos de línea forzados) y usar guiones con moderación.
Paso 5: Registrar la oferta
Después del veredicto, añade una fila a <data_dir>/offers_log.md (Fecha, Empresa y cliente final, Rol, Contrato, Remuneración ofrecida, Delta neto efectivo, Adecuación, Veredicto, Resultado/comentarios). Pregunta antes de escribir si el usuario no ha dicho que la registre. Más tarde, cuando te digan qué pasó (respondió, rechazó, entrevista), actualiza el Resultado de esa fila.
Actualización anual de datos fiscales
Cada data/tax_<cc>.json contiene la escala del impuesto sobre la renta de ese país, las tasas y topes de seguridad social o nómina, y las deducciones (España también la tabla de cuotas de autónomos), con tax_year, verified_on y verified_by. Las cifras caducan cada enero, así que actualiza cuando el script advierta, cuando el año calendario supere tax_year, o cuando el usuario lo pida. Procedimiento:
- Busca las fuentes oficiales listadas en los
sourcesdel archivo. España: AEAT para la escala del IRPF y el mínimo personal, Seguridad Social para la tabla de cuotas RETA, la base máxima de cotización y los tipos de cotización del trabajador incluyendo MEI. EE. UU.: Rev. Proc. de ajuste por inflación del IRS para los tramos y la deducción estándar, SSA para la base salarial de la Seguridad Social; relee las reglas del Medicare Adicional y del impuesto de trabajo por cuenta propia, que la primera versión tomó de conocimiento general. - Muestra al usuario un diff antes/después de cada valor cambiado con su enlace a la fuente. No sobrescribas en silencio: una cifra fiscal incorrecta corrompe silenciosamente cada comparación futura, así que el usuario confirma primero.
- Con su aprobación, edita el JSON, establece
tax_year,verified_ona la fecha actual, yverified_bya las fuentes realmente leídas (elimina el texto "NO verificado" solo si realmente verificaste contra páginas oficiales). - Vuelve a ejecutar una comparación de muestra para comprobar que nada se ha roto.
Un recordatorio programado es opcional: si el usuario quiere un recordatorio real en enero, ofrece configurar uno con cualquier mecanismo de programación que el agente o el sistema operativo proporcione (cron, una tarea programada del agente, un evento de calendario) que abra una sesión ejecutando esta actualización.
Formato de salida
Mantenlo escaneable, no un ensayo. Usa exactamente estas secciones, en este orden:
- Resumen (2 líneas): veredicto, puntuación de adecuación, delta neto efectivo vs umbral.
- Comparación neta: una tabla con filas Bruto, Seguridad social / cuota, Impuesto sobre la renta, Neto, Beneficios, Costes de bolsillo, Neto efectivo, y columnas Actual / Oferta / Delta; debajo la lista de supuestos.
- Adecuación: puntuación, coincidencias, carencias, probable alcance real.
- Condiciones: tabla corta para remoto, beneficios, trayectoria, riesgos.
- Señales del reclutador (una línea corta cada una) y Preguntas para el reclutador: 2-3 elementos numerados.
- Borrador de respuesta.
- Supuesto o no verificado: lista con viñetas.
No produzcas párrafos en prosa cuando una tabla o viñetas sirvan.