Что происходит
Хук inject-code-style.sh на каждой правке кодового файла печатает в stderr:
inject-code-style: context 9731 > cap 9500 — обрезаю по предложению
Обрезки при этом не происходит: проверка считает байты, а срез — символы.
Причина
CTX_LEN=$(printf '%s' "$CONTEXT" | wc -c | tr -d ' ') # байты
if [ "$CTX_LEN" -gt "$HARD_CAP" ]; then # 9731 > 9500 → вход в ветку
echo "inject-code-style: context $CTX_LEN > cap $HARD_CAP — обрезаю по предложению" >&2
CONTEXT=$(CTX="$CONTEXT" CAP="$HARD_CAP" python3 - <<'PY'
...
clipped = ctx[:cap] # СИМВОЛЫ
Склейка заголовка и p05-core.md на 0.38.3:
байт: 9730
символов: 6202
хард-кап: 9500
Текст кириллический, поэтому байт вдвое больше символов. Условие срабатывает по байтам (9730 > 9500), а ctx[:9500] режет по символам — строка короче среза, и clipped == ctx. То есть ветка «защита от молчаливой ампутации» отрабатывает вхолостую.
Что из этого следует
- Шум. Предупреждение печатается при каждой правке кодового файла у любого пользователя с кириллическим ядром стиля. Выглядит как потеря правил, которой нет.
- Защита не работает по назначению. Если ядро действительно перерастёт лимит платформы, обрезка снова не сработает — по той же причине. Комментарий в коде обещает «защиту от молчаливой ампутации правила на лимите PreToolUse», но в кириллице она не срабатывает никогда.
- Неизвестно, в чём меряется сам лимит. Комментарий в шапке говорит «PreToolUse additionalContext = 10000 симв», а проверка сравнивает байты. Если лимит платформы в символах, то запас не 9500 из 10000, а 6202 из 10000, и кап втрое строже нужного.
Ожидаемое поведение
Считать и резать в одних единицах. Если лимит платформы в символах — wc -m вместо wc -c. Если в байтах — резать байты с откатом до границы UTF-8.
Шаги воспроизведения
- Установка 0.38.3 с русским
p05-core.md из поставки.
- Отредактировать любой
.py / .sh файл.
- В stderr хука — предупреждение об обрезке; в впрыснутом контексте ядро целое.
Окружение
- Версия: 0.38.3 (обновление применено сегодня, дефект воспроизводится после него)
- Linux (Ubuntu, WSL2)
- Файлы:
.claude/hooks/inject-code-style.sh (строки 48, 111–121), .claude/styles/p05-core.md
Что происходит
Хук
inject-code-style.shна каждой правке кодового файла печатает в stderr:Обрезки при этом не происходит: проверка считает байты, а срез — символы.
Причина
Склейка заголовка и
p05-core.mdна 0.38.3:Текст кириллический, поэтому байт вдвое больше символов. Условие срабатывает по байтам (9730 > 9500), а
ctx[:9500]режет по символам — строка короче среза, иclipped == ctx. То есть ветка «защита от молчаливой ампутации» отрабатывает вхолостую.Что из этого следует
Ожидаемое поведение
Считать и резать в одних единицах. Если лимит платформы в символах —
wc -mвместоwc -c. Если в байтах — резать байты с откатом до границы UTF-8.Шаги воспроизведения
p05-core.mdиз поставки..py/.shфайл.Окружение
.claude/hooks/inject-code-style.sh(строки 48, 111–121),.claude/styles/p05-core.md