Итог hourly-попытки выводится из durable-результатов шагов (ложный succeeded невозможен), ожидание шага ограничено, брошенные попытки закрываются диагностируемо и не блокируют следующий обход.
settleHourly/closeHourly: итог из durable-строк шагов в одной транзакции; INTERRUPTED капает итог до partial; dispatch-проблемы — дополнительные problem-записи
id шагов персистятся в progress (children+attempts) в момент dispatch, до ожидания
per-step deadline WORK_WAIT_BOUND_MS (15 мин) в settledWorks; истёкший шаг — проблемный с DEADLINE; RPC не отменяется
Тесты: добавлен test/tbank-hourly-lifecycle.e2e-spec.ts, 16 e2e-сценариев lifecycle hourly через SQLite (восстановление после ошибки persistence, дедлайн, restart, late result, fencing).
Замечания (не блокирующие):
INFO src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:25 — лимит ожидания шага жёстко задан как 15 минут без конфигурационного параметра; предсказуемо, но SLA меняется только правкой кода.
INFO test/tbank-hourly-lifecycle.e2e-spec.ts:262 — повторный отказ persistence во время recovery не покрыт тестом; гарантия best-effort остаётся неподтверждённой.
## Итог: Approve
**Тесты:** добавлен `test/tbank-hourly-lifecycle.e2e-spec.ts`, 16 e2e-сценариев lifecycle hourly через SQLite (восстановление после ошибки persistence, дедлайн, restart, late result, fencing).
**Замечания (не блокирующие):**
- INFO `src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:25` — лимит ожидания шага жёстко задан как 15 минут без конфигурационного параметра; предсказуемо, но SLA меняется только правкой кода.
- INFO `test/tbank-hourly-lifecycle.e2e-spec.ts:262` — повторный отказ persistence во время recovery не покрыт тестом; гарантия best-effort остаётся неподтверждённой.
Тесты: добавлен test/tbank-hourly-lifecycle.e2e-spec.ts, 16 e2e-сценариев lifecycle hourly через SQLite (восстановление после ошибки persistence, дедлайн, restart, late result, fencing).
Замечания (не блокирующие):
INFO src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:25 — лимит ожидания шага жёстко задан как 15 минут без конфигурационного параметра; предсказуемо, но SLA меняется только правкой кода.
INFO test/tbank-hourly-lifecycle.e2e-spec.ts:262 — повторный отказ persistence во время recovery не покрыт тестом; гарантия best-effort остаётся неподтверждённой.
## Итог: Approve
**Тесты:** добавлен `test/tbank-hourly-lifecycle.e2e-spec.ts`, 16 e2e-сценариев lifecycle hourly через SQLite (восстановление после ошибки persistence, дедлайн, restart, late result, fencing).
**Замечания (не блокирующие):**
- INFO `src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:25` — лимит ожидания шага жёстко задан как 15 минут без конфигурационного параметра; предсказуемо, но SLA меняется только правкой кода.
- INFO `test/tbank-hourly-lifecycle.e2e-spec.ts:262` — повторный отказ persistence во время recovery не покрыт тестом; гарантия best-effort остаётся неподтверждённой.
ksv741
merged commit b9b76bab91 into develop2026-10-12 21:59:27 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Итог hourly-попытки выводится из durable-результатов шагов (ложный
succeededневозможен), ожидание шага ограничено, брошенные попытки закрываются диагностируемо и не блокируют следующий обход.Linked Issue
Refs #56 (координатор; cross-repo: WealthLedger/specs, WealthLedger/docs — change
harden-hourly-sync-lifecycle).Changes
settleHourly/closeHourly: итог из durable-строк шагов в одной транзакции;INTERRUPTEDкапает итог доpartial; dispatch-проблемы — дополнительные problem-записиprogress(children+attempts) в момент dispatch, до ожиданияWORK_WAIT_BOUND_MS(15 мин) вsettledWorks; истёкший шаг — проблемный сDEADLINE; RPC не отменяетсяactive-реестр обходов +recoverAbandonedперед reservation; restart-веткаreserveHourlyзакрывает чужую running-попытку derived settle'емtest/tbank-hourly-lifecycle.e2e-spec.ts(16 tests: first/not-due/running/restart/partial, deadline, recovery, late publish, controlled shutdown)Verification
npm run verify— exit 0 (lint, typecheck, unit 265, build);node test/sqlite.cjs --all— exit 0 (все e2e-наборы сохранены);node test/sqlite.cjs tbank-hourly-lifecycle.e2e-spec.ts— 16/16;npm run test:openapi-contract— 3/3, shapemeta/словарь состояний не изменились. Ограничение: graceful drain не добавлялся (Non-Goal), управляемые часы — jest fake timers.Breaking Changes (если есть)
Нет: HTTP contract не менялся,
cancelledостаётся в enum как толерантное чтение.Итог: Approve
Тесты: добавлен
test/tbank-hourly-lifecycle.e2e-spec.ts, 16 e2e-сценариев lifecycle hourly через SQLite (восстановление после ошибки persistence, дедлайн, restart, late result, fencing).Замечания (не блокирующие):
src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:25— лимит ожидания шага жёстко задан как 15 минут без конфигурационного параметра; предсказуемо, но SLA меняется только правкой кода.test/tbank-hourly-lifecycle.e2e-spec.ts:262— повторный отказ persistence во время recovery не покрыт тестом; гарантия best-effort остаётся неподтверждённой.Итог: Approve
Тесты: добавлен
test/tbank-hourly-lifecycle.e2e-spec.ts, 16 e2e-сценариев lifecycle hourly через SQLite (восстановление после ошибки persistence, дедлайн, restart, late result, fencing).Замечания (не блокирующие):
src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:25— лимит ожидания шага жёстко задан как 15 минут без конфигурационного параметра; предсказуемо, но SLA меняется только правкой кода.test/tbank-hourly-lifecycle.e2e-spec.ts:262— повторный отказ persistence во время recovery не покрыт тестом; гарантия best-effort остаётся неподтверждённой.