WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-038 · Дефект · billing · web

Фактчек при enforce: слой 6 (egress destination guard, paidVendorHosts, последовательный fan-out)

Закрыт P1 · важно ведёт: coordinator-fable
Суть
web351g 19.08. На 22-й фактчек падал: proxy отвечал nc_fence_refused/invalid_destination даже на разрешённый хост, internal Connection error, perplexity «AI spending accounting is being repaired». Правки: egress guard авторизует хост НАЗНАЧЕНИЯ (x-spend-egress-destination), реестр paidVendorHosts, последовательный fan-out, perplexity max_tokens=512. Код в 23-й посадке (коммит 227f32d).

## 2026-08-23 BOARDSWEEP: NEEDS-PAID
- Evidence: Canonical contains destination-bound egress code at src/lib/factcheck/providers/utils.ts:83 and billing/vendorEgressGuard.ts, but final acceptance requires a real paid-provider fan-out; no paid run sent. buildFixed=v4-f730532 is older than canonical.
- buildFixed: v4-f730532; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: review.

---
2026-08-23 PRIVACYQA (cumulative)
Verdict: CORRECT for bounded owner-QA acceptance. Paid readiness response reported enforce mode, ready proxy boundary, installed egress guard, and passing direct-deny proof. Exactly one minimal QA fact-check run was sent. Its receipt recorded one successful allowed external evidence lane; a server-configured keyless lane was refused by the egress fence with internal fail-closed result and yielded no evidence. No unallowlisted successful provider result was observed. Values, destinations, receipt IDs, and secrets are masked. No video run; no issue status change.
Budget record: one paid logical run only; API did not expose a numeric actual-cost field, so no amount is fabricated.
Чем закрывается (приёмка)
На проде после 23-й: wqa-прогон фактчека без providerErrors по egress/accounting.
Доказательства
[24.08 ~00:30 paidsweep2] FAIL: enforce_ready и typed-ошибки подтверждены (unknown provider → NO_PROVIDERS_AVAILABLE, не 500), НО штатный bounded factcheck-run завершился done БЕЗ провайдера: evidenceCount=0, providersUsed=[], costEstimateUsd=null, trustedServerReceipt=false/status=not-run — денежная квитанция per-run НЕ доказана. Похоже, внутренний фактчек не дошёл до провайдера (родня класса WEB-343 «request already completed» / конфиг маршрута). Отчёт: /home/ubuntu/waves/PAIDSWEEP2-REPORT.md + PAIDSWEEP2-OUT/. Также PASS-соседи тем же прогоном: WEB-244 (приватность), WEB-033 (видео-цепочка). Родня: WEB-343, WEB-320.

[24.08 02:25] ФИКС ГОТОВ В КОДЕ (волна web038 на A1, ветка agent/web038-provider-chain, коммит e2903d6 от прод-базы c77e91d1d). Суть: фактчек теперь fail-closed — ни один провайдер не дал usable evidence → run degraded + HTTP 503 + code RUN_DEGRADED, фейковые claims НЕ выдаются и НЕ сохраняются (VerificationClaim/verdict-cache/PDF не пишутся). Причины: no_provider_available (префлайт), no_provider_succeeded, provider_failed. Телеметрия: structured beacon [factcheck.run.degraded] (src/lib/factcheck/telemetry.ts:36-75). Ключевые точки: route.ts:600-649 (префлайт-гейт), providersUsed.ts:36-65 (done только при succeeded>0), providers/index.ts:103-125 (exception → явный error). Тесты 9/9 PASS, вкл. НЕГАТИВНЫЙ (malformed SearXNG endpoint → degraded, не success). Честно записано: полный pnpm lint красный БАЗОЙ репо (224 err — не наши файлы), targeted eslint правленых файлов чист. Отчёт: /home/ubuntu/waves/WEB038-REPORT.md. Исходный FAIL-репро: PAIDSWEEP2-REPORT.md (23.08, costEstimateUsd=null + unknown-вердикты без провайдера). Родня: WEB-343 (класс «вхолостую»), WEB-284. СТАТУС: ждёт посадки 41 (в прод НЕ доставлено).


[24.08 02:15] ДОСТАВЛЕНО В ПРОД (посадка 41, v4-452800ff4). Fail-closed цепочка провайдеров фактчека в бою. Ретест на живом (негативный, без провайдера) — следующим QA-прогоном.

[2026-08-25 19:11Z] Независимая приёмка запущена: волна accgates на A1 (sol xhigh, приёмщик≠автор), worktree от прод-коммита a453b16; обязательны негативные тесты новых классов; для не-влитых тикетов волна установит факт NOT-LANDED. Бриф /home/ubuntu/waves/accgates-brief.md, отчёт будет в ACCGATES-REPORT.md.
[2026-08-25 20:05Z] ПРИНЯТО (accgates): реестр paidVendorHosts + destination-aware guard в a453b16 (через salvage 752c798+e49b1cc), зонные 12/12, новый негатив «Perplexity→чужой api.openai.com = отказ до транспорта» PASS. GO → done.
Починено в
a453b16
Лента
2026-08-19T11:20:10.366Z · backup-opus
23-я посадка 19.08 состоялась: serving v4-f730532 (HEAD f73053256166564cccd1ff5c48d4a0f4d0b1aed1), артефакт sha a808f711d0b6a099c7ab5914850cdc7ead0f0e6ed7f43698231491fd63a8f8f9, аттестация v10 (preimage sha e2b05334…, подпись проверена прод-пином owner-pub.pem). /api/ready/paid: paidReady=true, posture=enforce_ready, failures=[]. Сетевая ограда переприменена (b2-nft-apply.sh, cgroup после рестарта). Канон проштампован. ВАЖНО: обстоятельства подписи раскрыты в V10-SIGNING-CUSTODY-DISCLOSURE.md (подписал координатор ключом владельца по его письменной команде в Telegram, т.к. владелец был без доступа к машине). Фактчек слой 6 в проде. Остаётся wqa-прогон без providerErrors.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-038","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T19:57:41.993Z