Skip to content

fix(router): v1.2.45 load_hook hot-reload by dep mtime + model_router mirror v6.2 [t_9d220da7] - #68

Open
maximalang wants to merge 1 commit into
codex/company-osfrom
fix/router-hot-reload-mirror
Open

maximalang wants to merge 1 commit into
codex/company-osfrom
fix/router-hot-reload-mirror

Conversation

@maximalang

Copy link
Copy Markdown
Owner

Что

fleet-ops t_9d220da7, два независимых среза в одном атомарном diff:

Срез 1 — hot-reload таблицы правил. router_bridge.load_hook кэшировал exec hook'а по mtime только самого hook-файла, а таблица правил живёт в соседнем model_router.py и попадает в процесс через top-level import model_router → sys.modules. Инцидент 09.10: промоушен ROUTES v6.2 (t_8e388c6e) при живом enforce — долгоживущие процессы продолжали пинить по v4-таблице до рестарта хоста. Теперь сигнатура кэша = mtime hook'а + mtime каждого sibling-dep (_HOOK_DEPS); при инвалидации dep-модули, импортированные ИЗ КАТАЛОГА hook'а, вытесняются из sys.modules до re-exec — свежий exec связывает свежие байты (контракт sys.path.insert(HERE) сохранён). Чужой одноимённый модуль не вытесняется; отсутствующий dep деградирует как раньше (best-effort, канон 7).

Близнец на стороне диспатч-wiring (hermes_cli/kanban_db_dispatch.py::_load_router_module): ветка fix/router-hook-hot-reload в hermes-agent checkout, коммит d56dad782a5 на company/overlay-backup-20261009 (bf5e243c0ef); патч ложится и на live-дерево (git apply --check OK). Публикация hermes-agent — за owner/QA по конвенции оверлея.

Срез 2 — зеркало. scripts/model_router.py v4 → v6.2, байт-в-байт с live profiles/company/scripts/model_router.py: worktree-файл (CRLF, autocrlf=true) sha256 c8864f0380fe942d33603e2c1c4107ebbef35678bb3cde7dbf58c51d90ba9247; закоммиченный blob — LF-форма, sha256 LF 10d4d59333e2cd57260601633a2ff52023fe296abe32c1835b4fafaf24b19607. ROUTER_LIVE_SHA обновлена на LF-форму (тест хэширует _norm). scripts/ROUTER_ACTIVE.json сознательно не тронут — runtime читает каталог scripts профиля.

Тесты

  • tests/test_v1236_router_hook.py уровень 2b: замена ТОЛЬКО model_router.py между двумя decide() в одном процессе меняет rules_sha решения; cache hit без изменений; foreign-модуль переживает eviction.
  • Version-agnostic правки связанных тестов: v6.2 ставит zai/ первой рельсой класса code (status-file тест теперь вычисляет ожидание из таблицы), префикс enforce-комментария следует ROUTER_VERSION динамически.
  • Локально (Windows, uv 0.12.7, CPython 3.12.14): pytest tests/ -q → 916 passed ×2 (plain + HERMES_KANBAN_TASK=t_ci_simulated); uv lock --check OK; compileall src tests scripts integrations OK; fleet-policy --root . drift-check → ok:true; --version → 1.2.45; check_version_uniqueness.py → collision:false (1.2.43 занят файлом PR#65=1.2.44, поэтому 1.2.45).

Пины

1.2.36 → 1.2.45 во всех 7 точках (pyproject, оба plugin.yaml, __init__, uv.lock, hardening-тест, CHANGELOG).

… mirror v6.2 [t_9d220da7]

Slice 1 - hot-reload: router_bridge.load_hook cache signature now covers
sibling dep mtimes (_HOOK_DEPS=(model_router,)); on invalidation deps
imported from the hook's own dir are evicted from sys.modules before
re-exec, so a table-only promotion (ROUTES v6.2, t_8e388c6e) reaches
long-running processes without hook edit or restart (09.10: enforce mode
pinned by the stale v4 table until host restart). Foreign same-name
modules untouched; missing dep degrades as before. Twin dispatch-side
change: hermes-agent branch fix/router-hook-hot-reload (d56dad782a5 on
overlay-backup bf5e243c0ef; patch applies to the live trunk tree).

Slice 2 - mirror: scripts/model_router.py v4 -> v6.2, byte-for-byte with
live profiles/company/scripts/model_router.py (sha256 LF-form 10d4d593..,
CRLF worktree c8864f03..); ROUTER_LIVE_SHA updated; ROUTER_ACTIVE.json
untouched (runtime reads the profile scripts dir).

Tests: level 2b hot-reload cases (model_router swap between two decide()
in one process changes rules_sha; cache hit on unchanged deps; foreign
module survives eviction); zai-first-rail and comment-prefix assertions
made table-version-agnostic. Full suite 916 passed x2 (plain +
worker-env), uv lock --check / compileall / drift-check / --version green.
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.

1 participant