Files
portal/night.config.example.json
T
Дмитрий f07ff7a9d6 работник больше не ждёт ответа вечно: сутки без ответа — гаснет
Задача 7 куска 5. 🔴 Зачем это нужно, хотя ждущий никому не мешает: ожидание ответа предел
часов НЕ ест (решение владельца 56) — и ровно поэтому вечное ожидание опасно. Спросивший
и не дождавшийся не гаснет ни по пределу часов, ни по молчанию (признаки жизни у него идут,
он исправно отчитывается о себе). Он висел бы, занимая место в потолке работников, пока
кто-нибудь не заметит его рукой.

· срок считается НЕЗАВИСИМО от того, ждёт работник или идёт дальше «в расчёте на ответ»
  (решение 53): вопрос без ответа сутки означает, что он всё это время работает вслепую;
· из нескольких просроченных берётся САМЫЙ РАННИЙ — он дольше держит работника, и с него
  началось ожидание. Возьми мы последний, причина в утренней бумаге назвала бы не тот вопрос;
· 🟢 ночной вопрос начинает отсчёт с ближайшего утра — это уже умело правило `deadlineHit`:
  спрашивать среди ночи и через сутки гасить за то, что владелец спал, значит наказывать
  его за сон;
· 🔴 СТАРШИНСТВО ДВУХ ПРИЧИН НАЗВАНО ВСЛУХ: приговор пределов старше просрочки — пределы
  про место, деньги и часы, а просрочка про то, что ответа всё нет. Совпади они в одну
  минуту, владелец прочитает ту причину, которая дороже;
· 🪤 своей ветки гашения НЕ заводится: приговор дописывается в тот же `verdict`, дальше
  одна дорога. Второй гаситель на то же дело разъехался бы с первым молча.

🔴 СВОЯ ОШИБКА, ПОЙМАННАЯ СВОЕЙ ЖЕ ПРОВЕРКОЙ НА СВЕЖЕМ ВОПРОСЕ: `deadlineHit` отдаёт
ОБЪЕКТ `{hit, from, reason}`, а не «да/нет». Я проверял его на истинность — а объект истинен
ВСЕГДА, и правило гасило бы каждого, кто задал хоть один вопрос, через мгновение после
вопроса. Красное поймало сразу; проверка «свежий вопрос срока не переступил» стоила ровно
трёх строк и окупилась в первый же прогон.

🟢 И чужой сторож потребовал своё: настройка `owner_answer_deadline_hours` добавлена
в образец `night.config.example.json` — правило «в образце есть каждая настройка, которую
код берёт из cfg». Умолчание 24 ч; о том, что срок взят умолчанием, владелец узнаёт
СТРОКОЙ в сводке (один раз за прогон), а не молчанием.

Прогон: 3015 проверок в 114 файлах, код 0 — ровно предсказанное (было 3009, +6 моих).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 10:40:19 +03:00

43 lines
1.2 KiB
JSON

{
"worker_hours_limit": 24,
"service_wait_hours": 2,
"supervisor_tick_seconds": 30,
"stall_minutes": 30,
"minut_bez_dela": 240,
"odinakovyh_otchyotov_podryad": 5,
"pause_wait_minutes": 20,
"owner_answer_deadline_hours": 24,
"max_tasks_at_once": 1,
"max_workers_per_task": 7,
"workspace_max_age_days": 7,
"base_branch": "feat/noch-proba-1",
"worker_model": "opus",
"rate_limit_type": "seven_day",
"bez_doli_ne_zapuskat": false,
"run_share": 0.14285714285714285,
"start_floor_share": 0.99,
"probe_model": "haiku",
"probe_budget_per_shift": 30,
"probe_budget_window_hours": 24,
"spawn_budget_per_shift": 20,
"item_tests_timeout_minutes": 10,
"disk_free_min_gb": 5,
"disk_bad_probes": 2,
"reviewer_urls": [
"http://localhost:8000/deals",
"http://localhost:8000/clients"
],
"reviewer_limit_minutes": 60,
"reviewer_shot_run_timeout_ms": 120000,
"reviewer_shot_width": 1280,
"reviewer_shot_height": 900,
"mail": {
"host": "SMTP-хост",
"port": 587,
"user": "логин",
"pass": "пароль — сюда, файл вне хранилища кода",
"from": "robot@liderra.ru",
"to": "почта владельца"
}
}