19 Commits

Author SHA1 Message Date
Andrey Epifancev
c6dfb3e22c Срез 0 [5.2]: S3Storage (src/core/clients.py): get_bytes, put_bytes, put_json, from_settings с secure
Ошибки не проглатываются: S3ObjectNotFoundError (NoSuchKey) и S3ReadError для чтения, S3WriteError для записи,
исходная причина — в __cause__. JSON пишется в UTF-8 без экранирования, Content-Type application/json.
Шаблонные put_object/get_object удалены (не использовались); удалён и шаблонный nats_callback.py — его
единственный импорт S3Storage, сам он нигде не используется (слой NATS — следующим коммитом в src/core/nats.py).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:27:35 +04:00
Andrey Epifancev
f448992e16 Срез 0 [5.1]: нормализатор ответа ИС (src/normalizer): Normalizer, NormalizeOutcome, NullNormalizer
Ошибка ИС пробрасывается с кодом из ответа, неизвестный код/вид ошибки -> UNKNOWN_ERROR с исходным
представлением, успех -> NOT_IMPLEMENTED, не объект -> INVALID_FORMAT. Пакет добавлен в strict-список mypy.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:18:17 +04:00
Andrey Epifancev
0ea59da2a3 Срез 0 [4.3] T9.1: test_exact_beats_prefix различает точное имя и префикс
Пара фикстур a_b-1.json / a_b.json: префикс по алфавиту раньше точного имени, поэтому тест падает,
если шаг «сначала <name>.json» убран. Убран посторонний комментарий в соседнем тесте.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:14:31 +04:00
Andrey Epifancev
b489f6e0b3 Срез 0 [4.3]: эмулятор ИС Сканирование (src/scan_emulator), unit-тесты, отметка задачи
process_once(root, fixtures, delay): новые <uuid>_<имя> -> ответ из фикстуры (точное имя, затем префикс,
file_uid подставляется) либо INVALID_DOCUMENT, атомарная запись ответа, затем переименование в .done.
Цикл python -m src.scan_emulator с корректной остановкой по SIGINT/SIGTERM.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:10:36 +04:00
Andrey Epifancev
5fb046fced Срез 0 [4.2] T8.1-T8.3: inbox_name заменяет символы Windows/SMB, poll ждёт занятый файл, put терпит отказ mkdir при существующем Input
T8.1: inbox_name заменяет `: < > " | ? *` и управляющие символы на `_`, убирает завершающие точки/пробелы;
ValueError только если имени не осталось. validate_name/put остаются строгими.
T8.2: SmbHotFolder.poll возвращает None на STATUS_SHARING_VIOLATION/STATUS_DELETE_PENDING (ИС ещё пишет ответ),
монопольное открытие сохранено.
T8.3: при ошибке mkdir, кроме EEXIST/ENOENT, put продолжает, если smbclient.path.isdir(Input); иначе исходная ошибка.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:05:02 +04:00
Andrey Epifancev
1695573b35 Срез 0 [4.2]: SmbHotFolder поверх smbclient (src/gateway/smb.py), фабрика create_hotfolder, unit-тесты, отметка задачи
SmbHotFolder: UNC-корень \\host\SMB_PATH (или полный UNC в SMB_PATH), put — `.<name>.part` + smbclient.replace,
poll — open_file(rb), ENOENT (в т.ч. нет каталога) -> None, healthy — listdir корня без исключений.
create_hotfolder(settings): local -> LocalHotFolder, smb -> SmbHotFolder с ленивым импортом модуля (R-6);
отсутствие импорта src.gateway.smb в режиме local проверяется в отдельном интерпретаторе.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:57:31 +04:00
Andrey Epifancev
ad5cb7f0f0 Срез 0 [4.2] T7.4: общие проверки имени и job_id в hotfolder.py, запрет символов Windows/SMB
validate_name/validate_job_id вынесены из LocalHotFolder для повторного использования в SmbHotFolder.
Дополнительно отвергаются `: < > " | ? *` и управляющие символы 0x00-0x1F (в put, answer_path и inbox_name);
пробелы и кириллица в именах допустимы.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:53:48 +04:00
Andrey Epifancev
6d1f42fe1b Срез 0 [4.1]: протокол HotFolder и LocalHotFolder (src/gateway/hotfolder.py), unit-тесты на tmp_path, отметка задачи
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:48:47 +04:00
Andrey Epifancev
8c8237954e Срез 0 [3.1] T6.1, T6.2: is_supported_major без int() — шаблон схемы ^1\.\d+$, тесты на длинную строку и "01.0"
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:45:54 +04:00
Andrey Epifancev
5821497713 Срез 0 [3.1]: pydantic-модели контракта v1.0 (src/contract), конструкторы конвертов, тесты контракта, отметка задачи
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:43:08 +04:00
Andrey Epifancev
24ebde013a Срез 0 [3.1]: api/contracts — копии схем и examples контракта v1.0 из docs/contracts (cp, байт в байт)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:41:44 +04:00
Andrey Epifancev
b5ac55084d Срез 0 [2.2]: .env.example дополнен, .env.test, тесты на .env.test (T2.6), отметка задачи
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:38:46 +04:00
Andrey Epifancev
55fa7ce25c Срез 0 [2.1]: ruff format и правки линтера в коде шаблона, отметка задачи
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:33:18 +04:00
Andrey Epifancev
5a818b4356 Срез 0 [2.1]: pyproject (ruff, mypy), requirements-dev, Makefile, маркеры pytest
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:33:01 +04:00
Andrey Epifancev
6036625193 Срез 0 [1.2]: вернуть пины argon2-cffi и argon2-cffi-bindings (нужны miniopy-async)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:30:54 +04:00
Andrey Epifancev
b6eecfcf34 Срез 0 [1.2]: каркас приложения без БД и фронта, настройки scan-gateway
- app.py: create_app(settings), SMB-сессия только при SCAN_HOTFOLDER_MODE=smb, без SPA/CORS/РАИСА/nkeys;
  /healthcheck отдаёт uptime и version
- config.py: ENV_FILE, get_settings() с lru_cache, параметры горячих папок/NATS, блок OPENBAO__SMB необязателен,
  валидация режимов local/smb; убраны DBSettings и OPENBAO.DATABASE
- exception_handlers.py: убрана зависимость от sqlalchemy
- requirements.txt: убраны asyncpg, SQLAlchemy, alembic, argon2-cffi(+bindings), raisa_*, greenlet, Mako
- api/.env.example: минимальный local-режим против compose; unit-тесты config/app

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:27:42 +04:00
Andrey Epifancev
31a50879c2 Срез 0: вырезать фронт и БД-каркас шаблона
Удалены web/, setup/.npmrc, api/alembic/, api/alembic.ini, api/src/db/,
api/src/models/, api/src/repositories/. Из setup/setup.sh убраны npm-шаги.
Из .gitignore убрана строка Dockerfile (образ сервиса будет под git).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:23:15 +04:00
Andrey Epifancev
95a3d29cba chore: вычищены остатки доменного кода, каркас проходит tsc/biome/rsbuild 2026-10-02 23:35:01 +04:00
Andrey Epifancev
ad4f4559a9 chore: каркас из шаблона команды (DKB_ARMKA@ba172f8, доменный код удалён) 2026-10-02 23:15:38 +04:00