From a6c62bbf82938302fd0460814baef39417dbaa2a Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 24 Oct 2026 18:27:54 +0400 Subject: [PATCH] =?UTF-8?q?OpenSpec=20sprints-backlog:=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=BC=20=D1=85=D0=B0=D0=B1=D0=B0=20=D0=B8=20=D0=B0?= =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D1=82=D0=B0=20(#108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- openspec/changes/sprints-backlog/design.md | 3 +++ .../changes/sprints-backlog/specs/agent/spec.md | 13 +++++++------ .../changes/sprints-backlog/specs/web-app/spec.md | 7 ++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/openspec/changes/sprints-backlog/design.md b/openspec/changes/sprints-backlog/design.md index 0cb841d..c76eca7 100644 --- a/openspec/changes/sprints-backlog/design.md +++ b/openspec/changes/sprints-backlog/design.md @@ -170,3 +170,6 @@ kanban) — свои задачи в статусах остальных кол принадлежности `ensure_rank`, формы полей. Цена ошибки — правка проверок. - 24.10.2026 — R-12 (design #21–#26): условные пункты меню, тип доски в `jira_project`, три состояния данных доски, даты в поясе браузера, история из базовой JQL, переименование «Доска связей». Цена ошибки — правка веба. +- 24.10.2026 — R-28 (план агента R-64, R-65): поле Jira не найдено — ключ у задач не передаётся (хаб сохраняет прежнее), + а не `null`; ошибка чтения списка спринтов — доска не входит в `boards` (иначе стёрлась бы история спринтов). + Цена ошибки — нет. diff --git a/openspec/changes/sprints-backlog/specs/agent/spec.md b/openspec/changes/sprints-backlog/specs/agent/spec.md index b357f85..8729207 100644 --- a/openspec/changes/sprints-backlog/specs/agent/spec.md +++ b/openspec/changes/sprints-backlog/specs/agent/spec.md @@ -5,13 +5,14 @@ `kanban` (известным или только что определённым) прочитать настройки доски (`GET /rest/agile/1.0/board/{id}/configuration`: колонки и их статусы — по именам статусов; признак kanban-бэклога, если Jira его отдаёт, иначе `null`) и, у `scrum`, все спринты доски любого состояния (`GET /rest/agile/1.0/board/{id}/sprint` постранично) и приложить к первой пачке -состояния `boards` (см. `hub-api`, «Приём досок и спринтов»). Ошибка чтения настроек или спринтов доски — доска с -`columns: null` и прежними правилами для спринтов (v12), причина в лог; `refresh` продолжается. +состояния `boards` (см. `hub-api`, «Приём досок и спринтов»). Ошибка чтения настроек доски — доска с `columns: null`, +`kanban_backlog: null`; ошибка чтения списка спринтов scrum-доски — доска в `boards` не входит (хаб сохраняет прежние +данные), имена спринтов задач — по правилам v12; причина в лог; `refresh` продолжается. Каждая задача в состоянии (с v15) SHALL нести `rank` — значение поля ранга Jira (поле типа LexoRank), `story_points` — -значение поля оценки (`field_ids.story_points`, если задано, иначе поле Jira с именем «Story Points»; поля нет — -`null`), и `sprint_ids` — id всех спринтов задачи из поля спринта Jira (любого состояния). Поле не найдено — значение -`null` у всех задач и запись в лог один раз за `refresh`. +значение поля оценки (`field_ids.story_points`, если задано, иначе поле Jira с именем «Story Points»), и `sprint_ids` — +id всех спринтов задачи из поля спринта Jira (любого состояния). Поле не найдено — ключ у задач не передаётся (хаб +сохраняет прежнее значение) и запись в лог один раз за `refresh`. Агент v15 SHALL выполнять `ensure_sprint_meta`, `ensure_sprint_state`, `ensure_rank` и `story_points` в `ensure_fields` по контракту `commands`; сравнение — до записи, повтор без изменений — `done` без записи. @@ -23,5 +24,5 @@ #### Scenario: Нет поля оценки - **WHEN** в Jira нет поля «Story Points», `field_ids.story_points` не задан -- **THEN** у всех задач `story_points: null`; `ensure_fields {key: X, story_points: 3}` — `failed` «поле оценки не найдено +- **THEN** у задач нет ключа `story_points`; `ensure_fields {key: X, story_points: 3}` — `failed` «поле оценки не найдено в Jira: задайте field_ids.story_points» diff --git a/openspec/changes/sprints-backlog/specs/web-app/spec.md b/openspec/changes/sprints-backlog/specs/web-app/spec.md index 2a6edac..fb51e48 100644 --- a/openspec/changes/sprints-backlog/specs/web-app/spec.md +++ b/openspec/changes/sprints-backlog/specs/web-app/spec.md @@ -78,7 +78,8 @@ SHALL храниться в `localStorage` под ключом `sdlc-hub-sidebar Проекта из адреса нет в `GET /projects` — страница SHALL показывать «проект <метка> не найден» и подсказку выбрать проект в списке «Проект» боковой панели (на узком экране — в «Меню») вместо данных. Проектов нет — страницы SHALL показывать приглашение создать проект («+ Новый проект…»). Переходы между страницами SHALL сохранять текущий проект; -смена проекта на странице, которой нет у нового проекта, открывает «Обзор». Карточка задачи +смена проекта на странице, которой нет у нового проекта, открывает «Обзор»; исключение — «Бэклог», «Спринт», «Kanban»: +адрес остаётся, страница показывает «У проекта нет …-доски» (требование «Спринты и бэклог»). Карточка задачи (`/app/jira/issues/{key}`) от проекта не зависит. Доска SHALL загружать `GET /board?project=<текущий>`. Раскладка, дорожки и фильтры доски в `localStorage` SHALL @@ -138,8 +139,8 @@ SHALL храниться в `localStorage` под ключом `sdlc-hub-sidebar «Связи», «Задачи», «Лента» и по типу доски текущего проекта (`board_type` из `GET /projects`): `scrum` — «Бэклог» и «Спринт»; `kanban` — «Kanban»; доски нет или тип неизвестен — новых пунктов нет, а прямой переход на их адрес показывает «У проекта нет scrum-доски» («…kanban-доски» для «Kanban») со ссылкой на «Связи». Данные — `GET -/agile?project=<текущий>`; если доска есть, но её данных нет (`board.columns = null` или ответ без доски) — «Нужен агент -v15 и обновление из Jira» с кнопкой «Обновить» блока состояния модуля; данные доски есть, а колонок нет — «Не удалось +/agile?project=<текущий>`; если доска есть, но её данных от агента нет (`board = null` или `board.fetched_at = null`) — +«Нужен агент v15 и обновление из Jira» с кнопкой «Обновить» блока состояния модуля; данные доски есть (`fetched_at` задан), а колонок нет (`columns = null`) — «Не удалось прочитать настройки доски из Jira» и та же кнопка. Пока проекты не загружены, условные пункты меню скрыты; смена проекта на странице, которой у нового проекта нет, оставляет адрес и показывает сообщение «У проекта нет …-доски». Даты спринтов (ISO-8601 Jira) показываются «ДД.ММ» в часовом поясе браузера; «осталось N дн.» — от сегодня до конца спринта.