62 lines
5.8 KiB
Markdown
62 lines
5.8 KiB
Markdown
# Оценка через доску (хаб) 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)».
|