Give the pin row's anchor the token its prose describes: the wall-clock window that separates the two table rows

This commit is contained in:
heaven 2026-09-11 21:20:50 +03:00
parent df9de010f2
commit 83bed56986

View file

@ -299,7 +299,7 @@
| 376 | **ДОСТАВЛЕННЫЙ ОБРЫВ ДО ЗАГОЛОВКОВ КНИЖИТСЯ НУЛЁМ — и мы НЕ ЗНАЕМ, у скольких провайдеров это срабатывает.** Деньги за оборванный нами вызов считаются по `answered && afterHeaders` (`backend/internal/llm/attemptcut.go`), то есть единственный оплачиваемый обрыв — пришедший через ошибку ЧТЕНИЯ ТЕЛА. Обрыв до первого байта ответа (наш дедлайн, стоп родителя, разрыв сокета) даёт **$0** и не виден даже в оценочной паре (`paidtail.go` пропускает `CostUSD <= 0`). ⚠ **Сужение СОЗНАТЕЛЬНОЕ и ратифицировано** (`D39.230`, разведение предикатов): довод замером — 3 из 25 отменённых в полёте сеттлили оценку за запрос, которого не видел ни один хендлер, то есть переплата ЧИТАТЕЛЯ, запрещённая `D39.196` п.2а. ⛔ **Открыт РАЗМЕР остатка, и он неизвестен по построению:** провайдеров **8** (замер по `configs/models.yaml`), ранний `200` задокументирован ровно у ОДНОГО (DeepSeek), а про поведение заголовков у остальных СЕМИ в репозитории не сказано НИЧЕГО — греп класса по странице квирков даёт 0 при 250 строках файла. ⇒ верное утверждение не «сломано у семи», а **«неизвестно для семи»**: если заголовки у них приходят рано, путь почти не срабатывает; если поздно — головной класс пака у них не закрыт вовсе. ⚠ Замерить без платных вызовов нельзя, и постфактум из телеметрии тоже: движок не пишет время до первого байта успешных вызовов. ⇒ первый шаг дешёвый и $0 — начать писать это время | бэкенд | скоро | время до первого байта пишется; размер остатка назван числом, а не «неизвестно» | приёмка пака «вызов, который оборвали мы» 10.09 |
| 377 | **ОПЛАЧЕННЫЙ ОБРЫВ, ЗА КОТОРЫМ РЕТРАЙ УСПЕЛ, ИСЧЕЗАЕТ БЕССЛЕДНО: $0 и ни одного следа.** `backend/internal/llm/httpllm.go` — на успешном ретрае `if err == nil { return resp, nil }`, и накопленный `owedCut` ВЫБРАСЫВАЕТСЯ. Замер приёмки: сервер спрошен ДВАЖДЫ (первый вызов доставлен, подтверждён и оборван), вызывающий получает чистый успех и о первом не узнаёт ничего — ни строки леджера, ни оценки, ни пометки. ⚠ Это ровно предмет пака (платим дважды за одну генерацию), но пак его НЕ заказывал: §4.2 требовал деньги «на исчерпании», а здесь исчерпания нет — ретрай удался. Ни одна из девяти фикстур этого пути не покрывает: `TestABrokenConnectionAfterDeliveryIsRetriedOnceAndOnlyOnce` роняет ОБЕ попытки | бэкенд | скоро | оплаченный обрыв виден в леджере независимо от исхода ретрая | приёмка пака «вызов, который оборвали мы» 10.09 |
| 378 | **ПИН «НЕ-2XX — НЕ ПОКУПКА» ЛОВИТ МУТАНТА НЕ ТЕМ АССЕРТОМ: денежные проверки в нём не исполняются ни разу.** Каталожная мутация `CUTCALL-a-non-2xx-becomes-a-purchase` (батарейная, цель — `backend/internal/llm/httpllm.go`, ветвь статуса `if resp.StatusCode < 200 || resp.StatusCode >= 300``if false`). Пере-снято ОРКЕСТРАТОРОМ 10.09 на копии: тест краснеет, но ТЕКСТОМ `cutcall_test.go:584: a provider failing every attempt must surface as an infra failure` — ассертом об исходе ПРОГОНА. `t.Fatal` останавливает тест ДО трёх проверок, ради которых пин написан (`committed`, `reserved`, `checkpoints`), и они не исполняются. Под мутацией движок сеттлит **$0.001056 как ОЦЕНКУ за 500-ку** — ровно ту утечку, которую доккоммент теста называет, — и текст падения об этом молчит. ⚠ Класс ратифицирован (`D39.217` п.2в, `D39.232` п.6в) — здесь открыт НОСИТЕЛЬ | бэкенд | скоро | мутант краснеет ассертом О ДЕНЬГАХ: посылка «прогон упал» проверяется так, чтобы не глотать денежные проверки | приёмка пака «вызов, который оборвали мы» 10.09 (С8) + пере-замер оркестратора |
| 379 | **ДВА ПИНА ПАКА НЕ УТВЕРЖДАЮТ СВОЕЙ ПОСЫЛКИ — названный сценарий может не состояться, и они этого не скажут.** **(а)** `backend/internal/pipeline/cutcall_test.go:402` — две строки таблицы девяти («after 2xx · cancelled by the operator» и «before headers · cancelled by the operator») разводятся ОКНОМ СТЕННЫХ ЧАСОВ: `<-srv.arrived` + `time.Sleep(50 * time.Millisecond)` против `attempt_s: 1`. По какую сторону границы заголовков сел `cancel()`, не утверждается ничем. Замер приёмки на мутанте: **2 красных из 8** — отмена обгоняла разбор заголовков, и строка сходилась «ноль к нулю» (`D39.232` п.6а). **(б)** `backend/internal/llm/attemptcut_test.go``TestARefusalIsNotAPurchaseEvenWhenTheReplyOutrunsTheWrite` утверждает только `err != nil` и `!errors.As(err, &cut)`; что ответ ДЕЙСТВИТЕЛЬНО обогнал запись (шестимегабайтное тело не дописалось, `WroteRequest` не сработал), не проверяет ничто — тест зелен и на сценарии, где запись успела, то есть на другом предмете. ⛔ **ПЕРВОЕ ЧИСЛО К ЭТОЙ ПОЛОВИНЕ, снято оркестратором 11.09 на замороженной копии:** запись каталога `CUTCALL-a-refusal-pays-when-the-reply-outruns-the-write` на ЧИСТОМ дереве даёт пин **8 зелёных из 8**, а на своей посадке (снят `answered &&` из `delivered()`, `backend/internal/llm/attemptcut.go:189`=`answered && t.firstByte.Load()`) — **7 КРАСНЫХ ИЗ 8, один ЗЕЛЁНЫЙ**. Текст падения верный и про предмет (`attemptcut_test.go:714`=`the provider REFUSED this request`), то есть дыра не в утверждении, а в фикстуре: успеет ли транспорт записать `GotFirstResponseByte` раньше, чем `Do` вернёт ошибку записи, решает ГОНКА, а не построение. ⇒ прежние RED этой записи были УДАЧЕЙ, и в полном каталоге она меряет вероятность, а не гарантию (класс `CLAUDE.md`: пин, флейковый на мутанте, измеряет пустой сценарий). ⚠ И направление здесь единственное, которое `D39.196` п.2а запрещает прямо — «отказ становится покупкой», замер прежнего пака: 22 отказа из 25, один на $0.80 | бэкенд | скоро | каждый из двух пинов ПЕЧАТАЕТ величину, доказывающую пройденную границу, и падает, когда сценарий не состоялся | приёмка пака «вызов, который оборвали мы» 10.09 (С5, С6) |
| 379 | **ДВА ПИНА ПАКА НЕ УТВЕРЖДАЮТ СВОЕЙ ПОСЫЛКИ — названный сценарий может не состояться, и они этого не скажут.** **(а)** `backend/internal/pipeline/cutcall_test.go:402`=`time.Sleep(50 * time.Millisecond)` — две строки таблицы девяти («after 2xx · cancelled by the operator» и «before headers · cancelled by the operator») разводятся ОКНОМ СТЕННЫХ ЧАСОВ: `<-srv.arrived` + `time.Sleep(50 * time.Millisecond)` против `attempt_s: 1`. По какую сторону границы заголовков сел `cancel()`, не утверждается ничем. Замер приёмки на мутанте: **2 красных из 8** — отмена обгоняла разбор заголовков, и строка сходилась «ноль к нулю» (`D39.232` п.6а). **(б)** `backend/internal/llm/attemptcut_test.go``TestARefusalIsNotAPurchaseEvenWhenTheReplyOutrunsTheWrite` утверждает только `err != nil` и `!errors.As(err, &cut)`; что ответ ДЕЙСТВИТЕЛЬНО обогнал запись (шестимегабайтное тело не дописалось, `WroteRequest` не сработал), не проверяет ничто — тест зелен и на сценарии, где запись успела, то есть на другом предмете. ⛔ **ПЕРВОЕ ЧИСЛО К ЭТОЙ ПОЛОВИНЕ, снято оркестратором 11.09 на замороженной копии:** запись каталога `CUTCALL-a-refusal-pays-when-the-reply-outruns-the-write` на ЧИСТОМ дереве даёт пин **8 зелёных из 8**, а на своей посадке (снят `answered &&` из `delivered()`, `backend/internal/llm/attemptcut.go:189`=`answered && t.firstByte.Load()`) — **7 КРАСНЫХ ИЗ 8, один ЗЕЛЁНЫЙ**. Текст падения верный и про предмет (`attemptcut_test.go:714`=`the provider REFUSED this request`), то есть дыра не в утверждении, а в фикстуре: успеет ли транспорт записать `GotFirstResponseByte` раньше, чем `Do` вернёт ошибку записи, решает ГОНКА, а не построение. ⇒ прежние RED этой записи были УДАЧЕЙ, и в полном каталоге она меряет вероятность, а не гарантию (класс `CLAUDE.md`: пин, флейковый на мутанте, измеряет пустой сценарий). ⚠ И направление здесь единственное, которое `D39.196` п.2а запрещает прямо — «отказ становится покупкой», замер прежнего пака: 22 отказа из 25, один на $0.80 | бэкенд | скоро | каждый из двух пинов ПЕЧАТАЕТ величину, доказывающую пройденную границу, и падает, когда сценарий не состоялся | приёмка пака «вызов, который оборвали мы» 10.09 (С5, С6) |
| 380 | **У ДЕНЕЖНОГО УТВЕРЖДЕНИЯ «ПЕРЕ-ДЕЛКА НЕ УДВАИВАЕТ БЮДЖЕТ» ОДИН НОСИТЕЛЬ, А НЕ ПЯТЬ.** Колонка `wantSameBudget` стоит в четырёх строках таблицы девяти (`backend/internal/pipeline/cutcall_test.go:333,340,355,361`), но осей не разводит: обжог случается ВНУТРИ `runAttempt`, а `maxTokens` считается в `runStage` ДО вызова, на итерации `attempt == 0`, где номер попытки и число удвоений равны по причине, к предмету отношения не имеющей. Пере-снято ОРКЕСТРАТОРОМ 10.09 на копии под каталожной мутацией `CUTCALL-the-redo-doubles-the-budget` (`maxTokensForAttempt(baseMaxTokens, escalations)``..., attempt`): таблица девяти — **0 красных из 8** (контроль: прибор запустил 10 подтестов, то есть спрашивал существующее), весь пакет `internal/pipeline` — ровно **ОДИН** красный тест, `TestABurnFollowedByARegenerationDoesNotOverBuy` (`cutcall_test.go:1435`). ⚠ Сам носитель ПОЧИНЕН паком (посылку теперь утверждает: «run 1 must leave exactly ONE checkpoint», «…is three checkpoints»), поэтому дыры сегодня нет — есть ЕДИНСТВЕННОСТЬ | бэкенд | когда-нибудь | утверждение держат ≥2 независимых носителя ЛИБО колонка `wantSameBudget` снята как ничего не меряющая, и это записано | приёмка пака «вызов, который оборвали мы» 10.09 (С3) + пере-замер оркестратора |
| 381 | ⛔ **СНЯТА 10.09 ВМЕСТЕ С ОТМЕНОЙ ПАКА «ДВЕ ОСТАНОВКИ» (`D39.240`) — предмет строки был «у человека одна кнопка и она жёсткая», а владелец решил, что жёсткой и достаточно.** Тело не воспроизводится: замеры, ради которых строка стояла, ратифицированы нотами и живут там — блокирующий `systemctl stop` без `--no-block` и инертность повторного стопа на `deactivating` (`D39.237`), коалесценция двух сигналов в один (`D39.238`), диагноз «у вопроса о трате нет единственного хозяина» (строка **385**). ⚠ **Единственная часть прежнего тела, которая пережила отмену и живёт своей жизнью, — строка 391**: из зависшего сворачивания нет выхода, кроме убийства, и оно не оставляет терминального кадра. Строка сохранена надгробием, а не удалена, потому что на неё ссылаются `D39.233``D39.240` | бэкенд | когда-нибудь | ссылки на 381 ведут к нотам, а не в пустоту | `D39.240` |
| 382 | ⛔ **ПОМЕТКА «ЭТО ОЦЕНКА» — УСЛОВИЕ СЛОВА ВЛАДЕЛЬЦА (`D39.230` п.1) — ПО ШВУ НЕ ЕДЕТ И ПОТРЕБИТЕЛЯ НЕ ИМЕЕТ.** Владелец разрешил списывать с читателя по ОЦЕНКЕ при условии, что пометка стоит. В движке она есть: `backend/internal/pipeline/status.go:321``estimated_rows` / `estimated_usd` в `status --json`. Дальше она обрывается. Замер 10.09 с контролем: в кадрах событий шва (`backend/internal/runevents/runevents.go`) слова `estimated` **0 хитов** (контроль: `committed` в том же файле — **6**; денежный кадр несёт один `committed_micro_usd`, `runevents.go:244`); в `platform/internal` вне тестов — **2 хита, оба КОММЕНТАРИИ**, причём `pgstore/credits.go:235` прямо просит эту величину: «publish the count and sum of estimated-price rows beside committed_usd, which is what would let this side say "at most Y"» (контроль: `committed_micro` — 1 хит; go-файлов вне тестов прибор прочёл **81**). ⇒ условие исполнено на ОДНОМ канале из двух, и читателя, ради которого пометка ставилась, у неё нет: платформа не может сказать пользователю «не больше Y». ⚠ Пара к строке **381**: и то и другое — признак, который обязан ехать в кадре `finished`/`spend`, а не только в `status --json` | бэкенд | скоро | платформа ЧИТАЕТ счёт и сумму оценочных строк из потока и может назвать пользователю верхнюю границу списания | акт `D39.233` п.7, замер оркестратора 10.09 по разбору чистого Fable 5 |