Follow-up к #77 по CRITICAL-замечанию ревью specs#33: deadline покрывал только waitWorks (durable-строки шагов), а ожидания membership.request/member.done, access.local, dispatch portfolio/operations/events.refresh и post-wait events.get могли зависнуть до barrier — попытка оставалась running бесконечно.
Changes
все await'ы walk до terminal barrier гоняются с WORK_WAIT_BOUND_MS (15 мин) через race (withBound); истечение трактуется как проблемная секция (как failed dispatch) либо как INTERRUPTED-закрытие для access.local
вызов не отменяется; поздняя durable-строка fenced по attemptId, как и любая поздняя публикация
4 новых lifecycle-теста: зависшие portfolio/membership dispatch, member.done, post-wait events.get — попытка терминальна в ограниченное время
Команда / результат / ограничения: node test/sqlite.cjs tbank-hourly-lifecycle.e2e-spec.ts — 20/20; node test/sqlite.cjs --all — exit 0; npm run verify (lint, typecheck, unit, build) — exit 0. Ограничение: локальные Prisma-вызовы (recordHourlyChild/works/settleHourly) bound'ом не покрыты — при зависшем SQLite процесс мёртв в любом случае.
Breaking Changes (если есть)
Нет: HTTP contract не менялся.
## Summary
Follow-up к #77 по CRITICAL-замечанию ревью specs#33: deadline покрывал только `waitWorks` (durable-строки шагов), а ожидания `membership.request`/`member.done`, `access.local`, dispatch `portfolio`/`operations`/`events.refresh` и post-wait `events.get` могли зависнуть до barrier — попытка оставалась `running` бесконечно.
## Changes
- все await'ы walk до terminal barrier гоняются с `WORK_WAIT_BOUND_MS` (15 мин) через race (`withBound`); истечение трактуется как проблемная секция (как failed dispatch) либо как `INTERRUPTED`-закрытие для `access.local`
- вызов не отменяется; поздняя durable-строка fenced по `attemptId`, как и любая поздняя публикация
- 4 новых lifecycle-теста: зависшие portfolio/membership dispatch, `member.done`, post-wait `events.get` — попытка терминальна в ограниченное время
## Linked Issue
Refs #56. Cross-repo: WealthLedger/specs#33 (review follow-up), WealthLedger/docs#37.
## Verification
- Команда / результат / ограничения: `node test/sqlite.cjs tbank-hourly-lifecycle.e2e-spec.ts` — 20/20; `node test/sqlite.cjs --all` — exit 0; `npm run verify` (lint, typecheck, unit, build) — exit 0. Ограничение: локальные Prisma-вызовы (`recordHourlyChild`/`works`/`settleHourly`) bound'ом не покрыты — при зависшем SQLite процесс мёртв в любом случае.
## Breaking Changes (если есть)
Нет: HTTP contract не менялся.
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
Follow-up к #77 по CRITICAL-замечанию ревью specs#33: deadline покрывал только
waitWorks(durable-строки шагов), а ожиданияmembership.request/member.done,access.local, dispatchportfolio/operations/events.refreshи post-waitevents.getмогли зависнуть до barrier — попытка оставаласьrunningбесконечно.Changes
WORK_WAIT_BOUND_MS(15 мин) через race (withBound); истечение трактуется как проблемная секция (как failed dispatch) либо какINTERRUPTED-закрытие дляaccess.localattemptId, как и любая поздняя публикацияmember.done, post-waitevents.get— попытка терминальна в ограниченное времяLinked Issue
Refs #56. Cross-repo: WealthLedger/specs#33 (review follow-up), WealthLedger/docs#37.
Verification
node test/sqlite.cjs tbank-hourly-lifecycle.e2e-spec.ts— 20/20;node test/sqlite.cjs --all— exit 0;npm run verify(lint, typecheck, unit, build) — exit 0. Ограничение: локальные Prisma-вызовы (recordHourlyChild/works/settleHourly) bound'ом не покрыты — при зависшем SQLite процесс мёртв в любом случае.Breaking Changes (если есть)
Нет: HTTP contract не менялся.