Ratify the intake landing and retire its prompt: four rows leave the tracker, one narrows to the half that is still open, and three anchors follow the code that moved

This commit is contained in:
heaven 2026-09-08 15:04:44 +03:00
parent ddcbf0c03d
commit f1404f0296
8 changed files with 43 additions and 16 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -30,7 +30,7 @@
| **Бэкенд · СТРУКТУРА ГЛАВ (ДИЗАЙН)** | [CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md](CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md) | ⚠ **ПРОЕКТИРОВАНИЕ, НЕ СТРОЙКА** (`D39.136` п.3): дизайн окна большой пере-нарезки — чем адресуется глава и развязка чанкера (161) · карта осей сдвига · банк-окна на chapter-ID · контент-адресуемый resume `D15.2` · IR/адаптеры/индуктор · правило заголовка и не-CJK путь (303) · гранулярность EPUB (302) и выдача (283). Снимает временный отказ интейка книге из одной главы (`D39.221`). Пак 1 «форматы и честный словарь» ОТРАБОТАН и ПРИНЯТ 06.09 — акт **D39.210**, промт в `archive/prompts/`. ⚠ **ПАК 2 (лексиконы не-CJK, корпус, замер оракулом) — НЕ НАПИСАН и ждёт файлов владельца** |
| Бэкенд · отозванный | активного НЕТ | пак КАЧЕСТВО написан и ОТОЗВАН до выдачи 05.09 (`archive/prompts/…_WITHDRAWN.md`): предмет дешевле пака — точность чекера уже измерена, пере-снять её стоит одной команды. Следующий пак — СТРУКТУРА ГЛАВ (решение владельца 05.09 «любая книга любого формата»), пишется |
| Бэкенд · прежний | активного НЕТ | пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **291** (флаг вместо клина, `D39.204`) · **294** (форма «сколько добавить», `D39.203`) · **296** (точечная перегенерация по промаху глоссария, после 295) |
| **Платформа · РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ** | [PLATFORM_INTAKE_TRUTH_SESSION_PROMPT.md](PLATFORM_INTAKE_TRUTH_SESSION_PROMPT.md) | ⚠ **ВЫДАН 08.09, $0.** Забирает синхронный разрез приёма до готовности (строка **332**, семь пунктов из десяти — три названы исключениями) плюс правду зоны о себе: ограничитель параллелизма у СИНХРОННОГО входа (у очередного он есть) · граница бюджета хвоста выводится из кода · рантбук про молчание маршрута · протухшая шапка зонного журнала и три ряда регистра. ⚠ Прошёл оба рубежа и разбор Fable 5; пять блокеров закрыто ДО выдачи, в том числе развёрнутое наоборот пред-решение оркестратора по инструменту отказа |
| Платформа · РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 08.09** — акт **D39.229** (`ddcbf0c`, 26 путей, $0); промт в `archive/prompts/` с баннером-исходом. Синхронный вход разреза под потолком, граница хвоста выведена из кода, зонный журнал и регистр приведены к правде (открытых 112 → 109, major 3 → 1). Живое из не взятого — строка **364** (потолок разрезов не есть потолок процессов движка) |
| Платформа · ДЕНЬГИ И ПРАВДА | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ С ДОФИКСОМ 07.09** — акт **D39.221**, контрактный минор **0.13.0**; промт в `archive/prompts/` с баннером исхода. ⚠ **Синхронный разрез приёма остановлен правилом остановки и заландён построенным, но НЕ готовым** — десять пунктов несёт строка бэклога **332**, и она же заказ следующему паку зоны; ложный инвариант бюджета заландён осознанно (окно 8 с при дефолте в 16 минутах) |
| Платформа · ФОРМА ЗАКАЗА | активного НЕТ | пак ОТРАБОТАН, ПРИНЯТ С ДОФИКСОМ и ЗАЛЕНДЕН 06.09 — акт **D39.208**, код + канон **0.11.0**; промт уведён в `archive/prompts/ORDER_FORM_SESSION_PROMPT_2026-09-05.md` с баннером исхода. ⚠ **НЕ построено, хотя заказывалось:** денежный ползунок на проводе объявлен, а отправить его нечем, и оценки под ВЫБРАННЫЙ заказ нет; «упрощение резюма» не сделано — обе позиции живут строками бэклога, брать их как новый пак СЛЕДУЮЩЕЙ сессии, не читать промт как задание |
| Платформа · прежний | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **294** (зеркало словаря под минор потока) ⚠ (строка 293 — зона ОРКЕСТРАТОРА, не платформы: правило игнора общее для всех рабочих деревьев клона) |

View file

@ -1,4 +1,4 @@
# Реестр D-нот — карта актуальности v2 (D1D39.228; титул — носитель головы, бампать при каждом аппенде)
# Реестр D-нот — карта актуальности v2 (D1D39.229; титул — носитель головы, бампать при каждом аппенде)
> ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не
> место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы,
@ -287,3 +287,4 @@
| D39.226 | 08.09 | **АКТ: движковый пак «правда оператору и деньги» ПРИНЯТ С ДОФИКСОМ** (`e48bca2`). Закрыты строки 333338; остатки — 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 % кандидатов, и фаза платится раз на книгу. Два блокера закрыты корнем, третий круг нашёл мёртвый страж | жив | ЖИВОЕ: строки 354358 и остаток 353; три ошибки ЗАКАЗЧИКА названы в п.8 | движок деньги банк оператор приёмка |
| D39.227 | 08.09 | **ТРИАЖ И ВЫДАЧА ДВУХ ПАКОВ** («движок уже знает» + «разрез приёма и правда о себе», оба $0). Заведена строка **360** — таймаут чтения маскируется под нечитаемое тело, ретраится и биллится по оценке (2334 % цены редакторской руки), носителя у класса не было; строка **354** называла механизм свойством провайдера и исправлена. Пред-решение оркестратора «новый корневой `code`» ОТОЗВАНО: корневой закрыт, открыт `cause.code`. Фантом-гард спущен до номера ПУНКТА. Вопрос владельцу: платит ли пользователь за вызов, оборванный нами | триаж · паки · деньги · контракт |
| D39.228 | 08.09 | **АКТ: движковый пак «движок уже знает» ПРИНЯТ С ДВУМЯ ДОФИКСАМИ** (`2b6f1f4`, 21 путь). Полнота банка доезжает до подписи и до stdout, классификатор вошёл в итог трат, банк-роли разведены в разложении. Закрыты строки 253 · 355 · 357 · 358 · 312. **Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля** (прецедент `price`/`structure`; бамп перекупает каждую книгу). Третья смена поведения заказана приёмкой: лог и экран перестали спорить о полноте. Открыты строки 362 и 363 | приёмка · банк · деньги · манифест |
| D39.229 | 08.09 | **АКТ: платформенный пак «разрез приёма и правда о себе» ПРИНЯТ** (`ddcbf0c`, 26 путей, $0). Синхронный вход разреза получил потолок; граница хвоста выведена из кода; шапка журнала и три ряда регистра приведены к правде. ⭐ Потолок сам назвал, чего НЕ ограничивает — остаток строкой **364**. Адверсариальный проход: 8 находок, 6 — дефекты этого же пака на ЗЕЛЁНОЙ батарее; норма про НАПРАВЛЕНИЕ заландена `c3039be`. Девятая находка — вечное зависание, класс вне досягаемости батареи и мутации | приёмка · приём · параллелизм · самопроверка |

View file

@ -1,10 +1,11 @@
# Журнал решений оркестратора — контракт D1D39.228 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
# Журнал решений оркестратора — контракт D1D39.229 (живой файл: карта · эрраты · живые тела · голова 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+).
> ⚠ **Эррата 15.08 (D39.132):** D39.131 п.2(а) перечисляет полосу отказов «10 конфиг · 11 источник · 12 лок · 19 безымянный» — читать через D39.132 п.2(г): полоса ДОПОЛНЕНА **exit 13 = `schema_mismatch`** (~~обе зоны сошлись на числе независимо~~; ратифицирован направлением, ФИНАЛИЗИРОВАН приёмкой D39.134).
> ⚠ **Эррата 15.08-б (D39.134 п.2а, вписана по аудиту корпуса):** клейм «зоны сошлись на 13 НЕЗАВИСИМО» (строкой выше и в D39.132 п.2г) СНЯТ — платформа прочитала число из незакоммиченного дерева движка и сама это записала (`platform/internal/ingest/exit.go:63-64`); на силу ратификации не влияет.
> ⚠ **Эррата 15.08-в (D39.136 п.5):** форма контракт-ревью «фазный воркфлоу оркестратора» ОТМЕНЕНА словом владельца тем же днём — исполняет ОТДЕЛЬНАЯ СЕССИЯ со своим онбордингом (норма D39.120 п.2; оркестратор — автор части ратификаций 0.2.3, author≠reviewer); запущенная воркфлоу-фаза 1 остановлена, её результаты выброшены; промт — `docs/CONTRACT_REVIEW_SESSION_PROMPT.md`.
> ⚠ **Эррата 08.09-в (`D39.228` п.1) — АКТ ОБЪЯВИЛ ЗАКРЫТОЙ СТРОКУ, У КОТОРОЙ ЗАКРЫТА ПОЛОВИНА.** Пункт 1 писал «закрыты строки 253 · 355 · 357 · 358». Для 253 это неверно: её собственное тело называет лечением (б) «полнота консолидации в сайдкар **+ поле на `BankPage`**», и второй половины нет — у секции `consolidation` ноль читателей, класс A заведён сознательно. ⇒ строка СУЖЕНА до платформенной половины, не удалена; 355 · 357 · 358 · 312 закрыты и удалены. ⛔ **Класс `D39.167` п.1 в чистом виде, и поймала его та же норма, что его называет:** «каждое утверждение акта о ряде сверяется его СТАТУСОМ в тот же заход» — сверка сделана через час после акта, а не до, и это разрыв в МОЁМ порядке: ратификация и сверка носителей обязаны идти ОДНИМ движением, иначе акт живёт с переоценкой ровно столько, сколько я собираюсь до неё дойти.
> ⚠⚠ **Эррата 08.09-б (`D39.221`) — МОЙ РАТИФИКАЦИОННЫЙ КОММИТ ОСТАВИЛ ГЕЙТ ВЕРСИИ КОНТРАКТА КРАСНЫМ НА СУТКИ, И ЭТО ТОЧНАЯ ИНВЕРСИЯ ПОРЯДКА, КОТОРЫЙ САМ ЖЕ ПРОЕКТ РАТИФИЦИРОВАЛ.** `D39.208` п.1: код идёт первым с ЧЕСТНО КРАСНЫМ гейтом версии, канон гасит его вторым — «гейт не подгоняли под мир, а мир привели к гейту». Я сделала наоборот. Замер (`git show <коммит>:<файл>`): на `fda0679`, лендинге зоны, канон `0.12.0` И `httpapi/capabilities.go` `ContractVersion = "0.12.0"` ⇒ гейт ЗЕЛЁНЫЙ, и число акта «батарея 20/8/`EXIT=0`» — честное, под сомнение НЕ ставится. Следующий коммит, мой `3d90943`, увёл канон на `0.13.0` и константу за собой не потянул ⇒ `gates.TestTheAnnouncedContractVersionIsTheOneTheCanonRatified` красен с 07.09: «this build announces contract 0.12.0 and the ratified canon is 0.13.0». Практическое следствие названо самим гейтом: клиент, сгенерённый по объявленному `0.12.0`, откажет на формах, которые деплой реально возвращает. ⛔ **Нашла это платформенная сессия на СВОЁМ входном baseline, через сутки, и только потому, что промт велел снимать его самостоятельно** — то есть между моим ратификационным коммитом и следующей сессией зоны батарею не гоняет никто. Константу поднимает зона (её файл), заказанность объявлена мной явно: это обслуживание от ратифицированной смены (`D39.183`), а не правка ради зелени. ⚠ Урок в свою сторону и он общий: **бампнув канон, я обязана пере-гонять гейт ТОЙ зоны, чей код канон судит** — мой собственный `counts.py --check` этого класса не видит по построению, он сверяет доки с доками.
> ⚠ **Эррата 08.09-а (`D39.185`) — УКАЗАТЕЛЬ НА РЕЕСТР НАХОДОК РЕВИЗИИ ВЕДЁТ В НИКУДА.** Тело ноты дважды
> (`:1929`, `:1942`) называет реестр `docs/DOC_REVISION_FINDINGS.md`; файла по этому пути НЕТ (проверено
@ -31,7 +32,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:344-345`=`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:345-346`=`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@<uid>.service`» из пробы `systemd-run --user --scope` без
@ -1654,7 +1655,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:550`=`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:551`=`ENGINE_KEYS_PATH`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал).
## D39.177 — ПЕРЕДАЧА РОЛИ ОРКЕСТРАТОРА №20 → №21: что смена приняла и построила, четыре моих ошибки (две поймал владелец) и очередь, сверенная деревом (31.08). ✅
@ -3178,3 +3179,23 @@ bought NOTHING». ⇒ **`tmctl manifest` есть НИЖНЯЯ граница,
**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` не гонялся. Живого платного прогона в паке не было и не требовалось.
## D39.229 — АКТ: платформенный пак «РАЗРЕЗ ПРИЁМА ДО ГОТОВНОСТИ И ПРАВДА О СЕБЕ» ПРИНЯТ; потолок разрезов построен и честно назвал, чего НЕ ограничивает (08.09, оркестратор №23) ✅
**1. Что заландено.** `ddcbf0c`, 26 путей, всё в `platform/`. Синхронный вход разреза получил потолок (`internal/books/limit.go`, `x/sync/semaphore`); граница хвоста загрузки выведена из кода пути; рантбук назвал молчание маршрута числом; три места, где сбой был неотличим от нормы, разведены; шапка зонного журнала и три ряда регистра приведены к правде. **$0**, платных вызовов ноль.
**2. Числа пере-сняты МНОЮ, не приняты со слов.** `go test ./... -count=1`**20 пакетов `ok` · 0 FAIL · EXIT=0**. Дерево — 26 позиций, **все** в `platform/`, вне зоны 0. `gofmt -l` пуст, индекс пуст. Регистр: **465 строк, открытых 109, major 1, minor 36, info 72** — совпало с числами зоны до единицы. ⚠ Полный `make check` со всеми четырьмя гейтами хоста гоняла ЗОНА (`MAKE-EXIT=0`, линтер 0 issues, 5 скипов с одним названным условием — отсутствует деплой-артефакт, которого нет в репозитории); я гоняла батарею без гейтов ⇒ её `EXIT=0` принят СО СЛОВ, мой подтверждает только негейтовую половину.
**3. ⭐ ПОТОЛОК НАЗВАЛ, ЧЕГО ОН НЕ ОГРАНИЧИВАЕТ, и это сильнее самого потолка.** `DefaultMaxCuts` взят из существующего носителя (`jobs.DefaultWorkers`), а не назван заново. Комментарий механизма сам объявляет границу: потолок держит РАЗРЕЗЫ на всех трёх путях (интейк · воркеры очереди · свип), но **НЕ** все процессы движка на хосте — материализатор и рекoнсайлер читают через тот же неограниченный `runner.readEngine`. ⇒ худший случай по числу процессов не равен потолку и не посчитан; остаток заведён строкой **364**, и намеренно в БЭКЛОГ, а не в регистр дефектов: это названная граница механизма, а не дефект поведения. ⚠ Довод к тому, что вопрос не косметический: разрез идёт голым `exec.CommandContext` без cgroup и `MemoryMax`, в отличие от прогонов.
**4. Приор оркестратора проверен зоной и подтверждён КОДОМ, а не принят.** Я писала, что ожидание внутри уже стоящего `CutBudget` к `UploadSettle` ничего не добавляет; зона проверила и встроила довод в сам механизм: разрез идёт на шаге прогулки загрузки, поэтому время ожидания — время, НЕ потраченное на движок, а не добавленное к хвосту. Требование «потолок конфигурируем» снято там же: конфигурируемо ЧИСЛО слотов, не время.
**5. ⛔ АДВЕРСАРИАЛЬНЫЙ ПРОХОД НАШЁЛ ВОСЕМЬ, ИЗ НИХ ШЕСТЬ — ДЕФЕКТЫ ЭТОГО ЖЕ ПАКА, ВСЕ НА ЗЕЛЁНОЙ БАТАРЕЕ.** Мёртвый ретрай под `MaxAttempts: 1` (книга ждала свип 20 минут) · слот, выигранный в конце бюджета, отдавал движку миллисекунды, а убитый процесс читался как отказ ДЕПЛОЯ и ТРАТИЛ попытку из бюджета, который после пяти удаляет файл пользователя · claim не отдавался при спетом хвосте · собственный тест трёх окон вакуумен для двух из трёх, а его комментарий утверждал обратное · мёртвый код отказа бута · сломанный этим же паком баннер расхождения версий. Норма, купленная этим замером, заландена отдельно (`c3039be`, блок 5 ролевого промта): работает НАПРАВЛЕНИЕ, а не факт прохода — «сделай самопроверку» есть дефектная строка промта.
**6. Девятая находка — класс, который не ловится НИ батареей, НИ мутацией.** Резерв был константой, а тестовый бюджет записи — полем; пакет `books` **зависал навсегда**. Зелёного вердикта не наступает, но и красного тоже: в CI это читается как «долго», а не «сломано». Назвал её только прогон с укороченным `-timeout` и чтение стека. Правило зоны: **число, которое фикстура умеет укорачивать, и число, выведенное из него, обязаны быть выведены ОДИНАКОВО** — константа рядом с полем совпадает в бою и расходится в тесте.
**7. Пред-решение оркестратора по инструменту отказа подтверждено отменённым.** §4.6 промта первой редакции заказывал новый КОРНЕВОЙ `code` — ломающее изменение; отозвано до выдачи (`D39.227` п.5). Зона проверила и пошла дальше: пункт закрыт ПО ПОСТРОЕНИЮ — обе причины отказа приёма уже едут перечислимыми в открытом словаре `errors[]`, таблица «код → фраза» у клиента есть, неисполнена только клиентская половина, а фронт заморожен.
**8. Второй вопрос зоны решён В ЕЁ ПОЛЬЗУ по замеру.** `ReasonHostAtCapacity` — константа, которая никогда не пишется в БД, оставлена рядом с пятью хранимыми. Проверено: словарь причин никто не перечисляет как множество, а различие уже несётся СТРУКТУРНО — пять хранимых суть псевдонимы словаря шва (`ingest.Reject*`), две новые — локальные литералы. ⇒ живой лжи нет, решение зоны верно.
**9. Границы вердикта — честно.** Полного `make check` с гейтами я не гоняла (см. п.2). Мутаций приёмка не сажала: 19 посадок за смену — числа зоны, одна выжила ВЕРНО (сайзинг, не свойство). Живого нагрузочного прогона потолка я не наблюдала — «N одновременных приёмов дают ровно M процессов» принято по тестам зоны, не по моему замеру.

View file

@ -15,7 +15,7 @@
## 2. Деньги ДВИЖКА (зона `backend/`)
- **Леджер SQLite.** Таблица `spend`, две фигуры: `committed_usd` (потрачено, с сырым ответом провайдера) и `reserved_usd` (зарезервировано под летящий вызов). `Reserve` перед каждым платным вызовом сверяет `SUM(committed_usd + reserved_usd)` книги и дня с потолками (`backend/internal/store/ledger.go:44,58,63`=`func (s *Store) Reserve(`; Р7 — коммент `backend/internal/store/ledger.go:12`=`per-day (Р7); checked against`); `SettleWithCheckpoint` одной транзакцией конвертирует резервацию в committed и персистит ответ (`backend/internal/store/ledger.go:178`=`func (s *Store) SettleWithCheckpoint(`). ⚠ У ДВИЖКОВОГО `store.Store` метода `Settle` нет — он называется `SettleWithCheckpoint` (словарь кода: `backend/internal/store/ledger.go:11`=`Reserve/Settle/ReleaseReservation semantics`). ⚠ Не спутать с ПЛАТФОРМЕННЫМ `credits.Settle` (§3 п.8) — это другой `Store`. Суммарно по книге — `SpentUSD` (`backend/internal/store/ledger.go:392`=`SpentUSD reports (committed, reserved)`).
- **Леджер SQLite.** Таблица `spend`, две фигуры: `committed_usd` (потрачено, с сырым ответом провайдера) и `reserved_usd` (зарезервировано под летящий вызов). `Reserve` перед каждым платным вызовом сверяет `SUM(committed_usd + reserved_usd)` книги и дня с потолками (`backend/internal/store/ledger.go:44,58,63`=`func (s *Store) Reserve(`; Р7 — коммент `backend/internal/store/ledger.go:12`=`per-day (Р7); checked against`); `SettleWithCheckpoint` одной транзакцией конвертирует резервацию в committed и персистит ответ (`backend/internal/store/ledger.go:178`=`func (s *Store) SettleWithCheckpoint(`). ⚠ У ДВИЖКОВОГО `store.Store` метода `Settle` нет — он называется `SettleWithCheckpoint` (словарь кода: `backend/internal/store/ledger.go:11`=`Reserve/Settle/ReleaseReservation semantics`). ⚠ Не спутать с ПЛАТФОРМЕННЫМ `credits.Settle` (§3 п.8) — это другой `Store`. Суммарно по книге — `SpentUSD` (`backend/internal/store/ledger.go:400`=`SpentUSD reports (committed, reserved)`).
- **Гейт потолков — ПЕР-ВЫЗОВНЫЙ** (`Reserve` на каждый свежий attempt). На границе юнита сидел РЕПЭЙР-суб-бюджет — ужесточён до пер-вызовного с ценой вызова (строка 135 закрыта D39.131); эскалационный кап хоп НЕ прицениваает — перелёт ≤1 хопа, задокументирован и запинен (диспозиция D39.131 п.2д, реопен — живой инцидент). ⚠ **ТРЕТЬЕ семейство, которого перечень не знал (доп. ревизией 02.09): банк-роли несут СОБСТВЕННЫЕ КНИГО-ШИРОКИЕ бюджеты**`gates.terminology.budget_usd` и `gates.terminology.classify_budget_usd`. Именно оно резало ОПЛАЧЕННУЮ работу на холодном прогоне 31.08 (D39.182 §4: инцидент был на классификаторе). С 31.08 (D39.182) план прохода режется ценой партии ДО первого вызова, а не обрывается посередине; усечение ВИДНО в отчёте — поля `BatchesDropped` и `ClassifyBatchesDropped` (`backend/internal/pipeline/terminologist.go`, греп `BatchesDropped`). ⚠⚠ **И сами цифры этих суб-бюджетов в книжных конфигах КАЛИБРОВАНЫ ПОД ИЮЛЬСКИЕ ЦЕНЫ** (тот же множитель ×4.47, D39.179 п.1): на холодном прогоне 31.08 `classify_budget_usd` 0.02 оборвал классификатор дважды, а поднятый до 0.08 `escalation.budget_usd` был пробит фактом до 0.103305. То есть суб-бюджеты режут ОПЛАЧЕННУЮ работу не по замыслу, а по протухшей калибровке.
- **leftover-reserved зануляется write-open.** `store.Open` (путь записи, каждый `translate`) выполняет `recoverReservations` (`backend/internal/store/store.go:110`=`s.recoverReservations(ctx)`; сама функция — `backend/internal/store/store.go:278-279`=`UPDATE spend SET reserved_usd = 0`) — файл владеется одним процессом, значит любой reserved на открытии принадлежит несеттлённому прогону. `OpenReadOnly` этого прохода намеренно НЕ делает (`backend/internal/store/store.go:124`=`does not run that pass`) ⇒ **reserved, увиденный read-only `status` В МОМЕНТ СПАВНА, — остаток мёртвого процесса** (несущий факт формулы PD-158, см. §3). ⚠ Но НЕ «всегда»: `OpenReadOnly` построен ровно затем, чтобы `status` работал ВО ВРЕМЯ живого прогона (`backend/internal/store/store.go:122`=`allows concurrent readers while a writer is live`), и конкурентный `status` покажет ЖИВУЮ резервацию между `Reserve` и settle. Узко формулирует и сам код: «after a run crashes, reserved_usd stays non-zero until the next WRITE command» (`backend/internal/store/store.go:130`=`after a run crashes, reserved_usd stays non-zero`), и платформа — «at spawn there is no other writer … so anything reserved is by construction a leftover, never a live promise» (`platform/internal/runs/spawn.go`, греп `never a live promise`).
- **`--max-units` — ОБЪЁМНЫЙ потолок прогона, ортогональный денежному** (D39.165 §1б, принят D39.170). Ограничивает не деньги, а РАБОТУ: не больше N выходных ЮНИТОВ (гранулярность `units_total` манифеста — та же, в которой платформа продаёт главы) возьмут СЛОТ гранта в этом прогоне; юниты, отданные за $0 (резюм, ре-пин), ретраи и эскалации внутри юнита потолок не тратят. ⚠ **«Слот» ≠ «оплата», и с 03.09 это РАЗНЫЕ числа** (пак «число согласия», строка бэклога 232): юнит, который прежний прогон НАЧАЛ и не отгрузил, дописывается ВНЕ гранта, поэтому грант N оплачивает ДО 2N выходных юнитов — замерено приёмкой на живом раннере (грант 2 → `Paid()=4`, шесть вызовов провайдера). Единственный денежный бонд здесь — `--ceiling-usd`. ⛔ **Семантика переноса НЕ ратифицирована — слово владельца 03.09 «подумаем на этот счёт»**, и до его решения читать это как замеренный факт, а не как норму. Принимает только `translate`. **Остановка по объёму — ЗАВЕРШЕНИЕ (exit 0), не пауза:** словарь кодов выхода не расширялся и нового значения `Finished.Outcome` тоже нет — ⚠ **но с 31.08 признак едет ЧИСЛАМИ в кадре `finished` шва, а не только прозой** (D39.181 п.2, закон раскрытия: прозаическая строка отчёта до потребителя потока не доезжала): носитель — `Finished.Volume`, леджер доставки. Различение при этом живёт и в отчёте прогона, и в логе; отчёт разводит ДОСТАВКУ и ПЕРЕ-ДЕЛКУ. Носитель — `backend/internal/pipeline/volume.go:13`=`the VOLUME ceiling — the run's second stop`; словарь флага дословно — `backend/cmd/tmctl/invocation.go:143`=`Stopping on it is a COMPLETION (exit 0), not a pause`. ⚠ Проводка в платформу ГЕЙЧЕНА (`PD-422`): единственный писатель признака движения банка — дверь правок, рост АВТО-банка от майнинга флага не ставит.

View file

@ -44,7 +44,7 @@
*Прецеденты:* потолок аргументом (D39.110 п.2б`--ceiling-usd`, D39.122) · `--verify-bank`
флагом (`platform/internal/runner/engine.go:116`=`func TranslateArgs(workdir string, verifyBank bool`) · дефолт `project_db` по конвенции каталога
(`backend/internal/config/book.go:200`=`b.ProjectDB = filepath.Join(dir, b.BookID+".db")`) · конвенционное опциональное чтение `.auto-bank.yaml`
(`backend/internal/pipeline/mining.go:667`=`.auto-bank.yaml`).
(`backend/internal/pipeline/mining.go:674`=`.auto-bank.yaml`).
2. **Посреди прогона внутрь идёт ТОЛЬКО сигнал.** `SIGTERM` = «дочти чанк и отпусти лок»; всё
остальное — на границах процессов. Арбитр — эксклюзивный flock проекта на всю жизнь прогона

View file

@ -1,3 +1,10 @@
> ⚠ **ОТРАБОТАН И ПРИНЯТ 08.09 — акт `D39.229`, лендинг `ddcbf0c` (26 путей, $0).**
> Инструкции ниже НЕ исполняются: пак закрыт. Исход: синхронный вход разреза получил потолок, граница хвоста
> выведена из кода, рантбук назвал молчание маршрута, шапка зонного журнала и три ряда регистра приведены к
> правде. Пункт §4.6 закрыт ПО ПОСТРОЕНИЮ (причины уже едут перечислимыми; неисполнена клиентская половина,
> фронт заморожен). Остаток потолка — строка **364**. Адверсариальный проход дал 8 находок, 6 из них дефекты
> этого же пака на зелёной батарее; норма про НАПРАВЛЕНИЕ самопроверки заландена `c3039be`.
# Пак платформы: «РАЗРЕЗ ПРИЁМА ДО ГОТОВНОСТИ И ПРАВДА О СЕБЕ»
## 1. Какая проблема и что решит твой результат