================================================================================ PROMPT 01 - NIVEL AVANZADO: AGENTIC IDE (Claude Code / Cursor / Codex) ================================================================================ Nombre del prompt : Extraccion batch de 40 empresas - matriz consolidada + resumen de actas (input para el dashboard ejecutivo) Herramientas : Claude Code (CLI), Cursor, Codex, Windsurf u otro IDE con agente de codigo. Requiere Python 3.10+ instalado. Tiempo estimado : 18-22 min (4 setup + 12 build pipeline + 4 review) Resultado esperado: 2 CSVs canonicos listos para el dashboard ejecutivo: - matriz_consolidada.csv (puesto x empresa x sector x municipio, normalizado) - actas_resumen.csv (sindicato, % aprobacion, n trabajadores cubiertos, fecha, incremento) + log_extraccion.csv con archivos OK / con error. Procesa los 144 archivos PDF/XLSX de las 40 empresas de la muestra publica. DISCLAIMER: Los archivos de la carpeta originales/ son documentos de dominio publico obtenidos del Centro Federal de Conciliacion y Registro Laboral (CFCRL). Uso educativo en sesion ERIAC. Cualquier analisis derivado debe citar la fuente y respetar la Ley Federal de Proteccion de Datos Personales. Esta herramienta complementa - no sustituye - el trabajo de las consultoras especializadas en compensaciones. -------------------------------------------------------------------------------- PASO 0 - Antes de pegar el prompt -------------------------------------------------------------------------------- - Abre Claude Code (o Cursor) en una carpeta de trabajo limpia, por ejemplo: C:\Users\TU_USUARIO\Desktop\analisis_breakout\ - Asegurate de tener Python 3.10+ instalado (ejecuta `python --version`). - Confirma acceso de lectura a la carpeta de la muestra: C:\Users\Gerardo Ayala\Desktop\Webinar_IA_HR_Comite\04_Datos_Demo\originales\ (40 subcarpetas numeradas: 01_NEMAK_MEXICO ... 40_CONTINENTAL_AUTOMOTIVE, 144 archivos PDF + XLSX, 96 MB). - Si vas a usar fallback con LLM API para PDFs escaneados, exporta antes: ANTHROPIC_API_KEY o OPENAI_API_KEY. Si no las tienes, no pasa nada, el pipeline marcara los problematicos en log_extraccion.csv. -------------------------------------------------------------------------------- PROMPT (copiar/pegar tal cual en el chat del agente) -------------------------------------------------------------------------------- Eres un ingeniero de datos senior especializado en analitica de compensaciones. Vas a construir un pipeline batch que procese la muestra completa de 40 empresas (144 archivos PDF y XLSX) extraidas del repositorio publico CFCRL, y entregue dos CSVs canonicos listos para alimentar un dashboard ejecutivo sectorial. CONTEXTO - Carpeta de entrada (lectura recursiva): C:\Users\Gerardo Ayala\Desktop\Webinar_IA_HR_Comite\04_Datos_Demo\originales\ - Estructura: 40 subcarpetas numeradas por empresa (01_NEMAK_MEXICO/, 02_MAGNA_MIRROR_MONTERREY/, ... 40_CONTINENTAL_AUTOMOTIVE/). Dentro de cada empresa hay archivos PDF y/o XLSX que pueden ser tabuladores, actas de votacion sindical o contratos colectivos. El nombre del archivo suele dar pista del tipo (busca palabras clave: tabulador, salarios, acta, votacion, legitimacion, contrato). - Universo: empresas grandes de Nuevo Leon, Coahuila, Bajio. Sectores: autopartes, manufactura industrial, empaque, energia, retail. - Audiencia final: profesionales de Compensaciones (HRBP a Director). Necesitan tablas y un dashboard, no leer codigo. TAREA - construir el pipeline en la carpeta actual: pipeline.py # entry point, orquesta todo extractor_tabulador.py # PDF/XLSX tabulador -> filas extractor_acta.py # PDF acta -> metadata sindical normalizador.py # diccionario puesto/sector + helpers llm_fallback.py # opcional, solo si hay API KEY requirements.txt README.md # un solo comando para correr STACK MINIMO RECOMENDADO - pandas (consolidacion) - openpyxl (XLSX) - pdfplumber SOLO si es necesario; muchos tabuladores en la muestra son XLSX nativos y se leen sin OCR. Para PDFs: 1) Primero intenta pdfplumber.extract_tables(). 2) Si devuelve vacio o el PDF parece escaneado, NO uses tesseract (no queremos dependencia binaria pesada para un breakout de 25 min). En su lugar: a) Si hay ANTHROPIC_API_KEY o OPENAI_API_KEY en env, usa el LLM (Claude o GPT-4o) con la imagen rasterizada del PDF (pdf2image -> base64) y pidele estructurar a JSON con schema {puesto, categoria, sueldo_diario}. Documentar en codigo: "Fallback LLM activado para X.pdf por ser escaneado". b) Si no hay API KEY, marca el archivo en log_extraccion.csv con motivo 'PDF escaneado, sin LLM disponible' y sigue. NO abortar. - jinja2 NO es necesario en esta carpeta (el dashboard lo construye el prompt 03/Salary_Dashboard a partir de los CSVs que generamos). SALIDAS OBLIGATORIAS (en analisis/, hermana de originales/) a) matriz_consolidada.csv -- ESTE ES EL CONTRATO CON EL DASHBOARD Schema EXACTO (mismas columnas, mismos nombres): empresa, sector, municipio, puesto_normalizado, categoria, sueldo_diario_mxn, sueldo_mensual_mxn, n_trabajadores, fuente_archivo Reglas: - Una fila por puesto/categoria detectada en cada empresa. - sueldo_mensual_mxn = sueldo_diario_mxn * 30.4 si no viene calculado. - n_trabajadores: deja vacio si el tabulador no lo trae (es comun). - puesto_normalizado: minusculas, sin acentos, sin abreviaciones (OP. -> OPERADOR, AYTE -> AYUDANTE). Mantener categoria aparte. - sector y municipio se infieren del nombre de la subcarpeta o se buscan en el contenido del PDF; si no hay forma, dejar 'n/d'. - fuente_archivo: ruta relativa desde originales/ para auditoria. b) actas_resumen.csv -- ESTE TAMBIEN VA AL DASHBOARD Schema EXACTO: empresa, sindicato, pct_aprobacion, n_trabajadores_cubiertos, fecha_revision, incremento_pct Reglas: - Una fila por acta procesada. Si una empresa tiene multiples actas, una fila por cada una. - pct_aprobacion: votos a favor / total votantes, en numero (0-100). - incremento_pct: solo si el acta menciona porcentaje de incremento pactado; si no, dejar vacio. - fecha_revision: ISO YYYY-MM-DD si es posible. c) log_extraccion.csv Columnas: archivo, empresa, tipo_detectado, status, motivo. status in {OK, ERROR, REQUIERE_REVISION}. Para todo archivo que no se haya podido procesar, una fila aqui. Esto es lo que el facilitador mostrara en vivo: "se procesaron X de 144, los Y restantes requieren revision manual y aqui estan". NORMALIZACION DE PUESTOS (paso 2 del breakout v3.2) - Implementar normalizador.py con un diccionario base que reconcilie variantes del mismo puesto entre empresas: operador de produccion = op produccion = op. de prod = operador prod ayudante general = aytte general = ayudante gral montacarguista = operador montacargas = chofer montacargas tecnico de mantenimiento = tec mtto = tecnico mtto = mtto tecnico - Cubrir minimo los 30 puestos mas frecuentes detectados en la muestra. - Imprimir al final del log las top 50 variantes detectadas y proponer 3-5 entradas adicionales para el diccionario. MANEJO DE ERRORES - Si una carpeta de empresa no tiene archivos legibles, log y sigue. - Si un PDF no abre, log y sigue. - Si una extraccion devuelve 0 filas, marcar REQUIERE_REVISION. - NUNCA abortar el pipeline completo por un archivo. - Tiempo objetivo total: < 6 minutos para los 144 archivos en una laptop estandar (i5/16GB). LOGGING - Usa logging estandar. - Al final imprime resumen: 40 empresas escaneadas, X tabuladores OK, Y actas OK, Z archivos con error, ruta de matriz_consolidada.csv y actas_resumen.csv. REGLAS - Comentarios en espanol, breves. - Sin emojis ni print() decorativos (consola Windows truena con caracteres especiales). - Antes de empezar a codear, lista los archivos que vas a crear y espera mi "ok". Despues procede sin volver a preguntar. - Cuando termines, ejecuta el pipeline tu mismo y reporta: - filas en matriz_consolidada.csv - filas en actas_resumen.csv - archivos OK / con error - 3 hallazgos sectoriales rapidos que veas en los datos -------------------------------------------------------------------------------- SI ALGO SALE MAL -------------------------------------------------------------------------------- 1. pdfplumber no extrae tabla bien (devuelve texto plano sin columnas) Pega: "El tabulador {empresa} no se esta parseando bien con pdfplumber. Modifica extractor_tabulador.py para que primero intente extract_tables(), si devuelve vacio intente con find_tables() y settings de tolerancia, y si sigue vacio y hay ANTHROPIC_API_KEY o OPENAI_API_KEY, escale al LLM con la pagina rasterizada pidiendo JSON estructurado segun el schema de matriz_consolidada. Reintenta solo esa empresa." 2. Extraccion de acta deja casi todos los campos vacios Las actas suelen ser PDFs escaneados. Pega: "Las actas devuelven vacios. La mayoria son escaneadas. En lugar de tesseract, escala al LLM con la pagina rasterizada (pdf2image -> base64). Pidele que devuelva JSON con sindicato, pct_aprobacion (numero 0-100), n_trabajadores_cubiertos, fecha_revision, incremento_pct. Si no hay API KEY, marcalas REQUIERE_REVISION en el log." 3. Matriz_consolidada sale con 200 puestos distintos para 'operador' Pega: "El normalizador esta dejando pasar variantes. Imprime las 50 variantes mas frecuentes de puesto detectadas, propon ampliacion del diccionario con minimo 15 entradas nuevas, regenera la matriz y reporta cuantos puestos_normalizados unicos quedaron al final." 4. El pipeline tarda mas de 10 minutos Pega: "Paraleliza el procesamiento por empresa con ThreadPoolExecutor (no asyncio, mantenlo simple), 6 workers. Mantener logging thread-safe. Reportar tiempo total al final." -------------------------------------------------------------------------------- ALINEACION CON EL DASHBOARD (carpeta 03_Prompts_Salary_Dashboard) -------------------------------------------------------------------------------- Los CSVs que genera este prompt (matriz_consolidada.csv + actas_resumen.csv) son el INPUT directo del prompt 03_Prompts_Salary_ Dashboard/01_avanzado_claude_code.txt. El schema esta congelado entre los dos prompts; no cambies nombres de columnas sin actualizar tambien el dashboard. -------------------------------------------------------------------------------- VARIANTES / EXTENSIONES (mas alla del breakout) -------------------------------------------------------------------------------- A. CRUCE CON DATOS INTERNOS Despues de generar matriz_consolidada.csv, pega: "Crea merge_interno.py que reciba un Excel con mis puestos internos (puesto_interno, sueldo_actual, sector, municipio). Por cada puesto interno busca matches en matriz_consolidada (mismo sector + municipio + puesto_normalizado con fuzzy >= 80) y genera un Excel comparativo con percentiles del sector y posicion relativa (abajo / en mercado / arriba)." B. DETECTOR DE CAMBIOS ENTRE VERSIONES "Modifica el pipeline para que si existe analisis/matriz_consolidada .csv de una corrida previa, compare con la nueva y genere cambios.csv: empresa, puesto, sueldo_anterior, sueldo_nuevo, delta_pct. Util para tracking trimestral." C. AGREGADO POR MUNICIPIO "Genera matriz_municipio.csv con: municipio, sector, puesto, n_empresas, sueldo_p25, p50, p75, p90. Insumo para el heatmap sector x municipio del dashboard." -------------------------------------------------------------------------------- DISCLAIMER DE USO RESPONSABLE -------------------------------------------------------------------------------- Los archivos procesados son de dominio publico (CFCRL). El analisis derivado puede usarse internamente para benchmark exploratorio, pero al publicar o compartir fuera de la organizacion debe citarse la fuente y la fecha de corte. No se debe atribuir a empresas especificas ofertas salariales actuales sin validar contra su tabulador vigente. Esta herramienta complementa el trabajo de las consultoras especializadas en compensaciones, no lo reemplaza.