docs(openspec): wiki-module — решения Task 9 (#91)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-24 02:52:02 +04:00
parent 2a5a33f9c6
commit c244b3a8c1

View File

@ -596,3 +596,16 @@ jira безвреден.
67. Скачивание вложения: `Content-Type: application/octet-stream` + `nosniff`, имя в `filename*=UTF-8''` через
`quote(safe="")`, пустое имя — `attachment-<id>`; fetch отвечает 202 при новой постановке, 200 иначе; код страницы в
адресе раскодируется `unquote` (`%2F`). Цена ошибки: клиент должен брать basename имени сам.
Решения исполнителя Task 9 (2026-10-24):
68. Отказы MCP «нет корня»/«не синхронизирована» берутся из `GET /projects` (поля `wiki_root`, `wiki_synced_at`), а не из
409 хаба: спека требует, чтобы запроса `/wiki/tree` не было. Цена ошибки: лишний запрос на вызов.
69. `root_set` валидируется локально той же `parse_root`; пустое значение — отказ (сброс корня через MCP не
предусмотрен, только `PATCH {wiki_root: null}`). Имя копии вложения: basename → `safe_name` jira → каталог
`downloads/wiki-<id>` 0700 через общий `store_copy`. `fmt_agent`, `safe_name`, `store_copy` перенесены в `core/mcp.py`
без смены текстов (jira реэкспортирует под прежними именами). Цена ошибки: нет.
70. Формат вывода `page`/`tree`/`search`/`status` (спека задаёт состав, не текст): `tree` — «(N симв.)», `depth` — уровни
ниже стартовой страницы (по умолчанию 2); `page` по названию — точное совпадение открывает страницу, иначе до 10
кандидатов и «…и ещё N»; `offset` за концом — «offset=N за концом текста: длина L». `sync(wait)` опрашивает пакет
раз в 2 с до 300 с; при идущей синхронизации — «уже идёт: пакет #N». Цена ошибки: правка текстов.