WEB-375 · Дефект · — · web
P1 [прод]: чат с источником падает — orb-agent HTTP 403, ответ не приходит
Закрыт
P1 · важно
ведёт: fable-coordinator
Доказательства
[2026-08-26 08:35Z] КОРЕНЬ НАЙДЕН (web375diag): в enforce-режиме metering требует source-bound callsiteId, а orb route передаёт его как null И сам route отсутствует в paid-entrypoint registry -> HTTP 403. Сделан безопасный credential-wiring fix; ALLOW-релиз orb в registry требует ОТДЕЛЬНОЙ подписанной registry/activation-правки. -> приёмка acc375diag.
[2026-08-26 08:50Z] acc375diag NO-GO: callsiteId в diff ВСЁ ЕЩЁ null, orb отсутствует в paid-entrypoint registry -> остаётся RUNTIME_DENIED. Фикс web375fix3: реальный source-bound callsiteId по образцу других платных точек + регистрация orb (код-часть; если нужна подписанная activation-правка — опишет, сделаю при сборке).
[2026-08-26 09:05Z] ФИКС web375fix3: orb-роут теперь передаёт source-bound не-null callsiteId в meterOpenAIClient (значение НЕ из request body — foreign callsiteId игнорируется); в paidEntrypointRegistry.json добавлены callsite и entrypoint. Тесты: route 8/8 (non-null callsiteId, игнор foreign, auth/rate-limit), billing 2/2 (registry, ALLOW, негативы unknown/foreign/null). ⚠️ ТРЕБУЕТСЯ ПОДПИСАННАЯ ACTIVATION-ПРАВКА при сборке: перегенерировать generatedActivationManifest.ts, monet-w34-entrypoint-coverage.json (+api.companion.orb-agent.post), monet-w34-activation-manifest.json (rows/manifestHash/coverageHash/подпись), monet-w35-activation-attestation.json. Сделаю отдельным заходом ПОСЛЕ посадки 58.
[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 (не строка в отчёте!).
Ветка/волна web375fix3. Суть: чат с источником падал 403 на /api/companion/orb-agent. Корень был двойной: callsiteId приходил null И точка не была в реестре платных входов. Фикс: роут передаёт source-bound callsiteId в meterOpenAIClient (значение НЕ из тела запроса — подложенный чужой игнорируется), точки добавлены в paidEntrypointRegistry.json. ⚠️ ОСТАЁТСЯ ШАГ: подписанная перегенерация активации при сборке — generatedActivationManifest.ts, monet-w34-entrypoint-coverage.json, monet-w34-activation-manifest.json (manifestHash/coverageHash/подпись), monet-w35-activation-attestation.json; без неё фича не включится и paidReady может уйти в 503.
ПРАВИЛА ДОМА: (1) приёмку делает НЕ автор и НЕ прежний приёмщик, со СВОИМИ новыми тестами и обязательным НЕГАТИВНЫМ тестом (проверка, которая всё пропускает, ничего не стоит); (2) отсутствие ошибок != фича жива, нужен сквозной пруф; (3) починка одного слоя != починка фичи; (4) правило 10 — catch без лога и маячка запрещён; (5) монетарные файлы и цены не трогать без отдельного решения; (6) прод/деплой/платные вызовы — только по явному разрешению.
[2026-08-26 13:52Z] Гейт check:activation-migration-set валил prebuild l58: generated set отставал на 3 миграции 25.08 (web169_studio_floor_index, web366_claim_judge_receipt, web368b_context_tag_receipts) — тот же разрыв есть и в стенде l57 (сборка l57 прошла ДО врезки миграций). Регенерировано штатным генератором monet-w34-generate-activation-evidence.mjs (dev-режим: эфемерный ed25519, секреты не использованы; w35 bypass-baseline НЕ перезаписан — защита сработала). Закоммичены ровно 4 намеренных файла: generatedActivationManifest.ts + w34 manifest/coverage + w35 attestation. Коммит f5b754d на l58, checker rc=0, полная сборка перезапущена. ПОМНИТЬ ПРИ ДЕПЛОЕ: патчить ВСЕ sha в spend-runtime.env под НОВЫЙ манифест (иначе runtime_*_mismatch, прецедент l61/l57).
[2026-08-26 19:15Z] Боевое подтверждение env-зависимости: регенерация без прод-env уронила paidReady на выкате fc24a4b (missing-row по allowlist/deployment-manifest строкам). Правильная процедура: экспортировать MODEL_ALLOWLIST + SPEND_DEPLOYMENT_MANIFEST + REALTIME_RELEASE_POSTURE из прод spend-runtime env ПЕРЕД monet-w34-generate; проверять грепом наличие env-строк в manifest ДО сборки. Коммит 5c5ccb1.
[2026-08-26 19:55Z] Посадка 58 села с регенерированным манифестом и owner-подписанной аттестацией (боевое подтверждение процедуры). -> review: осталось закрепить процедуру в билд-скрипте (регенерация с прод-env на каждой посадке) и приёмка.
[2026-08-26 21:55Z] acc58a NO-GO, корень ДВУХСЛОЙНЫЙ: (1) s2s-форма (без Origin) блокируется origin-lock (класс WEB-387, маяк WEB075_RULE_10 подтверждён на /api/companion/orb-agent); (2) ГЛАВНОЕ для реальных пользователей: браузерный путь проходит замок, но падает model_not_allowed — UI жёстко шлёт gpt-4o-mini (EditorModal.tsx:8197), которого нет в релизном аллоулисте (боевая иллюстрация аудита WEB-024). Фикс web375fix (S): модель из реестра/allowlist в orb-вызове + тест. В очереди на слот A1.
[2026-08-26 23:50Z] Автор web375fix @34522cd: hardcode gpt-4o-mini убран из EditorModal (orb payload через registry resolveSelectedOpenAIModel; без явного выбора model не шлётся — сервер берёт admin default api-assistants.orbAgent=gpt-5.4-mini c release-aware fallback); явная запрещённая модель НЕ подменяется (прежний 403 — негативный тест). Тесты route+registry. Отчёт также перечисляет соседние client-side model hardcode для WEB-024. -> review (приёмка acc375 в очереди; s2s-слой origin-lock остаётся в WEB-387).
[2026-08-27 04:05Z] ПРИНЯТ (приёмка выполнена координатором вручную: две волны-приёмщика подряд утонули в коллизии имён со старой веткой web375/temporal): HEAD 34522cd подтверждён, тесты автора 5/5 (включая негатив: запрещённая модель -> прежний 403 без подмены), орб-вызов через resolveSelectedOpenAIModel (EditorModal:7881), hardcode из орб-пути удалён. Соседний фолбэк gpt-4o-mini в targetModel (EditorModal:7880) — ДРУГОЙ путь, вне скоупа, учтён в WEB-024. s2s-слой origin-lock — в WEB-387. -> done, ветка web375fix в мердж l59. УРОК: коллизии имён веток тёзок жгут приёмщиков — для l59+ волнам давать уникальные не-пересекающиеся имена.
Починено в
34522cd
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-375","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-26T18:58:22.668Z