docs: make project documentation self-contained

This commit is contained in:
2026-09-12 13:09:37 +03:00
parent aa9afc15e4
commit 3a99af1a6e
36 changed files with 1006 additions and 703 deletions
+56 -77
View File
@@ -1,103 +1,82 @@
# Engineering governance
# Принципы изменения и проверки системы
Это общий owner решений о scope, dependencies, testing и проверке результата.
Работа начинается с задачи пользователя и выполняется напрямую. OpenSpec/SDD
не обязателен; прежняя [процедура](openspec-authority-and-lifecycle.md) доступна
только по явному запросу. Исторические artifacts не переписываются.
Ожидаемый результат определяется задачей пользователя. Сопровождение сохраняет
ответственность подсистем, безопасность, точность данных и проверяемость результата.
OpenSpec остаётся [необязательным средством согласования](openspec-authority-and-lifecycle.md);
исторические свидетельства не становятся обязательной процедурой новой задачи.
## Выбор реализации
Читай этот раздел при новой abstraction/dependency, refactor, multi-module
изменении или неоднозначном ownership.
Связное поведение принадлежит ответственной подсистеме. Существующая возможность
используется повторно, если сохраняет нужный смысл и инварианты. Новая граница
оправдана самостоятельной ответственностью, общей потребностью нескольких
потребителей либо необходимостью отделить доступ и целостность данных.
1. Требуемое поведение уже существует — используй его.
2. У поведения есть подходящий owner/helper — расширь его, сохранив связность.
3. Задачу решает платформа, стандартная библиотека или принятая dependency — используй её.
4. Иначе добавь небольшую реализацию там, где принадлежит инвариант.
5. Если текущая структура мешает правильному ownership, сделай необходимый связный refactor с проверкой сохранения поведения.
Оптимизируй ясность всей системы. Число файлов/строк само по себе не определяет
качество: coherent refactor лучше дублированного guard в нескольких callers.
**Безопасный путь:** при неопределённом будущем reuse оставь код у ближайшего
подходящего владельца. Выделение оправдано текущей общей ответственностью,
несколькими реальными consumers или необходимой trust/transaction boundary.
Один consumer не запрещает модуль с самостоятельным инвариантом, но не оправдывает
interface/factory/registry только для воображаемой расширяемости.
Примеры: фильтр одного экрана остаётся page-local; чистое денежное преобразование
использует существующий decimal helper; запрос Prisma не требует generic repository.
Security validation, доступность, error handling и защита данных сохраняются
даже в маленькой реализации.
Простота оценивается по ясности всей системы и стоимости сопровождения,
а не по размеру изменения. Предполагаемая будущая возможность сама по себе
не оправдывает новую подсистему. Упрощение сохраняет валидацию, доступность,
обработку ошибок и защиту от потери данных.
## Dependencies
Перед новой dependency проверь installed stack и существующий helper. Если
подходящего решения нет, оцени поддерживаемую библиотеку, совместимость,
maintenance/security cost и точную недостающую возможность. Собственный код
выбирай по совокупной стоимости, а не ради отсутствия dependency любой ценой.
Версии и scripts принадлежат package.json/lockfile. Frontend сохраняет exact
versions; backend использует свою текущую policy. Transitive package не считается
прямо принятой dependency. Не меняй весь lockfile или инструментарий ради
устаревшей рекомендации в Markdown. Новые сервисы, CI и browser mocking требуют
задачи, в которой они действительно нужны.
При выборе внешней зависимости учитываются текущая потребность, совместимость,
поддержка, безопасность и стоимость сопровождения. Использование принятой
платформы может быть проще собственной реализации; зависимость ради одной
воображаемой будущей возможности не является самостоятельной потребностью.
Новый сервис или общая инфраструктура должны решать актуальную задачу.
## Risk-based testing
Автоматический тест обязателен для изменённого security/privacy поведения,
денежных вычислений, data integrity/migration, concurrency, публичного контракта,
критического journey и подтверждённой регрессии.
Изменения безопасности и приватности, денежных расчётов, целостности данных,
миграций, конкурентного доступа, публичного контракта, критического сценария
и подтверждённой регрессии требуют автоматической проверки соответствующего
риска на наблюдаемой потребителем границе.
Выбирай самую дешёвую надёжную границу, наблюдаемую потребителем. Тест нужен
для собственного branching, преобразования или инварианта; не для каждого
DTO, декларативной конфигурации, thin adapter или поведения библиотеки.
Меняющийся тест тоже активирует testing convention, даже без production diff.
Frontend coverage — anti-regression constraint; backend общего threshold не имеет.
Не пиши тесты только ради процента или повторения Markdown.
Статические проверки не доказывают финансовую или функциональную корректность.
Покрытие frontend служит ограничителем регрессий; для backend общего числового
порога нет. Проверки поведения библиотеки или проценты сами по себе не заменяют
проверку собственного инварианта системы.
## Проверка результата
В итерации используй targeted check из применимого convention. Перед завершением
запусти `npm run verify` каждого изменённого code/docs repo под его `.nvmrc`
после lockfile install. Для HTTP contract — дополнительно
[contract checks](runtime-openapi-verification.md). Общего CI сейчас нет.
Результат оценивается по исходной задаче: сохранены ли смысл данных и контракты,
правильно ли разграничен доступ, учтены ли ошибки и доступность интерфейса.
Проверки приложений и документации дополняются
[согласованием HTTP-контракта](runtime-openapi-verification.md), если он меняется.
Общего CI сейчас нет.
Проверь actual staged/unstaged/new scope и результат против задачи: ownership,
сохранение данных/контрактов, ошибки, доступность, отсутствие лишних abstractions.
Неизменившийся успешный gate можно использовать повторно, если известны команда,
его полный relevant input scope и неизменные prerequisites; при сомнении выполни
его снова. Auto-fix не заменяет non-mutating gate.
Успешная проверка применима к тому состоянию системы и тем предпосылкам,
на которых выполнена. При их изменении старое свидетельство не доказывает
новый результат. Автоматическое исправление материалов и проверка без их
изменения — разные действия.
В ответе достаточно: что поставлено, как проверено, какие ограничения остались.
Не создавай role records, fingerprints всех repositories, Completion Evidence
или delivery commits только ради процесса. Существующие рабочие изменения
других задач сохраняются. Нужный review не заменяется количеством checkboxes.
[Влияние на документацию](documentation.md#обновление-вместе-с-кодом) входит
в оценку результата: описанные понятия, сценарии, решения и ограничения
обновляются вместе с системой. Отсутствие влияния может быть обоснованным
результатом. Отчёт о поставке различает выполненное, проверенное и остающиеся
ограничения; количество формальных отметок не заменяет смысловую проверку.
## Guardrails и local gates
- **Автоматический invariant:** существующий deterministic checker блокирует нарушение в фактическом scope с документированными исключениями.
- **Обязательное semantic правило/процедура:** исполнитель и reviewer проверяют решение; отсутствие checker не переводит i18n, validation или authorization в пожелание.
- **Guidance:** необязательное предпочтение, например эстетический выбор между эквивалентными вариантами.
Не обещай enforcement, отсутствующий в config/tests. Новая автоматическая проверка
оправдана реальным риском или повторяющимся дефектом, а не возможностью написать
ещё один checker. Механические правила принадлежат tools; выбор правильного owner
и полезного теста остаётся semantic judgement.
Автоматические проверки гарантируют только свойства, охваченные их областью.
Смысловые требования — например, правильный владелец данных, авторизация,
локализация и полезность выбранных проверок — требуют отдельной оценки.
Предпочтение между равноценными вариантами отличается от обязательного
инварианта. Новая автоматизация оправдана реальным риском или повторяющимся
дефектом; её наличие само по себе не является целью.
## UI-решения
Для изменяемого UI определи ожидаемые экраны, states, interactions и responsive
поведение из задачи. Используй существующий [каталог](ui-catalog.md) и
[дизайн-систему](design-system.md). Сложный или неоднозначный вариант покажи
пользователю в конкретной форме до дорогой реализации; простой согласованный
вариант делай сразу. Визуальные материалы нужны по задаче, не как обязательный
SDD-пакет. Сборка Storybook не доказывает доступность или визуальное соответствие.
Ожидаемые экраны, состояния, взаимодействия и поведение на разных размерах
экрана определяются пользовательским сценарием. [Каталог](ui-catalog.md)
и [дизайн-система](design-system.md) показывают существующую визуальную основу.
Неоднозначный вариант можно оценить по конкретному примеру до реализации.
Успешная сборка каталога не доказывает доступность и визуальное соответствие.
## Изменение опасного контракта
При public/security/data/billing или труднообратимом выборе заранее уточни
существенную неопределённость. Для миграции определи trigger отката, действия,
сохранность уже созданных данных и проверку восстановления. Сначала подготовь
конкретное reviewable решение; обычные обратимые edits не требуют ритуального approval.
Источники и конфликтующие версии разрешай через [context discipline](agent-token-efficiency.md).
Для публичного контракта, безопасности, данных, платежей и труднообратимого
изменения существенная неопределённость разрешается до применения решения.
Для миграции важны условия отката, сохранность уже созданных данных и проверка
восстановления. Порядок разрешения конфликтов знаний описан в
[контексте системы](agent-token-efficiency.md#источники-и-конфликты).