6.8 KiB
6.8 KiB
agent-v11-bug-attachments — решения агента
Спека и дизайн изменения — в jira-hub/openspec/changes/bug-and-attachments/ (issue aep/jira-hub#43, aep/jira-agent#31).
Агентская часть — раздел «Агент v11» дизайна хаба и требования agent «Тип задачи и вложения» (ADDED) и
«Чтение состояния» (MODIFIED: M-1, M-2 из aep/jira-agent#30).
Решения владельца 15.10.2026 (brainstorming jira-hub#43): файл приходит только из MCP; обязательные поля «Ошибки» — как у
«Задачи»; файл хранится в хабе, агент забирает его отдельным запросом GET /agent/files/{sha256} (base64 в JSON).
Decisions made without discussion
Решения 1–8 записаны в jira-hub/openspec/changes/bug-and-attachments/design.md
(раздел «Decisions made without discussion»); здесь — только решения агентской части.
| Маркер | Дата | Решение | Обоснование | Цена ошибки |
|---|---|---|---|---|
| R-20 | 2026-10-15 | Любой 404 от GET /agent/files/{sha} — failed «файл удалён с хаба, загрузите заново», без разбора кода no_file в теле |
Спека hub-api: у маршрута 404 бывает только no_file; агент v11 публикуется после выкатки хаба с маршрутом (design «Выкатка», шаги 1 и 3) |
Если хаб без маршрута (откат хаба) — вводящий в заблуждение текст «загрузите заново» вместо «нет маршрута»; повторная загрузка не поможет, причина видна по логу хаба |
| R-21 | 2026-10-15 | Таймаут GET /agent/files — обычный timeout агента (60 с), не поднимается до 120 с, как у загрузки в Jira |
design Risks: круг папки для файла 10 МБ (≈13,4 МБ JSON) — секунды, «таймаут вызова агента 60 с с запасом»; таймаут — ConnectionError → повтор как обрыв связи с хабом |
На медленной папке большой файл не успеет за 60 с: 4 попытки и failed «результат неизвестен»; лечится timeout в agent.json |
| R-22 | 2026-10-15 | Ответ хаба на файл с кодом 2xx, но не JSON — временный сбой («ответ на файл не JSON») без текста HttpError |
Текст Http содержит начало тела, то есть base64 содержимого, а спека запрещает содержимое в журнале и логе; обрезанный ответ — сбой пути, как повреждение |
Диагностика беднее: начала тела в ошибке нет, причину искать по логу хаба/реле |
| R-23 | 2026-10-15 | В filename="…" кавычка и переводы строк кодируются как у браузеров (%22, %0D, %0A); при поиске уже приложенного вложения сравниваются обе формы имени — исходная и «браузерная» |
Хаб запрещает в имени только / и \; сырая кавычка ломает заголовок части; если Jira сохранит имя в закодированной форме, без второй формы каждый повтор команды создавал бы дубль |
Вложение с такими символами в Jira может называться …%22…; другое вложение, чьё имя совпало с «браузерной» формой, будет принято за уже приложенное |
| R-24 | 2026-10-15 | Ответ Jira на загрузку не список или без id у первого элемента — failed «Jira не вернула id вложения в ответе на загрузку», без повтора |
Спека: результат — attachment_id из ответа; повтор команды человеком найдёт вложение по имени и размеру и вернёт done с id |
Если Jira на самом деле не сохранила вложение, failed без повтора требует ручного повтора команды |
| R-25 | 2026-10-15 | Загрузка вложения идёт через тот же повтор 429/503 по Retry-After, что и остальные вызовы Jira (JiraClient._retry) |
429/503 — запрос не обработан, повтор безопасен; спека «Ограничение темпа и 429» не делает исключений для записи | 503 от прокси после фактической записи даст второе вложение; вероятность низкая, лишнее удаляется руками |
| R-26 | 2026-10-15 | Тип задачи проверяется до поиска дубля в ensure_issue: без настройки типа — ни одного вызова Jira, даже если задача с той же темой уже есть |
Спека: «failed без вызова Jira»; настройку могли убрать между постановкой и выдачей (design решение 6) |
Повтор ensure_issue по уже созданной задаче после удаления настройки типа даёт failed вместо done с найденным ключом |
| R-27 | 2026-10-16 | Трейлер коммитов исполнения — Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>, а не Opus 5.5 из текста плана |
Указание окружения об атрибуции приоритетнее плана; план исполняет Sonnet | Неверное имя модели в трейлере 4–5 коммитов; правится при rebase |
Наблюдения вне ревью
- O-1: README к началу исполнения утверждал «сейчас 9», хотя
AGENT_VERSIONбыл 10 (v10 не обновила пункт); исправлено вместе с обновлением до 11. - O-2: полный набор занимает ≈2 минуты (230 → 262 теста), дольше таймаута foreground-команды; прогоны
task-doneзапускались в фоне.