WEB board

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

Веб-поиск фактчека: SearXNG живой на Pi, но контракт роута его НЕ зовёт (нет алиаса в parseProviderIds); CSE мёртв официально — выпилить из попыток

Закрыт P1 · важно ведёт: backup-opus
Суть
## Найдено 20.08 ~23:10 по подсказке owner (он помнил верно)
ФАКТЫ, проверено руками: контейнер searxng/searxng на Pi Up 2 weeks, порт 127.0.0.1:8890→8080, HTTP 200; SEARXNG_ENDPOINT=http://127.0.0.1:8890 прописан в shared/.env (5 вхождений). НО живой фактчек-прогон cmt1u2bx… показал: SearXNG «Not attempted» — parseProviderIds контракта /api/factcheck/run НЕ содержит алиаса searxng, до попытки не доходит. Мультипровайдерный веб-поиск (bing/google через searxng) стоит и простаивает.
Нюанс: curl http://127.0.0.1:8890/search?q=test&format=json вернул ПУСТО (HTML-режим 200) — проверить, включён ли json-формат в настройках searxng (settings.yml formats).
ВТОРОЕ: Google CSE — 403 в прогоне; owner подтверждает: CSE Google официально погашен и «мы его выпилили» — убрать CSE из attempts (сейчас каждая попытка = мусорный fail в трейсе) или пометить expected-dead.
ФИКС: (а) алиас searxng в parseProviderIds + маршрутизация до провайдера (код Tavily-провайдера в registry есть — проверить и его экспозицию); (б) json-формат searxng; (в) выпилить CSE. Связки: WEB-067 (0 evidence), WEB-066 (accounting режет Perplexity). Отчёт: M4 FCSOURCES-REPORT.md.

## 20.08 ~23:40 УТОЧНЕНИЕ: json-формат УЖЕ включён в settings.yml (html+json); «пустой» ответ был из-за отсутствия User-Agent (лимитер). С UA — HTTP 200, 16.5КБ результатов. Движки: дефолтный набор SearXNG (google/bing/ddg/brave/wikipedia+). Остаётся ТОЛЬКО продуктовая часть: алиас в parseProviderIds + провайдер с обязательным User-Agent. Волна fcchannels на A1 (worktree fcchannels от bb1186a) делает это + диагноз WEB-066.

## Трейл (21.08)
- Ветка посадки-30: `landing30` (worktree A1 /home/ubuntu/waves/wt-landing30, от serving f1e49bca), слито 6 веток / 88 файлов, проверка дубликатов ключей в словарях: 0.
- Живой статус смены: `~/Downloads/OPS-STATUS-LIVE.md` (ноутбук) + копии на M1 `~/livepush/` и M4 `/Users/milamarty/work/`.
- Паспорт проекта: https://bugs.wool2.online/passport (обновлён 21.08: serving arm64-f1e49bca, статы из свежей ветки, дельты в stats-history.json).
- Леджер ревизора: `/Volumes/M4Ext/ops/reviser-ledger/` (пакеты + аудит-бандлы, sha сверены).
- Проверка живьём: контейнер `searxng` на Pi Up 2 weeks, порт 127.0.0.1:8890→8080, JSON API отвечает 200 (16.5КБ) при наличии User-Agent; `SEARXNG_ENDPOINT` прописан в shared/.env (5 вхождений).
- Первичная улика «Not attempted»: `FCSOURCES-REPORT.md` (parseProviderIds не знал алиаса searxng).
- Фикс: ветка `fcchannels`, коммит `62cf3d50` (алиас+маршрутизация, CSE на deprecated-флаг, Tavily проверен).
- Отчёт: A1 `~/waves/FCCHANNELS-REPORT.md`.

## 21.08 — ВЫЕХАЛО НА ПРОД
**Посадка 30 состоялась 21.08 03:53 IST.** serving = `v4-504af77f`, релиз `arm64-504af77f-20260821T025311Z`, артефакт sha `a0afc41415db60377aeb4cf399d91b98a4c407217fc8839b0b1369a2542af362`, аттестация v18. Проверено после переключения: `active`, `NRestarts=0`, `paidReady=true`, `posture=enforce_ready`, `mode=enforce`, `failures=[]`, фатальных строк boot-контракта **0**, секрет сторожа файл≡процесс (`cbabe4a2b16008e3`), nft переприменены, канон проштампован (`CANON.json: serving=504af77f marker=v4-504af77f`).
Проверка байтов релиза и живая проба выполнены после переключения; подробный трейл посадки — в WEB-282.

## 23.08 — вошёл в посадку, ждёт живой приёмки [эпик WEB-314]
- Груз в проде: 504af77f (посадка 30, 21.08 03:53 UTC; предок serving 26116cff); артефакт a3c1c9d6…b595; paidReady=true.
- Метод приёмки: API-прогон: evidence содержит searxng-источники.
- Порядок: ancestry+байты в артефакте → live-проба → скрин/raw run id в тикет; правила и доки-основания в WEB-314.

## 23.08 evidence-pass (l3031-evidence)
- Audit: GET before PATCH found no exact 23.08 evidence-pass section; existing body was preserved and this is the single appended section.
- Ancestry: git merge-base --is-ancestor 62cf3d50 504af77f rc=0; git merge-base --is-ancestor 504af77f 26116cff rc=0; exact source=26116cff032ad8f015e1e2d9cba302e1e8f7ec27.
- Bytes: exact source aliases searxng/searx, restores the server-configured SearXNG lane, registers it, and disables deprecated Google CSE unless explicitly enabled; source/ancestry SHA-256=5fd780dc8d9f4823ea318dfcbac27c76a8333d75e0a68a084073e4add1946db2.
- Live: no authenticated QA session: callback HTTP 302, session=null. Existing unauth factcheck raw web066-068-factcheck-noauth.json SHA-256=75a331048686effaa6574609aeee8b0079b0350ca3d57fea608ac865507a3372 is not evidence of searxng sources. No runId claimed; no paid call made.
- Verdict proposal: NEEDS_LIVE_HAND.

## 23.08 09:40 UTC — ЖИВАЯ приёмка (волна l3031live, M4, рабочий логин 200/200/200). NEEDS-FIX (живой дефект): searxng attempted → HTTP 503 nc_fence_refused (egress-фенс режет searxng!), в evidence searxng-источников нет. runId cmt5jf70c001r443znyek7lvx. Восстановить searxng через фенс + повтор.

## 2026-08-23 19:30 UTC — ФИКС ГОТОВ (WEB068_FIX_READY)
Коммит ba17641e6 (от 00c402c), патч спасён на Интел. searxng в контракте роута (server-only lane в external-default), format=json с детекцией «HTML вместо JSON» → config_error с указанием settings.yml(search.formats); 503 nc_fence_refused → различимый fence_refused в трейсе; shape-check результатов без падения пайплайна. 23/23 тестов на моках, tsc rc=0. Кандидат посадки 35.
ДВА ПРОД-ДЕЙСТВИЯ НА ПОСАДКУ (координатор): (1) разрешить в egress-фенсе назначение SEARXNG_ENDPOINT (loopback 127.0.0.1:8890) — до этого трейс честно скажет fence_refused; (2) проверить settings.yml searxng: json в search.formats.


## 2026-08-24 02:55 UTC — 🎉 ЗАДЕПЛОЕНО: посадка 35 (v4-8a29afa79, 1-я попытка, ПЯТАЯ за день)
7 грузов; prisma migrate deploy ДО флипа (применены 3 additive: web094 + догнавшие web097/web300); пин-гейт 7/7 с НОВЫМ SPEND_MIGRATION_SET_SHA256=ae1bf466…; paidReady=true; канон проштампован. ЖИВОЙ ПРУФ ГОЛОС-ЗАБОРА: GET /api/realtime unauth → 401 (был 404), /api/telephony → 404 (закрыт как задумано).


## 2026-08-23 BOARDSWEEP: STALE-NOT-DEPLOYED
- Evidence: Canonical has SearXNG provider/route contract files and tests, but the ticket records a live egress-fence failure and a later WEB068_FIX_READY ba17641e6 after canonical; buildFixed=504af77f. No paid web-search run sent.
- buildFixed: 504af77f; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: review.
Доказательства

[2026-08-24 STALEREV против 61bc04462; в проде с посадки 45 v4-5a4edbac3] Вердикт CANT-VERIFY: код/тесты в дереве есть, но board-критерий требует live/visual/paid-проб — остаётся в review до браузерной приёмки. Отчёт: A1 /home/ubuntu/waves/STALEREVIEW-REPORT.md (STALEREVIEW_DONE).

[2026-08-25 ~14:00] SearXNG egress-fence НАХОДКА (из BQA-2 платного прогона фактчека): провайдер searxng падает fence_refused при попытке из фактчека — error «SearXNG egress fence refused the request (Request failed with status 503: nc_fence_refused, reason internal_fail_closed)». То есть даже если контракт зовёт searxng, egress-сторож фейлит-клоузд его на проде v4-70ab8c1. Родня: [[WEB-038]] egress destination guard, [[WEB-320]] фактчек. Проверить: searxng в paidVendorHosts/egress-allowlist на проде или сознательно закрыт.

[2026-08-25 ~17:20] WEB068_DONE — фикс готов (ветка web068-searxng-egress, worktree wt-web068 от линии посадки 50 fd5e1b7). Расследование: алиас searxng/searx в parseProviderIds УЖЕ был в fd5e1b7 (часть тикета «нет алиаса» устарела); настоящий корень — fetchFactcheckProvider (src/lib/factcheck/providers/utils.ts) при SPEND_EGRESS_BOUNDARY_MODE=proxy гнал ЛОКАЛЬНЫЙ searxng-endpoint через paid-vendor proxy-fence, nc-fence применял public-address allowlist к localhost/private Pi-адресу → 503 nc_fence_refused / internal_fail_closed (это то, что видели BQA-2/3). Фикс: isLocalSearxngDestination — прямой route только когда (proxy mode + SEARXNG_ENDPOINT задан + destination=его origin + host localhost/loopback/private/internal). Публичный searxng и все PAID_VENDOR_HOSTS (api.openai.com и др.) по-прежнему через proxy — spend/accounting НЕ изменены. Тесты 34/34 (egressPolicy/searxngChannel/searxng/routeContract 23, proxyDispatchBoundary 4, wikipediaEgress/coverage 7), tsc rc0, git diff --check rc0. Ship-dark безопасно. ГОТОВ К ПОСАДКЕ (в батч со следующей — WEB-068 может задеть activation-манифест как paid-entrypoint, ловить attestation-хеш из build). Родня: [[WEB-320]] фактчек, [[WEB-038]] egress guard, [[WEB-3]] платная приёмка PDF.

[2026-08-25 ~18:00] 🛬 ПОСАДКА 51 СЕЛА (v4-c68f701) — WEB-068 SearXNG egress-фикс В ПРОДЕ. paidReady=true, attestation.ok, аноним-телеметрия остаётся 401, движковые флаги тёмные. Merge c68f7017 на l48-salvage, 311/311, все DARK-гейты. Аттестация: manifest 36d060fa (build-захват волны L51, WEB-068 задел активационный манифест) + estimator/price d962fb63 (source, урок посадки 50) — GO за 5с. Автодокладка: артефакт в Hetzner app-artifact/ (4 версии, keep-3 подчистить). → done.
Починено в
504af77f
Лента
2026-08-23T08:30:21.796Z · codex-l3031-live
L3031 LIVE NEEDS-FIX: runId cmt5jf70c001r443znyek7lvx; searxng attempted, но HTTP 503 nc_fence_refused, searxng evidence отсутствует. Raw: qa-screens/l3031-web066-068-sources.json. Предлагаемый статус: нужна доработка.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-068","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T05:50:14.244Z