Move the shift's lessons out of private memory into the tree, re-take the row whose zeros did not reproduce, and give the new vocabulary its glossary entries

This commit is contained in:
heaven 2026-09-11 16:19:59 +03:00
parent 3e43306599
commit 7737434dfc
6 changed files with 83 additions and 12 deletions

View file

@ -87,6 +87,41 @@ Go-бэкенд издательского художественного пер
чтобы влезть в память.** Подмножество `-run` не есть пакет: базовый прогон перестаёт быть базовым, и
вердикт «поймана» становится утверждением о другом предмете. **Лучше не измерить, чем измерить не то**
формулировка зоны, выбравшей честную сторону при максимальном соблазне.
- ⛔ **ФОНОВОЕ ГАСИТСЯ ПО СВОЕМУ PID, А НЕ ПО ИМЕНИ КОМАНДЫ, и норма эта — про ЧУЖУЮ ложную зелень, а не
про твою аккуратность.** `go test`, `tmctl`, `psql`, `/exe/` — имена, общие для всех зон, поэтому
`pkill -f 'go test'` есть шаблон «все, кто сейчас работает»: убитый чужой прогон мутации читается его
хозяином как «мутация выжила», то есть ложная НАХОДКА у соседа. Замерено 29.08: сессия гасила СВОЮ
мутационную кампанию (`pkill -9 -f 'go test'`, `pkill -9 -f '/exe/'`) и попала по процессам
ПАРАЛЛЕЛЬНОЙ — узнала об этом из `ps -eo pid,cmd` уже ПОСЛЕ убийства; в записи зоны платформы за тот
же день жертвы названы поимённо — шесть ревью-агентов чужой сессии в окне 01:36:2001:37:45, включая
линзу покрытия посадками (греп «Я убила чужие процессы» в архиве журнала платформы). ⚠ Второе лицо
того же шаблона зона платформы записала у себя (`platform/docs/STACK_DECISIONS.md`, греп «Демон нельзя
убивать»): `pkill -f <путь к бинарю>` совпадает с собственной командной строкой оболочки и убивает
вызвавшего (exit 144). ⇒ запуская фоновое, ЗАПОМИНАЙ его PID (`$!`, pid-файл) и останавливай только
его; перед любым сигналом по шаблону — сперва `ps -eo pid,cmd | grep`, глазами, чьё это, и если чужое,
не трогать. Убил чужое — сразу пинг той сессии с временным окном, чтобы она пере-прогнала посчитанное:
молчание здесь дороже признания, потому что чужие числа уже испорчены, а выглядят целыми.
- ⛔ **ЗЕЛЁНАЯ БАТАРЕЯ — ЭТО ПОЛНЫЙ СПИСОК ПАКЕТОВ ПЛЮС ОТСУТСТВИЕ `FAIL`, а не отсутствие `FAIL`.** Дважды
за смену 29.08 за зелень принят прогон **20 пакетов из 21**: `FAIL` стоял в самом хвосте лога. Оборванный
прогон выглядит почти нормальным — по алфавиту дошло докуда дошло; а для мутационных посадок он вдобавок
НЕОТЛИЧИМ от не пойманной мутации, то есть обрыв читается как дыра в тестах, которой нет. ⇒ полнота
сверяется СПИСКОМ, а не чтением хвоста: `comm -23` СПИСКА `go list ./...` против вердиктов лога обязан
быть пуст. ⚠ Порядок операндов тут несущий, и перевёрнутый пуст ВСЕГДА: замер 11.09 на движке — обрыв
на 20 пакетах из 23 даёт три строки в правильном порядке и **ноль** в перевёрнутом, то есть перевёрнутый
неотличим от полного прогона. Падение в пакете, которого не трогал, проверяется развёрткой чистого `HEAD`
(`git archive`) и прогоном вперемежку в обоих деревьях: одинаковая частота падений = не твоё.
**И `go test` — НЕ приёмка: приёмка это ЦЕЛЬ ГЕЙТА ЗОНЫ** (`battery: build vet fmt lint test` у движка,
`check` у платформы). `lint` стоит ДО `test`, поэтому «все тесты зелёные» бывает правдой, которая не значит
ничего: пак с настоящими числами `go test -race` упал на лендинге на `errorlint` в своей же новой строке
(`%v` вместо `%w`) — до тестов гейт не доходил вовсе. **Цель, падающая первой, отменяет все последующие**,
и в отчёте называется, ЧТО именно прогнано.
- ⛔ **КОД ОБЁРТКИ — НЕ КОД РАБОТЫ.** Уведомление «completed (exit code 0)» на фоновую команду вида
`(make battery > log 2>&1; echo "MAKE_EXIT=$?" >> log) & echo started` приходит через СЕКУНДУ: ноль — это
код внешней обёртки, а батарея в этот момент ещё идёт (трижды за смену 03.09; в логе стоял один линтер).
Родня — `make`, умерший на `tools-check` под `exit 0` завершающего `echo` (`D39.212` п.8): **код возврата
составной команды отвечает на свой вопрос, а не на твой.** ⇒ `&` внутри фоновой команды не ставить —
фоновость даёт сам харнесс; нужен всё же — ждать УСЛОВИЯ, а не уведомления
(`until grep -q MAKE_EXIT log; do sleep 10; done`), и вердикт читать строкой-итогом из лога.
- ⛔ **ДВА СВОЙСТВА ЭТОЙ СРЕДЫ, каждое даёт ТИХИЙ ЛОЖНЫЙ НОЛЬ** (замерено 11.09, поймано двумя ролями независимо).
**(а) `grep` здесь — не GNU grep, а shell-обёртка над ugrep с `--ignore-files`: она чтит `.gitignore` и
НЕ ВИДИТ каталог `books/`,** то есть всё платное сырьё проекта. Замер: `grep -rl '^terms:' .` → **13**
@ -115,6 +150,26 @@ Go-бэкенд издательского художественного пер
задан существующему предмету: «БД без этой таблицы: 0», «файлов прибор прочёл: 67». ⛔ Именно печатается, а
не упоминается: «проверено с контрольной строкой» — утверждение О проверке, читатель видит слово вместо
числа, и норма ловит замер, но не отчёт о нём (`D39.202`, `D39.217` п.2б).
- ⛔ **«НЕ ВОСПРОИЗВЕЛОСЬ» — ЭТО НЕ «НЕДОСТИЖИМО»: верный прогон при неверной гипотезе неотличим от
«дефекта нет»** (`D39.170`, `D39.174` п.в). Замер: ПЯТЬ попыток воспроизвести перерасход дали пять
«нет», и все пять прогонов были ВЕРНЫ — ошибочна была гипотеза о механизме; решало ВТОРОЕ поле, на
которое не смотрели, а условия достижимости тянули в РАЗНЫЕ стороны (естественный способ добиться
эффекта ровно им же и убивал его), поэтому перебором фикстур такое не нащупывается — только пониманием
механизма. ⇒ прежде чем писать «воспроизвести не удалось», назови ЦЕПЬ звеньев от входа к следствию и
проверь КАЖДОЕ отдельным замером, а не только то, которое кажется решающим; цепь, не проверенная
звеньями, даёт формулировку «я не нашёл условие», а НЕ «условие недостижимо». И лечить класс
структурно всё равно нужно: фикс, покрывающий класс, от того, нашлась ли фикстура, не зависит.
**И злее того — ВЕРНЫЙ РЕЗУЛЬТАТ ПРИ НЕВЕРНОМ МЕТОДЕ: он не краснеет нигде** (11.09, полигон; нашёл
критик чисел, не автор). Строки лога делились по двум попыткам сравнением времени. Первый раз метод
сломался грубо — разделитель в колонке `ts` ПРОБЕЛ, а сравнивали с `T`, и все 33 строки ушли в первую
попытку (33/0). Разделитель починили, числа стали ПРАВИЛЬНЫМИ (16 и 17 строк из 33) — и на этом
остановились, а метод остался негодным: `ts` секундной гранулярности против `started_at` с
микросекундами, то есть все шесть подстановок формально «раньше» старта своей же попытки, и верные
числа вышли по счастливому порядку строк. ⇒ **если в данных есть поле, прямо отвечающее на вопрос,
любой ВЫВОД этого ответа — по времени, по порядку, по соседству — уже дефект метода, даже когда
сходится** (здесь ответ нёс `trace_id`: в нём стоит номер попытки). Спрашивай «чем это НАЗВАНО в самой
строке?» прежде, чем вычислять: красное заставляет чинить способ, зелёное при правильном числе не
заставляет ничего.
- **Мандат самопроверки в промтах сессий (обязателен, решение владельца):** промты полигон-сессий — и вообще любых пишущих код / запросы к моделям — ДОЛЖНЫ явно требовать ревью ИСПОЛНЕНИЕМ: своего кода + сформированных запросов к моделям + полученных результатов. Сессии регулярно ошибаются и багуют, и это искажает результат; **самоотчёт «проверено» без исполнения регулярно оказывается ложным и стоит денег**. Бэкенд-промты — явный бэкенд-ревью после кода (обычно отрабатывает по опыту, но требовать явно). Пост-хок адверсариальная верификация оркестратора при лендинге — второй рубеж, НЕ замена самопроверки.
⚠ **Исполнения мало: промт заказывает адверсариальный проход сессии по СВОЕЙ готовой работе; глубину и веер сессия выбирает под предмет, промт даёт направление — что в этом паке уязвимо.**
**КОПИЯ ПОД МУТАЦИЮ ЗАЩИЩАЕТСЯ ПОСТРОЕНИЕМ, А НЕ `set -e`** (инцидент 10.09, зона назвала сама).
@ -198,6 +253,16 @@ Go-бэкенд издательского художественного пер
**МУТАЦИЯ ЗАСЧИТЫВАЕТСЯ ПО ТЕКСТУ СООБЩЕНИЯ, А НЕ ПО ФАКТУ КРАСНОТЫ.** Читай ТЕКСТ падения: говорит ли
он про сломанное тобой. Правый вердикт по неправой причине — дыра, а не поимка, и от настоящей поимки
отличается только тем, прочёл ли кто-нибудь текст, а не цвет (`D39.217` п.2в).
⛔ **ФИКСТУРА ОБЯЗАНА НАЗВАТЬ ГРАНИЦУ, КОТОРУЮ ПРОШЛА: у сквозного теста граница — побочный эффект
того, как сконфигурирован прогон, а не то, что тест утверждает** (08.09, зона нашла у СЕБЯ и назвала
прямо, `D39.228` п.5). Проекция банка публикуется на ПЯТИ границах прогона, и каждая несёт свою метку
внутри самого документа; все три сквозных теста к ней открывали раннер так, что читали артефакт границ
«авто-продолжение» и «прогон закончен», а предметом была граница ПОДПИСИ — единственная, ради которой
проекция и существует. Порча «не публиковать секцию именно на границе подписи» шла ЗЕЛЁНОЙ по всей
батарее. ⇒ у артефакта больше одного момента записи — тест утверждает СНАЧАЛА, какой момент он прочёл
(сверка метки границы), и только потом содержимое; иначе зелёный тест описывает не тот момент и молчит
ровно там, где предмет. Вопрос себе: «сколько раз этот файл переписывается за прогон и какой из разов
я сейчас читаю?»
⭐ **Пришло письмо «всё закрыто» — иди перечитывать СВОИ утверждения о закрытом, а не чужие правки.**
**Fable 5 — ПОТОЛОК 12 АГЕНТА НА СЕССИЮ, слово владельца 11.09: «я не разрешаю больше 1-2 на сессию».** Прежняя редакция называла это рекомендацией — она отозвана. Модель задавай агенту ЯВНО и знай, сколько их у тебя работает. ⚠ И форма важнее числа: **одному агенту с ПОСТОЯННЫМ контекстом дослылают вопросы, а не поднимают второго** — контекст и есть ценность. Опус-субагенты потолком не ограничены, но тратятся так же.
- **Git-координация мультисессий:**

File diff suppressed because one or more lines are too long

View file

@ -369,7 +369,7 @@
Моё число (13/16 против 10/16) поставило решение на проверку, оркестратор пере-снял своим прибором и отменил собственное. **Довод, который это решает, шире пака и его стоит запомнить:**
**Размеченный корпус, на котором решалось «якорь покупает ноль», собран на РУКОПИСНЫХ сидах — то есть у него по построению НЕТ болезни, которую якорь лечит.** Пере-замер оркестратора, контроль — 47 yaml с непустым `terms:`: рукописные сиды несут `decl` у **42 из 58** · 35 из 49 · 41 из 57; а **НИ ОДНА машинная выгрузка в дереве не несёт `decl` вообще** — 0 из 142 · 0 из 102 (шесть раз) · 0 из 83 · 0 из 76 · 0 из 74 · 0 из 69 · 0 из 67 · 0 из 61 · 0 из 53. ⇒ на боевой дорожке продукта — книга без рукописного сида, банк намайнен — **стеммеру стеммить НЕЧЕМ**, и якорное послабление остаётся единственным, что дотягивается до склонённой передачи. Вердикт на «безопасной» колонке там печатал бы дрейф, которого нет.
**Размеченный корпус, на котором решалось «якорь покупает ноль», собран на РУКОПИСНЫХ сидах — то есть у него по построению НЕТ болезни, которую якорь лечит.** Пере-замер оркестратора, контроль — 47 yaml с непустым `terms:`: рукописные сиды несут `decl` у **42 из 58** · 35 из 49 · 41 из 57; а **НИ ОДНА машинная выгрузка в дереве не несёт `decl` вообще** — 0 из 142 · 0 из 102 (шесть раз) · 0 из 83 · 0 из 76 · 0 из 74 · 0 из 69 · 0 из 67 · 0 из 61 · 0 из 53.**Эррата оркестратора 11.09: числа этого контроля не воспроизвелись, вывод — воспроизвёлся и усилился.** «47» — это файлы с КЛЮЧОМ `terms:` по ВСЕМУ репозиторию (35 непустых + 12 пустых), а не с непустым `terms:`; в `books/` непустых **34** — 26 машинных файлов (2187 термов) и 8 рукописных (284); «0 из 102 (шесть раз)» — четырнадцать файлов; «0 из 67» носителя не имеет вовсе; «0 из 61» — сид-дельта `ws3_seed_delta.yaml`, тоже машинная (её эмитит скрипт полигона `eval/design11/ws3_seeddelta.py`); рукописных носителей форм шесть, а не три. Машинный ноль при этом сильнее заявленного: все 2126 термов 25 выгрузок несут `decl: null`, а сид-дельта ключа `decl` не пишет вовсе. Разбор и полный перечень — ряд **423** бэклога. ⇒ на боевой дорожке продукта — книга без рукописного сида, банк намайнен — **стеммеру стеммить НЕЧЕМ**, и якорное послабление остаётся единственным, что дотягивается до склонённой передачи. Вердикт на «безопасной» колонке там печатал бы дрейф, которого нет.
**Сделано: вердикт снова на якорной колонке, безопасная — вторая.** Это ровно то, что записка `target-ru.txt:231` и предлагала двумя лечениями («seed decl-form enumeration **or** an anchor-gated match»); первое на боевом пути недоступно.
**И МНОГОСЛОВНАЯ ОПАСНОСТЬ, которая теперь обязательна: ЗАКРЫТА ПРАВИЛОМ, а не оговоркой.** Раз вердикт стоит на этой колонке, «глава рода Гуюэ» ⊨ «глаза рода Гуюэ» — это ложное СОКРЫТИЕ, худшее направление. Лечение оказалось не порогом, а **смыслом самого отношения**: `Stem` УСЕКАЕТ, значит два стемма одного слова различаются лишь тем, сколько снято, и короткий обязан быть ПРЕФИКСОМ длинного. «глав»/«глаз» — это замена, а не усечение, и она отвергается. `NearStems` переписана на строгий префикс.

View file

@ -1,6 +1,6 @@
# Путь денег — от гранта до settle (топикальный вход; строка 167 ЗАКРЫТА D39.200, файл живёт сам по себе)
> **Статус: топикальный ВХОД, НЕ источник истины.** Док собирает денежную тему, размазанную по D-нотам, реестру дефектов платформы, глоссарию и бэклогу, в один маршрут чтения. При конфликте с чем угодно побеждает `docs/architecture/05-decisions-log.md` (правило чтения — диета D39.125: живой файл + слайсы). Каждое утверждение здесь снабжено указателем на первичный носитель; формулы — дословно оттуда. Словарь терминов (холд · прирост · аргумент потолка · baseline · settle · leftover-reserved · SpendBound) — `docs/glossary.md` §«Деньги платформы» (`docs/glossary.md:55`=`**Деньги платформы:**`).
> **Статус: топикальный ВХОД, НЕ источник истины.** Док собирает денежную тему, размазанную по D-нотам, реестру дефектов платформы, глоссарию и бэклогу, в один маршрут чтения. При конфликте с чем угодно побеждает `docs/architecture/05-decisions-log.md` (правило чтения — диета D39.125: живой файл + слайсы). Каждое утверждение здесь снабжено указателем на первичный носитель; формулы — дословно оттуда. Словарь терминов (холд · прирост · аргумент потолка · baseline · settle · leftover-reserved · SpendBound) — `docs/glossary.md` §«Деньги платформы» (`docs/glossary.md:58`=`**Деньги платформы:**`).
>
> ⚠ **Форма указателей — норма этого дока (31.08, пере-проверены ВСЕ указатели: 34 уехали, 1 мёртв, 16 верны).**
> **Стабильна не ЗОНА, а ЧИСТЫЙ ФАЙЛ.** Номер строки ставится только туда, где `git status <цель>` показывает файл чистым; файл с незакоммиченной правкой — чей угодно, включая `docs/` — получает греп-указатель без номера. Ось именно такая — ратифицировано **D39.179 п.4**, который уточняет D39.177 §2в и прямо объявляет зонную ось НЕВЕРНОЙ (там же: «Носитель нормы — шапка 15-money-path.md»), и зонная ось её НЕ заменяет: `docs/architecture/14-api-contract/openapi.yaml` ЛЕЖАЛ в «своей» зоне и при этом ДВИГАЛСЯ паком контракта 0.9.0 (заленджен 31.08, `0a680a3`, D39.180).
@ -44,7 +44,7 @@
5. ⚠ **ИСПР. 06.09: формула ЖИВА дословно, сменился ИСТОЧНИК прироста.** `return m.committed + increment`
стоит на месте (`platform/internal/runs/spawn.go`, греп `func (m meter) bookCap`), но `increment`
приходит теперь из проекции движка, а не из «глав × ставку». Прежняя редакция историей:
**Аргумент движку: `bookCap = committed + прирост×ставка`, БЕЗ reserved — PD-158, дословно из кода: `return m.committed + increment`** (`platform/internal/runs/spawn.go`, греп `return m.committed + increment`). Обе фигуры читаются ОДНИМ вызовом `status --json` перед стартом (`bookMeter``platform/internal/runs/spawn.go`, греп `func (s *Service) bookMeter(`; отказы — греп `Absent is not zero`); отсутствие любой из них = отказ спавна («absent is not zero», PD-40). Почему без reserved: write-open движка занулит leftover до первой резервации, значит цифра из read-only status к моменту сравнения уже мертва; ратифицированная ранее формула с reserved переплачивала запасом ровно на leftover сверх холда — исполнено обеими формулами против гейта (D39.123 п.2б, поправка к D39.122(в)). Аргумент ≠ холд: он больше холда на committed (`docs/glossary.md:55`=`ЭТО НЕ ХОЛД — он больше холда`). Фактически ушедшее значение хранится в `run_attempts.ceiling_arg_micro_usd` (PD-144, миграция 00011); потолок уходит argv-шаблоном `{{usd}}` (шаблон — `platform/internal/config/config.go`, греп `CeilingArg`; подстановку делает `platform/internal/runner/engine.go`, греп `{{usd}}`; подстановку и рендер argv делает `platform/internal/runner/engine.go`, греп `func (t CeilingTemplate) Args(`; `platform/internal/runs/runs.go`, греп `func (s *Service) ceilingFor(` — однострочная делегация к нему; `spawn.go` потолок только передаёт); строка 145 закрыта D39.122.
**Аргумент движку: `bookCap = committed + прирост×ставка`, БЕЗ reserved — PD-158, дословно из кода: `return m.committed + increment`** (`platform/internal/runs/spawn.go`, греп `return m.committed + increment`). Обе фигуры читаются ОДНИМ вызовом `status --json` перед стартом (`bookMeter``platform/internal/runs/spawn.go`, греп `func (s *Service) bookMeter(`; отказы — греп `Absent is not zero`); отсутствие любой из них = отказ спавна («absent is not zero», PD-40). Почему без reserved: write-open движка занулит leftover до первой резервации, значит цифра из read-only status к моменту сравнения уже мертва; ратифицированная ранее формула с reserved переплачивала запасом ровно на leftover сверх холда — исполнено обеими формулами против гейта (D39.123 п.2б, поправка к D39.122(в)). Аргумент ≠ холд: он больше холда на committed (`docs/glossary.md:58`=`ЭТО НЕ ХОЛД — он больше холда`). Фактически ушедшее значение хранится в `run_attempts.ceiling_arg_micro_usd` (PD-144, миграция 00011); потолок уходит argv-шаблоном `{{usd}}` (шаблон — `platform/internal/config/config.go`, греп `CeilingArg`; подстановку делает `platform/internal/runner/engine.go`, греп `{{usd}}`; подстановку и рендер argv делает `platform/internal/runner/engine.go`, греп `func (t CeilingTemplate) Args(`; `platform/internal/runs/runs.go`, греп `func (s *Service) ceilingFor(` — однострочная делегация к нему; `spawn.go` потолок только передаёт); строка 145 закрыта D39.122.
6. **Baseline и списание.** `baseline = committed` книги на старте попытки (`platform/internal/runs/spawn.go`, греп `baseline, bookCap := m.committed`); списание попытки = разница счётчика с baseline; счётчик ниже baseline = подменённая БД, сеттлится в ноль с WARN — сами цифры в лог не идут (D39.84; `platform/internal/runs/reconcile.go`, греп `the book's meter reads below`).
7. ⚠ **Терминальный вердикт ОПЕРАТОРА — путь холда мимо settle (добавлено 22.08, P8-FIX/D39.154).** Прогон, чей движок не ответит уже никогда, закрывает человек: `tmplatformctl run abandon --run <id> --reason <текст> [--release-hold]`. Команда ОТКАЗЫВАЕТ, если попытка ещё называет юнит или несёт базовую линию траты — над живым движком прогон не закрывают. Холд возвращается ЦЕЛИКОМ в обоих случаях (к abandon допускается только попытка, не дошедшая до движка, значит она ничего не потратила), а флаг решает лишь КОГДА — сразу или на ближайшем свипе. ⚠ **С пака P11 (`PD-385`) ВЕТВЕЙ ДВЕ, и абзац выше — только ЖИВАЯ** (испр. ревизией 02.09; образец — секция «Строка PHASE = settling» в `platform/deploy/README.md`). У прогона, чья попытка уже КОНЧИЛАСЬ, команда идёт второй ветвью: отказ «юнит/базовая линия» к ней НЕ применяется, к abandon допускается попытка, которая ДОШЛА до движка и ПОТРАТИЛА, холд всё равно возвращается ЦЕЛИКОМ по каждой осиротевшей попытке, а флаг `--release-hold` там ИГНОРИРУЕТСЯ; единственная защита — порог `abandonAfter` неудач расчёта (отказ `ErrSettlementNotStuck`). ⚠ **Ветвление идёт по `runs.finished_at`, а НЕ по наличию осиротевшей попытки** — ратифицированная оговорка `PD-418`. ⚠ **И вторая ветвь НЕ лечит живую:** прогон с намертво заблокированной расплатой уходит в ЖИВУЮ ветвь и закрыт отказом по юниту до сих пор — `PD-424` стоит `open` именно на этой половине.
@ -69,7 +69,7 @@
| Вопрос | Где живёт |
|---|---|
| Словарь терминов | `docs/glossary.md:55`=`**Деньги платформы:**` |
| Словарь терминов | `docs/glossary.md:58`=`**Деньги платформы:**` |
| Управляемый потолок: решение и форма | D39.110 (+поправка D39.112 п.3: п.1 — пересказ, не цитата) |
| Максимум шкалы = Balance как есть | D39.115 п.2а; эррата — шапка D-лога, `docs/architecture/05-decisions-log.md:4`=`Balance КАК ЕСТЬ` |
| Семантика `--ceiling-usd` | D39.122 п.2в; `backend/cmd/tmctl/invocation.go:142`=`the book USD ceiling in force for THIS RUN ONLY`, `backend/cmd/tmctl/main.go:260`=`--ceiling-usd is NOT a per-run budget` |

View file

@ -26,7 +26,7 @@
- **⚠-баннер** — шапка «тело superseded, чему верить»; **ревью-шапка** — вердикты приёмки поверх отчёта в `archive/reports/`.
- **Пак** — пакет работ одной сессии; **свип** — полная перепроверка обязательств (D39.66: 951 позиция); **добор идеала** — очередь качества после ре-пробы flash; **МАСШТАБ** — прогон целой книги.
- **Строка N** — стабильный ID строки единого бэклога (`docs/BACKLOG.md`; не перенумеровывается); **вес** — блокер-очереди / скоро / когда-нибудь; **носитель** — артефакт, в котором обязательство живёт; **хвост** — незакрытый остаток; **петля** — вопрос, обязанный получить диспозицию; **слот** — зарезервированное место в будущем пакете/замере.
- **Гвоздь** — регрессионный тест, прибивающий контракт (негативный гвоздь — тест на ОТСУТСТВИЕ поведения).
- **Гвоздь / пин** — регрессионный тест, прибивающий контракт (негативный гвоздь — тест на ОТСУТСТВИЕ поведения). ⚠ Замер 11.09 по 167 живым `.md`: «пин»/«запинить»/«пин пуст» — **244** вхождения в двух главных доках (90 в `docs/BACKLOG.md`, 154 в D-логе; счёт очищен от «пинг», «пиньинь», «Репин», «спина»), тогда как «гвоздь» вне этой статьи встречается всего **4 раза в двух доках** (`docs/architecture/13-tech-debt-anchors.md`, `eval/softsign-decl/README.md`), а в `BACKLOG.md` и D-логе — НИ РАЗУ; статья держит оба имени, потому что определён был редкий синоним, а не рабочее слово. **Мутация / мутант** — намеренная порча исходника, которой проверяют, что пин ЛОВИТ; инструмент `backend/cmd/tmmutate` с каталогом `mutations.json` сажает мутацию, гоняет тесты одного пакета и возвращает исходник (110 упоминаний в тех же двух доках при нуле в глоссарии). ⛔ Мутация засчитывается по ТЕКСТУ падения, а не по факту красноты (`D39.217` п.2в); гоняется на КОПИИ дерева; пин, флейковый на мутанте, измеряет пустой сценарий, а пин, удовлетворённый ЧУЖОЙ уликой, пуст (гардрейлы `CLAUDE.md`).
- **Реестр 108 / «жилец реестра»** — строка 108 единого бэклога: реестр ЗАГЕЙЧЕННЫХ ТРИГГЕРОВ (отложенных реопенов с условием «когда вернуться»); «жилец» = такой реопен; норма «каждое отложено получает строку или жильца» — D39.66/D39.90.
- **Контракт 14 (API v0)** — ратифицированный контракт фронт↔платформа: `architecture/14-api-contract/` — нормативная спека OpenAPI 3.1 + компаньон-README; ⚠ **зонная копия — НЕ байт-зеркало (испр. 10.09):** равенство приостановлено на время фриза фронта (`D39.142` п.5), и расхождение сегодня измеримо — канон 3467 строк против 1444 в зоне. Прежняя формулировка: зонная копия `frontend/docs/api-contract/` — байт-зеркало (D39.99; статус зеркала и версий — карта `README.md`, здесь не пинятся). **Провенанс ✓/◆/○** — классы утверждений компаньона: выведено из кода/ратификации · предложено (подтверждает названная зона) · открыто (К-вопросы). **spectral / openapi-typescript** — линт спеки и генерация типов фронта с дрифт-тестом (⚠ 3.1-условия генератор игнорирует — К-11).
- **ПТ-N** — стабильный ID требования в `product-requirements.md`; не путать со строками единого бэклога. **paused / лимиты «как Claude Code»** — статус книги при стопе по потолку + страница статуса использования в настройках (ПТ-35, D39.100) ⚠ **испр. 05.09: «сумм на экране нет» ОТОЗВАНО — D39.196**; баланс, потолок и холд показываются деньгами, запрет остался только на структуру НАШИХ расходов.
@ -38,15 +38,18 @@
- **Волны** — waveDraft (черновик) → терминолог → waveEdit (редактура); имена только полные, аббревиатуры W0/W1 запрещены (решение владельца 19.07).
- **Чанк** — единица нарезки книги; **edit-unit (юнит редактуры)** — member-чанки, схлопнутые редактором в один финальный текст: гранулярность финала и экспорта пар (~1.9 юнита/главу; якорь синхронизации фронта — D39.84; draft-only-пайплайн шипит по чанкам).
- **Поверхность — слово с ТРЕМЯ смыслами, и без соседей оно не читается** (замер 11.09: 53 употребления — 22 в `docs/BACKLOG.md` и 31 в D-логе, — статьи не было ни одной). **(1) банковская** — исходное НАПИСАНИЕ термина, ключ, под которым он живёт в банке; ключ уникальности банка — `(src, sense, since, until)`, поэтому «одна поверхность ЗАКОННО несёт несколько ПОДПИСАННЫХ канонов (фамилия и направление у одного написания)» (`D39.193` п.3), а дедуп по голому `src` ронял подпись молча. **(2) продуктовая/сетевая** — внешняя грань, которой продукт повёрнут к пользователю или к соседней зоне: читающая поверхность платформы, операторская ручка, SSE-поток, «поверхностей у продукта ДВЕ, а не одна» — лендинг и IDE (`D39.239` п.1). **(3) кодовая** — место в коде, до которого прогон или тест реально добрался: «Первый живой прогон НЕ КОСНУЛСЯ поверхностей, ради которых часть кода построена» (строка 255). ⚠ Смыслы (1) и (2) сталкиваются в одних и тех же строках про банк и дверь.
- **Банк (памяти)** — термины/имена/голоса книги на весь прогон; **сид** — стартовый банк книги (YAML; подпись владельца — только вкусовые поля, D39.77); **бриф** — книжные вводные; **банкнота** — канал выноса кандидатов из ответа переводчика; **майнер** — $0-извлечение кандидатов из исходника; **KWIC** — конкорданс-контекст кандидата; **терминолог** — роль перевода/подписи терминов батчами.
- **Доктрина инжекта (закон)** — банк на проводе обязателен для всех ролей НЕЗАВИСИМО от статуса строки; право «перевести иначе, если сомнительно» упразднено, свобода — только оговоркой ОБЛАСТИ употребления (не-терминные пассажи: игра слов, разбор знаков); на проводе — единый закон-блок редактора, маркер ⟨проверить⟩ снят; статусы строк и подписная таблица не меняются (D39.104; ВНЕСЕНО вайр-батчем, пак принят D39.199; строка 134 закрыта).
- **Гейты** — детерминированные $0-проверки перевода; **чекеры K1K12** — классы дефектов рубрики; **DC1DC7** — data-driven чекеры на данных пары; **репэйр** — платная петля ремонта (построена, выключена — строка 13).
- **Строгая и якорная колонка** — две колонки прибора консистентности по ОТГРУЖЕННОМУ тексту (носитель — строка 406, правило выбора там же помечено как ратифицируемое приёмкой 11.09): СТРОГАЯ требует «равенства стеммов, как у пост-проверки» и ошибается в сторону ЛОЖНОЙ ТРЕВОГИ; ЯКОРНАЯ «признаёт склонённую передачу» и ошибается в сторону СОКРЫТИЯ. **«Первичная — ЯКОРНАЯ, строгая идёт полом точности рядом»** (на прогоне A точность 0.78 против 0.39); основание НЕ «ложная тревога дешевле сокрытия» — строка 406 прямо говорит, что этот довод аргументирует ОБРАТНОЕ, — а «детектор, врущий в 61 % сообщений, … перестают читать». ⚠ Правило действует, ПОКА прибор флагует и не отказывает: станет он гейтом отгрузки — асимметрия перевернётся и порядок колонок решается заново (строка 406 называет ДВА триггера пере-открытия). ⚠ Не путать с «якорной половиной» канон-проверок (строка 339) — там слово про другое.
- **Судья** — Ф2-оценка качества (gemini); **канал B** — путь чувствительного контента (Mistral+grok); **лейблы (labels)** — размеченный корпус для precision/recall чекеров, метрики заморожены числами в приёмках.
- **Голден** — байт-фиксированный снапшот прогона; **маскированный дифф** — сверка голдена с маской hex/версий; **CheapGateVersion (CGVER)** — версия контракта гейтов; **парити**`TM_MINER_PARITY=1` EXACT-сверка майнера.
- **Эхо-мина** — DeepSeek без thinking эхоит вход вместо перевода; гейт `echoMineViolation` принуждает thinking-ON.
- **Langpack / пар-файл** — данные языковой пары (`backend/configs/langpacks/`); книжное в пар-слое = утечка; **общность** — ревью-вопрос «заработает ли пара/вторая книга без правки Go».
- **Ведро B/D** — корзины триажа карты общности D39.60 (B «пар-модуль без гейта» · D «удалить»).
- **tmctl** — CLI бэкенда. Полный список глаголов — ОДИН в коде (`backend/cmd/tmctl/main.go`, `dispatchCommands`), и он же печатается в usage (паритет «список ↔ usage ↔ switch» прибит тестом `cmd/tmctl/invocation_test.go`); сверка одной командой: `grep -n -A3 "dispatchCommands = " backend/cmd/tmctl/main.go`. ⚠ Копия списка стояла здесь и трижды отставала от кода — снята: носитель один, отдельные глаголы (`build`, `bank-apply`) расшифрованы строками ниже.
- **Подстановка цены** — тихий фолбэк прайсера: провайдер вернул слаг, которого в каталоге нет, и `PriceForResponse` (`backend/internal/ledger/pricing.go:61`=`func (p *Pricer) PriceForResponse`) пробует `actual`, потом `requested`, потом якорь, а ни одно из трёх мест вызова не различает, какая ветвь сработала. Пока подмена падает внутрь той же семьи, счёт верен; опасна не подстановка, а её НЕВИДИМОСТЬ — при маршрутизации провайдера ВНИЗ это «×3.3 из кармана читателя, молча». Носитель — строка 413. ⚠ Сводя такое по диску, помнить строку 428: обход файлов `*.db` умножает трату на число КОПИЙ базы (замер 11.09 — множитель 10.88×), поэтому деньги считаются по УНИКАЛЬНОМУ `(book_id, date)` либо по одной авторитетной базе.
- **COGS** — себестоимость перевода; **ре-проба** — дешёвый повторный замер провайдера после аномалии (носитель события — строка 188; исходная 74 закрыта D39.91).
### Неймспейсы номеров

View file

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