51 lines
4.8 KiB
Markdown
51 lines
4.8 KiB
Markdown
## ADDED Requirements
|
||
|
||
### Requirement: Нормализация параметров при постановке
|
||
При постановке пакета (`POST /batches`, MCP `batch_create`, повтор команды) хаб SHALL сохранять параметры команд в
|
||
каноническом виде. Нормализация SHALL выполняться сразу после проверки типов значений, до остальных проверок:
|
||
обязательный параметр, ставший пустым после обрезки, даёт 422 «нет <параметр>»; правила типов, временные ключи
|
||
`new:<n>` и проверки `ensure_attachment` работают по нормализованным значениям; элемент списка, ставший пустым, даёт
|
||
422 «<параметр> — без пустых элементов». Необязательное поле `ensure_fields` из одних пробелов (`priority`, `duedate`,
|
||
`planned_start`, `planned_end`, `epic_key`, `assignee`) даёт 422 «<параметр> — из одних пробелов; для очистки — "" или
|
||
null»: после обрезки оно стало бы пустой строкой, которую агент читает как «очистить поле в Jira» (R-8). Строковые параметры обрезаются по краям, кроме текстовых `summary`,
|
||
`description`, `body` и `goal`, которые хранятся как заданы. Элементы списков `labels`, `labels_add`, `labels_remove`
|
||
и `keys`, а также `target` у `ensure_status`, если это список, обрезаются поэлементно. Числа, логические значения и
|
||
`null` не меняются. `filename` у `ensure_attachment` SHALL дополнительно приводиться к нормальной форме Unicode NFC.
|
||
Агент SHALL получать параметры в том виде, в каком они сохранены.
|
||
|
||
#### Scenario: Ключ с пробелами
|
||
- **WHEN** `POST /batches` с `ensure_rank {key: "A-1", before: " A-2 "}`
|
||
- **THEN** пакет создан, параметры команды `{key: "A-1", before: "A-2"}`; агент при `claim` получает `before = "A-2"`
|
||
|
||
#### Scenario: Текст не обрезается
|
||
- **WHEN** `POST /batches` с `ensure_comment {key: " A-1", marker: "Итог ", body: " отступ\n"}`
|
||
- **THEN** сохранено `key = "A-1"`, `marker = "Итог"`, `body = " отступ\n"`
|
||
|
||
#### Scenario: Временный ключ с пробелами
|
||
- **WHEN** пакет `ensure_issue {temp_key: "new:1", …}`, затем `ensure_fields {key: "A-5", epic_key: " new:1 "}`
|
||
- **THEN** пакет создан, `epic_key` сохранён как `new:1` и подставляется настоящим ключом после выполнения
|
||
`ensure_issue`
|
||
|
||
#### Scenario: Ключ из пробелов
|
||
- **WHEN** `POST /batches` с `ensure_status {key: " ", target: "Готово"}`
|
||
- **THEN** 422 «команда 1 (ensure_status): нет key; ожидаются key, target»
|
||
|
||
#### Scenario: Поле из пробелов не очищает Jira
|
||
- **WHEN** `POST /batches` с `ensure_fields {key: "A-1", assignee: " "}`
|
||
- **THEN** 422 «команда 1 (ensure_fields): assignee — из одних пробелов; для очистки — "" или null», пакет не создан
|
||
|
||
#### Scenario: Имя вложения в NFD
|
||
- **WHEN** `ensure_attachment` с `filename` «отчёт.pdf» в NFD («е» + U+0308)
|
||
- **THEN** сохранён `filename` «отчёт.pdf» в NFC; повторная постановка того же файла с именем в NFC даёт ту же строку
|
||
`filename`
|
||
|
||
### Requirement: Идентификаторы из цифр — только ASCII
|
||
Хаб SHALL считать строку числовым идентификатором (`attachment_id` в `fetch_attachment`, `id` вложения в состоянии
|
||
агента, ссылка `#<id>` в MCP, версия агента), только если она непуста и состоит из символов `0-9`. Строка из других
|
||
цифр Unicode (`"²"`, `"١٢"`) — не идентификатор: при постановке 422, в состоянии агента 422 `bad_state`, в MCP —
|
||
поиск по имени. Ответ 500 MUST NOT возникать.
|
||
|
||
#### Scenario: Надстрочная цифра
|
||
- **WHEN** `POST /batches` с `fetch_attachment {key: "A-1", attachment_id: "²"}`
|
||
- **THEN** 422 «attachment_id — цифры id вложения из issue», пакет не создан
|