From a9cb6aa977f0a0b3fd16fe4530d50acf04387f1f Mon Sep 17 00:00:00 2001 From: heaven Date: Wed, 16 Sep 2026 21:49:57 +0300 Subject: [PATCH] Close six more decisions-log anchors: three tokens and three moved onto the lines their prose quotes --- docs/architecture/05-decisions-log.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 373e07b7..3f97d971 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -672,7 +672,7 @@ **3. Настоящий корень назван (для будущего пака 124).** Не «денежная таблица не помнит конфигурацию», а «в сторе нет первоклассной связи *строка диспозиции ↔ вызовы, которые её оплатили*»: `checkpoints` append-only на жизнь книги, `chunk_status.cost_usd` перезаписывается каждым поколением, и единственный пер-поколенный авторитет — деньги самой строки. Снапшот на чекпоинте — прокси этой связи, а не примитив; класть в схему надо провенанс, а не флаг конфигурации. -**4. Почему срочности нет.** Под контрактом D39.150 («гарантируется НАПРАВЛЕНИЕ ошибки, не точность») ни один исход нынешнего механизма не занижает молча: нормальный случай точен, недостача несётся историческими деньгами С РАСКРЫТИЕМ, пойманный откат откатывается к устаревшей цене ВСЛУХ. Остаточные нарушения контракта чинятся БЕЗ схемы и уже имеют носителей — **197** (прибить гарантии тестами и довести раскрытие до `status`) и **194** (деньги банковых ролей в число согласия). ⚠ Уточнение цены 194, сверенное оркестратором: миграция ей НЕ нужна — `store.RoleSpentUSD` уже ключуется по РОЛИ чекпоинта, а не по колонке класса (`internal/store/ledger.go:105-118`, докстринг прямо: «a new call class needs no migration to become countable»). (17.08.2026, оркестратор №18) ✅ +**4. Почему срочности нет.** Под контрактом D39.150 («гарантируется НАПРАВЛЕНИЕ ошибки, не точность») ни один исход нынешнего механизма не занижает молча: нормальный случай точен, недостача несётся историческими деньгами С РАСКРЫТИЕМ, пойманный откат откатывается к устаревшей цене ВСЛУХ. Остаточные нарушения контракта чинятся БЕЗ схемы и уже имеют носителей — **197** (прибить гарантии тестами и довести раскрытие до `status`) и **194** (деньги банковых ролей в число согласия). ⚠ Уточнение цены 194, сверенное оркестратором: миграция ей НЕ нужна — `store.RoleSpentUSD` уже ключуется по РОЛИ чекпоинта, а не по колонке класса (`internal/store/ledger.go:105-118`=`RoleSpentUSD sums the settled cost`, докстринг прямо: «a new call class needs no migration to become countable»). (17.08.2026, оркестратор №18) ✅ ## D39.152 — КОНТРАКТ API v0 **0.4.0 РАТИФИЦИРОВАН** (лендинг `6e84574`) (синк с платформой, 14 пунктов; author≠ratifier соблюдён сессией); четыре текстовые правки внесены при ратификации; клейм «ломающая правка одна» верен для типов и неточен поведенчески (20.08). ✅ @@ -772,7 +772,7 @@ **5. Найдено вне заказа и записано строками.** **210** — род НЕ ПРОИЗВОДИТСЯ авто-путём вовсе: доставка построена (`genderConstraintNote`, confirmed-only, директива D39.21 «род должен доезжать»), а данных ей никто не даёт — промпт терминолога возвращает ровно три поля без рода, майнер берёт `gender` только из сида ⇒ на книге без ручного сида ось рода мертва по построению; реестр памяти зовёт это «жалобой №1 читателей MTL». Тем же касанием: `gates.voice` не встречается НИ В ОДНОМ шиппинг-конфиге — прогон с редактурой осей голоса не посчитает, пока гейт не включён. **208** — эскалация на Gemini молча теряет инъекцию банка (пинг полигона, пере-проверен кодом). **209** — риг живых проб не может залогировать тела ни при каких env. -**6. СНЯТА ратификация, которой не требовалось (и это исправление МОЕЙ ошибки причинности).** Строки 203(з)/191(б) я нёс как «D39.144 говорит один ОК, движок держит пер-термный гейт, одно из двух должно уступить — ратификация владельца». Опровергнуто кодом: гейт проверяет полноту не ПОДПИСЕЙ, а ФАЙЛА решений, и ОДИН файл его снимает — `loadMinedDelta` штампует только `Source`, опущенный статус дефолтится в `approved` (`membank/memseed.go:71-74`), `unsignedEngineSurfaces` выбрасывает лишь `Source=="mined" && Status!="approved"` ⇒ промоутнутые строки остаются сид-поверхностями, дельта пустеет. Обход в платформе — костыль под ОТСУТСТВУЮЩУЮ ДОСТАВКУ, а не под конфликт моделей. Единственный живой блокер темы — владение `book.yaml` (199а). **Урок метода: «два дока противоречат» ≠ «нужна ратификация»; сперва трассируй МЕХАНИЗМ, потом объявляй развилку.** +**6. СНЯТА ратификация, которой не требовалось (и это исправление МОЕЙ ошибки причинности).** Строки 203(з)/191(б) я нёс как «D39.144 говорит один ОК, движок держит пер-термный гейт, одно из двух должно уступить — ратификация владельца». Опровергнуто кодом: гейт проверяет полноту не ПОДПИСЕЙ, а ФАЙЛА решений, и ОДИН файл его снимает — `loadMinedDelta` штампует только `Source`, опущенный статус дефолтится в `approved` (`membank/memseed.go:71-74`=`written from model output on EVERY run`), `unsignedEngineSurfaces` выбрасывает лишь `Source=="mined" && Status!="approved"` ⇒ промоутнутые строки остаются сид-поверхностями, дельта пустеет. Обход в платформе — костыль под ОТСУТСТВУЮЩУЮ ДОСТАВКУ, а не под конфликт моделей. Единственный живой блокер темы — владение `book.yaml` (199а). **Урок метода: «два дока противоречат» ≠ «нужна ратификация»; сперва трассируй МЕХАНИЗМ, потом объявляй развилку.** **7. Три мины формата `mined_delta`, которые обязана знать сессия трубы** (сверено кодом, ни одной не было в докax): копи-паст карты подписи НЕ работает — карта пишется вся со `Status:"auto"`, и это запинено, а `auto` фильтруется как неподписанный ⇒ бесконечная петля; терм БЕЗ `dst` промотить нельзя вовсе — approved с пустым `dst` роняет загрузку сида и срывает прогон, для WHICH-only термов единственный очищающий глагол это ОТКАЗ; хвост реверс-секции ломает «один ОК» на больших книгах — кап 200 режет ПОСЛЕ фильтров, при >200 banknote-поверхностей нужно ceil(N/200) актов. @@ -996,7 +996,7 @@ **Строка 227 заведена с ИСПРАВЛЕННЫМ якорем.** Находка Д4 (квитанция считает `signature` от карты, которую переписывает любая граница майнинга) ссылалась на `pipeline/signaturemap.go` — такого файла НЕТ. Существо находки верно, носитель другой: идентификатор карты живёт в -`backend/internal/membank/decisions.go:903-912` (`seed.SignatureMapID`), и шов его не читает, то есть +`backend/internal/membank/decisions.go:981`=`seed.SignatureMapID(content)` — ⚠ испр. 16.09: было :903-912 (`seed.SignatureMapID`), и шов его не читает, то есть починка аддитивна. **Тесты под зелень не подгонялись — проверено диффом, а не заявлением.** 108 удалённых строк в тестах @@ -1163,7 +1163,7 @@ device». Починено `TestMain`, проверено двумя прого ### 3. ПРОДАЖА ПЕРЕ-ПРОХОДА — дверь к УЖЕ ПОСТРОЕННОМУ механизму -**Разведка установила: движковая половина построена практически целиком.** `translate --resnapshot` после `bank-apply` определяет затронутые термином юниты БАЙТ-СВЕРКОЙ отрендеренного запроса (точнее любого селектора), незатронутые пере-привязывает за **$0** (`backend/internal/pipeline/stagerun.go:88-107`, `repin.go`), считает смету ДО первого резерва и под порогом согласия — свой у книги, иначе `min($0.50, 5% × книги)` — **продолжает сам, без флагов** (`rebill.go`). Смета уже публикуется в `status --json` полями `rebill_units`/`rebill_usd`. ⚠ `redrive` для этого НЕ годится: он атакует только флагнутые чанки и никогда не трогает `DispOK`. +**Разведка установила: движковая половина построена практически целиком.** `translate --resnapshot` после `bank-apply` определяет затронутые термином юниты БАЙТ-СВЕРКОЙ отрендеренного запроса (точнее любого селектора), незатронутые пере-привязывает за **$0** (`backend/internal/pipeline/stagerun.go:88-107`=`a source edit becomes a silent per-chunk re-translate`, `repin.go`), считает смету ДО первого резерва и под порогом согласия — свой у книги, иначе `min($0.50, 5% × книги)` — **продолжает сам, без флагов** (`rebill.go`). Смета уже публикуется в `status --json` полями `rebill_units`/`rebill_usd`. ⚠ `redrive` для этого НЕ годится: он атакует только флагнутые чанки и никогда не трогает `DispOK`. ⚠ **МИНА, ВЗВЕДЁННАЯ НАШИМ ЖЕ ВЧЕРАШНИМ ЛЕНДИНГОМ — чинить ПЕРВЫМ.** Правка банка двигает снапшот, а движок при сдвинутом снапшоте **останавливается ГРОМКО**, если не передан `--resnapshot` (`stagerun.go:54-58`, текст отказа сверен). Платформа не передаёт ни его, ни `--accept-rebill` (`platform/internal/runner/engine.go:90-98`). До 28.08 это не кусало, потому что до движка не доезжало ничего; **вчера заленджены и ключи, и дверь — значит первый же продолжающий прогон после первой же правки банка УПАДЁТ.** Носитель — строка **199**(б). @@ -1270,7 +1270,7 @@ D39.165 «смета уже публикуется в `status`» верна то ### ДОКИ ВРАЛИ ПРО РАЗРЕШЕНИЯ ПРОВАЙДЕРОВ — ось, где ошибка стоит аккаунта -`research/08-legal.md:13` и `09-target-architecture.md` утверждали: «`accepts_labels` держатся ПУСТЫМИ до фактов ToS (fail-closed)». **Факты предъявлены и поля ЗАПОЛНЕНЫ:** `backend/configs/models.yaml:99` и `:160` несут `[sexually-explicit]`, `:172` — `[violence, sexually-explicit]`. Механизм fail-closed жив (пустое поле по-прежнему запрещает всё), но «пусты у всех» — ложь. Оба места исправлены. ⚠ Агент пропустил это в ПЕРВОМ заходе и снял в свою сторону во втором — самокоррекция названа здесь, потому что она и есть признак честного аудита. +`research/08-legal.md:13` и `09-target-architecture.md` утверждали: «`accepts_labels` держатся ПУСТЫМИ до фактов ToS (fail-closed)». **Факты предъявлены и поля ЗАПОЛНЕНЫ:** `backend/configs/models.yaml:145`=`accepts_labels: [sexually-explicit]` — ⚠ испр. 16.09: было :99 и `:160` несут `[sexually-explicit]`, `:172` — `[violence, sexually-explicit]`. Механизм fail-closed жив (пустое поле по-прежнему запрещает всё), но «пусты у всех» — ложь. Оба места исправлены. ⚠ Агент пропустил это в ПЕРВОМ заходе и снял в свою сторону во втором — самокоррекция названа здесь, потому что она и есть признак честного аудита. ### ДЕНЕЖНЫЙ ВХОД ЦИТИРОВАЛ СУММУ, КОТОРОЙ КОД НЕ ДАЁТ @@ -1426,7 +1426,7 @@ $0.007280 вместо максимум $0.003640, две уже доставл побайтово однородном источнике**. Асимметрию надо строить в том, что предлагает МОДЕЛЬ, а не в тексте. 2. **Условия тянут в РАЗНЫЕ стороны.** Естественный способ заставить дельту расти — дать поздним главам новый термин — ровно этим выталкивает `since_ch` за пределы уже доставленного, а - `spoilerBlocked` (`membank/memory.go:640-647`) — жёсткий гейт `chapter < since_ch`: такой термин не + `spoilerBlocked` (`backend/internal/membank/memory.go:679`=`spoilerBlocked reports whether the entry` — ⚠ испр. 16.09: было :640-647) — жёсткий гейт `chapter < since_ch`: такой термин не попадёт в инъекцию ранней главы НИКОГДА, какой бы `dst` он ни получил. Нужна ОБРАТНАЯ асимметрия: термин в раннем исходнике, рендеринг поздно. **Урок, годный за пределами этого пака:** пять верных прогонов при неверной гипотезе неотличимы от