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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-24 01:56:04 +04:00
parent 4ea287fbdf
commit 16a3b8c13d

View File

@ -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` пока не
пишется. Цена ошибки: правка одной строки в соответствующем месте.