WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-024 · Задача · Инфраструктура · web

[COST-P2] Аудит легаси-моделей по всему коду: инвентаризация хардкодов, правило «шестерёнка > env > дефолт», модернизация дефолтов

Закрыт P2 ведёт: —
Суть
Контекст: 11.08 разбор расходов нашёл виновника (WEB-023, Совет форсил gpt-4o ~18€/день — закрыт: дефолт gpt-5.4-mini, env COUNCIL_OPENAI_MODEL). Глобальный чат переведён на путь тетрадки (явный выбор → preferredModel из шестерёнки → безопасный дефолт). 12.08 волной POLYGRAPH-CODE фактчек-модуль (экстрактор/судья/обоснования) выведен из хардкода gpt-4o-mini в env (FACTCHECK_*_MODEL, дефолты не тронуты, коммит 24200ac8 на agent/polygraph-code-20260812).

НО общего прохода по репо не было — тикет WEB-023 был точечный. Нужно:
1) Инвентаризация ВСЕХ захардкоженных слагов моделей в src (gpt-4o, gpt-4o-mini, 4.1, sonnet, gemini и т.п.), включая PROVIDER_DEFAULT_MODEL-таблицы.
2) По каждому месту — классификация: (а) должен уважать выбор пользователя из шестерёнки (чаты, ресёрч, совет-рыцари), (б) сервисный — конфиг через env с дешёвым современным дефолтом (фоновые судьи, переводы, NER), (в) оправданный хардкод (объяснить почему).
3) Модернизация дефолтов: убрать древние слаги из дефолтов/фолбэков там, где есть современные дешёвые (5.4-mini/nano) — с проверкой совместимости схемы ответа (как каммент в council/modelPolicy.ts про Council schema).
4) Проверить, что ни один фикс НЕ перекрывает пользовательскую шестерёнку (explicit > persisted > default).
Приёмка: таблица «файл:строка → класс (шестерёнка/env/хардкод) → было → стало»; grep по репо не находит небезопасных хардкодов вне таблицы; тесты резолвинга на каждый изменённый путь.

## 2026-08-23 19:20 UTC — read-only аудит запущен (A1 web024, spark): инвентаризация хардкодов моделей + сверка с манифестом-72 + скелет eslint-правила. Ожидаю WEB024_AUDIT_DONE.


## 2026-08-23 19:55 UTC — АУДИТ СДАН (WEB024_AUDIT_DONE), с оговоркой методики
Итоги: 2338 хардкодов model-id (runtime 1343 / тесты 771 / комменты 84 / конфиги+реестры 140); «runtime и НЕ в манифесте» = 791 в 190 файлах. ОГОВОРКА: волна сверялась с monet-w34-activation-manifest.json как файлом (1879 строк JSON) и не отобразила понятие «72 ряда манифе��та»; при этом spend-гейт покрывает ПЛАТНЫЕ call-sites (uncoveredPaidFiles=0 доказан на сборках) — значит 791 «критичных» включают массу неплатных/легаси путей. Ценность аудита: карта для гигиены + кандидаты мёртвого кода. СЛЕДУЮЩИЙ ШАГ (отдельной волной, не сейчас): единый реестр + eslint-запрет литералов моделей вне реестра (скелет в отчёте), миграция сверху вниз по риску. Отчёт: A1 WEB024-AUDIT-REPORT.md.


## 2026-08-23 BOARDSWEEP: IN_PROGRESS-LIVE
- Evidence: updatedAt=2026-08-23T12:31:39.788Z, within 24h; legacy-model audit is current. No status change.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: in_progress.
Доказательства
ТРЕЙЛ (кумулятивно, обновлено 12.08 ~23:10):
РЕЗУЛЬТАТ Ф0: опись = Интел:~/Downloads/WEB024-INVENTORY.md (210 строк; копия M4:/tmp/WEB024-INVENTORY.md). ~100 позиций: 34 класс «шестерёнка», 38 «env/админ-дефолт», 12 оправданных пинов; 16 HOT.
МЕТОД: read-only субагент по M1-дереву ~/Projects/note-clone + ОБЯЗАТЕЛЬНАЯ сверка с M4:board-fix-w5 (M1-чекаут ОТСТАЁТ: роутер чата и Совет там ещё грязные, в свежем дереве уже чистые — любые будущие сверки только против board-fix-w5).
ПОДТВЕРЖДЁННЫЕ HOT (свежий срез): arcadeActions.ts 21×gpt-4o; actions.ts:1431 фолбэк эскалирует ВВЕРХ на gpt-4o; deepResearch/runtime.ts:300 planner=gpt-4o; imageHandler.ts:72; ingest/extractors/image.ts дефолт gpt-4o.
ЗАКРЫТИЕ HOT-ЧАСТИ: волна HOT-kill по спеке WEB-025 §8.4 (точная таблица 16 строк: файл:строка→env→дешёвый дефолт) = коммит 71c03bd6 на ветке agent/admin-defaults-f1-20260812 (board-fix-w5), отчёт HOTKILL-REPORT.md в корне дерева, все 16 DONE.
ОСТАТОК ТИКЕТА: WARM-россыпь (gpt-4o-mini в src/lib/ai/tools/* — закрывается одним env) и протухшие слаги в фолбэках (claude-3-haiku-20240307, gemini-1.5, grok-2, gpt-3.5-turbo — риск 404) — поедут фазами эпика WEB-025 (Ф2+).
СВЯЗАНО: WEB-025 (эпик, спека M4:/Users/milamarty/work/ADMIN-DEFAULTS-EPIC-SPEC.md), WEB-023 (done, Совет).
[2026-08-26 09:25Z] Волна web024 [COST-P2]: инвентаризация хардкодов моделей (файл:строка, модель, путь вызова, платный ли, живой ли код). Безопасные -> на централизованный конфиг; ПЛАТНЫЕ пути НЕ менять без отдельного решения, только в отчёт.
[2026-08-26 10:02Z] КАРТА ДЛЯ НУЛЕВОГО АГЕНТА (как войти в задачу с нуля):
Бокс A1: ssh a1nc. Родительское дерево /home/ubuntu/waves/wt-l40 (из него делаются worktree: git -C /home/ubuntu/waves/wt-l40 worktree add <путь> <ветка>). Запуск работника: ~/codex-a1.sh exec -m gpt-5.6-luna -c model_reasoning_effort=xhigh --dangerously-bypass-approvals-and-sandbox "$(cat <бриф>)"; работа держится в tmux (tmux ls), логи /home/ubuntu/waves/<имя>-codex.log, отчёты /home/ubuntu/waves/<ИМЯ>-REPORT.md, готовность = маркер-ФАЙЛ <ИМЯ>_DONE (не строка в отчёте!).
Ветка web024, worktree wt-web024. Суть (COST-P2): инвентаризация хардкодов имён моделей и легаси-моделей по всему коду. Результат = таблица файл:строка / модель / путь вызова / платный ли путь / живой ли код. Безопасные хардкоды вынести на централизованный конфиг; ⚠️ модель на ПЛАТНОМ пути НЕ менять без отдельного решения — это влияет на стоимость и качество, такие случаи только описать с рекомендацией.
ПРАВИЛА ДОМА: (1) приёмку делает НЕ автор и НЕ прежний приёмщик, со СВОИМИ новыми тестами и обязательным НЕГАТИВНЫМ тестом (проверка, которая всё пропускает, ничего не стоит); (2) отсутствие ошибок != фича жива, нужен сквозной пруф; (3) починка одного слоя != починка фичи; (4) правило 10 — catch без лога и маячка запрещён; (5) монетарные файлы и цены не трогать без отдельного решения; (6) прод/деплой/платные вызовы — только по явному разрешению.

[2026-08-26 14:35Z] ХЕНДОФФ ПОД КОМПАКТ: полное состояние в /Users/annakorin/Downloads/HANDOFF-COMPACT-2026-08-26.md. ⚠️ АВАРИЯ A1 (с ~09:30Z): бокс не пускает по ssh. Волна по этому тикету была запущена на A1 и её состояние НЕИЗВЕСТНО до восстановления. Бриф сохранён — волна перезапускается той же постановкой. Доказано: диск НЕ полон (74%, свободно 52ГБ), IP НЕ забанен (отказ и с M1, и с Pi), инстанс RUNNING, консоль гипервизора отвечает мгновенно; версия — повреждение ФС после жёсткой перезагрузки. Работа на диске не потеряна.
[2026-08-26 12:35Z] Автор web024 (волна пережила аварию A1, отчёт дописан до падения): аудит легаси-моделей — 730 literal-мест / 186 файлов инвентаризованы с полной таблицей (файл:строка, платность, живость); безопасно изменён 1 файл (admin defaults preview: 20 хардкодов -> реестр ADMIN_DEFAULT_NAMESPACE_REGISTRY, fail-fast на отсутствие entry); платные пути НЕ тронуты; retired-кандидаты (gpt-4o*, gemini-2.0-flash по Google deprecation 2026-06-01) помечены для product/cost решения. Отчёт: A1 /home/ubuntu/waves/WEB024-REPORT.md. Маркера _DONE нет (авария) — принять независимой приёмкой. -> review.
[2026-08-26 21:55Z] acc024 NO-GO: (1) эквивалентность опровергнута — 6/20 пар namespace/key из editor-actions НЕ имеют entry в реестре: GET /api/admin/defaults теперь бросает и теряет preview (тихо, через внешний catch); (2) инвентаризация ненадёжна: в выборке 20 строк 8 ошибочны, обратная выборка 9/10, пропущен целый src/lib/ai/serverModelDefaults.ts с 14 литералами. Нужен web024fix: добить 6 registry-entries (или вернуть литералы), починить инвентарь. В очереди ПОСЛЕ ролевого спринта (owner: роли срочно).
[2026-08-27 18:50Z] acc024b: продуктово-критичная часть ПРИНЯТА (route-regression 22/22 preview, 6 дыр реестра закрыты, serverModelDefaults 14 мест, обратная выборка 10/10, client-hardcodes внесены, eslint rc=0 — ноль замен моделей на платных путях). ЯВНАЯ ГРАНИЦА (no silent caps): полная таблица '719 мест' — это candidate-scan (верхняя граница), НЕ курированная инвентаризация: независимая выборка 20 строк дала 11 корректных / 9 шум (mock/status/UI ошибочно как paid). Для COST-P2 аудита продуктовая часть достаточна; курирование таблицы — отдельный follow-up ЕСЛИ owner захочет (не блокирует релиз). Решение owner по курированию — на потом; продуктовая правка в набор посадки.
[2026-08-27 20:29:19Z tickacc5] ВЕРДИКТ: частично доказано
Что проверил: открыл WEB024-REPORT.md и latest acc024b evidence; проверил bounded scan, route regression 22/22, serverModelDefaults, reverse checks и targeted eslint; paid/provider paths не запускал.
Что увидел: product part accepted: 20 literals вынесены в registry, route regression 22/22 и eslint зелёные. Full scan оставляет 719 candidate sites в 184 files; sample 20 дал 11 корректных classifications и 9 noise, report называет curation optional. Это не полная all-code inventory; current l61 deployment не проверен.
Отрицательный тест: rg в admin defaults route не находит model literals, но full repository scan по-прежнему находит 719 candidates; отсутствие unsafe hardcodes вне registry/table не подтверждено.
Чего не хватает: curated review/owner disposition для 719 candidates или принятого scope исключений, current l61 source/deploy verification и evidence безопасности оставшихся live/paid literals; paid replacement не запускать без отдельного решения.

[2026-08-27 ~22:56Z ПОСАДКА l63 — ВЫШЛО НА ПРОД]
Релиз: /home/pi/note-clone/releases/arm64-l63-20260827T225328Z, коммит 0a4f8c87f993bd7ecb30860ed25bb029407c3286, артефакт sha256 aa07b977553c20cb0abafd8fe51771c67399dda864997c86b3e24d7073cbc6cc (207 404 319 байт). Каталог запуска /home/pi/note-clone/shared/run/l63-0a4f8c87. Откат: /home/pi/l62-standalone-artifact.conf.rollback.
Сборка прошла ВСЕ гейты. Родословная: предыдущий прод b3b03cfd (l62: роли + движок Gate D) — ПРЕДОК, проверено merge-base до сборки; следовательно движок и роли НЕ откачены. Паритет флагов: 37 ключей NEXT_PUBLIC_*, расхождений 0/0, отдача JS 1126 — ровно как в l62; GATED_WRITER вшит "1", SHADOW_W1 "0", тёмные семейства MUTATING_AI/COLLAB — 0 совпадений.
СЛЕД В БАНДЛЕ ДОКАЗАН ДЛЯ ВСЕХ ЧЕТЫРЁХ (отдельный гейт: нет следа = провал сборки): движок (nonbreakingspace ×8, insertionOffset ×8, insertedText ×4); WEB-390/391 (factcheck.verdict.sourceCount.one, sourceCountLabel, «based on {count} source»); WEB-019 (age-affirmation в странице/маршруте/middleware, «stale age claim» ×2); WEB-024 (editor-actions и «Admin defaults preview spec has no model-route registry entry»).
Подпись: локально ключом owner (доверенность 26.08), отпечаток 0b83e0d3… сошёлся; verify — позитив PASS + два негатива (подмена artifactSha256, перевёрнутый байт подписи) отвергнуты.
Доставка: VM -> M4 -> M1 -> Pi, sha сверена на всех четырёх хопах.
ПРОВЕРКА ПОСАДКИ: systemctl active; /api/ready/paid = ok, paidReady=true, enforce_ready, failures=[]; /api/db/health 200; метка sw.js ИЗ ПРОЦЕССА v4-0a4f8c87 == НА ДИСКЕ v4-0a4f8c87; публичный https://nb.wool2.online/sw.js = v4-0a4f8c87, health 200. Посадка прошла С ПЕРВОГО РАЗА.
УРОК: сплошная сверка каталога запуска поймала МОЮ СОБСТВЕННУЮ ошибку — регулярное выражение ключа `[A-Z_]+` не ловит имена с цифрами, поэтому строки SPEND_*_SHA256 молча не проверялись (печаталось 2 значения вместо 7), а сверка при этом выглядела зелёной. Исправлено на `[A-Z0-9_]+` + обязательный вывод «всего проверено: N». Записано в память.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-024","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-27T22:57:03.254Z