sdlc-hub/docs/superpowers/plans/2026-10-25-sp-estimation-board.md
Andrey Epifancev 49ee8c11b8 План: оценка через доску (#113)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 22:07:56 +04:00

62 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Оценка через доску (хаб) Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** хаб дописывает `board_id` доски проекта задачи в `ensure_fields` со `story_points`, чтобы агент v16 ставил оценку через доску.
**Architecture:** `hooks._assign_boards` уже ставит доску в `ensure_sprint` по меткам задачи; расширяем его на
`ensure_fields` с ключом `story_points` (свои тексты 422 для канбана и «вне проектов»). `retry_params` снимает
`board_id` и у `ensure_fields`. Описание `batch_create` в MCP — одна фраза.
**Tech Stack:** Python 3.13, pytest.
**Spec:** `openspec/changes/sp-estimation-board/` (proposal, design, specs/commands, specs/mcp).
## Global Constraints
- От клиента `board_id` в `ensure_fields` — 422 «лишние параметры board_id» (валидация уже такая: `board_id` не в списке параметров — не добавлять его в `commands.COMMANDS`).
- Тексты 422 (команда N — как у `ensure_sprint`): «команда N: K не входит ни в один проект — доску для оценки не определить»; «команда N: у проекта P канбан-доска, оценка — только на scrum-доске»; нет доски, тип не известен, разные доски — тексты `ensure_sprint` без изменений.
- `ensure_fields` без `story_points` — без доски и без проверок доски.
## Review Focus
1. `ensure_fields {story_points}` для временного ключа `new:<n>` — доска по меткам его `ensure_issue` в пакете (как у спринта) — тест в Task 1.
2. `ensure_fields` без оценки на задаче вне проектов — пакет создаётся, `board_id` нет — тест в Task 1.
3. Повтор `ensure_fields` со `story_points` после смены доски проекта — новая доска — тест в Task 1.
4. Пакет из `ensure_fields` и `ensure_sprint` на одну задачу — обе получают доску — тест в Task 1.
5. Повтор `ensure_fields` без оценки — параметры без изменений — тест в Task 1.
---
### Task 1: Доска в ensure_fields со story_points
**Files:**
- Modify: `src/sdlc_hub/modules/jira/hooks.py` (`_assign_boards`, `retry_params`)
- Test: `tests/test_queue.py` (рядом с `test_sprint_gets_project_board`)
**Interfaces:**
- Produces: в `params` `ensure_fields` со `story_points` — `board_id: int`.
- [ ] **Step 1: Тесты** (`fields_sp(key, sp=1)` → `{"type": "ensure_fields", "params": {"key": key, "story_points": sp}}`):
- `test_story_points_gets_project_board` — AURORA-1692 с меткой `AWPCA`: params `== {"key": "AURORA-1692", "story_points": 1, "board_id": 4216}`;
- `test_story_points_board_rejected` — parametrize как `test_sprint_board_rejected`, но канбан → «у проекта STOCKS_DRRK канбан-доска, оценка — только на scrum-доске», вне проектов → «AURORA-77 не входит ни в один проект — доску для оценки не определить»; батчей 0;
- `test_fields_without_points_no_board` — `ensure_fields {key: AURORA-77, duedate: "2026-10-30"}` вне проектов: пакет создан, `"board_id" not in params`;
- `test_story_points_for_new_issue_uses_batch_labels` — `ensure_issue new:1` в пакете проекта `AWPCA` + `fields_sp("new:1")` → `board_id == 4216`;
- `test_fields_and_sprint_same_issue` — `[fields_sp("A-1"), sprint("A-1")]`: у обеих `board_id == 4216`;
- `test_retry_story_points_recomputes_board` — как `test_retry_sprint_recomputes_board`: после смены доски на 5120 повтор → 5120;
- `test_retry_fields_without_points_keeps_params` — повтор `ensure_fields {key, duedate}` → params те же.
- [ ] **Step 2:** `uv run pytest tests/test_queue.py -k "story_points or fields_" -q` — FAIL.
- [ ] **Step 3:** `_assign_boards`: обрабатывать `ensure_sprint` и `ensure_fields` с `"story_points" in params`; слово цели («спринта»/«оценки») и текст канбана — по типу команды; `_board_error` получает необязательный текст канбана (`kanban_text`), по умолчанию прежний. `retry_params`: `drop` и для `ensure_fields`. Docstring `_assign_boards` — упомянуть оценку.
- [ ] **Step 4:** `uv run pytest -q` — весь набор зелёный.
- [ ] **Step 5:** commit «Доска проекта в ensure_fields со story_points (#113)».
### Task 2: Описание batch_create в MCP
**Files:**
- Modify: `src/sdlc_hub/modules/jira/mcp.py:500`
- Test: `tests/test_mcp.py:224`
- [ ] **Step 1:** в тесте строка `"board_id для ensure_sprint, ensure_sprint_meta и ensure_sprint_state выставляет хаб"` → `"board_id для ensure_sprint, ensure_sprint_meta, ensure_sprint_state и ensure_fields со story_points выставляет хаб"`; FAIL.
- [ ] **Step 2:** та же фраза в описании `batch_create`; `uv run pytest -q` и `make check` — зелёные.
- [ ] **Step 3:** commit «MCP: board_id в ensure_fields со story_points ставит хаб (#113)».