Correct an erratum about misattribution that misattributed twice, return a closed row's remainder to the lines that carry it, and give the reviewer a worktree path
This commit is contained in:
parent
74e9adcdf9
commit
9aa36f310c
6 changed files with 10 additions and 10 deletions
|
|
@ -109,7 +109,7 @@ D-ссылка грепается по D-логу · mid-flight аддендум
|
|||
связность вместо истинности · соглашательство с чёткой позицией · рационализация задним числом ·
|
||||
слепое пятно моделей, обученных на одном корпусе · экономия усилия на неудобном.
|
||||
|
||||
⚠ **Адверсариальный проход, который ГЕЙТИТ лендинг, судит КОНКРЕТНОЕ дерево: на время прохода дерево морозится либо ревьюеру называется КОММИТ (⚠ испр. 05.09: атрибуция `D39.172` ЛОЖНА — в её теле этого нет, разбор эрратой 05.09-г; носитель нормы — этот файл).** Иначе лендинг посреди прохода делает его отчёт описанием состояния, которого уже нет, и пере-прогон ложится на ревьюера.
|
||||
⚠ **Адверсариальный проход, который ГЕЙТИТ лендинг, судит КОНКРЕТНОЕ дерево: на время прохода дерево морозится, **либо верификатору выдаётся ГОТОВЫЙ ПУТЬ отдельного рабочего дерева** — `git worktree add <путь> <коммит>` (⚠ внесено 05.09, `D39.202` п.8: запрет `checkout` в общем дереве СТОЯЛ и не сработал на 22 агентах приёмки — общее дерево оказалось отцеплено на судимый коммит, и следующий коммит оркестратора ушёл мимо ветки. Запрета мало: промт обязан давать ПУТЬ, а не только запрет). ⚠ Атрибуция `D39.172` у этой нормы ЛОЖНА — в её теле этого нет; носитель — этот файл, разбор эрратой 05.09-г.** Иначе лендинг посреди прохода делает его отчёт описанием состояния, которого уже нет, и пере-прогон ложится на ревьюера.
|
||||
|
||||
**Механика-минимум:** ≥1 верификатор выносит мнение по промту+диффу ДО чтения отчёта · ≥1 ищет
|
||||
дефекты ВНЕ карты отчёта · **проверка обязана различать истинно/ложно, а не внесено/не внесено** —
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@
|
|||
| 258 | **Конструктор `classifyInputFor` можно захардкодить на `ru`/`zh` — вся батарея зелёная, и причина СТРУКТУРНАЯ: через раннер нет ни одной фикстуры с не-ru целью.** Есть только zh→ru и ja→ru. Рефлексивный пин круга 3 ловит «поле нулевое», но не «поле взято не у книги». Пробы предъявлены: →ja книга с китайским выводом под посадкой перестаёт быть →ja. ⚠ Бьёт прямо в цель №2 (ревью-вопрос «заработает ли пара, которой в репо нет, без правки Go»): сегодня ответ на него не может дать ни один тест. Родня — 259 | бэкенд | скоро | фикстура не-ru цели ЧЕРЕЗ раннер + пин «поле взято у книги» | круг 4 петли, X1/X2/X3 |
|
||||
| 259 | **Настоящей латинописьменной цели в репозитории НЕТ — `target-en.txt` не существует, и →en достижим только через пустое объявление.** Следствие: часть общности проверяется рассуждением, а не тестом, и пара, которой в репо нет, не может быть предъявлена живьём ни одним прогоном. Замер общности 04.09: ветвлений Go по конкретному языку два на обе зоны, оба — проверка на пустоту; книжной специфики в Go нет, кроме константы худшей строки банка (строка 40) | бэкенд | скоро (гейт второй пары) | минимальный langpack →en + прогон на нём | замер общности оркестратора 04.09 по требованию владельца |
|
||||
| 260 | **Экран цели калиброван на ОДНОМ сянься и даёт ложный `off_target` на латинице-тяжёлом здоровом русском** (0.461 с пиньинем при пороге). ⚠ Ложный флаг ЭСКАЛИРУЕТ, то есть стоит ПЛАТНОГО хопа за здоровый текст — это деньги, а не только шум. Порог и пол улики обязаны быть пере-калиброваны на корпусе, включающем латиницу-тяжёлый русский | бэкенд | скоро | пере-калибровка на расширенном корпусе + пин границы | самоотчёт бэкенд-сессии о непокрытом, круг 3 |
|
||||
| 261 | **`BilledDecodeError` виден только когда ретрай НЕ спас: успешный ретрай стирает оплаченную попытку из леджера.** Тип заведён, чтобы оплаченный-но-нечитаемый вызов стал ВИДЕН (рантайм доседает по оценке), но `retryLoop` при успехе возвращает ответ и предыдущую ошибку выбрасывает — рантайм видит один успешный ответ и седит его `Usage`. Оплаченный 2xx перед ним не попадает никуда. ⚠ Бьёт не в отчётность, а в ЦЕЛОСТНОСТЬ потолка: допуск выдан под ОДНУ оценку, а под ней могло пройти до трёх запросов (`MaxAttempts` 3), и `Reserve` об этом не узнает. Комментарий рядом сам говорит «each retry is a new billed 2xx» — авторы знали и закрыли только детерминированный случай (усечение). ⚠ ЧАСТОТА пути НЕ измерена | бэкенд | скоро (вместе с денежным паком) | единица учёта = единица биллинга + вендор-факт по правилу квирков | чтение под вопрос, бэкенд-сессия 04.09 |
|
||||
| 261 | ⛔ **ОСТАТОК СНЯТОЙ СТРОКИ 277 ЖИВЁТ ЗДЕСЬ (возвращён 05.09 по ревью — при закрытии 277 он едва не потерялся): `PD-441` закрывается СОСТАВОМ 277 + 261 + 262, брать ОДНИМ паком.** Пак «денежный стоп» (акт D39.206) снял только ОТМЕНУ допущенного; **структурный корень невидимого расхода — эта строка**, а сверх-утверждение комментария ветки отмены — строка **262**. ⇒ платформенной зоне: `PD-441` закрывать «паком денежного стопа» НЕЛЬЗЯ, он закрыт наполовину. **`BilledDecodeError` виден только когда ретрай НЕ спас: успешный ретрай стирает оплаченную попытку из леджера.** Тип заведён, чтобы оплаченный-но-нечитаемый вызов стал ВИДЕН (рантайм доседает по оценке), но `retryLoop` при успехе возвращает ответ и предыдущую ошибку выбрасывает — рантайм видит один успешный ответ и седит его `Usage`. Оплаченный 2xx перед ним не попадает никуда. ⚠ Бьёт не в отчётность, а в ЦЕЛОСТНОСТЬ потолка: допуск выдан под ОДНУ оценку, а под ней могло пройти до трёх запросов (`MaxAttempts` 3), и `Reserve` об этом не узнает. Комментарий рядом сам говорит «each retry is a new billed 2xx» — авторы знали и закрыли только детерминированный случай (усечение). ⚠ ЧАСТОТА пути НЕ измерена | бэкенд | скоро (вместе с денежным паком) | единица учёта = единица биллинга + вендор-факт по правилу квирков | чтение под вопрос, бэкенд-сессия 04.09 |
|
||||
| 262 | **Комментарий ветки отмены — сверх-утверждение: «No 2xx ever arrived: nothing was billed» описывает ветку ШИРЕ, чем она есть.** Верно для отказа соединения, DNS, таймаута до первого байта и терминального 4xx; ложно для вызова, который отменили МЫ после начала генерации — он приходит в ту же ветку через `context.Canceled`. Правка отложена намеренно: ветка денежная, лечение структурное (см. 261), однострочная правка фразы разъедется с решением | бэкенд | скоро (вместе с 261) | привести ветку и её описание к одному радиусу | чтение под вопрос, бэкенд-сессия 04.09 |
|
||||
| 263 | **Дизъюнкты предупреждения банкноты и `forWrite` не прибиты по отдельности** (позитивная фикстура без обоих входов, негативная — с обоими): пережили посадки «нет контраста», «нет пака», «предупреждать и на read-open». **`WB15` несёт тот же дефект ложного пина, что найденный и починенный `WB36`** — одиночный сдвиг порога под `TestGoldenDeterminism`: на чистом литерале голден не двинется и запись выживет при целой гарантии. **AST-тест исчерпаемости парсит ТОЛЬКО `disposition.go`** — `FlagReason`, объявленный в другом файле, в карту не попадёт при зелёном тесте. **Дайджест корпуса не покрывает `provenance`** — адрес пере-снятия, подмену которого дайджест не видит | бэкенд | когда-нибудь | четыре независимых пина | круг 4 петли, X11/X12/X13 · WB15 · X9 · X30 |
|
||||
| 265 | **Питоново зеркало полигона держит ВТОРУЮ копию таблицы плейсхолдеров движка, и она разошлась: `genre` есть, `book_id` нет.** `eval/bank_arbitration/editor_wire_probe.py` — ПЛАТНАЯ проба, читающая ШИППИНГОВЫЙ `backend/prompts/zh-ru/editor.md`, на неё ссылаются ещё **25** скриптов (`grep -rl editor_wire_probe eval --include=*.py`; ⚠ испр. 05.09, первая редакция говорила «девять»); 27 промтов под `eval/` несут `{{genre}}`, который движок ОТКАЗЫВАЕТСЯ собрать при загрузке. ⇒ замеры идут на проводе, которого в проде не существует, и это «третий путь», которого в Go больше нет. ⚠ Зона ПОЛИГОНА — чинит она, носитель заведён оркестратором пингом | полигон | скоро (перед следующим платным замером) | зеркало читает таблицу движка, а не держит копию | передано бэкенд-сессией 04.09, чужая зона |
|
||||
|
|
@ -332,7 +332,7 @@
|
|||
| 279 | **ШАГ 3, КОНТРАКТ (минор, полоса ломающих правок мажора 0 законна): заказ объёмом.** `ceiling_chapters` → `chapters` со смыслом ОБЪЁМА (`null` = вся книга) · `CeilingBounds{min,max,default}` → `OrderOptions{chapters_left, affordable_chapters, verdict: covers_all|covers_part|covers_none, blocked}` · `PausedReason` += `run_limit_reached` (и `credit_exhausted` СТАНОВИТСЯ правдой — сегодня лжёт при 34% баланса, наблюдение H14) · `Run` += `ordered_chapters`/`delivered_chapters`. ⚠ Фразы — ДАННЫМИ по коду причины и локали, не литералом. ⚠ **ПЕРЕ-СНЯТО 05.09 под D39.196:** наружу ВЫХОДЯТ баланс, потолок заказа и холд — деньгами; контракт получает `balance`, `estimate{expected, hold}` под выбранный заказ, границы денежного ползунка `{min: неделимый шаг, max: баланс}` и `shortfall` у паузы; процент остатка остаётся СИГНАЛОМ «мало/пусто». НЕ выходят: цены моделей, стоимость стадий и вызовов, структура НАШИХ расходов. Плюс `OrderOptions` обязан нести ТРИ вида заказа (вся книга · знаки · до главы N), а не только главы. Ремедиа-таблица `resumeRun` упрощается: «Продолжить» — новый прогон ТОГО ЖЕ заказа | контракт | скоро | минор контракта одним актом с платформенной половиной | согласование 04.09 |
|
||||
| 280 | **ШАГ 4, ПЛАТФОРМА: заказ живёт на КНИГЕ, холд считается от проекции, `--max-units` наконец едет в argv.** `books.ordered_through_chapter` (null = вся книга) — сегодня интент живёт на ПРОГОНЕ, оттого и неловкость «поднять лимит = НОВЫЙ прогон с бо́льшим `ceiling_chapters`»; с заказом на книге «Продолжить» после пополнения тривиален, и дверь пере-прохода встаёт рядом вторым типом заказа. Холд = `min(баланс, проекция × k)`; `bookCap = committed + холд` (`PD-158` цел). В argv добавляется `--max-units` = сумма юнитов заказанных глав минус доставленные. Удаляются `DefaultPerChapter`, `Scale` и `draftWork`: план движка становится РАВЕН заказу, и «черновики на весь потолок при нуле готовых глав» исчезает структурно. Закрывает `PD-410`, `PD-440`, `PD-446`. ⚠ **ПРЕДУСЛОВИЕ, названное отдельно: `PD-422`** — `--resnapshot` передаётся УСЛОВНО, а условие ставит только правка банка; рост авто-банка от майнинга флага не ставит. Частичный заказ на майнящей книге растит банк ⇒ следующий заказ без `--resnapshot` умрёт на снапшот-гарде, холд взят, попытка сожжена. Взять В ТОТ ЖЕ пак | платформа | скоро | заказ на книге + холд от проекции + проводка `--max-units` + PD-422 | согласование 04.09 |
|
||||
| 281 | **ЗАМЕР: сколько наших денег стоит тысяча ПЛОТНЫХ и тысяча РАЗРЕЖЕННЫХ знаков по стадиям и парам.** Цель — НЕ константа (D39.165 п.1г прямо запрещает ставку константой), а **дисперсия проекции**: коэффициент k для холда и честность вердикта «хватит ли». Снимать есть из чего и это $0: `find -L books` даёт 162 базы прогонов, в `request_log` лежат `chapter · chunk_idx · stage · prompt/completion_tokens · cost_usd · tm_hit`, исходник по юниту отдаёт `tmctl export --pairs` бесплатно. Метод: по юниту плотные/разреженные знаки против суммы `cost_usd` при `tm_hit=0`, по стадиям; хвост ретраев и эскалаций считать ОТДЕЛЬНО; базы до 16.08 пере-прайсить по токенам. ⚠ Гейт для коэффициента холда в строке 280 | полигон | скоро (гейт строки 280) | замер по 162 базам, $0 | согласование 04.09, вторая редакция |
|
||||
| 282 | ⛔ **ЧИСЛО, ПОДПИСАННОЕ «ЗНАКОВ», СЧИТАЕТ РУНЫ ПОТОКА ЗАПИСИ ФАЙЛА — что для UTF-8 txt И ЕСТЬ знаки, а для EPUB даёт руны ZIP-АРХИВА.** ⚠ Заголовок первой редакции («считает байты») — противоположная полуправда, испр. 05.09: ложно оно для EPUB, GB18030 и UTF-16, а не всегда. Проверено оркестратором по коду: `platform/internal/books/books.go`, греп `type counter` — счёт идёт по не-продолжающим байтам UTF-8 ПОТОКА ЗАПИСИ файла, а не по тексту; там же комментарий признаёт приближение для GB18030. Наружу уходит как `character_count` (`platform/internal/httpapi/v0.go`), на экране подписано `'about.characters': 'Знаков'` (`frontend/src/i18n/ru.ts`). ⇒ Живая ложь на продуктовом экране, и она же — вторая ненадёжная единица, найденная тем же вопросом «откуда берётся число». **Основой страницы быть не может.** Лечение: переименовать в размер файла ЛИБО заменить манифестной суммой знаков движка (строка 278). ⚠ Фронт заморожен — подпись правится при разморозке, число на платформе раньше | платформа+фронт | скоро | снять ложную подпись + заменить источник на манифест движка | согласование 04.09; проверено оркестратором по коду |
|
||||
| 282 | ⛔ **ЧИСЛО, ПОДПИСАННОЕ «ЗНАКОВ», СЧИТАЕТ РУНЫ ПОТОКА ЗАПИСИ ФАЙЛА — что для UTF-8 txt И ЕСТЬ знаки, а для EPUB даёт руны ZIP-АРХИВА.** ⚠ Заголовок первой редакции («считает байты») — противоположная полуправда, испр. 05.09: ложно оно для EPUB, GB18030 и UTF-16, а не всегда. Проверено оркестратором по коду: `platform/internal/books/books.go`, греп `type counter` — счёт идёт по не-продолжающим байтам UTF-8 ПОТОКА ЗАПИСИ файла, а не по тексту; там же комментарий признаёт приближение для GB18030. Наружу уходит как `character_count` (`platform/internal/httpapi/v0.go`), на экране подписано `'about.characters': 'Знаков'` (`frontend/src/i18n/ru.ts`). ⇒ Живая ложь на продуктовом экране, и она же — вторая ненадёжная единица, найденная тем же вопросом «откуда берётся число». **Основой страницы быть не может.** Лечение: переименовать в размер файла ЛИБО заменить манифестной суммой знаков движка — ✅ **источник ПОСТРОЕН**: `source_chars` по юниту в `manifest --json` (лендинг `81a89e9`, акт D39.206; строка 278 закрыта и снята). Остаток строки — платформенная половина: взять число и снять ложную подпись. ⚠ Фронт заморожен — подпись правится при разморозке, число на платформе раньше | платформа+фронт | скоро | снять ложную подпись + заменить источник на манифест движка | согласование 04.09; проверено оркестратором по коду |
|
||||
| 283 | **СТРУКТУРА ГЛАВ ДЛЯ ВЫДАЧИ — отдельная задача, которую «страница» НЕ отменяет, и она гейтит бету для не-CJK и EPUB.** Билдер кладёт по одному XHTML на главу движка и сам признаёт, что ридер делает главу из каждого документа spine (`backend/internal/bookfile/epub.go`) ⇒ **для не-CJK txt читатель получает книгу ОДНИМ ПОЛОТНОМ при любой единице заказа**. Состав — этап 1 `research/27`: EPUB по nav/NCX (обязательно по стандарту), FB2, индуктор оглавления для txt, разрез по ДАННЫМ ПАРЫ вместо захардкоженного CJK (сегодня асимметрия: распознавание строки-заголовка данные пары читает — `configs/langpacks/zh-ru/heading.txt`, — а РАЗРЕЗ на главы нет). ⚠ Делать в единственном окне пере-снапшота, пока платная книга одна: перекрой двигает нарезку. Пере-скоуп строк 160–162 | бэкенд | скоро (ДО открытия беты не-CJK и EPUB-входам) | этап 1 research/27 своим паком | согласование 04.09, вторая редакция |
|
||||
| 284 | **НАЗВАНИЕ КНИГИ И ЗАГОЛОВКИ ГЛАВ ИДУТ ЧЕРЕЗ ТЕРМИНЫ — ОТДЕЛЬНОЙ СТАДИЕЙ (решение владельца 05.09).** ⚠ **СЮДА ЖЕ ПЕРЕЕХАЛ ОСТАТОК ЗАКРЫТОЙ СТРОКИ 274 (D39.201 п.7): доставка имени В ФАЙЛ.** Платформенная половина построена — имя вычисляется ПРИ СКАЧИВАНИИ (`platform/internal/httpapi/v0.go`, греп `exportName`), внутрь файла не пишется намеренно: движок сворачивает `title` в `BriefHash` → снапшот → каждый request-hash, то есть запись в `book.yaml` отказала бы следующему прогону недопереведённой книги и стоила бы ПЕРЕ-ОПЛАТЫ книги целиком. **ФОРМА ОПИСАНА, ПАТЧ НЕ ПРОВЕРЕН** (слово платформенной зоны, принято дословно): путь — `tmctl build --title` аргументом при спавне, прецедент `--ceiling-usd`, но НЕ предъявлено исполнением, что движок примет незнакомый флаг без правки разбора аргументов — по закону шва там громкий отказ по построению. Остаток регистра — `PD-450`. Сегодня их не переводит НИКТО: `dc:title` берётся из `book.yaml` как есть (`backend/internal/bookfile/epub.go`, греп `dc:title`), заголовок главы собирается детерминированно шаблоном из langpack (`backend/configs/langpacks/zh-ru/heading.txt`, `template Глава {n}`). ⇒ Русский EPUB приезжает в читалку с китайским названием — ломается первое, что видит человек. Владелец: «пусть едет как термины, причём отдельные, то есть как-то надо называть эту стадию». ⚠ Значит у стадии своё имя, свой бюджет и своя ПОДПИСЬ: название книги владелец утверждает так же, как утверждает термин. ⚠ Родня — строка 274 (ручка переименования у пользователя) и открытый лист владельца «что печатать на титуле и в имени файла» (D25.1): механизм строится, СЛОВО остаётся за владельцем | бэкенд | скоро | стадия перевода заголовков + подпись владельца | решение владельца 05.09 |
|
||||
| 285 | **FAIL FAST ПРИ ЗАГРУЗКЕ вместо приёма-и-удаления (решение владельца 05.09).** Сегодня при загрузке проверяется ТОЛЬКО размер (`platform/internal/httpapi/middleware.go`, греп `LimitBody`); понять, есть ли в файле книга, умеет лишь движок и лишь при разборе — то есть ПОСЛЕ приёма и записи, а на классе «источник нечитаем» интейк УДАЛЯЕТ загрузку. Владелец: «почему просто не fail fast, как это обычно принято». ⚠ Механизм для этого есть и он $0: `tmctl manifest` режет книгу и возвращает число юнитов без ключей и без единого платного вызова, и платформа уже умеет его звать. Звать СИНХРОННО на загрузке: либо человек сразу видит «в этом файле книги нет» и файл не принят вовсе, либо получает принятую книгу и её объём. ⇒ **Снимает вопрос про удаление целиком — удалять нечего, если не приняли** (строка 254 закрывается этим). ⚠ Решить: латентность синхронного разбора на большой книге и что показывать, пока он идёт | платформа | скоро | синхронный $0-разбор на приёме + отказ вместо удаления | решение владельца 05.09 |
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
|---|---|---|
|
||||
| Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE |
|
||||
| Бэкенд | активного НЕТ | пак «денежный стоп» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.206** (`81a89e9` + `616a8e4`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **291** (флаг вместо клина, `D39.204`) · **294** (форма «сколько добавить», `D39.203`) · **296** (точечная перегенерация по промаху глоссария, после 295) |
|
||||
| Платформа | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **293** (невидимый для git файл) · **294** (зеркало словаря под минор потока) |
|
||||
| Платформа | активного НЕТ | пак «пустить внутрь можно» ОТРАБОТАН и ПРИНЯТ С ДОФИКСОМ 05.09 — акт **D39.201** (`7e2226a` + `3e84716`), промт в `archive/prompts/` с баннером исхода. Следующая работа зоны — строки **294** (зеркало словаря под минор потока) ⚠ (строка 293 — зона ОРКЕСТРАТОРА, не платформы: правило игнора общее для всех рабочих деревьев клона) |
|
||||
| Полигон | [POLYGON_EXP2223_REDO_SESSION_PROMPT.md](POLYGON_EXP2223_REDO_SESSION_PROMPT.md) (отложенный — [POLYGON_PACKAGE4_SESSION_PROMPT.md](POLYGON_PACKAGE4_SESSION_PROMPT.md), строка 85) | фаза Д ИДЁТ; ⚠ живой носитель курса — в `eval/dovodka/`, какой именно называет зона (⚠ [POLYGON_PHASE_D_HANDOFF.md](POLYGON_PHASE_D_HANDOFF.md) — перекрытый снимок, читать не как курс) |
|
||||
| Фронт | активного НЕТ | **ЗОНА ЗАМОРОЖЕНА** (D39.136 п.2 + D39.147: разморозка отдельным словом владельца, не привязана к P7); перечень первого касания — в зонном журнале |
|
||||
| Контракт | активного НЕТ | канон — `architecture/14-api-contract/`; ⚠ версию брать ФАЙЛОМ (`grep '^ version:' openapi.yaml`), не отсюда: миноры ратифицируются D-нотами и их содержание грепается по реестру нот. |
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
- ✅ ПОСТРОЕНО (адрес — шапка-таблица `09-target-architecture.md`): границы доверия памяти D16 (D39.2) · `tmctl status`+redrive (D15.3) · дешёвые гейты 04-unhappy §6/§9 (`checks.cheapgates`, v2 — D20.4) · output-санитайзер D30.3 (`checks/sanitizer.go`) · автопопуляция G1 — Go-майнером (`internal/miner`, D39.10/D39.14/D39.17), а не спот-локалью из exp06. Живой остаток: **диалог-флаггер парности (D29.1д)** — в `internal/checks` его нет; **чек-лист ja-книги — kana-написания сид-имён вносить aliases руками (D16.4)**.
|
||||
- Реальный прогон end-to-end **приёмочной книги 蛊真人 zh→ru (D18; ja→ru понижен до второго прогона при появлении ja-epub)**. *(этап A ✅ 10.07 — D24; этап B НЕ открыт: пере-прогон исполнен, планка не пройдена — шапка, D39.20/D39.22.)*
|
||||
- Режим онгоинга (`add-chapters`) — **сдвинут в Фазу 1.5**: гейтится resume-экономикой (D15.2 — content-addressed reuse чекпоинтов или селективный redrive; спека в Фазе 1, реализация Ф1.5). До этого онгоинг не продаётся.
|
||||
- Экспорт txt/epub + отчёт (D29.1): ✅ ПОСТРОЕНА ассемблер-часть — `tmctl export` + `checks.ExportNormalize` + паспорт-rollup (`pipeline.ChapterPassport`). НЕ построено (греп по `backend/`, `platform/`, `frontend/` — 0 хитов): `annotations.json`, политика красных, цвет-мап+GREY, `human_override` LOCK; плюс release-state лестница D25.1 — ⚠ **испр. 05.09: reader-facing артефакт УЖЕ ЕСТЬ** (EPUB настоящего платного перевода выдан через API 04.09, D39.194), так что лестница из «до артефакта» стала открытым вопросом владельца ЗДЕСЬ И СЕЙЧАС: какая ступень даёт читателю копию БЕЗ пометки и что печатать на титуле (ПТ-44).
|
||||
- Экспорт txt/epub + отчёт (D29.1): ✅ ПОСТРОЕНА ассемблер-часть — `tmctl export` + `checks.ExportNormalize` + паспорт-rollup (`pipeline.ChapterPassport`). НЕ построено (греп по `backend/`, `platform/`, `frontend/` — 0 хитов): `annotations.json`, политика красных, цвет-мап+GREY, `human_override` LOCK; плюс release-state лестница D25.1 — ✅ **ЗАКРЫТА владельцем 05.09 (`D39.205`): копия БЕЗ пометки = книга БЕЗ ЕДИНОГО ПРОПУСКА, гранулярность — ЮНИТ. Открытого на владельце здесь НЕТ.** ⚠ испр. 05.09: reader-facing артефакт УЖЕ ЕСТЬ (EPUB настоящего платного перевода выдан через API 04.09, D39.194), так что лестница из «до артефакта» стала открытым вопросом владельца ЗДЕСЬ И СЕЙЧАС: какая ступень даёт читателю копию БЕЗ пометки и что печатать на титуле (ПТ-44).
|
||||
|
||||
**Правило 18+:** приёмочный корпус — только SFW. Маршрутизация чувствительного контента — не «канал B» фиксированным составом (состав D19.1/D22 отставлен паком-17: D39.25/D39.26–D39.28, шапка `09-target-architecture.md`), а `content_labels` × `accepts_labels`. Живые ограничения данных: DeepSeek для explicit ЗАПРЕЩЁН его ToS (D14.1); ⚠ эскалация на grok reasoning-ON НЕ снимает эхо на архаичном плотно-ханьском (D22.5); эротику судит только Grok — Gemini fail-closed `PROHIBITED_CONTENT` (D22.6); OpenAI в explicit-роутинг не включать; refusal-blacklist-гейт перед коммитом в TM обязателен (ветка `content_filter` мертва у OpenAI-совместимых — exp07; у Gemini 3.x жива составной строкой — D21.9). **L3-скрин обязателен до первой erotica-книги в проде (D22.7 + D25.4).**
|
||||
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@
|
|||
> далёк в обоих случаях, вывод приёмки не меняется, но в каноне стоит число из гейта, а не из грепа.
|
||||
|
||||
> ⚠ **Эррата 02.09-а (D39.182, «три блокера приёмки закрыты») — у ТРЕТЬЕГО блокера не осталось носителя.** Заголовок и §1 ноты держат счёт «3 блокера», но отчёт пака называет сегодня только два: ревизия доков 02.09 сняла из `backend/docs/MONEY_HONESTY_REPORT.md` разделы «Сверка с заказом по пунктам» и «ПРИЁМКА: три блокера и пять дофиксов» (проверка: греп `^## 9.11` и `^## 1\.` по файлу — пусто, при живом `^## 6.2`). **Третий блокер — вердикт «предъявлено» поверх неработающего пути:** в снятом §1 отчёта вердикты **A0** и **A6** стояли «предъявлено» на НЕПОЛНОЙ проверке и были сняты вместе с блокером 2, а пере-предъявлены посадками `TestAHealthyGlossaryPassIsNotReportedAsALoss` и `TestTheCONSENTGateSeesAnInPlaceSourceEdit` (грепаются по `backend/`). Дословный текст снятых разделов — `git show bd2077b:backend/docs/MONEY_HONESTY_REPORT.md`. Тело ноты не переписывается (D23.3).
|
||||
> ⚠⚠ **Эррата 05.09-г — НОРМА «ДЕРЕВО МОРОЗИТСЯ ЛИБО РЕВЬЮЕРУ НАЗЫВАЕТСЯ КОММИТ» ПРИПИСАНА `D39.172` ОШИБОЧНО; в её теле этого НЕТ.** Проверено: тело `D39.172` (пак `sqlc`) не содержит ни «морозится», ни «КОНКРЕТНОЕ дерево», ни «ревьюер» — оно про то, что чужие застейдженные правки уехали в чужой коммит под чужой подписью, то есть про гигиену коммита, а не про суждение о названном дереве. Ссылка родилась в `D39.174` (передача роли) и оттуда разошлась: в `docs/ORCHESTRATOR_SESSION_PROMPT.md` и в ТРИ ноты 05.09 (`D39.199`, `D39.201`, `D39.206`). ⚠ **Сама норма ВЕРНА и остаётся в силе** — операгивный носитель `ORCHESTRATOR_SESSION_PROMPT.md`, греп `судит КОНКРЕТНОЕ дерево`; ложна только атрибуция. Тела нот не переписываются (D23.3) — читать их через эту эррату. **Класс — ОВЕР-АТРИБУЦИЯ: ссылка на ноту, которая цитируемого не содержит; оркестратор допустил её сегодня ТРЕТИЙ раз** (прежние два: фраза «деньги покидают движок только внутри `spend`», которой в журнале нет, и подномер `D2.3`, оказавшийся про другое). Поймано сплошной вычиткой корпуса.
|
||||
> ⚠⚠ **Эррата 05.09-в (D39.200 п.8б) — «ВСЕ 17 ПРОТУХШИХ ЯКОРЕЙ ТРАНЗИЕНТНЫ» НЕВЕРНО: СЕМЬ ГНИЮТ НА HEAD.** Пункт 8(б) обосновывал отказ чинить якоря тем, что все они целят в код под руками живых сессий, и предъявлял ЧЕТЫРЕ из семнадцати против `git show HEAD:` — четыре действительно стояли точно. **Обобщение с четырёх на семнадцать было выводом, а не замером, и ревизор его опрокинул проверкой всех.** Гниют на HEAD семь, все в `backend/docs/` (дерево этой зоны ЧИСТО, транзиентностью не объясняются): `DISCLOSURE_LAW_DESIGN.md:40` (`quality.go:228`, токен на `:233`) · `:41` (`status.go:684` → `:734`) · `:42` (`status.go:733` → `:817`) · `:43` (`bookbuild.go:221` → `:227`) · `:44` (`status.go:249` → `:275`) — эти СЪЕХАЛИ; а `:264` и `MONEY_HONESTY_REPORT.md:285` целят в `chunkrun.go:40`=`SourceEchoExpected: role == roleTerminologist` — этой подстроки на HEAD НЕТ ВОВСЕ, её съел вайр-батч (`isBankRole`), то есть якорь не съехал, а **умер**. ⇒ Десять остальных транзиентны, как и сказано, но вывод пункта в целом ложен. ✅ **ПОЧИНЕНО ЗОНОЙ 05.09 (`e7d6b3f`): все шесть якорей пере-навешены по содержимому, `--lint` → 0 битых.** ⚠ И зона нашла БОЛЬШЕ, чем было в пинге: из шести пять оказались битыми ЕЩЁ ДО её пака — их скрывало то, что `backend/docs` добавили в корни линта только 04.09; чей это дрейф, она предъявила замером (`RebillBasis` стоял на 275 ещё в `81a89e9^`), иначе пять чужих долгов записались бы ей. ⚠ **Норма, которую это покупает, и она дороже самой ошибки: выборка, предъявленная как доказательство, доказывает ровно себя.** Четыре проверенных якоря обосновывают четыре, а не семнадцать; фраза «я проверил четыре, значит транзиентны все» — тот же класс, что «SURVIVED без доказательства, что посадка меняет поведение». Если проверять все дорого — так и писать: «проверено четыре из семнадцати, остальные НЕ проверены».
|
||||
> ⚠⚠ **Эррата 05.09-г — НОРМА «ДЕРЕВО МОРОЗИТСЯ ЛИБО РЕВЬЮЕРУ НАЗЫВАЕТСЯ КОММИТ» ПРИПИСАНА `D39.172` ОШИБОЧНО; в её теле этого НЕТ.** Проверено: тело `D39.172` (пак `sqlc`) не содержит ни «морозится», ни «КОНКРЕТНОЕ дерево», ни «ревьюер» — оно про то, что чужие застейдженные правки уехали в чужой коммит под чужой подписью, то есть про гигиену коммита, а не про суждение о названном дереве. ⚠⚠ **ИСПР. в тот же час: первая редакция ЭТОЙ ЭРРАТЫ САМА ОВЕР-АТРИБУТИРОВАЛА ДВАЖДЫ** — назвала `D39.201` (её тело `D39.172` не цитирует ВОВСЕ) и пропустила `D39.180` и `D39.202` п.8, которые цитируют; плюс перевернула исток. **Замер:** `grep -n 'D39\.172' 05-decisions-log.md` → тела `D39.174` (×2) · `D39.180` · `D39.199` · `D39.202` · `D39.206`; `git log -S'судит КОНКРЕТНОЕ дерево'` → `0393e7a` (30.08, ПРОМТ) старше `8977001` (`D39.174`). ⇒ **норма родилась в `docs/ORCHESTRATOR_SESSION_PROMPT.md`, а ноты её унаследовали**, и ложную атрибуцию несут: `D39.174` · `D39.180` · `D39.199` · `D39.202` п.8 · `D39.206` + сам промт. ⚠ Поймано внешним ревьюером через час после написания: **эррата про овер-атрибуцию, написанная небрежно, — четвёртый случай того же класса за смену и худший из них, потому что стоит в шапке журнала, куда следующая сессия идёт первой.** ⚠ **Сама норма ВЕРНА и остаётся в силе** — операгивный носитель `ORCHESTRATOR_SESSION_PROMPT.md`, греп `судит КОНКРЕТНОЕ дерево`; ложна только атрибуция. Тела нот не переписываются (D23.3) — читать их через эту эррату. **Класс — ОВЕР-АТРИБУЦИЯ: ссылка на ноту, которая цитируемого не содержит; оркестратор допустил её сегодня ТРЕТИЙ раз** (прежние два: фраза «деньги покидают движок только внутри `spend`», которой в журнале нет, и подномер `D2.3`, оказавшийся про другое). Поймано сплошной вычиткой корпуса.
|
||||
> ⚠⚠ **Эррата 05.09-в (D39.200 п.8б) — «ВСЕ 17 ПРОТУХШИХ ЯКОРЕЙ ТРАНЗИЕНТНЫ» НЕВЕРНО: СЕМЬ ГНИЮТ НА HEAD.** Пункт 8(б) обосновывал отказ чинить якоря тем, что все они целят в код под руками живых сессий, и предъявлял ЧЕТЫРЕ из семнадцати против `git show HEAD:` — четыре действительно стояли точно. **Обобщение с четырёх на семнадцать было выводом, а не замером, и ревизор его опрокинул проверкой всех.** Гниют на HEAD семь, все в `backend/docs/` (дерево этой зоны ЧИСТО, транзиентностью не объясняются): `DISCLOSURE_LAW_DESIGN.md:40` (`quality.go:228`, токен на `:233`) · `:41` (`status.go:684` → `:734`) · `:42` (`status.go:733` → `:817`) · `:43` (`bookbuild.go:221` → `:227`) · `:44` (`status.go:249` → `:275`) — эти СЪЕХАЛИ; а `:264` и `MONEY_HONESTY_REPORT.md:285` целят в `chunkrun.go:40`=`SourceEchoExpected: role == roleTerminologist` — этой подстроки на HEAD НЕТ ВОВСЕ, её съел вайр-батч (`isBankRole`), то есть якорь не съехал, а **умер**. ⇒ Десять остальных транзиентны, как и сказано, но вывод пункта в целом ложен. ✅ **ПОЧИНЕНО: `--lint` → 0 битых.** ⚠ Атрибуция точная: ШЕСТЬ якорей пере-навесила зона коммитом `e7d6b3f`, а СЕДЬМОЙ (`MONEY_HONESTY_REPORT.md:285`) уехал раньше, дофиксом `616a8e4`. ⚠ И номера целей, названные выше по этой эррате, ЗОНА ПЕРЕ-СНЯЛА по содержимому — верить надо её замеру, а не спискам отсюда: продиктованные пингом номера были неверны. ⚠ И зона нашла БОЛЬШЕ, чем было в пинге: из шести пять оказались битыми ЕЩЁ ДО её пака — их скрывало то, что `backend/docs` добавили в корни линта только 04.09; чей это дрейф, она предъявила замером (`RebillBasis` стоял на 275 ещё в `81a89e9^`), иначе пять чужих долгов записались бы ей. ⚠ **Норма, которую это покупает, и она дороже самой ошибки: выборка, предъявленная как доказательство, доказывает ровно себя.** Четыре проверенных якоря обосновывают четыре, а не семнадцать; фраза «я проверил четыре, значит транзиентны все» — тот же класс, что «SURVIVED без доказательства, что посадка меняет поведение». Если проверять все дорого — так и писать: «проверено четыре из семнадцати, остальные НЕ проверены».
|
||||
> ⚠ **Эррата 05.09-б (D39.199 п.3) — ГРАНИЦА ПРИЁМКИ ЗАКРЫЛАСЬ ЧЕРЕЗ НЕСКОЛЬКО МИНУТ ПОСЛЕ АКТА.** Пункт 3 говорит «верификатор №2 успел прогнать 5 записей из 19, остальные 12 принял НА СЛОВО зоны» — это было верно на час написания. Прогон добежал: **19 mutation(s) run, 0 unexpected outcome(s), EXIT=0** — 18 RED плюс `WB62` `survives` как записано. ⇒ Утверждение зоны «все 17 новых записей предъявлены красными» подтверждено **ПРОГОНОМ**, а не со слов; ни один вывод верификатора не пересмотрен. ⚠ Что этим НЕ отменяется: находки вне карты (строки 287–290) сидят ВНЕ авторского списка, и красный прогон авторских записей их не опровергает — в частности `WB58` красна лишь потому, что каталог пары лежит на диске; при его отсутствии та же запись ПЕРЕЖИВАЕТ (строка 290). Остаток границы прежний: `-race` целиком не гонялся, живой 401 на хопе — PLAUSIBLE.
|
||||
> ⚠⚠ **Эррата 05.09-а (D39.84 п.1 и D39.100 К-8) — ЗАПРЕТ «ДЕНЕЖНЫХ ПОЛЕЙ В UI НЕТ ВОВСЕ» ОТОЗВАН ВЛАДЕЛЬЦЕМ, тела нот об этом НЕ ЗНАЮТ.** Тела D39.84 («оплат в MVP нет, денежных полей в UI нет вовсе») и D39.100 («запрет денег на экране D39.84 в силе и НЕ superseded») переписывать нельзя (D23.3), а читающий их ПО НОМЕРУ — как велит канон — видит запрет действующим. **Читать оба через `D39.196`:** владелец 05.09 отозвал запрет, баланс аккаунта, потолок заказа и холд ВЫХОДЯТ наружу деньгами; запрещённым остаётся другое и оно НЕ отменялось — цены моделей, стоимость стадий и вызовов, структура НАШИХ расходов (ПТ-33). ⚠ Носители запрета, которые обязан закрыть пак формы заказа, полным списком (⚠ **испр. 05.09: прежняя редакция называла несуществующую секцию yaml «§Credit» — такой секции в каноне нет, и идущий по списку упирался в пустоту; верный адрес — схема `Usage` и путь `/usage`**): `14-api-contract/openapi.yaml` **§Boundaries** (⚠ испр. 05.09 второй раз: две предыдущие редакции звали этот абзац «§Transport» — секция `## Transport` в файле есть, но денежный абзац лежит в `## Boundaries`; ошибка того же класса, что несуществующий «§Credit») · схема **`Usage`** · **`CeilingBounds`** · `docs/architecture/15-money-path.md` §1 · §4 · таблица §6 · `docs/product-requirements.md` ПТ-35 · **`docs/glossary.md`** · **`docs/architecture/13-tech-debt-anchors.md` §Б-126** · зеркало фронта · `frontend/docs/API_CONTRACT_INPUT.md` §4.8 · `platform/docs/ENGINEERING_STANDARDS.md` (зонный) · **`platform/README.md`** (зонный; добавлен 05.09 — в первых двух редакциях списка его не было). Первая редакция списка в компаньоне канона была НЕПОЛНА — три носителя добавлены ревизией 05.09, ещё один и поправка адреса — ревизией того же дня. ⚠ **Прозаические указатели на отзыв уже проставлены 05.09** в `15-money-path` (§1/§4/§6), ПТ-35, глоссарии и в yaml (`Usage`/`CeilingBounds`/шапка §Transport); ПОЛЯ приезжают паком — схема впереди кода не едет.
|
||||
> ⚠⚠ **Эррата 04.09-д (D39.195) — ПАК НЕ ПРИНЯТ, заголовок ноты ЛОЖЕН, и ошибка классификации — оркестраторская.** Нота объявила движковый вайр-батч «ПРИНЯТ И ЗАКРЫТ» и перевела найденное кругом 4 в строки бэклога **256–264**. **Владелец поправил зону прямо: «сворачивал — да, но сдавать несданную багованную работу не говорил».** Он прав. «Прекратить полировку» было применено к вещам, полировкой НЕ бывшим: ложный пин (`WB15`, тот же дефект, что чинился в `WB36`), близнец денежной дыры на лейбловой ветке `CheckKeys`, разрыв фингерпринта каталога, и семь пинов, которые слабее собственных формулировок. **Отчитаться о баге — не значит его сдать**, и различение это принадлежит владельцу, а не сессии и не оркестратору. ⚠ **Классифицировала зона, но РАТИФИЦИРОВАЛ оркестратор** — ошибка моя не меньше: акт приёмки существует, чтобы такую подмену ловить, а он её узаконил. Зона чинит и держит сдачу; строки 256–264 закрываются её лендингом, а не остаются долгом. ⚠⚠ **ЭТА ЭРРАТА ИСЧЕРПАНА 05.09 АКТОМ `D39.199`: пак ПРИНЯТ С ДОФИКСОМ на приёмочном коммите `74ffe4f`. Читающий её сегодня — читает историю, а не действующее указание** (испр. 05.09: сутки она стояла первой строкой, которую видел идущий к D39.195 по номеру, и предписывала считать пак непринятым). Ниже — как было. **До нового акта пак считать НЕ ПРИНЯТЫМ**; коммиты `b8154cd`/`c77c3ba`/`ecf063e`/`2e13cd1` в дереве остаются (код рабочий и батарея зелёная), но приёмкой они не покрыты. ⚠ Норма, которую это покупает: **свёрнутый круг закрывает ПОИСК, а не ПОЧИНКУ уже найденного** — найденное и не починенное не превращается в долг решением о темпе.
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
1. **Грант.** `Grant` — строка леджера `kind='grant'`, идемпотентная по `(аккаунт, source, source_id)`: `on conflict (user_id, source, source_id) do nothing` (`platform/internal/pgstore/credits.go`, греп `func (s *Store) Grant(`; сама идемпотентность после пака sqlc уехала В ЗАПРОС — `platform/internal/pgstore/queries/credits.sql`, греп `on conflict (user_id, source, source_id) do nothing`). Фри-тир — тот же механизм в ТОЙ ЖЕ транзакции, что создание аккаунта (`platform/internal/pgstore/identity.go`, греп `appendLedger(ctx, tx, userID, "grant"`; ⚠ **дефолт `SignupGrantMicroUSD` — НОЛЬ** (`platform/internal/config/config.go`, греп `SignupGrantMicroUSD:`), а НЕ «5 × 1_000_000» — эта сумма ходила по докам и ложна: предложение «на бете дефолт в НОЛЬ» (D39.110 п.3) ИСПОЛНЕНО, `PD-104` в регистре стоит `fixed(P7, дерево сессии)`).
|
||||
2. **Выбор потолка — шкала в ГЛАВАХ** (D39.110: от 1 до максимума, ноль не выбираем; потолок принадлежит ПРОГОНУ, в `book.yaml` не пишется). **Максимум = Balance КАК ЕСТЬ** (D39.115 п.2а; эррата в шапке D-лога — `docs/architecture/05-decisions-log.md:4`=`Balance КАК ЕСТЬ`): `Hold` — дебет в момент взятия, баланс уже не содержит открытых холдов, повторное вычитание вдвое укорачивает шкалу. Реализация: `pricing.Model.Scale` — `affordable = balance / PerChapter`, кламп по остатку глав, дефолт = верх шкалы (ратифицировано D39.123 п.2е; компромисс «весь баланс под одну книгу» принят осознанно) — `platform/internal/pricing/pricing.go`, греп `func (m Model) Scale(`.
|
||||
3. **Ставка $0.03/глава — конфиг-константа платформы:** `DefaultPerChapter = 30_000` micro-USD (`platform/internal/pricing/pricing.go`, греп `DefaultPerChapter`), переопределяется `PerChapterMicroUSD` (`platform/internal/config/config.go`, греп `PerChapterMicroUSD`). ⚠⚠ **ЧИСЛА НИЖЕ — ИЮЛЬСКИЕ ДЕНЬГИ И С 16.08 НЕ ДЕЙСТВУЮТ (испр. ревизией 02.09).** D39.179 п.1 ратифицировал: DeepSeek пере-пинен под цены, вступившие **16.08 16:00 UTC**, множитель к июльским деньгам **×4.47**. ⇒ по действующему прайсу та же выборка даёт среднюю главу **≈$0.051–$0.085** и максимум **≈$0.168**, то есть константа $0.03 не завышена, а **ЗАНИЖЕНА**, и знак вывода перевернулся. ⚠ Иллюстрация живыми деньгами (НЕ калибровка): холодный прогон 31.08 дал полную цепь главы $0.093 и $0.151 при `projected_book_usd = 1.1377277707` — но это **n=2 главы из десяти**, прогон остановлен снапшот-гардом, промпт черновика был банкнотным вместо конвенционного, и сам отчёт запрещает такое употребление дословно (`archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, греп `калибровать ставку платформы`). **Провенанс ниже — ИСТОРИЯ (D39.165 §1, 28.08):** средняя **$0.0115–$0.0190**, максимум одной главы $0.0375, «завышена в **1.6–2.6×**» — ⚠ но НЕ покрывает максимум: источник (D39.165 §1) добавляет «и отдельные главы её уже пробивают» ($0.0375 против $0.03 = ×1.25), и «купить 10 глав» отдаёт движку $0.30, покупающий ~16–26 глав («денежная ручка с подписью „главы"», `PD-410`). РЕШЕНО: цена — от ОБЪЁМА ИСХОДНИКА (носитель `chapters.units_total`, пишется интейком за $0), настоящий стоп — объёмный потолок В ДВИЖКЕ (см. §2). ⛔ Константу по сегодняшним числам НЕ калибровать (D39.165 ⛔г) — ⚠ **испр. 05.09: гейт ПАЛ вместе со строкой 202** — живой платный прогон отработал 04.09 и показал, что ставка занижена ×4.47; строка 202 закрыта D39.200. Калибровка ставки теперь идёт заказом строк **278 · 281** (проекция цены и замер стоимости тысячи знаков), а не запретом. Исторический провенанс: exp08 v2 $0.0219/глава → ревизия D30.4 +15–25% → округление ВВЕРХ (низкая ставка опаснее высокой — прогон встанет на потолке посреди книги; `platform/internal/pricing/pricing.go`, греп `Provenance, so the number is auditable`). ⚠ **испр. 05.09: движковая половина ПОСТРОЕНА и опубликована** — `expected_usd` по главам, `book_once_usd`, `step_max_usd` в `manifest --json`/`status --json` (лендинг `81a89e9`, акт D39.206). Непостроенной осталась ПЛАТФОРМЕННАЯ половина: `git grep -lE "StepMax|step_max" -- platform/` пусто, то есть числа публикуются и никем не читаются.
|
||||
3. **Ставка $0.03/глава — конфиг-константа платформы:** `DefaultPerChapter = 30_000` micro-USD (`platform/internal/pricing/pricing.go`, греп `DefaultPerChapter`), переопределяется `PerChapterMicroUSD` (`platform/internal/config/config.go`, греп `PerChapterMicroUSD`). ⚠⚠ **ЧИСЛА НИЖЕ — ИЮЛЬСКИЕ ДЕНЬГИ И С 16.08 НЕ ДЕЙСТВУЮТ (испр. ревизией 02.09).** D39.179 п.1 ратифицировал: DeepSeek пере-пинен под цены, вступившие **16.08 16:00 UTC**, множитель к июльским деньгам **×4.47**. ⇒ по действующему прайсу та же выборка даёт среднюю главу **≈$0.051–$0.085** и максимум **≈$0.168**, то есть константа $0.03 не завышена, а **ЗАНИЖЕНА**, и знак вывода перевернулся. ⚠ Иллюстрация живыми деньгами (НЕ калибровка): холодный прогон 31.08 дал полную цепь главы $0.093 и $0.151 при `projected_book_usd = 1.1377277707` — но это **n=2 главы из десяти**, прогон остановлен снапшот-гардом, промпт черновика был банкнотным вместо конвенционного, и сам отчёт запрещает такое употребление дословно (`archive/reports/COLDRUN_V16_REPORT_2026-08-31.md`, греп `калибровать ставку платформы`). **Провенанс ниже — ИСТОРИЯ (D39.165 §1, 28.08):** средняя **$0.0115–$0.0190**, максимум одной главы $0.0375, «завышена в **1.6–2.6×**» — ⚠ но НЕ покрывает максимум: источник (D39.165 §1) добавляет «и отдельные главы её уже пробивают» ($0.0375 против $0.03 = ×1.25), и «купить 10 глав» отдаёт движку $0.30, покупающий ~16–26 глав («денежная ручка с подписью „главы"», `PD-410`). РЕШЕНО: цена — от ОБЪЁМА ИСХОДНИКА (носитель `chapters.units_total`, пишется интейком за $0), настоящий стоп — объёмный потолок В ДВИЖКЕ (см. §2). ⛔ Константу по сегодняшним числам НЕ калибровать (D39.165 ⛔г) — ⚠ **испр. 05.09: гейт ПАЛ вместе со строкой 202** — живой платный прогон отработал 04.09 и показал, что ставка занижена ×4.47; строка 202 закрыта D39.200. Калибровка ставки идёт заказом строки **281** (⚠ испр.: строка 278 ЗАКРЫТА лендингом `81a89e9` и снята — проекция цены построена и опубликована) (проекция цены и замер стоимости тысячи знаков), а не запретом. Исторический провенанс: exp08 v2 $0.0219/глава → ревизия D30.4 +15–25% → округление ВВЕРХ (низкая ставка опаснее высокой — прогон встанет на потолке посреди книги; `platform/internal/pricing/pricing.go`, греп `Provenance, so the number is auditable`). ⚠ **испр. 05.09: движковая половина ПОСТРОЕНА и опубликована** — `expected_usd` по главам, `book_once_usd`, `step_max_usd` в `manifest --json`/`status --json` (лендинг `81a89e9`, акт D39.206). Непостроенной осталась ПЛАТФОРМЕННАЯ половина: `git grep -lE "StepMax|step_max" -- platform/` пусто, то есть числа публикуются и никем не читаются.
|
||||
4. **Холд прироста ДО спавна.** `holdTx` пишет отрицательную строку `('hold', -amount)` и тем же знаком двигает кэш баланса (`platform/internal/pgstore/credits.go`, греп `func holdTx(` — строку леджера пишет `appendLedger(… "hold", -amount …)`, кэш баланса двигает `MoveBalance` внутри неё); нехватка — `ErrInsufficientCredit`. Холд + прогон + попытка + очередь — одна транзакция (`platform/internal/pgstore/runs.go`, греп `func (s *Store) StartRun(`; рестарт — греп `func (s *Store) RestartRun(`; форма D39.123 п.2д).
|
||||
5. **Аргумент движку: `bookCap = committed + прирост×ставка`, БЕЗ reserved — PD-158, дословно из кода: `return m.committed + increment`** (`platform/internal/runs/spawn.go`, греп `return m.committed + increment`). Обе фигуры читаются ОДНИМ вызовом `status --json` перед стартом (`bookMeter` — `platform/internal/runs/spawn.go`, греп `func (s *Service) bookMeter(`; отказы — греп `Absent is not zero`); отсутствие любой из них = отказ спавна («absent is not zero», PD-40). Почему без reserved: write-open движка занулит leftover до первой резервации, значит цифра из read-only status к моменту сравнения уже мертва; ратифицированная ранее формула с reserved переплачивала запасом ровно на leftover сверх холда — исполнено обеими формулами против гейта (D39.123 п.2б, поправка к D39.122(в)). Аргумент ≠ холд: он больше холда на committed (`docs/glossary.md:55`=`ЭТО НЕ ХОЛД — он больше холда`). Фактически ушедшее значение хранится в `run_attempts.ceiling_arg_micro_usd` (PD-144, миграция 00011); потолок уходит argv-шаблоном `{{usd}}` (шаблон — `platform/internal/config/config.go`, греп `CeilingArg`; подстановку делает `platform/internal/runner/engine.go`, греп `{{usd}}`; подстановку и рендер argv делает `platform/internal/runner/engine.go`, греп `func (t CeilingTemplate) Args(`; `platform/internal/runs/runs.go`, греп `func (s *Service) ceilingFor(` — однострочная делегация к нему; `spawn.go` потолок только передаёт); строка 145 закрыта D39.122.
|
||||
6. **Baseline и списание.** `baseline = committed` книги на старте попытки (`platform/internal/runs/spawn.go`, греп `baseline, bookCap := m.committed`); списание попытки = разница счётчика с baseline; счётчик ниже baseline = подменённая БД, сеттлится в ноль с WARN — сами цифры в лог не идут (D39.84; `platform/internal/runs/reconcile.go`, греп `the book's meter reads below`).
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
|
||||
| Дыра | Носитель |
|
||||
|---|---|
|
||||
| **Строка 166** — движковая поверхность оценки $/глава; $0.03 — временная мера беты (П-10 зоны) | `docs/PROGRESS.md`, греп `Движковая поверхность оценки` |
|
||||
| ⚠ **Строка 166 — ДВИЖКОВАЯ половина ПОСТРОЕНА 05.09** (`expected_usd` · `book_once_usd` · `step_max_usd` в `manifest --json`, лендинг `81a89e9`, акт D39.206); дырой осталась ПЛАТФОРМЕННАЯ половина — числа публикуются и никем не читаются (`git grep -lE "StepMax|step_max" -- platform/` пусто). Прежняя редакция звала дырой обе. Движковая поверхность оценки $/глава; $0.03 — временная мера беты (П-10 зоны) | `docs/PROGRESS.md`, греп `Движковая поверхность оценки` |
|
||||
| **Строка 78** — леджер = нижняя граница (биллящийся decode-fail мимо request_log, ≤13% захода на ре-пробе) | `docs/PROGRESS.md`, греп `Леджер денег = НИЖНЯЯ граница` |
|
||||
| **Строка 136** — эскроу/intent (см. §3 п.10) | `docs/PROGRESS.md`, греп `Write-ahead intent` |
|
||||
| *(добавка сборщика)* **PD-157 (minor)** — `day_usd` книги флагом не перекрывается, платформой не виден и не задаётся; в `status --json` дневной фигуры нет | `platform/docs/DEFECT_REGISTER.md`, греп `PD-157` |
|
||||
|
|
@ -66,7 +66,7 @@
|
|||
| Ратификации, на которых стоит этот док | **D39.179** (пере-пин цен 16.08, ×4.47; норма «стабилен чистый ФАЙЛ» — п.4) · **D39.181** (закон раскрытия: признак объёмного стопа едет числом) · **D39.182** (пак «деньги и честность»: план банк-ролей режется до первого вызова; порог согласия без контура банк-ролей) |
|
||||
| Код денег движка | `backend/internal/store/ledger.go` · `store/store.go` · `pipeline/stagerun.go` · `pipeline/status.go` · `config/book.go` · `pipeline/rebill.go` (согласие на пере-оплату) · `pipeline/terminologist.go` (книго-широкие бюджеты банк-ролей) · `pipeline/volume.go` (объёмный потолок) |
|
||||
| Дефекты денег | `platform/docs/DEFECT_REGISTER.md` (PD-104·113·144·157·158·159) |
|
||||
| Бэклог-строки | `docs/PROGRESS.md` строки 78 · 136 · 137 · 166 (135 и 165 закрыты D39.131) |
|
||||
| Бэклог-строки | `docs/PROGRESS.md` строки 78 · 136 · 137 (⚠ испр. 05.09: **166 отсюда СНЯТА** — движковая половина оценки построена и опубликована лендингом `81a89e9`; открыта только платформенная) (135 и 165 закрыты D39.131) |
|
||||
| Контракт наружу | `14-api-contract/openapi.yaml` (`CeilingBounds`, `Usage`); ПТ-35 |
|
||||
| ⚠ Запрет денег на экране — **ОТОЗВАН 05.09 (D39.196)**. Живым остаётся ПТ-35 в его четырёх пунктах: цены моделей · стоимость стадий · стоимость ВЫЗОВОВ · структура наших расходов. ⚠ И различение `D39.203`, без которого пункт про вызовы читается неверно: наружу идёт ДО-ВЫЗОВНАЯ ОЦЕНКА (резервация перед звонком), а запрет написан про СТОИМОСТЬ — что списано по факту; сеттлмент не выходит | D39.84; D39.100/К-8; ПТ-35; **D39.196**, эррата 05.09-а |
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue