diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 52a10639..fcd8a73b 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-08, голова D39.227 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 112 (major 3), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-08, голова D39.228 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 112 (major 3), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза @@ -13,6 +13,7 @@ > `3d90943`). Строки 285 · 305 · 325 закрыты. ⚠ **Синхронный разрез приёма принят ПОСТРОЕННЫМ, НО НЕ ГОТОВЫМ** — > сработало правило остановки (9 major из 11 в одном механизме), десять пунктов несёт строка **332**; ложный > инвариант бюджета заландён осознанно (окно лжи 8 секунд при дефолте в 16 минутах, ломается идемпотентность). +> **(7) ДВИЖКОВЫЙ ПАК «ДВИЖОК УЖЕ ЗНАЕТ» — ✅ ПРИНЯТ С ДВУМЯ ДОФИКСАМИ И ЗАЛЕНДЕН 08.09, акт `D39.228`** (`2b6f1f4`, 21 путь). Закрыты строки 253 · 355 · 357 · 358 · 312. Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля. Третья смена поведения заказана приёмкой — лог и экран перестали спорить о полноте банка. Не взятое получило носители: **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте). Батарея 19 ok · 0 FAIL · `EXIT=0`, каталог мутаций 259 → 276, тесты +17 / −0 — все числа пере-сняты оркестратором. > **(6) ВЫДАНЫ ДВА ПАКА 08.09, акт `D39.227`, оба $0.** Движковый «ДВИЖОК УЖЕ ЗНАЕТ» (`BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md`: строки 253 · 357 · 358 · 355, попутно 312) и платформенный «РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ» (`PLATFORM_INTAKE_TRUTH_SESSION_PROMPT.md`: строка 332, семь пунктов из десяти). Оба прошли опровергателя и разбор Fable 5. ⛔ **Заведена строка 360 — самый дорогой движковый класс (23–34 % цены редакторской руки), носителя у него не было;** её ДЕНЕЖНАЯ половина ждёт слова владельца (платит ли пользователь за вызов, оборванный нами) и сцеплена со строкой 331. До ответа пак по 360 не пишется. > **(4) ДИЗАЙН-ПАК 161 — ✅ НАПИСАН 07.09** (`docs/CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md`, `7f84c8d`), прошёл оба > рубежа. ⚠ **НЕ ВЫДАН: новый пак идёт НОВОЙ сессии, обе ночные отработали** — запуск за владельцем. diff --git a/docs/README.md b/docs/README.md index 32dbc68a..710bf3d2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,7 +23,7 @@ | Роль | Активный промт | Статус | |---|---|---| | Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE | - | **Бэкенд · ДВИЖОК УЖЕ ЗНАЕТ** | [BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md](BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md) | ⚠ **ВЫДАН 08.09, $0 и снапшот-нейтрально.** Движок вычисляет правду и пишет её в лог, а подписывающий и оператор смотрят в другое место: полнота банка не доезжает до листа подписи (строки **253**, **357**) · итог трат не включает классификатор и разложение относит его в «купил ничего» (**358**, **355**) · попутно **312** Д-3. ⚠ Пак прошёл оба рубежа и разбор Fable 5; три блокера и шесть существенных находок закрыты ДО выдачи | + | Бэкенд · ДВИЖОК УЖЕ ЗНАЕТ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДВУМЯ ДОФИКСАМИ 08.09** — акт **D39.228** (`2b6f1f4`, 21 путь); промт в `archive/prompts/` с баннером-исходом. Закрыты строки 253 · 355 · 357 · 358 · 312. Живое из не взятого — **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте); **360** ждёт слова владельца по денежной половине | | Бэкенд · КОНСИСТЕНТНОСТЬ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.222**; промт в `archive/prompts/` с баннером исхода. Строки 267 и 318 закрыты, у 320 исполнена половина (а). Живой остаток зоны ЗАКРЫТ актом **D39.226** (строки 333–338); живое — 353–359 | | Бэкенд · ПРАВДА ОПЕРАТОРУ И ДЕНЬГИ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 08.09** — акт **D39.226**, живой платный прогон; промт в `archive/prompts/` с баннером-исходом | | Бэкенд · ГЕЙТ ВМЕСТО ПРОЗЫ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.225**; промт в `archive/prompts/` с баннером-исходом | diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index f92ab52e..94ba3539 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.227; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.228; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -286,3 +286,4 @@ | D39.225 | 07.09 | **АКТ: движковый пак «гейт вместо прозы» ПРИНЯТ С ДОФИКСОМ** (`7ffec51` + `4188ba5`). Пять швов, державшихся прозой, держат гейты; закрыты строки 344/345/348/349, половинами 224/313/346/350, остатки — 351/352. Числа пере-сняты приёмкой: батарея 19/0/4, мутационный гейт 14 записей и 0 unexpected со свипом якорей `0 of 225`. СМЕН ПОВЕДЕНИЯ ДВЕ: секция предложений в сайдкаре стопа (аддитивно) и ДЕНЕЖНАЯ — прогон по арму теперь покупает банковый контур. Класс A онтологии банка заведён сознательно: у секции ноль читателей, носитель — платформенная половина 253 | жив | ЖИВОЕ: платформенная половина 224/253 (читатель секции) · вопрос `pending_decisions` в контракте 14 · строки 351/352 | движок гейты банк деньги приёмка | | D39.226 | 08.09 | **АКТ: движковый пак «правда оператору и деньги» ПРИНЯТ С ДОФИКСОМ** (`e48bca2`). Закрыты строки 333–338; остатки — 353(+)/354/355/356/357/358. Числа приёмки: батарея 19/0/4, мутации 48 записей и 0 unexpected, свип `0 of 259`, каталог 232→259 и 21→48 в гейте, тесты +18. ЖИВОЙ ПЛАТНЫЙ ПРОГОН (санкция владельца, потолок машинным гейтом): `committed=$1.259217` против сметы `$0.350075` — **`tmctl manifest` есть нижняя граница, не прогноз**; 64.6 % «купило ничего»; оплаченный `2xx` с оборванным телом — 32 % бюджета. Строка 335 опровергнута своим же замером: не «прямые деньги», а 4.1 % кандидатов, и фаза платится раз на книгу. Два блокера закрыты корнем, третий круг нашёл мёртвый страж | жив | ЖИВОЕ: строки 354–358 и остаток 353; три ошибки ЗАКАЗЧИКА названы в п.8 | движок деньги банк оператор приёмка | | D39.227 | 08.09 | **ТРИАЖ И ВЫДАЧА ДВУХ ПАКОВ** («движок уже знает» + «разрез приёма и правда о себе», оба $0). Заведена строка **360** — таймаут чтения маскируется под нечитаемое тело, ретраится и биллится по оценке (23–34 % цены редакторской руки), носителя у класса не было; строка **354** называла механизм свойством провайдера и исправлена. Пред-решение оркестратора «новый корневой `code`» ОТОЗВАНО: корневой закрыт, открыт `cause.code`. Фантом-гард спущен до номера ПУНКТА. Вопрос владельцу: платит ли пользователь за вызов, оборванный нами | триаж · паки · деньги · контракт | +| D39.228 | 08.09 | **АКТ: движковый пак «движок уже знает» ПРИНЯТ С ДВУМЯ ДОФИКСАМИ** (`2b6f1f4`, 21 путь). Полнота банка доезжает до подписи и до stdout, классификатор вошёл в итог трат, банк-роли разведены в разложении. Закрыты строки 253 · 355 · 357 · 358 · 312. **Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля** (прецедент `price`/`structure`; бамп перекупает каждую книгу). Третья смена поведения заказана приёмкой: лог и экран перестали спорить о полноте. Открыты строки 362 и 363 | приёмка · банк · деньги · манифест | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 1d0d023d..12b2c639 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.227 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.228 (живой файл: карта · эрраты · живые тела · голова 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 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). @@ -31,7 +31,7 @@ > ⚠ **Эррата 28.08-к (D39.165 §3 + решение оркестратора о глава-полосе) — ДВЕ ошибки, обе найдены широким самопроходом платформенной сессии, обе доказаны исполнением.** **(1) Посылка «смета УЖЕ публикуется в `status --json`» верна только ПОСЛЕ свёртки.** `bank-apply` пишет только ФАЙЛЫ решений, а `status` считает ре-билл от СОХРАНЁННОГО глоссария (`backend/internal/pipeline/status.go:962`=`seed-FILE edit` ⚠ (адрес испр. 06.09: цитата УЕХАЛА, не исчезла; в теле `D39.165` она осталась по прежнему адресу — тело ноты не переписывается, D23.3)``, `projectStoredMemory` — его собственный комментарий: «A seed-FILE edit not yet re-run is NOT reflected here… that drift surfaces on the next translate's re-seed»). Свёртка происходит внутри СЛЕДУЮЩЕГО `translate`, поэтому сразу после правки движок отвечает `units=0`/`drift=false`. Следствие: продажа «затронуто N юнитов» и холд от сметы В ТЕКУЩЕМ ШВЕ НЕДОСТИЖИМЫ — для них нужен движковый глагол «свернуть банк и оценить ВНЕ translate», которого нет. **(2) Решение оркестратора «полоса пере-прохода — в ГЛАВАХ» ОТМЕНЯЕТСЯ: его посылка опровергнута.** Я рассудил, что $0-репин двигает полосу, потому что идёт через тот же `resumeFromChunkStatus`, — и не проверил анонс. Движок анонсирует юнит ОДИН РАЗ на жизнь книги (announce-once, `backend/internal/pipeline/events.go:49,143-162`=`announce-once keys`), пере-проход не ре-анонсирует ни репины, ни пере-переводы ⇒ `done` остался бы НУЛЁМ навсегда. Это ровно тот класс, от которого предостерегает памятка «не выводить из соседнего механизма, не проверив свой». ⚠ **Что при этом НЕ отменяется:** запрет класть ЮНИТЫ в поле, объявленное в главах, стоит — но объявленная в каноне «одна единица работы» запретом не является, потому что она НЕ молчаливая. > ⚠ **Эррата 29.08-а (D39.172, две строки, объявленные заведёнными) — ошибка ОРКЕСТРАТОРА №19.** Тело ноты дважды утверждает «Заведено строкой» / «строка заведена» — про `Touch`, выбрасывающий `RowsAffected`, и про пересборку `tmctl` в рецепте стенда. **На момент ратификации ни одной из этих строк не существовало:** последняя строка регистра платформы была `PD-430`, и проверка грепом по `Touch|RowsAffected|пересбор` давала только совпадения слов в чужих строках. Утверждение о будущем записано как о свершившемся — ровно тот класс, который эта же смена ловила у сессий трижды. **СНЯТА 29.08: строки заведены зоной — `PD-431` (`Touch`) и `PD-432` (пересборка `tmctl`), `PD-423` получил вторую точку. Проверено грепом по регистру.** Тело ноты не переписывается (D23.3). ⚠ Сюда же третий пункт того же абзаца: `PD-423` предписано ПЕРЕ-ПРОВЕРИТЬ (у сессии `sqlc` тест зелёный в трёх прогонах), и пометки в строке регистра тоже нет. > ⚠ **Эррата 30.08-б (D39.165 §2 и §3, две находки платформенной сессии P12).** (а) **Якорь протух:** §2 цитирует фразу канона о `chapters_done` по `openapi.yaml:1542-1545` — текст уехал на **`1554-1559`**, по прежним строкам сейчас `RejectReason`. Сама цитата верна дословно; нота не битая, битым стал только номер (класс строки бэклога 219). (б) **§3 назвал живое САМОПРОТИВОРЕЧИЕ канона и не дал ему носителя:** правка банка «takes effect on the NEXT run» (`openapi.yaml:504`) против «finished work is not bought twice» плюс подъём потолка только у ПРИОСТАНОВЛЕННОЙ книги (`:590`) — у дочитанной книги следующего прогона купить нечем, поэтому принятая правка умирает молча. Ни в едином бэклоге, ни в регистре платформы строки не было (проверено грепом по обеим фразам) — **заведена строка бэклога 241** 30.08. ⚠ Класс — «названо в теле ноты и не получило карриера»; норма приёмки требует строку ТЕМ ЖЕ лендингом, здесь она не легла два дня. -> ⚠ **Эррата 30.08-а (D39.176 п.5, `PD-421`) — ошибка ОРКЕСТРАТОРА №20, пойманная ВЛАДЕЛЬЦЕМ.** Пункт вынесен владельцу с формулировкой «открытая вкладка теряет сессию примерно через час» — **неверно, и ровно тем классом, от которого предостерегает записка передачи: вывод из соседнего числа вместо проверки.** Час — это ПЕРИОДИЧНОСТЬ `SweepSessions`, а срок жизни сессии другой: `SessionIdleTTL` = **14 суток**, `SessionMaxAge` = **30** (`platform/internal/config/config.go:338-339`=`defaultSessionIdle`), причём окно бездействия скользит на любом аутентифицированном запросе (`platform/internal/auth/middleware.go:66`=`a.Sessions.Touch(r.Context(), digest`; поток `Touch` не зовёт — грепом 0, и это не важно при окне в две недели). Реальное следствие `PD-421` — то, что и записано в её теле: сессия, протухшая по бездействию И подметённая, гасит поток с опозданием до часа, то есть после ДВУХ НЕДЕЛЬ без единого действия. **Вопрос СНЯТ с листа владельца как несущественный; правка в паке P12 не нужна, строка остаётся `info`.** Владелец вопросом «ты уверен или придумываешь?» поймал ошибку до того, как она стала заказом на работу. +> ⚠ **Эррата 30.08-а (D39.176 п.5, `PD-421`) — ошибка ОРКЕСТРАТОРА №20, пойманная ВЛАДЕЛЬЦЕМ.** Пункт вынесен владельцу с формулировкой «открытая вкладка теряет сессию примерно через час» — **неверно, и ровно тем классом, от которого предостерегает записка передачи: вывод из соседнего числа вместо проверки.** Час — это ПЕРИОДИЧНОСТЬ `SweepSessions`, а срок жизни сессии другой: `SessionIdleTTL` = **14 суток**, `SessionMaxAge` = **30** (`platform/internal/config/config.go:344-345`=`defaultSessionIdle`), причём окно бездействия скользит на любом аутентифицированном запросе (`platform/internal/auth/middleware.go:66`=`a.Sessions.Touch(r.Context(), digest`; поток `Touch` не зовёт — грепом 0, и это не важно при окне в две недели). Реальное следствие `PD-421` — то, что и записано в её теле: сессия, протухшая по бездействию И подметённая, гасит поток с опозданием до часа, то есть после ДВУХ НЕДЕЛЬ без единого действия. **Вопрос СНЯТ с листа владельца как несущественный; правка в паке P12 не нужна, строка остаётся `info`.** Владелец вопросом «ты уверен или придумываешь?» поймал ошибку до того, как она стала заказом на работу. > ⚠ **Эррата 29.08-б (D39.171 механизм cgroup + D39.172 число операторов) — ДВЕ ошибки ОРКЕСТРАТОРА №19.** > (а) **Механизм, который я объявил причиной неприменения `MemoryMax`, НЕВЕРЕН.** Я вывел «вызывающий > процесс обязан жить внутри `user@.service`» из пробы `systemd-run --user --scope` без @@ -1654,7 +1654,7 @@ head-1 это семнадцать бюджетируемых операций, 3. **После пополнения баланса прогон возобновляется ЯВНЫМ действием пользователя, а не сам.** Пункт «авто-резюм `paused`» висел в листе владельца с 08.08 в форме, умершей вместе с оконной моделью; зона записала вывод сама (`PLATFORM_DIRECTION.md`), владелец его подтвердил — **пункт снят с листа**, вывод зоны становится ратифицированным. 4. **Фразы, которые видит пользователь (В-3 · К-6 · Приложение А), ДЕЛЕГИРОВАНЫ проекту** — слово: «оставляю проектирование фраз на вас, главное чтоб это было интернациональным». ⚠ Это не «свобода формулировки», а **инженерное требование**: фраза не может быть литералом ни в Go платформы, ни в TSX фронта — только данными, ключуемыми машинным кодом причины и локалью (механизм языков интерфейса уже построен, `ПТ-36`/`В-9`). Следствия: словарь фраз — носитель ДАННЫХ, один на продукт; `PD-246` (граница `attention`/`glance` — сегодня ДОГАДКА платформы по 15 причинам движка) закрывается вместе с ним, а не отдельно; строка **204** (движок не публикует причины флагов данными) становится его гейтом. Проектирование — оркестратор + зоны, подпись владельца больше не ожидается. 5. **Осталось на владельце из платформенного листа — ОДИН пункт, и он переформулирован** (`PD-421`): держит ли ОТКРЫТЫЙ поток событий сессию живой. Владелец ответа не дал, попросив раскрыть предмет; вопрос переформулирован в терминах продукта и вынесен заново. -6. ⚠ **Ключи провайдеров — развилка снята фактом, а не решением:** движок берёт их ДВУМЯ путями (`--keys-file` деплоя ПОБЕЖДАЕТ конвенционный `.env` рядом с `book.yaml` — `backend/cmd/tmctl/invocation.go:145`=`keys-file`), формат обоих — `KEY=VALUE`. Владелец 30.08 сообщил, что чинил ключи движка; **из этого следует, что холодный прогон движка (очередь №20 п.2) разблокирован, а живой прогон через API (п.3) — нет**: платформа читает СВОЙ путь (`TM_PLATFORM_ENGINE_KEYS_PATH`, `platform/internal/config/config.go:544`=`ENGINE_KEYS_PATH`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал). +6. ⚠ **Ключи провайдеров — развилка снята фактом, а не решением:** движок берёт их ДВУМЯ путями (`--keys-file` деплоя ПОБЕЖДАЕТ конвенционный `.env` рядом с `book.yaml` — `backend/cmd/tmctl/invocation.go:145`=`keys-file`), формат обоих — `KEY=VALUE`. Владелец 30.08 сообщил, что чинил ключи движка; **из этого следует, что холодный прогон движка (очередь №20 п.2) разблокирован, а живой прогон через API (п.3) — нет**: платформа читает СВОЙ путь (`TM_PLATFORM_ENGINE_KEYS_PATH`, `platform/internal/config/config.go:550`=`ENGINE_KEYS_PATH`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал). ## D39.177 — ПЕРЕДАЧА РОЛИ ОРКЕСТРАТОРА №20 → №21: что смена приняла и построила, четыре моих ошибки (две поймал владелец) и очередь, сверенная деревом (31.08). ✅ @@ -2684,7 +2684,7 @@ $2.00» не мерил никто), **а утверждение о ПРОШЛО **3. ⭐⭐ ГЛАВНОЕ ЗА СМЕНУ: ПИН БЫЛ, ЗЕЛЁНЫЙ И НАСТОЯЩИЙ, А УТВЕРЖДЕНИЕ ВСЁ РАВНО УЕХАЛО.** Первая редакция правки цитировала `httpapi.TestABooksCutProvenanceIsTheEnginesOwnWordOrAnExplicitNull` и иллюстрировала `null` книгой в статусе `not_started` — «fully uploaded, no manifest». Но `BookStatus` В ТОМ ЖЕ ДОКУМЕНТЕ говорит «`not_started` **cut**, never run». Пин при этом верен: он доказывает, что пустая колонка едет на провод как явный `null`. ⇒ **доказано ОТОБРАЖЕНИЕ, а сказано про ЖИЗНЬ; фикстура прочитана как продуктовое состояние.** ⚠ **Класс ловится НЕ тем вопросом, что предыдущие:** «чем это подпёрто?» здесь даёт честный ответ «пином», и проверяющий проходит мимо. **Цитируя пин в утверждении о ЗНАЧЕНИИ, спрашивать надо не «зелен ли он», а «ТО ЛИ ОН МЕРИТ».** Формулировка зоны, ратифицирую. -**4. Ответ пином, и ложной оказалась ИЛЛЮСТРАЦИЯ, а не словарь.** `FinishParse` переводит книгу `parsing → not_started` **и в той же транзакции взводит долг на дерево** (`platform/internal/pgstore/books.go:343`=`FinishParse records a parsed book`): провенанс приходит ПОЗЖЕ, когда материализатор долг оплатит, и окно «разрезана, провенанса нет» — устройство, а не гонка. Пин уровня ХРАНИЛИЩА заведён под этот вопрос: `pgstore.TestAParsedBookIsNotStartedBeforeItHasAnyProvenance` — прогоняет интейк и получает пару «`not_started` + пустой `structure`» от самой базы. ⇒ `not_started` говорит, что разрезан ИСХОДНИК, а не что прочитан манифест; обе строки канона верны. ⚠ К `null` ведут ещё две дороги, ни одна не про книгу в полёте: манифест СТАРШЕ поля и книга, заведённая из файла, уже лежащего на диске (`books.go:88`=`AddBook registers a book`). Канон держит два предмета раздельно: пин хранилища — про жизнь, пин провода — про отображение. +**4. Ответ пином, и ложной оказалась ИЛЛЮСТРАЦИЯ, а не словарь.** `FinishParse` переводит книгу `parsing → not_started` **и в той же транзакции взводит долг на дерево** (`platform/internal/pgstore/books.go:349`=`FinishParse records a parsed book`): провенанс приходит ПОЗЖЕ, когда материализатор долг оплатит, и окно «разрезана, провенанса нет» — устройство, а не гонка. Пин уровня ХРАНИЛИЩА заведён под этот вопрос: `pgstore.TestAParsedBookIsNotStartedBeforeItHasAnyProvenance` — прогоняет интейк и получает пару «`not_started` + пустой `structure`» от самой базы. ⇒ `not_started` говорит, что разрезан ИСХОДНИК, а не что прочитан манифест; обе строки канона верны. ⚠ К `null` ведут ещё две дороги, ни одна не про книгу в полёте: манифест СТАРШЕ поля и книга, заведённая из файла, уже лежащего на диске (`books.go:88`=`AddBook registers a book`). Канон держит два предмета раздельно: пин хранилища — про жизнь, пин провода — про отображение. **5. Базовая линия гейта алармов поднята 12 → 14, и это ЗАКОННО — проверено устройством, а не словом.** База есть ДЛИНА объявленного списка: гейт краснеет и на необъявленный новый ряд («add its id here in the same change and say why»), и на объявление, пережившее свою причину. ⇒ поднять её молча нельзя; зона назвала оба ряда с доводом там, где гейт этого требует. **Это исполнение инструкции гейта, а не его обезвреживание** — различение, без которого `D39.121` читается как запрет любой правки базовой линии. @@ -3158,3 +3158,23 @@ bought NOTHING». ⇒ **`tmctl manifest` есть НИЖНЯЯ граница, **7. Что я назвала неверно и исправила в ратифицированных носителях.** Строка **358** несла числа `$0.007280`/`$0.005460` как «замер живого прогона 08.09» — они АВГУСТОВСКИЕ, из соседнего архивного файла. Правда по строкам леджера: терминологическая фаза `$0.013608` = классификатор `$0.009013` + рендер-батчи `$0.002775` и `$0.001820`, в итог волны входит только `$0.004595`. Строка **332** подавала незаполненный `Detail` дефектом — канон запрещает показывать `title`/`detail` пользователю дословно, и `Detail` не заполняется ПРАВИЛЬНО. Обе исправлены с пометкой. **8. Границы вердикта — честно.** Батарей не гонял никто из троих проверяющих: опровергатель движкового пака прогнал `go test ./... -count=1` (19 `ok` · 0 `FAIL` · 4 без тестов), платформенную не гонял никто (нет DSN и движкового бинаря на хосте) — вход платформенной зоны сессия снимает сама. Что два вызова прогона 08.09 были именно таймаутами — ВЫВЕДЕНО по совпадению подписи с замером полигона, не измерено: сырого леджера того прогона в дереве нет (`.db` новее 07.09 — 0 при 163). Механизм 360 доказан кодом и телом замера exp-23, исполнением не воспроизводился. + +## D39.228 — АКТ: движковый пак «ДВИЖОК УЖЕ ЗНАЕТ» ПРИНЯТ С ДВУМЯ ДОФИКСАМИ; аддитивное поле манифеста ключ НЕ двигает; третья смена поведения заказана приёмкой (08.09, оркестратор №23) ✅ + +**1. Что заландено.** `2b6f1f4`, 21 путь, `backend/` + отчёт зоны в `docs/PROGRESS.md`. Полнота банка доезжает до ОБОИХ читателей — машинный сайдкар (секция `consolidation` + `never_asked`) и stdout-экран подписи; `ClassifyCostUSD` вошёл в итог волны; банк-роли разведены в разложении трат через роль на входе (`store/ledger.go`), имя стадии НЕ тронуто. Закрыты строки **253** · **355** · **357** · **358**, взята **312** Д-3. + +**2. Числа пере-сняты МНОЮ на финальном дереве, не приняты со слов.** Батарея `go test ./... -count=1` — 19 `ok` · 0 FAIL · 4 «no test files» · `EXIT=0`. Каталог мутаций **259 → 276**, новых 17, удалённых **0**, все 17 в батарейном подмножестве (48 → 65). Тесты ИМЕНАМИ через `comm` — **+17 / −0**. Голден операторских сообщений — **+2 / −1**, прочитан глазами. `gofmt -l` пуст. Голденов снапшота и хешей в диффе нет ⇒ снапшот-нейтрально, пак $0. + +**3. ⛔ РАТИФИЦИРОВАНО: аддитивное поле манифеста ключ НЕ двигает, но обязано быть ОТЛИЧИМО от своего нуля.** Вопрос поставила зона и решать сама отказалась — верно. Прецедент лежал в самом файле (`internal/pipeline/manifest.go`, над `readModelPrice`): `price` и `structure` добавлены аддитивно, версия «deliberately did not move», потому что бамп выбрасывает каждый сохранённый сайдкар и ПЕРЕКУПАЕТ каждую книгу. Там же названа цена аддитивности: «A CURRENT SIDECAR CAN STILL PREDATE THESE FIELDS, and that is a THIRD state, not a shade of the other two» — и этот класс уже стоил дефекта на `price`. ⇒ форма — указатель (`TOCUnreadable *int`), «сайдкар старше поля» отличимо от «поле есть и оно нулевое», пин `TestASidecarOlderThanTheFieldCannotAnswer` держит три состояния. **Правило общее для манифеста, не для одного поля.** + +**4. ТРЕТЬЯ смена поведения заказана ПРИЁМКОЙ, и это мой заказ, а не решение зоны.** §4.4 промта объявлял две. Зона нашла и НЕ стала чинить без слова: движок печатал про ОДИН прогон два противоположных вердикта — лог «PARTIALLY consolidated» при срезе ТОЛЬКО классификатора, экран «WHOLE». Отгрузка пары, спорящей сама с собой, — новое ложное операторское сообщение, то есть ровно класс, против которого пак построен. Заказано: два предупреждения на два бюджета, классификаторское ПРЯМО отрицает, что делает банк неполным. Голден правлен руками под ратифицированную смену (`D39.183`), объявлено отдельным пунктом отчёта. + +**5. Три находки, которые зона нашла в СВОЕЙ работе и назвала прямо** (сильнее закрытых пунктов): граница подписи не была покрыта вовсе — сквозные тесты читали артефакт других границ, и порча «не публиковать секцию именно там» шла зелёной по всей батарее · собственный отчёт зоны утверждал «итог волны равен сырому леджеру», замер двух прогонов дал `$0.000000` против `$0.012740` на резюме, инвариант переформулирован в «свежие траты ЭТОГО прогона» · зона сама написала ложный экран «WHOLE — every render batch was bought» про пас, не отправивший ни батча. + +**6. Пин, который стоит вынести как образец.** `TestTheLogAndTheReadOutAgreeAboutWhatIsPartial`: каждая из трёх фикстур сначала утверждает СВОЮ ПОСЫЛКУ («premise broken», если срез не случился) ⇒ вырожденной она стать не может МОЛЧА; третья заведена явно затем, чтобы первые две не удовлетворялись логом, печатающим оба сообщения всегда. Это сильнее нормы «пин на условное сообщение обязан иметь фикстуру, где оно ОБЯЗАНО прозвучать» — норма требует двух половин, пин добавил защиту самой фикстуры. + +**7. Что НЕ взято и получило носители.** Строка **362** — ремонты одного чанка покупают непересекающиеся спаны и вытесняют друг друга в `superseded` (77 % денег чанка по замеру ревьюера зоны; ⚠ оркестратором не пере-мерено, механизм проверен по коду); нынешнее поведение запинено КАК НЕПОДВИНУТОЕ, а не как верное. Строка **363** — полный текстовый сайдкар молчит о неполноте, хотя баннер зовёт в него ровно при переполнении капа stdout. Строка **360** (таймаут чтения) объявлена исключением поимённо и ждёт слова владельца по денежной половине. + +**8. Класс A заведён сознательно и объявлен; форма клейма о нуле уточнена.** У секции `consolidation` читателей на платформе нет. ⚠ Два честных прибора дали РАЗНОЕ: по Go-именам — 0 хитов при 183 `.go`, по JSON-именам — 2 при 200; оба хита открыты и оказались английской прозой в комментариях. ⇒ **ни один СЧЁТ на вопрос «есть ли читатель» не отвечает — отвечает только чтение хитов**, и заявляющий ноль обязан назвать прибор. Подтверждено платформенной стороной независимо: строгий декодер в зоне ровно один (`internal/httpapi/bank.go`) и на ДРУГОМ пути — тело запроса от клиента, где строгость требует канон; движковый артефакт разбирается простым `json.Unmarshal`, `tm-bank-v1` не бампнут. + +**9. Границы вердикта — честно.** Полный каталог мутаций я НЕ гоняла: 65 записей и «0 выживших» — числа зоны, пере-считан только состав каталога (276 записей, 65 батарейных, 0 удалённых). Собственных посадок приёмка не делала; вместо них прочитан текст нового пина и голдена. `-race` не гонялся. Живого платного прогона в паке не было и не требовалось. diff --git a/docs/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md b/docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md similarity index 97% rename from docs/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md rename to docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md index 8b73b18a..abf941bb 100644 --- a/docs/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md +++ b/docs/archive/prompts/BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md @@ -1,3 +1,10 @@ +> ⚠ **ОТРАБОТАН И ПРИНЯТ С ДВУМЯ ДОФИКСАМИ 08.09 — акт `D39.228`, лендинг `2b6f1f4` (21 путь).** +> Инструкции ниже НЕ исполняются: пак закрыт. Исход: закрыты строки 253 · 355 · 357 · 358, взята 312 Д-3; +> приёмкой заказана ТРЕТЬЯ смена поведения (лог и экран перестали спорить о полноте банка); ратифицировано, +> что аддитивное поле манифеста ключ не двигает, но обязано быть отличимо от своего нуля. Не взятое получило +> носители — строки **362** (ремонт против ремонта) и **363** (текстовый сайдкар молчит о неполноте); +> строка **360** объявлена исключением поимённо и ждёт слова владельца. + # Пак бэкенда: «ДВИЖОК УЖЕ ЗНАЕТ — ДОВЕЗИ ДО ЧИТАТЕЛЯ» ## 1. Какая проблема и что решит твой результат