Skip to content

Помощник и «Из iCloud»: пароли не уходят модели, удалить — только разрешённое правилами; сбой части файлов не стирает восстановленное - #17

Merged
audit0 merged 2 commits into
mainfrom
claude/design-redesign-no1k6b
Sep 28, 2026

Conversation

@audit0

@audit0 audit0 commented Sep 28, 2026

Copy link
Copy Markdown
Owner

Пункты 1–4 из проверки новых частей («Что ещё можно улучшить?»). Сделано для Mac и Windows.

Помощник

Пароли не уходят модели. Раньше в начале небольших текстовых файлов модели уходило то, что экран согласия обещал не читать никогда: выгрузка паролей из Safari и Chrome (.csv), заметка «Пароль от почты: …», токен Telegram-бота, ключ Google, JWT. Вырезались только английские password: и несколько видов ключей.

  • Начало файлов теперь уходит, только если человек включил переключатель «Показывать помощнику начало небольших текстовых файлов». По умолчанию он выключен.
  • Таблицы (.csv, .tsv) не читаются вовсе.
  • Файл, в начале которого видно что-то из списка ниже, не показывается целиком, а не по кусочку:
    • пароль или PIN (по-русски и по-английски);
    • ключ или токен: GitHub, Slack, OpenAI, Anthropic, Stripe, AWS, Google, Telegram-бот, JWT;
    • пароль в адресе или пара «почта:пароль»;
    • номер карты;
    • длинная строка, похожая на ключ;
    • фраза восстановления кошелька.
  • Путь к домашней папке в тексте заменяется на ~ и на Windows. Раньше там оставалось C:\Users\<имя>.

Удалить можно только то, что разрешают правила «Разобрать». Раньше кнопку «В Корзину» получал любой личный файл, который модель назвала мусором. Модель при этом могла поддаться имени или тексту файла.

  • Новый AssistantTrash работает на том же CleanupPlanner, что и «Разобрать». В Корзину можно отправить только места, которые программы создают заново, и установщики старше недели. Остальное — только в сейф.
  • Модель видит у таких объектов пометку "trash":"allowed". Если она всё же советует удалить что-то другое, совет исправляется на «в сейф», и на экране написано почему.
  • Перед удалением правила проверяются ещё раз по свежим данным с диска: дате изменения, дате появления в папке, признаку зашифрованного образа.
  • Отправленное в Корзину возвращается кнопкой «Вернуть» прямо у совета. Используется тот же код, что в «Разобрать»: CleanupModel.trash и putBack стали внутренними, а не закрытыми.

Согласие дано на конкретный вариант и отзывается.

  • Сначала человек выбирает, где думает помощник, потом соглашается именно на этот вариант. На экране согласия написано, куда уйдут сведения:
    • Claude Code или ключ API — в Anthropic;
    • Ollama — никуда с этого компьютера;
    • сервер OffLoadAI — туда вместе с ключом Pro, в котором номер и имя покупателя.
  • Кнопка «Отозвать согласие» прерывает начатый вопрос.
  • Ключ настройки новый (assistant.consent.<вариант>). Прежнее общее согласие давалось на описание, по которому начало файлов уходило всегда, поэтому экран согласия покажется один раз заново.

Windows.

  • Разбор ответа модели не падает, если модель вернула поле не той формы: например, id числом.
  • Любая ошибка вопроса выводится сообщением. Раньше страница могла навсегда остаться «в работе».
  • RecycleException при отправке в Корзину теперь перехватывается.

Документация.

  • В README добавлен раздел «Помощник».
  • Исправлено «OffLoadAI по-прежнему не ходит в интернет», по-русски и по-английски.
  • В SECURITY.md добавлен раздел о помощнике, новое известное ограничение (эвристика секретов) и строка в английской сводке.

Из iCloud

При ошибке с отдельными файлами restic restore выходит с кодом 1 (я проверил по исходникам restic и на настоящем restic). Программа ждала код 3, который у restore не бывает, и стирала всё восстановленное; повторная попытка кончалась тем же.

  • Ошибки с файлами теперь разбираются из stderr в обоих форматах: JSON (restic 0.17+) и текст ignoring error for … (0.16).
  • Такие файлы restic оставляет полного размера, но с нулями на месте недочитанного, то есть испорченными. Они убираются. Удаляются только обычные файлы и только внутри папки восстановления: путь с .. из вывода не выходит за папку, папки с ошибкой не трогаются.
  • Остальное остаётся. В отчёте сказано, каких файлов нет и что сверки не было: после ошибок restic --verify не делает.
  • Если не осталось ни одного файла, это ошибка, как и раньше.
  • Сообщение об ошибке выводится без сырого JSON и без строк «retrying».
  • Mac: закрытие раздела во время просмотра или поиска больше не оставляет «Открыть» крутиться до перезапуска.

Проверка

  • Mac. Проверка типов на Linux по заглушкам AppKit, SwiftUI и Security прошла без ошибок. Проверены правленые файлы ядра, приложения и проверок.

  • Windows. Всё решение собирается на Linux (dotnet build -p:EnableWindowsTargeting=true): 0 ошибок, 0 предупреждений.

  • Распознавание секретов. Прогнано в обоих движках регулярных выражений: ICU, как на macOS, и .NET. Из 21 образца секретов не пропущен ни один, 15 обычных текстов не приняты за секрет.

  • Частичное восстановление. Код ядра Mac прогнан на Linux с настоящим restic 0.16.4:

    • хранилище с удалённым куском;
    • хранилище с испорченным куском;
    • целое хранилище;
    • неверный пароль.

    Из трёх файлов остался целый, два испорченных убраны, сказано, что сверки не было. Разбор вывода для Windows проверен на том же stderr.

  • Новые проверки.

    • Секреты на образцах выше и обычные тексты без ложных тревог.
    • Правила удаления.
    • Пометка trash для модели.
    • Оба формата ошибок restic.
    • Удаление испорченного без выхода за папку.
    • С restic: частичное восстановление из хранилища с испорченным куском, на Mac и Windows. Этот тест выполняется только там, где restic установлен.
  • Не проверено. Живьём на macOS и Windows интерфейс не смотрел.

Не менял

  • Протокол сервера OffLoadAI. Ключ Pro по-прежнему уходит заголовком. Я только описал это в согласии и документации. Сейчас этот вариант не работает, потому что адрес сервера нигде не задан.
  • MONETIZATION.md. Там сказано «Никаких серверов» и «Сети в программе нет и не будет». Это план от 27.09, в нём ничего не трогал.
  • restic 0.16 с набранным паролем. Эта версия печатает «reading repository password from stdin» в stdout перед JSON, и список снимков выходит пустым. С паролем из файла или с restic 0.17+ всё работает. Это не часть этого PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_019g9zXsGLHyDxJzGtUAQUVY


Generated by Claude Code

…решённое правилами, согласие на каждый вариант; сбой части файлов не стирает восстановленное

Помощник (Mac и Windows):
- Начало текстовых файлов уходит модели, только если человек это включил (по умолчанию — нет).
  Таблицы (.csv, .tsv: выгрузки паролей из браузеров) не читаются вовсе. Файл, в начале которого
  видны пароль или PIN (по-русски и по-английски), ключ, токен (GitHub, Slack, OpenAI, Anthropic,
  Stripe, AWS, Google, Telegram-бот, JWT), пароль в адресе, пара «почта:пароль», номер карты,
  длинная строка вида ключа или фраза восстановления кошелька, не показывается целиком, а не по
  кусочку. Домашняя папка в тексте заменяется на «~» и на Windows.
- «В Корзину» — только то, что разрешают правила «Разобрать»: места, которые программы создают
  заново, и установщики старше недели (AssistantTrash, тот же CleanupPlanner). Остальное — только
  в сейф, что бы ни ответила модель; модель видит пометку "trash":"allowed". Перед удалением правила
  проверяются ещё раз по свежим сведениям с диска. Отправленное в Корзину возвращается кнопкой
  «Вернуть» (тот же механизм, что в «Разобрать»).
- Согласие — отдельно на каждый вариант, с понятным «куда уходят сведения» (Anthropic, Ollama на
  этом компьютере, сервер OffLoadAI вместе с ключом Pro), и отзывается одной кнопкой. Ключ согласия
  новый: прежнее давалось на описание, по которому начало файлов уходило всегда.
- Windows: разбор ответа модели не падает на полях не той формы; любая ошибка вопроса — сообщение,
  а не страница, навсегда «в работе»; RecycleException при отправке в Корзину ловится.

Из iCloud (Mac и Windows):
- restic restore при ошибке с отдельными файлами выходит с кодом 1, а программа ждала 3 и стирала
  всё восстановленное. Теперь ошибки с файлами разбираются из stderr (JSON restic 0.17+ и текст 0.16),
  такие файлы — restic оставляет их полного размера с нулями на месте недочитанного — убираются
  (только обычные файлы внутри папки восстановления), остальное остаётся, и сказано, чего нет и что
  сверки не было. Сообщение об ошибке — без сырого JSON.
- Mac: закрытие раздела во время просмотра или поиска больше не оставляет «Открыть» крутиться.

Проверки: секреты в начале файлов (образцы выше и обычные тексты без ложных тревог), правила
удаления, пометка для модели, разбор обоих форматов ошибок restic, удаление испорченного без выхода
за папку; с restic — частичное восстановление из хранилища с испорченным куском.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019g9zXsGLHyDxJzGtUAQUVY
…ый правила разрешают удалить

Эти проверки смотрят, откуда берётся ответ (result без structured_output, текстовые блоки
Messages API), и узнают его по совету «trash». После нового правила «удалять — только то, что
разрешают правила «Разобрать»» такой совет для файла без пометки переводится в сейф — поэтому
у файла в этих проверках теперь пометка canTrash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019g9zXsGLHyDxJzGtUAQUVY
@audit0
audit0 merged commit 4c751fa into main Sep 28, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants