- domain/directory_import.py: read_rows (xlsx первый лист / csv UTF-8 `;`/`,`, заголовки по нормализованному тексту, MISSING_COLUMNS / UNSUPPORTED_FILE), plan_import — чистая функция: операции плана и отчёт с кодами §13.2, ASSUMPTION(OQ-87..91); ИНН — через domain/inn.py. - openpyxl==3.1.5 (+ et_xmlfile==2.0.0) в requirements.txt, types-openpyxl в requirements-dev.txt. - Тесты без БД: нормализация, чтение csv/xlsx (Review Focus 1–3), каждый код §13.2, skip/update, фикстура «Русский Бисквит» (ФЛ в строке 12 → UNSUPPORTED_TYPE). - План фазы 2: Task 9 отмечена; tasks.md 3.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
auth.py импортирует cryptography напрямую, а requirements.txt — полный freeze. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Dev HS256 включается только при AUTH_DEV_ISSUER и DEBUG одновременно; РАИСА — RS256/ES256 по публичному ключу или JWKS с кэшем. PyJWT[crypto] добавлен в requirements.txt как прод-зависимость. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>