HUB-1: зелёный main — граница workspace и UTF-8 в verification #2

Merged
ochenstarik-ui merged 10 commits from hub/audit-p0-green-main into main 2026-09-03 17:59:50 +00:00
ochenstarik-ui commented 2026-09-02 18:03:28 +00:00 (Migrated from github.com)

Задание agents/inbox/2026-09-02-HUB1-audit-p0-green-main.md, P0-1.

Обе причины красного CI воспроизведены локально до правки и проверены после.

1. Инвариант A37 не держался на Windows

rm -rf $HOME/.hermes проходил мимо защиты: переменной HOME в окружении
Windows нет, expandvars оставлял $HOME как есть, путь переставал быть
абсолютным, склеивался с каталогом проекта и оказывался «внутри разрешённого
корня». Зеркальная дыра на Linux: %USERPROFILE%\.hermes и C:\Windows
проходили ровно так же.

Разбор пути сведён в один конвейер: классификация диалекта shell по самой
команде (а не по системе-хозяину) → раскрытие распознанных переменных, с
разрешением HOME/USERPROFILE в домашний каталог даже когда их нет в
окружении → нормализация разделителей → канонизация → сравнение с защищёнными
корнями. Каждый несостоявшийся шаг закрывает проход: непроверяемый путь не
считается разрешённым. Через тот же конвейер пропущены validate_path,
is_forbidden_path, is_inside_allowed_root.

2. UTF-8 ронял verification-скрипт

UnicodeEncodeError на cp1252-консоли Windows-раннера — падал вывод, не логика.
Общий помощник console_encoding.force_utf8_output ставит UTF-8 на потоки и
оставляет запасной путь, если поток перекодировать нельзя. Той же реализацией
заменён самодельный блок в cli_commands.

Проверено

  • scripts/verify_multi_provider_router.py: 10/10 под PYTHONIOENCODING=cp1252 и под ascii (до правки — падал на строке 63).
  • Новые тесты воспроизводят окружение обеих систем на любой из них. На прежнем guard они падают ровно на дефекте из CI — 6 failed; на новом проходят.
  • Тесты Linux: 739 → 755 passed, 2 skipped, 4 deselected.
  • ruff check . — чисто.

Остальные P0 аудита (release gate, publication gate, CSRF на /api/action) — в
работе, отдельными коммитами: по заданию каждый сначала подтверждается
исполнением.

🤖 Generated with Claude Code

Задание `agents/inbox/2026-09-02-HUB1-audit-p0-green-main.md`, P0-1. Обе причины красного CI воспроизведены локально до правки и проверены после. ## 1. Инвариант A37 не держался на Windows `rm -rf $HOME/.hermes` проходил мимо защиты: переменной `HOME` в окружении Windows нет, `expandvars` оставлял `$HOME` как есть, путь переставал быть абсолютным, склеивался с каталогом проекта и оказывался «внутри разрешённого корня». Зеркальная дыра на Linux: `%USERPROFILE%\.hermes` и `C:\Windows` проходили ровно так же. Разбор пути сведён в один конвейер: классификация диалекта shell по самой команде (а не по системе-хозяину) → раскрытие распознанных переменных, с разрешением `HOME`/`USERPROFILE` в домашний каталог даже когда их нет в окружении → нормализация разделителей → канонизация → сравнение с защищёнными корнями. Каждый несостоявшийся шаг **закрывает проход**: непроверяемый путь не считается разрешённым. Через тот же конвейер пропущены `validate_path`, `is_forbidden_path`, `is_inside_allowed_root`. ## 2. UTF-8 ронял verification-скрипт `UnicodeEncodeError` на cp1252-консоли Windows-раннера — падал вывод, не логика. Общий помощник `console_encoding.force_utf8_output` ставит UTF-8 на потоки и оставляет запасной путь, если поток перекодировать нельзя. Той же реализацией заменён самодельный блок в `cli_commands`. ## Проверено - `scripts/verify_multi_provider_router.py`: **10/10** под `PYTHONIOENCODING=cp1252` и под `ascii` (до правки — падал на строке 63). - Новые тесты воспроизводят окружение обеих систем на любой из них. На прежнем guard они падают ровно на дефекте из CI — **6 failed**; на новом проходят. - Тесты Linux: **739 → 755 passed, 2 skipped, 4 deselected**. - `ruff check .` — чисто. Остальные P0 аудита (release gate, publication gate, CSRF на `/api/action`) — в работе, отдельными коммитами: по заданию каждый сначала подтверждается исполнением. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No description provided.