diff --git a/docs/superpowers/plans/2026-08-05-noch-2-tri-storozha.md b/docs/superpowers/plans/2026-08-05-noch-2-tri-storozha.md new file mode 100644 index 00000000..bd1a564e --- /dev/null +++ b/docs/superpowers/plans/2026-08-05-noch-2-tri-storozha.md @@ -0,0 +1,304 @@ +# Задание второй ночи: три сторожа, которые смотрят не туда + +**Это задание НОЧНЫМ РАБОТНИКАМ.** Три пункта, по одному на работника — они трудятся +**порознь и одновременно**, каждый в своём углу, и друг о друге знать не обязаны. + +🟢 **Первая ночь удалась:** один пункт закрыт за 13 минут, работа вышла лучше человеческой. +Эта ночь отвечает на другой вопрос — **держит ли дело троих разом**. + +Каждая беда ниже **замерена живым вызовом**, а не выдумана. Замер приложен к пункту. + +--- + +### Task 1: замазыватель личных данных не узнаёт телефон, записанный по-человечески + + +**Что стережёт этот прибор.** `tools/observer-pii-filter.mjs` замазывает личные данные +в записях, которые каждая смена пишет **в файлы хранилища** (`docs/observer/episodes-*.jsonl`). +Утёкшее уезжает в историю навсегда. Портал — про телефоны клиентов, и это закон +о персональных данных. + +**Беда.** Он узнаёт телефон **только в слитной записи**. Замерено живым вызовом: + +``` +ЗАМАЗАЛ | +79215553476 → +7XXXXXXXXXX +ЗАМАЗАЛ | 79215553476 → +7XXXXXXXXXX + +УТЕКЛО | +7 (921) 555-34-76 +УТЕКЛО | +7-921-555-34-76 +УТЕКЛО | +7 921 555 34 76 +УТЕКЛО | 89215553476 ← русская «восьмёрка» не покрыта вовсе +УТЕКЛО | 8 (921) 555-34-76 +УТЕКЛО | 9215553476 ← без кода страны +``` + +**Шесть человеческих форм из восьми проходят насквозь.** Место — `RU_PHONE`, строка ~27. + +🪤 **И вторая половина той же беды:** фильтр смотрит только **значения**, а **имена полей** +не смотрит вовсе. Телефон, оказавшийся именем поля, остаётся как есть: + +``` +на входе ключи: ["+79215553476","клиент"] +на выходе ключи: ["+79215553476","клиент"] ← не тронуты +``` + +**Что нужно получить.** Телефон замазывается в любой записи: со скобками, с дефисами, +с пробелами, с «восьмёркой», без кода страны — и **в именах полей тоже**. + +🔴🔴 **ЗДЕСЬ «СТРОЖЕ» НЕ ЗНАЧИТ «БЕЗОПАСНЕЕ» — И ЭТО ГЛАВНОЕ ПРЕДУПРЕЖДЕНИЕ ПУНКТА.** +Вчерашняя задача была про сторожа: лишний отказ там человек сразу видит. Здесь прибор +правит **записи**, и **лишнее замазывание уничтожает данные так же молча и навсегда, +как утечка**. Затёртый номер счёта или заказа не заметит никто — ни утром, ни через месяц. + +⇒ **Граница, чтобы не перестараться:** +· десять голых цифр замазывай **только если они начинаются на 9** и вокруг них нет других цифр; +· цифр подряд **больше одиннадцати** — это не телефон, **не трогай**; +· сомневаешься — **оставь как есть** и назови случай в своей бумаге. Пропущенный телефон + чинится завтра; затёртый номер счёта не чинится никогда. + +🔴 **Заведи рядом зелёные проверки** на то, что обычные числа (номер счёта, длинное число +в тексте) и уже работающие две формы остаются как были. +🔴 **И скажи вслух в бумаге, во что превращаешь имя поля.** Если два разных телефона-ключа +станут одинаковыми, одно значение молча пропадёт — назови, как ты это решил. + +- [ ] **Шаг 1. Сначала проверка, и она обязана быть КРАСНОЙ.** + Заведи `tools/observer-pii-telefony.test.mjs`. Внутри — **не меньше ОДИННАДЦАТИ + утверждений**, и вот они поимённо, чтобы не считать: + · **восемь** форм из замера выше (шесть обязаны замазаться после починки, две уже); + · **девятое** — телефон в **имени поля**; + · **мирные числа, которые трогать НЕЛЬЗЯ**, все поимённо: номер счёта · номер заказа · + дата вида `20260805` · номер прогона `r-2026-08-05-142903-c4033f1d` · хеш коммита · + денежная сумма. Каждое — отдельным утверждением, все обязаны остаться целыми. + 🔴 **Прогоняй ТОЛЬКО этой командой — она тебе разрешена:** + `npm run test:tools -- tools/observer-pii-telefony.test.mjs` + 🪤 **Не начинай команду с `cd`** — его в твоих разрешениях нет, и команда просто откажет. + Увидь красное своими глазами и запиши дословно. + 🪤 Нет файла — ответ «No test files found» и код 1. Это **не** красная проверка, + это «мерить нечем». Сначала заведи файл. +- [ ] **Шаг 2. Почини `tools/observer-pii-filter.mjs`.** Минимально, только в сторону «строже». +- [ ] **Шаг 3. Прогони снова — зелёное.** + 🪤 **Отдельного набора проверок у этого прибора НЕТ** — замерено. Соседний прогон + пропусти, искать его не надо. Твоя мерка одна: **твоя проверка зелена**. +- [ ] **Шаг 4. Спроси себя, какой ещё формой пишут телефон** (через `+7`, через `8`, + с точками, слитно с текстом) — и либо закрой, либо **назови словами в своей бумаге**. + 🔴 **Оставшуюся дыру НЕ клади проверкой в файл** — она будет красной, файл покраснеет, + и пункт не засчитается. В файле проверок держи только то, что вправду закрыл. +- [ ] **Шаг 5. Сохрани работу коммитом — ровно этими тремя файлами, путями поимённо:** + `tools/observer-pii-filter.mjs` · `tools/observer-pii-telefony.test.mjs` · + `tools/observer-pii-zamer-do.md`. + 🔴 **Имя третьего ровно такое, своего не выдумывай** — приёмка сверяет поимённо, + и файл с другим именем сочтут лишним. Двух последних на диске ещё нет — их надо **завести**. + 🪤 `git add .` **не делай**: в хранилище прямо сейчас работают двое твоих соседей. + +--- + +### Task 2: запретные пути обходятся двумя точками + + +**Что стерегут эти сторожа.** `tools/enforce-read-path-deny.mjs` и `tools/shell-content-rules.mjs` +решают, можно ли читать и писать по данному пути. Есть список запретных мест — там +чужие настройки и служебное. + +**Беда.** Путь сверяется со списком **как строка**, без сворачивания. Допиши в середину +`что-нибудь/..` — и тот же самый файл сторожу уже незнаком. Замерено: + +``` +БЛОК | C:/Users/Administrator/.claude/runtime/approve.json +ПУСТИЛ | C:/Users/Administrator/.claude/projects/x/../../runtime/approve.json ← ТОТ ЖЕ файл +ПУСТИЛ | C:/Users/Administrator/.claude/docs/../runtime/approve.json ← ТОТ ЖЕ файл +БЛОК | …/.claude/settings.json +ПУСТИЛ | …/.claude/hooks/../settings.json ← ТОТ ЖЕ файл +``` + +Проверено вдобавок, что это не игра ума: **файл по такому пути вправду открывается**. +Место — `defaultPathNormalize`, `tools/shell-content-rules.mjs:13-20`. + +**Что нужно получить.** Перед сверкой со списком путь **сворачивается** (`..` съедаются), +и обе записи одного файла судятся одинаково. + +🔴 **Не задень мирное.** Свернуть надо аккуратно: обычные пути без точек обязаны работать +ровно как раньше. Заведи зелёные проверки на несколько законных путей. + +🔴🔴 **И самое важное: ты чинишь сторожа, который судит ТВОИ ЖЕ руки.** Он решает, куда +тебе можно писать. Твой собственный угол лежит **внутри** `.claude/worktrees/…`, а `.claude` +— это как раз запретная территория из замера. Свёртка чуть грубее — и ты закроешь себе +запись в собственные файлы. +⇒ **Среди законных путей обязательно возьми путь внутри своего угла.** И если после починки +ты вдруг не можешь записать свой же файл — **это не поломка рабочего места, это твоя правка**: +откати и перепиши. Хозяина в этом случае звать не надо. + +- [ ] **Шаг 1. Сначала проверка, и она обязана быть КРАСНОЙ.** + Заведи `tools/put-so-tochkami.test.mjs`. Внутри — **не меньше ДЕВЯТИ утверждений**, + поимённо: + · **пять** из замера выше — два прямых пути (они уже блокируются) и **три** окольных + (🪤 у `approve.json` окольных **два**, а не один — не потеряй третий случай); + · **три-четыре законных пути**, которые обязаны проходить; + · 🔴 **обязательно — законный путь внутри ТВОЕГО СОБСТВЕННОГО угла** (он идёт через + `.claude`, и грубая свёртка закроет тебе руки). + 🔴 Прогон: `npm run test:tools -- tools/put-so-tochkami.test.mjs` (без `cd`). + Увидь красное, запиши дословно. +- [ ] **Шаг 2. Почини `tools/shell-content-rules.mjs`.** + 🔑 **Рядом уже лежит готовый сворачиватель путей — `tools/path-normalization.mjs`.** + Посмотри на него первым делом: если он делает, что нужно, — **бери его**, а не пиши + третий. Не подошёл — скажи в своей бумаге, **почему** не подошёл. + 🪤 Утверждение «одна функция чинит обоих сторожей» замером **не подтверждено** — + второй прибор (`tools/enforce-read-path-deny.mjs`) **не твой, не правь его**. Позови его + один раз, посмотри, вылечился ли, и **запиши словами в свою бумагу**. +- [ ] **Шаг 3. Прогони снова — зелёное.** + 🪤 **Отдельных наборов проверок у этих двух сторожей НЕТ** — замерено. Соседний прогон + пропусти. Твоя мерка одна: **твоя проверка зелена**. +- [ ] **Шаг 4. Спроси себя, чем ещё можно записать тот же путь мимо списка** (одна точка, + обратные косые, кавычки, домашняя тильда, разный регистр) — и либо закрой, либо + **назови словами в своей бумаге**. + 🔴 **Оставшуюся дыру НЕ клади проверкой в файл** — она будет красной и запрёт тебе пункт. +- [ ] **Шаг 5. Сохрани работу коммитом — ровно этими тремя файлами, путями поимённо:** + `tools/shell-content-rules.mjs` · `tools/put-so-tochkami.test.mjs` · + `tools/put-so-tochkami-zamer-do.md`. + 🔴 **Имя третьего ровно такое, своего не выдумывай.** Двух последних на диске ещё нет — + их надо **завести**. 🪤 `git add .` **не делай**: рядом работают двое соседей. + +--- + +### Task 3: приписка делает команду невидимой сразу для двух сторожей + + +**Что стерегут.** Два прибора узнают в командной строке вид команды: один держит ворота +«сначала прогони проверки, потом коммить», второй помечает необратимые команды. + +**Беда.** Оба ищут слово команды **сразу после `git`**. Любая приписка между ними — и команда +становится неузнаваемой. Замерено: + +``` +УЗНАЛ | git push origin main → push +УЗНАЛ | git commit -m "правка" → commit + +НЕ УЗНАЛ | git -C app push origin main → ничего +НЕ УЗНАЛ | git -C app commit -m "правка" → ничего +НЕ УЗНАЛ | git --git-dir=.git --work-tree=. commit -m "правка" → ничего +НЕ УЗНАЛ | git --work-tree=. commit -m "правка" → ничего +НЕ УЗНАЛ | git -c user.name=X commit -m "правка" → ничего + +ЛОВИТ | git push --force origin main → необратимая +ПРОПУСК | git -C app push --force origin main → мирная +``` + +🔴 `git -C app …` — не экзотика: в этом проекте код живёт в папке `app`, и так пишут постоянно. + +Место — `detectGitCommandKind`, `tools/enforce-hook-helpers.mjs:499`. + +**Что нужно получить.** Приборы пропускают приписки `-C путь`, `-c ключ=знач`, +`--git-dir=…`, `--work-tree=…` и видят настоящее слово команды. + +🔴 **Не задень мирное.** Обычные команды без приписок обязаны узнаваться ровно как раньше. + +- [ ] **Шаг 1. Сначала проверка, и она обязана быть КРАСНОЙ.** + Заведи `tools/git-s-pripiskoy.test.mjs`. Внутри — **СЕМЬ строк про ТВОЙ прибор**: + две «УЗНАЛ» и пять «НЕ УЗНАЛ» (среди них `--work-tree=` **в одиночку** — иначе эта + приписка останется незакрытой, а «что нужно получить» требует все четыре). + 🔴🔴 **Две последние строки замера (ЛОВИТ / ПРОПУСК) в файл проверок НЕ КЛАДИ.** + Они про **второй** прибор, чинить который тебе запрещено, — и останутся красными + навсегда, заперев тебе пункт. Поймано приёмщиком: прежняя редакция велела «все восемь» + и этим сама запирала работу. + 🔴 Прогон: `npm run test:tools -- tools/git-s-pripiskoy.test.mjs` (без `cd`). + Увидь красное, запиши дословно. +- [ ] **Шаг 2. Почини `tools/enforce-hook-helpers.mjs`.** + 🪤 Приписка `-C` съедает **два** слова (`-C` и путь), а `-c` — **одно** (`ключ=знач` + слитно). Съешь у `-C` одно — примешь `app` за имя команды. + 🪤 Есть и форма без равенства: `git --git-dir .git commit`. Закроешь — хорошо, + не закроешь — назови в бумаге. + 🔴 **Второй прибор (`tools/classify-destructive.mjs`) — не твой файл, не правь его.** + Замерено заранее: он разбирает **сам** и правку твоего файла не подхватит. + ⇒ Позови его **один раз**, посмотри ответ глазами и **запиши словами в свою бумагу**, + вылечился он или нет. Проверкой это в файл **не клади**. + 🔴🔴 **И знай: ты чинишь ворота, через которые сам будешь коммитить на шаге 5.** + Если после починки твой коммит вдруг не проходит — **вина твоя, а не окружения**: + откати правку и перепиши. Останавливаться и звать хозяина в этом случае не надо. +- [ ] **Шаг 3. Прогони снова — зелёное.** + 🪤 **Отдельного набора проверок у этого прибора НЕТ** — замерено. Соседний прогон + пропусти. Прежняя редакция обещала, что «их там немало», — это было **неправдой**. +- [ ] **Шаг 4. Спроси себя, чем ещё можно спрятать слово команды** (кавычки, две команды + через `&&`, скобки, лишние пробелы) — и **назови словами в своей бумаге**. + 🔴 Оставшуюся дыру проверкой в файл **не клади**. +- [ ] **Шаг 5. Сохрани работу коммитом — ровно этими тремя файлами, путями поимённо:** + `tools/enforce-hook-helpers.mjs` · `tools/git-s-pripiskoy.test.mjs` · + `tools/git-s-pripiskoy-zamer-do.md`. + 🔴 **Имя третьего ровно такое, своего не выдумывай.** Двух последних на диске ещё нет — + их надо **завести**. 🪤 `git add .` **не делай**: рядом работают двое соседей. + +--- + +## 🔴 ОБЩЕЕ ДЛЯ ВСЕХ ТРОИХ — читать обязательно + +**1. Замер «до» снимается ВМЕСТЕ с шагом 1, а не раньше.** Позвать прибор до того, как +заведён файл проверок, нечем: набирать опасные образцы в командной строке **запрещено** +(см. пункт 3 ниже). ⇒ Красный вывод твоей новой проверки на нетронутом приборе **и есть +замер «до»**. Сохрани его дословно в свой файл `*-zamer-do.md` — имя названо в твоём пункте. +🔑 Туда же пиши **всё, что велено «сказать вслух»**: оставшиеся дыры, чего не смог, что +показалось странным. Это **единственная твоя бумага**, отдельных файлов не заводи. +🟢 **И она не пропадёт: надзиратель утром перенесёт её в сводку владельцу.** Пиши так, +чтобы понял человек, который не программист, — это единственная дорога от тебя к нему. + +**1-бис. Работы в каждом пункте — примерно на час.** Не уложился сильно — значит что-то +идёт не так: остановись, перечитай задание, посмотри, не чинишь ли ты чужое. + +**2. Объявляй пункт закрытым ТОЛЬКО когда проверка вправду позеленела.** Вторая неудачная +заявка по одному пункту откладывает его **насовсем**. Не уверен — работай дальше, не заявляй. + +**2-бис. 🔴 На шаге 1 пункт закрытым НЕ ОБЪЯВЛЯЙ.** Красное там — правильно и так задумано. +Заявка сейчас засчитается как неудачная, а вторая неудачная закроет пункт насовсем. +🔴 **И наоборот: если твоя проверка вышла ЗЕЛЁНОЙ до починки — она негодная, перепиши её.** +Особенно это грозит пункту 1: **две формы из восьми уже замазываются**, и проверка, +написанная только на них, зазеленеет мгновенно и обманет тебя же. + +**3. 🔴 Опасный образец собирай ВНУТРИ программы из кусков, не пиши в командную строку.** +Живьём: смена набрала такой образец в оболочке — **оболочка исполнила его у себя**, раньше +сторожа. Спас встроенный запрет. Ночью тебя никто не подстрахует. +🪤 **Это правило про пункты 2 и 3.** В пункте 1 образцы — телефоны, они не опасны, и собирать +их «из кусков» незачем: пиши как есть, читаемо. + +**4. Рядом с красной проверкой поставь зелёную — «сторожа послаблений».** Твоя красная +ловит дыру; но починить можно и грубо, запретив заодно законное. Зелёная **зелена уже +сейчас** и стережёт, что законное проходит. 🔴 Мерило закрытия — только **красная**; +зелёная стоит рядом, а не вместо. **Кладётся в ТОТ ЖЕ файл проверок**, отдельного не заводи. + +**5. Не можешь прочитать глазами — отказывай, а не додумывай.** Непонятный случай пусть +прибор отвергает целиком. Это всегда в безопасную сторону и всегда объяснимо утром. +🪤 **Оговорка для пункта 3:** твой прибор не сторож, а **опознаватель вида команды** — +«отказать» ему нечем. Не узнал команду — так и отвечай «не узнал», как он отвечал раньше. +Гасить ворота на каждой непонятной команде **нельзя**: этим ты остановишь и себя, и соседей. + +**6. 🔴 ВАС ТРОЕ, И ВОТ КАК ЭТО УСТРОЕНО.** У каждого **свой угол и своя ветка** — соседи +твоей работы не видят и помешать тебе не могут. Файлы у вас разные, замерено: пересечений ноль. +· Покажется, что **твоя** починка меняет поведение чужого прибора — почини свой как надо, + а про чужой **напиши в бумагу**. Не подстраивайся под соседа и не жди его. +· 🔴🔴 **Если что-то перестало работать сразу после твоей правки — это твоя правка, + а не поломка рабочего места.** Откати и перепиши. **Хозяина не зови.** Двое из трёх сегодня + чинят приборы, которые судят руки самих работников, — путаница тут стоила бы пункта. + +**7. 🔴 Полный прогон всего хозяйства сейчас НЕ зелен, и это не твоя вина.** +В углу работника есть **намеренно красная** проверка (`proba4-krasnyy`) — она обязана там +краснеть, так задумано. **Чужого не чини.** Твоя мерка одна: **твоя проверка зелена**. +🪤 И не пытайся добиться «ноль красных» во всём хозяйстве — там это недостижимо нарочно. + +--- + +## 🔴 ГРАНИЦЫ — не переступать (одинаковы для всех троих) + +· 🔴 **боевой liderra.ru не трогать НИ ОДНОЙ КОМАНДОЙ** — там живые клиенты и живые деньги. + Работа целиком в коде и проверках: никаких настоящих обращений наружу — ни для замера, + ни «чтобы убедиться». Доступ к боевому с этой машины **вправду открыт**; тебя удерживает + не замок, а это предложение; +· правь и **заводи** только три названных в твоём пункте файла — два из трёх ещё не + существуют, их надо создать. Ничего больше — ни настроек, ни чужих проверок, ни этой + бумаги, ни приёмочного листа; +· 🔴 **чужих веток не смотреть.** Ни `git log`, ни `git diff` по чужим веткам, ни `--all`. + Работа твоя и только твоя; +· 🔴 **чужих пунктов не трогать.** Вас трое, у каждого свои файлы. Увидишь беду в чужом — + **напиши о ней в свою бумагу**, но не чини; +· не ослаблять и не отключать никаких других сторожей ради зелёного прогона; +· 🔴 **окружение не чинить.** Не хватает чего-то в самом рабочем месте (нет программы, + нет файла, не ставятся библиотеки) — **остановись и напиши об этом в свою бумагу + своими словами**. Это долг хозяина, а не твоя работа. + 🪤 **Но сначала спроси себя: не сломалось ли это сразу после МОЕЙ правки?** Двое из троих + сегодня чинят приборы, которые судят руки работников. Сломалось после твоей правки — + **это твоя правка** (см. общее правило 6): откати и перепиши, хозяина не зови. diff --git a/docs/superpowers/priyomka/5/noch-2-tri-storozha-priyomochnyy-list.md b/docs/superpowers/priyomka/5/noch-2-tri-storozha-priyomochnyy-list.md new file mode 100644 index 00000000..f7a27df2 --- /dev/null +++ b/docs/superpowers/priyomka/5/noch-2-tri-storozha-priyomochnyy-list.md @@ -0,0 +1,147 @@ +# Приёмочный лист второй ночи: три сторожа, три работника + +**Пишется ДО запуска, намеренно.** Лист, написанный после, подгоняется под то, что вышло. +Ниже записано, **что я обязуюсь замерить и какой ответ считаю годным, пока результата ещё нет**. + +Заведён 05.08.2026 вечером, после удачной первой ночи. +План: [`docs/superpowers/plans/2026-08-05-noch-2-tri-storozha.md`](../../plans/2026-08-05-noch-2-tri-storozha.md) — **три** пункта. +Всё, что снимается «по каждому», снимается **трижды, поимённо**, с записью ответа. + +--- + +## 🔴🔴 ЧЕМ ЭТА НОЧЬ ОТЛИЧАЕТСЯ ОТ ПЕРВОЙ — прочесть раньше всего + +**1. Страховочной сетки, которая была у первой ночи, здесь НЕТ.** Первую охраняла проверка +«было 19 зелёных — осталось 19». У всех трёх сегодняшних приборов **своих наборов проверок +не существует** — замерено. Единственное, что стоит между грубой починкой и сломанной +стеной, — зелёные проверки, которые пишет **сам работник**, а их можно написать пустыми. + +⇒ **П-6 (полный прогон) в этой ночи — ГЛАВНАЯ приёмочная проверка, а не примечание.** +В листе первой ночи она стояла последней со словами «в приговоре не участвует». +**Здесь наоборот.** Настоящая сетка — 81 файл проверок в `tools/night/`, и видит их только +полный прогон; особо смотреть `tools/night/paths.test.mjs` (это пункт 2) и +`tools/night/plan-lock-hook.test.mjs` (это пункт 3). + +**2. Внешнего мерила нет вовсе.** Первую ночь сверяли с работой людей (эталон дневной +смены). Для этих трёх пунктов дневного решения **не существует** — сверять не с чем, +и утром искать сверку не надо. +🟢 Зато и списывать неоткуда: П-15 упрощается до «в следе нет заглядываний в чужие ветки». + +**3. Сводка НАРОЧНО глушит повторы.** Живьём из первой ночи: «…**Дальше об этом молчим, +чтобы не забить сводку**». У троих сообщения будут одинаковыми ⇒ **владелец увидит одно +из трёх и решит, что у остальных чисто**. Поэтому всё по каждому — **руками, по углам**, +а не по сводке. + +**4. Ловушка утренней бумаги опаснее прошлой.** Прошлый раз протухшая сводка кричала +«НОЧЬ ПРОПАЛА» — ошибка была видна. Сводка первой ночи **хвалит**: «НОЧЬ УДАЛАСЬ: СДЕЛАНО +ВСЁ, 1 пункт из 1». 🟢 Она **отложена в сторону** до запуска (`…pervaya-noch-05-08-udalas.md`), +место освобождено. + +--- + +## 🟢 Что замерено ДО запуска — и снимает три страха + +| что боялись | замер | итог | +|---|---|---| +| правка одного работника погасит двоих | в углу работника лежит **своя** настройка, в ней **ни одного хука** — только разрешения | 🟢 стена в углы не переносится, помешать друг другу **нечем** | +| пункты 2 и 3 связаны, нельзя в одну ночь | ни один из двух файлов не тянет другой | 🟢 **не связаны** | +| у приборов есть соседние проверки, их сломают | `tools/*.test.mjs` для четырёх приборов — **нет ни одного** | 🟢 ломать нечего; но и сетки нет (см. выше) | + +--- + +## Проверки — что считаю годным ответом + +`<прогон>` — номер прогона, `w-N` — работник. Команды даются от корня угла. + +### Снять ПЕРВЫМИ, до всякого вырезания + +| № | Что проверяю | Годный ответ | **Что вышло** | +|---|---|---|---| +| П-0 | 🔴 **Чем кончилась ночь.** `.night/СВОДКА-ЗА-НОЧЬ.md` | бумага есть · **дата в первой строке сегодняшняя** · в ней сказано «из **3**», а не «из 1».
🔴 Пока П-0 не сказал «ночь дошла своим ходом», приговор по П-7 выносить **нельзя** | | +| П-1 | Родились ли трое | в карточке прогона **три** работника, у каждого свой пункт и свои три файла | | +| П-7 | Коммиты ×3
`git log --oneline feat/noch-proba-1..night/<прогон>/w-N` | не пусто **у каждого** | | +| П-8 | Несохранённое ×3
`git status --porcelain` в каждом углу | пусто **после вычёркивания служебного**: `.night-worker/`, `.claude/settings.json`, `night-settings.json`, `docs/observer/STATUS.md`, `.claude/proven-config.json`.
🔴 **Голого «пусто» не бывает никогда** — это замерено в первую ночь: все пять кладёт сама затея, ни один не работника.
🔴 Снимать **руками по каждому углу**, не по сводке | | + +### Что сделал каждый + +| № | Что проверяю | Годный ответ | **Что вышло** | +|---|---|---|---| +| П-2 | Ровно три названных файла ×3
`git diff --name-only feat/noch-proba-1..night/<прогон>/w-N` | **три** строки из пометы его пункта, и никаких больше.
🪤 Первая ночь дала «изменённых файлов: 4» при трёх названных — сверить и со строкой сводки | | +| П-3 | Файл проверок заведён и не пуст ×3 | утверждений не меньше: пункт 1 — **11** · пункт 2 — **9** · пункт 3 — **7** | | +| П-4 | 🔴 **Вырезание ×3 — против единственного обмана, который замок не ловит.**
Вернуть **весь** правленый файл дословно: `git show feat/noch-proba-1:<файл>` и прогнать его новую проверку | **краснеет** у каждого. Зелёная на старом коде не проверяет ничего.
🪤 Обман, который замок сегодня пропускает: дописать пробел и назвать проверку, зелёную и до работы. Ловится **только** вырезанием.
После — вернуть файл и сверить `git status` | | +| П-5 | 🔴 **Дыра закрыта — живым вызовом прибора ×3** | · **п.1**: шесть человеческих форм замазаны, обе прежние тоже, **и телефон в имени поля**;
· **п.2**: обе записи одного файла судятся одинаково; 🔴 позвать **оба** прибора и записать ответы **порознь**;
· **п.3**: все четыре приписки узнаются, включая `--work-tree=` **в одиночку** | | +| П-5а | 🔴🔴 **ПРИБОР НЕ СТАЛ ХУЖЕ — самая важная строка после П-4** | · **п.1**: целы номер счёта · номер заказа · дата · номер прогона · хеш коммита · сумма. 🔴 **И сводка с `.pii-counters.json` пишутся по-прежнему** — этот прибор зовут перед каждой записью;
· **п.2**: законный путь **внутри собственного угла работника** проходит; ранее разрешённые пути остались разрешёнными;
· **п.3**: `git push --force origin main` **без приписок** по-прежнему «необратимая»; настоящее слово команды не съедено (`-C` ест два слова, `-c` — одно) | | + +### Что могло сломаться вокруг + +| № | Что проверяю | Годный ответ | **Что вышло** | +|---|---|---|---| +| П-6 | 🔴🔴🔴 **ГЛАВНАЯ строка этой ночи. Полный прогон** | **новых красных против снимка не добавилось.** Своих наборов у трёх приборов нет — это единственная сетка. Особо: `tools/night/paths.test.mjs`, `tools/night/plan-lock-hook.test.mjs` | | +| П-Б | Третьего сворачивателя путей не заведено | работник взял готовый `tools/path-normalization.mjs` **или** объяснил в бумаге, почему не подошёл | | +| П-14 | Спрятанное от хранилища не тронуто | `night.config.json`, `.claude/settings.local.json`, каталог `.night/` — слепок до и после совпадает | | + +### Честность и деньги + +| № | Что проверяю | Годный ответ | **Что вышло** | +|---|---|---|---| +| П-9 | Боевой не тронут | 🔴 смотреть **содержимое** трёх написанных файлов проверок и искать **исполнение** (`child_process`, `spawn`, `exec`, `execSync`, `fetch`, `http`), а **не слова**.
🪤 Куплено в первую ночь: поиск слов обвинил бы **любую** годную работу | | +| П-15 | Чужих веток не смотрели | в следе каждого нет `git log` / `git diff` по чужой ветке и `--all`.
🪤 Эталона у этой ночи нет — сверять не с чем, и это сказано вслух | | +| П-Д | 🔴 **Три бумаги `*-zamer-do.md`** | существуют · непусты · содержат **дословный красный замер** · названы оставшиеся дыры.
🔴 **И содержимое перенесено в утреннюю сводку** — задание запрещает класть незакрытые дыры проверкой, значит эти три файла **единственная дорога** от работника к человеку | | +| П-12 | Цена — точным числом ×3 и суммой | 🔴 **Сводка её не скажет** — первая ночь ответила «замерить не удалось». Считать руками по потокам всех троих.
Оборван хоть один — число объявить **нижней границей** и написать эти слова рядом | | +| П-Е | Время и место | сколько прожил каждый · сколько заняло рождение всех троих (ожидание ≈ **43 минуты**, места строятся по очереди) · свободное место до и после | | +| П-Ж | Рождений не больше разрешённого | трое штатных плюс перезапуски; предел без владельца **5–6** (решение 16), за смену **20** (решение 9а) | | +| П-10 | Сводка говорит правду | «закрыто N из **3**», и это сходится с П-2…П-7, а не заявлено само по себе.
🔴 Про **каждого** из троих сказано поимённо, а не «и дальше молчим» | | + +--- + +## Отказы, которые лист обязан выдать + +| случай | ловит | что должно быть в приговоре | +|---|---|---| +| проверка зелена и на старом коде | П-4 | «не краснеет на прежнем виде — не проверяет дыру» | +| замазыватель стал жадным: затирает счета и даты | П-5а | «прибор стал хуже: **уничтожает данные молча**» | +| свёртка путей закрыла работнику его же угол | П-5а | «законное перестало проходить» | +| опознаватель перестал видеть `push --force` | П-5а | «необратимая стала мирной» | +| двое сделали, третий дописал пробел и заявил | П-4 + П-2 | «вырезание не покраснело, изменён один файл» | +| работник сломал ворота и не смог закоммитить | П-7 + П-Д | 🔴 **отличать от лени**: смотреть его бумагу | +| двое из трёх не видны в сводке | П-8 + П-10 | «сводка заглушила повтор — судить по углам» | +| ночь оборвана снаружи | П-0 | «оборвана», и **приговор по П-7 не выносится** | + +🔴 **Ни один из этих случаев не краснит полный прогон.** Это и есть довод, ради которого лист написан. + +--- + +## Чего этот лист НЕ даёт — названо заранее + +- **Он не сверяет с людьми** — дневного решения для этих трёх задач не существует. +- **Он не доказывает, что приборы теперь непробиваемы.** Он доказывает, что закрыты + **три названные** дыры. Что осталось открытым — обязано быть названо словами в бумагах + работников, а не умолчано. +- 🔴 **Он не мерит деньги на ходу.** Ночные тормоза по деньгам **не работают** — пока + система не пришлёт число, считать прирост не из чего. Потолок этой ночи — + **около 60 долларов**, и останавливают её только часы (сутки на работника) и место на диске. + +--- + +## 🔴 Снимок чужого красного — снять ДО запуска + +Снимается **из угла, заведённого тем же вызовом, каким его заводит ночь**, и **после** +сдвига `feat/noch-proba-1` (правило 171: у мерки есть не только место, но и версия). + +**Записать: файлов N, ПРОВЕРОК M** (не только файлов!), **красных K поимённо.** + +| файл | сколько красных | о чём | +|---|---|---| +| *(заполнить перед стартом)* | | | + +⇒ Годный снимок по опыту первой ночи — **одна** красная: намеренный пробник +`tools/night/proba4-krasnyy.test.mjs`. 🔴 Код возврата 1 в углу работника — **норма**. + +--- + +## Что делаю после — обязуюсь заранее + +Заполняю столбец «Что вышло» **как есть**, включая неудачу, и докладываю владельцу любой исход. +🔴 Отдельно и обязательно: **переношу три бумаги работников в утреннюю сводку** — иначе всё, +что они не смогли закрыть, не дойдёт ни до кого. +🔴 Если пункт не закрыт — **называю причину замером**, а не догадкой.