Andrey Epifancev 70eaf5dc20 Архив OpenSpec: attachment-fetch (#83)
Спека agent: вложение без имени тоже отбрасывается (R-50 агента).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 16:06:20 +04:00

5.5 KiB
Raw Blame History

Why

Тестировщики прикладывают к ошибкам AURORA файлы: скриншоты, выгрузки в Excel (ОСВ), иногда PDF и JSON. Владелец разбирает ошибки в чате с Claude, и Claude должен сам открыть эти файлы. Сейчас мост файлы из Jira не забирает совсем: зеркало не знает даже, что у задачи есть вложения (агент умеет только загружать файл в Jira — ensure_attachment, change bug-and-attachments).

Решения владельца 22.10.2026 (brainstorming, jira-hub#83, jira-agent#43):

  • при синхронизации — только список вложений (имя, размер, автор, дата), сами файлы автоматически не тянутся;
  • файл — по запросу: агент скачивает нужное вложение из Jira и отдаёт хабу;
  • где: в MCP (Claude получает путь к локальному файлу и открывает его) и в веб-приложении (кнопка «Скачать»);
  • из комментария: файлы, на которые ссылается комментарий тестировщика, видны и скачиваются прямо у комментария — в карточке, в MCP issue и comment, а не только в общем списке задачи;
  • предел 10 МБ на файл, как у загрузки; крупнее — скачивать в Jira руками;
  • превью скриншотов в карточке не делаем: для него файлы пришлось бы качать заранее.

What Changes

  • Список вложений в зеркале. Агент v14 в refresh добавляет поле attachment к search и шлёт у каждой задачи attachments (id, имя, размер, тип, автор, дата) без содержимого. Хаб хранит их в новой таблице issue_attachment (схема v6), заменяя список задачи целиком, как комментарии.
  • Ссылки из текста. Хаб находит в описании и комментариях вики-ссылки на вложения (!имя!, !имя|…!, [^имя]) и отдаёт у комментария attachment_ids, у задачи — description_attachment_ids.
  • Команда fetch_attachment. Хаб ставит её по запросу интерфейса отдельным пакетом без хвостового refresh; агент читает вложение в Jira, скачивает содержимое и отдаёт хабу новым маршрутом POST /agent/files; хаб кладёт файл в хранилище files/ (то же, что для загрузки; уборка через 30 дней) и запоминает в attachment_file.
  • API. GET /attachments/{id} (с состоянием none / fetching / ready / failed), POST /attachments/{id}/fetch (одна команда на вложение, сколько бы раз ни просили), GET /attachments/{id}/content (файл с исходным именем). GET /issues/{key} отдаёт вложения и ссылки на них.
  • MCP. issue и comment показывают вложения; новый инструмент attachment скачивает файл (ждёт агента до wait_seconds) и отвечает путём к локальной копии с исходным именем в <данные хаба>/downloads/<id>/.
  • Веб. В карточке раздел «Вложения (N)», плашки файлов под комментарием, ссылки на вложения в отрендеренном тексте — все скачивают файл одной кнопкой; «Загружается…», пока агент везёт файл.

Non-Goals

  • Превью картинок в карточке и показ !картинка! картинкой.
  • Скачивание файлов больше 10 МБ — только ссылка на Jira.
  • Автоматическая подкачка файлов (заранее, при синхронизации, по подписке).
  • Удаление и переименование вложений в Jira из моста.
  • Привязка файла к комментарию по автору и времени — только по ссылке в тексте.

Anti-Goals

  • Синхронизация стала тяжелее: при refresh агент качает содержимое вложений или делает лишние вызовы Jira на задачу.
  • Учётные данные Jira уходят на адрес не из base_url агента (адрес content из ответа Jira).
  • Повторные нажатия и параллельные запросы из веба и MCP ставят несколько одинаковых скачиваний.
  • Claude получает файл без имени и расширения и не может его открыть.
  • Старый агент (≤ v13) или старый хаб ломают синхронизацию.