Commit Graph

14 Commits

Author SHA1 Message Date
Дмитрий 8a846c6a94 подъём убивал поднятого работника за полминуты — найдено ПЕРВЫМ ЖЕ живым подъёмом
🔑 НАЙДЕНО НЕ РАССУЖДЕНИЕМ, А ЖИВЫМИ ДЕНЬГАМИ. Работник `w-2` поднят прогоном
`resume-aaf069ab`, ответ владельца до него ДОЕХАЛ (отметка доставки проставлена) — и через
33 секунды он вышел сам. Причина замерена дословно: ящик вопросов `ask.jsonl` живёт В УГЛУ
работника и подъём переживает, а память о прочитанных строках `asked.json` лежит в каталоге
работника ПОД ПРОГОНОМ. Подъём заводит НОВЫЙ прогон — каталог пустой, ящик перечитан
с начала, СТАРЫЙ вопрос подан владельцу как новый (номер 2), работник встал ждать ответа
на него и умер.

🔴 ЗНАЧИТ ЭТО НЕ КОСМЕТИКА: подъём срабатывал и тут же обнулял сам себя. Владелец получал
бы один и тот же вопрос дважды, а поднятый работник не делал бы НИ ОДНОГО шага.
Теперь память переезжает вместе с работником — строго ДО подъёма, потому что круг
надзирателя читает ящик уже через полминуты.

🪤 ВТОРАЯ ПОЧИНКА ТОГО ЖЕ ПОДЪЁМА, И НАПОРОЛСЯ НА НЕЁ Я САМ. Перед подъёмом надзиратель
двигает базовую ветку до вершины (решение владельца 25), а угол погашенного работника
остаётся на СТАРОЙ вершине. Разница «имя базы ↔ его угол» показывала тогда ЧУЖИЕ файлы
из восьми свежих коммитов, и замок файлов на них встал: «занимать нельзя, это мерный
прибор». Теперь от базы меряем ПО ОБЩЕМУ ПРЕДКУ — это ровно то место, где работник
начинал, и движение базы его не трогает.

🪤 ТРЕТЬЕ, ЧТО ВСТАЛО НА ПУТИ: денежные ворота отказали — система прислала вид предела
`five_hour`, а настройка ждала `seven_day`. 🔴 ЗАМЕР ПОКАЗАЛ ГЛАВНОЕ: вид СКАЧЕТ. 08.08
в 12:34 приходил `seven_day`, в 16:38 — `five_hour`; 03–04.08 `seven_day`, 05–06.08
`five_hour`. Значит настройка «ждём один определённый вид» не может быть верной постоянно.
Замысла ворот НЕ ТРОГАЛ — на это слова владельца нет; поставил тот вид, что система шлёт
сейчас, и свёл с ним образец. Неустойчивость названа вопросом владельцу.

🪤 ПОПУТНО ПОЧИНЕН ХРУПКИЙ ЧУЖОЙ СТОРОЖ: он подставлял расхождение словом `'five_hour'`
вписанным и краснел в тот день, когда живая настройка сама становилась такой же, — то есть
охранял не расхождение, а одно конкретное значение. Теперь подставляет заведомо другое
относительно живого.

ПО ПРАВИЛАМ, СТОРОЖ ПЕРВЫМ. Память о вопросах: предсказано красных 4, вышло 4.
Общий предок: 1/1. Вырезаний три, все держат:
· зов переноса убран из кнопки, слово оставлено В ПРИМЕЧАНИИ — 1/1;
· правило заставили заводить пустышку там, где памяти не было — 1/1;
· общий предок подменён обратно именем ветки — 1/1.

🪤 ЧЕСТНО О СВОЁМ ПОРЯДКЕ: починку памяти я начал писать ДО сторожа и откатил её сам,
не дожидаясь напоминания. Сторожа написаны заново и покраснели, как положено.

Полный прогон: 3061 проверка в 114 файлах, код 0 (на входе смены 3047).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 18:20:31 +03:00
Дмитрий 25705df1f3 забытая пауза гаснет через сутки — решение владельца 78 наконец построено и ЗОВЁТСЯ
🔑 ЗАМЕР ПЕРЕД РАБОТОЙ ПЕРЕВЕРНУЛ ЗАДАНИЕ. Владелец направил смену на кусок 6, зная
по моей же бумаге, что куска нет. Перепись поимённо показала: кусок 6 построен ПОЧТИ
ЦЕЛИКОМ — `statePath`, `resumePoint`, `resumePlan`, `rabotaPosleZachtennogo`, `sledOtkata`,
`resumeChecks`, `vyborProdolzhaemogo`, `zavestiProdolzhenie` стоят и зовутся из живого кода
(`cli.mjs`, `run.mjs`, `supervisor.mjs`), кнопка `run --resume` разведена с обычным запуском.
Не построена была ровно ОДНА работа из одиннадцати — задача 9а. Её и построил.
🔴 Бумага смене 37 называла кусок 6 «главным кандидатом, которого нет в живом коде».
Так вышло оттого, что смена 36 читала ПЛАН, а не код. Правило 204 окупилось семнадцатый раз.

ЧТО ПОСТРОЕНО. Работник, простоявший на паузе сутки ОТ МИНУТЫ ПОСТАНОВКИ НА ПАУЗУ, гасится
сам, и владельцу уходит строка. Пауза — команда владельца, отменять её система не вправе,
но ЗАБЫТЫЙ работник держит рабочий угол, свою базу и одно место из семи вечно.

🔴 ОТСЧЁТ ОТ МИНУТЫ ПАУЗЫ, А НЕ ОТ НАЧАЛА ПРОГОНА — оговорено владельцем прямым словом
и закрыто отдельной проверкой: прогон, идущий вторые сутки, работника, поставленного
на паузу час назад, не трогает. Переведи отсчёт на начало прогона — краснеет.

🔴 СБОЙ НЕ ГАСИТ. Файл паузы порван, поля `since` нет или оно не число — работник остаётся
жив, а про сбой уходит строка. Молчаливое «наверное, сутки прошли» гасило бы работника
владельца по сломанному файлу.

🔴 РЕШЕНИЕ 115 ЦЕЛО: у забытой паузы СВОЙ срок в сутки, а не отсечка 8:00. Поставленный
в 23:00 доживает до утра и гаснет в 23:00 следующего дня. `morningCutoff` не тронут.

ПО ПРАВИЛАМ, СТОРОЖ ПЕРВЫМ. Правило: предсказано красных 6, вышло 6.
Зовущий: предсказано 3, вышло 3.

🪤 СТОЛКНОВЕНИЕ ИМЁН, ВТОРОЕ ПОДРЯД У ЭТОГО ПЛАНА. План звал свой блок «6б»; за время,
что план лежал, имя занял чужой блок «пустой расход» (решение владельца 29, построен 06.08).
До того имя «6а» из того же плана занял кусок 7. Взял следующую свободную букву — блок «6в»,
как велит договор о стыках: буквой к соседнему номеру, без перенумерации.
Порядок в круге: 6 (встал ли он) → 6б (пустой расход) → 6в (забытая пауза).

🟢 ВЫРЕЗАНИЕ ПОДСУНУЛО ИМЕННО ТОТ ОБМАН, НА КОТОРОМ ПОПАЛИСЬ ОБА В ПРОШЛУЮ СМЕНУ: живой зов
убран, слово `zabytayaPauzaHit(` оставлено ТОЛЬКО в примечании. Сторож не обманулся —
покраснел, все три. Он читает круг через `bezPrimechaniy`.

🪤 НАЗВАНО ЧЕСТНО, ЧЕГО НЕТ. Полного живого П-51 — круг с паузой суточной давности,
с часовой и со временем, подведённым к 08:01, — я не сделал: обвязка живого круга лежит
в чужом `supervisor.test.mjs`, а задача 9а чужих файлов проверок трогать не велит.
Вместо него — сторож класса 232 на зовущего, тем же приёмом, каким закрыт Э9. Полный П-51
остаётся долгом и назван в отчёте смены.

Полный прогон: 3047 проверок в 114 файлах, код 0 (на входе смены 3029).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 15:26:14 +03:00
Дмитрий 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
Дмитрий 8ed536c370 night: предел работнику — сутки владельца (решение 37), а не восемь часов 2026-08-05 12:25:04 +03:00
Дмитрий 8b0ae20ca1 сторож на молчаливую смерть врезки: подмешай отчёт о себе в «дело сдвинулось» — четырёхчасовая примета краснеет, прежде молчала 2026-08-05 08:25:23 +03:00
Дмитрий 1874b866cc сторож настроек: сверял поля, а решения владельца про смысл — три новых разряда, образец и ветка 2026-08-04 20:38:20 +03:00
Дмитрий 76a9dedd22 feat(ночь): кусок 7 — main приёмщика: настройки, review.json, две строки в сводку; сторож живого запуска получил право на node для П76 2026-08-03 04:56:31 +03:00
Дмитрий e63e8f6591 стена 1: денежные ворота стоят на светофоре системы, а не на доле, которой она не шлёт — решения Р1-Р6 2026-08-03 03:18:54 +03:00
Дмитрий 1d6062f0d6 feat(ночь): настоящий замок «пункт закрыт» — надзиратель сам гоняет проверки пункта и берёт коммит из угла 2026-08-02 20:22:45 +03:00
Дмитрий 29d32bd50c feat(ночь): предел платных замеров остатка — 30 за смену, счёт переживает перезапуск, сторож на класс 2026-08-02 12:56:33 +03:00
Дмитрий 9cd90b649c правка(ночь): три хвоста — disk_bad_probes в образец, причина ненайденного дня в сводку, один сравниватель пути вместо трёх 2026-08-02 02:50:13 +03:00
Дмитрий bf10b50071 fix(ночь): вернуть pause_wait_minutes в образец настроек — читает supervisor.mjs:377 2026-08-01 23:46:12 +03:00
Дмитрий b581b093d7 feat(ночь): замер свободного места — не замерили значит нельзя; пять настроек куска 2 в образец 2026-08-01 23:41:29 +03:00
Дмитрий 0df8ea9390 feat(затея): почва первой части — чиним невидимые проверки в подкаталогах, закрываем .night от хранилища 2026-08-01 20:56:41 +03:00