Close the acceptance of both packs: four register rows move to the closed era, the money path stops promising N units for N, and the two spent prompts go to the archive with their outcome
This commit is contained in:
parent
f8d3e9adc6
commit
1ae60e6c15
8 changed files with 60 additions and 13 deletions
|
|
@ -132,7 +132,7 @@ backend/internal/runevents/runevents.go:202-204 «its PRESENCE is the boolean:
|
|||
- «на входе **3** попадания» у грепа `can never quote a different number` — на входном коммите в
|
||||
названной области попадание ОДНО.
|
||||
- «все **18** строк» линта — гейт печатает **19**, и девятнадцатый создан самим отчётом
|
||||
(строка, цитирующая `docs/PROGRESS.md:679`).
|
||||
(строка, цитировавшая мёртвый якорь в самом отчёте).
|
||||
- «в файле **485** строк» — 499: число снято до того, как отчёт дорос.
|
||||
|
||||
**Делай РОВНО так:** пере-считать каждое своей командой и вписать команду рядом с числом.
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -245,3 +245,5 @@
|
|||
| D39.184 | 01.09 | **Передача роли оркестратора №21 → №22.** Смена приняла P12 + минор 0.9.0, холодный прогон, закон раскрытия и одиннадцать экземпляров — D39.179–D39.182; `arch-3` закрыт. Девять названных ошибок оркестратора. ⚠ Класс смены: **отсутствие в своей области видимости принято за отсутствие вообще — четырежды у трёх участников**; норма — отрицательный результат с ПОЛОЖИТЕЛЬНЫМ КОНТРОЛЕМ | жив | ЖИВОЕ: заказ владельца 01.09 — ревизия доков на протухшее, планы бэкенда и платформы, вынос в архив | передача процесс |
|
||||
| D39.185 | 01.09 | **Четыре строки бэклога закрыты лендингами 31.08, а в таблице стояли открытыми:** 194 (деньги банк-ролей в проекции, A10) · 238 (деньги слепы к правке исходника на месте, A6) · 239 (`checkWave` не видел исчезнувшую стадию, A7+A12) · 240 (оплаченный стоп подписи мог исчезнуть молча, P12). ⚠ 238 и 239 стояли в шапке секции «Бэкенд» как СВОБОДНАЯ РАБОТА ЗОНЫ. Два опровержения текста 194 и честная граница: проекция денег стала НИЖНЕЙ | жив |
|
||||
| D39.186 | 02.09 | **Ревизия и чистка документации ВСЕХ зон по заказу владельца.** 1432 утверждения проверены исполнением, 130 живых находок (6 блокеров); три прохода агентами + финальный: живые доки 4.41 → 3.68 МБ (снято 731 КБ), вход сессии 347 → ~270 КБ. Контроль — агент Fable 5.1 сквозным контекстом: 18 потерь защищённых классов и ~27 дефектов реза найдены и починены. Нормы переведены в гейты: префикс веса бэклога · минимум токена якоря 12 знаков; линтер 52 → 0, сверяемых 16% → 22%. Строки бэклога 194/238/239/240 закрыты D39.185. | жив |
|
||||
| D39.187 | 03.09 | **Приёмка бэкенд-пака «число согласия» и его дофикса.** Принят исполнением в два круга: батарея зелёная, тестов 1083→1105 при нуле удалённых, каталог мутаций 73→92 и все 19 новых КРАСНЫЕ. ⚠ Норма, купленная паком: **приёмка обязана сажать СВОИ мутации, а не пере-гонять чужие** — первый круг пропустил три неприбитые гарантии, нашли их только собственные посадки. Ратифицированы СВЕРХ заказа два правила денежного пути (обход `usd()` через $0-вызов · раскрытие $0-строки с чужим новейшим вызовом) — направление п.1 D39.150 | жив | ЖИВОЕ: развилка стоп-строки прибита с одной стороны · граница `bound()` не прибита · семантика переноса отложена словом владельца 03.09 | приёмка бэкенд деньги мутации |
|
||||
| D39.188 | 03.09 | **Приёмка платформенного пака P13 и его дофикса.** Заказ пункта 3 был НЕДОСТАТОЧЕН: голое пере-упорядочивание отказов расширяло класс — зона доказала это до и после правки, завела `PD-438` (major) и вылечила остановкой чтения на чужом handshake'е; приёмка опровергла ОБОСНОВАНИЕ («Nothing of ours can follow»), дофикс дал припаркованной попытке `ErrForeignStreamAhead` + ресинк. Гейты доведены до своих обещаний; 20 посадок приёмки красны. Закрыты `fixed(6ae3e76)`: `PD-89` · `PD-168` · `PD-214` · `PD-426` | жив | ЖИВОЕ: записка о хосте различает по имени машины, а оно общее · `PD-439` и правило ухода из класса — на оркестраторе · остаток `PD-374`: имя условия через константу невидимо | приёмка платформа шов гейты |
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Журнал решений оркестратора — контракт D1–D39.186 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
|
||||
# Журнал решений оркестратора — контракт D1–D39.188 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
|
||||
|
||||
> **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто:
|
||||
> ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 живёт ниже в этом файле (голова D39.106+).
|
||||
|
|
@ -39,6 +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).
|
||||
> ⚠ **Эррата 03.09-а (D39.170) — формула «покупатель платит за N юнитов и получает ровно N» БОЛЬШЕ НЕ ВЕРНА.** Пак «число согласия на пути второй покупки» (лендинг 03.09) закрыл вторую половину строки 232: юнит, который прежний прогон НАЧАЛ и не отгрузил по оси `finalStageWave`, дописывается ВНЕ гранта. Отсюда грант `--max-units N` оплачивает ДО **2N** выходных юнитов — замерено приёмкой на живом раннере (грант 2 → `Paid()=4`, шесть вызовов провайдера), и тем же замером подтверждено, что в перенос попадает даже юнит, ФЛАГНУВШИЙСЯ без текста, то есть каждая следующая покупка платит за его пере-атаку заново. ⛔ **Семантика НЕ ратифицирована: слово владельца 03.09 — «подумаем на этот счёт», решение отложено.** До него `--max-units` держит не деньги, а слоты; деньги держит только `--ceiling-usd`. Тело D39.170 не переписано (D23.3); живой носитель формулировки — `15-money-path.md`, пункт про `--max-units`.
|
||||
|
||||
> ⚠ **Эррата 02.09-в — ЧТО РЕАЛЬНО СДЕЛАНО С ТЕЛАМИ 02.09, слово владельца.** Ревизия доков сняла из тел нот **девять** кусков (D39.124 · D39.128 · D39.153 · D39.155) — пересказы и дубли, не решения. Проверено перед решением: у КАЖДОЙ снятой строки отличительный токен живёт ещё в 4–61 файле дерева (`SweepSessions` — 6, `UnsettledRuns` — 15, `RepeatableRead` — 4), уникально не потеряно НИЧЕГО. **Владелец 02.09 велел не откатывать:** заказ был вырезать мусор, а откат вернул бы в журнал ровно то, что вырезали сознательно. ⇒ D23.3 действует по-прежнему для РЕШЕНИЙ и клеймов; сжатие пересказа внутри тела с сохранением решения — не нарушение, а разрешённый случай. Прежняя редакция этой эрраты утверждала, что тела не правились вовсе, и противоречила девяти правкам рядом — снято.
|
||||
|
||||
> ⚠ **Эррата 02.09-б (форма якорей в ТЕЛАХ этого файла) — правке не подлежит, читать с поправкой.** Дисциплина D23.3 запрещает переписывать тела, поэтому четыре голых `файл:строка` внутри нот остаются как есть, и часть из них уже съехала: в теле **D39.134** (греп `deploy/README.md:131` — цель ЖИВА, строка `pipeline:` рецепта) · в теле **D39.153** (греп `docs/STACK.md:11` — цель ЖИВА, строка редактора `deepseek-v4-pro`) · в теле **D39.165** (греп `17-seam-inbound-law.md:102` — цель УЕХАЛА, там пустая строка; живой адрес будущих дверей — `docs/architecture/17-seam-inbound-law.md`, греп `| дверь | откуда следует |`) · в теле **D39.168** (греп `17-seam-inbound-law.md:62-64` — цель ЖИВА, закон шва п.3, но названный рядом `backend/internal/pipeline/status.go:148-149` УЕХАЛ на `:155-156`=`const statusVersion`). Правило разбора для всех новых записей: якорь — `путь:строка=подстрока` либо греп, голых `file:line` не вписывать (строка бэклога 219).
|
||||
|
|
@ -1955,3 +1957,27 @@ Fable 5.1 со сквозным контекстом (решение владе
|
|||
строка защищённого класса без адреса в том же коммите» (все 18 потерь смены несли такой маркер) ·
|
||||
батчи Б14/Б15/Б17 · 11 остатков и 2 открытых находки реестра · норма письма доков — черновик разобран
|
||||
контролёром, владельцу не вносилась. Седьмой слайс журнала **вычеркнут** замером, не отложен.
|
||||
|
||||
## D39.187 — ПРИЁМКА БЭКЕНД-ПАКА «ЧИСЛО СОГЛАСИЯ НА ПУТИ ВТОРОЙ ПОКУПКИ» И ЕГО ДОФИКСА: принят по исполнению; два правила денежного пути, внесённые СВЕРХ заказа, ратифицированы; развилка стоп-строки прибита с одной стороны (03.09). ✅
|
||||
|
||||
**1. Метод приёмки — два круга, оба ИСПОЛНЕНИЕМ.** Первый круг — десять линз (пять на зону) с адверсариальным опровергателем на каждую: находка, которую опровергатель не смог воспроизвести СВОЕЙ командой, в свод не шла. Второй круг — по дофиксу, отдельным проходом с поединичным вердиктом по каждому пункту наряда. ⚠ **Норма, купленная этим паком: приёмка обязана САЖАТЬ СВОИ мутации, а не пере-гонять чужие.** Первый круг принял шесть каталожных записей как доказательство и пропустил ТРИ гарантии, которые пак объявил своими и не прибил; нашли их только собственные посадки приёмки. Второй круг тем же способом нашёл четвёртую.
|
||||
|
||||
**2. Проверено и держится.** `make battery` → `EXIT=0`, `0 issues`, 18 пакетов `ok`, скипов три и те же. Тестов **1083 → 1105**, удалённых имён **НОЛЬ** (пофамильный дифф). Каталог мутаций **73 → 92**, и **все 19 новых записей КРАСНЫЕ** одним прогоном `tmmutate` (`19 mutation(s) run, 0 unexpected outcome(s)`). Четыре обязательства `D39.150 п.1` исполнены все, включая четвёртое: старые утверждения о точности сняты во ВСЕХ пяти местах (контроль на `e85295d` — пять строк). Инвариант направления ошибки держится по построению: в `repriceCheckpoint` цена только повышается. Правки существующих тестов проверены на МОТИВ (D39.183) — ослаблений нет, все стали сильнее. Границы целы: схема хранилища, форма манифеста, версия контракта, `StreamVersion` не двинуты, поле на провод НЕ добавлено (это был явный запрет наряда).
|
||||
|
||||
**3. РАТИФИЦИРОВАНО СВЕРХ ЗАКАЗА — два правила денежного пути.** Сессия внесла их по находке собственного проверяющего, а не по наряду, и объявила по D39.183: **(а)** обход `usd()` — «вызов, стоивший ноль, никогда не останавливает обход»; **(б)** раскрытие `$0`-строки, чья позиция несёт чужой новейший вызов. Оба лежат в направлении, которое ратифицировано `D39.150 п.1` («округлять ВВЕРХ при невозможности знать» + раскрывать базис), обе посадки (`FC8-*`) красны, откат к прежнему правилу краснит пять и два теста соответственно. **Принимаю их как исполнение духа п.1, а не как самовольство**, и записываю здесь именно потому, что в промте пака этого правила не было: следующая сессия обязана видеть, что правило ратифицировано ЗДЕСЬ, а не выведено из кода.
|
||||
|
||||
**4. ОСТАЁТСЯ ОТКРЫТЫМ — дофикс второго круга.** (а) **Развилка операторской строки прибита с ОДНОЙ стороны:** дофикс развёл предложение на «книга кончилась» и «грант придержал», прибил новую ветку и не прибил старую — две посадки приёмки в новый код `VolumeStop.String()` переживают ВЕСЬ пакет, и под ними в смешанном состоянии (`Carried=3, Left()=1`) печатается «reached the END of the book … Still in the book: 1 unit(s) NEVER delivered», то есть то же самопротиворечие в зеркальной форме. Лог-развилка при этом прибита с обеих сторон. (б) Граница `bound()` (`Carried > 0` → `Carried > 1`) не прибита: прогон с ОДНИМ перенесённым юнитом на конце книги не отдаёт отчёт вовсе. (в) Три числа отчёта протухли снова — тем же способом, каким протухли в первый раз: сняты до последней правки каталога.
|
||||
|
||||
**5. НЕ ЗАКРЫТО ПАКОМ И НЕ ЕГО ВИНА.** Семантика переноса слота — **слово владельца 03.09 «подумаем на этот счёт»**, решение отложено. Замер приёмки: грант `--max-units 2` оплачивает **четыре** выходных юнита и делает шесть вызовов провайдера; в перенос попадает и юнит, ФЛАГНУВШИЙСЯ без текста, то есть каждая следующая покупка платит за его пере-атаку заново. Живая формулировка приведена в соответствие — `15-money-path.md` (пункт `--max-units`) и эррата **03.09-а** к `D39.170`: формула «покупатель платит за N и получает ровно N» больше не верна, тело ноты не переписано (D23.3). Гарантия Б3(а) прибита на состоянии, недостижимом по построению (`Delivered == Carried` при исходе `unitFresh`), — это объявлено в докстринге теста и остаётся долгом покрытия, а не подгонкой. (03.09.2026, оркестратор №22) ✅
|
||||
|
||||
## D39.188 — ПРИЁМКА ПЛАТФОРМЕННОГО ПАКА P13 «шов возврата оплаченного прогона» И ЕГО ДОФИКСА: принят; заказ пункта 3 был НЕДОСТАТОЧЕН, зона это доказала и вылечила глубже (03.09). ✅
|
||||
|
||||
**1. Главное этого пака — не то, что он сделал, а то, что он опроверг.** Промт заказывал свойство «чужая строка не карантинит нашу проекцию» через понижение трёх отказов при известном `want`. Сессия воспроизвела на копии, что владение потоком не переживает проход свипа (`mine` — возвращаемое значение, следующий проход выводит его заново из `pos.LastSeq > 0`), и что **заказанная правка РАСШИРЯЕТ старый класс** с законных чужих строк на любые: до пака травила проекцию законная чужая строка, после голого пере-упорядочивания травили бы обе. Завела `PD-438` (`major`) и вылечила остановкой чтения на чужом handshake'е. ⚠ **Приёмка первого круга опровергла ОБОСНОВАНИЕ этого лечения:** «Nothing of ours can follow» ложно — при повторном запуске той же попытки платформа отдаёт тот же id (`spawn.go`, `engineStreamID`), а движок минтит СВЕЖИЙ (`backend/internal/pipeline/events.go`, `fresh := obs.NewTraceID()`), то есть «чужой» hello пишет ЖИВОЙ процесс нашей же попытки. Дофикс это снял и дал припаркованной попытке имя и починку: `ErrForeignStreamAhead` + WARN с троттлингом + вход в `maybeResync`.
|
||||
|
||||
**2. Проверено и держится (второй круг, 20 собственных посадок приёмки).** `make check` под всеми четырьмя условиями хоста: `EXIT=0`, `0 issues`, 18 пакетов `ok`, три скипа и все три от `ENGINE_BIN`/`BOOK_TEMPLATE`. Тестов **659 → 683**, удалённых имён ноль. Тейлер: семь посадок (парковка возвращает `nil` · граница `LastSeq > 1` · курсор уезжает за чужой hello · снятие `named` · парковка до первой своей строки · понижение отказа по декоду · парковка на СВОЁМ повторном hello) — **все КРАСНЫЕ**; три границы промта целы, зелёный пин `TestAnotherAttemptsStreamInTheSameJournalIsSkipped` жив. Реконсилятор: пять посадок, все красные. Денежный инвариант: `reopen` читает `RunBudget` один раз и из него берёт и потолок, и согласие; `ErrNoFirstHold` уходит ошибкой; посадки «последний холд вместо первого» и «фолбэк на ставку» краснеют в ОБОИХ пакетах — дофикс закрыл и асимметрию пина.
|
||||
|
||||
**3. Гейты доведены до того, что о себе пишут.** Гейт батареи теперь сверяет состояние по хосту у КАЖДОЙ строки и закрывает обратное направление: заморозка состояний литералом, выдуманная строка перечня и ложная приписка пакета — все краснеют; проверено с положительным контролем. Гейт класса закрыл две калитки из трёх: уход по `accepted-risk` теперь поднимается лифтером как `ALARM PD-… LEFT the class`, а прозаический статус диагностируется по существу («the cell has to say one of the register's statuses»), а не как «гейт читает не тот документ». ⚠ Остаток класса `PD-374` назван честно: имя условия, заданное константой или параметром, невидимо и рецепту, и разбору — ряд остаётся ОТКРЫТЫМ по этому основанию, а не по прежнему (прежняя причина — «половина `STACK_DECISIONS` жива» — была ЛОЖНОЙ: обе половины вылечены до пака, эту ошибку сделала приёмка первого круга и снимает её здесь).
|
||||
|
||||
**4. АКТ ЛЕНДИНГА — статусы сверены (D39.167 п.1).** Закрыты `fixed(6ae3e76)` и перенесены в секцию «Закрытые — эра P13»: **`PD-89`** (ключ идемпотентности на пути ошибки) · **`PD-168`** (бюджет из холда) · **`PD-214`** и **`PD-426`** (порядок принадлежности + ручка `run unquarantine`). ⚠ **Пункт наряда «снять `PD-168` из `alarmBaseline`» зона ОТКАЗАЛАСЬ исполнять, и отказ был прав:** предпосылка наряда опиралась на правку регистра, которая до её дерева не доехала — на всех четырёх деревьях ряд стоял `open`, гейт и база согласованно печатали 12. Закрытие ряда сделано ЗДЕСЬ, актом лендинга, вместе с переносом; согласование базы гейта с новым составом — пункт дофикса зоне. Регистр: 439 рядов, открытых **97**, `major` **3**.
|
||||
|
||||
**5. ОСТАЁТСЯ ОТКРЫТЫМ.** (а) Записка зоны о предусловии хоста различает хосты ИМЕНЕМ МАШИНЫ, а имя у этого хоста то же самое (`DESKTOP-IN1MCEA`) при противоположных условиях: `~/go/bin` существует и держит `sqlc`, `make tools-check` на дефолтном PATH падает, сокет только `55433`. Различает не хост, а пользователь — разные WSL-инстансы под одним именем. Цена — потерянный старт батареи у следующей смены. (б) `PD-439` (семь рядов со статусом вне словаря) и правило ухода из охраняемого класса — решение оркестратора, от него зависит форма третьей калитки гейта. (03.09.2026, оркестратор №22) ✅
|
||||
|
|
|
|||
|
|
@ -15,13 +15,13 @@
|
|||
|
||||
## 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:381`=`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:392`=`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 (резюм, ре-пин), ретраи и эскалации внутри юнита потолок не тратят. Принимает только `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`): единственный писатель признака движения банка — дверь правок, рост АВТО-банка от майнинга флага не ставит.
|
||||
- **`--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`): единственный писатель признака движения банка — дверь правок, рост АВТО-банка от майнинга флага не ставит.
|
||||
- **`--ceiling-usd` — КНИЖНЫЙ потолок, не бюджет прогона.** Дословно из флага: «the book USD ceiling in force for THIS RUN ONLY — it OVERRIDES book.yaml `ceilings.book_usd` and is never written back. It caps the book's CUMULATIVE committed+reserved spend, not this run's increment…» (`backend/cmd/tmctl/invocation.go:142`=`the book USD ceiling in force for THIS RUN ONLY`; ⚠-коммент `backend/cmd/tmctl/main.go:260`=`--ceiling-usd is NOT a per-run budget`; многоточие закрывает обрыв цитаты — во флаге дальше стоит «, and must be > 0»). Ратификация — D39.122 п.2(в): пересчёт «пользовательский прирост → абсолют» — обязанность ПЛАТФОРМЫ, вторая денежная ось не заводится. День-потолок флаг НЕ перекрывает (PD-157). Проводка внутри: `Ceilings.BookUSD` в `Reserve` и именование сработавшего потолка в ошибке — `backend/internal/pipeline/stagerun.go:496`=`BookUSD: r.bookCeilingUSD()` и `backend/internal/pipeline/stagerun.go:525`=`overrides the book's ceilings.book_usd` (стоп = `errReserveCeiling`, `backend/internal/pipeline/escalation.go:49`=`var errReserveCeiling`).
|
||||
- **Потолки — wiring, не семантика:** `Ceilings` намеренно исключены из `BriefHash` («Wiring fields (paths, ceilings, db) deliberately excluded», `backend/internal/config/book.go:334`=`Wiring fields (paths, ceilings, db) deliberately excluded`; канон — `backend/internal/config/book.go:350`=`canon := struct {`) ⇒ смена ДЕНЕЖНОГО потолка не двигает ни снапшот, ни ре-билл (D39.110 п.2б). ⚠ Верно ровно про ДЕНЬГИ: потолок СЕГМЕНТАЦИИ `edit_ceiling_out` в снапшот ВХОДИТ и меняет границы чанков (`backend/internal/pipeline/snapshot.go:34`=`EditCeilingOut int`).
|
||||
- **`status --json` отдаёт фигуры платформе:** `committed_usd`, `reserved_usd`, `book_ceiling_usd`, `ceiling_pct` = 100·(committed+reserved)/book_ceiling (`backend/internal/pipeline/status.go:290`=`book_ceiling_usd,omitempty`; арифметика `ceiling_pct` — `backend/internal/pipeline/status.go:788`=`100 * (committed + reserved)`). Дневной фигуры в status нет (PD-157 — `platform/docs/DEFECT_REGISTER.md`, греп `PD-157`).
|
||||
- **`status --json` отдаёт фигуры платформе:** `committed_usd`, `reserved_usd`, `book_ceiling_usd`, `ceiling_pct` = 100·(committed+reserved)/book_ceiling (`backend/internal/pipeline/status.go:311`=`book_ceiling_usd,omitempty`; арифметика `ceiling_pct` — `backend/internal/pipeline/status.go:811`=`100 * (committed + reserved)`). Дневной фигуры в status нет (PD-157 — `platform/docs/DEFECT_REGISTER.md`, греп `PD-157`).
|
||||
- **Леджер = НИЖНЯЯ граница** (строка 78 бэклога, `docs/PROGRESS.md`, греп `Леджер денег = НИЖНЯЯ граница`): «2xx body decode failed (call IS billed)» — провайдер списал, попытка в `request_log` не попадает; живой замер D39.86 — 3 вызова из 14, неизвестность $0.015111 при леджере $0.114378; движок сеттлит оценку и печатает `estimated-cost rows: 3`. Канал виден, фикс — money-паком (дизайн GENERALITY_PHASE2 §5.6).
|
||||
|
||||
- **Согласие на пере-оплату — ДВИЖКОВЫЙ гейт**. Прогон, который пере-покупает уже оплаченные юниты дороже порога, ОСТАНАВЛИВАЕТСЯ и требует явного согласия. Порог по умолчанию ратифицирован D20.2-Q2: `min($0.50, 5% × ProjectedBookUSD)`. Носитель — `backend/internal/pipeline/rebill.go`, греп `rebillConsentThreshold`; единственная ручка книги — `rebill_consent_usd` (валидатор `backend/internal/config/book.go`, греп `rebill_consent_usd`; 0 = ратифицированный дефолт). ⚠ Порог считается БЕЗ контура банк-ролей (D39.182 §3), то есть срабатывает позже, чем подсказывает полная проекция.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,12 @@
|
|||
# Промт сессии: БЭКЕНД — «число согласия на пути второй покупки»
|
||||
|
||||
> ⚠⚠ **АРХИВ. ПРОМТ ОТРАБОТАН — ИНСТРУКЦИИ ОТСЮДА НЕ ИСПОЛНЯЮТСЯ.**
|
||||
> Выдан 02.09, сдан 03.09, принят с дофиксом (`D39.187`). Исход: четыре пункта состава исполнены,
|
||||
> дофикс по десяти пунктам отработан, приёмка второго круга оставила один незакрытый пин операторской
|
||||
> строки. ⚠ Часть якорей этого файла МЕРТВА по построению: пак снял тексты, на которые они указывали
|
||||
> (обещание точности в `status.go`, шапка `reprice.go`) — это исход, а не поломка.
|
||||
> Живые носители: `D39.187` · `docs/BACKEND_DOFIX_2026-09-03.md` · секция «Бэкенд» в `docs/PROGRESS.md`.
|
||||
|
||||
> **Роль:** бэкенд. **Зона записи:** `backend/`. Чужие зоны (`platform/`, `frontend/`, `eval/`)
|
||||
> читаешь, не правишь; в `docs/` пишешь ТОЛЬКО в секцию «Бэкенд» журнала `docs/PROGRESS.md` — это
|
||||
> единственное разрешённое каноном исключение. **Не коммитишь** и не трогаешь индекс и историю —
|
||||
|
|
@ -1,5 +1,12 @@
|
|||
# Промт сессии: ПЛАТФОРМА, пак P13 — «шов возврата оплаченного прогона»
|
||||
|
||||
> ⚠⚠ **АРХИВ. ПРОМТ ОТРАБОТАН — ИНСТРУКЦИИ ОТСЮДА НЕ ИСПОЛНЯЮТСЯ.**
|
||||
> Выдан 02.09, сдан 03.09, принят с дофиксом (`D39.188`). Исход: шесть пунктов состава исполнены,
|
||||
> заказ пункта 3 оказался НЕДОСТАТОЧЕН и зона это доказала (`PD-438`, major), дофикс по шести пунктам
|
||||
> отработан, приёмка второго круга оставила одну правку записки о хосте.
|
||||
> ⚠ Часть якорей этого файла МЕРТВА по построению: пак переписал цели (строка рантбука, `Quarantine`).
|
||||
> Живые носители: `D39.188` · `docs/PLATFORM_P13_DOFIX_2026-09-03.md` · `platform/docs/platform-PROGRESS.md`.
|
||||
|
||||
> **Роль:** платформа. **Зона записи:** `platform/`. Чужие зоны читаешь, не правишь. **Не коммитишь**
|
||||
> и вообще не трогаешь индекс и историю — почему именно, и полный список запретов: `CLAUDE.md`,
|
||||
> «Git-координация мультисессий».
|
||||
File diff suppressed because one or more lines are too long
Loading…
Add table
Reference in a new issue