Files
ss-tools/specs/023-clean-repo-enterprise/research.md
2026-03-04 19:33:47 +03:00

173 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 0 Research: Clean Repository Enterprise Preparation
## Decision 1: Артефакты разделяются на 3 класса политики clean-профиля
**Decision**
Ввести формальную классификацию артефактов при подготовке enterprise clean-поставки:
1. **Prohibited Artifacts** — строго запрещены (test/demo/load-test payloads, примеры эксплуатационных данных, временные дампы и нецелевые локальные БД/репозитории).
2. **Required System Artifacts** — обязательны для работоспособного старта (системная инициализация, базовые конфигурации, служебные миграции, security bootstrap).
3. **Conditional Artifacts** — допускаются только при соблюдении дополнительных условий (например, шаблоны конфигурации без чувствительных данных).
**Rationale**
Проблема clean-подготовки не решается простым delete-list: есть риск удалить необходимые для запуска системные элементы. Разделение на 3 класса даёт детерминированную и проверяемую модель принятия решений.
**Alternatives considered**
- **Только deny-list**: отклонено, потому что высок риск ложных блокировок системных стартовых сущностей.
- **Только allow-list**: отклонено как слишком жёсткое для эволюции проекта; высокая операционная стоимость сопровождения без явной пользы на текущем масштабе.
- **Ручная экспертная проверка без формальной модели**: отклонено из-за невоспроизводимости и человеческого фактора.
---
## Decision 2: Source Isolation политика — strict internal-only с явным реестром источников
**Decision**
Для enterprise clean-профиля принять строгую модель source isolation:
- разрешены только источники из **внутреннего реестра серверов компании**;
- любые внешние internet endpoints считаются нарушением и блокируют выпуск;
- отсутствие внешнего интернета трактуется как базовое эксплуатационное условие, а не деградационный режим.
**Rationale**
Требование пользователя и корпоративный контур задают нулевую толерантность к внешним загрузкам. Явный реестр внутренних источников обеспечивает прозрачный аудит и исключает неоднозначную интерпретацию “внутренности” ресурса.
**Alternatives considered**
- **Soft-warning для внешних источников**: отклонено, не соответствует security/compliance профилю.
- **Частично разрешённые внешние зеркала**: отклонено, усложняет доверенную цепочку и нарушает требование полной изоляции.
- **Runtime fallback на внешние источники при недоступности внутренних**: отклонено как прямое нарушение корпоративной политики.
---
## Decision 3: Compliance gate должен быть обязательным и блокирующим перед выпуском
**Decision**
Выпуск enterprise clean-дистрибутива допускается только после обязательной проверки clean/compliance с бинарным результатом:
- `COMPLIANT` — выпуск разрешён;
- `BLOCKED` — выпуск запрещён до устранения нарушений.
Проверка должна валидировать одновременно:
1. data purity (отсутствие запрещённых payloads);
2. source isolation (только внутренние источники);
3. целостность manifest релиза.
**Rationale**
Снижение рисков требует enforce-механизма, а не рекомендаций. Блокирующий gate переводит требования из “договорённостей” в гарантируемый процесс релиза.
**Alternatives considered**
- **Проверка только по запросу**: отклонено из-за неполного охвата релизов.
- **Постфактум аудит после выпуска**: отклонено, потому что не предотвращает инцидент, а фиксирует его постфактум.
- **Частичный gate только по test-data**: отклонено, так как не покрывает критичный риск внешних источников.
---
## Decision 4: UX контроля выпуска — интерактивный TUI (`ncurses`/совместимый аналог)
**Decision**
Операционный интерфейс подготовки/проверки фиксируется как единый интерактивный консольный TUI-flow (на `ncurses` или совместимом аналоге), в котором оператор:
- выбирает релиз-кандидат;
- запускает проверку;
- наблюдает поэтапный прогресс;
- получает итог и детализацию нарушений;
- экспортирует отчёт.
**Rationale**
Для изолированных контуров и release-операций TUI обеспечивает воспроизводимый сценарий без зависимости от веб-интерфейса и внешней инфраструктуры.
**Alternatives considered**
- **Только non-interactive CLI**: отклонено для primary UX из-за более слабой наблюдаемости этапов и восстановительных действий.
- **Веб-панель**: отклонено как нецелевой интерфейс для данной фичи и избыточно для операционного сценария.
---
## Decision 5: Формат compliance-отчёта должен быть одновременно машинным и операторским
**Decision**
Каждый прогон проверки формирует единый отчёт с двумя представлениями:
1. **Structured section** — формализованные поля для автоматической валидации и аудита;
2. **Operator section** — человекочитаемая сводка нарушений и шагов восстановления.
Минимальные поля:
- report_id;
- candidate_id;
- started_at / finished_at;
- final_status;
- checks summary (data purity / internal sources / no external endpoints / manifest consistency);
- violations[] (category, location, severity, remediation);
- execution metadata (кто запустил, профиль, версия политики).
**Rationale**
Без структурированного представления отчёт трудно автоматизировать; без операторской сводки — трудно использовать в day-to-day эксплуатации.
**Alternatives considered**
- **Только текстовый лог**: отклонено, слабая пригодность для автоматического контроля.
- **Только machine format**: отклонено, ухудшает скорость ручного triage в релизном окне.
---
## Decision 6: Интеграция в release workflow — ручной запуск + обязательный CI gate
**Decision**
Использовать двухконтурную интеграцию:
1. **Pre-release operator run (TUI)** — подготовка и предварительная валидация релиз-кандидата;
2. **CI gate** — обязательное повторное подтверждение compliance перед финальным выпуском.
Оба прогона должны опираться на одну и ту же policy-модель.
**Rationale**
Это сочетает управляемость оператора и enforce-гарантию pipeline, снижая риск “локально прошло, в релиз не попало”.
**Alternatives considered**
- **Только операторский запуск**: отклонено (нет централизованной enforce-гарантии).
- **Только CI без операторского шага**: отклонено (хуже диагностика и устранение до релизного окна).
---
## Decision 7: Вся конфигурация валидации определяется через `.clean-release.yaml` в корне репозитория
**Decision**
Ввести единый конфигурационный файл `.clean-release.yaml` в корне репозитория, определяющий:
- `profile` и `scan_mode` (repo | build | docker);
- `prohibited_categories` и `prohibited_paths` — классификация запрещённых артефактов;
- `allowed_sources` — список допустимых внутренних endpoint'ов (glob-паттерны);
- `ignore_paths` — исключения из сканирования;
- `database_cleanup` (tables + preserve) — правила очистки БД от тестовых данных.
**Rationale**
Централизация конфигурации в одном файле обеспечивает прозрачность и версионируемость правил. Владелец проекта явно контролирует политику clean-поставки через декларативный конфиг, что снижает операционные ошибки.
**Alternatives considered**
- Хранение правил в БД: отклонено — усложняет версионирование и аудит policy drift.
- Отдельные файлы для каждой секции: отклонено — фрагментация ухудшает обзорность и повышает вероятность рассинхронизации.
- Hardcode в коде: отклонено — нарушает принцип конфигурируемости и делает проект-специфичные правила невозможными.
---
## Decision 8: Очистка БД от тестовых пользователей и демо-данных — обязательная стадия
**Decision**
Добавить стадию `database_cleanup` в compliance pipeline. Правила очистки задаются в секции `database_cleanup` файла `.clean-release.yaml`:
- `tables` — список таблиц с SQL-условиями для удаления тестовых записей;
- `preserve` — whitelist записей, которые MUST быть сохранены (напр. системный admin).
**Rationale**
Одной файловой очистки недостаточно: тестовые пользователи (`test_user`, `sample_analyst`) и демо-дашборды в БД являются таким же нарушением enterprise clean-профиля, как наличие тестовых файлов в дистрибутиве.
**Alternatives considered**
- Только предупреждение без очистки: отклонено — не обеспечивает SC-001 (100% отсутствие тестовых данных).
- Автоматическая очистка по паттернам имён: отклонено — высокий риск ложных удалений без явного whitelist.
---
## Open Clarifications Status
По итогам Phase 0 + speckit.clarify (2026-03-04) все `NEEDS CLARIFICATION` сняты:
- Режимы ввода: 3 режима (папка, репозиторий, Docker-образ) — FR-015;
- Классификация артефактов: `.clean-release.yaml` — FR-016;
- Определение внутренних источников: `allowed_sources` в конфиге — FR-017;
- Область сканирования NO_EXTERNAL_ENDPOINTS: все текстовые файлы — FR-018;
- Очистка БД: секция `database_cleanup` — FR-019;
- Структура конфига: полная схема зафиксирована — FR-020.