# Памятка для доработки SciMesh Worker Это короткие правила по итогам ревью первой версии воркера. Перед новой задачей прочитай также [PLAN.md](../PLAN.md) и документ задачи, который тебе дали. ## Что делать - Считай воркер клиентом. Очередью, статусами задач и PostgreSQL управляет только coordinator. - Сначала скачай и проверь входной файл по SHA-256, затем запусти расчёт. - Сохраняй файлы только в своей папке `task_id/attempt`. - После расчёта сначала загрузи результат через coordinator, затем отправляй результат задачи. - В `result` передавай URI, который вернул coordinator, плюс SHA-256 и тип файла. - При ошибке вызывай `/tasks/{id}/failure`; при успехе — `/tasks/{id}/result`. - Для heartbeat используй новое `lease_expires_at`, возвращённое coordinator. - Во все запросы, связанные с задачей, передавай `worker_id` и `attempt`. - Пиши тесты не только на успех: проверь ошибку runner, неверный checksum, ошибку загрузки, потерю lease и пустой результат. - Если поменял API, меняй одновременно Python-код, Go coordinator, документацию и тесты. ## Чего не делать - Не отправляй в coordinator пути вида `worker://...` или `file://...`. Coordinator не видит локальные файлы воркера. - Не используй `/result` для сообщения об ошибке. - Не считай, что проверок Python достаточно: coordinator обязан сам проверить владельца lease, attempt, срок lease и допустимость смены статуса. - Не повторяй любой HTTP-запрос вслепую. Повторные запросы должны быть безопасны: одинаковый `(task_id, attempt, worker_id)` не должен создавать дубликаты. - Не передавай bearer token на другой домен при редиректе и не пиши токены, traceback или полные локальные пути в логи. - Не помечай задачу завершённой, если артефакт не загружен надёжно. - Не меняй контракт API «по ощущениям». Сначала зафиксируй JSON, статусы и переходы состояний в документации. ## Мини-чеклист перед коммитом - [ ] Результат загружен в storage coordinator до `POST /result`. - [ ] Ошибка уходит в `POST /failure`, а не в `POST /result`. - [ ] Heartbeat возвращает новый срок lease, и код его сохраняет. - [ ] В запросах есть верные `worker_id` и `attempt`. - [ ] Нет `worker://`, `file://`, токенов и секретов в результатах или логах. - [ ] Добавлены тесты на новый сценарий и на ошибку. - [ ] `pytest` и проверка форматирования проходят. ## Короткий контекст для нейронки > SciMesh Worker — клиент coordinator, а не владелец очереди. Загружай > результат через coordinator до завершения задачи. Успех отправляй в > `/result`, ошибку — в `/failure`. Проверяй checksum, lease и attempt. > Меняя протокол, обновляй Python, Go, документацию и тесты в одном изменении.