WEB-434 · Дефект · Чат · web
Роли C6: Совет не набирает двух разных участников на проде (0/3)
Закрыт
P1 · важно
ведёт: —
Суть
# Замер
Батарея ролей на проде l70 (run r9prod-20260829h): C6 = 0 из 3 (council-off, council-honest, council-thinking).
Не выполнены: two_or_more_distinct_participants, two_or_more_distinct_providers, member_retrieval_receipts, peer_review_stage_present, chair_synthesis_stage_present, final_evidence_present, final_citations_present, revision_stage_present. Пустые слоты: council_stage1_knight_draft, council_stage2_peer_review.
# Контекст
29.08 найден и исправлен корень падения Совета (отсутствующий импорт channelModel в src/lib/council/orchestrator.ts, Совет падал 100% прогонов две недели). Падение устранено, но на проде Совет по-прежнему не собирает двух участников от разных поставщиков — то есть починка слоя не равна починке фичи.
--- 30.08 ~15:25Z (Фабл): корень C6 найден и починен автором (волна web434c6, коммит 3e69cf9d — работу волны закоммитил координатор, волна забыла): Promise.all гнал всех ��ыцарей/ревьюеров одновременно в ОДИН OpenRouter-транспорт → при лимите 1 выживал один драфт, Совет молча сужался. Фикс: FIFO-очередь по транспорту (1 активный, интервал 50ms, ретраи 408/425/429×2), явный final.status=partial + notice при реальном сужении. Приёмка 795-accweb434c6 в очереди (mock, включая дедлок-негатив chair→judge). Отчёт: A1 WEB434C6-REPORT.md.
[01.09 13:50Z] КОРЕНЬ НАЙДЕН волной 968-councilfix (A1, sol xhigh): ТРИ независимых разрыва — (1) honest отсутствовал в CouncilMode → resolveEffectiveMode сводил к lite, stage2_peer_review не создавался; (2) thinking: revision проверял effective mode вместо requested → stage2_5 исчезал при 2 провайдерах; (3) completeJson без runtime-валидации: 200 {} считался валидным драфтом, evidence gate строил цитаты только из chair.top_evidence и игнорировал inline [Source ID: N] → insufficient при нормальном ответе. Фикс: коммит 9e184be9 (ветка councilfix-968), 538 строк, тесты 4/4+5/5+9/9, отчёт /home/ubuntu/waves/COUNCILFIX-REPORT.md. Запущена независимая приёмка 969-acccouncilfix (негативы: фабрикация Source ID 99, мусор-матрица, оба-пустые fail-closed, off-регресс; новые классы: один провайдер, смешанный draft/review, entailment-отказ). По GO — кандидат l83.
[01.09 14:25Z] ПРИЁМКА 969-acccouncilfix (Luna xhigh, независимая): все авторские зелёные ВОСПРОИЗВЕДЕНЫ (4/4+5/5+9/9+eslint), СВОИ 9/9 негативов/новых классов зелёные (фабрикация Source ID 99 отбита, мусор-матрица → slot errors, оба-пустые fail-closed, off-регресс чист, граница процесса чистая, entailment-отказ работает). Формальный NO-GO был по ОДНОМУ пункту: scoped tsc красный из-за PRE-EXISTING TS2551 в НЕтронутом councilViewerFallbacks.ts:704 (доказано на родителе). Корректирующий фикс координатора 92cb5b6c: noFollowups добавлен в 5 fallback-локалей (латентный undefined-лейбл), scoped tsc exit 0, тесты Совета зелёные. Отчёт приёмки A1:/home/ubuntu/waves/ACCCOUNCILFIX-REPORT.md (ветка acc-969, тест-коммит e9e50b4b). ВЕРДИКТ: GO. Кандидат l83 = merge 3883e98f (l82 0aa0ac8f + councilfix 92cb5b6c), сборка запущена на A2 (l83chain).
[01.09 15:00Z] l83 посажен. Прод-проба honest: minutes.stages теперь ПОЛНЫЕ (stage1/stage2_peer_review/stage3/stage4) — структурный фикс 968 доказан живьём. Остаток: citations=0 + insufficient (подозрение sourceVisibility filtered=0 total=58), thinking 504. Тикет остаётся in_progress, корректирующий круг 974-councilfix2 (бриф с прод-уликами, run_98795776).
[01.09 15:45Z] Приёмка councilfix2: NO-GO по ОДНОМУ негативу (дубликат citationIndex двух разных chunks не fail-closed). Корректирующий фикс 2789196d (ambiguousCouncilMarkers + регресс-тест: дубль→null, alias→null, сосед резолвится), 7/7+5/5+6/6, scoped tsc 0. Ре-приёмка 981 в очереди. Остальное по 974: GO (маппинг Source ID, thinking-бюджет 50с; merge-совместимость с telspend чистая).
[01.09 17:05Z] 🚀 l84 ПОСАЖЕН (f44c084f) и ДОКАЗАН платной пробой на проде: honest — 200, stages полные, CITATIONS=3, insufficient=false, ответ содержательный («42% — simple first-week to final-week comparison, no regression»); thinking — 200 (было 504!), 5 стадий вкл. stage2_5_revision, citations=3. Линия C6 honest/thinking ЗАКРЫТА живьём: 968 (стадии) + 974/корректирующие (маппинг Source ID, ambiguous fail-closed, бюджет 50с). → done.
Чем закрывается (приёмка)
На проде Совет отдаёт не менее двух разных участников от двух разных поставщиков, со стадиями черновика, взаимной проверки и синтеза; проверено живым вызовом, не фикстурой.
Доказательства
[2026-08-29 18:00Z] КОРЕНЬ ПОДТВЕРЖДЁН ФАКТАМИ С ПРОДА (координатор; волны до Pi не достают). Волна COUNCIL2 (коммит 849cb7a51bc8f938dcc6f2c7f21f7cf865ffcbad, дерево wt-council2, база 3ec0f19d) разобрала код и назвала три причины, попросив координатора проверить ключи на проде. ПРОВЕРКА НА l70: заданы OPENAI_API_KEY, GOOGLE_AI_API_KEY, GOOGLE_API_KEY, OPENROUTER_API_KEY; ANTHROPIC_API_KEY НЕ задан. То есть двух разных поставщиков на проде достаточно, и дело не в отсутствии ключей. Совпадение с находкой волны: chat-global и council_decide НЕ читали GOOGLE_AI_API_KEY, хотя server action уже поддерживал GOOGLE_AI_API_KEY || GOOGLE_API_KEY — разъезд исправлен в этой волне. Батарея ролей била именно в chat-global, поэтому C6 и видел меньше двух участников при живых ключах. Вторая находка волны: до исправления отсутствовала нижняя граница «участников >= 2», поэтому один зарегистрированный адаптер становился одиночным рыцарем, а один успешный черновик после отказа второго выглядел как обычный одиночный ответ — то есть деградация была НЕВИДИМОЙ. Третья: при ровно двух поставщиках режим council намеренно переводится в lite (orchestrator.ts:1166), из-за чего stage2_peer_review и stage2_5_revision не запускаются — это объясняет пустые слоты council_stage1_knight_draft и council_stage2_peer_review в замере r9prod-20260829h; раньше об этой деградации не сообщалось, теперь runtime кладёт различие в минутки и в видимый ответ. СЛЕДСТВИЕ ДЛЯ ЗАМЕРА РОЛЕЙ: C6 не мог пройти по устройству, а не из-за настроек прода. Ставлю независимую приёмку.
[29.08 20:20Z] Корень (разъезд Google-ключей → второй участник не приходил) закрыт линией WEB-444 (ACCCOUNCIL6 GO, в l71). Проверка: повторный прогон батареи ролей на проде после посадки l71 — если C6 позеленел, закрыть.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-434","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-01T17:03:56.684Z