Статус исправлений по аудиту PM
Это исторический отчёт об аудите, а не страница статуса релиза для текущего HEAD. Приведённые ниже числа и нативные квитанции относятся только к указанным в них ревизиям. Последующая работа добавляет общую сборку бандлов, E2E для подписанных пакетов, гейт стабильных релизов, распространение для Termux через APT и Python 3.14. Задним числом эти изменения ранние результаты тестов не расширяют.
Актуальные контракты реализации смотрите в разделах Управление пакетами, общая сборка бандлов, стабильные релизы и приёмка обновлений бандлов.
Это изменение интегрирует исправления по итогам сводного аудита ветки. Сертификатом
релиза оно не является. Аудит сравнивал 49945b14029e09fef608db9ede899377cdb54e11
с merge base 433f7196760e5d76f77ea6d5464ee7f1b602a4ee.
Исправления среды выполнения после аудита документации
Аудит нашёл несоответствие раскладки Python в Electron, фиксированное семейство Python в Nix, противоречивые требования к cryptography и сбои чистой настройки в Windows. Последующие изменения правят реализации-владельцы:
- Сборщик бандла проверяет готовый payload и публикует его пути запуска. Electron потребляет этот контракт без проб payload, его перенятия или создания.
- Nix берёт major/minor версию Python из
pm/lock.json. Окружение uv2nix, переопределения пакетов, дополнительные пакеты и developer shell используют это семейство. Реальное вычисление Nix и приёмка сборки остаются гейтами CI. - Прямое требование cryptography и security override совпадают с исправленной
версией в
uv.lock. Override по-прежнему обходит устаревшее ограничение версии в SDK вендора. - Bootstrap дожидается завершения uv и затем запускает PM напрямую через Python. PM может заменить свою запись uv, пока bootstrap не держит её исполняемый файл.
- Публикация квитанций PM использует атомарную запись JSON только средствами stdlib
под общей блокировкой. Отчёт о сбоях больше не импортирует PyYAML через
utils. - Неиспользуемая команда development shell удалена. Единственный путь разработчика
с PM — настройка плюс активация и
deactivate.
Нативная проверка в Windows стартовала с пустым хранилищем инструментов в одноразовом домашнем каталоге. Настройка завершилась, PM опубликовал поколение зависимостей, а активация в PowerShell запустила интерпретатор из хранилища и CLI из исходников. Отдельная установка PM прошла свою реальную проверку зависимостей. Эти проверки не доказывают установку подписанного пакета, обновления или сборки Nix. Более широкая связка плагинов/конфига PM с YAML не изменилась. Раздел рабочий процесс разработчика разводит активацию среды выполнения и независимые окружения для тестов и редактора.
Внедрённые исправления
| Находки | Реализация |
|---|---|
| C01, C11, C12, C24 | Убран импорт удалённого TLS-модуля; исправлены декодирование файлов в ACP, владение путями прокси и вызов SDK мониторинга. |
| C02 | Восстановлены схема code-execution, регистрация и обработка жизненного цикла дочернего процесса. |
| C03, C04, C17 | Команды метаданных обновления оставлены только на чтение; обновления плагинов синхронизированы; идентичности фидов сравниваются корректно. |
| C05, C27, C28 | Управляемый Python включён в замыкание установки; исправлены диспетчеризация стадий установщика и выбор среды выполнения. |
| C06, C07, C09 | Удалена неподдерживаемая поверхность SCM. Сохранён надзор через Scheduled Task, а посторонние среды выполнения защищены при выходе из десктопа. |
| C08, C19 | Исправлена проверка App Installer и восстановлены осмысленные состояния обновления. |
| C10 | Исправлены диспетчеризация удаления и удаление собственных ссылок. |
| C13, C14 | Перед публикацией готовится одно полное окружение зависимостей. Объявленные ограничения и явные закрепления сохраняются; совместимые транзитивные обновления разрешены. Инфраструктурные сбои не отключают плагины. |
| C15, C18 | При неудачной публикации восстановимые записи хранилища инструментов сохраняются. Запись фактов/конфига атомарная, квитанции локальны для контекста. |
| C16, C29 | Удалённые вспомогательные функции зависимостей мигрированы, подсказки об отсутствующих зависимостях восстановлены. |
| C20, C21 | Исправлен выбор платформенных тестов; защита от удалённых импортов теперь проверяет реальный исходный код. |
| C22, C23 | Неизменяемые релизные артефакты публикуются раньше фидов; артефакты FFmpeg разрешаются по цели. |
| C25 | Сохраняются приостановленные загрузки, дескрипторы докачки и владение одним воркером. |
| C26 | Пути загрузки (boot) и периодичности плагинов подключены к их существующим владельцам. |
Внедрение не означает, что все приёмочные тесты на каждой платформе пройдены.
Апдейтер, резервное копирование, настройка, вспомогательные функции голос-текст и ряд
плагинов теперь используют одну реализацию на каждую согласованную задачу. У путей
среды выполнения общий владелец в pm/environments.py.
Реализация закрытия
| Контракт | Владелец и доказательство |
|---|---|
| Прерванная публикация | hermes_cli/runtime_state.py журналирует старый конфиг и хеш предлагаемого конфига. При запуске восстановление выполняется до активации зависимостей. Восстановление отказывается перезаписывать посторонние правки. Тесты с реальными подпроцессами обрывают работу до и после публикации фактов. |
| Сборка живых поколений | При запуске удерживается аренда поколения под блокировкой публикации. pm gc удаляет только невыбранные поколения, управляемые арендой и не имеющие живых читателей. Тесты держат реального читателя живым, пока идёт сборка. |
| Корреляция квитанций | Завершения PM несут ID вызвавшего их обновления. Апдейтер встраивает это завершение, включая неудачные шаги и причины отказа. Вложенные команды и скопированные контексты не могут финализировать объемлющую квитанцию. |
| Поверхности предупреждений | Doctor использует локальные правила происхождения из проверки обновлений. Десктоп читает статус синхронизации и отличает здоровый no-op от встроенного сбоя. |
| Владение апдейтером | electron/updater/checkout.ts отвечает за проверки checkout и передачи управления. main.ts поставляет ему зависимости. |
| Перезапуск в Windows | Отсоединённый ожидающий процесс PowerShell снимает идентичность пакета до выхода, ждёт завершения исходного процесса, затем ждёт смены установленной версии. Неудачная регистрация даёт предупреждение о ручном повторном открытии. |
| Целостность тестов | Поведение TCC использует реальные маркеры хоста. Проверки установщика через grep по исходникам удалены. Тесты поведения среды выполнения и установщика остаются. |
Подтверждённые прогоны
-
Последний полный нативный прогон Python в Windows показал 44 557 пройденных, один упавший и 1 404 пропущенных теста в 3 746 файлах. Хеши исходников Python за весь прогон не изменились. Также был отмечен один HTTP-тест, прошедший со второй попытки. Затем гонку install-ID и этот HTTP-тест исправили. Их два файла прошли 35 тестов без повторов. Это не полный прогон набора на финальном дереве.
-
Корневой
npm run checkзавершился с кодом выхода ноль, включая упаковку MSIX. UI десктопа: 7 231 пройден. Electron: 2 311 пройдено, 23 пропущено. TUI: 1 719 пройдено, восемь пропущено. Дашборд: 291 пройден. Корневой JS: 77 пройдено. Проверки типов и линтер ошибок не дали. Существующие предупреждения линтера остались. Эта проверка упаковки использовала уже имевшийся payload из основного каталога сборки, а не отдельно проверенный свежий payload аудита. -
Реальный основной проект разрешился и собрался через вспомогательный скрипт воркспейса. Импорты разрешились из сгенерированного воркспейса, исходный лок-файл не изменился.
-
Свежий нативный PM-бандл для ARM64 прошёл проверки закреплённых инструментов и сборку окружения со всеми extras. Его манифест фиксирует дерево исходников
60c9fb444c93e8a79ae22a01677c3291385343a6. -
Пересобранный тонкий десктоп дважды запустил свой реальный бэкенд в изолированном домашнем каталоге, ответил HTTP 200 и корректно завершился. Записи домашнего каталога пережили перезапуск.
-
Реальный изолированный шлюз обмена сообщениями API-сервера сохранил свой PID и время старта после обычного выхода из десктопа. Бэкенд десктопа остановился, шлюз — нет.
-
Тонкий MSIX собран реальным тулчейном упаковки. Windows Sandbox установила версию
0.17.0.0, обновила её до0.17.0.1и подтвердила отсутствие после удаления. Создание тестового сертификата и доверие к нему ограничивались одноразовой гостевой системой. -
Отдельный свежий bundled MSIX был собран из дерева payload
60c9fb44.... Собственный CLI распакованного артефакта запустился, импорты разрешились внутри его payload, аhermes serveответил HTTP 200. Попытка развёртывания в Sandbox упала из-за неверного пути к распакованному артефакту. Установку бандла она не доказывает. -
Проверки плагинов теперь запускаются с первого такта обслуживания, а сетевые проверки регулирует настроенный интервал. Реальный изолированный шлюз записал две успешные квитанции проверки плагинов с разницей в один такт. Автоприменение было отключено.
Эти квитанции покрывают разные уровни. Развёртывание тонкого пакета и запуск распакованной среды выполнения не доказывают установку бандла или перезапуск, инициированный App Installer. Ни один тест в качестве доказательства этой приёмки не отправлял запрос к LLM.
Закрытие к слиянию
Ветка включает апстрим 5bd439d3ed4ae5f099857813383389dcd0ab4369.
Следующие ограничения из прошлого аудита устранены:
- Домашние каталоги, заданные только контекстом, используют один корень зависимостей для восстановления по журналу, состояния выбранной среды выполнения и объединений плагинов. Регрессионный пакет прошёл 71 тест с восемью пропусками из-за хоста.
- Относительные базы данных
MagicMockсоздавалtests/tools/test_subagent_steer.py. Теперь у его mock-родителей явно нет базы данных. Пакет проверки делегирования прошёл без нового мусора. Ранее накопившийся мусор заархивирован вне репозитория. - Bootstrap в Docker включает stdlib-владельцев путей среды выполнения и блокировок, которые PM импортирует до появления сторонних зависимостей. После этого исправления сборки для обеих архитектур прошли.
- Пробы путей в установщике больше не читают отсутствующий лок-файл. Тесты установщика на PowerShell 5.1 и 7 прошли в CI.
- Выбор среды выполнения для сервисов использует общий резолвер выбранного окружения. Факты PM поставляют пути к управляемому Node. Нативные фикстуры используют одноразовые домашние каталоги.
- Апдейтер Windows использует зарегистрированный источник App Installer, если не задано
явное переопределение фида. Он скачивает дескриптор до остановки и открывает локальный
файл. Отключённый протокол
ms-appinstaller:ему не нужен.
Закрытие без E2E
Полный CI-workflow на a27cd5902a446eb4f1e457e09904d75edc616c2e
завершился успешно:
- Linux: 46 041 пройдено, ноль упавших, 492 пропущено. Нестабильных тестов, проходящих только с повтором, нет.
- macOS: 94 пройдено, ноль упавших, 121 пропущен. Нестабильных тестов, проходящих только с повтором, нет.
- Windows: 178 пройдено, ноль упавших, 174 пропущено. Одна фикстура дренажа пайпа прошла только с повтора: её холодный дочерний процесс превысил окно простоя.
Коммит 04182813cfa74111c6e4e10bedcc0f9de6510f55 ограничивает в Windows
параллельность вложенных процессов, не ослабляя проверок фикстуры.
Он же исправляет фрейминг stdin у compute-host: реальный дочерний процесс в Windows
получал первый ход, но не получал последующие управляющие кадры через текстовый поток.
Читатель байтового потока прошёл реальные тесты прерывания и второго хода. Теперь
эти тесты запускаются в дорожке каждой нативной ОС.
Остальные исправления тестов отделяют планирование воркеров от проверяемого поведения. Сжатие ждёт входа в движок, проверки cron наблюдают заблокированную работу, разбор осиротевших процессов проверяет, что блокировка возобновления свободна, а тесты hosted-room наблюдают устойчивое завершение после параллельного снимка. Точечная родительская проверка прошла 638 тестов шлюза/делегирования, 41 тест cron/гигиены, четыре теста изоляции сжатия, 53 теста hosted/compute и 19 тестов протокола реального дочернего процесса/compute. Эти пакеты пересекаются; общей суммой по всему набору они не являются.
Регрессионный тест BOM в браузере падал до исправления чтения и прошёл после него. Его файл прошёл 79 тестов с двумя пропусками из-за хоста. Полные проверки Windows-footgun и совместимости плагинов прошли.
Приёмка бандла (отдельное направление работ)
Реальный bundled MSIX для Windows ARM64, собранный из
07ee9299790e5635fd917da1769f969f14fc8030, установился в одноразовую
Windows Sandbox как версия 0.17.0.0. Зарегистрированное приложение показало UI,
окно About определило встроенную среду выполнения, а собственный упакованный бэкенд
ответил HTTP 200. SHA-256 неподписанного артефакта сборки —
31d3dfb53977e0e8fd662d0ef2475a7be92a31a49d6e514ceed812099867f304.
Тестовая подпись и доверие ограничивались гостевой системой.
Гостевую систему остановили до завершения проверки обновления/перезапуска. Заявлений о приёмке автоматического обновления нет. Кроме того, этот артефакт старше последующей интеграции апстрима и исправления compute-host. Работа над E2E бандла относится к существующему семейству тестов установки/обновления, а не ко второму локальному конвейеру на Sandbox.
Оставшиеся гейты
- Нативный CI на финальном HEAD должен подтвердить последние исправления без падений, проходящих только с повтором.
- Мейнтейнеры должны решить судьбу метки
needs-decisionи после ревью поставитьci-reviewed. Ручной запуск CI пропускает гейты ревью, работающие только для PR. - Автоматическое обновление/перезапуск пакета остаётся за отдельным направлением E2E.
PR #95281 закрыт как заменённый #102765 — по запросу на триаж, чтобы остался один канонический PR по PM. Метка дубликата снята. Метка одобрения самостоятельно не ставилась.
Проверенный CI на a27cd5902a.
Проверка точного HEAD использует тот же workflow на валидационной ветке апстрима.
Более ранние сбои графа GitHub сообщали
resource_exhausted: gitmon refuses to schedule us: fail-fast:network.
Внешний каталог аудита содержит исходные находки, точные выборки тестов, логи каждого прогона, снимки исходников и решения по ревью. Хостовые приложения, доверие к сертификатам и продакшен-сервисы во время того аудита не менялись. Тот аудит не публиковал релиз; это не заявление о последующих прогонах.