Análisis de Archivos Exclusivamente Local
Objetivo
Analizar archivos tabulares, documentos, PDF e imágenes sin enviar el archivo ni su contenido a ningún servicio en la nube, y enmascarar datos personales — nombres, datos de contacto, direcciones, números de identidad — en todos los modos. Los archivos fuente se abren en modo solo lectura en la máquina local, la extracción y las estadísticas se realizan mediante scripts locales, y cada artefacto permanece dentro de un directorio de trabajo local.
Paso 1 — Solicitar la ruta local primero (obligatorio, nunca omitido)
La primera frase después de activar esta habilidad debe solicitar una ruta local, no comenzar a analizar. Utilice la redacción a continuación, adaptada al contexto, manteniendo cuatro puntos: nada se sube, se necesita una ruta absoluta, cómo copiar una ruta y el selector de archivos opcional.
Analizaré este archivo solo en esta máquina — nada va a ningún servicio en la nube, y los nombres, números de teléfono, direcciones y números de identidad se enmascaran en el informe. Proporcione la ruta local absoluta, por ejemplo,
/Users/usted/Documentos/ledger.xlsxoD:\datos\ledger.xlsx; separe varios archivos con nuevas líneas. Para copiar una ruta: haga clic derecho en el archivo → "Copiar como ruta" (Windows), o arrastre el archivo a una terminal / use ⌥⌘C en Finder (macOS). O simplemente diga "selecciona los archivos" y abriré un diálogo de archivos local.
Seguimiento:
- El usuario dice "selecciona / muestra un diálogo" → ejecute
python "<directorio_habilidad>/scripts/pick_path.py"(multi-selección), o con--single. Use las rutas impresas como entrada. El código de salida 2 significa que no hay sesión gráfica — recurra a pedir al usuario que pegue las rutas. - El usuario dice "está adjunto" pero solo existe una tarjeta de adjunto, sin ruta → maneje según la sección siguiente. No lea el adjunto en silencio.
- Después de recibir las rutas, valide: la ruta existe, la extensión es compatible, el número de archivos es razonable (agrupe por tipo por encima de ~10 archivos).
Cuando el usuario ya ha adjuntado un archivo
Indique el riesgo antes de aceptar cualquier cosa:
Una cosa a tener en cuenta: un archivo soltado en el chat puede ya estar almacenado en los servidores de la plataforma, por lo que esa ruta ya no es puramente local. Si este archivo es confidencial o contiene datos personales, envíeme su ruta local y lo leeré desde el disco — nada sale de esta máquina.
Si el usuario aún quiere el adjunto, proceda, pero etiquete la entrega honestamente: "la entrada provino de un adjunto del chat, que puede haber llegado a los servidores de la plataforma" — nunca llame a un adjunto "completamente local".
Paso 2 — Dejar que el usuario elija un modo
Dos opciones; el usuario debe elegir. Si no se especifica, use Normal e indique el modo en la primera línea de la respuesta.
| Normal (por defecto) | Estricto | |
|---|---|---|
| Contenido del informe | Estructura + estadísticas + vista previa enmascarada (primeras N filas, extractos del cuerpo) | Solo métricas agregadas: filas/columnas, tipos, tasa de no nulos, recuento de distintos, rango, media |
| Texto sin procesar | El texto enmascarado entra en el informe, visible para el modelo | Nunca aparece; el modelo solo ve métricas |
| Adecuado para | Datos internos generales, interpretación semántica, conclusiones escritas | Registros de clientes, nóminas, datos médicos, contratos, material clasificado |
| Costo | El contenido enmascarado entra en el contexto de inferencia | Sin juicio semántico posible, respuestas solo basadas en estadísticas |
Redacción:
Elija un modo: ① Normal — estructura, estadísticas y una vista previa enmascarada para que pueda leer el contenido y sacar conclusiones; ② Estricto — solo métricas, sin texto original en ninguna parte del informe. El valor predeterminado es Normal.
Enmascaramiento obligatorio (todos los modos, no se puede desactivar)
El enmascaramiento no es una opción, es un comportamiento predeterminado. El script no tiene interruptor de apagado, y --mode strict no significa "el enmascaramiento es opcional" — estricto agrega "sin texto original" sobre el enmascaramiento.
| Categoría | Campos cubiertos | Resultado |
|---|---|---|
| Nombre | nombre, titular de cuenta, contacto, representante legal, propietario, responsable, gestor de cuenta, solicitante, beneficiario, titular de tarjeta, accionista | [NOMBRE#1] |
| Contacto | móvil, fijo (con código de área), fax, correo electrónico | [TELÉFONO#1] / [EMAIL#1] |
| Dirección | dirección, residencia, dirección postal, dirección registrada, domicilio | Provincia/ciudad se mantiene, el resto se convierte en [DIRECCIÓN#1]; --mask-region oculta también la región |
| Identidad | DNI nacional (18/15 dígitos), pasaporte, permiso de viaje, carné de oficial, código de crédito social unificado | [ID#1] |
| Financieros | tarjeta bancaria, número de cuenta, número de tarjeta | [CUENTA#1] |
| Otros identificadores | matrícula de vehículo, n.º de cliente, n.º de empleado, n.º de socio, n.º de estudiante, n.º de seguridad social, n.º de póliza | [PLACA#1] / [IDNO#1] |
Tres principios de implementación, citables en la nota de entrega:
- Seudónimos estables. El mismo valor de origen siempre se asigna al mismo seudónimo dentro de una ejecución. "Zhang aparece 3 veces" se convierte en "
[NOMBRE#1]aparece 3 veces" — el conteo, la deduplicación y las uniones aún funcionan, la identidad no sobrevive. - Sin mapeo en disco. El mapa de valor a seudónimo vive solo en la memoria. Ni
report.mdnimanifest.jsonlo contienen; solo se escriben los recuentos de aciertos. - Heurísticas para texto libre. Las tablas estructuradas se clasifican por encabezado de columna y se enmascaran por columna. El texto libre en cuerpos, PDFs y diapositivas se basa en expresiones regulares más un léxico de apellidos ("contacto: Zhang San", "Sr. Zhang"). Las heurísticas fallan en algunas ocasiones — especialmente nombres aislados sin una pista contextual. Dígalo claramente; nunca afirme "todo está detectado".
Mantener provincia/ciudad es deliberado: admite análisis a nivel de región sin exponer una dirección completa. Use --mask-region cuando la región en sí misma sea sensible.
Paso 3 — Extraer localmente
python "<directorio_habilidad>/scripts/local_extract.py" "/ruta/al/libro.xlsx" "/ruta/al/informe.docx" \
--directorio-trabajo ".local_analysis"
Añada --mode strict para el modo estricto; --mask-region para ocultar regiones; --redact "EMP\d{6}" (repetible) para patrones personalizados.
Salidas (todas dentro de --directorio-trabajo):
report.md— perfil estructural enmascarado + estadísticas + vista previa; la única entrada para el resto del análisismanifest.json— lista de archivos, SHA-256, modo,masking.enabled=true, recuentos de aciertos de enmascaramiento,network_used: false
La consola imprime por archivo: tipo, tamaño, campos enmascarados, recuentos de aciertos y "solicitudes de red: 0". Lea report.md con el lector de archivos local después; no sustituya con capturas de pantalla ni OCR en línea.
Paso 4 — Calcular localmente, nunca mentalmente
Sumas, proporciones, recuentos distintos, ordenación, agrupación, cambios período a período: siempre calculados por un script local. Sin ver los datos completos, las estimaciones del modelo casi siempre son incorrectas. Reutilice parse_xlsx / parse_delimited / Masker de local_extract.py en un script desechable, calcule y luego escriba los números en el informe. Los seudónimos se pueden agrupar y contar directamente, no es necesario revertirlos.
Paso 5 — Generar una hoja de auditoría
python "<directorio_habilidad>/scripts/local_audit.py" ".local_analysis" --nota "procesado localmente, nada subido"
La hoja de auditoría tiene cinco partes: integridad del archivo fuente (nueva verificación de hash que demuestra solo lectura, sin copias), ejecución del enmascaramiento (estado del interruptor, categorías, aciertos en esta ejecución), inventario de artefactos, verificación línea por línea de las líneas rojas, conclusión. Código de salida 0 = aprobado, 1 = un archivo fuente cambió durante el procesamiento.
Paso 6 — Informar
Conclusión primero, datos después, una declaración final:
Este análisis se ejecutó completamente en esta máquina sin ningún servicio en la nube; los archivos fuente se abrieron en modo solo lectura y no se modificaron, y el informe enmascara nombres, números de teléfono, direcciones y números de identidad (seudónimos estables). Los artefactos están en
.local_analysis/, la hoja de auditoría enaudit.md.
Líneas rojas (nunca activadas)
| Categoría | Prohibido | Herramientas típicas |
|---|---|---|
| Documentos en la nube | Crear, importar o "editar" una hoja/documento en línea | Conectores de Tencent Docs, Kingsoft Docs, Feishu Docs |
| Almacenamiento en la nube / objetos en la nube | Subir archivos o artefactos | Tencent Drive, WeDrive, almacenamiento de archivos en la nube |
| Bases de conocimiento | Escribir en una biblioteca, ingerir URLs | carga en biblioteca, base de conocimiento ima |
| Búsqueda externa | Usar texto de origen o fragmentos como consulta | búsqueda web, raspado de páginas |
| Conversión en línea / OCR | Conversión de PDF en línea, descompresión en línea, reconocimiento de imágenes en línea | cualquier herramienta en línea, API de comprensión de imágenes |
| Envío saliente | Publicar archivos o resúmenes en chat, correo, bots | Mensajes de WeCom, correo electrónico, carga de notas de reuniones |
Solo una excepción: el usuario dice explícitamente "este puede ser subido / enviado". Incluso entonces, repítalo y obtenga una segunda confirmación antes de actuar.
Ruta local por tipo de archivo
| Tipo | Ruta local preferida | Notas |
|---|---|---|
.xlsx .xlsm | local_extract.py (zip + XML directamente) | Multi-hoja, enmascaramiento a nivel de columna; las fechas pueden aparecer como números de serie |
.csv .tsv .txt .md .json .html | local_extract.py | Detecta UTF-8 / GB18030 y delimitador; CSV enmascarado por encabezado |
.docx .pptx | local_extract.py (zip + XML directamente) | Párrafos, esquema de encabezados, tablas, viñetas por diapositiva; cuerpo mediante enmascaramiento de texto libre |
.pdf | local_extract.py | Utiliza un CLI workbuddy-pdf local cuando está presente, fallback zlib incorporado en caso contrario |
.png .jpg .gif .bmp .webp | local_extract.py | Solo formato, dimensiones, hash; OCR local solo si tesseract existe |
.xls .doc .ppt binarios heredados | Pida al usuario que guarde localmente de nuevo, o abra en un editor local | Nunca envíe a un conversor en línea para extraer contenido |
| PDF escaneado / texto dentro de imágenes | OCR local, o el usuario dicta el contenido | Si no hay OCR, indique la carencia honestamente — no enrute a través de la nube |
Imágenes en particular: sin tesseract, trátelas solo como metadatos y diga "el contenido de la imagen no fue reconocido", ofreciendo dos rutas locales (instalar OCR y reejecutar / el usuario lo describe). No "eche un vistazo" con un modelo de visión — eso empuja la imagen a la ruta de inferencia y contradice la solicitud del usuario.
Reglas de degradación
- El script local puede analizarlo → use la salida del script.
- No hay texto extraíble (escaneo, formato heredado, encriptado) → explique por qué, ofrezca alternativas locales (guardar localmente de nuevo, OCR local, dictado del usuario).
- El usuario insiste en "resultados ahora" → vuelva a la pregunta del modo: "dado el estado actual, solo puedo responder estadísticamente — ¿es aceptable?"
Errores comunes
- Omitir la solicitud de ruta y analizar un adjunto del chat directamente: viola el Paso 1.
- Pegar todo
report.mden la respuesta: el informe es el documento de trabajo; las respuestas llevan conclusiones y números clave. - Creer que el modo estricto hace innecesario el enmascaramiento: las dos dimensiones son independientes.
- Imprimir valores sin enmascarar en la consola o un archivo temporal "para ver los datos": el enmascaramiento debe ocurrir antes de escribir cualquier cosa.
- Estimar en lugar de calcular localmente: las estimaciones casi siempre son incorrectas a escala de datos completos.
- Enviar
.xlsa un conversor en nube "por conveniencia": viola una línea roja; guarde localmente de nuevo en su lugar. - Ignorar la codificación: leer un CSV GB18030 como UTF-8 produce caracteres corruptos que contaminan el perfil de columna. El script lo maneja; el código escrito a mano también debe hacerlo.
Nota sobre idiomas
Las reglas de detección se dirigen a formatos de datos en chino (números de identificación nacional, direcciones 省/市, apellidos chinos) más patrones genéricos (correo electrónico, teléfono, tarjeta bancaria, placa). Los informes y la salida de la consola están actualmente en chino; la lógica de detección es independiente del idioma cuando los patrones lo permiten. Para documentos solo en inglés, el enmascaramiento de tablas estructuradas aún funciona mediante encabezados de columna, pero la detección de nombres en texto libre es débil — dígalo en lugar de prometer demasiado.