🔑 НАЙДЕНО НЕ РАССУЖДЕНИЕМ, А ЖИВЫМИ ДЕНЬГАМИ. Работник `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>
🔑 ЗАМЕР ПЕРЕД РАБОТОЙ ПЕРЕВЕРНУЛ ЗАДАНИЕ. Владелец направил смену на кусок 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>
Задача 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>