Commit Graph

699 Commits

Author SHA1 Message Date
Дмитрий f138658995 ночь: сторож немых приговоров + починен чистильщик, слепнувший от образца с кавычкой 2026-08-03 17:55:23 +03:00
Дмитрий 0b1d40b6f6 ночь: владелец видит приговор о голове и мастерской на всех трёх платных дорогах 2026-08-03 17:24:25 +03:00
Дмитрий 8c3e6faad1 ночь: оборванная запись следа — отдельное состояние, а не «не сохранён»; сторож класса перестал считать примечание за зов 2026-08-03 17:19:17 +03:00
Дмитрий 1cc210c1ce ночь: сторож на границу следа — .night закрыт от хранилища, живой git выносит приговор 2026-08-03 17:12:54 +03:00
Дмитрий ec6818ecc2 ночь: ворота замера больше не выбрасывают приговоры о голове и мастерской 2026-08-03 17:09:04 +03:00
Дмитрий 2591b64e0a ночь: надзиратель кладёт сырой поток работника на диск по ходу — молчаливая смерть перестала быть слепой 2026-08-03 17:00:54 +03:00
Дмитрий 3981b75cdc ночь: прибор следа сырого потока работника + сторож на класс «платный запуск без следа» 2026-08-03 16:49:31 +03:00
Дмитрий cd047a8763 ночь: сторож класса «довод не переживёт склейку оболочкой» + 22 проверки на переезд программы 2026-08-03 16:41:10 +03:00
Дмитрий 204e3fefb4 ночь: запуск головы ищет нутро по заказу пакета (package.json bin) и зовёт БЕЗ оболочки 2026-08-03 16:36:05 +03:00
Дмитрий 9a9ff1d402 ночь: примечание у пробы говорило про две двери, а их стало три — поправлено 2026-08-03 16:30:34 +03:00
Дмитрий 9169560ee5 ночь: дверь про исправность прибора больше не зовётся денежной — vorotaDeneg переименована в vorotaPribora 2026-08-03 16:28:49 +03:00
Дмитрий 2fba83d3eb ночь: сторож обходит НАЙДЕННЫЕ платные дороги, а не список имён — новая дорога краснеет поимённо 2026-08-03 16:20:17 +03:00
Дмитрий 01d895d501 ночь: сторож класса «платная дорога без ворот запаса» + приёмка дороги пробы на настоящем правиле владельца 2026-08-03 16:14:30 +03:00
Дмитрий 9515c4024e ночь: запись замера и вопрос о запасе — одна дверь на пробу и продолжение, фазу называет зовущий 2026-08-03 16:07:10 +03:00
Дмитрий a51e14fb9d ночь: проба больше не запускается, когда запаса меньше правила владельца — врезаны ворота запаса 2026-08-03 16:02:00 +03:00
Дмитрий 954ff64682 ночь: убран ключ --setting-sources, который молча убивал крошечный замер остатка 2026-08-03 15:34:50 +03:00
Дмитрий 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