Files
specs/openspec/changes/group-account-rows-by-instrument/qa-analysis.md
T
ksv741 9aa390b8e9
Conventional commits / commits (pull_request) Successful in 9s
Specs security / security (pull_request) Successful in 6s
Specs verify / verify (pull_request) Successful in 8s
spec: plan grouping of all-account rows by instrument (WealthLedger/main#47)
2026-10-30 07:12:37 +03:00

19 KiB
Raw Blame History

QA Analysis

Объект проверки: frontend-only изменение группировки строк по Instrument в режиме «Все счета» (журнал, обзор, будущие события, «Выплаты»). Backend и API не меняются; контракт используется как есть.

Risk Assessment

Risk Affected requirements Likelihood Impact Verification depth
Неверный ключ группы: объединение записей разных типов/дней или не-объединение одинаковых ledger/upcoming groups same-day… Средняя Высокая Полный перебор граничных комбинаций ключа (тип, день, Instrument, один счёт)
Неверный итог: конвертация/округление валют, потеря знака, итог при отсутствии/нулевой сумме, при partial ledger/upcoming group shows each entry and … Средняя Высокая Мультивалютные, знаковые, нулевые и запрещающие сценарии итога; сверка с серверными суммами
Нарушен серверный порядок или лимит (5 записей обзора, пагинация журнала) из-за группировки preserves order and limits Средняя Средняя Проверка позиций групп, границы страницы, состава «последних 5»
Группировка случайно применяется в режиме одного счёта или к записям без Instrument groups same-day…, MODIFIED «Full ledger…» Низкая Высокая Регрессионная проверка одиночного режима и записей без Instrument
«Выплаты»: группировка нарушает запреты одиночного режима или подменяет аналитические итоги Income payments remain traceable… Средняя Высокая Проверка обоих режимов, неизменности серверных аналитических итогов
Пропадание записей внутри группы (свернуто, скрыто) или потеря fallback при отсутствии metadata group shows each entry…, MODIFIED Full ledger…, MODIFIED overview Низкая Высокая Визуальная проверка разбивки без раскрытия, fallback-представление
Обзор «Все счета»: режим не открывается / принадлежность счёту потеряна (восстановление режима all) MODIFIED User can retrieve an account ledger, MODIFIED overview, MODIFIED upcoming list Средняя Средняя Проверка доступности и контента режима all, partial-поведение

Coverage Matrix

Requirement Check Level Test cases
brokerage-account-ledger — User can retrieve an account ledger Режим all доступен; принадлежность записей; partial; пустая незагруженная часть System / E2E Scenario: Получение журнала с периодом по умолчанию; Scenario: Общий журнал сохраняет принадлежность записей; Scenario: Общий журнал содержит неполный счёт; Scenario: Пустая загруженная часть не доказывает отсутствие операций
brokerage-account-ledger — Account overview includes recent ledger events Группы в обзоре «Все счета»; лимит 5; fallback без metadata System / E2E Scenario: Отображение последних событий; Scenario: Последняя запись не содержит visual metadata инструмента; Scenario: Группировка в последних записях обзора; TC-PAG-002, TC-PAG-003
brokerage-account-ledger — Full ledger presents compact rows Строка в группе: счёт, сумма, знак, подпись типа; заголовок группы; fallback System / E2E Scenario: Запись внутри группы режима «Все счета»; Scenario: Подпись типа не дублируется; Scenario: Отсутствует visual metadata инструмента; TC-GRP-001, TC-TOT-001
brokerage-account-ledger — All-accounts ledger groups same-day entries of one instrument Ключ группы: два счёта, один счёт, разные типы, покупка/продажа, разные дни, без Instrument, один счёт System / E2E Scenario: Купоны одной облигации на двух счетах; Scenario: Две операции одного типа на одном счёте; Scenario: Разные типы по одной бумаге не объединяются; Scenario: Покупка и продажа не объединяются; Scenario: Разные дни не объединяются; Scenario: Запись без Instrument; Scenario: Режим одного счёта не меняется; TC-GRP-001, TC-GRP-002, TC-GRP-003, TC-GRP-004
brokerage-account-ledger — All-accounts ledger group shows each entry and an exact total Точный итог: мультивалюта, знак, ноль, без изменения, partial; разбивка всегда видна System / E2E Scenario: Итог по нескольким валютам; Scenario: Итог со знаком; Scenario: Нулевой итог; Scenario: Группа с записью без денежного изменения; Scenario: Запись с нулевой суммой скрывает итог; Scenario: Итог скрыт при неполном периоде; TC-TOT-001, TC-TOT-002, TC-TOT-003, TC-TOT-004
brokerage-account-ledger — All-accounts ledger grouping preserves order and limits Позиция группы; граница страницы; лимит 5 обзора System / E2E Scenario: Позиция группы в списке; Scenario: Группа на границе страницы; TC-PAG-001, TC-GRP-002
brokerage-account-upcoming-events — Account page presents an upcoming events list Страница в all; групповой итог ≠ итог списка; дисклеймер System / E2E Scenario: Просмотр ближайших событий; Scenario: Пустое состояние страницы; Scenario: Прогнозный дивиденд с неизвестной суммой
brokerage-account-upcoming-events — All-accounts upcoming events group same-day events of one instrument Группы событий: два счёта, разные типы/даты, без Instrument, один счёт System / E2E Scenario: Прогноз купонов одной облигации на двух счетах; Scenario: Разные типы или даты не объединяются; Scenario: Событие без Instrument; Scenario: Режим одного счёта не меняется; TC-GRP-005
brokerage-account-upcoming-events — All-accounts upcoming event group shows each event and a forecast total Прогнозный итог: неизвестная сумма, оферта, мультивалюта, неполный прогноз, дата реестра System / E2E Scenario: Событие с неизвестной суммой в группе; Scenario: Оферта без сумм; Scenario: Прогнозный итог по нескольким валютам; Scenario: Прогнозный итог скрыт при неполном прогнозе; Scenario: Группа дивидендов по дате реестра; TC-GRP-005, TC-TOT-005
brokerage-account-upcoming-events — All-accounts upcoming event grouping preserves order and limits Позиция группы событий; ближайшие события обзора System / E2E Scenario: Позиция группы событий; Scenario: Группировка в ближайших событиях обзора; TC-PAG-002 (по аналогии для событий обзора)
brokerage-account-income-analytics — Realized income analytics is account-scoped and period-bound Режим all в аналитике; полнота всех счетов; периоды System / E2E Scenario: Общий доход требует полноты всех счетов; Scenario: Открыт ещё не загруженный период (изменение frontend не затрагивает — smoke)
brokerage-account-income-analytics — Income payments remain traceable to exact Ledger Entries «Выплаты»: одиночный режим без групп; группы в all; итог при неполноте; аналитика не пересчитана; корректировки и дубли ID System / E2E Scenario: Каждая выплата показана отдельной карточкой; Scenario: Список воспроизводит точный состав дохода; Scenario: Отрицательная корректировка и повторяющиеся IDs сохраняются; Scenario: Выплаты одной бумаги на двух счетах в режиме «Все счета»; TC-GRP-006, TC-TOT-004 (правило скрытия итога)

Negative and Boundary Focus

  • Ключ группы: разные точные upstream-типы, покупка vs продажа, разные экранные дни, отсутствие identity Instrument, одна запись (нет пары), все записи на одном счёте.
  • Итог: мультивалюта без конвертации; копеечные суммы без округления (+150.10 −50.05); нулевой итог без знака; запись без денежного изменения; нулевая сумма; partial-период; неполный прогноз; событие с неизвестной суммой; оферта без сумм.
  • Порядок и лимиты: группа из записей первой и следующей страницы журнала; лимит 5 записей обзора (считается по записям, не по группам); позиция группы по первой записи.
  • Режимы: один счёт — полное отсутствие группировки; записи без Instrument не сливаются.

Cross-system Verification

system-analysis не выбран, backend и API в рамках change не меняются — отдельная кросс-системная проверка не требуется. Существующие серверные данные проверяются как вход: реальные ответы API ({ data, meta }, принадлежность записей счёту, partial-состояние, серверные аналитические итоги, порядок entries) используются как эталон, с которым сверяется клиентское представление (состав групп, суммы, порядок). Ключевой инвариант: аналитические денежные итоги и receipt count приходят только с сервера и не пересчитываются; единственный клиентский расчёт — итог визуальной группы, который сверяется с суммой серверных записей группы.

Test Data and Environment Needs

Локальный frontend + локальный backend с сохранёнными данными (или stubbed API в браузере через devtools/сервис-воркер-заглушку). Фикстуры:

  • Два счёта (брокерский + ИИС) с одной и той же облигацией: исполненные купоны в один день (+200 RUB и +100 RUB) — базовая группа.
  • Мультипанель: одна группа с записями в RUB и USD; выплаты одной бумаги в разных валютах.
  • Граничные суммы: +150.10 / −50.05 / −150.10; запись с нулевой суммой; запись без денежного изменения; отрицательная корректировка.
  • Разнообразие типов: купон + налог в один день, покупка + продажа одной бумаги в один день, две покупки на одном счёте, купоны в разные (экранные) дни.
  • Записи без identity Instrument (например, переводы) — два в один день одного типа.
  • Записи без presentation metadata инструмента — fallback.
  • partial: счёт с незагруженным интервалом в запрошенном периоде; пустая сохранённая часть при неполном покрытии.
  • Граница страницы: настройки пагинации журнала так, чтобы записи одной группы попали на разные страницы; подтверждённо полный период.
  • Будущие события: купон на двух счетах в одну дату; дивиденды по дате реестра (известная и неизвестная суммы); оферта на двух счетах; события без суммы; неполный прогноз.
  • Обзор: ровно 5 последних записей, среди которых пара с одинаковым ключом.
  • Режим одного счёта с теми же данными (два купона одной бумаги в один день).

Источник: подготовленные фикстуры в локальной БД тестового backend; при отсутствии — заглушка API-ответов в браузере с теми же контрактными envelope.

Примечания по окружению (не блокеры): тестовые данные границы страницы строятся вокруг фактического размера страницы, который возвращает сервер (TC-PAG-001 фиксирует конкретное содержимое страниц в момент прогона); состояние partial и неполный прогноз воспроизводятся заглушкой API-ответа в браузере (MSW / Playwright route) с meta partial.

Manual / Exploratory Scope

  • Визуальное чтение группы без раскрытия: разбивка всегда видна, заголовок не дублирует подпись типа в строках, знак и семантический цвет не единственные носители направления.
  • Устойчивость к обновлению: приход partial → подтверждённой полноты — итог появляется/исчезает корректно; фоновая догрузка не меняет состав и порядок показанных записей.
  • Переходы между режимами «Все счета» ↔ один счёт на одних данных: группировка появляется/исчезает целиком.
  • Прокрутка/пагинация журнала в all: стабильность позиций групп между страницами.
  • Consent-контент: дивидендные группы с датой реестра, оферта без итога — читаемость при отсутствии сумм.

Automation Candidates

Black-box E2E (Playwright, режим «Все счета»): TC-GRP-001, TC-GRP-002, TC-GRP-005, TC-GRP-006, TC-TOT-001, TC-TOT-002, TC-TOT-003, TC-TOT-004, TC-TOT-005, TC-PAG-001, TC-PAG-002, TC-PAG-003 — стабильные контрактные сценарии групп, итогов и порядка. TC-GRP-003 и TC-GRP-004 — ручные до уточнения Specs. Статус всех: deferred until QA repo exists.

Regression Impact

  • Режим одного счёта: журнал, обзор, «Будущие события», «Выплаты» — полное отсутствие группировки (Scenario-блоки требований; ручная регрессия).
  • Существующие карточки и строки журнала вне групп: представление выплаты купона/дивиденда, подписи типов, знаки, fallback без metadata — без изменений.
  • Состояния загрузки/пустоты/ошибки: первичное ожидание, нейтральная недоступность, сохранение прежнего результата при временном сбое, partial и пустая-но-неполная выборка — не деградируют из-за группировки.
  • Восстановленный режим all в specs журнала и аналитики — поведение не меняется, только smoke доступности (Scenario: Получение журнала с периодом по умолчанию; Scenario: Общий доход требует полноты всех счетов).
  • Аналитические итоги дохода и receipt count — только серверные, отсутствие клиентского пересчёта (TC-GRP-006).

Gaps / Blockers

Нет. Два вопроса из test design закрыты без изменения specs:

  • Identity-ключ: specs требуют одинаковую identity Instrument; design D2 определяет её как первый непустой идентификатор, а записи, равенство которых не доказано, не объединяются (TC-GRP-003).
  • День: specs задают «день, как на экране»; oracle — показанная в строке дата (TC-GRP-004).