4.3 KiB
Агент v16: оценка через доску 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: ensure_fields со story_points и board_id ставит оценку через /rest/agile/1.0/issue/{key}/estimation?boardId=….
Architecture: в Executor.do_ensure_fields ветка оценки с доской отделяется от PUT /issue: сначала остальные
поля (как v15, GET /issue только если они есть), затем GET/PUT оценки доски. Без board_id — путь v15.
Tech Stack: Python 3.9 stdlib, unittest; фейк Jira — tests/fake_jira.py.
Spec: sdlc-hub/openspec/changes/sp-estimation-board/specs/agent/spec.md, …/specs/commands/spec.md; решения — openspec/changes/agent-v16-sp-estimation/design.md.
Global Constraints
AGENT_VERSION = 16; Python 3.9, только stdlib (tests/test_py39.py).- Тело
PUT:{"value": <число или null>}; путьAGILE + "/issue/%s/estimation"с параметромboardId. - Сравнение —
_same_points; плохое значение —failed«story_points — число ≥ 0 или null» до вызовов Jira.
Review Focus
- Команда только с оценкой — без
GET /issueиPUT /issue;jira_calls2 (запись) и 1 (без изменений). - Оценка и другие поля —
PUT /issueбез поля оценки, затемPUT estimation;changed— все поля. - Ошибка Jira на
PUT estimation(400) —failed, остальные поля уже записаны. nullпри пустой оценке — без записи; при1.0—PUT {"value": null}.- Без
board_id— поведение v15 (существующие тестыtest_story_points_*не меняются).
Task 1: Оценка через estimation доски
Files:
-
Modify:
tests/fake_jira.py(маршрут/rest/agile/1.0/issue/{key}/estimation:GET→{"fieldId": POINTS_FIELD, "value": <поле задачи>},PUT→ пишетvalueв поле задачи, тело вself.estimation_bodies; доска не изself.boards→ 400; задачи нет → 404; маршрут — до общего/rest/agile/1.0/issue/([^/]+)$) -
Modify:
src/agent.py(do_ensure_fields,AGENT_VERSION = 16) -
Test:
tests/test_executor_fields.py(раздел# --- story_points через доску (#53)) -
Step 1: Тесты:
test_points_by_board_set— оценка1.0,story_points=2, board_id=4216:result == {"changed": ["story_points"]},jira_calls == 2,estimation_bodies == [{"value": 2}],("PUT", "/rest/api/2/issue/AURORA-1704")и("GET", "/rest/api/2/issue/AURORA-1704")нет вrequests;test_points_by_board_same— оценка2.0,story_points=2:changed == [],jira_calls == 1, записей нет;test_points_by_board_clear— оценка1.0,story_points=None→ тело{"value": None}; при пустой оценке — без записи;test_points_by_board_with_fields—duedate+story_points:PUT /issueбезcustomfield_10106, потомPUT estimation;changed == ["duedate", "story_points"];test_points_by_board_jira_error— доска 9999 (нет у фейка):failed,duedateуже записан;test_points_by_board_no_field_lookup—fake.fields = []: всё равноdone(безGET /field);test_points_by_board_bad_value—"3"→failed,requestsпуст.
-
Step 2:
/usr/bin/python3 -m unittest tests.test_executor_fields— FAIL. -
Step 3:
do_ensure_fields: приboard_idиstory_points— путь доски (R-1…R-3 design), иначе v15;AGENT_VERSION = 16. -
Step 4:
/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t .— зелёный. -
Step 5: commit «Агент v16: оценка через estimation доски (#53)».