[P0] tradein: скраперы отрабатывают вхолостую — данные не обновляются 5–18 дней, avito 0 активных #2574

Closed
opened 2026-07-31 12:12:29 +00:00 by lekss361 · 3 comments
Owner

Обнаружено при разведке расширения на область (2026-07-31). Затрагивает весь продукт, не только область.

Симптом

Планировщик жив, задачи запускаются по расписанию и завершаются со статусом done, но собирают ноль объявлений: total_seen=0, new_count=0 во всех прогонах.

Свежесть данных (listings.last_seen_at, на 2026-07-31):

source активных последний сбор давность
cian 17 237 2026-07-26 5 дней
domklik 6 296 2026-07-18 13 дней
yandex 11 243 2026-07-14 17 дней
avito 0 2026-07-13 18 дней
n1 0 2026-06-16 45 дней

Что видно в логах

domclick-sweep run_id=2773: BrowserFetcher: ошибка запроса (HTTPStatusError) ...
domclick-sweep run_id=2773: SERP phase failed → 0 listings blocked=0 errors=1 — marking failed
cian-sweep run_id=2789 anchor Н.Тагил: SERP fetched=0 nb_kept=0 ins=0 upd=0

То есть запросы уходят, но выдача пустая либо ошибка HTTP. blocked=0 — явной капчи не фиксируется, что подозрительно: похоже на изменение ответа площадок либо тихий бан.

Возможные причины (не проверено)

  • В пуле один прокси: proxy_pool: healthcheck done — reaped=0 checked=1 ok=1 — единственный exit-IP 109.248.167.72. При таком пуле бан по IP выносит все источники разом.
  • Изменение вёрстки/API площадок (domclick ходит в BFF API — контракт мог поменяться).
  • Истёкшие куки/сессии.

Почему это важно

Оценка строится на аналогах из листингов. Сейчас продукт считает по данным двух-трёхнедельной давности, а Avito — основной источник по малым городам — не даёт вообще ничего (0 активных). Пользователь при этом видит обычный ответ с обычной уверенностью: тихая деградация качества, а не видимая ошибка.

Отдельный вопрос: deactivate_stale_* отрабатывают ежедневно, но yandex сохраняет 11 243 «активных» при последнем сборе 17 дней назад — стоит проверить, корректен ли порог устаревания.

Что сделать

  1. Диагностика по каждому источнику отдельно: живой прогон одного sweep вручную с логом ответа площадки (по правилам проекта — сначала через playwright, а не curl).
  2. Проверить пул прокси: почему один IP, есть ли ротация.
  3. Проверить пороги deactivate_stale_* — не держим ли мы протухшие объявления активными.
  4. Мониторинг: сейчас пустой прогон завершается как done — нужен алерт на total_seen=0 подряд N раз, иначе такое снова пройдёт незамеченным.

Приоритет высокий: чем дольше, тем сильнее расходятся оценки с рынком.

Обнаружено при разведке расширения на область (2026-07-31). **Затрагивает весь продукт, не только область.** ## Симптом Планировщик жив, задачи запускаются по расписанию и завершаются со статусом `done`, но собирают **ноль объявлений**: `total_seen=0, new_count=0` во всех прогонах. Свежесть данных (`listings.last_seen_at`, на 2026-07-31): | source | активных | последний сбор | давность | |---|---|---|---| | cian | 17 237 | 2026-07-26 | 5 дней | | domklik | 6 296 | 2026-07-18 | 13 дней | | yandex | 11 243 | 2026-07-14 | 17 дней | | avito | **0** | 2026-07-13 | 18 дней | | n1 | **0** | 2026-06-16 | 45 дней | ## Что видно в логах ``` domclick-sweep run_id=2773: BrowserFetcher: ошибка запроса (HTTPStatusError) ... domclick-sweep run_id=2773: SERP phase failed → 0 listings blocked=0 errors=1 — marking failed cian-sweep run_id=2789 anchor Н.Тагил: SERP fetched=0 nb_kept=0 ins=0 upd=0 ``` То есть запросы уходят, но выдача пустая либо ошибка HTTP. `blocked=0` — явной капчи не фиксируется, что подозрительно: похоже на изменение ответа площадок либо тихий бан. ## Возможные причины (не проверено) - **В пуле один прокси**: `proxy_pool: healthcheck done — reaped=0 checked=1 ok=1` — единственный exit-IP `109.248.167.72`. При таком пуле бан по IP выносит все источники разом. - Изменение вёрстки/API площадок (domclick ходит в BFF API — контракт мог поменяться). - Истёкшие куки/сессии. ## Почему это важно Оценка строится на аналогах из листингов. Сейчас продукт считает по данным двух-трёхнедельной давности, а Avito — основной источник по малым городам — не даёт вообще ничего (0 активных). Пользователь при этом видит обычный ответ с обычной уверенностью: **тихая деградация качества, а не видимая ошибка**. Отдельный вопрос: `deactivate_stale_*` отрабатывают ежедневно, но yandex сохраняет 11 243 «активных» при последнем сборе 17 дней назад — стоит проверить, корректен ли порог устаревания. ## Что сделать 1. Диагностика по каждому источнику отдельно: живой прогон одного sweep вручную с логом ответа площадки (по правилам проекта — сначала через playwright, а не curl). 2. Проверить пул прокси: почему один IP, есть ли ротация. 3. Проверить пороги `deactivate_stale_*` — не держим ли мы протухшие объявления активными. 4. Мониторинг: сейчас пустой прогон завершается как `done` — нужен алерт на `total_seen=0` подряд N раз, иначе такое снова пройдёт незамеченным. Приоритет высокий: чем дольше, тем сильнее расходятся оценки с рынком.
lekss361 added the
priority/p0
scrapers
tradein
labels 2026-07-31 12:12:37 +00:00
Collaborator

Замер на проде 2026-08-05 12:21 UTC, спустя 5 дней и полтора десятка правок сбора. Симптом снят, пункт 3 не тронут вовсе. Оставляю открытой ради пункта 3.

Свежесть — вылечена

источник активных было → стало последний сбор был → стал
cian 17 237 → 18 530 26.07 (5 дн) → сегодня 04:41
domklik 6 296 → 376 18.07 (13 дн) → сегодня 05:43
yandex 11 243 → 13 616 14.07 (17 дн) → вчера 16:51
avito 04 975 13.07 (18 дн) → сегодня 06:26
n1 0 → 0 16.06 (45 дн) → 16.06 (50 дн)

За 7 суток собрано: yandex 13 954 лота, cian 8 810, avito 5 854, domclick 564. Все четыре площадки работают ежедневно.

Доля пустых прогонов (метрика #2625, только прогоны с lots_fetched в counters) за 14 суток: yandex 24 из 33 → 18 из 35, cian 17 из 35 → 16 из 37. За последние 48 часов — ноль пустых и ноль banned по всем четырём. Последний пустой прогон был 02.08, последний banned — 03.08 (avito_full_load, сбой браузерного сайдкара).

Честная оговорка про причинность. Классификатор «капча → banned» (#2642) в проде с 04.08 19:03 UTC, но с момента деплоя ни разу не сработал — заблокированных прогонов у cian/yandex нет вообще. Пустые прогоны прекратились 02.08, то есть до этого фикса. Что именно вылечило сбор — работы по прокси, срез нагрузки миграцией 206 или площадки сами отпустили — по данным не различить. Так что «капча теперь считается баном» в бою пока не подтверждена, ждём первой реальной волны.

Пункт 3 (пороги устаревания) — не сделан, и это сейчас главное

14 314 объявлений числятся активными, не показавшись 30+ дней:

источник сегмент активных из них не виделись 30+ дней
cian novostroyki 11 336 10 000
yandex novostroyki 9 279 3 571
yandex (null) 544 531
cian (null) 224 212
все vtorichka 14 595 0
avito все 4 975 0

Это 55% «активного» инвентаря Циана и 30% Яндекса. Причина не баг: deactivate_stale_avito.py для cian/yandex деактивирует только сегмент vtorichka с TTL 30 дней, а новостройки и строки без сегмента не трогает вообще — в докстринге аргумент, что Циан и Яндекс не поддерживают полный обход, поэтому паушальный TTL убил бы живой инвентарь. Решение осознанное, но следствие ровно то, о чём эта задача: активность новостроек Циана и Яндекса ничего не означает.

Сейчас разбираю отдельно, питают ли эти строки оценку (то есть двигают ли они выкупную цену) или только аналитику — от ответа зависит, это деньги или метрика. Отпишусь числами.

Побочно найденное

cian_history_backfill молчит 37 дней. Расписание id 96 включено, next_run_at исправно переставляется вперёд, но задача каждую ночь тихо пропускается из-за протухших сессионных кук Циана — и при этом не пишет ни строки в scrape_runs и не двигает last_run_at. То есть сбой того же класса, что описан в #2625: снаружи выглядит как «всё по расписанию». Монитор пустых прогонов такое не ловит по построению — пустых прогонов нет, прогонов нет вообще.

domklik схлопнулся на порядок — 6 296 → 376 активных при живом ежедневном сборе и 564 лотах за неделю. Свежесть идеальная, покрытие обвалилось; разбираюсь, сужение это или деградация.

n1 мёртв не «сломался», а не запланирован — расписания для него нет вовсе, 0 активных, 50 дней. Нужно решение: выпиливать из источников или возвращать.

listing_source_snapshot: 4 зомби-прогона за неделю, последний 02.08, дальше четыре подряд успешных — похоже, вылечено миграцией 202.

Замер на проде 2026-08-05 12:21 UTC, спустя 5 дней и полтора десятка правок сбора. **Симптом снят, пункт 3 не тронут вовсе.** Оставляю открытой ради пункта 3. ## Свежесть — вылечена | источник | активных было → стало | последний сбор был → стал | |---|---|---| | cian | 17 237 → 18 530 | 26.07 (5 дн) → **сегодня 04:41** | | domklik | 6 296 → **376** | 18.07 (13 дн) → **сегодня 05:43** | | yandex | 11 243 → 13 616 | 14.07 (17 дн) → **вчера 16:51** | | avito | **0** → **4 975** | 13.07 (18 дн) → **сегодня 06:26** | | n1 | 0 → 0 | 16.06 (45 дн) → 16.06 (50 дн) | За 7 суток собрано: yandex 13 954 лота, cian 8 810, avito 5 854, domclick 564. Все четыре площадки работают ежедневно. Доля пустых прогонов (метрика #2625, только прогоны с `lots_fetched` в counters) за 14 суток: yandex 24 из 33 → **18 из 35**, cian 17 из 35 → **16 из 37**. За последние 48 часов — **ноль пустых и ноль banned по всем четырём**. Последний пустой прогон был 02.08, последний banned — 03.08 (`avito_full_load`, сбой браузерного сайдкара). **Честная оговорка про причинность.** Классификатор «капча → banned» (#2642) в проде с 04.08 19:03 UTC, но с момента деплоя **ни разу не сработал** — заблокированных прогонов у cian/yandex нет вообще. Пустые прогоны прекратились 02.08, то есть **до** этого фикса. Что именно вылечило сбор — работы по прокси, срез нагрузки миграцией 206 или площадки сами отпустили — по данным не различить. Так что «капча теперь считается баном» в бою пока не подтверждена, ждём первой реальной волны. ## Пункт 3 (пороги устаревания) — не сделан, и это сейчас главное **14 314 объявлений числятся активными, не показавшись 30+ дней:** | источник | сегмент | активных | из них не виделись 30+ дней | |---|---|---|---| | cian | novostroyki | 11 336 | **10 000** | | yandex | novostroyki | 9 279 | **3 571** | | yandex | (null) | 544 | 531 | | cian | (null) | 224 | 212 | | все | vtorichka | 14 595 | 0 | | avito | все | 4 975 | 0 | Это 55% «активного» инвентаря Циана и 30% Яндекса. Причина не баг: `deactivate_stale_avito.py` для cian/yandex деактивирует **только** сегмент `vtorichka` с TTL 30 дней, а новостройки и строки без сегмента не трогает вообще — в докстринге аргумент, что Циан и Яндекс не поддерживают полный обход, поэтому паушальный TTL убил бы живой инвентарь. Решение осознанное, но следствие ровно то, о чём эта задача: активность новостроек Циана и Яндекса ничего не означает. Сейчас разбираю отдельно, **питают ли эти строки оценку** (то есть двигают ли они выкупную цену) или только аналитику — от ответа зависит, это деньги или метрика. Отпишусь числами. ## Побочно найденное **`cian_history_backfill` молчит 37 дней.** Расписание id 96 включено, `next_run_at` исправно переставляется вперёд, но задача каждую ночь тихо пропускается из-за протухших сессионных кук Циана — и при этом **не пишет ни строки в `scrape_runs` и не двигает `last_run_at`**. То есть сбой того же класса, что описан в #2625: снаружи выглядит как «всё по расписанию». Монитор пустых прогонов такое не ловит по построению — пустых прогонов нет, прогонов нет вообще. **domklik схлопнулся на порядок** — 6 296 → 376 активных при живом ежедневном сборе и 564 лотах за неделю. Свежесть идеальная, покрытие обвалилось; разбираюсь, сужение это или деградация. **n1 мёртв не «сломался», а не запланирован** — расписания для него нет вовсе, 0 активных, 50 дней. Нужно решение: выпиливать из источников или возвращать. **`listing_source_snapshot`**: 4 зомби-прогона за неделю, последний 02.08, дальше четыре подряд успешных — похоже, вылечено миграцией 202.
Collaborator

Поправка к предыдущему комментарию: пункт про n1 снимаю — решать нечего, решено 31.07 в #2593. Источник выпилен по твоему решению (на 90% миграцией 165, остатки — там же), данные намеренно оставлены как неактивные: 382 объявления, каскадное удаление снесло бы 15 913 снимков источников без всякой пользы. Так что «0 активных, расписания нет» — это ожидаемое состояние, а не сбой.

Остальные пункты в силе.

Поправка к предыдущему комментарию: пункт про **n1 снимаю** — решать нечего, решено 31.07 в #2593. Источник выпилен по твоему решению (на 90% миграцией 165, остатки — там же), данные намеренно оставлены как неактивные: 382 объявления, каскадное удаление снесло бы 15 913 снимков источников без всякой пользы. Так что «0 активных, расписания нет» — это ожидаемое состояние, а не сбой. Остальные пункты в силе.
Collaborator

Перемер на проде 2026-08-10 09:15-09:40 UTC (read-only). Разметка по всем четырём пунктам «Что сделать» — ниже. Закрываю: остаток пункта 3 живёт в #2659, который заведён из него же.

Заголовочный симптом снят

источник активных 31.07 → 10.08 последний сбор
cian 17 237 → 18 903 4.0 ч назад
yandex 11 243 → 14 588 13.5 ч
avito 09 375 4.4 ч
domklik 6 296 → 748 4.4 ч
n1 0 → 0 16.06 (см. ниже)

Ни одного прогона в статусе running на момент замера; за 7 суток по четырём площадкам 61 прогон, из них banned 13 и failed 6 — то есть отказы теперь видны как отказы, а не как done с нулём.

Поштучно

Пункт 1 — диагностика по каждому источнику. ЗАКРЫТ. Разобран каждый, и каждый диагноз ушёл в свою задачу: cian-капча/yandex-пустые выдачи → #2625 (детект в #2642), охват Домклика → #2657, куки Циана → #2700, куки Домклика → #2704 п.5, полный обход Авито → #2687.

Пункт 2 — пул прокси. ЗАКРЫТ по названному признаку. В issue: «единственный exit-IP 109.248.167.72». Сейчас в пуле 4 включённых узла с 4 разными exit-IP (46.8.110.92, 5.227.10.121, 95.104.183.29, 95.55.49.238), у всех consecutive_fails = 0, последний успешный чек — 30 секунд до замера. Автоматическая ротация написана и ждёт токен ASOCKS — это #2638, отдельная задача владельцу, не этот пункт.

Пункт 3 — пороги deactivate_stale_*. ПРОВЕРЕН, следствие вынесено в #2659. Проверка выполнена 05.08 с числами, из неё и заведён #2659 («у Циана первичка не подметается вовсе») — там же два смерженных PR (#2710 гейт здоровья, #2797 пол TTL по циклу переобхода). Состояние сегодня:

источник / сегмент активных из них не виделись 30+ сут
cian / novostroyki 11 520 10 158
yandex / novostroyki 9 973 4 516
yandex / (null) 544 529
cian / (null) 224 212
cian+yandex / vtorichka 11 230 141
avito / всё 9 375 0
domklik / vtorichka 748 0

Итого 15 415 «активных» строк старше 30 суток — не меньше, чем 14 314 пять дней назад. Но диагноз изменился, и это важно: сегодняшние прогоны показывают в счётчиках revisit_floor_days 34 (cian) / 75 (yandex) / 52 (avito) / 23 (domklik) — это #2797, пол TTL по измеренному циклу переобхода. Порог теперь не «руками подобранное число», а факт: возраст, при котором свип доказал строку живой. Числа держатся высокими потому, что свипы Циана и Яндекса действительно возвращаются к строке раз в 34-75 суток, а не потому, что порог забыли.

Это не деньги. Comp-пул эстиматора (_COMMON_WHERE, Tier W) фильтрует не только is_active, но и scraped_at > NOW() - :fresh_days и listing_segment IS NULL OR = 'vtorichka' — то есть 14 674 протухших первички не участвуют в цене вообще, а 741 строка NULL-сегмента отсекается фильтром свежести. Остаётся домовой якорь без фильтра свежести — это ровно PR #2661, замерен (−2.25%) и ждёт решения владельца (#2704 п.8).

Пункт 4 — мониторинг пустого прогона. ЗАКРЫТ. _alert_if_consecutive_zero_results в services/scrape_runs.py:253, подключён в mark_done (:476), разреженная лестница вех против спама (#2670/#2806), слепота к backfill-счётчикам починена (#2703/#2713). Оговорка, которая от этого пункта не зависит: получателя у алертов в GlitchTip до сих пор нет — #2673, владельцу.

n1 — ноль с причиной, не сбой

n1 в таблице свежести issue есть (0 активных, 45 суток на 31.07; сегодня 56 суток). Диагноз: не «тихо умер», а выпилен по решению владельца. Кода провайдера нет с 2026-06 (миграция 114: портал переехал в Cian), оба расписания (n1_city_sweep, deactivate_stale_n1) удалены миграцией 165 (#2204, решение 03.07), последний прогон — 2026-07-03, scrape_schedules сегодня не содержит ни одной строки с n1. 382 объявления намеренно оставлены как история, все is_active = false. Ноль по n1 в любом замере свежести — ожидаемое состояние; чинить нечего.

Опровергнутая предпосылка

«blocked=0 — явной капчи не фиксируется, что подозрительно» — предположение оказалось верным по факту, но не по причине: капча у Циана и Яндекса не фиксировалась не потому, что её не было, а потому, что у них не существовало пути к статусу banned вовсе (#2625). Починено #2642. При этом с момента деплоя классификатор ни разу не сработал, а пустые прогоны прекратились ДО него — причинность «капча-детект вылечил сбор» так и не подтверждена и подтверждаться не обязана.

Вердикт

Все четыре пункта разобраны: 1, 2, 4 закрыты по названным признакам; 3 проверен и его остаток целиком, дословно, живёт в открытом #2659 (HIGH, два PR смержены за последние 4 дня). Закрываю. Если считаешь, что пункт 3 обязан оставаться под этим номером — переоткрой, спорить не буду.

Перемер на проде 2026-08-10 09:15-09:40 UTC (read-only). **Разметка по всем четырём пунктам «Что сделать» — ниже. Закрываю: остаток пункта 3 живёт в #2659, который заведён из него же.** ## Заголовочный симптом снят | источник | активных 31.07 → 10.08 | последний сбор | |---|---|---| | cian | 17 237 → **18 903** | 4.0 ч назад | | yandex | 11 243 → **14 588** | 13.5 ч | | avito | **0** → **9 375** | 4.4 ч | | domklik | 6 296 → 748 | 4.4 ч | | n1 | 0 → 0 | 16.06 (см. ниже) | Ни одного прогона в статусе `running` на момент замера; за 7 суток по четырём площадкам 61 прогон, из них `banned` 13 и `failed` 6 — то есть отказы теперь **видны как отказы**, а не как `done` с нулём. ## Поштучно **Пункт 1 — диагностика по каждому источнику. ЗАКРЫТ.** Разобран каждый, и каждый диагноз ушёл в свою задачу: cian-капча/yandex-пустые выдачи → #2625 (детект в #2642), охват Домклика → #2657, куки Циана → #2700, куки Домклика → #2704 п.5, полный обход Авито → #2687. **Пункт 2 — пул прокси. ЗАКРЫТ по названному признаку.** В issue: «единственный exit-IP `109.248.167.72`». Сейчас в пуле **4 включённых узла с 4 разными exit-IP** (46.8.110.92, 5.227.10.121, 95.104.183.29, 95.55.49.238), у всех `consecutive_fails = 0`, последний успешный чек — 30 секунд до замера. Автоматическая ротация написана и ждёт токен ASOCKS — это #2638, отдельная задача владельцу, не этот пункт. **Пункт 3 — пороги `deactivate_stale_*`. ПРОВЕРЕН, следствие вынесено в #2659.** Проверка выполнена 05.08 с числами, из неё и заведён #2659 («у Циана первичка не подметается вовсе») — там же два смерженных PR (#2710 гейт здоровья, #2797 пол TTL по циклу переобхода). Состояние сегодня: | источник / сегмент | активных | из них не виделись 30+ сут | |---|---|---| | cian / novostroyki | 11 520 | **10 158** | | yandex / novostroyki | 9 973 | **4 516** | | yandex / (null) | 544 | 529 | | cian / (null) | 224 | 212 | | cian+yandex / vtorichka | 11 230 | 141 | | avito / всё | 9 375 | **0** | | domklik / vtorichka | 748 | **0** | Итого 15 415 «активных» строк старше 30 суток — не меньше, чем 14 314 пять дней назад. **Но диагноз изменился, и это важно:** сегодняшние прогоны показывают в счётчиках `revisit_floor_days` 34 (cian) / 75 (yandex) / 52 (avito) / 23 (domklik) — это #2797, пол TTL по измеренному циклу переобхода. Порог теперь не «руками подобранное число», а факт: возраст, при котором свип **доказал** строку живой. Числа держатся высокими потому, что свипы Циана и Яндекса действительно возвращаются к строке раз в 34-75 суток, а не потому, что порог забыли. **Это не деньги.** Comp-пул эстиматора (`_COMMON_WHERE`, Tier W) фильтрует не только `is_active`, но и `scraped_at > NOW() - :fresh_days` **и** `listing_segment IS NULL OR = 'vtorichka'` — то есть 14 674 протухших первички не участвуют в цене вообще, а 741 строка NULL-сегмента отсекается фильтром свежести. Остаётся домовой якорь без фильтра свежести — это ровно PR #2661, замерен (−2.25%) и ждёт решения владельца (#2704 п.8). **Пункт 4 — мониторинг пустого прогона. ЗАКРЫТ.** `_alert_if_consecutive_zero_results` в `services/scrape_runs.py:253`, подключён в `mark_done` (:476), разреженная лестница вех против спама (#2670/#2806), слепота к backfill-счётчикам починена (#2703/#2713). Оговорка, которая от этого пункта не зависит: получателя у алертов в GlitchTip до сих пор нет — #2673, владельцу. ## n1 — ноль с причиной, не сбой `n1` в таблице свежести issue есть (0 активных, 45 суток на 31.07; сегодня 56 суток). Диагноз: **не «тихо умер», а выпилен по решению владельца.** Кода провайдера нет с 2026-06 (миграция 114: портал переехал в Cian), оба расписания (`n1_city_sweep`, `deactivate_stale_n1`) удалены миграцией 165 (#2204, решение 03.07), последний прогон — 2026-07-03, `scrape_schedules` сегодня не содержит ни одной строки с `n1`. 382 объявления намеренно оставлены как история, все `is_active = false`. Ноль по n1 в любом замере свежести — ожидаемое состояние; чинить нечего. ## Опровергнутая предпосылка «`blocked=0` — явной капчи не фиксируется, что подозрительно» — предположение оказалось верным по факту, но **не по причине**: капча у Циана и Яндекса не фиксировалась не потому, что её не было, а потому, что у них не существовало пути к статусу `banned` вовсе (#2625). Починено #2642. При этом с момента деплоя классификатор ни разу не сработал, а пустые прогоны прекратились ДО него — причинность «капча-детект вылечил сбор» так и не подтверждена и подтверждаться не обязана. ## Вердикт Все четыре пункта разобраны: 1, 2, 4 закрыты по названным признакам; 3 проверен и его остаток целиком, дословно, живёт в открытом #2659 (HIGH, два PR смержены за последние 4 дня). Закрываю. Если считаешь, что пункт 3 обязан оставаться под этим номером — переоткрой, спорить не буду.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2574
No description provided.