Skip to content

feat(autocompact): --explain говорит, почему нудж молчит и что поставить (1.2.16) - #43

Merged
jojoprison merged 1 commit into
mainfrom
feat/window-hint
Aug 21, 2026
Merged

jojoprison merged 1 commit into
mainfrom
feat/window-hint

Conversation

@jojoprison

Copy link
Copy Markdown
Owner

Ответ на вопрос «можно зашить рабочее значение autoCompactWindow в плагин по умолчанию?» — нет, и вместо дефолта плагин теперь умеет объяснить.

Почему не дефолт

Замер по таблице моделей в бинаре 2.1.238:

Окно модели Моделей Что сделал бы дефолт 493000
200 000 8 из 14 min(493k, 200k) — не действует вовсе
1 000 000 native 6 из 14 вдвое урезал бы рабочий контекст без спроса

Плюс autoCompactWindow живёт в ~/.claude/settings.json — это настройка Claude Code, и плагин, который её молча правит, перестаёт быть non-destructive.

Что вместо

Хук autocompactNudge по построению отказывает молча: не удалось установить окно — молчит, и это неотличимо от «предупреждать не о чем». Теперь есть место, которое проговаривает разницу:

python3 plugins/mnemo/scripts/context-window.py --explain

Отдаёт resolved / source (env | settings | cache | model-default | disabled) / window / compacts_at / reserve / clamped плюс готовую подсказку. health зовёт его новым Step 7.55 (только когда нудж включён), setup передаёт hint при включении. Read-only: сообщает, что поставить, и никогда не пишет.

Два факта, на которых ошибаются

  1. Порог — это не окно. Компакт наступает на window − min(max_output, 20000) − 13000, на 33k раньше края. Хочешь компакт на 460000 — ставь 493000; поставишь 460000 — получишь 427000.
  2. Значение выше окна модели не делает ничего. На 200k-модели 460000 резолвится в 200000 и выглядит рабочей настройкой. Отдаётся флагом clamped: true.

Формула перепроверена на 2.1.238 самостоятельно: USe возвращает окно − min(Mor(e), avp) при avp=20000, Oor = Mli(USe(…)) вычитает ещё 13000, и именно Oor подставляется в autoCompactThreshold. Соседняя dRa() с долей 0.2 — precompute-механизм, не автокомпакт.

Гейт

Мутант-килл 5 из 5 (шестой прогон сначала дал выжившего — оказалось, мутировано не то место: одноимённая строка встречается дважды, замена попала в resolve_window; перемер с точным якорем убил). 17 сюит зелёные, context-window 31 → 37 тестов, lint PASSED, verify-release для v1.2.16.

🤖 Generated with Claude Code

Владелец спросил, можно ли зашить рабочее значение autoCompactWindow в плагин
по умолчанию. Нет: это настройка Claude Code, а не mnemo, и замер по таблице
моделей в бинаре 2.1.238 показывает, почему дефолт был бы вреден — у 8 моделей
из 14 окно 200k, где любое большее значение не действует вовсе, а у остальных 6
(нативный 1M) «разумный» дефолт вдвое урезал бы рабочий контекст без спроса.

Вместо дефолта — диагностика. Хук autocompactNudge по построению отказывает
МОЛЧА: не удалось установить окно — молчит, и это неотличимо от «предупреждать
не о чем». Теперь есть место, которое проговаривает разницу вслух.

- context-window.py --explain (read-only, ничего не пишет): resolved / source
  (env | settings | cache | model-default | disabled) / window / compacts_at /
  reserve / clamped + готовая человеческая подсказка.
- health: новый Step 7.55, гоняется ТОЛЬКО когда hooks.autocompactNudge = true.
- setup: при включении нуджа передаёт пользователю тот же hint.
- config-schema: формула записана в схему.

Два факта, на которых люди ошибаются, теперь называются прямо:

1. Порог — это НЕ окно. Компакт наступает на `window - min(max_output, 20000)
   - 13000`, то есть на 33k раньше края. Хочешь компакт на 460000 — ставь
   493000; поставишь 460000 — получишь 427000.
2. Значение выше контекстного окна модели не делает НИЧЕГО. На 200k-модели
   460000 резолвится в 200000 и выглядит при этом как рабочая настройка
   (отдаётся флагом clamped: true).

Формула перепроверена на бинаре 2.1.238 самостоятельно, а не по пересказу:
USe(e,t) возвращает `окно - min(Mor(e), avp)` при avp=20000, Oor = Mli(USe(...))
вычитает ещё 13000, и именно Oor подставляется в autoCompactThreshold. У
claude-opus-5 в таблице `context:{window:1e6, native_1m:!0}` и
`max_output_tokens:{default:64000}`, отсюда резерв ровно 33k.
🛑 Рядом лежит dRa() с `Math.min(e - e*precomputeBufferFraction, ...)` при доле
0.2 — это precompute-механизм, НЕ автокомпакт; спутать значит ошибиться на 20%
окна.

Мутант-килл: 5 правок, 5 адресных падений. Шестой прогон сначала показал
выжившего — оказалось, мутировано не то место: строка `if not
autocompact_enabled(cwd)` встречается дважды, и замена попала в resolve_window,
чей тест живёт в другом файле. Перемер с якорем внутри explain и прогоном обеих
сюит: убит.

Гейт: 17 сюит зелёные (context-window 31 -> 37), lint PASSED, verify-release
для v1.2.16 подтверждён.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jojoprison
jojoprison merged commit f3681a9 into main Aug 21, 2026
2 checks passed
@jojoprison
jojoprison deleted the feat/window-hint branch August 21, 2026 01:03
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