proxy-client — личный клиент для себя и друзей. Убрана защита от сценариев, которые на личной машине не случаются; оставлена защита от реальных. Принцип записан в начале спецификации.
proxy-client start
- проверка «тот ли процесс»: boot_id + время старта + /proc/PID/exe + argv супервизора
+ проверка «тот ли процесс»: /proc/PID/exe у Xray, cmdline у супервизора
- состояние «не удалось подтвердить, удалите файлы вручную»
+ state.json: pid'ы, путь к xray, адрес и порт
proxy-client install
- три уровня ограничений размера, строгий разбор .dgst, блокировка, отказ при работающем Xray
SHA-256 по .dgst, атомарная замена, --replace не пишет через симлинк
+ при работающем Xray — напоминание перезапустить start
proxy-client/install.sh
- Stow или ln -s, отказ при ~/.local-симлинке, разбор «повреждённого» блока .bashrc
+ три прямые ссылки; чужие файлы не трогает; блок в .bashrc, если нет маркера
Ошибки о файлах называют полный путь и готовую команду: файл профиля /home/…/default.url доступен другим пользователям; выполните: chmod 600 /home/…/default.url.
Файл
Было
Стало
proxy-client/.local/bin/proxy-client
1569
944
proxy-client/install.sh
216
93
Python-тесты
2479
988
Shell-тесты
592
322
Спецификация
578
220
Тесты живут только в пяти местах: команда proxy-client, разбор ссылки (parse_vless + build_xray_config), установка Xray с подставным скачивателем, функции Bash с поддельным PROXY_CLIENT_BIN, установщик пакета во временном HOME. Подмена внутренних функций и проверки порядка вызовов убраны.
Evidence
Before:tests/test_proxy_client_full.sh — около 2,5 мин, требует uv и stow; 25 тестов managed-режима по ~60 с, разбор ссылок через полный запуск Xray. After: 36 с всего: 48 Python-тестов на текущем python3 и 48 под Python 3.8 (через uv, если есть), обе shell-сюиты — PASS; stow не нужен.
Слепое ревью Codex (gpt-6-astra, high): 5 находок — смена порта в конфиге при работающем Xray (status врал), три сохраняемые гарантии без тестов, тесты конфига в обход CLI, зависимость теста от доступности Hiddify, ошибки разбора без пути к файлу. Все исправлены, перепроверка: RECHECK: ALL_CLOSED.
Каждый новый тест проверен порчей кода:
убрать check_xray_version из start -> test_wrong_xray_version_is_refused_before_launch: красный
печатать pbk в сводке -> test_reality_secrets_stay_out_of_start_output: красный
не узнавать «xray (deleted)» -> test_replaced_xray_file_is_still_recognised_and_stopped: красный
не сверять порт конфига и state.json -> test_changed_machine_port_is_refused_while_xray_runs: красный
Настоящий Xray 26.3.27: сгенерированные конфиги REALITY и XHTTP с mlkem768x25519plus проходят xray run -test; start → status → stop и Ctrl+C отработаны вживую.
Merge Danger
Door: two-way
Откат — git revert merge-коммита. state.json совместим в обе стороны по нужным ключам: Xray, запущенный старой версией, новая видит и останавливает. Новый код применяется при следующем start.
Blast Radius: proxy-client
Затронуты только пакет proxy-client, его тесты и спецификация. Машинный конфиг и профили прежние; Stow корневого установщика dotfiles не менялся.
## Summary
proxy-client — личный клиент для себя и друзей. Убрана защита от сценариев, которые на личной машине не случаются; оставлена защита от реальных. Принцип записан в начале спецификации.
```diff
proxy-client start
- проверка «тот ли процесс»: boot_id + время старта + /proc/PID/exe + argv супервизора
+ проверка «тот ли процесс»: /proc/PID/exe у Xray, cmdline у супервизора
- состояние «не удалось подтвердить, удалите файлы вручную»
+ state.json: pid'ы, путь к xray, адрес и порт
proxy-client install
- три уровня ограничений размера, строгий разбор .dgst, блокировка, отказ при работающем Xray
SHA-256 по .dgst, атомарная замена, --replace не пишет через симлинк
+ при работающем Xray — напоминание перезапустить start
proxy-client/install.sh
- Stow или ln -s, отказ при ~/.local-симлинке, разбор «повреждённого» блока .bashrc
+ три прямые ссылки; чужие файлы не трогает; блок в .bashrc, если нет маркера
```
Ошибки о файлах называют полный путь и готовую команду: `файл профиля /home/…/default.url доступен другим пользователям; выполните: chmod 600 /home/…/default.url`.
| Файл | Было | Стало |
|---|---:|---:|
| `proxy-client/.local/bin/proxy-client` | 1569 | 944 |
| `proxy-client/install.sh` | 216 | 93 |
| Python-тесты | 2479 | 988 |
| Shell-тесты | 592 | 322 |
| Спецификация | 578 | 220 |
Тесты живут только в пяти местах: команда `proxy-client`, разбор ссылки (`parse_vless` + `build_xray_config`), установка Xray с подставным скачивателем, функции Bash с поддельным `PROXY_CLIENT_BIN`, установщик пакета во временном HOME. Подмена внутренних функций и проверки порядка вызовов убраны.
## Evidence
- **Before:** `tests/test_proxy_client_full.sh` — около 2,5 мин, требует `uv` и `stow`; 25 тестов managed-режима по ~60 с, разбор ссылок через полный запуск Xray.
**After:** 36 с всего: 48 Python-тестов на текущем python3 и 48 под Python 3.8 (через `uv`, если есть), обе shell-сюиты — PASS; `stow` не нужен.
- Слепое ревью Codex (`gpt-6-astra`, high): 5 находок — смена порта в конфиге при работающем Xray (`status` врал), три сохраняемые гарантии без тестов, тесты конфига в обход CLI, зависимость теста от доступности Hiddify, ошибки разбора без пути к файлу. Все исправлены, перепроверка: `RECHECK: ALL_CLOSED`.
- Каждый новый тест проверен порчей кода:
```text
убрать check_xray_version из start -> test_wrong_xray_version_is_refused_before_launch: красный
печатать pbk в сводке -> test_reality_secrets_stay_out_of_start_output: красный
не узнавать «xray (deleted)» -> test_replaced_xray_file_is_still_recognised_and_stopped: красный
не сверять порт конфига и state.json -> test_changed_machine_port_is_refused_while_xray_runs: красный
```
- Настоящий Xray 26.3.27: сгенерированные конфиги REALITY и XHTTP с `mlkem768x25519plus` проходят `xray run -test`; start → status → stop и Ctrl+C отработаны вживую.
## Merge Danger
**Door:** two-way
Откат — `git revert` merge-коммита. `state.json` совместим в обе стороны по нужным ключам: Xray, запущенный старой версией, новая видит и останавливает. Новый код применяется при следующем `start`.
**Blast Radius:** proxy-client
Затронуты только пакет proxy-client, его тесты и спецификация. Машинный конфиг и профили прежние; Stow корневого установщика dotfiles не менялся.
- install.sh ставит три прямые ссылки без Stow; чужие файлы не трогает
и перечисляет все конфликты сразу; ~/.local и ~/.config могут быть
ссылками; блок в ~/.bashrc дописывается, если нет маркера.
- proxy_on читает вывод proxy-client env без временного файла.
- Тесты Bash-функций работают через поддельный PROXY_CLIENT_BIN.
- test_proxy_client_full.sh запускает только тесты proxy-client,
прогон под Python 3.8 — если есть uv.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Проверка «тот ли процесс»: /proc/PID/exe для Xray и cmdline для
супервизора вместо boot_id, времени старта и разбора argv; нет больше
состояния «не удалось подтвердить, удалите файлы вручную».
- Установка Xray: SHA-256 и атомарная замена остаются; без ограничений
размера, строгого разбора .dgst и блокировки на время установки.
- Разбор ссылки: extra — обычный json.loads; allowInsecure/insecure
игнорируются с предупреждением.
- Ошибки о файлах называют полный путь и готовую команду
(chmod 600 для профиля, rm для битого state.json).
- Тесты: разбор ссылок — табличные без запуска процессов, по одному
запуску на сценарий управляемого Xray; без подмены внутренних функций.
Код 1569 → 925 строк, тесты 2479 → 895, прогон 63 → 9 с.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Спецификация 603 → 220 строк: без описаний снятых защит и без пересказа
кода и README; остались задача, границы, решения с причинами и риски.
В README раздел «Изменение кода» ведёт к спецификации и тестам.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- state.json снова хранит адрес и порт: при смене конфига у работающего
Xray status/env/run отказывают и советуют перезапустить start.
- Ошибки разбора ссылки называют файл профиля.
- Тесты: отказ start при чужой версии Xray, ключи REALITY не попадают
в вывод, Xray узнаётся после замены файла; машинный конфиг проверяется
через CLI; тест пути по умолчанию не зависит от доступности Hiddify.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
proxy-client — личный клиент для себя и друзей. Убрана защита от сценариев, которые на личной машине не случаются; оставлена защита от реальных. Принцип записан в начале спецификации.
Ошибки о файлах называют полный путь и готовую команду:
файл профиля /home/…/default.url доступен другим пользователям; выполните: chmod 600 /home/…/default.url.proxy-client/.local/bin/proxy-clientproxy-client/install.shТесты живут только в пяти местах: команда
proxy-client, разбор ссылки (parse_vless+build_xray_config), установка Xray с подставным скачивателем, функции Bash с поддельнымPROXY_CLIENT_BIN, установщик пакета во временном HOME. Подмена внутренних функций и проверки порядка вызовов убраны.Evidence
tests/test_proxy_client_full.sh— около 2,5 мин, требуетuvиstow; 25 тестов managed-режима по ~60 с, разбор ссылок через полный запуск Xray.After: 36 с всего: 48 Python-тестов на текущем python3 и 48 под Python 3.8 (через
uv, если есть), обе shell-сюиты — PASS;stowне нужен.gpt-6-astra, high): 5 находок — смена порта в конфиге при работающем Xray (statusврал), три сохраняемые гарантии без тестов, тесты конфига в обход CLI, зависимость теста от доступности Hiddify, ошибки разбора без пути к файлу. Все исправлены, перепроверка:RECHECK: ALL_CLOSED.mlkem768x25519plusпроходятxray run -test; start → status → stop и Ctrl+C отработаны вживую.Merge Danger
Door: two-way
Откат —
git revertmerge-коммита.state.jsonсовместим в обе стороны по нужным ключам: Xray, запущенный старой версией, новая видит и останавливает. Новый код применяется при следующемstart.Blast Radius: proxy-client
Затронуты только пакет proxy-client, его тесты и спецификация. Машинный конфиг и профили прежние; Stow корневого установщика dotfiles не менялся.