Веб: доработки «Бэклога» и «Спринта» по образцу Jira (#112) #114

Merged
aep merged 23 commits from feat/112-agile-web-polish into main 2026-10-25 20:54:18 +03:00
Owner

Closes #112. Change OpenSpec agile-web-polish (требование web-app «Спринты и бэклог»), план docs/superpowers/plans/2026-10-25-agile-web-polish.md.

Что сделано

Только фронт, GET /agile и сервер не менялись; веб по-прежнему только смотрит.

  • Бэклог: сворачивается любая секция (запоминается); эпики — панелью «Эпики» слева (на узком экране — выбор «Эпик»), строками в секциях не идут; поиск «Ключ или тема», «Исполнитель», «Скрыть выполненные», «Сбросить фильтры»; «показано K» при активных фильтрах.
  • Спринт: выбор спринтов — несколько сразу, активные и будущие (?sprint=101,102, по умолчанию все активные); те же фильтры; меню «Колонки».
  • Kanban: поиск, исполнитель, меню «Колонки».
  • Колонки доски: одной высоты во всю высоту окна, карточки прокручиваются в колонке, горизонтальная полоса прокрутки — в окне (баг п. 10: высота доски равнялась самой длинной колонке, полоса лежала на y=3616 при окне 1300 px; гипотеза про max-width не подтвердилась — R-17).
  • Значки типов по образцу Jira: эпик, история, задача, ошибка, подзадача, прочее — цветной квадрат с символом.
  • Запоминание: localStorage["sdlc-hub-agile"] по проекту и странице; поиск и выбор спринтов не хранятся; испорченное хранилище — значения по умолчанию.
  • Из #111: M-6 (формат SP в вебе), T10.3 (заголовки колонок h3), T9.4 (тесты AgileGate, меню kanban-проекта), T12.2–T12.4 (e2e доски). #111 остаётся открытой.
  • Сид тестового хаба: проект WIDE_E2E (широкая доска, 40 карточек в колонке).

Проверки

  • make check: pytest 1109, vitest 708 (было 612).
  • npm run e2e: 58 passed, 52 skipped (skipped — screens.spec без SCREENS=1, как на main).
  • openspec validate agile-web-polish --strict — valid.

Rulings I made

Дизайн (по просьбе владельца без вопросов brainstorming, одобрен): R-1…R-13 — openspec/changes/agile-web-polish/design.md. Контроллер SDD:

  • R-14 (design #34): сид WIDE_E2E — в Task 7 (нужен для воспроизведения бага), а не в Task 8.
  • R-15 (design #35): рулинги контроллера — с R-14.
  • R-16 (design #36): у прошлого спринта при фильтрах — «· показано K»; исполнители — по всем задачам-не-эпикам страницы; «N задач» — серверный count, строки и «показано K» — без эпиков.
  • R-17 (design #37): гипотеза R-9/R-12 снята — причина бага в высоте доски, max-width снимать не пришлось.
  • R-18 (design #38): раскрытый «Бэклог (N)» на «Kanban» ограничен 40dvh с прокруткой; «Без колонки» входит в меню «Колонки».
  • R-19 (design #39): цвета значков — эпик --k-ui, история --color-status-success, задача --k-dev, подзадача --k-analytics, ошибка --color-status-error, прочее --color-text-secondary; символ --color-text-on-primary, контраст ≥ 3:1 в обеих темах.
  • R-20 (design #40): на окне уже 640 px минимальная высота доски 240 px (не 360) — иначе полоса прокрутки ниже окна.
  • R-21 (design #41): последний спринт в выборе не снимается; скрытая колонка, которой нет на доске, в меню не показывается; скрыты все — не скрыто ничего; подписи поиска и «Исполнитель».

Находки

Маркер Суть Статус
O-1 require-plan заблокировал src/: план не называл ветку fixed 70cb5ad
O-2 story и task на одном зелёном токене fixed 65e0945 (R-19)
O-3 флейк shell/activity/activity.test.tsx в полном npm test deferred
O-4 неустановленный сбой полного npm test после Task 6, повторы зелёные deferred (см. O-3)
O-5 флейк vitest (waitFor-таймаут) после Task 8 deferred (см. O-3)
T1.1 story/task один цвет fixed 65e0945
T1.2 нет component-тестов «Фича»/«BUG»/«Sub-task» rejected: покрыто model.test.ts
T1.3 дубль проверок fmtSp в model.test.ts deferred
T2.1 parseSprintIds при одних недопустимых id → [] fixed 7fbc6bd
T2.2 saveView не перезаписывал испорченный JSON fixed 7fbc6bd
T2.3 parseSprintIds принимал "1e2"/"0x10" fixed 7fbc6bd
T2.4 трейлер коммитов Task 1–2 — Haiku 5.5 rejected: исполнитель и был haiku
T2.5 тест "1e2,0x66,102.0" слабый deferred
T3.1 нет теста смены метки/страницы без размонтирования fixed e79b073
T3.2 тест reset не проверял сохранение полей fixed e79b073
T3.3 ref.current во время рендера без комментария fixed e79b073
T3.4 set пишет в хранилище при пустом патче rejected: безвредно
T3.5 «Сбросить фильтры» из-за скрытого hideDone fixed e79b073
T3.6 нет StrictMode-теста однократной записи deferred
T4.1 регэксп в тесте fixed f4c3bd5
T4.2 «показано K» у прошлого спринта rejected: R-16
T4.3 исполнители по всем не-эпикам rejected: R-16
T4.4 «N задач» = серверный count rejected: R-4, R-16
T4.5 шеврон свёртки наоборот fixed f21dea3
T4.6 выражение фильтра повторено 3 раза fixed f4c3bd5
T4.7 тест «только смотрит» без buttons.length>0 fixed f4c3bd5
T5.1 .agile-epic-select inline-block fixed 65e0945
T5.2 whitelist имён кнопок в тесте без $ deferred
T5.3 скрытие панели на 900 px не проверено в jsdom fixed f21dea3 (e2e)
T5.4 вложенные div без отступов rejected: косметика
T6.1 эпики скрыты на «Спринте» против R-2 fixed d4d578e
T6.2 «Спринты: 0» при пустом выборе fixed d4d578e
T6.3 нет проверки чисел колонок и теста про эпик fixed d4d578e
T7.1 на <640 px не учтён .topbar-events fixed 7a676d1
T7.2 «Без колонки» исчезает из меню с фильтрами fixed 65e0945
T7.3 на Kanban нет h2 перед h3 deferred
T7.4 .agile-past[open] 40dvh общий для wide-страниц rejected: R-18
T7.5 «52 skipped» не объяснены rejected: те же на main
T7.6 раскладку защитит только e2e fixed f21dea3
T8.1 390×800: нижний край 810 > 800 fixed 7a676d1
T8.2 тест 390 не утверждал полосу прокрутки fixed 7a676d1
T8.3 текст ошибки в AgileGate-тесте fixed 7a676d1
T8.4–T8.6 expect.poll, colOf вместо .first(), exact:true fixed 7a676d1
T8.7 нет теста направления шеврона deferred
T8.8 флейк зафиксирован как O-5 fixed (ledger)
T9.1 ARCHITECTURE.md: неточная фраза fixed 65e0945
T9.2 выбор спринтов — в адресе, не в localStorage fixed 65e0945
I-1 цвета значков story/task/subtask совпадали fixed 65e0945 (R-19)
I-2 «Исполнитель» растягивался, панель в 3 строки fixed 65e0945
I-3 решения не записаны в design.md fixed c7186b9 (R-20, R-21)
M-1 TypeIcon: пустой тип → aria-label="" fixed 65e0945
M-2 нет видимой подписи «Исполнитель» fixed 65e0945
M-3 при скрытой панели «Эпики» выбранный эпик не виден fixed 65e0945
M-4 доступные имена кнопок «Спринты»/«Колонки» fixed 65e0945
M-5 .multi-btn определён в board.css модуля «Связи» deferred
M-6 hideDone гасится дважды (Kanban и AgileToolbar) deferred
M-7 меню «Колонки» при «Нет активного спринта» fixed 65e0945
M-8 имена it.each в TypeIcon.test.tsx fixed 65e0945
M-9 флейк activity.test.tsx:331 (гонка ActivityProvider, вне ветки) deferred
N-1 effectiveHidden по отфильтрованным колонкам, меню — по всем (редкий край) deferred
N-3 тест M-3 проверяет класс is-forced, нет e2e deferred

Deferred (в follow-up при закрытии): T1.3, T2.5, T3.6, T5.2, T7.3, T8.7, M-5, M-6, N-1, N-3; флейк ActivityProvider — M-9 (O-3, O-4, O-5).

После merge

make web + kickstart хаба — владелец. Настройки доски AWPCA в Jira («Протестировано», «Снято», «К тестирвоанию») — в Jira.

🤖 Generated with Claude Code

Closes #112. Change OpenSpec `agile-web-polish` (требование web-app «Спринты и бэклог»), план `docs/superpowers/plans/2026-10-25-agile-web-polish.md`. ## Что сделано Только фронт, `GET /agile` и сервер не менялись; веб по-прежнему только смотрит. - **Бэклог:** сворачивается любая секция (запоминается); эпики — панелью «Эпики» слева (на узком экране — выбор «Эпик»), строками в секциях не идут; поиск «Ключ или тема», «Исполнитель», «Скрыть выполненные», «Сбросить фильтры»; «показано K» при активных фильтрах. - **Спринт:** выбор спринтов — несколько сразу, активные и будущие (`?sprint=101,102`, по умолчанию все активные); те же фильтры; меню «Колонки». - **Kanban:** поиск, исполнитель, меню «Колонки». - **Колонки доски:** одной высоты во всю высоту окна, карточки прокручиваются в колонке, горизонтальная полоса прокрутки — в окне (баг п. 10: высота доски равнялась самой длинной колонке, полоса лежала на y=3616 при окне 1300 px; гипотеза про `max-width` не подтвердилась — R-17). - **Значки типов** по образцу Jira: эпик, история, задача, ошибка, подзадача, прочее — цветной квадрат с символом. - **Запоминание:** `localStorage["sdlc-hub-agile"]` по проекту и странице; поиск и выбор спринтов не хранятся; испорченное хранилище — значения по умолчанию. - **Из #111:** M-6 (формат SP в вебе), T10.3 (заголовки колонок `h3`), T9.4 (тесты `AgileGate`, меню kanban-проекта), T12.2–T12.4 (e2e доски). #111 остаётся открытой. - Сид тестового хаба: проект `WIDE_E2E` (широкая доска, 40 карточек в колонке). ## Проверки - `make check`: pytest 1109, vitest 708 (было 612). - `npm run e2e`: 58 passed, 52 skipped (skipped — screens.spec без `SCREENS=1`, как на main). - `openspec validate agile-web-polish --strict` — valid. ## Rulings I made Дизайн (по просьбе владельца без вопросов brainstorming, одобрен): R-1…R-13 — `openspec/changes/agile-web-polish/design.md`. Контроллер SDD: - R-14 (design #34): сид `WIDE_E2E` — в Task 7 (нужен для воспроизведения бага), а не в Task 8. - R-15 (design #35): рулинги контроллера — с R-14. - R-16 (design #36): у прошлого спринта при фильтрах — «· показано K»; исполнители — по всем задачам-не-эпикам страницы; «N задач» — серверный count, строки и «показано K» — без эпиков. - R-17 (design #37): гипотеза R-9/R-12 снята — причина бага в высоте доски, `max-width` снимать не пришлось. - R-18 (design #38): раскрытый «Бэклог (N)» на «Kanban» ограничен 40dvh с прокруткой; «Без колонки» входит в меню «Колонки». - R-19 (design #39): цвета значков — эпик `--k-ui`, история `--color-status-success`, задача `--k-dev`, подзадача `--k-analytics`, ошибка `--color-status-error`, прочее `--color-text-secondary`; символ `--color-text-on-primary`, контраст ≥ 3:1 в обеих темах. - R-20 (design #40): на окне уже 640 px минимальная высота доски 240 px (не 360) — иначе полоса прокрутки ниже окна. - R-21 (design #41): последний спринт в выборе не снимается; скрытая колонка, которой нет на доске, в меню не показывается; скрыты все — не скрыто ничего; подписи поиска и «Исполнитель». ## Находки | Маркер | Суть | Статус | |---|---|---| | O-1 | require-plan заблокировал src/: план не называл ветку | fixed 70cb5ad | | O-2 | story и task на одном зелёном токене | fixed 65e0945 (R-19) | | O-3 | флейк shell/activity/activity.test.tsx в полном npm test | deferred | | O-4 | неустановленный сбой полного npm test после Task 6, повторы зелёные | deferred (см. O-3) | | O-5 | флейк vitest (waitFor-таймаут) после Task 8 | deferred (см. O-3) | | T1.1 | story/task один цвет | fixed 65e0945 | | T1.2 | нет component-тестов «Фича»/«BUG»/«Sub-task» | rejected: покрыто model.test.ts | | T1.3 | дубль проверок fmtSp в model.test.ts | deferred | | T2.1 | parseSprintIds при одних недопустимых id → [] | fixed 7fbc6bd | | T2.2 | saveView не перезаписывал испорченный JSON | fixed 7fbc6bd | | T2.3 | parseSprintIds принимал "1e2"/"0x10" | fixed 7fbc6bd | | T2.4 | трейлер коммитов Task 1–2 — Haiku 5.5 | rejected: исполнитель и был haiku | | T2.5 | тест "1e2,0x66,102.0" слабый | deferred | | T3.1 | нет теста смены метки/страницы без размонтирования | fixed e79b073 | | T3.2 | тест reset не проверял сохранение полей | fixed e79b073 | | T3.3 | ref.current во время рендера без комментария | fixed e79b073 | | T3.4 | set пишет в хранилище при пустом патче | rejected: безвредно | | T3.5 | «Сбросить фильтры» из-за скрытого hideDone | fixed e79b073 | | T3.6 | нет StrictMode-теста однократной записи | deferred | | T4.1 | регэксп в тесте | fixed f4c3bd5 | | T4.2 | «показано K» у прошлого спринта | rejected: R-16 | | T4.3 | исполнители по всем не-эпикам | rejected: R-16 | | T4.4 | «N задач» = серверный count | rejected: R-4, R-16 | | T4.5 | шеврон свёртки наоборот | fixed f21dea3 | | T4.6 | выражение фильтра повторено 3 раза | fixed f4c3bd5 | | T4.7 | тест «только смотрит» без buttons.length>0 | fixed f4c3bd5 | | T5.1 | `.agile-epic-select` inline-block | fixed 65e0945 | | T5.2 | whitelist имён кнопок в тесте без `$` | deferred | | T5.3 | скрытие панели на 900 px не проверено в jsdom | fixed f21dea3 (e2e) | | T5.4 | вложенные div без отступов | rejected: косметика | | T6.1 | эпики скрыты на «Спринте» против R-2 | fixed d4d578e | | T6.2 | «Спринты: 0» при пустом выборе | fixed d4d578e | | T6.3 | нет проверки чисел колонок и теста про эпик | fixed d4d578e | | T7.1 | на <640 px не учтён .topbar-events | fixed 7a676d1 | | T7.2 | «Без колонки» исчезает из меню с фильтрами | fixed 65e0945 | | T7.3 | на Kanban нет h2 перед h3 | deferred | | T7.4 | `.agile-past[open]` 40dvh общий для wide-страниц | rejected: R-18 | | T7.5 | «52 skipped» не объяснены | rejected: те же на main | | T7.6 | раскладку защитит только e2e | fixed f21dea3 | | T8.1 | 390×800: нижний край 810 > 800 | fixed 7a676d1 | | T8.2 | тест 390 не утверждал полосу прокрутки | fixed 7a676d1 | | T8.3 | текст ошибки в AgileGate-тесте | fixed 7a676d1 | | T8.4–T8.6 | expect.poll, colOf вместо .first(), exact:true | fixed 7a676d1 | | T8.7 | нет теста направления шеврона | deferred | | T8.8 | флейк зафиксирован как O-5 | fixed (ledger) | | T9.1 | ARCHITECTURE.md: неточная фраза | fixed 65e0945 | | T9.2 | выбор спринтов — в адресе, не в localStorage | fixed 65e0945 | | I-1 | цвета значков story/task/subtask совпадали | fixed 65e0945 (R-19) | | I-2 | «Исполнитель» растягивался, панель в 3 строки | fixed 65e0945 | | I-3 | решения не записаны в design.md | fixed c7186b9 (R-20, R-21) | | M-1 | TypeIcon: пустой тип → aria-label="" | fixed 65e0945 | | M-2 | нет видимой подписи «Исполнитель» | fixed 65e0945 | | M-3 | при скрытой панели «Эпики» выбранный эпик не виден | fixed 65e0945 | | M-4 | доступные имена кнопок «Спринты»/«Колонки» | fixed 65e0945 | | M-5 | `.multi-btn` определён в board.css модуля «Связи» | deferred | | M-6 | hideDone гасится дважды (Kanban и AgileToolbar) | deferred | | M-7 | меню «Колонки» при «Нет активного спринта» | fixed 65e0945 | | M-8 | имена it.each в TypeIcon.test.tsx | fixed 65e0945 | | M-9 | флейк activity.test.tsx:331 (гонка ActivityProvider, вне ветки) | deferred | | N-1 | effectiveHidden по отфильтрованным колонкам, меню — по всем (редкий край) | deferred | | N-3 | тест M-3 проверяет класс is-forced, нет e2e | deferred | **Deferred** (в follow-up при закрытии): T1.3, T2.5, T3.6, T5.2, T7.3, T8.7, M-5, M-6, N-1, N-3; флейк ActivityProvider — M-9 (O-3, O-4, O-5). ## После merge `make web` + kickstart хаба — владелец. Настройки доски AWPCA в Jira («Протестировано», «Снято», «К тестирвоанию») — в Jira. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 23 commits 2026-10-25 20:51:58 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- model.ts: fmtSp округляет до двух знаков (M-6); typeKind и isEpic по именам типов Jira без учёта регистра
- TypeIcon: квадрат 16 px, вид по typeKind, aria-label — исходное имя типа, без типа — «Тип не указан»
- icons.tsx: IconBookmark, IconCircle, IconSquares, IconDot; IconProps.size добавляет 12
- agile.css: фон значка — токены дизайн-системы, символ --color-text-on-primary

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Чистая модель без UI: фильтры (q, исполнитель, эпик, скрыть выполненные),
списки опций, сводка эпиков, объединение задач спринтов, выбор спринтов
и разбор параметра sprint. Вид страниц хранится в localStorage под ключом
sdlc-hub-agile по метке проекта и странице; испорченное хранилище и ошибки
доступа дают значения по умолчанию.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
parseSprintIds: при отсутствии допустимых id — все активные (T2.1); токены
только десятичные (T2.3). saveView перезаписывает испорченный JSON (T2.2).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Панель эпиков слева (240px, на узком окне скрыта, вместо неё выбор «Эпик»),
кнопка «Эпики» в панели фильтров, фильтр эпика в том числе для прошлых спринтов.
Заодно T4.1 (регэксп секции), T4.6 (хелпер visible), T4.7 (проверка кнопок).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Также: шеврон свёртки секции «Бэклог» — свёрнуто вниз, развёрнуто вверх (T4.5).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
ARCHITECTURE.md: новые файлы каталога agile/ (filters, agilePref, useAgileView,
AgileToolbar, EpicsPanel, SprintPicker, ColumnsMenu), ключ localStorage
sdlc-hub-agile и состав фильтров, свёртки, панели эпиков, выбора спринтов
и скрытия колонок на «Бэклог», «Спринт», «Kanban» (только просмотр).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aep merged commit e84f7b1b58 into main 2026-10-25 20:54:18 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/sdlc-hub#114
No description provided.