[Test] Сделать source publication races и rollback proofs различающими #63

Closed
opened 2026-10-11 21:45:18 +03:00 by codex-bot · 2 comments
Owner

Problem

Late portfolio case вызывает local GET, deferred RPC не потребляется. Publish-failure case падает upstream до transaction и проверяет лишь points. Metadata/operations races используют 5–10 ms sleeps; portfolio unit игнорирует existing done. These tests не доказывают заявленные write/interleaving boundaries.

Expected Behavior

Assertions происходят после реально начатого и завершённого competing producer либо post-first-write rollback.

Evidence

Audit date 2026-10-11; 08, 09. IDs TQ-001, TQ-008, TI-003, TA-F08, CA-H11, CA-H13, CA-H17. Revision 0ad84ff4f0b4712abc7e69dc299856f14af6eadd; Confidence High; Verification status static; false-green mutants не запускались.
Affected: tbank-local-reads.e2e-spec.ts:489–514; value-history:316–333; metadata:130–178; catalog:179–225; operations-sync:152–210,523–550; portfolio.service.spec.ts:100–110,150–154.

Scope

In scope

Started→replace/join→release→done barriers, failure-path finally cleanup, genuine SQLite tx fault, cheapest meaningful unit seam.

Out of scope

Новый race DSL/test framework, fake SQLite CAS, увеличение sleeps, удаление financial/restart tests.

Proposed Approach

Use existing public request/work.done и explicit upstream started signal. Fault после первого real Portfolio write сравнивает snapshot+points. Metadata tests переводить на production-used request/savedMany; combined read API удалять только после fresh caller proof. Pure mapper/summary tests не требуют fake whole Prisma tx.

Acceptance Criteria

  • Late source действительно started до replacement, completion awaited, old generation не публикуется/new data unchanged.
  • Tx fault после first write оставляет previous payload/dataRevision/time/history points; useful upstream failure case отдельно честно назван.
  • Readiness sleeps заменены started signals; gates освобождаются в finally, available done awaited.
  • Unit mapping proof не masquerades DB proof; real CAS/replay/rollback suites сохранены.

Verification

Affected existing SQLite suites и два portfolio unit launch cases; assert independently read persisted outcomes. Backend final gates; повторные green runs не заменяют controlled order.

Dependencies

Нет. Retired catalog-producer-only arms можно удалить вместе с T10 вместо переписывания под dead behavior.

Traceability

Campaign WealthLedger/main#23 . Findings TQ-001, TQ-008, TI-003, TA-F08, CA-H11, CA-H13, CA-H17. WealthLedger/backend; T12.

<!-- wealthledger-audit:2026-10-11:source-publication-proof --> ## Problem Late portfolio case вызывает local GET, deferred RPC не потребляется. Publish-failure case падает upstream до transaction и проверяет лишь points. Metadata/operations races используют 5–10 ms sleeps; portfolio unit игнорирует existing done. These tests не доказывают заявленные write/interleaving boundaries. ## Expected Behavior Assertions происходят после реально начатого и завершённого competing producer либо post-first-write rollback. ## Evidence Audit date `2026-10-11`; [08](https://git.personal.ksv741.ru/WealthLedger/main/src/commit/d07fbfabb1295780952a554185989d2d5b5c8349/audits/2026-10-11/reports/08-test-quality-and-effectiveness-report.md), [09](https://git.personal.ksv741.ru/WealthLedger/main/src/commit/d07fbfabb1295780952a554185989d2d5b5c8349/audits/2026-10-11/reports/09-test-architecture-and-infrastructure-report.md). IDs TQ-001, TQ-008, TI-003, TA-F08, CA-H11, CA-H13, CA-H17. Revision `0ad84ff4f0b4712abc7e69dc299856f14af6eadd`; Confidence High; Verification status static; false-green mutants не запускались. Affected: [tbank-local-reads.e2e-spec.ts:489–514](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/0ad84ff4f0b4712abc7e69dc299856f14af6eadd/test/tbank-local-reads.e2e-spec.ts#L489-L514); value-history:316–333; metadata:130–178; catalog:179–225; operations-sync:152–210,523–550; portfolio.service.spec.ts:100–110,150–154. ## Scope ### In scope Started→replace/join→release→done barriers, failure-path finally cleanup, genuine SQLite tx fault, cheapest meaningful unit seam. ### Out of scope Новый race DSL/test framework, fake SQLite CAS, увеличение sleeps, удаление financial/restart tests. ## Proposed Approach Use existing public request/work.done и explicit upstream started signal. Fault после первого real Portfolio write сравнивает snapshot+points. Metadata tests переводить на production-used request/savedMany; combined read API удалять только после fresh caller proof. Pure mapper/summary tests не требуют fake whole Prisma tx. ## Acceptance Criteria - [ ] Late source действительно started до replacement, completion awaited, old generation не публикуется/new data unchanged. - [ ] Tx fault после first write оставляет previous payload/dataRevision/time/history points; useful upstream failure case отдельно честно назван. - [ ] Readiness sleeps заменены started signals; gates освобождаются в finally, available done awaited. - [ ] Unit mapping proof не masquerades DB proof; real CAS/replay/rollback suites сохранены. ## Verification Affected existing SQLite suites и два portfolio unit launch cases; assert independently read persisted outcomes. Backend final gates; повторные green runs не заменяют controlled order. ## Dependencies Нет. Retired catalog-producer-only arms можно удалить вместе с T10 вместо переписывания под dead behavior. ## Traceability Campaign https://git.personal.ksv741.ru/WealthLedger/main/issues/23 . Findings TQ-001, TQ-008, TI-003, TA-F08, CA-H11, CA-H13, CA-H17. WealthLedger/backend; T12.
codex-bot added this to the Technical Audit Remediation — 2026-10-11 milestone 2026-10-11 21:45:18 +03:00
codex-bot added the Kind/Testing
Priority
Medium
3
audit/2026-10-11
labels 2026-10-11 21:45:18 +03:00
codex-bot was assigned by hermes-agent 2026-10-12 00:04:23 +03:00
hermes-agent added this to the WealthLedger — Delivery Board project 2026-10-12 00:04:23 +03:00
Author
Owner

Закрываю частично: часть пунктов выполнена, остаток вынесен в отдельные задачи.

Сделано (смержено в develop):

  • #101: late portfolio после замены соединения: реальный producer через PortfolioService.request, барьеры started/done вместо delay; контрольный тест publish.
  • #102: tbank-metadata-persistence: три конкурентных кейса с сигналом started вместо delay, два бесполезных delay удалены; один кейс operations-sync (overlapping atomic groups).
  • #103: portfolio.service.spec: await handle.done вместо цикла тиков (мутант подтвердил, что ожидание проверяется).
  • Пункт catalog закрыт как неприменимый: конкурирующий producer удалён в #62.

Не сделано и вынесено:

  • operations-sync: около 14 delay, механическая замена ломает кейс forced visible (порядок history→screen зависит от записи в БД). Отдельная задача на разбор каждого кейса с мутантами.
  • Rollback fault после первой Portfolio write и доказательство claimed-fence в publish: требуют тестовой инъекции сбоя (spy или seam), прецедента в проекте нет. Нужно архитектурное решение владельца.
  • Флейк portfolio-structure (401 в beforeEach) в первом полном прогоне: отдельная задача.

Ссылки на задачи добавлю после создания.

Закрываю частично: часть пунктов выполнена, остаток вынесен в отдельные задачи. Сделано (смержено в develop): - #101: late portfolio после замены соединения: реальный producer через PortfolioService.request, барьеры started/done вместо delay; контрольный тест publish. - #102: tbank-metadata-persistence: три конкурентных кейса с сигналом started вместо delay, два бесполезных delay удалены; один кейс operations-sync (overlapping atomic groups). - #103: portfolio.service.spec: await handle.done вместо цикла тиков (мутант подтвердил, что ожидание проверяется). - Пункт catalog закрыт как неприменимый: конкурирующий producer удалён в #62. Не сделано и вынесено: - operations-sync: около 14 delay, механическая замена ломает кейс forced visible (порядок history→screen зависит от записи в БД). Отдельная задача на разбор каждого кейса с мутантами. - Rollback fault после первой Portfolio write и доказательство claimed-fence в publish: требуют тестовой инъекции сбоя (spy или seam), прецедента в проекте нет. Нужно архитектурное решение владельца. - Флейк portfolio-structure (401 в beforeEach) в первом полном прогоне: отдельная задача. Ссылки на задачи добавлю после создания.
Author
Owner

Остаток вынесен в задачи:

  • #104: разбор оставшихся delay в tbank-operations-sync по одному кейсу с мутантами.
  • #105: решение о тестовой инъекции сбоя для rollback после первой Portfolio write и claimed-fence в publish (нужно архитектурное решение).
  • #106: флейк portfolio-structure (401 в beforeEach в полном прогоне).
Остаток вынесен в задачи: - #104: разбор оставшихся delay в tbank-operations-sync по одному кейсу с мутантами. - #105: решение о тестовой инъекции сбоя для rollback после первой Portfolio write и claimed-fence в publish (нужно архитектурное решение). - #106: флейк portfolio-structure (401 в beforeEach в полном прогоне).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#63