Документация
Пограничные случаи и проверка восстановления
Этот аудит добавил восстановление исходного состояния и регрессии сверх обычного sync/restore. Использовались изолированные Hub и клиенты; рабочие конфигурации не сбрасывались.
Добавленные проверки
| Случай | Ожидаемое поведение и проверка |
|---|---|
| Несколько sync разных клиентов | Первый снимок сохраняется; один reset возвращает все учтённые оригиналы |
| Обычный restore после позднего sync | Старое владение отклоняется вместо угадывания порядка копий |
| Новый Hub с Git | Всё созданное дерево архивируется, активный путь исчезает |
| Существующий Hub с личными и бинарными данными | Возвращается точный отпечаток дерева, текущее архивируется |
| Изначально отсутствовавший файл клиента | Файл удаляется; новые родительские папки — только если пусты |
| Новые пользовательские файлы в созданной папке | Сохраняются; рекурсивной очистки нет |
| Правка или chmod клиента после sync | Reset блокируется; явный archive-changes сохраняет текущее перед полным возвратом |
| Правка клиента, прав или новый файл Hub после preview | Ревизия reset устаревает, применение останавливается |
| Существующая конфигурационная ссылка | Возвращаются байты и права цели при прежней привязке |
| Перенаправленная ссылка клиента | Блокировка даже с archive-changes |
| Ссылка Hub на внешний каталог | Указатель сохраняется, произвольное внешнее содержимое не обходится |
| Повреждённые данные baseline | Проверка целостности останавливает изменение текущих данных |
| Повреждённый hub.yaml или удалённый активный Hub | Используется внешний baseline, не текущие настройки |
| SIGKILL после первой замены sync | Журнал распознаёт частичное состояние; мёртвые блокировки восстанавливаются явно |
| SIGKILL после перемещения Hub при reset | Повтор завершает возврат по внешнему baseline для нового и существующего Hub |
| Живой или неизвестный владелец блокировки | Автоматическое восстановление её не снимает |
| Сбой rename при установке reset | Уже изменённые клиенты и активный Hub откатываются |
| Сбой самого отката reset | Явная ошибка ручной проверки; baseline и архив сохраняются |
| ENOSPC при сохранении оригиналов | Остановка до записей; неполный baseline не устанавливается, повтор возможен |
| ENOSPC при архивировании клиентов | Остановка до изменения клиентов и Hub |
| Новый профиль DSH | Добавляется его первый оригинал, старые не заменяются |
| Ссылка или чужие данные в recovery | Отклонение без перезаписи чужого |
| Два клиента разрешаются в один файл | Блокировка на этапе preview sync |
| Новый путь пакета или Node | Помеченные запускатели Hub не импортируются повторно, вложенных запускателей нет |
| Имя MCP начинается с дефиса | Созданные параметры используют форму с equals и исполняются корректно |
| CLI reset вне cwd проекта | Точная команда с ревизией работает из другой папки |
Важные выводы
Старый restore возвращал один sync, но не исходное состояние всей истории. Теперь этот сценарий покрывают внешний baseline, неизменяемые оригиналы, журнал намерений и reset.
Тесты выявили различия канонических путей macOS (/var и /private/var), копирование readonly-каталогов, неоднозначных владельцев блокировок и очистку после завершения данных, но до выхода процесса. Добавлены регрессии.
Неизвестная история не восстанавливается из ничего. Без baseline reset сообщает об этом и не создаёт вводящий в заблуждение снимок в dry run. Следующая управляемая запись сохраняет явно помеченный снимок существующего Hub. Для нового Hub фиксируется отсутствие до создания.
Что ещё не доказано
- Потеря питания, повреждение диска или контроллера, сбой сетевой файловой системы. Завершение процесса и искусственные I/O-сбои не доказывают полную crash-durability.
- Изоляция от чужих программ между финальной проверкой и rename. Блокировку разделяют процессы Hub текущей версии, не внешние клиенты.
- Сквозная работа Windows: дерево процессов, ACL, wrappers и файловая семантика. Цели релиза — macOS/Linux; удалённый CI ещё нужно выполнить.
- Сохранение inode, hardlink, ACL, xattrs и всех времён. Проверяются содержимое, права, дерево и привязки ссылок.
- Перенос активного Hub и recovery на другую машину или путь. Локальные привязки и секреты требуют проверки; это не облачный переносимый backup.
- Возврат состояния до прототипа без оригиналов. Снимки существующего состояния помечены честно.
- Полная автоматизация браузера и терминала, API-права всех MCP и побочные эффекты провайдеров. Doctor и список инструментов не вызывают инструменты.
- Производительность больших Hub. Хеширование потоковое, но полные baseline и архивы требуют места; нужны независимые копии.
Точный контракт, параметры и архивы — в восстановлении.
Результат проверки
На этапе этого аудита весь quality gate прошёл с 86 тестами, также на Node 22.13.0. Покрытие: 88,66% строк, 83,92% ветвей, 86,68% функций, выше порогов. Allowlist пакета проверен. Настоящий reset --dry-run корректно сообщил об отсутствии исторического baseline; хеши девяти наблюдаемых рабочих файлов и состав recovery не изменились. Более поздние результаты находятся на странице проверок.