From 99034428f689bf60a9bd626f657858c8d8328608 Mon Sep 17 00:00:00 2001 From: heaven Date: Mon, 31 Aug 2026 18:38:33 +0300 Subject: [PATCH] Ratify the disclosure law the owner asked for, with the honest price its designer named: forty percent gated and two clauses without ancestry in the code --- docs/PROGRESS.md | 2 +- docs/architecture/05-decisions-index.md | 3 ++- docs/architecture/05-decisions-log.md | 28 ++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index e3663aa9..ecfdaa44 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-31, голова D39.180 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №21** (единственный носитель — здесь; роль передана 31.08, №20 закрыт нотой передачи D39.177; ⚠ **пак P12 ПРИНЯТ И ЗАЛЕНДЖЕН 31.08 — D39.180**, вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же): **(1) РАЗРЫВ ЦИКЛА: книга не отдаётся файлом — ни одной стороной.** Канон обещает `createExport`/`getExport`, платформа их НЕ монтирует (смонтировано 15 операций из 20; нет также `getRun`, `updateBook`, `deleteBook`), а движок писателя не имеет вовсе — `tmctl export` пишет только в stdout (JSON `tm-export-v1` либо текст с аудит-баннерами). ⚠ Прежняя редакция обосновывала это грепом `epub|fb2|docx` («21 хит, все на стороне ингеста») — довод СНЯТ 30.08: он и был хрупким (сырой счёт хитов), и стал ложным после лендинга. Долг числится с P8 (`platform/BACKLOG.md` П-17), с тех пор легло пять паков и ни один его не взял. **Слово «отдаёт результат» сегодня ложно по букве** — ⚠ 30.08: ДВИЖКОВАЯ половина ЗАКРЫТА паком «писатель книги» (D39.175, `8adcb86`): `tmctl build` отдаёт EPUB 3 + чистый txt с шестью состояниями честности; открытой остаётся дверь платформы (п.4) · **(2) холодный прогон движка на текущем HEAD — ПРОМТ ВЫДАН 31.08** (`BACKEND_COLDRUN_V16_SESSION_PROMPT.md`, D39.179), прогон НЕ НАЧАТ. Гейт строк 16/154/157/160/198/202/216, слово владельца 20.08: с 27.08 легло ~15 нот (шов, стоп банка флажком, схема v16, класс отказа 15, объёмный потолок, гейт схемы) и НИ ОДНА не проверена деньгами. ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** Прежняя «≈$0.05» СНЯТА как протухшая: пере-пин DeepSeek 16.08 даёт множитель 4.47 на том же заходе (D39.179 п.1). ⚠ **ГЕЙТ КЛЮЧЕЙ СНЯТ словом владельца 30.08** (D39.176 п.6), но конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса — прогон обязан передавать `--keys-file` абсолютным путём; заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`. Для п.3 нужен ДРУГОЙ файл (путь платформы `TM_PLATFORM_ENGINE_KEYS_PATH`) — вопрос владельцу открыт · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО и первыми настоящими данными движка не проверялись · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на ШЕСТЬ миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.8.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 20; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ** (`13-tech-debt-anchors.md` §Б-108): `go.work` — у платформы свой модуль есть, файла в корне НЕТ; вендор-сверка маппинга эффорта `deepseek-v4-pro` — сработала 13.08, носители противоречат, закрывается ТОЛЬКО вендор-докой. ⚠ **ЧТО В ПРЕЖНЕЙ ОЧЕРЕДИ БЫЛО НЕВЕРНО, проверено деревом 30.08:** пункт про `sqlc` отдельной сессией ИСПОЛНЕН (D39.172, `63fcee5`); «работа полигона в дереве НЕЗАКОММИЧЕНА, читать `git status -- eval/`» ОПРОВЕРГНУТО — она лежит коммитом `28c2d0f` на ветке `polygon`, запушена, в `main` не влита, а названная команда возвращает пустоту и уводит в вывод «работы нет»; «развязка git с origin» ОПРОВЕРГНУТА — `main` и `origin/main` на одном коммите. +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-08-31, голова D39.181 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №21** (единственный носитель — здесь; роль передана 31.08, №20 закрыт нотой передачи D39.177; ⚠ **пак P12 ПРИНЯТ И ЗАЛЕНДЖЕН 31.08 — D39.180**, вместе с контрактным минором **0.9.0**; `PD-425` закрыт им же): **(1) РАЗРЫВ ЦИКЛА: книга не отдаётся файлом — ни одной стороной.** Канон обещает `createExport`/`getExport`, платформа их НЕ монтирует (смонтировано 15 операций из 20; нет также `getRun`, `updateBook`, `deleteBook`), а движок писателя не имеет вовсе — `tmctl export` пишет только в stdout (JSON `tm-export-v1` либо текст с аудит-баннерами). ⚠ Прежняя редакция обосновывала это грепом `epub|fb2|docx` («21 хит, все на стороне ингеста») — довод СНЯТ 30.08: он и был хрупким (сырой счёт хитов), и стал ложным после лендинга. Долг числится с P8 (`platform/BACKLOG.md` П-17), с тех пор легло пять паков и ни один его не взял. **Слово «отдаёт результат» сегодня ложно по букве** — ⚠ 30.08: ДВИЖКОВАЯ половина ЗАКРЫТА паком «писатель книги» (D39.175, `8adcb86`): `tmctl build` отдаёт EPUB 3 + чистый txt с шестью состояниями честности; открытой остаётся дверь платформы (п.4) · **(2) холодный прогон движка на текущем HEAD — ПРОМТ ВЫДАН 31.08** (`BACKEND_COLDRUN_V16_SESSION_PROMPT.md`, D39.179), прогон НЕ НАЧАТ. Гейт строк 16/154/157/160/198/202/216, слово владельца 20.08: с 27.08 легло ~15 нот (шов, стоп банка флажком, схема v16, класс отказа 15, объёмный потолок, гейт схемы) и НИ ОДНА не проверена деньгами. ⚠ **Цена: слово владельца 31.08 — ≈$0.60, потолок $0.80, ДЕСЯТЬ глав ПОЛНОЙ цепью включая редакторскую волну.** Прежняя «≈$0.05» СНЯТА как протухшая: пере-пин DeepSeek 16.08 даёт множитель 4.47 на том же заходе (D39.179 п.1). ⚠ **ГЕЙТ КЛЮЧЕЙ СНЯТ словом владельца 30.08** (D39.176 п.6), но конвенционного `.env` НЕТ НИ У ОДНОЙ книги корпуса — прогон обязан передавать `--keys-file` абсолютным путём; заполнены только `projects/textmachine/backend/.env` и `.../eval/.env`. Для п.3 нужен ДРУГОЙ файл (путь платформы `TM_PLATFORM_ENGINE_KEYS_PATH`) — вопрос владельцу открыт · **(3) живой сквозной прогон через API платформы** — форма манифеста, сайдкара банка и карта причин флагов сочинены платформой САМОСТОЯТЕЛЬНО и первыми настоящими данными движка не проверялись · **(4) дверь выдачи** — строго ПОСЛЕ (3) (⚠ слово владельца 30.08: дверь ВСЕГДА строит файл — отказ юзеру не отдаётся, неполная книга уходит с пометкой, т.е. дверь зовёт `tmctl build --partial`; отказ по умолчанию остаётся операторской ручкой CLI; D29.1(б) «fail-closed» читать как «никогда молча» — честность несут пометки) · **(5) проводка `--max-units`** — снятие гейта, а не стройка: механизм в движке стоит (D39.170), живое основание гейта — `PD-422` · **(6) разморозка фронта** — ПОСЛЕ (4): зеркало отстало на ШЕСТЬ миноров (`frontend/docs/api-contract/openapi.yaml` — `0.2.3` против канона `0.8.0`, и первый из них — ЛОМАЮЩИЙ 0.3.0), 16 операций против 20; отставание ратифицировано D39.142 п.5 на время фриза и две ручки разъехались, размораживать раньше значит перегенерировать типы дважды. ⚠ **ДВА ЗАГЕЙЧЕННЫХ ТРИГГЕРА НАЖАТЫ И НЕ ОТРАБОТАНЫ** (`13-tech-debt-anchors.md` §Б-108): `go.work` — у платформы свой модуль есть, файла в корне НЕТ; вендор-сверка маппинга эффорта `deepseek-v4-pro` — сработала 13.08, носители противоречат, закрывается ТОЛЬКО вендор-докой. ⚠ **ЧТО В ПРЕЖНЕЙ ОЧЕРЕДИ БЫЛО НЕВЕРНО, проверено деревом 30.08:** пункт про `sqlc` отдельной сессией ИСПОЛНЕН (D39.172, `63fcee5`); «работа полигона в дереве НЕЗАКОММИЧЕНА, читать `git status -- eval/`» ОПРОВЕРГНУТО — она лежит коммитом `28c2d0f` на ветке `polygon`, запушена, в `main` не влита, а названная команда возвращает пустоту и уводит в вывод «работы нет»; «развязка git с origin» ОПРОВЕРГНУТА — `main` и `origin/main` на одном коммите. > - ⚠ **ОБЯЗАТЕЛЬСТВА ЛЕНДИНГА P9 ИСПОЛНЕНЫ — но НЕ лендингом** (снято оркестратором №20 30.08, сверено статусами регистра): `PD-400`.2 → `accepted-risk`, `PD-401` и `PD-166` → `fixed` перевёл аудит доков **D39.167** (`373ccc7`, 28.08), чья находка №1 и говорит: «регистр расходился с МОИМИ ЖЕ актами лендинга — четыре строки». Прежние два буллета висели здесь двое суток после исполнения, и проверочная команда одного из них сама возвращала `fixed`. **Урок в норму приёмки: акт лендинга, объявивший закрытие строки, обязан быть сверен статусом В ТОТ ЖЕ заход.** > - ⚠ **ЛЕНТА КОНТРАКТА за 27–28.08, свёрнуто аудитом 28.08 (D39.167):** **0.5.0** — D39.161 (снос отменённой пер-термной модели подписи + дверь правок банка) · **0.6.0** — D39.162/D39.163 (сквозная полоса прогресса; `Progress.stage` ВТОРЫМ и последним исключением границы) · **0.7.0** — D39.166 (покупка пере-прохода членом `RunRequest.re_pass`). Прожитые дампы приёмки P9 и P10 вынесены в `archive/PROGRESS-2026-08-backend.md` и в тела нот; здесь остаётся только лента версий. > - ⚠ **27.08: ВЫДАН ПРОМТ КОНТРАКТНОГО МИНОРА** (`CONTRACT_MINOR_SESSION_PROMPT.md`, пункт 2б очереди D39.156). **ВОПРОС ЗАКРЫТ СЛОВОМ ВЛАДЕЛЬЦА 27.08 (D39.160):** сквозная полоса прогресса (строка **200**) из минора ИСКЛЮЧЕНА и едет с паком (2в). Причина механическая: гейт платформы требует, чтобы объявленная деплоем версия равнялась канону, поэтому канон и деплой обязаны совпасть В МОМЕНТ ЛЕНДИНГА; снос двери этому не мешает (платформа свою половину снесла 22.08), а смена семантики прогресса мешает — сервер её не считает и не будет до пака (2в), и `0.5.0` у старого прогресса был бы ровно той ложью, против которой гейт стоит. Прежнее «одним куском» покупалось тем, что иначе фронт перегенерируется дважды, — но фронт ЗАМОРОЖЕН и перегенерируется один раз независимо от числа миноров. Промт ВЫДАН: прошёл оба рубежа роли, девять находок опровергателя применены. diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 5016959e..2b41e7fd 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.180; +# Реестр D-нот — карта актуальности v2 (D1–D39.181; > ⚠ **СЛАБОЕ МЕСТО, КОТОРОЕ БЫЛО ЗДЕСЬ (вписано 22.08, ЗАКРЫТО 24.08 — D39.157 п.6).** Колонка ТЕЛА > у нот D39.107…D39.123 говорила «жив», хотя тела уехали в слайс подрезкой D39.139; семнадцать строк @@ -242,3 +242,4 @@ | D39.178 | 30.08 (записано 31.08) | **Слово владельца о двери выдачи**: дверь `createExport` ВСЕГДА строит файл, отказ пользователю не отдаётся — неполная книга уходит с пометкой (`tmctl build --partial`), отказ exit 16 остаётся операторской ручкой CLI; D29.1(б) fail-closed читать как «никогда МОЛЧА»; дверь сверяет `BuildReport` — предупреждение оператору, не читателю. Ратификация жила в CURRENT-STATE без грепаемого носителя — пробел закрыт аудитом доков. | жив | ЖИВОЕ: лестница D25.1 (ступень копии без пометки) не решена, ждёт владельца перед дверью | контракт продукт выдача | | D39.179 | 31.08 | **Слово владельца о цене холодного прогона**: ≈$0.60, потолок $0.80, десять глав ПОЛНОЙ цепью включая редакторскую волну; прежняя санкция «≈$0.05» снята как протухшая (пере-пин DeepSeek, множитель 4.47). Промт `BACKEND_COLDRUN_V16_SESSION_PROMPT.md` выдан — 53 находки двух рубежей применены. Норма формы указателей заострена: стабильна не ЗОНА, а ЧИСТЫЙ ФАЙЛ. `arch-3` закрыт: 51 якорь пере-проверен, 34 уехали, сверяемых по содержимому 89→127 | жив | ЖИВОЕ: прогон не начат; строки 16·154·157·160·198·202·216 гейчены им | деньги прогон доки якоря | | D39.180 | 31.08 | **Пак платформы P12 «долги под ногами» ПРИНЯТ И ЗАЛЕНДЖЕН** вместе с контрактным минором **0.9.0**. Приёмка — 5 линз, 6 major / 16 minor / 0 блокеров, 8 дофиксов исполнены. Обязательство D39.158 (снятие обхода `--verify-bank`) закрыто целиком, живой пробой на двух ярусах. Регистр: открытых 97 против 107, major 2 против 7. Три урока: тихо-зелёное с заголовком против тела (D39.171); **граница контракта судит ПРОЗУ, а не только поля** — непрозрачность поля не спасает; строка, закрытая несуществующим пином | жив | ЖИВОЕ: PD-424 сужена до терминальной ручки · новые PD-433/434/435 · строка бэклога 244 | платформа контракт приёмка | +| D39.181 | 31.08 | **Закон раскрытия движка РАТИФИЦИРОВАН** (слово владельца): правило «факт класса X → потребителю Y по каналу Z» + четыре обязанности как норма зоны `backend/`; **поля леджера доставки в кадре `finished`** (признак объёмного стопа едет ЧИСЛОМ) и **`config_drift_basis` в `status --json`** — оба класса «новое поле контракта шва». Генезис — вопрос владельца «не хаки ли это»: десять из тринадцати правок оказались одной формой «движок знает и не говорит». ⚠ Честная цена: закон загейчен на 40% | жив | ЖИВОЕ: применение к десяти экземплярам — фаза 2 пака; строка 246 (расхождение копий полосы отказов) | движок раскрытие шов контракт | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 4e959fbf..5e51522d 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.180 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.181 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+). @@ -1703,3 +1703,29 @@ head-1 это семнадцать бюджетируемых операций, ### 5. Строка бэклога 244 — свойство гейта, найденное приёмкой Гейт якорей на пре-коммите судит ЗАКОММИЧЕННЫЙ док против РАБОЧЕГО кода, поэтому ломается всякий раз, когда зона правит код и свой реестр одним незакоммиченным деревом. Замерено: хук оркестратора напечатал 13 битых якорей, `--lint` зоны на том же дереве — 0; права зона. ⚠ Обратная сторона опаснее и НЕ замерена: по-настоящему битый якорь тем же механизмом может оказаться зелёным. + +## D39.181 — ЗАКОН РАСКРЫТИЯ движка РАТИФИЦИРОВАН словом владельца 31.08: три пункта, и два из них — новые поля контракта шва. ✅ + +**Генезис — вопрос владельца, а не находка сессии.** Ему был показан список из одиннадцати правок пака «деньги и честность»; он спросил, не хаки ли это. Пере-счёт по его мерке дал **десять пунктов из тринадцати ОДНОЙ ФОРМЫ**: движок ЗНАЕТ факт и не сообщает его, либо сообщает ложь, либо сообщает не в тот канал. Его слово: «давай дадим сессии это спроектировать». Пак пере-собран двухфазным — дизайн, стоп-точка, применение. + +### 1. Что ратифицировано + +1. **Закон раскрытия — норма зоны `backend/`.** «Факт класса X, вычисленный движком, обязан достичь потребителя Y по каналу Z» + четыре обязанности: не молчать · не называть причину, которую не сравнивал · фигура едет с БАЗИСОМ · канал назначает ПОТРЕБИТЕЛЬ. Плюс «необратимое отчитывается раньше последующей ошибки». Дизайн — `backend/docs/DISCLOSURE_LAW_DESIGN.md`. +2. **Поля леджера доставки в кадре `finished`** (A5): признак остановки по объёму обязан ехать **ЧИСЛОМ**. Новый код выхода запрещён (замороженный словарь), новое значение `Finished.Outcome` тоже — но НЕ по биективности пары код↔кадр (её нет, у `OutcomeRefused` двойника не существует), а потому что значение только в потоке заставило бы **два канала назвать РАЗНЫЙ исход одного прогона**. +3. **`config_drift_basis` в `status --json`** (A7/A12): сегодня двузначное поле несёт трёхзначный факт, и тихое `false` пропагируется в `build` (`staleUnits` начинается с выхода по `ConfigDrift`), заставляя печатать `stale: 0` вместо `UNKNOWN`. Поле без базиса портит поле, у которого базис есть. + +### 2. Честная цена, названная сессией ДО решения + +**Закон загейчен на 40%.** Шесть строк корпуса из десяти он маршрутизирует в ПРОЗАИЧЕСКИЕ каналы (`report` · строка усечения · текст гарда · строка сборки), за которыми не стоит ни один из четырёх спроектированных гейтов. Вписано в §7 дизайна вслух. ⚠ Сессия также разделила своё и заимствованное: §2.3 — обобщение существующего `RebillBasis`, а §2.4 и §2.5 **родословной в коде НЕ имеют** и судятся как новые нормы (оговорка внесена после её адверсариального прохода: «первая редакция себе польстила»). + +### 3. Что пак принёс СВЕРХ заказа и что опроверг + +**A15 — на самом шве, маршрутизировано строкой 246:** две копии полосы отказов 10–19 обещают РАЗНОЕ. Движок снял обещание «ничего не записано» (`exit 15` легитимно отвечает файлами на диске), платформа его держит — а по `PD-196` интейк действует по полосе РАЗРУШИТЕЛЬНО. Предсказано п.6 закона шва 17. ⚠ Денежная половина цела в обеих копиях. + +**Гард опровергнут его же хранилищем, за $0:** два edit-снапшота прогона различаются РОВНО одним ключом `memory_version` при побайтно равных `prompt_sha256`, модели и температуре — а гард печатает «the config/prompts changed». + +**Три факта ОРКЕСТРАТОРА опровергнуты замером** (все три он вписал в промт как приоры): `book_files` — не дефект, «карта мест» ратифицирована обеими зонами и платформа поле не декодирует · ось строки бэклога **194** — не сдвиг снапшота, а **БАЙТЫ БАТЧА** (черновой снапшот не двигался ни разу, контур пере-купился) · потребителя `config_drift` в полигоне НЕТ (ноль проверен положительным контролем). + +### 4. Урок дня, стоящий отдельной строки + +Трижды за сутки — у двух сессий и у оркестратора — сработал один класс: **отсутствие в СВОЕЙ области видимости принято за отсутствие вообще** (`find` без `-L`; незакоммиченное в соседнем worktree; греп, не исключивший собственный файл). Норма, выведенная из этого: **отрицательный результат предъявляется вместе с ПОЛОЖИТЕЛЬНЫМ КОНТРОЛЕМ** — показать, что инструмент в этой области вообще способен что-то найти.