{"event_type":"site_update","title":"Dark-mode polish for sponsor layer + Market Pulse partner chip","description":"Добавили отдельный dark-wordmark для ROI MEDIA, чтобы бренд корректно читался в тёмной теме, усилили контраст header/footer/accordion/channel chips и вывели sponsor-chip на страницу /market-pulse/ для консистентного партнёрского слоя на аналитических страницах.","datetime":"2026-03-18 12:55:00 UTC","datetime_iso":"2026-03-18T12:55:00+00:00","tags":["frontend","branding","theming","analytics"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Тёмная тема + переключатель рядом с языком + cleanup footer","description":"Добавили глобальную тёмную тему с режимами Авто/Тёмная/Светлая и переключателем рядом с RU/EN. В footer убрали ссылки на Telegram-канал и бота, перенесли акцент на партнёрский блок ROI MEDIA, а навигацию в footer перевели на более предсказуемый JS-toggle вместо нестабильного поведения details/summary.","datetime":"2026-03-18 12:40:00 UTC","datetime_iso":"2026-03-18T12:40:00+00:00","tags":["frontend","ui","theming","footer","branding"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Yandex vacancy feed + Google Indexing API scaffold + anti-duplicate crawler hints","description":"Добавили curated feed /vacancy-feed.xml под вакансии для Яндекса: только активные вакансии с числовой зарплатой, контактами и quality threshold. Параллельно добавили условный Google Indexing API submitter для job URL (включается через service account), усилили JobPosting schema полем validThrough и честным omission hiringOrganization для вакансий без компании, а в robots.txt добавили Host/Clean-param директивы для снижения дублей.","datetime":"2026-03-14 15:05:00 UTC","datetime_iso":"2026-03-14T15:05:00+00:00","tags":["seo","indexing","backend","feeds","google","yandex"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Data policy + comparison cluster expansion + external skills import","description":"Добавили страницу /data-policy.php с правилами сбора и исправления данных, расширили раздел /comparisons/ новыми GEO/AEO-страницами (Media Buyer vs Affiliate Manager, iGaming vs Crypto, Remote affiliate jobs), усилили taxonomy/company посадочные факт-блоками и FAQ, а также импортировали внешний набор рабочих skills в skills/external/ для дальнейшей локальной работы внутри проекта.","datetime":"2026-03-14 12:10:00 UTC","datetime_iso":"2026-03-14T12:10:00+00:00","tags":["seo","aeo","frontend","backend","workflow"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Снижение AI-расходов: anti-repeat review + single scheduler","description":"Убрали дублирующий hourly запуск через cron (оставили systemd timer как single source of truth), добавили throttle для AI-модерации pending очереди: cooldown по часам и лимит попыток на запись. Также добавили alert по оценке AI-расхода за окно (tokens->USD) для раннего контроля затрат.","datetime":"2026-03-05 02:45:00 UTC","datetime_iso":"2026-03-05T02:45:00+00:00","tags":["ai","pipeline","cost-control","ops"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Unified MV refresh helper + DB retention cleanup","description":"Убрали дублирование refresh materialized views: добавили единый helper scripts/analytics/refresh_mviews.sh и подключили его в hourly, daily и post-deploy. Также внедрили retention cleanup для alert_events и review_queue_pending_history (defaults: 180/365 дней) через scripts/ops/retention_cleanup.php.","datetime":"2026-03-03 07:43:00 UTC","datetime_iso":"2026-03-03T07:43:00+00:00","tags":["database","ops","pipeline","maintenance"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"PageSpeed pass: reduced layout-shift risk from feedback modal","description":"Для снижения вероятности CLS до загрузки CSS добавили нативное hidden-состояние feedback modal и базовое fixed-позиционирование feedback button inline. Также для Market Pulse подключен stylesheet preload. После обновления mobile PSI по /market-pulse/ стабилен на high-score диапазоне.","datetime":"2026-03-03 07:31:00 UTC","datetime_iso":"2026-03-03T07:31:00+00:00","tags":["performance","frontend","cwv"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"PageSpeed tuning: Market Pulse CLS stabilization","description":"Для /market-pulse/ добавили preload основного CSS и стабилизировали высоты ключевых блоков (stats, KPI, trend, compact-list), чтобы уменьшить mobile CLS и снизить вероятность layout shift при первичной отрисовке.","datetime":"2026-03-03 07:17:00 UTC","datetime_iso":"2026-03-03T07:17:00+00:00","tags":["performance","frontend","seo","cwv"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Hourly rollup window optimized (14d default)","description":"Снизили вычислительную нагрузку hourly pipeline: пересчет rollups теперь по умолчанию идет за 14 дней (настраивается через HOURLY_ROLLUP_DAYS), вместо полного 90-дневного окна каждый час. Глубокий пересчет оставлен в daily maintenance.","datetime":"2026-03-03 07:03:00 UTC","datetime_iso":"2026-03-03T07:03:00+00:00","tags":["pipeline","performance","database"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Daily pipeline split from hourly ingest","description":"Убрали дублирование: daily timer больше не гоняет hourly ingest. Добавлен отдельный run_daily_pipeline.sh для maintenance-задач (rollups, MV refresh, SEO audit/smoke, monitoring). Также в install_on_vps.sh добавлен daemon-reload сразу после установки daily systemd unit для надежной синхронизации ExecStart.","datetime":"2026-03-03 06:58:00 UTC","datetime_iso":"2026-03-03T06:58:00+00:00","tags":["pipeline","ops","performance","reliability"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"SEO smoke log retention control","description":"Добавили ретеншн для SEO smoke NDJSON-лога: после записи автоматически удерживаются только последние N строк (по умолчанию 2000, настраивается через LOG_MAX_LINES). Это предотвращает бесконечный рост файла мониторинга.","datetime":"2026-03-03 06:54:00 UTC","datetime_iso":"2026-03-03T06:54:00+00:00","tags":["monitoring","ops","performance"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"SEO smoke fail alerts via Telegram events","description":"Для SEO smoke-check добавили алерт при статусе fail через существующий канал send_telegram_alerts.php с дедупликацией по event_key/event_bucket. Также укрепили fail-path скрипта: даже при сетевых ошибках и пустом HTML теперь гарантированно сохраняется NDJSON/JSON запись с причинами.","datetime":"2026-03-03 06:47:00 UTC","datetime_iso":"2026-03-03T06:47:00+00:00","tags":["seo","monitoring","ops","alerts"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"API cache-hardening: ETag/304 + no-store on errors","description":"Завершили rollout кэширования на публичных JSON API: успешные ответы теперь унифицированно отдаются через site_send_json_cached() с ETag/Cache-Control (60-300s), а error/rate-limit ответы принудительно помечаются no-store. Это снижает лишний трафик на повторных запросах и убирает риск кэширования 4xx/5xx.","datetime":"2026-03-03 06:41:00 UTC","datetime_iso":"2026-03-03T06:41:00+00:00","tags":["api","performance","backend","reliability"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"SEO Smoke Monitor в админке + NDJSON лог","description":"Добавили запись результатов SEO smoke-check в /var/www/aff-job/shared/metrics/seo_smoke.ndjson (и latest JSON) и вывели в админке аналитики отдельный блок последних 10 прогонов: статус, время, errors/warns/checks и краткие детали.","datetime":"2026-03-03 06:40:00 UTC","datetime_iso":"2026-03-03T06:40:00+00:00","tags":["admin","seo","monitoring","ops"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Post-deploy SEO smoke checks automated","description":"В remote post-deploy checks добавили отдельный SEO smoke-блок: проверка ключевых URL (HTTP 200), наличия title/canonical/h1, Sitemap в robots.txt и контроль дубликатов BreadcrumbList на taxonomy. Это снижает риск тихих SEO-регрессий после релизов.","datetime":"2026-03-03 06:25:00 UTC","datetime_iso":"2026-03-03T06:25:00+00:00","tags":["seo","ops","deploy","qa"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Cloudflare selective purge in post-deploy flow","description":"Добавили ops-скрипт selective purge для Cloudflare (главная, robots, sitemap и ключевые аналитические страницы) и подключили его в remote post-deploy checks. При отсутствии CF credentials шаг автоматически пропускается, поэтому деплой остаётся безопасным.","datetime":"2026-03-03 06:22:00 UTC","datetime_iso":"2026-03-03T06:22:00+00:00","tags":["ops","seo","performance","deploy"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Taxonomy breadcrumbs cleanup (single schema)","description":"Убрали дублирующуюся BreadcrumbList разметку на страницах taxonomy и перевели breadcrumb trail на корректную иерархию (Главная -> Вакансии -> Роли/Вертикали/Форматы -> Текущий раздел). Это улучшает чистоту SEO-сигналов без изменения URL-структуры.","datetime":"2026-03-03 06:13:00 UTC","datetime_iso":"2026-03-03T06:13:00+00:00","tags":["seo","schema","frontend","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Robots.txt normalization for Google parsing","description":"Привели robots.txt к более совместимому формату для парсера Google/PSI: убрали Host-директиву и унифицировали query-правила через wildcard-шаблоны. Это снижает риск false-positive ошибки “robots.txt недействителен” в технических аудитах.","datetime":"2026-03-03 06:00:00 UTC","datetime_iso":"2026-03-03T06:00:00+00:00","tags":["seo","indexing","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"SQL profiler in pipeline + admin visibility","description":"Добавили lightweight SQL-профайлер (EXPLAIN ANALYZE) для ключевых read-query. В hourly pipeline он запускается в best-effort режиме с TTL skip, пишет JSON-отчёт в shared metrics, а в админке аналитики теперь отображается сводка latency и статус по каждому запросу.","datetime":"2026-03-03 05:47:07 UTC","datetime_iso":"2026-03-03T05:47:07+00:00","tags":["database","performance","admin","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"DB index pack for catalog filters and analytics","description":"Применили дополнительный набор PostgreSQL-индексов для фильтров/сортировок каталога вакансий (work_format, salary expression, role/vertical tags) и поддерживающих analytics/review-запросов. Это снижает latency на /jobs-фильтрах и тяжёлых аналитических страницах при росте нагрузки.","datetime":"2026-03-03 05:23:56 UTC","datetime_iso":"2026-03-03T05:23:56+00:00","tags":["database","performance","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Homepage TTFB cache layer (120s)","description":"Добавили короткий серверный кэш для агрегатов главной страницы (статистика, топ ролей/вертикалей/каналов, последние вакансии), чтобы снизить нагрузку на БД и стабилизировать first-byte под нагрузкой. Кэш хранится в /tmp и обновляется каждые 120 секунд.","datetime":"2026-03-03 05:18:41 UTC","datetime_iso":"2026-03-03T05:18:41+00:00","tags":["performance","backend","analytics"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"CWV boost + real client IP rate limiting","description":"Перевели загрузку аналитических скриптов на interaction/late-load стратегию для снижения mobile JS overhead и улучшения PSI. Добавили определение реального client IP (CF-Connecting-IP/X-Forwarded-For) для rate-limit на feedback/API, чтобы исключить коллизии по edge-IP Cloudflare.","datetime":"2026-03-03 05:14:32 UTC","datetime_iso":"2026-03-03T05:14:32+00:00","tags":["performance","backend","security","api"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Company normalization cleanup for role-noise","description":"Улучшили нормализацию компаний: удаляется типичный role-сuffix в формате «Company. Media Buyer ...». Это снижает шум в аналитике и улучшает качество company-страниц/поиска.","datetime":"2026-03-03 05:05:06 UTC","datetime_iso":"2026-03-03T05:05:06+00:00","tags":["backend","parsing","analytics"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Sitemap freshness + archived jobs index policy","description":"Улучшили точность sitemap lastmod: для статических роутов используется filemtime, для динамики остаётся DB-driven lastmod. Ввели SEO-политику для архивных вакансий: noindex на карточках и JobPosting schema только для активных вакансий.","datetime":"2026-03-03 05:02:40 UTC","datetime_iso":"2026-03-03T05:02:40+00:00","tags":["seo","backend","indexing"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Deploy safety fix for hourly pipeline timer","description":"Исправили install_on_vps.sh: деплой больше не выключает aff-job-hourly.timer. Теперь hourly ingest/moderation/publish и daily analytics таймеры стабильно работают параллельно после каждого релиза.","datetime":"2026-03-03 04:29:23 UTC","datetime_iso":"2026-03-03T04:29:23+00:00","tags":["backend","pipeline","ops"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Stability + Mobile UX + API Limits","description":"Добавили общий rate-limit для feedback и API v1 endpoint’ов, перевели header в hamburger до tablet-ширины, увеличили touch-target для навигации/футера/ярлыков каналов, выровняли feedback-виджет справа и обновили RU-названия Market Pulse.","datetime":"2026-03-03 04:21:35 UTC","datetime_iso":"2026-03-03T04:21:35+00:00","tags":["frontend","backend","seo","api"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Переведены языковые URL на чистый формат /en/...","description":"Убрали зависимость от ?lang=en: теперь локализованные страницы используют чистые EN-адреса (/en/...), добавили совместимость со старыми ссылками через 301 и обновили hreflang/canonical генерацию.","datetime":"2026-02-28 03:46:00 UTC","datetime_iso":"2026-02-28T03:46:00+00:00","tags":["seo","geo","i18n","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Добавлены GEO/AEO comparison-страницы и FAQ schema","description":"Запущен раздел /comparisons/affiliate-jobs-channels/ с публичным бенчмарком каналов. Расширили FAQPage schema на jobs/channels/reports и улучшили discoverability в sitemap/навигации.","datetime":"2026-02-28 03:44:00 UTC","datetime_iso":"2026-02-28T03:44:00+00:00","tags":["seo","aeo","frontend","analytics"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Импортирован локальный набор AI/SEO/UI skills в проект","description":"Подключили и задокументировали 6 skill-пакетов (UI/UX, frontend design, content, pSEO, SEO audit, GEO/AEO) с агентными манифестами для дальнейшей работы по продукту.","datetime":"2026-02-28 03:41:00 UTC","datetime_iso":"2026-02-28T03:41:00+00:00","tags":["workflow","ai","seo","ui"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Усилена безопасность админки: включен ADMIN_PASSWORD_HASH","description":"На проде отключили plaintext ADMIN_PASSWORD, включили вход через bcrypt-хеш и сохранили пороги AI apply в env (publish=0.75, reject=0.80).","datetime":"2026-02-28 03:18:00 UTC","datetime_iso":"2026-02-28T03:18:00+00:00","tags":["security","admin","backend","ai"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Запущен RU/EN слой интерфейса","description":"Для технических страниц добавили двуязычные мета-данные, hreflang-ссылки и EN-локаль через lang=en (тексты вакансий остаются в исходном языке).","datetime":"2026-02-28 03:13:00 UTC","datetime_iso":"2026-02-28T03:13:00+00:00","tags":["frontend","seo","geo","i18n"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Глобальный header + breadcrumbs на всех страницах","description":"Добавили единый верхний хедер с выпадающей навигацией, переключателем RU/EN и SEO-breadcrumbs (включая BreadcrumbList schema). Убрали дублирующее меню из hero-блоков внутренних страниц.","datetime":"2026-02-28 03:12:00 UTC","datetime_iso":"2026-02-28T03:12:00+00:00","tags":["frontend","seo","aeo","navigation"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Калибровка AI-модерации добавлена в админку","description":"В разделе AI review появилась метрика точности по ручным решениям, confidence buckets, рекомендации по порогам publish/reject и список расхождений для ручного разбора.","datetime":"2026-02-28 02:55:00 UTC","datetime_iso":"2026-02-28T02:55:00+00:00","tags":["ai","admin","analytics","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Добавлен product changelog feed и CLI для релиз-логов","description":"Сделали отдельный фид обновлений продукта /feeds/product-changelog.ndjson.php и скрипт scripts/changelog/add_entry.php для быстрого добавления записей после релизов.","datetime":"2026-02-28 02:48:00 UTC","datetime_iso":"2026-02-28T02:48:00+00:00","tags":["feeds","backend","monitoring"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Запущен публичный research-отчёт по рынку вакансий","description":"Добавили раздел /research/ в формате воспроизводимого исследования: executive summary, зарплаты, роли, вертикали, quality/noise-метрики, формулы и ограничения. Плюс открытые датасеты JSON/CSV и PDF-версия отчёта.","datetime":"2026-02-27 23:12:00 UTC","datetime_iso":"2026-02-27T23:12:00+00:00","tags":["research","analytics","seo","frontend","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Обновлена главная и мобильная навигация","description":"Добавили блок с 5 последними вакансиями, секции в табах на главной, переименовали H2, перевели footer-навигацию в drop-up, увеличили touch-target ссылок и закрепили feedback-виджет. Также подтвердили валидный robots.txt и включили long-cache заголовки для статики.","datetime":"2026-02-27 22:45:00 UTC","datetime_iso":"2026-02-27T22:45:00+00:00","tags":["frontend","seo","mobile","ux","performance"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Переключено превью соцсетей на v2","description":"Обновили мета-картинку для og:image и twitter:image на новый бренд-вариант. Это влияет на карточку сайта при публикации ссылок в Telegram и других соцсетях.","datetime":"2026-02-27 19:13:00 UTC","datetime_iso":"2026-02-27T19:13:00+00:00","tags":["branding","seo","frontend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Добавлен Weekly Reports Monitor в админку","description":"В админке аналитики появился блок со статусом weekly-отчетов, покрытием по дням и быстрыми ссылками на страницы недель.","datetime":"2026-02-27 19:07:00 UTC","datetime_iso":"2026-02-27T19:07:00+00:00","tags":["analytics","admin","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Запущены weekly-отчеты /reports/weekly-YYYY-WW/","description":"Добавили публичный раздел weekly-отчетов с архивом недель, метриками прозрачности и топами каналов/skills.","datetime":"2026-02-27 19:00:00 UTC","datetime_iso":"2026-02-27T19:00:00+00:00","tags":["analytics","frontend","seo"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Materialized views для аналитики","description":"Ввели analytics_mv_market_daily, analytics_mv_channel_daily и analytics_mv_weekly_rollup для ускорения тяжелых витрин и отчетов.","datetime":"2026-02-27 18:58:00 UTC","datetime_iso":"2026-02-27T18:58:00+00:00","tags":["database","backend","analytics"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Алерт на рост pending в review_queue","description":"Добавили снимки очереди и Telegram-алерт при устойчивом росте pending, чтобы ловить деградацию модерации.","datetime":"2026-02-27 18:58:00 UTC","datetime_iso":"2026-02-27T18:58:00+00:00","tags":["ai","monitoring","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Улучшен SEO аудит и интеграция PageSpeed API","description":"Подключили ключ PageSpeed API, расширили диагностику CWV и стабилизировали аудит в админке.","datetime":"2026-02-27 18:50:00 UTC","datetime_iso":"2026-02-27T18:50:00+00:00","tags":["seo","analytics","admin"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Публичные аналитические фиды JSON/CSV","description":"Добавили daily-выгрузки аналитики рынка и каналов в машинных форматах для внешних интеграций.","datetime":"2026-02-27 18:40:00 UTC","datetime_iso":"2026-02-27T18:40:00+00:00","tags":["feeds","analytics","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Публичные страницы Market Pulse и Channels","description":"Собрали витрины индексов рынка и качества каналов на данных Telegram-парсинга.","datetime":"2026-02-27 18:35:00 UTC","datetime_iso":"2026-02-27T18:35:00+00:00","tags":["frontend","analytics","seo"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Hourly pipeline + Telegram summary","description":"Настроили часовой systemd-проход: ingest -> AI-review -> publish -> rollups + итоговый отчет в Telegram.","datetime":"2026-02-27 18:30:00 UTC","datetime_iso":"2026-02-27T18:30:00+00:00","tags":["parsing","ai","monitoring","backend"],"url":"https://affiliate.careers/changelog.php"}
{"event_type":"site_update","title":"Добавлены Contact / Privacy / Terms","description":"Собрали базовые юридические и контактные страницы и подключили в общий footer.","datetime":"2026-02-27 17:55:00 UTC","datetime_iso":"2026-02-27T17:55:00+00:00","tags":["frontend","seo"],"url":"https://affiliate.careers/changelog.php"}
