WEB-384 · Задача · — · web
P1 [фактчек/отбор источников]: для запросов со сроками недатированные документы отбираются по времени ИМПОРТА вместо даты документа
Закрыт
P1 · важно
ведёт: —
Суть
Найдено при разборе батареи ролей (WEB-293, отчёт WEB293UNDATED-REPORT.md на M4).
СУТЬ: при вопросе, ограниченном по времени, в контекст попадают недатированные документы, и продукт обращается с ними как с датированными — фильтр отбора использует ВРЕМЯ ИМПОРТА документа как замену его собственной даты. В результате недатированный материал оказывается ЕДИНСТВЕННОЙ опорой временнОго утверждения.
ДОКАЗАННЫЕ СЛУЧАИ (прогон web293rerun-20260826T110408Z):
- C2-timeline-run-03: недатированный Research Brief — единственная опора факта, помещённого в раздел «Сейчас»;
- C2-timeline-run-05: тот же Brief поставлен в раздел «Тогда» как «ближайшая более старая документация», хотя его возраст неизвестен.
ПОЧЕМУ ВАЖНО: продукт делает утверждения о сроках, опираясь на материал без даты, и подаёт это как обоснованное. Для фактчека это прямое нарушение обещания.
ОТЛИЧАТЬ ОТ ЛОЖНЫХ СРАБАТЫВАНИЙ: в run-04/07/10 недатированные источники тоже доставлены, но все временнЫе утверждения независимо подкреплены датированными — там дефекта нет, там был перестрогий предикат чекера.
ЧТО НУЖНО: при временнОм запросе не использовать время импорта как дату документа; недатированный источник допускать только как фон, запрещая ему быть единственной опорой временнОго утверждения (либо явно помечать такое утверждение как неподтверждённое по дате).
Доказательства
[2026-08-26 12:52Z] Решение владельца (тг 12:30): чинить ПОСЛЕ посадки 58. Очередь: после L58FIX_DONE и деплоя.
[2026-08-26 13:20Z] Дообогащение для нулевого агента (web293rem, доказательства в WEB293REM-REPORT.md на M4): точная цепочка дефекта — (1) rolePolicy.ts:565-582 промпт запрещает import timestamp как event date, но промпт НЕ заменяет pre-LLM отбор; (2) rolePolicy.ts:1172-1198 dual-window candidateK=72/finalK=16, imported_at_only получает boost 0.5 но НЕ hard exclusion; (3) rolePolicyEnforcement.ts:785-845 temporal bounds по stored timestamp ('as a proxy' — прямо в комментарии); (4) actions.ts:4981-5006,5023-5058 then/now searches + merge; (5) vectorStore.ts:470-495 SQL-предикат по d.createdAt (дата ЗАПИСИ Document, не события); (6) rolePolicyEnforcement.ts:848-852 остаток слотов по relevance — так недатированный Brief становится evidence-кандидатом; (7) actions.ts:5149-5197,6126-6149,2975-2990 citation selection не сохраняет dated coverage. Receipt: toolCapabilityOutcome.unavailable=[timeline_filter]. Репро-кейсы: C2-timeline-run-03 (11 месяцев только из Brief) и run-05 (Northfield/week3/1180L/weeks18-19 только из Brief+Appendix; ответ сам говорит 'I don t have any dated pilot status notes in the then window'). Правка: отделить eventDate/authoredAt от createdAt, fail-closed исключать imported_at_only из temporal claims, сохранять dated coverage до финального citation selection + regression на compound claim. Оценка M/L 3-5 дней. По owner: ПОСЛЕ посадки 58.
[2026-08-26 15:10Z] fablepack3 базовый прогон подтверждает класс на 5 независимых сценариях Фабла: S-06 (недатированный док), S-09 (import date), S-10 (нет исторического окна), S-26 (совет: консенсус вне окна), S-31 (разговорные маркеры времени). Детали: FABLEPACK3-REPORT.md + graded-results.json (M4).
[2026-08-26 21:20Z] СТАРТ ФИКСА (голосовое поручение owner 16:32: роли добить срочно, релизимся): волна web384fix на M4 (luna xhigh), worktree wt-web384 от 5c5ccb1, требования: source-owned eventDate вместо createdAt по всей цепочке, fail-closed для imported_at_only в temporal-окнах, сохранение dated coverage до citation selection, аддитивная миграция + backfill dry-run, регрессия run-03/05.
[2026-08-27 00:20Z] Автор web384fix @6761bbf (M4): temporalMetadata resolver (eventDate>authoredAt>publishedAt>явная; createdAt/imported НЕ event date, fail-closed), аддитивная миграция Document.temporalDate(+Source)+индекс, backfill dry-run/--apply, vectorStore dateBasis=source-event (legacy без опции = прежний createdAt), Timeline bounds на обоих роутах, citation chip несёт source-owned дату. Focused 101/101, prisma validate rc=0. -> review, acc384 запущена на M4.
[2026-08-27 02:20Z] ПРИНЯТ acc384 (независимый, M4): focused 101/101 воспроизведён, миграция аддитивна и прогнана на копии стенда (dry-run + apply + идемпотентность повтора), классы (a)-(d) приёмщика (границы окон по eventDate vs createdAt, legacy бит-в-бит, run-03/05 fail-closed, смешанный корпус до backfill), негативный mutation-контроль ловит. -> done. В l59: мердж ветки web384fix + прод-backfill (dry-run -> apply).
[2026-08-27 07:22Z incident-closure] Пост-посадочный инцидент l59 (42703 column d.temporalDate does not exist, surface chat.messenger.rag) ЗАКРЫТ с доказательством: миграция 20260826160000_web384_source_temporal_date применена на serving-БД (docker :55432) 07:00:59Z; последняя 42703 в journal — 06:57Z (ДО фикса; journal Pi в IST=UTC+1, «07:57 local»); после миграции 0 ошибок, сообщение owner 07:03Z получило нормальный ответ. Урок в память: landing-runbook-needs-prisma-migrate-step.
Починено в
6761bbf
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-384","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-27T07:29:37.082Z