spec: define containerized application delivery #10
Specs security / security (pull_request) Successful in 6s
Specs verify / verify (pull_request) Successful in 8s
Conventional commits / commits (pull_request) Successful in 11s
Specs security / security (push) Successful in 6s
Specs verify / verify (push) Successful in 9s

This commit was merged in pull request #11.
This commit is contained in:
2026-09-16 09:41:59 +03:00
parent e4f10dedef
commit b34f23a230
5 changed files with 619 additions and 0 deletions
@@ -0,0 +1,105 @@
## Purpose
Определяет поддерживаемые эксплуатационные свойства локального и серверного
запуска WealthLedger, включая поставку компонентов и сохранность состояния.
## ADDED Requirements
### Requirement: Локальная среда воспроизводит границы поставленного приложения
Поддерживаемый локальный запуск SHALL предоставлять один browser origin для
интерфейса и API WealthLedger. Разработка интерфейса MUST сохранять быстрый
цикл обратной связи при изменении исходного кода, а разработка API MUST
перезапускать затронутый runtime без ручной пересборки всей среды. Локальные
данные MUST быть изолированы от server data.
#### Scenario: Разработчик открывает локальное приложение
- **WHEN** поддерживаемая локальная среда успешно запущена
- **THEN** браузер получает интерфейс и обращается к API через тот же origin,
не зная внутреннего адреса API
#### Scenario: Разработчик меняет интерфейс
- **WHEN** разработчик изменяет исходный код интерфейса в запущенной локальной
среде
- **THEN** браузер получает изменение без ручной полной пересборки среды
### Requirement: Серверное приложение имеет одну внешнюю точку входа
Поддерживаемый server deployment SHALL принимать HTTP-трафик WealthLedger на
одной внешней точке входа. Через неё MUST быть доступны интерфейс и API с
сохранением их действующих путей и session semantics. API и хранилище данных
MUST NOT требовать отдельного внешнего сетевого доступа.
#### Scenario: Внешний reverse proxy направляет запрос приложению
- **WHEN** server reverse proxy передаёт запрос на единственную точку входа
WealthLedger
- **THEN** пользователь получает интерфейс, а запросы к действующему API
обрабатываются приложением без отдельного маршрута reverse proxy к API
### Requirement: Поставка допускает независимое обновление компонентов
Система SHALL предоставлять versioned delivery artifacts для интерфейса и API
как независимых компонентов. Оператор MUST иметь возможность установить
выбранную версию только одного компонента, сохранив другой компонент и
постоянное пользовательское состояние работающими. Поддерживаемая поставка
MUST явно фиксировать выбранные версии обоих компонентов.
#### Scenario: Обновляется только интерфейс
- **WHEN** оператор устанавливает новую версию интерфейса при неизменной
совместимой версии API
- **THEN** API и его постоянное состояние не пересоздаются, а приложение
начинает отдавать новую версию интерфейса
#### Scenario: Обновляется только API
- **WHEN** оператор устанавливает новую версию API при неизменной совместимой
версии интерфейса
- **THEN** интерфейс не пересоздаётся, а приложение начинает обрабатывать
запросы новой версией API после её готовности
### Requirement: Постоянное состояние и секреты переживают штатный lifecycle
Пользовательские данные, session state и ключи, необходимые для чтения
зашифрованных подключений, MUST сохраняться при штатных перезапусках и
обновлениях компонентов. Секреты MUST задаваться отдельно от versioned delivery
artifacts и MUST NOT попадать в интерфейс, журналы или публичный HTTP-ответ.
#### Scenario: Приложение штатно перезапускается
- **WHEN** оператор штатно перезапускает приложение без восстановления данных
- **THEN** после запуска доступны прежние пользовательские данные и действующие
session semantics, а сохранённые зашифрованные подключения остаются читаемыми
тем же ключом
### Requirement: Обновление API сохраняет целостность данных
Перед тем как новая версия API начинает принимать запросы, необходимые
изменения схемы постоянных данных MUST быть применены успешно. При ошибке
изменения данных новая версия API MUST NOT объявляться готовой. Краткий простой
обновляемого компонента допустим; непрерывность обслуживания и несколько
одновременных экземпляров API не являются обещанием этой capability.
#### Scenario: Подготовка данных новой версии не прошла
- **WHEN** обязательное изменение постоянных данных завершается ошибкой
- **THEN** новая версия API не начинает обслуживать запросы, а оператор получает
диагностируемый неуспешный результат обновления
### Requirement: Восстановление не выдаёт откат приложения за откат данных
Поддерживаемая процедура обновления и восстановления MUST различать возврат
версии компонентов и восстановление пользовательских данных. Она MUST требовать
согласованную резервную копию перед изменением постоянных данных и MUST NOT
заменять более новые пользовательские данные прежней копией как побочный эффект
возврата версии приложения.
#### Scenario: Оператор возвращает предыдущую версию API
- **WHEN** оператор возвращает прежнюю версию API после неуспешного обновления
- **THEN** процедура явно проверяет совместимость этой версии с текущими
данными и не выполняет восстановление старой копии данных без отдельного
решения оператора