План: оценка через доску (#113)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-25 21:40:40 +04:00
parent c00b0bd4b2
commit 49ee8c11b8

View File

@ -0,0 +1,61 @@
# Оценка через доску (хаб) 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)».