Журнал работ 28-29 апреля 2026
Два дня перед основной миграцией 2-3 мая. Основные векторы: чистка базы, инфраструктурный пилот на AX41, крупный апгрейд Пушкина.
28 апреля — cleanup базы + обнаружен баг archive_extract
Cleanup ChromaDB — 4 sweep'а
Старт: 167,332 чанков
Sweep 1: короткие <200 chars −0,869 (footnotes, headers, footers)
Sweep 2: точные дубликаты по hash text −1,716 (повторные загрузки)
Sweep 3: тематический мусор −0,251 (мамонты Colossal, B2B-маркетинг Bioacoustics, ABC Survey)
Sweep 4: GetSmarter/Wikipedia patterns 0 (отменён — зацепил Cambridge CISL)
Итого: 164,496 чанков (−2,836, −1.7%)
KZ corporate cleanup
Снесены 638 корпоративных KZ-чанков (Самрук-Казына/ТШО/ENRC/КМГ/КазТрансОйл). База 167,970 → 167,332. 3 итерации dry-run чтобы избежать false positives на DuPont/IOGP/HazMat. Промпты 5 structured-модулей (TBT/JSA/PTW/Checklist/MS) обновлены с расширенным blacklist.
Главная находка — баг archive_extract.py
12,612 чанков под title «Приложение 14» — на самом деле РАЗНЫЕ приказы МЗ РК слились. Всего ~25K чанков (15% базы) имеют битые titles (Version Changes, Building a stronger, обрывки, телефоны). Контент в этих чанках полезный — реальные НПА РК, Cambridge CISL курсы, IOGP документы. Решение: фикс archive_extract.py (брать title из имени файла, не из первой строки) + полный re-extract в субботу.
Ключевой инсайт
База собрана хорошо — обёртка плохая. Контент тематически правильный (90%+). Ломали retrieval битые titles, дубликаты, старая embedding-модель без HSE-fine-tune. При таких проблемах Люми всё равно даёт 80% positive feedback — значит контент действительно хороший.
Прогноз после субботы (re-extract + bge-m3 fine-tune + multi-mode): - Recall@5: +15-25% - Precision: +5-15% - Feedback: 80% → 90%+ ожидаемо
Что отложено на субботу
| Категория | Чанков | Решение |
|---|---|---|
| «Приложение 14» (битый title МЗ РК) | 12,612 | re-extract с фиксом title |
| Version Changes / Building a stronger / Hope for the future | ~13,000 | re-extract |
| This page intentionally left blank | 1,339 | re-extract |
| Источник: ИС ПАРАГРАФ | 440 | re-extract |
| Wikipedia ICS / ISO 22301 | 49 | оставить (обзорный материал) |
| CISL Cambridge sustainability course | 317 | re-extract — полезный курс |
29 апреля — марафон на 9.5 часов
Утро — инфраструктура
OAuth persistence patch (AX41 wiki-mcp): oauth_provider.py пишет registered_clients + access_tokens в /opt/wiki-mcp/.cache/oauth_state.json через atomic write (tempfile + os.replace, chmod 0o600, threading.Lock). 4 точки save (oauth_register, oauth_token, validate_bearer_token expiry, _cleanup_expired). E2E: после двух systemctl restart Cowork держит сессию. На CPX62 НЕ деплоили — warm fallback до 5 мая.
WireGuard миграция: 3 устройства (iphone/ipad/mac) переведены на 65.108.5.40:51820. Ключи и PSK сохранены — клиенты только поменяли Endpoint.
B2 backup phase 1: Backblaze B2 EU Central + rclone + systemd timer (03:00 CEST, RandomizedDelaySec=300, Persistent). Bucket lyumi-backups, application key Read+Write только на bucket. SSE-B2 включен. Бэкапятся wiki + chroma_data + oauth_state.json (~9 MB tar.gz). Retention 14 дней.
Nightly logs backup: Ежедневный sync /opt/lyumi/logs с CPX62 на b2:lyumi-backups/cpx62/logs/. Retention 90 дней, cron 0 3 * * *. Суббота — день разбора логов.
Lyumi-chroma snapshot в B2 (ad-hoc): docker run --rm -v lyumi-chroma:/data alpine tar -czf - /data | rclone rcat b2:lyumi-backups/cpx62/lyumi-chroma_apr29.tar.gz. Rollback point перед субботним re-extract'ом.
День — промпт caching + cleanup_titles
Caching Sprint 2 (verify + deploy):
- Миф «tokens_cached=0 везде» опровергнут — caching РАБОТАЕТ на Lyumi-боте (hit rate 39.2% за 24 апр, 32/58 records с cache hit, 417K cached из 1.06M prompt). Артефакт OpenRouter UI.
- extra_system переведён из system_prompt в user_message (cache key stability)
- cache_control: ephemeral добавлен в 5 structured pipelines (tbt/jsa/checklist/ms/ptw_structured.py)
- Smoke test: Sonnet 34% → 70% hit, TBT 0% → 65.7%
- Run rate: $38 → $30-32/мес projected
cleanup_titles.py (новый скрипт): обновляет только metadata.document_title в ChromaDB без re-embed (embeddings не зависят от title). 3-tier logic: clean (BOM/spaces) → fname normalize → skip. Обновил 69,292/164,496 чанков (42%) за 5 минут вместо часов re-embedding'а.
Lyumi Weekly Review артифакт: HTML dashboard с Chart.js + Grid.js. 8 KPI cards, line/bar/donut charts, top 1% best/worst tables, OpenRouter CSV cost data подвязана. Табы 7 days / 30 days / all-time. Для субботних разборов.
Вечер — Пушкин apgrade
Phase 0 — Sonar upgrade (digest_bot.py):
- SONAR_MODEL: perplexity/sonar → perplexity/sonar-pro
- Sub-queries: 8 → 5 (меньше count, выше качество источников)
- Stack для /topic /trends /analytics: 5× sonar-pro + 1× sonar-reasoning-pro
Phase 0.5 — Cross-language:
- Promt: «MINIMUM 2 EN queries focusing on OSHA/IOGP/NIOSH/CSB»
- Post-processing: _is_en() детектирует EN-запросы по ascii-letters ≥ 60%
- Финальные top-5 гарантированно содержат ≥2 EN
Phase 1 — thinking + cache_control (call_openrouter):
- Принимает thinking_budget (default 0)
- Если >0 и Claude → reasoning block + temp=1.0 + max_tokens расширяется + timeout 240s
- cache_control: ephemeral на system prompt (Claude only) → ~30-46% input savings
- thinking_budget по типам: analytics/case/topic = 32K, trends = 16K, npa/easter = 0
URL fix (DIGEST_SYSTEM_PROMPT): - Разграничение: «в основном тексте — БЕЗ URL inline, в блоке Источники — обязательно 2-3 URL из [SOURCES]» - Решило проблему «Opus писал «уточните на Әділет» вообще без ссылок»
Phase 2 — Multi-stage writing (multi_stage_writing): - 4-stage editorial pipeline для /case и /analytics: 1. Outline → Gemini 2.5 Flash (1M контекст, без reasoning) 2. Draft → Opus 4.7 + thinking 32K 3. Edit → Sonnet 4 (cuts AI-isms) 4. Polish → Opus 4.7 + thinking 4K (восстанавливает голос Люми) - Fallback: если Outline вернул < 200 chars → single-stage Opus (защита от Gemini Pro reasoning trace bug) - Цена за тяжёлый пост: ~$0.45 → ~$0.60 (+33%) - Время: 2 мин → 3-4 мин
Среда — ручной день: Среда убрана из SCHEDULE. Камал публикует картинку + Telegram poll руками. Разгрузка ритма аудитории между длинными постами + engagement через poll.
Anti-фантом-тема — 3 линии защиты (триггер — Пушкин писал «Приказ МТСЗН №267 — обучение по БиОТ», хотя №267 о декларировании):
- Линия 1 (Writer) — DIGEST_SYSTEM_PROMPT новое правило «Не выдумывай ТЕМУ приказа по его номеру»
- Линия 2 (Reflection) — добавлен пункт 10 «ФАНТОМНАЯ ТЕМАТИЧЕСКАЯ АТРИБУЦИЯ» в REFLECTION_SYSTEM_PROMPT
- Линия 3 (Pre-flight KB+Haiku) — detect_phantom_npa_themes(post):
- Regex _NPA_WITH_THEME_PATTERN извлекает «Приказ X № N от DD.MM.YYYY — тема»
- kb_api /npa_lookup?q=<номер> → реальные titles из ChromaDB Lyumi
- Haiku-сравнение _haiku_theme_match(): JSON {mismatch, confidence}
- Если mismatch ≥ 0.7 → hint в raw_content для Haiku+Gemini reflection
- Цена: $0.002/пост, fallback при недоступности kb_api
International standards whitelist (detect_phantom_npa_numbers):
- _INTERNATIONAL_STANDARDS_WHITELIST regex: NFPA, ISO, IEC, EN, OSHA, ANSI, IOGP, NIOSH, ACGIH, NEBOSH, IOSH, ILO, WHO, CSB, HSE UK, OHSAS, GRI, IPIECA
- _is_whitelisted_intl_standard() пропускает до kb_api lookup (в Люми ChromaDB их нет, KZ-фокус)
- Раньше: «NFPA 652» фантом → scrub_fallback вырезал → «по методологии » с пустым местом
- Теперь: международные стандарты проходят без false-positive
Tone variations в POST_TYPE_PROMPTS: - Мягкие интонационные блоки «ТОН ДЛЯ ЭТОГО ФОРМАТА» для /npa, /trends, /case, /easter - Не разбивают голос Люми на 5 личностей — единый персонаж, разная интонация под формат - npa = деловой/конкретный, trends = аналитический, case = драматургия+уроки, easter = тёплый+юмор
Поздно-вечерние хотфиксы:
1. Әділет SSL fix — httpx.AsyncClient(verify=False) в fetch_adilet_updates(). Раньше падало с CERTIFICATE_VERIFY_FAILED после rebuild Docker (CA-bundle issue). Теперь парсер реально ходит, дополняет Sonar Pro.
2. Reflection на /npa — добавлено в обоих местах (cmd_npa ad-hoc + scheduled mode). Раньше /npa был «голый» без проверок. Теперь все 3 линии защиты работают и на NPA-постах (концентрация цитат приказов максимальная).
3. OpenRouter top-up — Камал залил $15. До этого падало 402 Payment Required: thinking_budget=32K + max_tokens=2000 = 34K зарезервировано, баланс не тянул.
Боевая проверка (вечер 29 апр)
/npa — №267: ДО апгрейда Пушкин писал «Приказ МТСЗН №267 от 10.09.2025 — обновление требований к обучению по БиОТ» (ФАНТОМ). ПОСЛЕ: «Приказ МТСЗН №267 от 10.09.2025. Упоминается в поисковой выдаче по теме охраны труда. Точное содержание рекомендую смотреть непосредственно в карточке документа на Әділет». Идеальное брендовое поведение.
/case NFPA 652 — пылевые взрывы: - Multi-stage все 4 ступени: outline 2326 → draft 5919 → edit 5793 → polish 5791 - thinking 32K на draft, thinking 4K на polish - cached_tokens: 5172 на полирующем Opus → cache_control работает - Whitelist: «NFPA 652» прошёл без false-positive flag - verify_urls: вычистил 1 битый URL (404 NFPA News), оставил 2 рабочих - Пост: Washburn A Mill 1878 → корневые причины в 4 слоя → 5 уроков (DHA, 1/32 inch rule, vacuum vs compressed air) → переход на КЗ-индустрии → вопрос читателю → express checklist
Известные открытые баги (не закрыты сегодня)
- Markdown
__url__иногда проскакивает в финальном тексте (__https://...__) — старый баг_safe_telegram_html - ASCII-таблицы в /case иногда обрываются (HTML escape)
- Reflection conf=1.00 + applied=False иногда (порог
should_apply_correction) - Әділет search endpoint 404 (сайт поменял URL structure, Sonar компенсирует)
Что дальше — суббота-воскресенье 2-3 мая
- Lyumi-бот миграция CPX62 → AX41 (rsync lyumi-chroma volume + /opt/lyumi/, cutover)
- Pushkin миграция (та же схема)
- archive_extract.py фикс + полный re-extract 167K чанков в *_v2 коллекции
- bge-m3 fine-tune на vast.ai H100 ($1-2, 25-40 мин)
- B2 backup phase 2 (добавить lyumi-chroma + cards + Pushkin paths)
Why
29 апреля — последний рабочий день перед окном миграции. Цель — выйти на субботу с «чистыми руками»: база почищена, баг экстрактора зафиксирован, Пушкин из 80%-рабочего стал 95%-рабочим, OAuth и бэкапы работают без потерь сессии. В субботу остаётся только перевезти и файн-тюнить.