Skip to content

[bug] inject-code-style: кап проверяется в байтах, а обрезка режет символы — предупреждение на каждой правке кода, защита не срабатывает #435

Description

@VxxxlBxxxxv

Что происходит

Хук 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. То есть ветка «защита от молчаливой ампутации» отрабатывает вхолостую.

Что из этого следует

  1. Шум. Предупреждение печатается при каждой правке кодового файла у любого пользователя с кириллическим ядром стиля. Выглядит как потеря правил, которой нет.
  2. Защита не работает по назначению. Если ядро действительно перерастёт лимит платформы, обрезка снова не сработает — по той же причине. Комментарий в коде обещает «защиту от молчаливой ампутации правила на лимите PreToolUse», но в кириллице она не срабатывает никогда.
  3. Неизвестно, в чём меряется сам лимит. Комментарий в шапке говорит «PreToolUse additionalContext = 10000 симв», а проверка сравнивает байты. Если лимит платформы в символах, то запас не 9500 из 10000, а 6202 из 10000, и кап втрое строже нужного.

Ожидаемое поведение

Считать и резать в одних единицах. Если лимит платформы в символах — wc -m вместо wc -c. Если в байтах — резать байты с откатом до границы UTF-8.

Шаги воспроизведения

  1. Установка 0.38.3 с русским p05-core.md из поставки.
  2. Отредактировать любой .py / .sh файл.
  3. В stderr хука — предупреждение об обрезке; в впрыснутом контексте ядро целое.

Окружение

  • Версия: 0.38.3 (обновление применено сегодня, дефект воспроизводится после него)
  • Linux (Ubuntu, WSL2)
  • Файлы: .claude/hooks/inject-code-style.sh (строки 48, 111–121), .claude/styles/p05-core.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions