textmachine/docs/orchestrator-norms-scratchpad.md

41 KiB
Raw Blame History

Скратчпад оркестратора №23 — контроль исполнения лупа

Здесь НЕТ копий норм. Нормы живут в docs/ORCHESTRATOR_SESSION_PROMPT.md, копия факта стареет молча (D39.112). Здесь только (а) указатели-чек-лист, по которому я прохожу ПЕРЕД выдачей и ПЕРЕД лендингом, (б) стоячие правила владельца на этот луп, (в) живая раскладка слотов и журнал выдач. Файл рабочий и умирает вместе с очередью №23.

Стоячие правила владельца на этот луп (слово 11.09)

  1. Выполнить ВСЕ промты, задуманные в docs/NEAR_TERM_PLAN.md.
  2. Советоваться со старшим коллегой (Fable 5, постоянный контекст) — при выдаче промта, при ратификации, при лендинге и при ЛЮБОМ сомнении.
  3. Каждый выдаваемый промт писан по ролевой ноте; сверяться с ролевым промтом всегда.
  4. Сессия обязана эхом вернуть промт (блок 9 — своими словами, не пересказом).
  5. Приёмка и лендинг — строго по нормам ролевого промта.
  6. Сессия доводит свой пак до конца САМА и не беспокоит владельца до готовности; финальное исполнение контролирую я.
  7. Большинство паков идёт бэкенд-сессиям — следить за КАЧЕСТВОМ КОДА: никаких лишних велосипедов, воркэраундов и хаков ВОКРУГ проблемы. Нужно логически правильное работающее решение задачи, а не обход проблемы. Это отдельная ось приёмки, а не общее пожелание.
  8. Один промт на зону. Одновременно живут бэкенд · платформа · полигон · фронт; двух промтов одной зоны быть не может. Слот освобождается закрытием пака АКТОМ, а не сдачей работы.
  9. Пустые сессии владелец наспамил — роли назначаю сам, запускаю по одной и довожу до логического завершения.
  10. АВТОНОМИЯ (слово 11.09, 03:00): владелец отошёл и вернётся, когда весь ближайший план ИСПОЛНЕН. Вопросы решаю сам, совещаясь со старшим коллегой; владельца не жду.
  11. Мерило любого решения — в этом порядке: (а) главные ценности продукта — КАЧЕСТВЕННЫЙ КОНСИСТЕНТНЫЙ ИИ-перевод длинных книг/ранобэ; (б) архитектура и чистый код; (в) рефакторинг только действительно необходимый; (г) никакого велосипедостроения. Решение, выигрывающее у (б)(г), но не служащее (а), — неверное решение.

Перед выдачей промта — механическая сверка (перечтение автором рубежом НЕ считается)

  • 13 обязательных блоков — таблицей/грепом против §«Пишешь промт сессии?» (счёт равен нумерации).
  • Опровергатель-субагент к самому промту («найди отсутствующее и противоречащее»).
  • Блок 5 называет 24 уязвимых места ИМЕННО ЭТОГО пака — «сделай самопроверку» дефектна.
  • Разметка свободы у каждого пункта: «ровно так» либо «реши сам и аргументируй».
  • «Инструмент задан» — только после (а) что канон зовёт штатным, (б) не построено ли уже.
  • Фантом-гард: каждая D-ссылка грепается до НОМЕРА ПУНКТА, не до тела ноты.
  • Построчная сверка чужих путей/каналов против зонной таблицы CLAUDE.md.
  • Полигон-пак — дополнительный абзац норм замеров (арм без фактора · дедуп+декой · критик полноты на каждую фазу · пре-рег фриз ДО платных вызовов · активная проверка живости прогона).
  • Кодовый пак — свой абзац (вакуумный пин · клейм = команда · дифф ^func Test исполнением).
  • Пропорциональность: тяжесть аппарата соразмерна весу пака.

Перед лендингом

  • Контроль завершённости ДО приёмки, механически (блок 13).
  • Приёмка адверсариальная; дерево на время прохода заморожено ИЛИ верификатору выдан ГОТОВЫЙ путь.
  • Скипы печатаются рядом с числом ok.
  • Деньги — из сырого леджера двумя независимыми путями.
  • docs/scripts/counts.py --check и --lint перед ратификационным коммитом.
  • git diff -- <файл> по каждому файлу класса «пишет зона, коммитит оркестратор».
  • Коммит pathspec-формой; финал git status --short.
  • Акт закрывает носители ТЕМ ЖЕ движением (ряды бэклога, реестр дефектов, таблица активных промтов).

Раскладка слотов (живая)

Зона Промт Сессия Состояние
бэкенд BACKEND_BOUGHT_MEANS_DELIVERED_SESSION_PROMPT.md textmachine-b1 → свежая СЕССИЯ b1 ПОТЕРЯНА 15.09 при переезде окружения (textmachine-main-b1 — пустая сессия владельца, НЕ b1). Пак не завершён: круги не сошлись, нет «Чисел», таблицы мутаций, строки завершения. Сдача — в индексе main (sha git diff --cached --binary = 166997963c95…), бэкап ~/tm-b1-orphan-index.patch, копия только для чтения ~/tm-b1-orphan; гейт на копии зелёный (19 ok · 0 FAIL · lint 0 · 9 скипов · 23/23). Передача — разделом ред. 5 того же промта; опровергатель к нему сошёлся за три круга (21 → 3 мажора → 0 мажоров, шесть миноров последнего внесены); выдан 15.09 сессии textmachine-main-b1 словом владельца «выдай ему», confirm по слову 11.09 получен (эррата 15.09-а); эхо . ⏸ СДАН 15.09 ПО ПРАВИЛУ ОСТАНОВКИ П4 — круги не сошлись, остаток в таблице; со слов сессии: 29 путей, сырьё каталога вне репо в /home/ubuntu/tm-mut-logs-final-1509, числа мною не пере-сняты. Приёмка отложена словом владельца «Не отвлекайся пока от банка памяти, работай по нему»
платформа 🟢 СЛОТ СВОБОДЕН — пак принят актом D39.250, минор 0.15.0
полигон ЗАКАЗ СНЯТ ВЛАДЕЛЬЦЕМ 11.09 («полигон не надо выдавать»); промт готов и лежит, пере-выдача — только его словом
сквозной (вне кодовых зон) ЗАКРЫТ актом D39.252 11.09; промт в архиве с баннером. Стенд поднят до конца приёмки, гасить по pid
консилиум банка (вне кодовых зон) BANK_MEMORY_CONSILIUM_SESSION_PROMPT.md textmachine-main-1e ЗАКРЫТ актом D39.253 16.09 с дофиксом и остатком; итог research/35, ряды 441450 заведены. Пять вопросов ждут владельца
фронт заморожен разморозка по критерию NEAR_TERM_PLAN.md

Резерв израсходован: textmachine-61 получила пак о падениях 11.09, как только слот освободился актом D39.249.

ПРИЁМОЧНЫЕ ЗАМЕРЫ ПЕРЕШЛИ КО МНЕ — не по вежливости, а по замеру. Бэкенд-сессию убило ЧЕТЫРЕ раза подряд на пере-снятии десяти записей (0 из 10 дважды, падало на первой). Причина найдена мною: это НЕ сторож и НЕ нехватка памяти — dmesg даёт 26 убийств, все constraint=CONSTRAINT_MEMCG, каждое в своём транзиентном юните tm.slice/tm-runs.slice/tm-test-*; сами слайсы memory.max = max. А мои прогоны идут в /init.scope с memory.max = max. ⇒ у неё потолок есть, у меня нет. Я гоню: десять пере-снятий (её имена, её команда дословно, мои копия и сборка) + по-пакетный battery-stand. Копия — ~/tm-11-accept/backend, построена по норме (test -f go.mod до и после, pwd сверен), tmmutate собран ОДИН раз, мутатор по копии ходит ОДИН. ⚠ В акте будет сказано, ЧЬИМ прибором снята каждая половина: полный гейт 169/169 · RED=167 · выживших 1 · UNKNOWN 1 — её, дошёл один раз до правок; десять пере-снятий и стенд — мои.

ДОЛГ ЛЕНДИНГА СНОВА ОТКРЫТ (акт D39.252): голова бампнута в ДВУХ носителях из трёх. Шапка 05-decisions-log.md и титул реестра стоят на D39.252; CURRENT-STATE — НЕТ: в docs/PROGRESS.md лежит секция бэкенд-сессии на 151 строку из 152, и коммит файла целиком унёс бы её под моим сообщением — ровно инцидент 54f8f6c, повторять нельзя. ⇒ бамп CURRENT-STATE едет ВМЕСТЕ с лендингом бэкенд-пака. До тех пор counts.py --check краснеет по голове — это ЗНАЕМОЕ расхождение, а не находка.

В очереди, написано и ждёт слота: BACKEND_FAILURE_YOU_CAN_SEE_SESSION_PROMPT.md, редакция 2 — выдаётся СВЕЖЕЙ бэкенд-сессии, как c9 закроется актом. Опровергатель нашёл 17 находок, и первая перевернула пак: я построил §1 на «движок лечит болезнь возбудителем», а замер говорит обратное — перевыпуск вернул текст 4 из 4, и в трёх случаях успешный ответ физически не влез бы в базовый потолок. Моя таблица лекарств отключила бы восстановление трёх чанков из четырёх и отменила бы D2 п.2 с пином TestRetryableSubset. Пере-снял сам — потолок 8496 делит популяцию успешных черновиков БЕЗ ИСКЛЮЧЕНИЙ (≤8496 прошли сразу ×3, >8496 упали и прошли на удвоенном ×3), а у редактора наоборот. ⇒ причин две, лекарство одно — вот это и есть пак. Ещё опровергатель снял: три моих контрольных числа не сходились (glob не дошёл до ~170 баз), D24.3 и D39.87 мис-атрибутированы, temperature у pro 0.4 а не 0.3, мест вызова два а не три, «пуста ровно err» — пусты пять колонок. Все исправлены.

Журнал выдач очереди №23

# зона предмет сессия эхо исход
1 бэкенд структура глав, ДИЗАЙН textmachine-50 своими словами, с возражением закрыт актом D39.245 (без сходимости)
2 платформа правда у двери textmachine-8e своими словами, с контрактным пингом закрыт актом D39.246 (с дофиксом)
3 полигон холодный прогон A (платный) textmachine-23 закрыт актом D39.247; строка 16 закрыта замером
4 ревью МОИХ записей (не пак зоны) textmachine-9a отчёт сдан; часть находок заландена 11.09
5 бэкенд консистентность, которую можно предъявить textmachine-c9 закрыт актом D39.249 с дофиксом (шесть посадок круга 1 выжили)
6 полигон ремонт прибора СНЯТ: зона вне скоупа словом владельца, промт в архиве
7 платформа ответ, не зависящий от везения (PD-448 · 162 · 466 · 139) textmachine-37 своими словами, 3 опасности + возражение закрыт актом D39.250, минор 0.15.0
8 бэкенд за одну единицу платим дважды textmachine-61 своими словами, 4 возражения — и первое ПЕРЕВЕРНУЛО посылку пака закрыт актом D39.251 с дофиксом
9 бэкенд купленное доставлено (ряд 291 + приложение 379) textmachine-b1 сессия ПОТЕРЯНА 15.09 при переезде окружения, пак не завершён → строка 11
10 сквозной ХОЛОДНЫЙ ПРОГОН B, платный, с вычиткой всего текста textmachine-82 своими словами, 5 опасностей — три исправили промт ПРИНЯТ актом D39.252, факт $0.396657
11 бэкенд ДОВОДКА пака 9 после потери сессии — раздел ПЕРЕДАЧИ ред. 5 того же промта textmachine-main-b1 своими словами, хеш индекса сверен, +5 недоделок сверх семи (две протухшие строки отчёта · цвет пинов снят не на HEAD · противоречие счёта читателей · §4.5(а) без исполнения · редрайв без катчера) — исходы отправлены выдан 15.09 после трёх кругов опровергателя (21 → 3 мажора → 0) и confirm владельца · ⏸ СДАН 15.09 по правилу остановки П4, приёмка отложена словом владельца «Не отвлекайся пока от банка памяти, работай по нему» · ПРИНЯТ актом D39.255 16.09 по слову «Да, начинай приёмку»: пять осей приёмки (батарея 23/23 · мой полный каталог мутаций 441/441 · её логи пере-разобраны моим прибором 437+4 · ось «отчёт↔код» 26 подтверждений, 0 мажоров · ось денег 79 чисел, все четыре пробы точны). Лендинг af88680, 29 путей, $0. ⚠ Мои ложные нули смены — в п.7 акта
12 — (вне кодовых зон) КОНСИЛИУМ «банк памяти длинной книги — как строить»: наследует банковую работу смены после отзыва проекта оркестратора; совет агентов, Fable 12 textmachine-main-1e своими словами; три опасности: шесть открытых решений против лимита в пять вопросов · исход «не термин» против закрытия D39.102 п.2 · угол «журнал с окнами» против почти пустых окон — все по делу, ответы отправлены ПРИНЯТ актом D39.253 16.09: сдан по правилу остановки, приёмка — пять осей вне консилиума (50 находок, 14 мажоров), затем круг дофикса и узкий закрывающий. Совет нашёл ратифицированный ответ на заглавный кейс владельца (D5 п.1, D7 правка 1), мимо которого прошли оба отозванных проекта. ⚠ Мои ошибки смены — в п.6 акта. Выдан 16.09 после механической сверки 13 блоков и ЧЕТЫРЁХ кругов опровергателя: 4 мажора + 15 миноров → 1 + 7 → 1 + 2 → 0 + 2, миноры последнего внесены. Опровергатель нашёл то, мимо чего прошли оба отозванных проекта: ратифицированный ответ на заглавный кейс владельца (D5 п.1, D7 правка 1) и что у движковых строк банка окон почти нет (since_ch > 0 у 2 строк на книгу, until_ch = 0 у всех). ⚠ Дважды мажор родила МОЯ правка: цитата о заморозке без её предмета · баннер выписки, объявивший опровергнутым верное утверждение
13 бэкенд БАНК ЗА $0 — фундамент «умного участка»: ряды 441 · 445 · 449 · 459 — (не выдан) промт написан 16.09, прошёл круг опровергателя фабла (7 мажоров: 5 внесены, M1 опровергнут моим замером — опровергатель напечатал «баз нет», а их 19, включая bank_stop_presented на 67 строк; 1 уточнён по ссылке). ПРИНЯТ актом D39.257 16.09: пять приборов (батарея 24/24 · мой прогон её 37 мутаций 37/37 без осечек · три оси вне сдачи · числа пере-сняты третьим прибором парсер-свободно · деньги 0 платных путей при контроле 192 файла). Два мажора названы, остаток принят. ⚠ Моя ошибка смены: снёс её рабочий корень мутаций — норма записана выше. ⚠ В самой выдаче явно попрошено ВЕРНУТЬ заказ, если сессия не свежая: норма «новый пак — новой сессии» стоит на том, что карта чтения писана для свежего читателя, а занятость чужого контекста снаружи не видна

ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 11.09. Я предлагал пак трижды — ed, 5c (обе отработавшие, отказались ПО НОРМЕ и были правы) и свежей 37, — после чего владелец сказал «полигон не надо выдавать». Выдача 37 ОТОЗВАНА тем же часом. ⚠ Урок не про полигон: я трижды искал адресата для заказа, приоритет которого не подтверждал у владельца. Слот зоны свободен ≠ работу зоны надо заказывать.

Что я должен помнить, пока паки идут

  • Ключи прогона A: путь выдан (backend/.env), файл НЕ читать; живость ключей проверяется ПЕРВЫМ платным вызовом. Отказ по авторизации — стоп сессии и мой поход к владельцу.
  • Пре-рег-таблица прогона A приходит мне ДО фриза — читаю её прежде, чем потратится первый цент.
  • Релей НЕ СОСТОЯЛСЯ, и сказала это не я. Улика прогона A про многоединичную главу должна была уйти движковой сессии ОТ МЕНЯ отдельным сообщением с её эхо-подтверждением — не ушла, и дизайн-пак записал это у себя: backend/docs/CHAPTER_STRUCTURE_DESIGN.md:1869=о многоединичной главе. Улика найдена и положена в трекер — ряд 409, — чтобы не умереть вместе с этой запиской. В чужую зону я не пишу: §13.2 п.6 того документа снимается ПИНГОМ движковой сессии, а не моей правкой.
  • Кросс-зонная цена перекроя (unit_resolutions платформы, экспортные id термов) придёт от движковой сессии пунктом отчёта — отнести её платформе должен я.

К приёмке прогона A — проверить лично

  • Фриз-коммит и девиация разошлись, и это ЗАКОННО, но должно быть названо. Бинари собраны из клона на b0f5d89; драйвер eval/door_to_file/drive.sh правлен ПОСЛЕ фриза отдельным коммитом 44b33d9 («адрес локального провайдера значит противоположное в двух фазах: обязателен в дыме, запрещён при деньгах на проводе»). Норма пака: девиация — НОВЫМ коммитом и ЯВНО в отчёте. ⇒ при приёмке сверить, что отчёт её называет, и что расхождение «бинари b0f5d89 / драйвер 44b33d9» объявлено, а не замолчано.

Чему меня научили опровергатели 11.09 (не повторять)

  1. Санкция владельца, известная «со слов», носителем НЕ является. Оба пака ссылались на разрешение платного прогона как на факт, а в дереве его не было ни строкой. Завёл носитель — NEAR_TERM_PLAN.md §«Решения владельца».
  2. Пак не заглянул в СВОЮ зону записи. Дизайн-пак заказывал то, что уже лежит в backend/docs/ дизайном-оф-рекорд и рабочим прибором. Теперь у каждого пака первым делом — «что уже лежит у тебя».
  3. Трудность, которой нет. Я написал платформенной сессии, что валидация каталога обязана отличать первый прогон, — каталог создаётся на интейке ДО строки в БД, и различать нечего. Пин на недостижимую ветвь толкает сессию строить exemption, чтобы было что пинить.
  4. «Одно определение на две площадки» бывает недостижимо по построению — опросный путь замка не берёт, и контракт эту асимметрию ратифицировал. Мерило — число ОПРЕДЕЛЕНИЙ, а не площадок.
  5. МОЙ КОММИТ УНЁС ЧУЖУЮ СЕКЦИЮ — 54f8f6c, 11.09. Я правил ОДНУ строку головы в docs/PROGRESS.md и взял файл pathspec-формой целиком, не сделав git diff -- docs/PROGRESS.md; в тот же момент движковая сессия положила туда свою записку-план, и 32 вставки из 33 оказались её. История НЕ переписана (переписывание стёрло бы незакоммиченные правки параллельных сессий), содержимое цело, атрибуция восстановлена сообщением зоне. ⚠ Норма стояла в моём ролевом промте и не сработала, потому что я читал её как «про чужое в ИНДЕКСЕ». Ловится дёшево и постфактум: объём коммита против объёма своей правки — одна строка против тридцати трёх.
  6. «ЭТИ ДВА МЕХАНИЗМА НЕСОВМЕСТИМЫ» — УТВЕРЖДЕНИЕ О КОДЕ, И ЕГО НАДО СПРАШИВАТЬ У КОДА. Я написал в платный пак, что портированная заглушка и провайдер local несовместимы («разные адаптеры»), и запретил бы сессии единственный штатный $0-стенд. Поймала зона: заглушка лежит В РЕПО с комментарием «the P9 live-probe's $0 stand-in, ported», а рядом zeroCostPipeline выбирает модель по Kind == "local". ⚠ Класс ошибки тот же, что «заказал уже построенное», только вывернутый: я объявил НЕВОЗМОЖНЫМ то, что построено и запинено. ⇒ прежде чем писать «несовместимо/невозможно/нечем», грепни предмет — отрицательное утверждение о дереве стоит команды ровно так же, как положительное.
  7. Я ПОСТАВИЛ ПИН, УТВЕРЖДАЮЩИЙ МОЛЧАНИЕ, НА САМЫЙ ДОРОГОЙ ГЕЙТ ПЛАТНОГО ПАКА. «Драйвер отказывает при vcs.modified=true» на бинаре из линкованного воркри выполняется всегда: строк vcs.* там НЕТ вовсе. Поймала зона на первом же замере, я пере-проверил чтением готовых бинарей. Норма ушла в ролевой промт (фриз-дерево — КЛОН, третье условие отказа — отсутствие штампа). ⚠ Класс знал я сам: он записан в CLAUDE.md отдельной строкой про вакуумные пины — и всё равно воспроизвёл его там, где он стоит денег.
  8. Атрибуция нормы к ноте проверяется телом ноты. Ссылка на D39.108 п.1 в моём ролевом промте фантомна: норма верна, нота о другом. Эррата внесена.

Долг, замеченный попутно (не терять)

  • ЛЕНДИНГ ПАКА «КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО» (передача 15.09) обязан тем же движением: (1) расширить ряд 375 воспроизведённым сессией textmachine-main-b1 случаем — memberDrops (backend/internal/pipeline/status.go) считает члена с МЕТКОЙ СТОПА выпавшим, и формулировки Т3/Ч1 пака («навсегда» / «требует проверки человеком») лгут после редрайва отказанного члена и повторного отказа; верное лечение — третье состояние члена, решение 15.09 «остаток, не заплата»; (2) перенавести 17 якорей docs/, сдвинутых сдачей b1 (список — второй круг опровергателя передачи); (3) бамп головы в CURRENT-STATE; (4) ряды контракта 14 для трёх причин (retry_unaffordable · cancelled · attempt_timeout), ряд «расхождение витрин status/экспорт», ряд переименования echo_edit_units, анкор техдолга; (5) решения при приёмке: смысл эхо-метрики на эдит-волне и ранг 4 новой причины. Пак закрывается ПО ПРАВИЛУ ОСТАНОВКИ (круг 8 нашёл дефекты в комментариях починок круга 7 — решение 15.09 «стоп»). (6) Перенос слота гранта на метки стопа и cancelled (пробы B/C второго читателя: юнитов за слот 1 → 2, трата прогона $0.00182 → $0.00364) ОСТАВЛЕН решением оркестратора 15.09 по действующему правилу 03.09 (эррата 03.09-а к D39.170) — дописать в ряд 232; семантика переноса остаётся открытым вопросом владельца. Пробы D/F — числа стали честнее, решения не требуют.

  • ДОЛГ ОБЩНОСТИ, НЕ ЗАВЕДЁН НИ В ОДНОМ НОСИТЕЛЕ (замер 15.09): нормализация ИСХОДНИКА — таблица backend/internal/text/data/trad2simp.txt (встроена go:embed в ядро) и свёртка катаканы в хирагану — зашита в text.NormalizeSourceKey, у функции нет параметра языка, мест вызова вне тестов 55; в configs/langpacks/ данных нормализации исходника 0. ⇒ китайская и японская специфика живёт в Go-ядре и применяется ко ВСЕМ исходным языкам (японский текст получает китайскую свёртку кандзи). Поиск носителя — python по BACKLOG.md, 13-tech-debt-anchors.md, 12-go-style-notes.md, 09-target-architecture.md: по предмету 0, контроль | 330 | найден. Строку бэклога завести вместе с проектом банка (разбор Fable 15.09 — граница «ядро: тождество ключа / данные языка: таблица свёрток»).

  • Якоря розданы не все. Платформе — 3 (её пак §4.5), движку — 3 (backend/docs/DISCLOSURE_LAW_DESIGN.md, дизайн-пак §4.9). Полигонные 5 (docs/experiments/) НЕ вошли в пак прогона A сознательно: он платный и идёт по жёсткому порядку фаз, а док-гигиена потребовала бы релея посреди прогона. Отдать их с пере-выдачей «РЕМОНТА ПРИБОРА». Фронтовые 3 — зона заморожена, отдать первым касанием при разморозке.

  • Числа следующего бэкенд-пака пере-сняты МНОЮ, а не взяты из отчёта воркфлоу (11.09): Spread и в mining.go:383, и в bankexport.go:135 описан дословно как «how many DISTINCT renderings the DRAFTS produced» — счёта по ОТГРУЖЕННОМУ тексту нет (контроль: 144 файла в internal/pipeline); порог короткого ключа minKeyLenHan = 2 с пер-записным allow_short; точность глоссарного класса k6 = 0.0667 в books/gu-zhenren/labels/metrics.json (контроль: у соседних классов 1.0, 0.8333, 0.1667, 0.0 — прибор спрошен у существующего предмета и различает).

  • 11 уехавших якорей в ЧУЖИХ зонах (counts.py --lint, 11.09): полигон 5 (docs/experiments/) · бэкенд 3 (backend/docs/DISCLOSURE_LAW_DESIGN.md) · фронт 3 · платформа 3 — платформенные уже врезаны в её пак §4.5. Свои пять я починил (f9216cd). Остальные раздать ПАКАМИ их зон, не чинить самому.

  • Воркфлоу про банк памяти (wm0j2l4kz) умер, отдав пустой файл — вопрос владельца «что банку памяти нужно для качества перевода» носителя не получил; пере-задать при паке «выдача, которую видит читатель».

Класс ложного нуля, купленный 16.09: обёртка вокруг ВСТРОЕННОЙ команды даёт 127, а счётчик печатает «0»

Мой советчик-фабл отчитался «баз прогонов на хосте нет: project.db — 0 под /home/ubuntu». Баз девятнадцать. Механизм он назвал сам, и он воспроизводим: прибор был timeout 60 command find … | wc -l. timeout запускает ВНЕШНЮЮ программу, а command — встроенная оболочкиexit 127 («команда не найдена»), ноль строк на выходе, и wc -l честно печатает 0 — как будто это результат ПОИСКА.

И вот что делает класс опасным, а не просто глупым: контрольные величины рядом БЫЛИ. Он напечатал «books/ — 17 записей» и «*.db под репозиторием — 0». Обе верны и обе отвечают на ДРУГОЙ вопрос — про репозиторий, где баз и правда нет. ⇒ контроль обязан стоять у ТОГО прибора, который дал ноль, а не рядом с ним: контроль от соседнего прибора доказывает работоспособность соседа, и ничего больше.

⇒ Практика: у любой пайплайн-команды, чей ноль несёт вывод, печатать PIPESTATUS/код возврата ПЕРВОГО звена, а не только число строк. find_exit=127 виден сразу, «0» — не виден никогда.

УЛИКА ПЛАТНОГО ПРОГОНА ОТКРЫВАЕТСЯ ТОЛЬКО СВОИМ РИДЕРОМ — движковый стор её либо не пустит, либо ПЕРЕПИШЕТ (16.09)

Нашла бэкенд-сессия на банк-паке, проверено мной деревом. База купленного прогона отстаёт по схеме от головы (замерено: A-after на 16 при голове 18), и дальше развилка, у которой обе ветви плохи:

  • store.OpenReadOnly (backend/internal/store/store.go:161=current != len(migrations)) на несовпадении ОТКАЗЫВАЕТ SchemaMismatchError — прочитать улику им нельзя;
  • обычный store.Open идёт через миграцию (backend/internal/store/migrate.go:673=for v := current; v < len(migrations); v++) и МОЛЧА ПРИВОДИТ СХЕМУ К ГОЛОВЕ — то есть переписывает купленный прогон, и улика перестаёт быть уликой.

Норма: улики платных прогонов читаются собственным ридером на mode=ro&immutable=1, замеры снимаются на КОПИЯХ, хеши копий печатаются. ⚠ immutable=1 обязателен, а не желателен: обычный mode=ro создаёт рядом с базой файл -shm, то есть трогает каталог улики (поймано первым же зондом той же сессии).

⚠ И общий класс, ради которого это здесь: инструмент своей зоны, применённый к замороженному артефакту, чинит его под себя. Спрашивать надо не «пустит ли меня прибор», а «что он сделает с предметом, когда пустит».

РАБОЧИЙ КАТАЛОГ ЖИВОЙ СЕССИИ НЕ УПОМИНАЕТСЯ В РЕПОЗИТОРИИ ПО ПОСТРОЕНИЮ — греп его «мусором» и назовёт (16.09, моя ошибка)

Владелец сказал снести мусор. Я собрал кандидатов прибором «упоминается ли каталог в файлах репозитория, включая архив» — 5034 файла, у семи целей ноль упоминаний, — и снёс 268 МБ. Среди них был tm-mut-11, рабочий корень идущего мутационного прогона бэкенд-сессии (tmmutate -root ~/tm-mut-11/tree -battery). Окно сноса 19:3619:43 пришлось на её первый прогон; она остановила его «по своей причине» и перезапустила в 20:22, то есть ущерб мог остаться неопознанным с обеих сторон.

Класс: отрицательный замер был верен и отвечал не на тот вопрос. «Каталог не упомянут в репозитории» и «каталогом никто не пользуется» — РАЗНЫЕ утверждения, и для временного рабочего дерева первое верно ВСЕГДА: его для того и создают вне репозитория, чтобы он там не числился. Прибор ответил на свой вопрос.

Норма перед rm -rf любого каталога вне репозитория: к грепу по репозиторию ОБЯЗАТЕЛЬНО добавить ps -eo pid,cmd | grep <имя каталога> и lsof +D (или проверку mtime свежее часа) — и печатать их рядом с решением. Пусто в обоих — сносить; занято — не трогать и назвать владельцу, чей это процесс.

⚠ И вторая половина нормы, дороже первой: убил чужое — пиши той сессии САМ, с точным временным окном, не дожидаясь, пока она наткнётся. Её числа, снятые в окно вмешательства, недействительны целиком: прогон, у которого убрали корень, не отличает «мутация не поймана» от «файла нет».