spec: address hourly-sync review findings (WealthLedger/backend#56)
This commit is contained in:
@@ -91,7 +91,14 @@ QA Analysis.
|
|||||||
|
|
||||||
3. **Ограниченное ожидание на каждый шаг.** `settledWorks` получает per-id
|
3. **Ограниченное ожидание на каждый шаг.** `settledWorks` получает per-id
|
||||||
deadline: константа `WORK_WAIT_BOUND_MS = 15 * 60 * 1000`; истёкший id
|
deadline: константа `WORK_WAIT_BOUND_MS = 15 * 60 * 1000`; истёкший id
|
||||||
возвращается как проблемный шаг с причиной `DEADLINE`. Управляемые часы в
|
возвращается как проблемный шаг с причиной `DEADLINE`. Тем же bound покрыты
|
||||||
|
и ожидания walk до появления durable-строк шагов (review-замечание,
|
||||||
|
follow-up WealthLedger/backend#78): `membership.request`/`member.done`,
|
||||||
|
`access.local` и dispatch `portfolio`/`operations`/`events.refresh` гоняются
|
||||||
|
с `WORK_WAIT_BOUND_MS` через race; истечение трактуется как проблемная
|
||||||
|
секция (как failed dispatch), для `access.local` — как закрытие
|
||||||
|
`INTERRUPTED`. Вызов не отменяется; поздняя durable-строка fenced по
|
||||||
|
`attemptId`, как любая поздняя публикация. Управляемые часы в
|
||||||
тестах — jest fake timers, инъекция clock в production-код не вводится.
|
тестах — jest fake timers, инъекция clock в production-код не вводится.
|
||||||
RPC не отменяется; поздний результат шага сохраняется его собственной
|
RPC не отменяется; поздний результат шага сохраняется его собственной
|
||||||
строкой — учтён ли он в итоге, решает fence и момент фиксации.
|
строкой — учтён ли он в итоге, решает fence и момент фиксации.
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ Durable docs update нужен ограниченно: наблюдаемая с
|
|||||||
| update | `docs/architecture/cross-cutting/data-freshness.md` | cross-cutting | Рядом со словарём `lastAttempt` (`none`, `running`, `succeeded`, `partial`, `failed`): итог попытки выводится из фактических результатов её шагов; попытка, не завершившая обязательный шаг, не обозначается полным успехом; ожидание шага ограничено, зависший шаг учитывается как проблемный; попытка, потерявшая выполнение (сбой сохранения, остановка процесса), закрывается частичным успехом либо неуспехом и не блокирует следующий обход дольше обычного срока | System Analysis — Data and State Semantics, Error and Recovery Semantics; Design 1–5 | Страница не противоречит canonical spec `hourly-investment-sync` и фактическому поведению `meta` |
|
| update | `docs/architecture/cross-cutting/data-freshness.md` | cross-cutting | Рядом со словарём `lastAttempt` (`none`, `running`, `succeeded`, `partial`, `failed`): итог попытки выводится из фактических результатов её шагов; попытка, не завершившая обязательный шаг, не обозначается полным успехом; ожидание шага ограничено, зависший шаг учитывается как проблемный; попытка, потерявшая выполнение (сбой сохранения, остановка процесса), закрывается частичным успехом либо неуспехом и не блокирует следующий обход дольше обычного срока | System Analysis — Data and State Semantics, Error and Recovery Semantics; Design 1–5 | Страница не противоречит canonical spec `hourly-investment-sync` и фактическому поведению `meta` |
|
||||||
| update | `docs/integrations/tbank.md` | integration | В разделе «Состояние и ошибки»: диагностические причины жизненного цикла попытки (`INTERRUPTED` — прервана до нормального завершения, `DEADLINE` — истечение ожидания шага) — внутренняя диагностика, не ошибки T-Bank; в hourly-read наружу не попадают, начатые обращения к T-Bank не отменяются | System Analysis — Observability Semantics; Design 3, 6 | Раздел различает ошибки подключения/external-коды и внутренние причины жизненного цикла |
|
| update | `docs/integrations/tbank.md` | integration | В разделе «Состояние и ошибки»: диагностические причины жизненного цикла попытки (`INTERRUPTED` — прервана до нормального завершения, `DEADLINE` — истечение ожидания шага) — внутренняя диагностика, не ошибки T-Bank; в hourly-read наружу не попадают, начатые обращения к T-Bank не отменяются | System Analysis — Observability Semantics; Design 3, 6 | Раздел различает ошибки подключения/external-коды и внутренние причины жизненного цикла |
|
||||||
|
|
||||||
|
PR реализации: WealthLedger/docs#37 (open) — обе страницы обновлены, diff
|
||||||
|
соответствует таблице выше (задачи 6.1 и 6.2 верифицируемы по нему).
|
||||||
|
|
||||||
## Diagram Promotion
|
## Diagram Promotion
|
||||||
|
|
||||||
Не переносить. Sequence-диаграммы (`hourly-attempt-terminal-barrier.mmd`,
|
Не переносить. Sequence-диаграммы (`hourly-attempt-terminal-barrier.mmd`,
|
||||||
|
|||||||
@@ -42,6 +42,17 @@
|
|||||||
- **Verification:** SQLite-тест перезапуска процесса: брошенная попытка закрыта `partial`/`failed` с сохранёнными результатами шагов, новый обход не ранее следующего часового срока, перекрытия нет
|
- **Verification:** SQLite-тест перезапуска процесса: брошенная попытка закрыта `partial`/`failed` с сохранёнными результатами шагов, новый обход не ранее следующего часового срока, перекрытия нет
|
||||||
- **Depends on:** 1.1, 1.2
|
- **Depends on:** 1.1, 1.2
|
||||||
|
|
||||||
|
- [x] 2.4 [backend] ожидания walk до durable-строк шагов
|
||||||
|
(`membership.request`/`member.done`, `access.local`, dispatch
|
||||||
|
`portfolio`/`operations`/`events.refresh`, post-wait `events.get`)
|
||||||
|
ограничены тем же `WORK_WAIT_BOUND_MS` через race; истечение — проблемная
|
||||||
|
секция либо `INTERRUPTED`-закрытие без отмены вызова
|
||||||
|
(WealthLedger/backend#78)
|
||||||
|
- **Covers:** `hourly-investment-sync` — «Каждая попытка обхода достигает итога в ограниченное время»
|
||||||
|
- **Source:** Design — Decision 3; review specs#33 (CRITICAL)
|
||||||
|
- **Verification:** SQLite-тесты с никогда не завершающимися dispatch/membership/`done`/`get`: попытка терминальна в ограниченное время, поздние вызовы не отменяются
|
||||||
|
- **Depends on:** 2.1
|
||||||
|
|
||||||
## 3. Финализаторы шагов
|
## 3. Финализаторы шагов
|
||||||
|
|
||||||
- [x] 3.1 [backend] внешний catch финализаторов шагов (enrichment, operations
|
- [x] 3.1 [backend] внешний catch финализаторов шагов (enrichment, operations
|
||||||
|
|||||||
Reference in New Issue
Block a user