Apply the independent verifier findings: correct the NIST paraphrase, the weight counts and the wrong defect id, and move the fix pack boundary into the carrier sessions read

This commit is contained in:
heaven 2026-08-07 23:26:50 +03:00
parent 61c20bf8e1
commit 97047828ad
5 changed files with 58 additions and 25 deletions

View file

@ -1,6 +1,6 @@
# Промт: роль ОРКЕСТРАТОР TextMachine (канонический счётчик №N — в первой строке ниже)
> **Счётчик ролей — канонический ОДИН:** «оркестратор №N» (сейчас №15 — хендофф 06.08.2026, №14 закрыт после D39.107; состояние передачи — D39.107 (⚠ PROGRESS CURRENT-STATE НЕ обновлён: файл занят живым полигоном — обновить при его лендинге); очередь №15 — D39.107 п.3).
> **Счётчик ролей — канонический ОДИН, и номер выдаёт тот, кто пишет промт** (норма D39.112 п.6: №15 однажды вписал в CURRENT-STATE «№16» для параллельной сессии, которой промта не писал — это второй носитель состояния; параллельного оркестратора называть РОЛЬЮ, пока номер не выдан): «оркестратор №N» (сейчас №15 — хендофф 06.08.2026, №14 закрыт после D39.107; состояние передачи — D39.107 (⚠ PROGRESS CURRENT-STATE НЕ обновлён: файл занят живым полигоном — обновить при его лендинге); очередь №15 — D39.107 п.3).
**Позиция и первые задачи хендоффа №8→№9 (26.07) — ИСТОРИЧНЫ И ИСПОЛНЕНЫ** (малая пачка 14а+14б → D39.54 · пак-19 → D39.55/56 · холодный мини-прогон → D39.58 · пак-21 «чекеры» → растворён D39.62, исполнен пакетом D39.78) — здесь не пересказываются (историзировано D39.80: файл нёс протухшую очередь как второй носитель состояния). **ЕДИНЫЙ БЭКЛОГ = секция «Бэклог» в PROGRESS.md — единственный трекер.** Текущее состояние и очередь — ТОЛЬКО PROGRESS CURRENT-STATE; онбординг стандартный (CLAUDE.md → README → CURRENT-STATE → голова D-лога).

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
# Журнал решений оркестратора — контракт D1D39.111 (развязки 04.07 · пакеты 0910.07 · приёмка/качество-первым/пивот/эмпирика 1112.07 · арх-ресет+стройка пере-прогонного стека 1319.07)
# Журнал решений оркестратора — контракт D1D39.112 (развязки 04.07 · пакеты 0910.07 · приёмка/качество-первым/пивот/эмпирика 1112.07 · арх-ресет+стройка пере-прогонного стека 1319.07)
> **КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто:
> ⚠ **Навигация (актуализация 04.08):** два supersede-указателя эры D39.9x: **D39.88/D39.84 п.8 (право самокоммита фронта/платформы) → отозвано, коммитит ТОЛЬКО оркестратор** (D39.98 п.3; тела переписаны на месте с санкцией владельца, pre-rewrite — git `2b166b7`) · **норма 30.07 «короткая приёмка» → амендирована владельцем 03.08: приёмка всегда адверсариальная** (носитель — промт оркестратора §Анти-паттерны + D39.101 п.1) — упоминания «короткой приёмки» в телах читать через эту пометку · **двухсекционная редакторская инъекция и смягчающая роль маркера ⟨проверить⟩ → доктрина инжекта D39.104**: банк на проводе = ЗАКОН для всех ролей независимо от статуса строки, право «перевести иначе» упразднено, блок редактора — ЕДИНЫЙ, маркер с провода снимается (статусы строк и подписная таблица не меняются; внесение в движок — строка 134 после пробы 18) — упоминания двухсекционки/смягчения в телах читать через это.
@ -1571,3 +1571,19 @@ API-529-долг закрыт: 8-осевой refute-by-default воркфлоу
**2. Фикс-пак платформы передан ЗАПИСКОЙ, а не отдельным промтом** — по прецеденту №14 (восемь пунктов жили разделом зонного журнала и были отработаны) и по норме пропорциональности: это точечные фиксы, а не дизайн. Носитель — раздел «Ратификация приёмкой P2» зонного журнала, фикс-лист там же с порядком. Состав: **PD-80** (единственная major — доступность входа: лимитер прежде очистки login-куки плюс раздельные ведра) · **PD-79** (строковый `"null"` = ноль денег, до появления вызывающего у `Settle`) · **PD-100** (колбэк глотает ошибки стора и discovery — класс PD-5, закрытый в `auth/`, но не в `login/`) · **PD-83/84/85** (три «закрыто, но не запинено» по собственному правилу зоны) · **PD-106** (админ-CLI — единственный писатель денег — без единого теста) · **PD-91** (установка по наброску даёт нестартующий юнит; `ProtectHome` против «книги в `~/books`») · **PD-95** (транспортный доккоммент — ДО промта эмиттера, иначе эмиттер-сессия прочтёт его как задание). **Граница пака названа явно:** PD-92/93/96/99/102/105/107 НЕ трогать — они латентны за воркером и эмиттером, и правка сейчас означала бы угадывание формы, которую задаёт строка 103.
**3. Условный пункт:** если владелец подтверждает предложение по фри-тиру (D39.110 п.3), в тот же пак заходит дефолт `SignupGrantMicroUSD` в НОЛЬ; расхождение док↔код (PD-104) чинится независимо от ответа.
## D39.112 — ВЕРИФИКАЦИЯ ЗАПИСЕЙ №15 НЕЗАВИСИМЫМ АГЕНТОМ: восемь фактических правок и восемь пробелов закрыты; поправка к D39.109/D39.110 (07.08). ✅
**1. Заказ владельца:** один чистый агент читает промт оркестратора и доки «где мы сейчас» и проверяет записи №15 по четырём осям — факты, пробелы, понятность холодной сессии, вода. Вердикт агента: «можно доверять С ПРАВКАМИ». Он пере-считал очередь своим скриптом (120 · 62/79 · «скоро» 32 — сошлось до строки), механически сверил ВСЕ `file:line` новых строк реестра (все существуют и говорят заявленное), пере-проверил номера норм по первоисточникам, прогнал `build`/`vet`/`test`/`golangci-lint` в зоне (0 issues) и подтвердил существование всех пинов ратифицированных решений. Не заверено им (стенд без Postgres): 45 мутаций, 26 БД-тестов, живые пробы на бинаре, `make vuln`, счёт фаззеров — остаются со слов приёмки, и так и помечено.
**2. Поправки к D39.109 — принять как исправление, буква нот не переписывается (D23.3).** **(а) п.3 пере-формулировал NIST.** Сказано «30 суток — БУКВА NIST AAL1»; по первоисточнику SP 800-63B-4 §2.1.3 буква иная: SHALL — только «установить определённый reauthentication overall timeout», сами 30 суток — **SHOULD**, и это интервал ре-аутентификации, который успешная ре-аутентификация СБРАСЫВАЕТ, а не неснимаемый предел; термин «absolute maximum session lifetime» принадлежит ASVS, не NIST. Верная формулировка: **30 суток — SHOULD-планка ре-аутентификации AAL1, а наш жёсткий абсолютный срок 30 суток строже неё.** Зонные носителя (`STACK_DECISIONS §13`, `config.go:62-64`) цитируют верно — ошибка была только в ноте, то есть в источнике истины №1. Номера разделов всех трёх норм верны. **Замечание по прицелу:** 7.1.x требуют ДОКУМЕНТА, величину требуют 7.3.1/7.3.2 — если §13 будут судить как соответствие ЗНАЧЕНИЮ, ссылка нужна на 7.3.2, её нет ни в одном доке. **(б) п.4 сохранил снятое основание** «доккоммент предлагает то, что PD-59 уже отклонил»: PD-59 сам superseded (D39.106 п.3), эррата это признала и переписала строку реестра, но текст п.4 остался — читать через эту поправку. **(в) «Живой уязвимости приёмка не нашла»** — термин не определён и гасит единственную major. Верно так: уязвимости с потерей денег, данных или захватом сессии нет; отказ в обслуживании входа ЕСТЬ и воспроизведён (PD-80, класс `vuln`). Формулировка в зонном журнале и CURRENT-STATE исправлена.
**3. Поправка к D39.110:** п.1 назван «решение владельца (дословно по смыслу)» — оксюморон, запрещённый нормой «цитаты только дословные, овер-атрибуция — типовой провал»; читать как **пересказ** решения. Форма и три следствия не меняются.
**4. Закрытые пробелы (все — в носителях, а не в нотах, потому что сессии зон читают носители).** PD-100 объявлялся в составе фикс-пака, а в фикс-листе зонного журнала отсутствовал — **добавлен пунктом 7** · граница пака («PD-92/93/96/99/102/105/107 не трогать») жила только в D-логе, а фикс-лист говорил обратное «остальное по весу строк» — **перенесена в журнал пунктом 8, формулировка «по весу» снята** · пункт 6 фикс-листа был одиннадцатью строками истории моей ошибки без задания — **сжат до задания** («переписать доккоммент `events.go:6-12` под форму D39.106 ДО промта эмиттера») · «три строки блокируют деплой и воркер» не называли, какие — **названы поимённо** (PD-91 деплой · PD-79 воркер · PD-95 промт эмиттера) · счёт весов регистра отстал от эрраты — **пере-считан скриптом: 37 открытых, 3 major, 14 minor, 20 info**, исправлен в двух местах · PD-105 нёс `minor` в колонке при «повышен» в теле — **колонка приведена** · словарь классов в шапке реестра не знал `doc`/`standards`, введённых новыми строками — **дописан** · PD-60/PD-61 выпали из списка «разрулить до промта эмиттера» — **возвращены** · пересчёт «главы → деньги» и ручка границ шкалы не были поручены никому — **носитель назван в строке 126** (считает платформа, поверхность объявляется правкой спеки; ручки в контракте сегодня нет) · «CONFIRM владельца на 30 суток» стоял в CURRENT-STATE как полученный, а в ноте и журнале — как открытый вопрос: **confirm получен 07.08, тексты сведены**.
**5. Два пробела класса «повторил свой же урок».** **(а)** Эррата D39.109 ввела правило «каждый вывод зонного дока, спорящий со швом, грепается на supersede ДО ратификации» — и не применила его к ПОТОЛКУ: раздел П-5 зонного журнала продолжал объявлять платформу владельцем `book.yaml`, хотя D39.110 п.2(б) это отменил в тот же день. Абзац помечен SUPERSEDED. **(б)** Голова CURRENT-STATE отставала — **третий раз в истории проекта** (после D39.81 и D39.83, оба названы в промте оркестратора): нота D39.111 была ратифицирована, а шапка показывала D39.110. Механический чек головы обязателен ПОСЛЕ каждого аппенда, а не после «важных».
**6. Не минтить номера чужим сессиям.** CURRENT-STATE ввёл «оркестратор №16» для параллельной приёмки полигона — при том что счётчик объявлен каноническим и ОДНИМ, живёт в промте оркестратора и показывает №15, а по D-логу №16 не существует. Номер снят: второй оркестратор назван ролью («параллельный, приёмка полигона»), номер выдаёт тот, кто пишет ему промт.
**7. Долг, оставленный сознательно:** срез хроники PROGRESS в архивный слайс (живой хвост несёт №11№13, эра D39.91105, всё закрытое) — НЕ сделан, потому что файл держит живая полигон-сессия, а срез это перекладывание сотни строк в контендящемся файле. Режет тот, кто лендит полигон. Туда же: архивация отработанного `PLATFORM_SESSION_PROMPT.md` (баннер-исход на нём стоит) — после приёмки фикс-пака, чтобы не ломать ссылку живой сессии.

View file

@ -4,7 +4,8 @@
> Правила: каждая находка любой сессии/приёмки/аудита — строкой сюда ДО закрытия; ID стабилен навсегда;
> закрытие — только с коммитом фикса и тестом, пинящим свойство (урок PD-1: свойство без пинящего теста
> считается НЕ закрытым). Класс: `vuln` — эксплуатируемо или ослабляет защиту · `bug` — неверное поведение ·
> `hardening` — защита в глубину / латентное. Статус: `open` · `fixed(<commit>)` · `accepted-risk(<кем, когда>)`.
> `hardening` — защита в глубину / латентное · `doc` — док лжёт о коде · `standards` — расхождение с
> объявленной нормой зоны (введены приёмкой P2; словарь отставал от строк — испр. оркестратором №15). Статус: `open` · `fixed(<commit>)` · `accepted-risk(<кем, когда>)`.
| ID | Класс | Серьёзность | Где | Суть | Статус | Источник |
|---|---|---|---|---|---|---|
@ -111,7 +112,7 @@
| PD-101 | bug | minor | `internal/login/login.go:507` | `login_events.ip_prefix` берётся из `r.RemoteAddr`, а в задуманном деплое перед сервисом стоит edge-прокси ⇒ префикс всегда сеть прокси. Журнал входов заведён как ответ на «откуда примерно я входил» — в шипуемой форме он систематически отвечает неверно. `X-Forwarded-For`/`Forwarded` нигде не читаются и доверенного прокси в конфиге нет (это правильный дефолт: доверять заголовку без edge нельзя) — значит решение про edge и про этот столбец принимается вместе | open | приёмка P2 (панель) |
| PD-102 | doc | minor | `internal/httpapi/serve.go:36-38` | Доккоммент `DefaultTimeouts` утверждает, что «an upload extends its own deadline as it makes progress» — это НЕВЕРНО: `ReadTimeout` в `net/http` (Go 1.26.5, `server.go:990` `wholeReqDeadline = t0.Add(ReadTimeout)`) выставляется один раз и по мере прихода байтов не продлевается. Комментарий несущий: он объясняет, почему `Read` короткий, и на нём будущая ручка загрузки книги (23 МБ по контракту) построит неверное ожидание — ей понадобится собственный дедлайн через `ResponseController`, а не «прогресс продлевает» | open | приёмка P2 (панель, сверено с исходником Go) |
| PD-103 | hardening | minor | `internal/auth/middleware.go:43,66` | У обращений к БД на аутентифицированном пути (`Lookup`/`Touch`) нет собственного дедлайна — только голый `r.Context()`, а `WriteTimeout` у сервера отсутствует по проекту (SSE) и `TimeoutHandler` в цепочке нет. Зависший Postgres паркует хендлеры и ждущих в пуле, пока клиент сам не уйдёт. `readyz` свой таймаут получил (PD-14) — горячий путь нет | open | приёмка P2 (панель) |
| PD-104 | bug | **minor, но с расхождением док↔код** | `internal/login/login.go:285-288`, `internal/config/config.go:73` | **Фри-тир начисляется АВТОМАТИЧЕСКИ, а реестр обещает обратное.** Код: дефолт `SignupGrantMicroUSD: 5 * 1_000_000` (`config.go:73`) проведён в демона (`main.go:99`) и логин отдаёт его в стор на каждой новой подтверждённой паре `(provider, subject)` то есть аккаунт создаётся С $5. Строка PD-30 при закрытии утверждает «аккаунт создаётся с нулём, начисление руками из админки» — **один из двух текстов лжёт**. Ограничитель у автоматического начисления один — лимитер входа; агрегатного потолка суммы грантов, счётчика и алерта нет нигде (грепнуто). Деньги при этом предоплаченные ключи владельца. ⚠ **Индустриальная норма:** автоматический промо-грант нормален, но только с ЯКОРЕМ, который стоит абьюзеру денег (карта на файле — AWS/GCP; телефон — OpenAI добавил его к своим $5 после фарминга; инвайт), плюс бюджет кампании отдельной суммой и алерт. `email_verified` от Google якорем НЕ является: аккаунты бесплатны и делаются пачками. **Предложение оркестратора №15 (ждёт confirm владельца):** на бете дефолт в НОЛЬ и начисление руками — платёжного инструмента нет, значит между скриптом и ключами нет ничего; при появлении платежей дефолт возвращается к $5 ВМЕСТЕ с суточным агрегатным потолком (якорь и потолок приезжают по одному поводу). Расхождение док↔код чинить независимо от ответа | open | приёмка P2 (панель; расхождение и норма — оркестратор №15, 07.08) |
| PD-105 | standards | minor | `internal/ingest/decoder.go:96` | **Декодер и норматив зоны расходятся на дубле `seq`:** декодер объявляет его фатальным `ErrStreamGap`, а `ENGINEERING_STANDARDS §2` ратифицирует «at-least-once — норма, дубль — не ошибка». После фикса PD-12 цена выросла: сбой ингеста ОСТАНАВЛИВАЕТ прогон, поэтому одна задублированная строка убивает платный прогон, хотя ратифицированный путь ремонта — `status --json`. Внутри одного пайпа передоставки нет, так что отказ декодера защитим; непропорциональна РЕАКЦИЯ. Разрешать ратификацией вместе с промтом эмиттера (строка 103), не молча. ⚠ **Пере-диспозиция (эррата №15): вес ПОВЫШЕН до major-для-эмиттера** — при ратифицированном транспорте (тейл `events.jsonl` с курсором, D39.106) повторное чтение строк после краша читателя — НОРМА, а не аномалия пайпа, поэтому норматив «at-least-once, дубль не ошибка» буквально верен, и фатальный отказ декодера прямо ему противоречит | open | приёмка P2 (панель) |
| PD-104 | bug | **minor, расхождение док↔код** | `internal/login/login.go:285-288`, `internal/config/config.go:73` | **Фри-тир начисляется АВТОМАТИЧЕСКИ, а реестр обещает обратное.** Код: дефолт `SignupGrantMicroUSD: 5 * 1_000_000` (`config.go:73`) проведён в демона (`main.go:99`) и логин отдаёт его в стор на каждой новой подтверждённой паре `(provider, subject)` — аккаунт создаётся С $5. Строка PD-30 при закрытии утверждает «аккаунт создаётся с нулём, начисление руками из админки» — один из двух текстов лжёт, и это чинится независимо от продуктового решения. Ограничитель у автогранта один — лимитер входа; агрегатного потолка, счётчика и алерта нет (грепнуто). **Разбор нормы и предложение «на бете дефолт в НОЛЬ» — D39.110 п.3, здесь не дублируется; ждёт слова владельца** | open | приёмка P2 (панель; расхождение — оркестратор №15) |
| PD-105 | standards | **major (для промта эмиттера)** | `internal/ingest/decoder.go:96` | **Декодер и норматив зоны расходятся на дубле `seq`:** декодер объявляет его фатальным `ErrStreamGap`, а `ENGINEERING_STANDARDS §2` ратифицирует «at-least-once — норма, дубль — не ошибка». После фикса PD-12 цена выросла: сбой ингеста ОСТАНАВЛИВАЕТ прогон, поэтому одна задублированная строка убивает платный прогон, хотя ратифицированный путь ремонта — `status --json`. Внутри одного пайпа передоставки нет, так что отказ декодера защитим; непропорциональна РЕАКЦИЯ. Разрешать ратификацией вместе с промтом эмиттера (строка 103), не молча. ⚠ **Пере-диспозиция (эррата №15): вес ПОВЫШЕН до major-для-эмиттера** — при ратифицированном транспорте (тейл `events.jsonl` с курсором, D39.106) повторное чтение строк после краша читателя — НОРМА, а не аномалия пайпа, поэтому норматив «at-least-once, дубль не ошибка» буквально верен, и фатальный отказ декодера прямо ему противоречит | open | приёмка P2 (панель) |
| PD-106 | standards | minor | `cmd/tmplatformctl/` | **Админ-CLI — единственный писатель денег в дереве — не имеет ни одного теста.** В том числе не покрыто правило, которое он сам называет несущим («после коммита команда не может отчитаться провалом», фикс PD-75), и разбор флагов, и формат вывода. Батарея зоны его не видит вовсе (`[no test files]`) | open | приёмка P2 (панель) |
| PD-107 | hardening | info | `internal/pgstore/migrations/00007_credits.sql:85`, `00002_readmodel.sql:13` | **Удаление аккаунта обходит защиту PD-25:** составной FK `reservations → books(id, owner_id) on delete restrict` блокирует `DeleteBook`, но `users` каскадит в `reservations` НАПРЯМУЮ, поэтому `delete from users` уносит и ОТКРЫТУЮ резервацию. Замерено приёмкой: аккаунт с открытым холдом удаляется. Учётной дыры нет — леджер и кэш баланса каскадятся тем же удалением, — но прогон, идущий против этого холда, останется без того, кто его закроет. Кода удаления аккаунта в дереве нет вовсе (грепнуто) ⇒ строка = гейт перед появлением такой операции (и перед ASVS 7.4.2 в полной форме). ⚠ Заодно ОПРОВЕРГНУТА обратная версия этой находки от панели («удаление падает на композитном FK даже при закрытых резервациях») — мой прогон: удаляется и с закрытой резервацией, и без неё | open | приёмка P2 (замер оркестратора №15; версия панели опровергнута) |

View file

@ -10,7 +10,7 @@
вердикт, метод, что ратифицировано, фикс-лист, что опровергнуто. Два вопроса ушли владельцу:
срок сессии 30 суток и агрегатный потолок фри-тира (PD-104).
- **Регистр после приёмки — 107 строк** (скриптом по таблице): 66 закрыто · 3 приняты риском ·
1 закрыт ратификацией (PD-59) · **37 открыто** — из них **1 major** (PD-80), 17 minor, 19 info.
1 закрыт ратификацией (PD-59) · **37 открыто** — из них **3 major** (PD-80 · PD-95 · PD-105; две последние подняты эрратой 07.08), 14 minor, 20 info.
Прежние восемь (PD-6 · PD-23 · PD-43 · PD-44 · PD-45 · PD-60/61 · PD-72) плюс 29 новых
PD-79…PD-107. Первые в очереди зоны — фикс-лист приёмки, порядок там же.
- **P2 отработала очередь приёмки P1 целиком плюс ДВА собственных адверсариальных ревью** (05.08) —
@ -50,9 +50,14 @@
(`87be7b9`/`6469479`). Строки регистра формулировку не завышали — они честно говорят
`fixed(P1, дерево сессии)`.
**Живой уязвимости приёмка не нашла.** Найденное — 29 строк регистра **PD-79…PD-107**: одна major
(доступность входа, PD-80), остальные minor/info. Лендинг не блокирует ничего; три строки блокируют
первый реальный деплой и постройку воркера — названы в фикс-листе. Метод панели: семь линз с
**Уязвимости с потерей денег, данных или захватом сессии приёмка не нашла** — и это ровно то, что
фраза означает; отказ в обслуживании при этом ЕСТЬ (PD-80, класс `vuln`, воспроизведён на бинаре).
Найденное — 29 строк регистра **PD-79…PD-107**. Счёт весов ПОСЛЕ эрраты (скриптом по колонкам):
открытых 37 — **3 major** (PD-80 доступность входа · PD-95 и PD-105 подняты эрратой как задание
эмиттеру), 14 minor, 20 info. Лендинг не блокирует ничего. Блокируют дальнейшее ТРИ поимённо: **PD-91** — первый реальный
деплой (установка по наброску даёт нестартующий юнит) · **PD-79** — постройку воркера (строковый
`"null"` = ноль денег на пути расчёта) · **PD-95** — выдачу промта эмиттера (доккоммент несёт
снятую форму транспорта). Метод панели: семь линз с
зажатыми промтами (отчётные доки зоны им запрещены), затем адверсариальный опровергатель на КАЖДУЮ
находку весом minor и выше — 20 подтверждено, 2 опровергнуто, плюс мои собственные замеры.
@ -111,7 +116,7 @@
**Вынесено владельцу — два вопроса.** (1) Сроки сессии: не заходивший месяц человек увидит экран
входа; если это против замысла — одна переменная `TM_PLATFORM_SESSION_MAX_AGE` и явная запись
отклонения в §13. (2) **Новое, из PD-105:** фри-тир печатается НЕАУТЕНТИФИЦИРОВАННЫМ потоком по $5
отклонения в §13. (2) **Новое, из PD-104:** фри-тир печатается НЕАУТЕНТИФИЦИРОВАННЫМ потоком по $5
за каждую новую подтверждённую пару `(provider, subject)`, и агрегатного потолка нет нигде — нужен
ли суточный лимит грантов и счётчик аномалий до открытия беты.
@ -129,18 +134,19 @@
«книги в `~/books`».
5. **PD-106 — админ-CLI, единственный писатель денег в дереве, не имеет ни одного теста**
включая правило «после коммита нельзя отчитаться провалом», которое сам же называет несущим.
6. **PD-95 — ПЕРВЫМ в промт эмиттера, и это эррата к самой приёмке.** Транспортная история зоны
устарела против D39.106 в двух местах: доккоммент `events.go` предлагает переезд на fd/сокет
`research/25` — 0 голосов), а секция журнала «Транспорт потока событий» доказывает «остаётся
stdout», опираясь на PD-59, который тем же D39.106 п.3 объявлен superseded вместе с пайп-путём
`supervisor.go` («дев-режим»). Ратифицированная форма — `events.jsonl` в каталоге книги, который
платформа ТЕЙЛИТ, а движок поднимается транзиентным systemd-юнитом и платформе не ребёнок.
**Я это при лендинге пропустил и в первой редакции PD-95 сам сослался на снятый PD-59**
поймано вопросом владельца 07.08, а не процессом; секция журнала помечена superseded, PD-95
переписан, PD-92 понижен до info (дефект дев-пути), PD-105 повышен (при тейле файла повторная
доставка строк — норма, значит норматив «дубль не ошибка» буквально верен), PD-60
переформулируется вместе со строкой 103.
7. Остальное — по весу строк.
6. **PD-95 — переписать доккоммент `events.go:6-12` под форму D39.106, и это ЕДИНСТВЕННОЕ, что тут
осталось на зону.** Ратифицированный транспорт: `events.jsonl` в каталоге книги как
outbox-проекция коммитов SQLite, платформа его ТЕЙЛИТ, движок — транзиентный systemd-юнит и
платформе не ребёнок; «родитель + пайп» и «выделенный fd» отвергнуты с нулём голосов
(`research/25` §Форма). Секцию журнала про stdout и строки PD-92/PD-105/PD-60 уже пере-поставил
я — тебе их не трогать. Срок: ДО того, как владелец выдаст промт эмиттера, иначе та сессия
прочтёт доккоммент как задание.
7. **PD-100** — колбэк глотает ошибку стора и ошибку discovery, репортя их обычным отказом. Это
класс PD-5, который зона закрыла в `auth/`, но не в `login/`.
8. **Граница пака — жёсткая, это не «по весу строк».** НЕ трогать: **PD-92 · PD-93 · PD-96 ·
PD-99 · PD-102 · PD-105 · PD-107**. Все они латентны за воркером и эмиттером, и правка сейчас
означает угадывание формы, которую задаёт строка 103 единого бэклога. Остальные открытые строки
реестра — тоже не в этом паке: он закрыт списком выше.
**Опровергнуто приёмкой — включая свои промахи (дисциплина «заявление=команда» действует и на
приёмку).**
@ -867,6 +873,16 @@ research/23 §2 + запрет INFO-денег), а словарь строки
- **Источник цифр.** Поток событий денег не несёт и не должен (кадр `ceiling` — только факт),
поэтому платформа метрит из `tmctl status --json` (`committed_usd`) на границах попыток и на
ре-синке; хранит целыми микро-долларами в леджере (`credit_ledger`, миграция `00007`).
> ⚠ **АБЗАЦ НИЖЕ SUPERSEDED — D39.110 п.2(б) (07.08).** «Платформа владеет `book.yaml` и правит
> `ceilings.book_usd`» отменено: потолок принадлежит ПРОГОНУ и едет аргументом прогона (движку это
> ещё предстоит уметь — строка 145 единого бэклога), а не постоянной записью в конфиге книги, иначе
> пользовательское число оседает в данных движка против D39.81/D39.85. И это НЕ «политика платформы,
> не кнопка на экране»: владелец 07.08 решил обратное — управляемая шкала В ИНТЕРФЕЙСЕ, от минимума
> до доступного остатка, в ГЛАВАХ (строка 126). Верным в абзаце остаётся только проверенный факт:
> `Ceilings` в `BriefHash` не входит, поэтому смена потолка не двигает снапшот и не вызывает ре-билл.
> ⚠ Помечено при повторной верификации: эррата 07.08 применила правило «грепать зонный вывод на
> supersede» к транспорту и пропустила его здесь же, на потолке.
- **Поднятие потолка — политика платформы, не кнопка на экране.** Платформа сама владеет
`book.yaml`, поднимает `ceilings.book_usd` и перезапускает прогон. **Проверено кодом, что это
безопасно:** `Ceilings` объявлен в `backend/internal/config/book.go:106`, а в канон `BriefHash`