textmachine/docs/orchestrator-norms-scratchpad.md

181 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Скратчпад оркестратора №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** | ✅ **ВЫДАН 11.09** после опровергателя (21 утверждение проверено, 4 опровергнуто, 4 умолчания дописаны); жду эхо |
| платформа | — | — | 🟢 **СЛОТ СВОБОДЕН** — пак принят актом `D39.250`, минор 0.15.0 |
| полигон | — | — | ⛔ **ЗАКАЗ СНЯТ ВЛАДЕЛЬЦЕМ 11.09** («полигон не надо выдавать»); промт готов и лежит, пере-выдача — только его словом |
| сквозной (вне кодовых зон) | — | — | ✅ **ЗАКРЫТ актом `D39.252`** 11.09; промт в архиве с баннером. Стенд поднят до конца приёмки, гасить по pid |
| фронт | заморожен | — | разморозка по критерию `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 | ждётся | выдан 11.09 |
| 10 | сквозной | ХОЛОДНЫЙ ПРОГОН B, платный, с вычиткой всего текста | textmachine-82 | ✅ своими словами, 5 опасностей — три исправили промт | ✅ **ПРИНЯТ актом `D39.252`**, факт $0.396657 |
**ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 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 в моём ролевом промте
фантомна: норма верна, нота о другом. Эррата внесена.
## Долг, замеченный попутно (не терять)
- **Якоря розданы не все.** Платформе — 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`) умер, отдав пустой файл** — вопрос владельца «что банку памяти
нужно для качества перевода» носителя не получил; пере-задать при паке «выдача, которую видит читатель».