diff --git a/platform/docs/platform-PROGRESS.md b/platform/docs/platform-PROGRESS.md index c80727e8..6ab4f0c5 100644 --- a/platform/docs/platform-PROGRESS.md +++ b/platform/docs/platform-PROGRESS.md @@ -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`), и один — потому что токен `` короче 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, и это доказательно; +· равные сдвиги ⇒ снова ничего. +⚠ Контрпример к сильной форме лежит в том же коммите: ханки заняли старые 985–992 и 1647–1652, якорь +на 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`) ⚠ **Пишу сюда, потому что переписка между сессиями умирает вместе с сессиями, а канон велит долговечному знанию жить в репозитории.** Находка сделана по вопросу оркестратора «не построен ли фронт под старую версию контракта», передана ему сообщением — и до этой записи существовала ТОЛЬКО там.