fix: restore terminal hourly lifecycle after persistence failure (#56) #77

Merged
ksv741 merged 1 commits from fix/56-harden-hourly-sync-lifecycle into develop 2026-10-12 21:59:27 +03:00
Owner

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-записи
  • id шагов персистятся в progress (children+attempts) в момент dispatch, до ожидания
  • per-step deadline WORK_WAIT_BOUND_MS (15 мин) в settledWorks; истёкший шаг — проблемный с DEADLINE; RPC не отменяется
  • active-реестр обходов + recoverAbandoned перед reservation; restart-ветка reserveHourly закрывает чужую running-попытку derived settle'ем
  • durable finish в внешнем catch финализаторов enrichment/operations
  • новый изолированный SQLite-набор 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, shape meta/словарь состояний не изменились. Ограничение: graceful drain не добавлялся (Non-Goal), управляемые часы — jest fake timers.

Breaking Changes (если есть)

Нет: HTTP contract не менялся, cancelled остаётся в enum как толерантное чтение.

## 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-записи - id шагов персистятся в `progress` (`children`+`attempts`) в момент dispatch, до ожидания - per-step deadline `WORK_WAIT_BOUND_MS` (15 мин) в `settledWorks`; истёкший шаг — проблемный с `DEADLINE`; RPC не отменяется - `active`-реестр обходов + `recoverAbandoned` перед reservation; restart-ветка `reserveHourly` закрывает чужую running-попытку derived settle'ем - durable finish в внешнем catch финализаторов enrichment/operations - новый изолированный SQLite-набор `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, shape `meta`/словарь состояний не изменились. Ограничение: graceful drain не добавлялся (Non-Goal), управляемые часы — jest fake timers. ## Breaking Changes (если есть) Нет: HTTP contract не менялся, `cancelled` остаётся в enum как толерантное чтение.
codex-bot added the Kind/Bug
Priority
High
2
labels 2026-10-12 20:46:21 +03:00
codex-bot added 1 commit 2026-10-12 20:46:21 +03:00
fix: restore terminal hourly lifecycle after persistence failure (#56)
Backend verify / commits (pull_request) Successful in 33s
Backend verify / security (pull_request) Successful in 12s
Backend verify / verify (pull_request) Successful in 5m48s
fa57a201fd
codex-bot added this to the Technical Audit Remediation — 2026-10-11 milestone 2026-10-12 20:56:10 +03:00
codex-bot requested review from hermes-agent 2026-10-12 20:56:22 +03:00
codex-bot added this to the WealthLedger — Delivery Board project 2026-10-12 21:03:34 +03:00
ksv741 moved this to На проверке in WealthLedger — Delivery Board on 2026-10-12 21:40:52 +03:00
hermes-agent left a comment
Member

Итог: 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 остаётся неподтверждённой.
## Итог: 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 остаётся неподтверждённой.
hermes-agent left a comment
Member

Итог: 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 остаётся неподтверждённой.
## Итог: 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 develop 2026-10-12 21:59:27 +03:00
ksv741 moved this to Готово in WealthLedger — Delivery Board on 2026-10-12 22:30:32 +03:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#77