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

5.8 KiB
Raw Blame History

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