Files
orchestrator/docs/work-items/ORCH-057/10-tech-risks.md

5.2 KiB
Raw Permalink Blame History

work_item, stage, author_agent, status, created_at, model_used
work_item stage author_agent status created_at model_used
ORCH-057 architecture architect proposed 2026-06-10 claude-opus-4-8

10 — Технические риски: ORCH-057 — нормализация legacy root-owned файлов при миграции на uid 1000

Work Item: ORCH-057 · Repo: orchestrator · Стадия: architecture

Информационный (гейтом не парсится). Перечисляет риски реализации и их митигейшн.

Реестр рисков

ID Риск Вер. Влия. Митигейшн
TR-1 Ложная классификация ошибки worktree (D1): не-прав-ошибка распознана как «нет прав» → подмена смысла (FAIL AC-2). Низ. Сред. Узкий набор маркеров (Permission denied/could not create leading directories/insufficient permission/EACCES/EPERM); классификатор — чистая функция с юнит-тестами на обе ветки; не-совпадение → прежний сырой текст без изменений.
TR-2 Дорогой рекурсивный обход больших .git/objects / _wt тормозит старт сервиса. Сред. Сред. Ранний выход при первом mismatch (булев вердикт); полный count опционален/семплирован; TTL-кэш (fs_scan_cache_ttl_s); вызов best-effort на старте, не в hot-path claim'а; applies() first → обход только при applies.
TR-3 Ложно-блокирующий эффект на enduro-trails через общий /repos. Низ. Выс. Claim НЕ блокируется (D3 — только наблюдаемость); scope applies() first, пустой CSV → self-hosting only → enduro не сканируется; детект never-raise.
TR-4 Забытый ручной chown: на среде без выполненной процедуры баг всё ещё проявится. Сред. Сред. Теперь проявляется внятно (D1 actionable-ошибка + startup WARNING/Telegram, не сырой git-fatal); процедура — обязательный пункт чеклиста миграции в INFRA.md; идемпотентна. Остаточный риск принят (код под uid 1000 не может chown).
TR-5 fs_normalize_auto=True под root реинтродуцирует chown-контекст / неожиданный массовый chown. Низ. Сред. Дефолт False; прод-self бежит под uid 1000 (chown = no-op); auto-режим — opt-in для сред с CAP_CHOWN; init-контейнер отвергнут (ADR-001 D4).
TR-6 never-raise дыра: необработанное исключение детекта роняет старт сервиса всех проектов. Низ. Выс. Леаф never-raise (паттерн serial_gate/post_deploy); startup-вызов в try/except (как lease-reclaim/log-rotation); ошибка → WARNING + консервативный mismatch=False.
TR-7 os.getuid() неприменим в нестандартном рантайме → неверный target_uid → ложный mismatch. Низ. Низ. Фолбэк fs_target_uid (дефолт 1000); идемпотентность скана; вердикт only-наблюдательный (не блокирует).
TR-8 Кэш устарел после выполнения нормализации → stale mismatch=True в GET /queue. Низ. Низ. TTL-инвалидизация; ручной POST /fs-normalize/check (force=True) для немедленного пересчёта.

Сводный вывод

Доминирующий класс — операционные риски разовой нормализации, а не алгоритмические: код только читает/детектит/диагностирует (chown — операторская процедура под root на хосте). Самостоятельный техдолг (TR-4) — остаточный и принят: контейнер без root физически не может починить права сам; решение гарантирует внятность отказа, а не его отсутствие. Self-hosting-безопасность соблюдена (никакого рестарта прода / касания main / root-контекста в коде). Изменение аддитивно и обратимо kill-switch'ем → эскалация arch:major-change НЕ требуется (нет новой стадии/QG/таблицы/смены топологии). Возврат в анализ не нужен — ТЗ удовлетворяется без нарушения принципов архитектуры. Остаточный риск для прод-конвейера — низкий.