WEB-087 · Задача · Чат · web
Фактчек коротких составных фраз: расщеплять на тезисы с вердиктом ПО КАЖДОМУ (Париж=правда, 1999=ложь), а не один unknown-veto на всё
Закрыт
P1 · важно
ведёт: backup-opus
Суть
## Owner-вопрос 21.08 ~03:20 (по fcverify-прогону cmt1xtep0001z13i91ezvghj3)
ФАКТ: «Эйфелева башня в Париже, а построена в 1999» прошла как ОДИН клейм (claimCount=1) → леджер увидел непокрытый конъюнкт → typed veto → unknown на всё предложение. Это правильный fail-closed ПОЛ (анти-обман: не дать supported при непокрытом куске — класс R9 38/54 закрыт), но НЕ идеальный потолок.
ОЖИДАНИЕ OWNER (правильное): короткая фраза с двумя тезисами → два вердикта: «в Париже» = правда, «построена в 1999» = ложь.
ДВА КОРНЯ ДО ИДЕАЛА: (1) прямые короткие клеймы не проходят extractor-расщепление (в документном пути extractor тезисы вытягивает, в прямом — нет; проверить точную развилку в /api/factcheck/run); (2) чтобы сказать «ложь» про год, нужны РАБОТАЮЩИЕ источники (сейчас 0 evidence — WEB-066/067/068); без свидетельств честный максимум = unknown.
ПЛАН: (а) прямой клейм → прогонять через extractor: составное → N под-клеймов → вердикт по каждому + сводка; veto остаётся полом при непотреблённом остатке; (б) после починки источников — контрольный прогон этой же фразы: ожидание Париж=supported, 1999=refuted (у ревизора в matrix есть positive control «supported, confidence=1» — движок умеет).
Связки: WEB-284 (эпик), WEB-066/067/068 (источники), FCVERIFY-REPORT.md (M4).
ОТДЕЛЬНО ДОРАЗОБРАТЬ для owner: лимиты документного пути (насколько большой документ, вытянет ли тезисы по всему полотну) — снять из кода extractor и вписать сюда.
## 21.08 ~03:40 ЦИФРЫ ИЗ КОДА (claimExtractor.ts, прод-линия f1e49bca): SHORT_TEXT_CHAR_THRESHOLD=200 — текст короче 200 символов идёт short_circuit БЕЗ расщепления (одним клеймом) — это и есть корень owner-кейса. MAX_CLAIMS_BY_MODE: quick=2, standard=5, deep=8 — потолок тезисов ЗА ПРОГОН; большой документ полностью НЕ вытягивается, экстрактор выбирает top-N проверяемых. ФИКС-ПЛАН уточнён: (а) short_circuit — расщеплять составные и <200 (дешёвый синтакс-сплит по союзам/запятым уже есть в V2M-леджере — переиспользовать до LLM); (б) для документов: прогон по окнам или явное «проверено N из M тезисов» в отчёте, чтобы не врать полнотой.
## Трейл (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 сверены).
- Источник требования: owner (телега 21.08) — «два тезиса, ожидал два вердикта».
- Цифры из кода: `src/lib/factcheck/claimExtractor.ts` SHORT_TEXT_CHAR_THRESHOLD=200; MAX_CLAIMS_BY_MODE quick=2/standard=5/deep=8.
- Фикс: ветка `l30chat`, коммит `a3b43112` + новый `src/lib/factcheck/compoundClaimSplit.ts` и тест `compoundClaimSplitWeb087.test.ts`.
- Смежная улика (что защита работает уже сейчас): FCVERIFY-REPORT.md, run `cmt1xtep0001z13i91ezvghj3` — unsupported-conjunct + comparabilityVeto.
## 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-прогон compound-фразы → вердикты по тезисам; fcbattery R2 (идёт сейчас) частично кроет класс.
- Порядок: 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 a3b43112 504af77f rc=0; git merge-base --is-ancestor 504af77f 26116cff rc=0; exact source=26116cff032ad8f015e1e2d9cba302e1e8f7ec27.
- Bytes: claimExtractor.ts routes short compound text through splitCompoundClaim before short_circuit; cap remains quick=2/standard=5/deep=8. Raw 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 only proves auth is required, not the requested claim verdict. No runId claimed.
- Verdict proposal: NEEDS_LIVE_HAND.
## 23.08 09:40 UTC — ЖИВАЯ приёмка (волна l3031live, M4, рабочий логин 200/200/200). NEEDS-FIX (живой дефект): составная фраза Париж/Берлин → claims.length=1, один общий unknown, comparabilityVeto=true (НЕ разбита на тезисы с verdict по каждому). runId cmt5jelfc000m443zndwimanq. Требует доработки splitter'а.
## 2026-08-23 15:20 UTC — фикс-волна запущена (A1 web087, Terra high, дерево wt-web087 от l33-batchB)
Скоуп: расщепление коротких составных фраз в ПРЯМОМ пути на тезисы с вердиктом по каждому; fail-closed сохранён (unknown только непокрытому тезису); 4 негатива. Ожидаю WEB087_FIX_READY — кандидат посадки 34.
## 2026-08-23 16:45 UTC — ФИКС ГОТОВ (A1 web087, маркер WEB087_FIX_READY)
Коммит 629f03e (ветка web087 от l33-batchB). Развилка найдена: /api/factcheck/run:673 шлёт selected-текст со skipExtraction=true → claimExtractor.ts:299-302 возвращал ОДИН клейм до сплиттера. Фикс: детерминированный сплиттер для короткого текста в no-LLM пути (299-309) + compoundClaimSplit.ts:50-115 снимает ведущий союз и восстанавливает опущенное подлежащее («Эйфелева башня построена в 1999», не «а построена в 1999»). Корень №2 (refuted нужен evidence) честно НЕ трогался — без evidence вердикт остаётся unknown, fail-open не добавлен (это линии WEB-066/067/068). Тесты 12/12+10/10 (атомарная фраза не дробится; true+false → supported+refuted; неполный evidence → unknown только у своего тезиса; мусор отвергается; старое вето живо), tsc/eslint rc=0. Патч спасён (sha 076-локально). Кандидат посадки 34.
## 2026-08-23 22:25 UTC — 🎉 ПОСАДКА 34 СЕЛА (v4-b21dea6a0, 1-я попытка)
rel-b21dea6a0 (SHA d79a9e3e…), пин-гейт 7/7, paidReady=true, канон проштампован. В посадке: ДВИЖОК ship-dark (OFF заморожен байт-пруфом Object.freeze("0")) + sync hotfix + WEB-087 + WEB-272. Дельта-гейт тайпчека: 0 новых против baseline-407 (WEB-281), гейт .next/types починен честно (e46995c32).
Живая приёмка: составная фраза → два вердикта — проверить после стабилизации.
## 2026-08-23 23:55 UTC — ✅ ЖИВОЙ ПРУФ OWNER: расщепление РАБОТАЕТ на проде (v4-b21dea6a0)
Owner прогнал inline-фактчек на «Эйфелева башня в Париже, а построена в 1999» → отчёт cmt5ui8sw005zeaf0lz3c3ovx: «Перевірено 2 твердження» — тверждение 01 «Эйфелева башня в Париже» + тверждение 02 «Эйфелева башня построена в 1999» (PDF стр.3-5). Ровно ожидание owner из тикета. Вердикты обоих пока «не встановлено» — это НЕ дефект расщепления, а резолюция (WEB-067, фикс готов, посадка 35). Поведенческая часть 087 доказана живьём.
## 2026-08-23 PDFPOSTQA: NEEDS-PAID — per-claim scenario requires a fresh factcheck run; not started.
PDFPOSTQA: бесплатные сценарии только; новые paid generation/export/import не запускались. Полный реестр и evidence: /Users/milamarty/work/PDFPOSTQA-REPORT.md; screenshots: /Users/milamarty/work/PDFPOSTQA-SHOTS/.
## 2026-08-23 BOARDSWEEP: STALE-NOT-DEPLOYED
- Evidence: Canonical contains the earlier compound splitter in src/lib/factcheck/claimExtractor.ts, compoundClaimSplit.ts and tests, but the board records a live failure on v4-504af77f and a newer WEB087_FIX_READY 629f03e after canonical. No paid factcheck run sent.
- buildFixed: 504af77f; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: review.
Доказательства
[2026-08-24 STALEREV против 61bc04462; в проде с посадки 45 v4-5a4edbac3] Вердикт SERVED: реализация+тесты доказаны в target tree; принято по приёмке 45-тикетного разбора. Отчёт: A1 /home/ubuntu/waves/STALEREVIEW-REPORT.md (STALEREVIEW_DONE).
Починено в
v4-5a4edbac3
Лента
2026-08-23T08:30:21.677Z · codex-l3031-liveL3031 LIVE NEEDS-FIX: runId cmt5jelfc000m443zndwimanq, submit/final HTTP 200/200, но claims.length=1 и один общий unknown для составной фразы; per-claim verdict не выдан. Raw: qa-screens/l3031-web087-compound.json. Предлагаемый статус: нужна доработка.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-087","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-24T14:28:59.245Z