Andrey Epifancev c7186b9f30 openspec: рулинги R-19…R-21 и правка спеки (#112)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 21:39:38 +04:00

16 KiB
Raw Blame History

MODIFIED Requirements

Requirement: Спринты и бэклог

Модуль jira SHALL показывать для проекта с доской страницы по образцу Jira — только для просмотра: на них MUST NOT быть действий, меняющих Jira (перетаскивания, кнопок спринтов, смены статуса или ранга). Пункты меню группы «Jira» — «Связи», «Задачи», «Лента» и по типу доски текущего проекта (board_type из GET /projects): scrum — «Бэклог» и «Спринт»; kanban — «Kanban»; доски нет или тип неизвестен — новых пунктов нет, а прямой переход на их адрес показывает «У проекта нет scrum-доски» («…kanban-доски» для «Kanban») со ссылкой на «Связи». Данные — GET /agile?project=<текущий>; если доска есть, но её данных от агента нет (board = null или board.fetched_at = null) — «Нужен агент v15 и обновление из Jira» с кнопкой «Обновить» блока состояния модуля; данные доски есть (fetched_at задан), а колонок нет (columns = null) — «Не удалось прочитать настройки доски из Jira» и та же кнопка. Пока проекты не загружены, условные пункты меню скрыты; смена проекта на странице, которой у нового проекта нет, оставляет адрес и показывает сообщение «У проекта нет …-доски». Даты спринтов (ISO-8601 Jira) показываются «ДД.ММ» в часовом поясе браузера; «осталось N дн.» — от сегодня до конца спринта.

Строка задачи и карточка задачи на этих страницах: ключ, значок типа, тема, исполнитель (или «—»), оценка (число или «—»); выполненная — приглушена. Щелчок открывает карточку задачи (окно поверх страницы, как в списке задач). Оценки и их суммы SHALL показываться числом не более чем с двумя знаками после запятой без хвостовых нулей (0.1 + 0.2 — «0.3», 3 — «3»).

Значок типа SHALL различать по issue_type без учёта регистра: эпик («Эпик», «Epic», «Фича»), история («История», «Story»), задача («Задача», «Task»), ошибка («Ошибка», «Bug»), подзадача («Подзадача», «Sub-task», «Subtask»); прочие и пустой тип — нейтральный значок. Значок — цветной квадрат с символом цвета --color-text-on-primary, контрастным в обеих темах, у каждого вида свои цвет и символ (эпик — молния, история — закладка, задача — галочка, ошибка — круг, подзадача — два квадрата), в обеих темах; название типа — в aria-label и подсказке.

Панель фильтров — над содержимым «Бэклога», «Спринта» и «Kanban»: поиск «Ключ или тема» (подстрока без учёта регистра в ключе или теме), выбор «Исполнитель» («все», «Без исполнителя», исполнители задач страницы по алфавиту), переключатель «Скрыть выполненные» (только «Бэклог» и «Спринт»); на «Бэклоге» — кнопка «Эпики» (показать или скрыть панель эпиков); на «Спринте» — выбор спринтов; на «Спринте» и «Kanban» — меню «Колонки». Если задан хотя бы один фильтр (поиск, исполнитель, эпик, «Скрыть выполненные») — кнопка «Сбросить фильтры», снимающая их все. Фильтры действуют вместе (И). Сохранённое значение исполнителя или эпика, которого нет в данных, SHALL оставаться выбранным и видимым в списке.

Запоминание: свёрнутые секции, выбранный эпик, исполнитель, «Скрыть выполненные», видимость панели эпиков и скрытые колонки SHALL храниться в localStorage под ключом sdlc-hub-agile — JSON по метке проекта и странице (backlog, sprint, kanban); у разных страниц и проектов свои значения. Поиск и выбор спринтов не запоминаются. Нечитаемое или закрытое хранилище — значения по умолчанию, страница работает.

«Бэклог» (/app/jira/backlog), сверху вниз: секции активных спринтов, будущих спринтов, «Бэклог», затем свёрнутый список «Прошлые спринты (N)». Заголовок секции спринта: имя, состояние, даты «ДД.ММ–ДД.ММ», цель (если есть), «N задач», «S SP (выполнено D)» и «без оценки: U», если U > 0 — итоги спринта, фильтры их не меняют; если фильтры скрыли часть задач секции — ещё «показано K». Задачи секции — по рангу. Секция без задач показывает «Нет задач»; все задачи скрыты фильтрами — «Нет задач по фильтрам». Любую секцию (спринта и «Бэклог») SHALL можно свернуть и развернуть щелчком по заголовку (кнопка с aria-expanded); по умолчанию развёрнуты все. Прошлый спринт в списке — строка «имя · закрыт ДД.ММ · выполнено X из N · S SP»; раскрытие показывает его задачи с пометкой «не выполнено» у невыполненных.

Эпики (задачи вида «эпик») MUST NOT показываться строками в секциях «Бэклога». Панель «Эпики» — слева от секций: пункт «Все задачи», затем эпики — каждая задача-эпик из данных страницы по рангу, затем эпики, на которые ссылается epic_key задач, но строки которых в данных нет, по ключу; в конце — «Без эпика». Пункт эпика: тема (или ключ, если темы нет), ключ, число задач эпика в секциях активных и будущих спринтов и «Бэклога». Выбор пункта (кнопка с aria-pressed) фильтрует все секции, включая прошлые спринты; повторный выбор выбранного эпика возвращает «Все задачи». При «Скрыть выполненные» выполненные эпики в панели не показываются (кроме выбранного). На узком экране (контейнер страницы уже 900 px) панель SHALL становиться выбором «Эпик» в панели фильтров.

«Скрыть выполненные» на «Бэклоге» скрывает выполненные задачи в секциях активных и будущих спринтов и «Бэклога»; прошлые спринты показываются полностью.

«Спринт» (/app/jira/sprint): выбранные спринты доски — по умолчанию все активные. Выбор спринтов — список с отметками: активные, затем будущие (по дате начала, без даты — в конце); выбор хранится в адресе ?sprint=<id>[,<id>…] (переход без новой записи истории); идентификаторы, которых нет среди активных и будущих, отбрасываются, если не осталось ни одного — все активные. Над доской — заголовок каждого выбранного спринта (имя, даты, «осталось N дн.» или «срок прошёл» — только у активного, цель, суммы оценок), под ними колонки доски Jira с числом задач; задачи доски — задачи выбранных спринтов, карточки в колонке — по рангу; колонка «Без колонки» — для статусов вне настроек доски, только если в ней есть задачи. Нет активного спринта и ничего не выбрано — «Нет активного спринта» и ссылка на «Бэклог»; если есть будущие спринты, выбор спринтов при этом доступен.

«Kanban» (/app/jira/kanban): колонки доски из board_issues, карточки по рангу, у последней колонки подпись «за 14 дней»; если kanban_backlog = true — над колонками свёрнутый список «Бэклог (N)» по рангу; поиск и исполнитель действуют и на него.

Колонки доски («Спринт» и «Kanban»): заголовок колонки — h3. Меню «Колонки» — отметки по колонкам доски (и «Без колонки», если она есть); снятая отметка скрывает колонку, последнюю видимую скрыть нельзя (отметка недоступна); если скрыты колонки — на кнопке их число. Доска SHALL занимать высоту окна под заголовком и панелью фильтров (не меньше 360 px; на окне уже 640 px — не меньше 240 px), все колонки — во всю высоту доски; карточки, не помещающиеся по высоте, прокручиваются внутри своей колонки. Колонки, не помещающиеся по ширине, SHALL прокручиваться по горизонтали внутри доски, не страницы, и полоса горизонтальной прокрутки доски SHALL находиться в пределах окна при любом числе карточек. Заголовок вкладки — «Бэклог», «Спринт», «Kanban» по общему правилу оболочки.

Scenario: Меню scrum-проекта

  • WHEN текущий проект AWPCA, board_type = scrum
  • THEN в группе «Jira» пункты «Связи», «Бэклог», «Спринт», «Задачи», «Лента»; пункта «Kanban» нет

Scenario: Проект без доски

  • WHEN текущий проект STOCKS_DRRK без доски, открыт /app/jira/backlog?project=STOCKS_DRRK
  • THEN пунктов «Бэклог», «Спринт», «Kanban» в меню нет; страница — «У проекта нет scrum-доски» со ссылкой на «Связи»

Scenario: Бэклог только смотрит

  • WHEN открыт «Бэклог» AWPCA
  • THEN на странице нет перетаскиваемых элементов; кнопки и поля — только свёртка секций, панель фильтров, пункты панели эпиков и открытие карточки задачи; ни одно из них не ставит команд

Scenario: Прошлый спринт

  • WHEN спринт AWPCA_Sprint_2_VGO закрыт, в нём 73 задачи, 61 в последней колонке, оценки у 10 задач на 25 SP
  • THEN в «Прошлые спринты» строка «AWPCA_Sprint_2_VGO · закрыт ДД.ММ · выполнено 61 из 73 · 25 SP»; раскрытие — 73 задачи, 12 с пометкой «не выполнено»

Scenario: Агент без досок

  • WHEN AWPCA scrum, агент v14 (данных доски нет), открыт «Спринт»
  • THEN «Нужен агент v15 и обновление из Jira» и кнопка «Обновить»

Scenario: Свёрнутый активный спринт

  • WHEN на «Бэклоге» свёрнута секция активного спринта, страница перезагружена
  • THEN секция свёрнута (видны заголовок и итоги, задач нет), остальные развёрнуты

Scenario: Фильтр по эпику

  • WHEN в бэклоге 3 задачи эпика AURORA-10 и 5 других, в активном спринте 2 задачи AURORA-10; в панели «Эпики» выбран AURORA-10
  • THEN в секции спринта 2 задачи и «показано 2», в «Бэклоге» 3; строки самого AURORA-10 в секциях нет; у пункта AURORA-10 в панели — 5

Scenario: Скрыть выполненные

  • WHEN в активном спринте 10 задач, 4 выполнены; включено «Скрыть выполненные»
  • THEN в секции 6 задач, заголовок — «10 задач» и «показано 6»; «Прошлые спринты» показывают все свои задачи

Scenario: Исполнитель на доске спринта

  • WHEN на «Спринте» выбран исполнитель ivanov
  • THEN на доске только его карточки; числа в заголовках колонок — по видимым карточкам; на «Бэклоге» исполнитель не выбран (свой фильтр у каждой страницы)

Scenario: Будущий спринт на доске

  • WHEN у доски активный спринт 101 и будущий 102; в выборе спринтов отмечен и 102
  • THEN адрес — ?sprint=101,102; над доской два заголовка, «осталось N дн.» только у 101; на доске задачи обоих

Scenario: Скрытая колонка

  • WHEN на «Спринте» в меню «Колонки» снята отметка «Выполнено», страница перезагружена
  • THEN колонки «Выполнено» нет, на кнопке «Колонки» — 1; остальные колонки на месте

Scenario: Широкая доска

  • WHEN окно 2560 × 1300 px, у доски 12 колонок, в одной из них 40 карточек
  • THEN все колонки одной высоты и помещаются в окно по высоте; полоса горизонтальной прокрутки доски видна в окне; прокрутка доски вправо до конца показывает «Без колонки» целиком; страница горизонтально не прокручивается