openspec/changes/harden-hourly-sync-lifecycle/ — полный набор planning-артефактов схемы wealth-ledger-sdd-v2
Delta spec фиксирует: вывод итога из фактических результатов шагов, ограниченное ожидание, recovery после сбоя сохранения, отклонение устаревшей публикации
Verification
Команда / результат / ограничения: openspec status/instructions — все артефакты done, tasks 11/11; npm run verify (git diff --check) — exit 0; верификация implementation ↔ artifacts выполнена (no critical issues). Ограничение: archive — после merge всех связанных PR.
Breaking Changes (если есть)
Нет.
## Summary
SDD-артефакты change `harden-hourly-sync-lifecycle`: proposal, delta spec `hourly-investment-sync` (1 MODIFIED + 3 ADDED requirements), system-analysis с sequence-диаграммами, design, qa-analysis, docs-impact, tasks (11/11 выполнены).
## Linked Issue
Refs WealthLedger/backend#56 (координатор). Связанные PR: WealthLedger/backend#77 (реализация), WealthLedger/docs — docs-impact 6.1/6.2.
## Changes
- `openspec/changes/harden-hourly-sync-lifecycle/` — полный набор planning-артефактов схемы `wealth-ledger-sdd-v2`
- Delta spec фиксирует: вывод итога из фактических результатов шагов, ограниченное ожидание, recovery после сбоя сохранения, отклонение устаревшей публикации
## Verification
- Команда / результат / ограничения: `openspec status/instructions` — все артефакты done, tasks 11/11; `npm run verify` (git diff --check) — exit 0; верификация implementation ↔ artifacts выполнена (no critical issues). Ограничение: archive — после merge всех связанных PR.
## Breaking Changes (если есть)
Нет.
CRITICAL openspec/changes/harden-hourly-sync-lifecycle/specs/hourly-investment-sync/spec.md:523-535 (в связке с backend/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:201-214, 238-265, 320-403) — требование ограниченно завершать каждую начатую попытку/обязательный шаг не обеспечено кодом: deadline накладывается только на уже созданные durable work-строки в waitWorks, а вызовы membership.request/member.done, access.local, portfolio.request, operations.request, events.refresh/get могут зависнуть до waitWorks — попытка может остаться running бесконечно.
WARNING tasks.md:879-894, docs-impact.md:243-248 — задачи 6.1 и 6.2 отмечены выполненными, но изменений data-freshness.md/tbank.md в этом PR нет и отдельного docs PR не видно — статус 11/11 неверифицируем.
INFO — структура OpenSpec полная (proposal.md, design.md, tasks.md, specs/hourly-investment-sync/spec.md, .openspec.yaml); backend #77 затрагивает заявленные компоненты и добавляет 16 lifecycle-тестов.
## Итог: Request Changes
- CRITICAL `openspec/changes/harden-hourly-sync-lifecycle/specs/hourly-investment-sync/spec.md:523-535` (в связке с `backend/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:201-214, 238-265, 320-403`) — требование ограниченно завершать каждую начатую попытку/обязательный шаг не обеспечено кодом: deadline накладывается только на уже созданные durable work-строки в `waitWorks`, а вызовы `membership.request/member.done`, `access.local`, `portfolio.request`, `operations.request`, `events.refresh/get` могут зависнуть до `waitWorks` — попытка может остаться running бесконечно.
- WARNING `tasks.md:879-894`, `docs-impact.md:243-248` — задачи 6.1 и 6.2 отмечены выполненными, но изменений `data-freshness.md`/`tbank.md` в этом PR нет и отдельного docs PR не видно — статус 11/11 неверифицируем.
- INFO — структура OpenSpec полная (`proposal.md`, `design.md`, `tasks.md`, `specs/hourly-investment-sync/spec.md`, `.openspec.yaml`); backend #77 затрагивает заявленные компоненты и добавляет 16 lifecycle-тестов.
1. CRITICAL — requirement не обеспечен кодом. Подтверждено: WORK_WAIT_BOUND_MS покрывал только waitWorks. Исправление: WealthLedger/backend#78 — все await'ы walk до terminal barrier (membership.request/member.done, access.local, dispatch portfolio/operations/events.refresh, post-wait events.get) гоняются с тем же bound через race; истечение = проблемная секция (как failed dispatch) либо INTERRUPTED-закрытие для access.local; вызов не отменяется, поздняя durable-строка fenced по attemptId. Требование «Каждая попытка обхода достигает итога в ограниченное время» теперь обеспечено на всех путях walk. Доказательство: 4 новых SQLite lifecycle-теста с никогда не завершающимися вызовами (20/20 зелёных, npm run verify exit 0). Артефакты обновлены: Design Decision 3, tasks — добавлена задача 2.4 со ссылкой на PR #78.
2. WARNING — задачи 6.1/6.2 неверифицируемы. Отдельный docs PR существует: WealthLedger/docs#37 (open) — обновляет ровно architecture/cross-cutting/data-freshness.md (+8) и integrations/tbank.md (+6/-1), diff соответствует docs-impact. Ссылка на PR добавлена в docs-impact.md рядом с таблицей.
3. INFO — принято, без изменений.
После merge backend#78 и docs#37 change готов к archive.
Замечания обработаны (commit `77b2111` + follow-up backend PR):
**1. CRITICAL — requirement не обеспечен кодом.** Подтверждено: `WORK_WAIT_BOUND_MS` покрывал только `waitWorks`. Исправление: WealthLedger/backend#78 — все await'ы walk до terminal barrier (`membership.request`/`member.done`, `access.local`, dispatch `portfolio`/`operations`/`events.refresh`, post-wait `events.get`) гоняются с тем же bound через race; истечение = проблемная секция (как failed dispatch) либо `INTERRUPTED`-закрытие для `access.local`; вызов не отменяется, поздняя durable-строка fenced по `attemptId`. Требование «Каждая попытка обхода достигает итога в ограниченное время» теперь обеспечено на всех путях walk. Доказательство: 4 новых SQLite lifecycle-теста с никогда не завершающимися вызовами (20/20 зелёных, `npm run verify` exit 0). Артефакты обновлены: Design Decision 3, tasks — добавлена задача 2.4 со ссылкой на PR #78.
**2. WARNING — задачи 6.1/6.2 неверифицируемы.** Отдельный docs PR существует: WealthLedger/docs#37 (open) — обновляет ровно `architecture/cross-cutting/data-freshness.md` (+8) и `integrations/tbank.md` (+6/-1), diff соответствует docs-impact. Ссылка на PR добавлена в docs-impact.md рядом с таблицей.
**3. INFO** — принято, без изменений.
После merge backend#78 и docs#37 change готов к archive.
ksv741
merged commit e8e68a7ed6 into develop2026-10-12 22:29:16 +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
SDD-артефакты change
harden-hourly-sync-lifecycle: proposal, delta spechourly-investment-sync(1 MODIFIED + 3 ADDED requirements), system-analysis с sequence-диаграммами, design, qa-analysis, docs-impact, tasks (11/11 выполнены).Linked Issue
Refs WealthLedger/backend#56 (координатор). Связанные PR: WealthLedger/backend#77 (реализация), WealthLedger/docs — docs-impact 6.1/6.2.
Changes
openspec/changes/harden-hourly-sync-lifecycle/— полный набор planning-артефактов схемыwealth-ledger-sdd-v2Verification
openspec status/instructions— все артефакты done, tasks 11/11;npm run verify(git diff --check) — exit 0; верификация implementation ↔ artifacts выполнена (no critical issues). Ограничение: archive — после merge всех связанных PR.Breaking Changes (если есть)
Нет.
Итог: Request Changes
openspec/changes/harden-hourly-sync-lifecycle/specs/hourly-investment-sync/spec.md:523-535(в связке сbackend/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts:201-214, 238-265, 320-403) — требование ограниченно завершать каждую начатую попытку/обязательный шаг не обеспечено кодом: deadline накладывается только на уже созданные durable work-строки вwaitWorks, а вызовыmembership.request/member.done,access.local,portfolio.request,operations.request,events.refresh/getмогут зависнуть доwaitWorks— попытка может остаться running бесконечно.tasks.md:879-894,docs-impact.md:243-248— задачи 6.1 и 6.2 отмечены выполненными, но измененийdata-freshness.md/tbank.mdв этом PR нет и отдельного docs PR не видно — статус 11/11 неверифицируем.proposal.md,design.md,tasks.md,specs/hourly-investment-sync/spec.md,.openspec.yaml); backend #77 затрагивает заявленные компоненты и добавляет 16 lifecycle-тестов.Замечания обработаны (commit
77b2111+ follow-up backend PR):1. CRITICAL — requirement не обеспечен кодом. Подтверждено:
WORK_WAIT_BOUND_MSпокрывал толькоwaitWorks. Исправление: WealthLedger/backend#78 — все await'ы walk до terminal barrier (membership.request/member.done,access.local, dispatchportfolio/operations/events.refresh, post-waitevents.get) гоняются с тем же bound через race; истечение = проблемная секция (как failed dispatch) либоINTERRUPTED-закрытие дляaccess.local; вызов не отменяется, поздняя durable-строка fenced поattemptId. Требование «Каждая попытка обхода достигает итога в ограниченное время» теперь обеспечено на всех путях walk. Доказательство: 4 новых SQLite lifecycle-теста с никогда не завершающимися вызовами (20/20 зелёных,npm run verifyexit 0). Артефакты обновлены: Design Decision 3, tasks — добавлена задача 2.4 со ссылкой на PR #78.2. WARNING — задачи 6.1/6.2 неверифицируемы. Отдельный docs PR существует: WealthLedger/docs#37 (open) — обновляет ровно
architecture/cross-cutting/data-freshness.md(+8) иintegrations/tbank.md(+6/-1), diff соответствует docs-impact. Ссылка на PR добавлена в docs-impact.md рядом с таблицей.3. INFO — принято, без изменений.
После merge backend#78 и docs#37 change готов к archive.