Instrucciones para agentes de IA (y personas) que desarrollan este repositorio. Para usar la herramienta con un agente, ver docs/AGENT.md y el skill .claude/skills/mxbank/SKILL.md.
Los estados de cuenta reales viven en corpus/ o docs/Estados/ (ignorados por git) y contienen datos personales del titular y de terceros.
- No abras ni extraigas texto de un PDF real, ni con herramientas de lectura ni con scripts propios. Su contenido terminaría en el contexto del modelo.
- Para estudiar un layout:
- Genera el volcado enmascarado a un archivo, sin leerlo:
uv run python tools/layout_dump.py <pdf> --out docs/Estados/layout_x.txt. Agrega--reveal-tx-first-linesi hace falta ver la primera línea de los movimientos. - Pide al titular que lo revise y espera su aprobación.
- Solo entonces léelo.
- Genera el volcado enmascarado a un archivo, sin leerlo:
- Para depurar un parser contra un PDF real, usa diagnósticos que impriman solo booleanos, conteos y formas enmascaradas (
9por dígito,Xpor letra), nunca valores. Ejemplo de pregunta válida: "¿la suma de cargos coincide con el total del banco?" →True/False. - Para validar, usa
uv run python tools/corpus_check.py <carpeta>: solo imprime métricas. - En la documentación de layouts (
docs/bancos/) solo van formas genéricas (<BANCO>,<COMERCIO>,<CIUDAD>). Nunca nombres de comercios, ciudades, bancos de contrapartes ni conceptos que vengan de los estados del titular: aunque no sean PII por sí solos, ubican o perfilan a la persona. - Los JSON de salida y los resúmenes generados a partir de datos reales se guardan en
docs/Estados/y no se publican.
git config core.hooksPath tools/git-hookstools/check_no_pii.py bloquea PDFs, las carpetas de datos reales y cualquier CLABE, tarjeta, RFC, CURP o correo. CI la corre sobre todo el repositorio. Si bloquea un valor ficticio de prueba, constrúyelo en código (como tests/synthetic/common.py) o agrégalo a .pii-allowlist. Nunca agregues ahí un valor real.
uv sync # dependencias
uv run pytest -q # pruebas (PDFs sintéticos; la red está bloqueada)
uvx ruff check src tests tools # lint
uv run mxbank extract <pdf> # probar la CLIloader (palabras con coordenadas) → parsers/<banco>_<producto>.py (RawStatement, con PII) → validate/reconcile → privacy/redactor (Statement, sin PII) → privacy/residual_scan (fail-closed, código 40). RawStatement nunca se serializa.
- Documenta el layout en
docs/bancos/<banco>-<producto>.mdcon formas enmascaradas. - Implementa el parser (contrato en
parsers/base.py) y regístralo enparsers/__init__.py. - Crea su PDF sintético en
tests/synthetic/reproduciendo las particularidades reales (orden de los movimientos, formato de fechas, signos, totales) y escribe pruebas de valores, conciliación y fuga de datos. - Valida con
tools/corpus_check.py: conciliación con diferencia0.00y totales del banco coincidentes. - Si una regla contable no cuadra, encuéntrala con diagnósticos booleanos (qué combinación de campos cierra la diferencia) y documéntala como "verificada en N estados".
- Código, comentarios, documentación y mensajes de la CLI en español; nombres de campos JSON en inglés
snake_case. - Montos siempre
Decimal, nuncafloat. - Un campo nuevo en la salida requiere actualizar
models/statement.py,docs/03-esquema-salida.mdy la revisión de privacidad. - Commits sin líneas de atribución a herramientas de IA.