Commit Graph

683 Commits

Author SHA1 Message Date
Дмитрий 7cc48bc107 ночь: пустой след больше не выдаёт себя за записанный — слова про след вынесены и проверены 2026-08-03 15:01:02 +03:00
Дмитрий 72efa2832d ночь: сторож на дыру, которую открыл сам след — имена записи следа не ввозятся в чужие проверки 2026-08-03 14:57:14 +03:00
Дмитрий 44cbc39837 ночь: сырой поток платного замера остаётся следом на диске, и писать его умеет только настоящий прибор 2026-08-03 14:46:16 +03:00
Дмитрий 5a72ba150f supervisor.test.mjs: liveForeignCorners проверен отдельно, и живой круг доказывает — свободный пункт с чужим фактом не выдаётся 2026-08-03 13:18:09 +03:00
Дмитрий a1de797a3b supervisor.mjs: liveForeignCorners + zapertLiFaktom — круг сам собирает живых соседей из карточек работников и подаёт их в claimFiles тем же прибором changedFiles, каким уже меряет своё пересечение 2026-08-03 13:17:48 +03:00
Дмитрий 4363173b3b file-claims.test.mjs: проверки на claimFiles с фактом — вырезание красит их, дороговизна нулём походов доказана шпионом 2026-08-03 13:17:26 +03:00
Дмитрий f0a5744526 file-claims.mjs: факт поверх заявки перенесён в claimFiles — дверь, в которую живой код вправду ходит (5 зовов против 1 у mayTouch), с тем же дешёвым правилом — в хранилище идём только когда заявка сама готова сказать можно 2026-08-03 13:16:50 +03:00
Дмитрий 1241783009 ночь: обвес срезан — три ключа в крошечном замере, один безопасный в рождении работника, плюс датчик «настройка принята, но не применена» по составу мастерской из потока 2026-08-03 13:12:26 +03:00
Дмитрий 33c8e0f9e4 ночь: smoke-longrun проведён через сверку настроек и денежные ворота (дверь одна с run, не копия) + датчик класса ловит любую платную команду без ворот 2026-08-03 12:49:36 +03:00
Дмитрий 9bdffb9cda тесты: путь к живой улике .night собран руками от REPO_ROOT, не через NIGHT_ROOT — не тревожит чужого сторожа хозяйства 2026-08-03 12:45:33 +03:00
Дмитрий 31e0d4d7ae spawn.test.mjs: доказано что sverkaGolovy годен и для многошагового потока работника; supervisor.mjs не тронут 2026-08-03 12:35:31 +03:00
Дмитрий 886f96e7d5 budget.mjs: поправлено устаревшее примечание — rate_limit_event проверен вживую, --tools отдельный открытый вопрос 2026-08-03 12:33:59 +03:00
Дмитрий 618d932b65 test(night-dispatcher): dva-progona-razom fixator razdelen na otkrytuyu i zakrytuyu polovinu dyry 2026-08-03 12:32:26 +03:00
Дмитрий e94e0cfafc feat(night-dispatcher): mayTouchFakt v file-claims.mjs sverjaet zayavku s faktom zhivykh uglov 2026-08-03 12:32:02 +03:00
Дмитрий 1f4444218a правка координатора: датчик говорит про лишнюю голову в счёте (добавка), а не про замену — и вшит в probeUtilization 2026-08-03 12:31:33 +03:00
Дмитрий 08b12c017f night/spawn: pravka koordinatora - sverka po assistant I modelUsage(result), init eto zakaz a ne ispolneniye 2026-08-03 12:17:21 +03:00
Дмитрий 7693a30b2f night/spawn: sverkaGolovy datchik na zhivom potoke, resheniye predupreditelnoye a ne otkaz 2026-08-03 12:12:07 +03:00
Дмитрий d07dbd0873 night/spawn: golovySovpadayut sravnivaet korotkoe zakazannoe imya s polnym otvetivshim 2026-08-03 12:08:31 +03:00
Дмитрий d8fb3fa50f night/spawn: golovaIzSobytiya taskaet golovu iz otveta assistant, ne iz zakaza system/init 2026-08-03 12:04:37 +03:00
Дмитрий 7064d7d892 feat(night dispatcher): wire owner-settings check as first gate of run command, covers both normal and resume roads 2026-08-03 12:01:24 +03:00
Дмитрий 25de9b8b26 fix(night-budget): stale-measure reason no longer prints the same calendar day twice
budgetState's "замер устарел" reason compared measurement time and
budget-renewal time at day-only precision (dayOfSafe). For five_hour
windows this made the two dates print identically even though the
underlying instants differ, producing a nonsensical owner-facing
message ("measured on 2026-08-03, renewed on 2026-08-03").

Fix: moskovskoeVremya now also returns minute (same Intl call, single
source of Moscow time, no second implementation). New slovoMomenta()
prints hour:minute only when the two compared moments fall on the same
calendar day (data-driven rule, not a per-window-kind special case) —
seven_day* windows stay day-only since their days normally differ.

Added a class-wide sensor: budget.test.mjs now scans every
budgetState reason an owner actually sees (gates.mjs / cli.mjs consume
it directly) for two named quantities colliding verbatim, across all
five rate-limit kinds and day-boundary edge cases. Verified red before
the fix (both dates rendered "2026-08-03"), green after.

tools/night/budget.mjs tools/night/budget.test.mjs
2026-08-03 11:37:00 +03:00
Дмитрий 288dfb3988 feat(ночной работник): сторож сверки night.config.json с решениями владельца
Найдена беда 03.08.2026: spawn_budget_per_shift в файле стоял 40, хотя решение 9а
протокола (docs/grilling/2026-08-02-nastroyki-nochi-i-ramka-deneg.md, строка 246)
называет 20 — предел рождений работников был вдвое слабее обещанного владельцу,
и ничто в коде это не сверяло.

tools/night/sverka-nastroek-s-resheniyami.mjs — сторож с тремя исходами на настройку
(сходится молчит / расхождение в сторону БОЛЬШЕЙ траты или СЛАБЕЕ защиты падает вслух /
любое другое расхождение говорит словами, но не падает), плюс отдельные падения на
отсутствующую настройку и на мусор в записи. Список решений явный, с номером решения
и строкой протокола на каждую настройку. bez_doli_ne_zapuskat и probe_budget_window_hours
намеренно не в списке — это решения самой затеи, а не владельца.

night.config.json (не в git — закрыт .gitignore строкой 241 по решению владельца):
spawn_budget_per_shift приведён к 20 по решению 9а той же правкой в этом угле.
2026-08-03 11:27:17 +03:00
Дмитрий e0bd43b4ef test(night): fix flaky+blind check in workspace.test.mjs — single call, both parts on same message
The check "prichina padeniya dohodit do vladeltsa KAK BYLA" called
createWorkspace() twice (once per regex) instead of once. This caused two
bugs at once:

1. Flaky under full-suite load: double work didn't fit the 5s timeout
   (Test timed out in 5000ms), while passing in isolation. Measured
   635ms for a single call vs 1170ms for the old double-call version —
   confirms the double invocation was the timing cause.

2. Blind spot: the two regexes ("podstavnoe padenie" / "za soboy ubrano")
   were asserted on TWO DIFFERENT runs, so code that emits the reason on
   run 1 but only "za soboy ubrano" (no reason) on run 2 would still pass
   green — the check wasn't actually guarding what it claimed to guard.

Fixed by catching the thrown error once and asserting both regexes
against the same captured message, matching how workspace.mjs actually
throws (reason + cleanup note concatenated into one Error, see
workspace.mjs:725).

tools/test:tools full run before: 1577 passed | 1 failed (1578 total).
After: 1578 passed | 0 failed (50 files), stable across two full runs.
Mutation check: temporarily stripped "za soboy ubrano" wording from
workspace.mjs, confirmed the test goes red, then reverted (git diff
clean afterward).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 11:26:15 +03:00
Дмитрий 60f1d41067 сторож на класс: два прогона разом — приём стал прибором; дыра заявка-против-факта зафиксирована нарочно 2026-08-03 10:47:43 +03:00
Дмитрий 215c2258a0 кусок 6: продолжение занимает файлы ДО отката — два замка (внутри прогона и между прогонами), освобождение на каждом отказе 2026-08-03 10:34:02 +03:00
Дмитрий 3aeda0efd6 кусок 6 задача 7: дорога продолжения СОБРАНА — десять правил получили зовущего; найден шов may_start против ok, из-за которого кнопка не сработала бы ни разу 2026-08-03 10:21:23 +03:00
Дмитрий abb313e17e кусок 5: otkatDoKommita вывезен наружу — один откатчик на затею, новым коммитом, грязный угол не получает, git на слово не верим 2026-08-03 09:49:05 +03:00
Дмитрий 993dd6be6b кусок 6 задача 6: отчёт и слепое пятно датчика — ноль у постоянной не приговор; возражение про несобранные карточки 2026-08-03 09:37:24 +03:00
Дмитрий 2a34d5ab98 кусок 6 задача 6: разбор --resume/--worker и vyborProdolzhaemogo — запор шагов 1 и 2 снят, девятое состояние (слова нет) отделено от живого 2026-08-03 09:32:38 +03:00
Дмитрий 20715698b4 кусок 6 задача 7: zavestiProdolzhenie — подъём продолжения в том же углу, пустой учётчик отрезков, упавший подъём не оставляет прогон идущим 2026-08-03 09:22:04 +03:00
Дмитрий f8688552f9 кусок 6 задача 7: датчик зовущих (примечание не считается зовом) — ваш ноль подтверждён, 7 из 7 правил без зовущего 2026-08-03 09:08:24 +03:00
Дмитрий 76a9dedd22 feat(ночь): кусок 7 — main приёмщика: настройки, review.json, две строки в сводку; сторож живого запуска получил право на node для П76 2026-08-03 04:56:31 +03:00
Дмитрий ba2e6fe9de feat(ночь): кусок 7 задача 6 — приёмщик: свой час, два захода, срок на самом процессе снималки, снято меряется картинками на диске 2026-08-03 04:40:03 +03:00
Дмитрий 47ecbbba68 ненадёжный шаг лечится ограниченным повтором, сказанным вслух; уборка не оставляет следов, когда падает сама 2026-08-03 04:38:15 +03:00
Дмитрий 2c2a8e4e66 feat(ночь): кусок 7 задача 6 — zadachaKonchena: одно место правила конца задачи, отложенный пункт её не кончает 2026-08-03 04:32:13 +03:00
Дмитрий fe0dd8d045 feat(ночь): кусок 7 задача 5 — снималка экранов: снимок это файл на диске, а не слово браузера; боевые адреса не берём 2026-08-03 04:28:44 +03:00
Дмитрий 647790c2c0 feat(ночь): кусок 6 задача 8 — блок про память в поручении, дословные якоря и сверка пометок с лентой надзирателя 2026-08-03 04:13:38 +03:00
Дмитрий 18ad44bdd6 feat(ночь): кусок 6 задача 9 — сторожевые проверки зовут живой чужой код: слова статусов, зовущий признака жизни, приговор против заявки 2026-08-03 04:01:21 +03:00
Дмитрий 64489d8942 feat(ночь): кусок 6 задача 5 — resumeChecks: трое ворот, закрытый список, порядок причин отпечаток-место-запас 2026-08-03 03:54:16 +03:00
Дмитрий 23cf19af61 feat(ночь): сторож живого запуска стал поимённым по программам; resume.test.mjs вернулся на настоящий git с правом только на него 2026-08-03 03:49:47 +03:00
Дмитрий e3225e2b0e fix(ночь): кусок 6 — убран живой запуск git из проверок, ответы подставки сняты с настоящего хранилища 2026-08-03 03:33:23 +03:00
Дмитрий c9a36703fe стены 3-4-5 сняты: замок зовёт php artisan из app/; заведение угла создаёт рабочие каталоги Laravel и собирает фронт 2026-08-03 03:31:26 +03:00
Дмитрий 3e734df62e feat(ночь): кусок 6 задача 4 — rabotaPosleZachtennogo и sledOtkata на настоящем хранилище: дерево, грязный угол, не верим откатчику на слово 2026-08-03 03:22:24 +03:00
Дмитрий e63e8f6591 стена 1: денежные ворота стоят на светофоре системы, а не на доле, которой она не шлёт — решения Р1-Р6 2026-08-03 03:18:54 +03:00
Дмитрий d6e33ff99e feat(ночь): кусок 6 задача 3 — resumePlan: сбой хранилища отказывает в самом правиле, паузу откат не карает 2026-08-03 03:18:27 +03:00
Дмитрий 13e76b9009 feat(ночь): кусок 6 задача 2 — statePath в ящик угла и resumePoint: запись это подсказка, а не доказательство 2026-08-03 03:15:14 +03:00
Дмитрий de1f703c00 feat(ночь): кусок 5 — 20-е имя voprosOtvechenYasno наружу и сторож на запись состояния 2026-08-03 02:58:48 +03:00
Дмитрий e5a6f6848a fix(ночь): кусок 5 — убран ввоз node:child_process из проверки, одна дорога к московскому времени, негодное время не молчит 2026-08-03 02:54:11 +03:00
Дмитрий 58a619ac14 fix(ночь): кусок 5 — вопрос прошлой ночи от того же w-2 морозил сегодняшнюю работу навсегда; необязательный runId 2026-08-03 02:36:54 +03:00
Дмитрий a203bd7ed9 стена 2 починена: установка угла в app/ идёт с --legacy-peer-deps + замок отличает несобранное хозяйство от красных проверок 2026-08-03 02:35:11 +03:00