From 16a3b8c13dca67d0358b5ed2b9c27078dac6652f Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 24 Oct 2026 01:56:04 +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=205,=20R-5=20?= =?UTF-8?q?(#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 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/openspec/changes/wiki-module/design.md b/openspec/changes/wiki-module/design.md index 599cd34..b7bfd38 100644 --- a/openspec/changes/wiki-module/design.md +++ b/openspec/changes/wiki-module/design.md @@ -523,3 +523,19 @@ jira безвреден. `modules/jira/projectFields.ts`. `useUpdateProject({label, fields})` сам добавляет `author: "viewer"`; сигнатура может уточниться в Task 10. Цена ошибки: мелкая правка. 46. Поля окна — единый `TextInput` (number/text), вёрстка не менялась; `min=1` только для int. + +Решения исполнителя Task 5 и рулинг R-5 (2026-10-24): + +47. **R-5.** Имя каталога копии проекта — `paths.dir_name(label)`: `%`, `/`, `\` экранируются (`%25`, `%2F`, `%5C`), `.` и + `..` — `%2E`, `%2E%2E`. Обычные метки не меняются. Обоснование: метки ядра допускают `/` и `..`, без экранирования + сборка и `rmtree` выходили бы за каталог вики. Раскладка копии (Task 7) идёт только через `paths.project_dir`. Цена + ошибки: экзотические метки получают экранированное имя каталога. +48. `PATCH wiki_root` с тем же кодом — no-op (`batch_ids: []`): повторная синхронизация идёт через `POST /wiki/sync`. + Цена ошибки: одна строка в `on_updated`. +49. `on_updated` отменяет только пакеты `wiki_sync`, все команды которых `queued`; выданный (`claimed`) не трогает — его + поздний `done` по старому корню отбросит Task 7. Цена ошибки: лишняя синхронизация. +50. Автосинхронизация проекта, у которого нет ни `synced_at`, ни `failed_at` и нет активного пакета, ставится сразу, не + ожидая часов. Цена ошибки: лишний пакет; зависит от записи `failed_at`/`synced_at` в Task 7. Прочие решения + исполнителя (3, 5–9, 11–12 отчёта): `paths.root` на базе без файла бросает `RuntimeError`, `_drop_copy` его ловит; + очистка FTS по rowid страницы; строгая валидация настроек и команд (bool не целое); `wiki_project.failed_at` пока не + пишется. Цена ошибки: правка одной строки в соответствующем месте.