Compare commits
4
Commits
29c4ee443a
...
v0.1.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aae23d86f0 | ||
|
|
ebc9ca872c | ||
|
|
fe295aa73a | ||
|
|
e8e68a7ed6 |
@@ -27,4 +27,8 @@ jobs:
|
|||||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
run: |
|
run: |
|
||||||
printf '%s\n' "$PR_TITLE" | npm run commitlint -- --strict
|
printf '%s\n' "$PR_TITLE" | npm run commitlint -- --strict
|
||||||
npm run commitlint -- --strict --from "$BASE_SHA" --to "$HEAD_SHA"
|
if [[ "$PR_TITLE" =~ ^chore\(release\):\ [0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
npm run commitlint -- --strict --from "$HEAD_SHA^" --to "$HEAD_SHA"
|
||||||
|
else
|
||||||
|
npm run commitlint -- --strict --from "$BASE_SHA" --to "$HEAD_SHA"
|
||||||
|
fi
|
||||||
|
|||||||
@@ -1,5 +1,34 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.1.4](https://git.personal.ksv741.ru/WealthLedger/specs/compare/v0.1.3...v0.1.4) (2026-10-12)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* align specs commitlint workflow (WealthLedger/main[#27](https://git.personal.ksv741.ru/WealthLedger/specs/issues/27)) ([a29cbf6](https://git.personal.ksv741.ru/WealthLedger/specs/commit/a29cbf6aae7ebe48a51ae1979ff3f30b9fa8e305))
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
* clarify specs Node bootstrap ([18518e0](https://git.personal.ksv741.ru/WealthLedger/specs/commit/18518e0d2daecb843fea1b4d55d1c7d2cabf24f6))
|
||||||
|
* pin specs workflow reference (WealthLedger/main[#27](https://git.personal.ksv741.ru/WealthLedger/specs/issues/27)) ([7f12327](https://git.personal.ksv741.ru/WealthLedger/specs/commit/7f12327c37055ba903f962b1220138da9c7edd06))
|
||||||
|
|
||||||
|
### Specifications
|
||||||
|
|
||||||
|
* add harden-hourly-sync-lifecycle change (WealthLedger/backend[#56](https://git.personal.ksv741.ru/WealthLedger/specs/issues/56)) ([14174a7](https://git.personal.ksv741.ru/WealthLedger/specs/commit/14174a7bb335152c8cc76d9a6bbaefaaaa58b22f))
|
||||||
|
* add stock screener ([951f1a9](https://git.personal.ksv741.ru/WealthLedger/specs/commit/951f1a9a20a09695e2ff85d1ee96632e98a202d8))
|
||||||
|
* address hourly-sync review findings (WealthLedger/backend[#56](https://git.personal.ksv741.ru/WealthLedger/specs/issues/56)) ([77b2111](https://git.personal.ksv741.ru/WealthLedger/specs/commit/77b211186c297df4187e044804786ffc9096ce19))
|
||||||
|
* archive harden-hourly-sync-lifecycle change (WealthLedger/backend[#56](https://git.personal.ksv741.ru/WealthLedger/specs/issues/56)) ([fe295aa](https://git.personal.ksv741.ru/WealthLedger/specs/commit/fe295aa73ab5bc9d826067892930b7161fb4f1b9))
|
||||||
|
* define hourly portfolio sync history ([b24a686](https://git.personal.ksv741.ru/WealthLedger/specs/commit/b24a6861887e831ef2d73a97f36cc213be2be0b8))
|
||||||
|
* finalize wealth-ledger SDD migration ([329d66e](https://git.personal.ksv741.ru/WealthLedger/specs/commit/329d66e767f7e89a40b96bb8e5b499f39f67feb6))
|
||||||
|
|
||||||
|
### CI
|
||||||
|
|
||||||
|
* avoid duplicate PR checks ([c132770](https://git.personal.ksv741.ru/WealthLedger/specs/commit/c132770fbb4a4e48cae0a4ceca7407bb6a768ded))
|
||||||
|
* skip checks on PR metadata edits ([fcdc805](https://git.personal.ksv741.ru/WealthLedger/specs/commit/fcdc805f6c1b3be6a20a7e858e3e80cbd83a9121))
|
||||||
|
|
||||||
|
### Maintenance
|
||||||
|
|
||||||
|
* align specs engineering workflow (WealthLedger/main[#27](https://git.personal.ksv741.ru/WealthLedger/specs/issues/27)) ([a441b08](https://git.personal.ksv741.ru/WealthLedger/specs/commit/a441b083785d8f50c42dea543e684b23f27732a2))
|
||||||
|
|
||||||
## [0.1.3](https://git.personal.ksv741.ru/WealthLedger/specs/compare/v0.1.2...v0.1.3) (2026-10-07)
|
## [0.1.3](https://git.personal.ksv741.ru/WealthLedger/specs/compare/v0.1.2...v0.1.3) (2026-10-07)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
- **THEN** система не запускает обход в 11:00 и может начать следующий не ранее 12:00
|
- **THEN** система не запускает обход в 11:00 и может начать следующий не ранее 12:00
|
||||||
|
|
||||||
### Requirement: Последний результат обхода доступен только для наблюдения
|
### Requirement: Последний результат обхода доступен только для наблюдения
|
||||||
Система SHALL предоставлять авторизованному User результат последнего обхода только в границе его текущего подключения: время начала, состояние выполнения, полного успеха, частичного успеха либо неуспеха и безопасный перечень проблемных счетов или разделов. Это состояние MUST быть доступно в `meta` каждого затронутого resource read вместе с freshness, полнотой и доступностью его `data`. Успех одного счёта или раздела MUST сохраняться независимо от ошибки другого; ошибка MUST NOT заменять его последнее успешное состояние или время. Отсутствие состоявшейся попытки MUST отличаться от успешной попытки. Наблюдение результата MUST NOT предоставлять способ начать личную синхронизацию.
|
Система SHALL предоставлять авторизованному User результат последнего обхода только в границе его текущего подключения: время начала, состояние выполнения, полного успеха, частичного успеха либо неуспеха и безопасный перечень проблемных счетов или разделов. Это состояние MUST быть доступно в `meta` каждого затронутого resource read вместе с freshness, полнотой и доступностью его `data`. Успех одного счёта или раздела MUST сохраняться независимо от ошибки другого; ошибка MUST NOT заменять его последнее успешное состояние или время. Итог попытки MUST определяться фактическим результатом каждого обязательного шага обхода: попытка, не завершившая обязательный шаг, MUST обозначаться частичным успехом либо неуспехом и MUST NOT обозначаться полным успехом. Отсутствие состоявшейся попытки MUST отличаться от успешной попытки. Наблюдение результата MUST NOT предоставлять способ начать личную синхронизацию.
|
||||||
|
|
||||||
#### Scenario: Частичный успех
|
#### Scenario: Частичный успех
|
||||||
- **WHEN** Portfolio одного доступного счёта обновился, а другого не обновился
|
- **WHEN** Portfolio одного доступного счёта обновился, а другого не обновился
|
||||||
@@ -38,3 +38,44 @@
|
|||||||
#### Scenario: Старая граница подключения
|
#### Scenario: Старая граница подключения
|
||||||
- **WHEN** User заменил либо удалил подключение и запрашивает результат прежнего обхода
|
- **WHEN** User заменил либо удалил подключение и запрашивает результат прежнего обхода
|
||||||
- **THEN** система не раскрывает результат прежней границы подключения
|
- **THEN** система не раскрывает результат прежней границы подключения
|
||||||
|
|
||||||
|
#### Scenario: Сбой после частичного обновления
|
||||||
|
- **WHEN** попытка прервана ошибкой либо сбоем сохранения после обновления Portfolio одного доступного счёта
|
||||||
|
- **THEN** результат попытки обозначает частичный успех с проблемными шагами, а не полный успех, а обновлённый Portfolio сохраняется
|
||||||
|
|
||||||
|
#### Scenario: Сбой до первого обновления
|
||||||
|
- **WHEN** попытка прервана до обновления любого обязательного шага
|
||||||
|
- **THEN** результат попытки обозначает неуспех, а не полный успех
|
||||||
|
|
||||||
|
### Requirement: Каждая попытка обхода достигает итога в ограниченное время
|
||||||
|
Каждая начатая попытка часового обхода MUST достигать итогового состояния в ограниченное время. Ожидание завершения каждого обязательного шага MUST быть ограничено; шаг, не завершившийся в это ограничение, MUST быть учтён как проблемный, а попытка MUST быть закрыта частичным успехом либо неуспехом после того, как каждый обязательный шаг достиг терминального результата либо был учтён как проблемный. Истечение ограничения MUST NOT отменять уже начатые шаги.
|
||||||
|
|
||||||
|
#### Scenario: Шаг не завершается
|
||||||
|
- **WHEN** обязательный шаг не покидает состояние выполнения дольше ограничения ожидания
|
||||||
|
- **THEN** шаг учитывается как проблемный, попытка закрывается частичным успехом либо неуспехом, а её состояние перестаёт быть выполняющимся
|
||||||
|
|
||||||
|
#### Scenario: Наблюдение не ждёт без ограничения
|
||||||
|
- **WHEN** попытка не может завершиться из-за незавершённых шагов
|
||||||
|
- **THEN** наблюдение результата получает итоговое состояние в ограниченное время и не ожидает завершения бесконечно
|
||||||
|
|
||||||
|
### Requirement: Восстановление после сбоя сохранения не блокирует последующие обходы
|
||||||
|
Если попытка осталась в состоянии выполнения после сбоя завершения шага, публикации результата либо закрытия попытки, система MUST привести её к диагностируемому итоговому состоянию: частичный успех либо неуспех с сохранёнными результатами шагов, а не полный успех. Последующий обход MUST становиться допустимым по обычному правилу срока, отсчитанному от начала этой попытки. Восстановление MUST NOT создавать перекрывающийся обход и MUST NOT повторять уже полученные результаты шагов.
|
||||||
|
|
||||||
|
#### Scenario: Потерянное закрытие попытки
|
||||||
|
- **WHEN** закрытие попытки не сохранилось, а процесс продолжает работать
|
||||||
|
- **THEN** система закрывает попытку итогом из фактических результатов шагов, наблюдение получает итоговое состояние, а следующая допустимая попытка может стартовать
|
||||||
|
|
||||||
|
#### Scenario: Перезапуск процесса
|
||||||
|
- **WHEN** процесс остановился после начала попытки и запускается снова
|
||||||
|
- **THEN** брошенная попытка обозначается частичным успехом либо неуспехом с сохранёнными результатами шагов, а новый обход начинается не ранее следующего часового срока от её начала
|
||||||
|
|
||||||
|
### Requirement: Устаревшая публикация не влияет на актуальную попытку
|
||||||
|
Результат шага попытки, у которой появился преемник, MUST отклоняться как устаревший: он MUST NOT обновлять данные и MUST NOT учитываться в итоге актуальной попытки. Шаг устаревшей попытки MUST наблюдаться как устаревший относительно актуального преемника. Результат шага текущей попытки, полученный до фиксации её итога, MUST сохраняться и учитываться в этом итоге независимо от того, наступил ли он до или после истечения ограничения ожидания.
|
||||||
|
|
||||||
|
#### Scenario: Поздняя публикация после появления преемника
|
||||||
|
- **WHEN** шаг старой попытки завершается после запуска следующей попытки
|
||||||
|
- **THEN** его результат отклоняется как устаревший, данные не обновляются, а итог актуальной попытки не меняется
|
||||||
|
|
||||||
|
#### Scenario: Поздняя публикация до фиксации итога
|
||||||
|
- **WHEN** шаг завершился после истечения ограничения ожидания, но итог его попытки ещё не зафиксирован
|
||||||
|
- **THEN** его результат сохраняется и учитывается при выводе итога этой попытки
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "wealth-ledger-specs",
|
"name": "wealth-ledger-specs",
|
||||||
"version": "0.1.3",
|
"version": "0.1.4",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "wealth-ledger-specs",
|
"name": "wealth-ledger-specs",
|
||||||
"version": "0.1.3",
|
"version": "0.1.4",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "21.2.2",
|
"@commitlint/cli": "21.2.2",
|
||||||
"@commitlint/config-conventional": "21.2.2",
|
"@commitlint/config-conventional": "21.2.2",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "wealth-ledger-specs",
|
"name": "wealth-ledger-specs",
|
||||||
"version": "0.1.3",
|
"version": "0.1.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "24.21.0"
|
"node": "24.21.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user