8.1 KiB
Промт: бэкенд-сессия — консолидация конфига (drift из doc-аудита, 2026-07-05)
Ты — бэкенд-сессия TextMachine, зона backend/. Оркестратор прогнал read-only аудит доков↔кода и причесал доки; ниже — 4 конфиг-расхождения твоей зоны + фикс капабилити + подтверждение пробы. Каждый пункт с указателем (сверь по своему коду — номера строк из аудита, могли сместиться). НЕ читай .env. Источник истины по решениям — architecture/05-decisions-log.md.
⚠ ГЛАВНОЕ — переворот находки аудита: grok-4.3 reasoning ОТКЛЮЧАЕТСЯ
Аудит (и exp08) считали, что grok-4.3 форсит reasoning и надо менять слаг на grok-4.20-0309-non-reasoning. Это НЕВЕРНО — перепроверено по xAI docs (docs.x.ai/developers/model-capabilities/text/reasoning, 05.07):
- grok-4.3 принимает
reasoning_effort∈ {none, low, medium, high};none= 0 thinking-токенов. - Дефолт =
low. Не послал параметр явно → grok думает (вот почему exp08's «off by omission» не сработал). - Chat Completions: плоский
reasoning_effort:"none". Responses API: вложенныйreasoning.effort:"none". exp08 слалreasoning_effort:low(не off) и вложенныйextra_body.reasoning.effort:none(форма Responses-API) → на Chat Completions off-switch не отправлялся ни разу. grok-4.20-0309-non-reasoningпод капотом = grok-4.3 +effort:none(мигрированные слаги, ретайр 15.05.2026).
Вывод: слаг НЕ менять. Редактор = grok-4.3, слать reasoning_effort:"none" ЯВНО.
Задачи
1. capability.go — ReasoningNone конфлейтит два ПРОТИВОПОЛОЖНЫХ поведения (F2)
backend/internal/llm/capability.go (~:52-56) трактует control=none как «off by omission (DeepSeek / xAI-Grok)» — это неверно объединяет два провайдера, которым нужна ОБРАТНАЯ обработка:
- DeepSeek: omission НАМЕРЕННЫЙ — держит thinking ON (дефолт DeepSeek = ON). У DeepSeek-flash thinking ОБЯЗАН оставаться ON, иначе он эхает исходник (
echoMineViolation— та самая мина, ради которой строилась Веха 2.5). Пропуск параметра ≠ «дефолт off». НЕ добавлять DeepSeek явное отключение thinking. - grok: omission даёт
low(thinking ON), а редактору нужен OFF → grok должен ЭМИТИТЬ явныйreasoning_effort:"none".
Развести: DeepSeek → keep-default (параметр не слать, thinking остаётся ON); grok → explicit-none (слать reasoning_effort:none). Единый ReasoningNone=«off by omission» на оба — источник будущей ошибки (сессия «правильно» отключит DeepSeek-thinking и взведёт эхо-мину).
2. models.yaml grok-4.3 (F2)
backend/configs/models.yaml (~:110 заметка «0 reasoning-токенов», ~:113 reasoning.control: none). control:none = off-by-omission → на деле low. Поставить режим, шлющий explicit reasoning_effort:none; заметку уточнить: «reasoning=0 ТОЛЬКО при явном reasoning_effort:none; дефолт grok = low». Reasoning у xAI аддитивен (reasoning: additive): при none → 0; при on → billed = completion+reasoning.
3. Редактор всё ещё glm-5 (F3)
Переключить только edit-стадию на grok-4.3 с reasoning_effort:none (ратифицированный дефолт D1/D3). Цели: pipeline-c1.yaml (~:44, edit) и edit-стадия pipeline-c2.yaml. НЕ трогать pipeline-c2.yaml:34 — это стадия select (Gemini-слот Фазы 2), не редактор. Прим.: glm-5 в конфиге — плейсхолдер (exp04 мерил glm-4.6, не glm-5); дефолт grok обоснован рейтингом exp04, а не «glm-5 слаб». Свитч гейтится чистым xAI-ключом без data-sharing (реальные книги через промо-аккаунт нельзя). models.yaml:116-117 признаёт отложенное переключение — закрыть.
4. Anthropic price-litter (F5)
backend/configs/models.yaml (~:7) — в шапке price-source ещё строка Anthropic pricing URL, хотя провайдер удалён (:119-120). Убрать.
5. Escalation-заглушки (F10)
pipeline-c1.yaml (:68-69) / :61-62) — цепочки pipeline-c2.yaml ([kimi-k2.6]-заглушки. Ратифицированная D3-цепочка: канал A — DeepSeek V4 Pro → GLM-5.1 → Gemini 3.1 Pro; канал B — Grok 4.3. В models.yaml НЕ заведены провайдеры gemini/openai и модели deepseek-v4-pro/glm-5.1/gemini-3.1-pro. Либо завести их (провайдер+модель+цена+capability: Gemini mandatory-thinking thinking_budget:0→400 / max_tokens по 00-provider-quirks.md (≥8000 для Gemini 3.1 Pro; НЕ спутать с Kimi ≥16000); deepseek-v4-pro подтверждён живьём $0.435/$0.87) и подставить D3-цепочку, либо явно пометить [kimi-k2.6] интеримом (чтобы заглушку не приняли за контракт). Слаги/квирки — provider-wiring память + experiments/00-provider-quirks.md.
6. PROGRESS [НУЖНО РЕШЕНИЕ]-маркеры (F18)
Оба заголовка [НУЖНО РЕШЕНИЕ] в docs/PROGRESS.md отвечены и ратифицированы (05-decisions-log D1–D7), но не помечены RESOLVED → grep читает как открытые. Пометь «РЕШЕНО → <ссылка на ответ>». Нюансы: (а) фраза «НУЖНО РЕШЕНИЕ» есть не только в заголовках, но и в строках-ответах/back-ref'ах — помечай именно заголовки-вопросы, не полагайся на один grep; (б) один из двух заголовков — оркестраторский блок, вложенный в §Бэкенд (владение спорное) → его оставь оркестратору, тронь только чисто-бэкендовый. (Строки сдвинулись после вставки CURRENT-STATE — ищи по фразе, не по номеру.)
Проба (НЕ гейт)
Eval УЖЕ переснял (05.07): на grok-4.3 / Chat Completions плоский reasoning_effort:"none" → usage.reasoning_tokens=0 ✅ (дефолт→444, low→384, вложенный extra_body.reasoning.effort молча проглочен). Рабочая форма записана в 00-provider-quirks.md. Ты — подтверди то же в своём адаптере при wiring + additive-биллинг. Это НЕ гейт: контракт уже известен из xAI docs, задачи 1–2 делать не дожидаясь пробы.
Приёмка
- grep «reasoning=0» больше не врёт: редактор grok-4.3 шлёт explicit
none, проба показывает 0 reasoning-токенов. - edit-стадия = grok-4.3, не glm-5.
models.yamlбез anthropic-строки; escalation = D3-цепочка или явный интерим.- Отчёт оркестратору на внешнее ревью (как обычно).