work_item: ORCH-102
stage: analysis
author_agent: analyst
status: ready-for-review
created_at: 2026-06-10
model_used: claude-opus-4-8
title: "ORCH-10a Lite-тираж: инструкция LITE_SETUP + compose-подмножество — план тестов"
framework: pytest
scope: >
  Покрывается: существование и полнота docs/deployment/LITE_SETUP.md (нормативные
  разделы FR-1, форма «команда+проверка», generic-команды без боевых литералов),
  согласованность упомянутых env-ключей с каноном .env.example, структурная
  фиксация compose-подмножества (ровно орк+watchdog, staging за профилем, без
  Plane/Gitea-сервисов), stateless-нормативы и секрет-гигиена дока, перекрёстные
  ссылки (REPLICATION.md §1, CHANGELOG), воспроизводимый smoke-чек-лист и его
  приёмочный прогон на чистом контуре, полный регресс. Вне покрытия: реальный
  e2e-тираж на новом железе заказчика (заменён прогоном на staging-песочнице —
  прецедент ORCH-101 AC-3), установка Plane/Gitea как таковых, задача 10b
  (Bundled), перенос данных (stateless по решению 10.06).
notes: >
  Задача docs-first: ожидаемый дифф — docs/** + tests/** + CHANGELOG.md
  (+ .env.watchdog.example при исходе А-4); src/** не меняется. Имя нового
  тест-модуля tests/test_lite_setup_doc.py — предложение analyst; developer может
  переименовать/разбить, сохранив покрытие TC (образец структурных док-тестов —
  tests/test_replication_smoke.py). Тесты детерминированы, без сети/LLM.
  Полный регресс tests/ обязан остаться зелёным; STAGE_TRANSITIONS/QG_CHECKS/
  check_*/machine-verdict не меняются — новые тесты входят в существующие гейты
  (check_ci_green / merge-gate re-test / coverage-гейт ORCH-027) автоматически.
  TC-09 — процедурная приёмка AC-4: прогон фиксируется tester'ом в
  13-test-report.md / 15-staging-log.md, а не автоматизируется в pytest.

tests:
  - id: TC-01
    type: unit
    description: >
      LITE_SETUP.md существует по канонному пути (docs/deployment/, исход А-3 —
      синхронизировать с ADR) и несёт ВСЕ нормативные разделы FR-1: рамка/границы
      Lite, предусловия хоста (зависимости, uid/gid, getent group docker), перенос
      кода, конфигурация (.env с нуля + gen_secrets.py + ORCH_PROJECTS_JSON),
      Plane (статусы/токен/webhook+HMAC), Gitea (репо/токен/webhook), LLM
      (claude CLI), Telegram (трекер + watchdog-бот + chat-id), запуск+health-чек,
      регистрация проекта, smoke, stateless-проверка, траблшутинг (AC-1 / FR-1).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-02
    type: unit
    description: >
      Форма «каждый шаг — команда/проверка»: нормативные разделы содержат fenced
      code blocks с исполняемыми командами и явные маркеры проверки
      (PASS/FAIL/«Проверка:»); ключевые кирпичи присутствуют: docker compose,
      /health, /queue, /metrics, gen_secrets.py, onboard_project.py,
      X-Plane-Signature, X-Gitea-Signature (AC-1 / FR-1, NFR-6).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-03
    type: unit
    description: >
      Согласованность env-канона: каждый ключ ORCH_*/WATCHDOG_*, упомянутый в
      LITE_SETUP.md, существует в .env.example; обязательный набор нового хоста
      упомянут явно (ORCH_PROJECTS_JSON, ORCH_PLANE_WEBHOOK_SECRET,
      ORCH_GITEA_WEBHOOK_SECRET, ORCH_PLANE_API_TOKEN, ORCH_GITEA_TOKEN,
      ORCH_TELEGRAM_BOT_TOKEN, ORCH_TELEGRAM_CHAT_ID, WATCHDOG_TG_BOT_TOKEN,
      WATCHDOG_TG_CHAT_ID) (AC-1, AC-6 / FR-1.4, FR-6.2).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-04
    type: unit
    description: >
      Compose-подмножество (AC-2): docker-compose.yml парсится; множество сервисов
      ровно {orchestrator, orchestrator-watchdog, orchestrator-staging};
      orchestrator-staging строго за profiles: [staging] (дефолтный up -d поднимает
      ровно орк+watchdog); ни одного сервиса/образа plane*/gitea*; LITE_SETUP.md
      документирует состав дефолтного запуска (AC-2 / FR-2).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-05
    type: unit
    description: >
      Stateless и секрет-гигиена (AC-3): док несёт нормативную строку «боевые
      данные/задачи/секреты не копируются» и предписывает чистую БД + выпуск
      новых секретов (gen_secrets.py); проверка чистоты инстанса (первый GET
      /queue без задач) описана; в копируемых код-блоках нет боевых литералов
      (mva154, duckdns, 82.22.50.71) и секретоподобных значений — только
      плейсхолдеры <...>/$ENV_VAR (AC-3 / FR-3, NFR-3).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-06
    type: unit
    description: >
      Канон не форкается (AC-6): раздел Plane-статусов ссылается на golden source
      (ONBOARDING.md §1 / onboard_project.py) и явно упоминает fail-closed имена
      Confirm Deploy и STOP; при наличии дубля таблицы статусов в доке — дубль
      сверяется с plane_sync._PLANE_NAME_TO_KEY импортом (22 имени, нулевой
      дрейф); карта env и smoke даны ссылкой на REPLICATION.md (AC-6 / FR-4,
      NFR-4).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-07
    type: unit
    description: >
      Раздел Gitea соответствует инвариантам платформы: события
      push/pull_request/status, ОДИН глобальный webhook-секрет на все репо,
      и норматив защиты main согласован с исходом А-1 ADR задачи (канон: branch
      protection НЕ включать — ADR D10 ORCH-009; инструкция не предписывает
      запрещённого) (AC-1, AC-7 / FR-1.6, §3.8 А-1).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-08
    type: unit
    description: >
      Перекрёстная документация (AC-5): REPLICATION.md §1 (границы 10-common vs
      Lite vs Bundled) ссылается на LITE_SETUP.md / отмечает Lite реализованным;
      CHANGELOG.md содержит запись ORCH-102 (AC-5 / FR-7).
    module: tests/test_lite_setup_doc.py
    expected: PASS

  - id: TC-09
    type: integration
    description: >
      Приёмочный smoke-прогон по LITE_SETUP.md на чистом контуре (минимум:
      staging-песочница ORCH_STAGING_PORT с изолированной БД ./data/staging +
      одноразовый sandbox-проект; прецедент ORCH-101 AC-3): чек-лист REPLICATION
      §4 шаги 0–5 — конфиг резолвится, /health 200, /queue+/metrics штатны,
      onboard verify зелёный, тестовая задача дошла до артефактов 01–04; вердикт
      и контур зафиксированы в 13-test-report.md / 15-staging-log.md. Процедурная
      приёмка (исполняет tester по чек-листу), не pytest-модуль (AC-4 / FR-5).
    module: tests/manual/lite-smoke-checklist (процедура; протокол в 13/15)
    expected: PASS

  - id: TC-10
    type: integration
    description: >
      Полный регресс: pytest tests/ -q зелёный; существующие структурные тесты
      (test_no_host_hardcodes, test_replication_smoke, test_infra_parametrization,
      test_onboarding_*) не ослаблены/не правлены под задачу; дифф не трогает
      src/** (или каждое отклонение обосновано ADR), STAGE_TRANSITIONS/QG_CHECKS/
      machine-verdict/схему БД (AC-5, AC-7 / NFR-2).
    module: tests/
    expected: PASS
