From c244b3a8c1690d5f64c3e76739f1ad7a4e06a997 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 24 Oct 2026 02:52:02 +0400 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20wiki-module=20=E2=80=94=20?= =?UTF-8?q?=D1=80=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20Task=209=20(#91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- openspec/changes/wiki-module/design.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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». Цена ошибки: правка текстов.