[Fable 5][P3] beat_schedule: 4 cron'а написаны в UTC при timezone=Europe/Moscow — бегут на 3ч раньше; price-index ДО medians #1233

Closed
opened 2026-06-13 04:49:47 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P3 (config), confidence 0.75.

Файл

backend/app/workers/beat_schedule.py:289

Evidence (цитата кода)

"schedule": _parse_cron("0 2 5 * *"),  # 02:00 UTC = 05:00 MSK, 5th of month

Why bug

conf.timezone='Europe/Moscow' → crontab трактуется в МСК. Но 4 записи написаны в UTC-логике: refresh-quarter-price-index '0 2 5 * *' фактически 02:00 МСК вместо 05:00 — бежит ЗА 2ч ДО refresh-ekb-districts-medians (04:00 МСК), ломая задокументированный порядок «Runs after ... so deals data is settled» (docstring refresh_quarter_price_index.py). Также: ekburg-permits '0 2 1 * *' (стр. 252, 02:00 вместо 05:00), pzz-sync '0 0 1 * *' (стр. 263, 00:00 вместо 03:00), nspd-harvest-stale '0 1 * * mon' (стр. 305, 01:00 вместо 04:00).

Suggested fix

Перевести cron'ы в МСК: '0 5 5 * *', '0 5 1 * *', '0 3 1 * *', '0 4 * * mon' и поправить комментарии; порядок medians → price-index восстановить обязательно.

Verify notes

  • [real/P3] celery_app.py:83 ставит conf.timezone="Europe/Moscow" (nowfun/enable_utc не переопределены) → crontab трактуется в МСК. 4 entry написаны UTC-числами: price-index "0 2 5 * *" бежит 02:00 МСК вместо 05:00; permits 02:00, pzz 00:00, nspd Mon 01:00 — все на 3ч раньше задокументированного. Трассировка 5-го числа: price-index (02:00) бежит ДО medians "0 4 5 * *" (04:00) — инверсия контракта docstring "Runs after ... so deals data is settled". Не краш, зависимость мягкая, monthly analytics → P3.
  • [real/P3] timezone=Europe/Moscow подтверждён; Celery трактует crontab в conf.timezone — это прямо признают новые комменты того же файла (стр.314/328/343, времена в МСК). 4 записи (289/252/263/305) написаны в UTC-логике → бегут на 3ч раньше намерения; price-index реально 02:00 МСК — ДО medians 04:00, вопреки docstring «Runs after». Защита найдена лишь частичная: data-зависимости нет (medians пишет ekb_districts, MV читают rosreestr_deals) → чисел не ломает, P3 подтверждён.

Provenance

  • Finders: workers, sweep-async
  • Confidence: 0.75
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (config), confidence 0.75. ## Файл [`backend/app/workers/beat_schedule.py:289`](backend/app/workers/beat_schedule.py:289) ## Evidence (цитата кода) ``` "schedule": _parse_cron("0 2 5 * *"), # 02:00 UTC = 05:00 MSK, 5th of month ``` ## Why bug conf.timezone='Europe/Moscow' → crontab трактуется в МСК. Но 4 записи написаны в UTC-логике: refresh-quarter-price-index '0 2 5 * *' фактически 02:00 МСК вместо 05:00 — бежит ЗА 2ч ДО refresh-ekb-districts-medians (04:00 МСК), ломая задокументированный порядок «Runs after ... so deals data is settled» (docstring refresh_quarter_price_index.py). Также: ekburg-permits '0 2 1 * *' (стр. 252, 02:00 вместо 05:00), pzz-sync '0 0 1 * *' (стр. 263, 00:00 вместо 03:00), nspd-harvest-stale '0 1 * * mon' (стр. 305, 01:00 вместо 04:00). ## Suggested fix Перевести cron'ы в МСК: '0 5 5 * *', '0 5 1 * *', '0 3 1 * *', '0 4 * * mon' и поправить комментарии; порядок medians → price-index восстановить обязательно. ## Verify notes - [real/P3] celery_app.py:83 ставит conf.timezone="Europe/Moscow" (nowfun/enable_utc не переопределены) → crontab трактуется в МСК. 4 entry написаны UTC-числами: price-index "0 2 5 * *" бежит 02:00 МСК вместо 05:00; permits 02:00, pzz 00:00, nspd Mon 01:00 — все на 3ч раньше задокументированного. Трассировка 5-го числа: price-index (02:00) бежит ДО medians "0 4 5 * *" (04:00) — инверсия контракта docstring "Runs after ... so deals data is settled". Не краш, зависимость мягкая, monthly analytics → P3. - [real/P3] timezone=Europe/Moscow подтверждён; Celery трактует crontab в conf.timezone — это прямо признают новые комменты того же файла (стр.314/328/343, времена в МСК). 4 записи (289/252/263/305) написаны в UTC-логике → бегут на 3ч раньше намерения; price-index реально 02:00 МСК — ДО medians 04:00, вопреки docstring «Runs after». Защита найдена лишь частичная: data-зависимости нет (medians пишет ekb_districts, MV читают rosreestr_deals) → чисел не ломает, P3 подтверждён. ## Provenance - Finders: `workers, sweep-async` - Confidence: 0.75 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:47 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#1233
No description provided.