Write the shift's four checks into the platform journal with their limits, and stop the journal teaching the filtered lint that cannot see a foreign doc pointing in

This commit is contained in:
heaven 2026-09-05 14:08:04 +03:00
parent 616a8e4b37
commit c533618a82

View file

@ -222,8 +222,13 @@ make check # ПОСЛЕДНИЙ прогон — после
проверкой `pwd`, наличия файла и КОДА ВЫХОДА грепа (`1` = совпадений нет). Результат тот же, но
предъявлять теперь можно.
`python3 docs/scripts/counts.py --lint`: **`✗ platform/` — 0** (проверено командой
`… --lint | grep -c "✗ platform/"``0`). ⚠ Гонялся циклом: первый проход дал 6 уехавших якорей в
`python3 docs/scripts/counts.py --lint` — **прогон БЕЗ фильтра по своей зоне, и это не мелочь**
(разбор — секция «НОРМЫ, КУПЛЕННЫЕ СМЕНОЙ 05.09», норма 1): красных якорей с корнем цели
`platform`**0**, остальные корни чужие. ⚠ **Прежняя редакция этой строки предъявляла
`… --lint | grep -c "✗ platform/"``0` — НЕГОДНЫЙ метод, и он же стоял тут образцом для
следующей смены.** Он считает якоря, ВЫХОДЯЩИЕ из зоны, и структурно не видит чужой документ,
который целится В неё; именно так пара якорей в `docs/` уехала от моей же правки и обнаружилась
только ПОСЛЕ лендинга. Исправлено 05.09 этой же сессией по заказу оркестратора. ⚠ Гонялся циклом: первый проход дал 6 уехавших якорей в
`DEFECT_REGISTER.md` и 2 в этом журнале — все от МОИХ ЖЕ вставок, все пере-нацелены; два якоря
пришлось чинить руками, потому что токен оказался неоднозначным (`exportName`, `backupPathIn`), и
один — потому что токен `<dc:title>` короче 12 знаков и линтер его не принимает.
@ -466,8 +471,12 @@ owes that and when». Это стало неверным: `tmplatformctl token i
⚠ Остальные красные якоря линтера (`backend/internal/membank/*`, `pipeline/events.go`,
`pipeline/status.go`, `pipeline/stagerun.go`, `17-seam-inbound-law.md`, `15-money-path.md`) — НЕ мои:
их цели правит параллельная движковая сессия. Проверено: в `platform/**` красных якорей **0**
(`python3 docs/scripts/counts.py --lint | grep -c "✗ platform/"``0`).
их цели правит параллельная движковая сессия, и все эти файлы в тот момент были модифицированы в
дереве. ⚠ **Честная формулировка — «мой прибор здесь не меряет», а не «там чисто»:** цели линтер
читает ИЗ ДЕРЕВА, поэтому чужой незакоммиченный WIP и красит якорь ложно, и ложно спасает —
считать их долгом можно только на чистом `backend/`. Оркестратор дождался чистого дерева и
пере-нацелил семь из них коммитом `3ddd0f2`. Проверено безфильтровым прогоном: красных якорей
с корнем цели `platform`**0**; прежняя форма `--lint | grep -c "✗ platform/"` негодна по норме 1.
### Obstacle reporting: что не удалось и что не проверено
@ -820,6 +829,88 @@ credential» ровно на том пути, где что-то уже пошл
обычную ошибку, `main.go` даёт default 1), и это ровно то, из-за чего мой дискриминатор обязан
быть фактом ПЛАТФОРМЫ (`books.status`), а не кодом выхода.
## НОРМЫ, КУПЛЕННЫЕ СМЕНОЙ 05.09 — четыре проверки и их ГРАНИЦЫ (05.09, `textmachine-main-63` + оркестратор №22)
**Записано в репозиторий по заказу оркестратора и по прямой причине:** этих норм не было нигде —
греп по `docs/`, `platform/`, `backend/`, `frontend/` и `CLAUDE.md` дал ноль вхождений всех четырёх,
а по шапке `CLAUDE.md` знание, живущее в переписке, умирает вместе с сессиями. Второй довод
весомее первого: две строки ЭТОГО ЖЕ отчёта (выше по файлу) предъявляли чистоту якорей негодным
способом, то есть в зоне лежал не пробел, а **записанный НЕВЕРНЫЙ МЕТОД, который следующая смена
унаследовала бы образцом**. Обе строки исправлены тем же заходом.
**Адреса ниже — прозой, без якорной нотации,** по той же причине, что и в секции о сломанных
якорях: линтер разбирает якорную форму где угодно, включая текст, который об этой форме РАССКАЗЫВАЕТ.
### Норма 1. Линт якорей гоняется БЕЗ фильтра по своей зоне
**Фильтр по своему каталогу структурно не может увидеть чужой документ, который целится В ТЕБЯ.**
Форма `counts.py --lint | grep -c "✗ platform/"` отвечает на вопрос «целы ли якоря, ВЫХОДЯЩИЕ из моей
зоны», а произносится как «целы якоря моей зоны». Правка файла, на который кто-то ссылается, двигает
строки и ломает адреса в чужих доках МОЛЧА; всплывает это на чужом линте, когда причина уже не
связывается с коммитом. Считать надо по КОРНЮ ЦЕЛИ — линтер печатает эту сводку сам, и она не
капится.
**Два замера за одну смену, и оба — на авторах правила:**
· мой дофикс добавил ОДНУ строку комментария в `platform/internal/config/config.go` — и два якоря в
зоне оркестратора (`docs/PROGRESS.md` и `docs/architecture/05-decisions-log.md`) уехали с 427 и 530
на 428 и 531. Прежний фильтрованный прогон их не видел: корень цели `platform`, а сломаны адреса
в `docs/`. Найдено уже ПОСЛЕ лендинга;
· правка канона `3ab23a9` сдвинула три якоря в спецификации (два на +18, один на +5), и один из них
жил в ЗАМОРОЖЕННОМ журнале фронта — у замороженной зоны нет своего линта в цикле и некому заметить.
**Замороженная зона — худший случай этого класса.**
### Норма 2. `--stat` — столбец ЗАТРОНУТЫХ строк, а не вставок
`git show --stat` печатает по файлу «сколько строк изменено» (добавленные ПЛЮС снятые), а итоговая
строка коммита — «insertions», но по ВСЕМ файлам сразу. На `3ab23a9` оба числа равны 22 и значат
разное: по файлу это 20 добавленных + 2 снятых, в итоге — 20+1+1 вставок по трём файлам. Совпадение
случайное. **«Сколько добавлено» отвечает только `--numstat`.**
⚠ Цена замерена: неверное «22» ушло из переписки в ПОСТОЯННУЮ запись — в текст коммита `cdfc569`,
где сказано, что якоря уехали на двадцать две строки. Ни один не уехал на 22.
### Норма 3. Арифметическая сходимость — ТРЕВОЖКА, а не прибор
Чистая дельта файла обязана равняться сдвигу самого нижнего якоря. **Но выход этой проверки — всегда
«иди мерь», и никогда «вот причина»:**
· сошлось ⇒ про число ханков НИЧЕГО (на `3ab23a9` сошлось при ДВУХ ханках);
· не сошлось ⇒ «якорь лежит не ниже всех ханков ЛИБО замер неверен» — про многоханковость ничего;
· РАЗНЫЕ сдвиги у разных якорей ⇒ ханков ≥2, и это доказательно;
· равные сдвиги ⇒ снова ничего.
⚠ Контрпример к сильной форме лежит в том же коммите: ханки заняли старые 985992 и 16471652, якорь
на 1546 лёг МЕЖДУ ними и уехал на +5 при дельте файла +18 — не сошлось без единого неверного замера.
Формулировка «не сошлось ⇒ правка многоханковая» увела бы искать несуществующие ханки.
**Мерит по-настоящему одно — перегрепать токен в цели, ровно как делает линт.** Ценность арифметики
не в точности, а в том, что она срабатывает на утверждении, которое автор УЖЕ написал и перемерять не
собирался. Это единственная дешёвая защита против «записано точнее, чем проверено».
### Норма 4. Приёмка ищет не «где код неверен», а «какое утверждение отчёта никто не исполнил»
⛔ Главный вывод пака и он же самый неприятный: **четыре из пяти major приёмки — не новые дефекты, а
МОИ СОБСТВЕННЫЕ ПОСЫЛКИ, записанные как факты** («каталог уходит с исходником» · «у книги в интейке
терять нечего» · «граница одна на две двери» · «замер обеих веток»). Верификатор не нашёл кода,
который я не додумала, — он нашёл предложения, которые я не проверила. На этой работе класс оказался
ДОМИНИРУЮЩИМ, а не редким, и он же поймал меня ДВАЖДЫ уже после сдачи (нормы 1 и 2).
**Следствие для следующей приёмки: сначала выпиши утверждения отчёта, потом спроси у КАЖДОГО, чем
оно предъявлено.** И строку «я сказала „замер обеих веток“, а померена была одна» держать в отчёте
обязательно: она единственная позволяет читателю понять, чему в отчёте вообще можно верить.
### Экспонат, найденный этой же нормой, и он НЕ мой
**Ссылку без токена линтер не проверяет вовсе** — только существование файла. В этом журнале такая
живёт: пункт 7 ревизии (04.09, `textmachine-main-34`) ссылается на строки 314 и 455 ЭТОГО файла как
на довод, что канон не давал `operationId` третьему адресу. Проверено: на `32be78a`, ДО моего пака,
на тех строках уже стояло другое — ссылка протухла раньше и не от моих вставок. Сама ссылка ищется
грепом по строке `platform-PROGRESS.md:314,455`; цели — два места, которые греп `operationId`
третьему адресу даёт в этом же файле (на момент этой редакции 1382 и 1526). **Не чиню намеренно:
это чужой довод о чужом замере, и правка чужой записи задним числом дороже протухшего номера.**
Названо, чтобы следующая смена чинила осознанно, а не наследовала молча.
**И последнее — норма 1 укусила ЭТОТ САМЫЙ абзац, третий раз за смену.** Первая его редакция
называла цели «1291 и 1435»: числа были верны, пока секция не встала на место, а вставка 84 строк
сдвинула всё, что ниже, — включая то, на что абзац указывает. **Номер строки протухает от акта его
записи, если запись стоит ВЫШЕ цели в том же файле.** Отсюда форма указателя: сначала ТОКЕН, которым
цель ищется, и только потом номер — с оговоркой «на момент этой редакции».
## НАХОДКА В ЧУЖОЙ ЗОНЕ, ЖИВШАЯ ТОЛЬКО В ПЕРЕПИСКЕ — зеркало контракта у фронта (04.09, `textmachine-main-34`)
**Пишу сюда, потому что переписка между сессиями умирает вместе с сессиями, а канон велит долговечному знанию жить в репозитории.** Находка сделана по вопросу оркестратора «не построен ли фронт под старую версию контракта», передана ему сообщением — и до этой записи существовала ТОЛЬКО там.