diff --git a/openspec/changes/wiki-module/design.md b/openspec/changes/wiki-module/design.md index 30303fd..c346d95 100644 --- a/openspec/changes/wiki-module/design.md +++ b/openspec/changes/wiki-module/design.md @@ -596,3 +596,16 @@ jira безвреден. 67. Скачивание вложения: `Content-Type: application/octet-stream` + `nosniff`, имя в `filename*=UTF-8''` через `quote(safe="")`, пустое имя — `attachment-`; 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-` 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». Цена ошибки: правка текстов.