WEB-482 · Задача · Чат · web
Каталог «Додати з OpenRouter»: у КАЖДОЙ модели оранжевый техно-варнинг «Preflight: Runtime availability is not confirmed yet. A lightweight preflight is required» — пользователь видит внутренний статус вместо результата
Закрыт
P1 · важно
ведёт: —
Суть
Owner 02.09 16:53 (скриншот с nb.wool2.online, прод l91): настройки провайдера → OpenRouter → «Додати з OpenRouter» — у всех моделей (aion-labs/…, и далее) под ценой оранжевая строка «Preflight: Runtime availability is not confirmed yet. A lightweight preflight is required.» Источник строки: src/lib/models/availability.ts:889 (`unknown_runtime_block`) — внутренний статус «runtime не подтверждён» показывается пользователю как предупреждение, хотя ни один preflight ещё не запускался и запускать его пользователю негде. Ожидание продукта: (а) для моделей каталога, ещё не добавленных, статус runtime не показывать вовсе (или показывать нейтральное «проверим при добавлении»); (б) при нажатии «додати» выполнять лёгкий preflight автоматически (одна дешёвая проверка доступности модели через OpenRouter, без платного вызова, если возможно — /models metadata или 1-токен запрос с кап-лимитом), результат → «доступна»/«недоступна: причина» на языке интерфейса (uk/ru/en), техническая строка на английском — только в admin/диагностике; (в) текст — через messages/*.json (i18n), не хардкод. Связано: WEB-452 (витрина: пользователю — опыт подписчика), WEB-459 (пикер моделей). План: волна 1272-openrouterpreflight (A1) → приёмка → l92.
Лента
2026-09-02T17:38:23.905Z · Fable[A1 18:15 Фабл] Волна 1272-openrouterpreflight сдана: коммит 9706374097 (ветка openrouterpreflight-1272, база l91-candidate). Отчёт: A1 /home/ubuntu/waves/OPENROUTERPREFLIGHT-REPORT.md. Дальше: приёмка 1287-accopenrouterpreflight (A1, другой verifier: каталог без техно-варнинга, один preflight на «додати», unknown без варнинга + фоновая очередь, i18n-паритет, 200+ моделей) → GO → слияние с WEB-483/484/485 в l92-candidate → посадка → браузерная проверка против скриншота owner-а. Бандл: A1 /home/ubuntu/mirrors/lines/openrouterpreflight-1272.bundle; A2 ref openrouterpreflight-1272/head.
2026-09-02T17:56:28.368Z · Fable[A1 18:20 Фабл] Приёмка 1287-accopenrouterpreflight = NO-GO (A1 /home/ubuntu/waves/ACCOPENROUTERPREFLIGHT-REPORT.md): B1 CRITICAL — metadata-preflight зовёт /api/v1/models/<author>/<slug>, а документированный endpoint OpenRouter — /api/v1/model/:author/:slug (singular); 404 сразу маппится в deprecated_model, fallback max_tokens:1 не выполняется → пользователю/админу «модель устарела» вместо «интеграция сломана» (rule10: маскирование локальной ошибки); авторский мок принимал любой URL с /models/. B2 HIGH — известный credits-exhausted для не добавленной строки каталога скрыт нейтральной подсказкой. → волна 1296-openrouterpreflight2 (A1): правильный endpoint, класс integration_error с честным текстом и логом, строгий URL-мок, известный blocked-статус показывать в каталоге. Остальное (каталог без техно-варнинга, один preflight на «додати», unknown без варнинга, i18n) — принято приёмкой.
2026-09-02T18:26:10.702Z · Fable[A1 18:30 Фабл] Корректировка после NO-GO 1287 сдана: волна 1296-openrouterpreflight2, коммит 22b66cc0bd (ветка openrouterpreflight2-1296 = 1272 + фикс). Заявлено: endpoint /api/v1/model/:author/:slug, класс integration_error с честным текстом и логом для админа (404 на неверный URL больше не маскируется как deprecated), строгий URL-мок в тестах, известный blocked-статус показывается в каталоге; targeted i18n parity 103/103 (serverDictionaryJsonParity — базовый drift, не регресс). Отчёт: A1 /home/ubuntu/waves/OPENROUTERPREFLIGHT2-REPORT.md. Дальше: приёмка 1310-accopenrouterpreflight2 (A1, другой verifier) → GO → слияние пакета пикера в l93-candidate. Бандл: A1 /home/ubuntu/mirrors/lines/openrouterpreflight2-1296.bundle; A2 ref openrouterpreflight2-1296/head.
2026-09-02T21:39:59.381Z · Fable[A1 22:15 Фабл] Приёмка 1357-accopenrouterpreflight2 = NO-GO (отчёт A1 /home/ubuntu/waves/ACCOPENROUTERPREFLIGHT2-REPORT.md). B1-R1 HIGH: 5xx с текстом model-not-found классифицируется как deprecated (availability.ts:707) — критерий: любой 5xx/network/timeout → integration_error. B1-R2 HIGH: malformed 200 metadata с пустыми id/name считается доступной (availability.ts:633 проверяет только typeof). Круг 3 = волна 1378-openrouterpreflight3 (A1, Luna high, от 22b66cc0); затем слить с пакетом пикера (1360) перед l94.
2026-09-02T22:34:20.699Z · Fable[A1 00:58 Фабл] Волна 1378-openrouterpreflight3 сдана: коммит 36ec83c361 (5xx/network/timeout → integration_error независимо от текста; malformed metadata → malformed_metadata). Отчёт: A1 /home/ubuntu/waves/OPENROUTERPREFLIGHT3-REPORT.md. Приёмка 1398 (A1, Sol high, в очереди) → слияние с пакетом пикера → l94.
2026-09-02T23:41:00.595Z · Fable[A1 04:55 Фабл] Приёмка 1398-accopenrouterpreflight3 = NO-GO по одному блокеру (отчёт A1 /home/ubuntu/waves/ACCOPENROUTERPREFLIGHT3-REPORT.md): B1-R2c HIGH — metadata с canonical id, но без поля name проходит как available (malformed-ветка срабатывает только при присутствующем плохом поле). Классы ответов 5xx/4xx и остальная malformed-матрица — PASS. Круг 4 = волна 1418-openrouterpreflight4 (A1, Luna high, от 36ec83c3): обязательные id и name, отсутствие = malformed_metadata.
2026-09-03T03:51:11.187Z · Fable[M4 Фабл] Приёмка 1463-accopenrouterpreflight4 = GO (независимая, Sol high): available только при id+name, malformed-матрица, классы 5xx/404, i18n parity. Коммит 8cd4d54b (круг 4) → в l95-candidate (dry-run на A2).
2026-09-03T04:25:43.908Z · Fable[A2 Фабл] Сборка l95 встала на гейте W34 «свидетельства активации»: uncoveredPaidFiles = src/app/api/models/provider-availability/route.ts (preflight4, 8cd4d54b) — платный путь без покрытия в entrypoint coverage; приёмка 1463 генератор не гоняла. Фикс = волна 1438h-l95actev (A1, Luna medium): штатное покрытие/обоснование, ok=true. Правило: волна, трогающая платный путь, обязана проходить monet-w34-generate-activation-evidence.
2026-09-03T05:15:09.476Z · Fable[A1 Фабл] ПОСАЖЕНО в l95 (preflight4 через слияние 1438g + покрытие W34 в 1438h).
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-482","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-03T06:12:22.019Z