Record that the acceptance run never reached the cap it accepted, and give the three residues the verifier found their rows
This commit is contained in:
parent
760daf8f6e
commit
a80b076828
3 changed files with 7 additions and 1 deletions
|
|
@ -3,7 +3,7 @@
|
|||
> **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено.
|
||||
> ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`).
|
||||
> ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции.
|
||||
> - **СЧЁТ ОЧЕРЕДИ на 08.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **257** строк · зона бэкенд **122** строго / **169** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 1** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **113** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
|
||||
> - **СЧЁТ ОЧЕРЕДИ на 08.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **260** строк · зона бэкенд **122** строго / **169** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 1** (236 закрыта D39.175), платные прогоны разблокированы · «скоро» **116** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
|
||||
> - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп.
|
||||
|
||||
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)
|
||||
|
|
@ -293,3 +293,6 @@
|
|||
| 362 | **РЕМОНТ ПРОТИВ РЕМОНТА: несколько ремонтов одного чанка покупают ДОКАЗУЕМО НЕПЕРЕСЕКАЮЩИЕСЯ спаны и вытесняют друг друга в `superseded`.** Третий член семьи строк 355/358: адрес `{глава, чанк, стадия}` предполагает, что поздний вызов ЗАМЕЩАЕТ ранний, а ремонт переписывает ОГРАНИЧЕННЫЙ спан, не весь выход стадии. ⚠ Механизм здесь НЕ пересказан — он расписан в самом коде, `backend/internal/pipeline/paidtail.go` (абзац «The repair role shares that address WITHOUT sharing that property»), и там же названо, почему очевидное лечение не работает: разведение по РОЛИ ремонты между собой не различает — «every one of them carries the same role and only the span tells them apart». ⛔ Нынешнее поведение ЗАПИНЕНО КАК НЕПОДВИНУТОЕ, а не как верное — `TestTheRoleSplitDoesNotMoveARepairsMoney`; то есть пин охраняет отсутствие тихого сдвига, а не правильность. **Цена, замер ревьюера движковой сессии 08.09: 77 % денег чанка отчитаны как «купившие ничего»** ⚠ (оркестратором НЕ пере-мерено — взято со слов замера, механизм проверен по коду). Не взято в пак «движок уже знает» сознательно: вторая денежная поверхность в одном лендинге | бэкенд | скоро | ремонты одного чанка различены по спану, а не по триплету; пин утверждает ПРАВИЛЬНОСТЬ, а не неподвинутость | приёмка пака «движок уже знает» 08.09 |
|
||||
| 363 | **ПОЛНЫЙ ТЕКСТОВЫЙ САЙДКАР МОЛЧИТ О НЕПОЛНОТЕ БАНКА — а баннер зовёт в него ровно тогда, когда строк больше капа.** После пака «движок уже знает» факт неполноты несут машинный сайдкар и stdout-экран; текстовый сайдкар стоп-таблицы выведен из заказа §4.1 сознательно и остался единственной поверхностью, которая о неполноте не говорит. ⚠ Цена именно в связке: stdout капирован 20 строками, и когда строк больше, баннер отправляет читателя в ПОЛНЫЙ текстовый сайдкар — то есть туда, где факта нет. ⇒ на большой книге оператор, послушавшийся баннера, теряет ровно то, что пак довозил | бэкенд | скоро | текстовый сайдкар несёт полноту наравне с двумя другими поверхностями | пинг движковой сессии, приёмка пака «движок уже знает» 08.09 |
|
||||
| 364 | **ПОТОЛОК РАЗРЕЗОВ НЕ ЕСТЬ ПОТОЛОК ПРОЦЕССОВ ДВИЖКА НА ХОСТЕ — граница названа зоной, но не измерена.** Пак разреза приёма закрыл путь, у которого потолка не было ВООБЩЕ (синхронный вход: N загрузок = N процессов), и `books/limit.go` честно называет, чего он НЕ ограничивает: материализатор (`readmodel.refresh`) и рекoнсайлер (`status`) порождают процессы через тот же неограниченный `runner.readEngine`. Их держат другие границы — число воркеров очереди и последовательность свипов, — и они ЛОЖЕ. ⇒ худший случай по числу одновременных процессов движка на хосте сегодня НЕ равен `DefaultMaxCuts` и никем не посчитан. ⚠ Это не дефект поведения и не заявка на второй семафор: зона права, что ряд в РЕГИСТРЕ дефектов был бы засорением. Строка нужна затем, чтобы названная граница не прочиталась как закрытый вопрос — ровно класс `D39.202`. ⛔ И довод к тому, что вопрос не косметический: разрез идёт голым `exec.CommandContext` без cgroup и `MemoryMax`, в отличие от прогонов, которые обёрнуты в `systemd-run` | платформа | когда-нибудь | худший случай посчитан ИЛИ все пути порождения заведены под одну границу | вопрос зоны при сдаче пака разреза приёма 08.09 |
|
||||
| 365 | ⛔ **ПОТОЛОК `TM_PLATFORM_UPLOAD_DEADLINE` ТИХО ОПУСТИЛСЯ, И ДЕПЛОЙ, КОТОРЫЙ ВЧЕРА СТАРТОВАЛ, СЕГОДНЯ ОТКАЖЕТ НА БУТЕ.** Пак разреза приёма поднял `UploadSettle` 210 → 220 с и добавил `ClaimGrace` третьим окном в бутовую сверку (`internal/config/config.go`, `min(sweepGrace, parseClaimGrace, idempotencyClaim)`), из-за чего самое узкое окно стало 20 мин вместо 30 ⇒ допустимый дедлайн загрузки упал с ~26 м 30 с до ~16 м 20 с. ⚠ `deploy/README.md` правило называет, но НЕ называет ни числа, ни того, что граница ПЕРЕЕХАЛА: оператор с легальным вчера `TM_PLATFORM_UPLOAD_DEADLINE=20m` получит отказ старта без апгрейд-ноты. ⇒ либо нота в рантбуке с числом и причиной, либо сообщение бута, называющее, ЧТО именно сузилось | платформа | скоро (до следующего выката) | оператор узнаёт о сужении из рантбука или из текста отказа, а не из отказа старта | охотник вне карты, приёмка пака разреза приёма 08.09 |
|
||||
| 366 | **ОЖИДАНИЕ СЛОТА ЗАНИМАЕТ ВОРКЕР ОЧЕРЕДИ, А ТЕЛЕМЕТРИЯ ПОТОЛКА ПУБЛИКУЕТСЯ ЗА ПАССОМ, КОТОРЫЙ НА ЭТОТ ПОТОЛОК И БЛОКИРУЕТСЯ.** Две половины одного: **(а)** все три вида заданий (`SpawnArgs`, `ParseArgs`, `ExportArgs`) делят ОДИН пул `river.QueueDefault` размером `DefaultWorkers`, а `DefaultMaxCuts = jobs.DefaultWorkers` — числа совпадают ПО ПОСТРОЕНИЮ ⇒ четыре HTTP-загрузки, занявшие слоты, ставят четыре `tm_parse_book` в блокировку внутри `Work()`, и очередь целиком — спавн платных прогонов, сборка экспортов — стоит за ними до `deadline − reserve` = **13,5 мин**. Механизм `giveBack`/`RetryDelay 30s`, который пак и построил, при этом почти недостижим: джоба доходит до снуза, просидев эти минуты. **(б)** `CutCapacity()` → `ObserveCuts` вызывается в `one()` ПОСЛЕ пасса интейка, а тот сам может ждать слот до 13,5 мин ⇒ гейджи `cuts_in_flight`/`cuts_waiting` замирают ровно в тот момент, ради которого заведены. Комментарий `observe` закрывает случай мёртвой БД и не видит случая насыщенного потолка. ⚠ Ни граница ожидания, ни занятость общего пула не названы ни в отчёте зоны, ни в акте `D39.229` — там названа ДРУГАЯ граница (строка 364) | платформа | скоро | ожидание не занимает воркер очереди ЛИБО граница названа числом в рантбуке; телеметрия потолка публикуется независимо от блокирующего пасса | охотник вне карты, приёмка пака разреза приёма 08.09 |
|
||||
| 367 | **ГАРАНТИЯ РЕЗЕРВА У ПОТОЛКА РАЗРЕЗОВ СУЩЕСТВУЕТ ТОЛЬКО ПОД КОНКУРЕНЦИЕЙ, А ТРИ КОММЕНТАРИЯ УТВЕРЖДАЮТ ОБРАТНОЕ.** `platform/internal/books/limit.go`, `takeCutSlot`: удачный `sem.TryAcquire(1)` возвращает слот СРАЗУ, не спросив `worthStarting` — то есть на свободном хосте слот выдаётся при любом остатке бюджета, хоть при миллисекундах. Проверка стоит только на пути ожидания. ⛔ Три места говорят иначе: «`reserve` is what a WON slot must still be worth» (`limit.go`), «a cut is not started … unless what remains is what this platform calls a cut's worth of time» (`parse.go`), «Below zero there is no cut to run, and it is not ATTEMPTED» (`books.go`). ⚠ Сегодня не кусает — у интейка `reserve = 0`, у очереди `JobTimeout` 15 мин, свип гарантирует запас, — но защита отсутствует ровно на пути, который проходится почти всегда, и **любой пин на неё зелёный навсегда**: он попадает только в ветку ожидания. Это тот самый класс вырожденного пина, против которого построена вся смена. ⇒ лечение скорее всего однострочное (спросить `worthStarting` ДО `TryAcquire`), но форма и цена — зоне. ⚠ Не взято дофиксом сознательно: правило остановки по этому паку объявлено ДО находки, и нарушать его задним числом значит обесценить сам механизм остановки | платформа | скоро | гарантия резерва действует на ОБОИХ путях ЛИБО три комментария приведены к правде; пин достигает быстрого пути | охотник вне карты, приёмка пака разреза приёма 08.09 |
|
||||
|
|
|
|||
|
|
@ -191,6 +191,8 @@ D-ссылка грепается по D-логу — ⛔ **и до НОМЕРА
|
|||
| Ресёрч / текст | Claim-fidelity: цитаты — дословные подстроки первоисточников (типовой провал — ОВЕР-АТРИБУЦИЯ, не фабрикация); пере-открыть выборку улик; опровергатель ДРУГОЙ моделью |
|
||||
| Доки | Сверка утверждений против кода и живых носителей |
|
||||
|
||||
⛔ **ПРИЁМОЧНЫЙ ПРОГОН ПЕЧАТАЕТ СЧЁТ СКИПОВ РЯДОМ С ЧИСЛОМ `ok`, иначе он не прибор** (08.09): `go test ./...` без `-v` скипы не показывает, и «20 пакетов ok» на машине без стенда неотличимо от «20 ok при 431 скипе», среди которых все десять пинов ЦЕНТРАЛЬНОГО механизма пака. Так я и приняла потолок разрезов, ни разу его не коснувшись; поймал охотник вне карты двусторонней посадкой. ⇒ либо гоняешь целевой гейт зоны (он скипы печатает), либо печатаешь `grep -c -- '--- SKIP'` рядом со своим числом. Это `D39.202` про сам измеряющий прибор.
|
||||
|
||||
Деньги в любой приёмке — из сырого леджера ДВУМЯ независимыми путями; леджер = нижняя граница.
|
||||
Кросс-модельно (D39.120, направление): текстовые/оценочные линзы — другой моделью; механические
|
||||
от смены модели не выигрывают. Тяжёлые ратификации (новый механизм/шов/контракт) и периодический
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
> ⚠ **Эррата 15.08 (D39.132):** D39.131 п.2(а) перечисляет полосу отказов «10 конфиг · 11 источник · 12 лок · 19 безымянный» — читать через D39.132 п.2(г): полоса ДОПОЛНЕНА **exit 13 = `schema_mismatch`** (~~обе зоны сошлись на числе независимо~~; ратифицирован направлением, ФИНАЛИЗИРОВАН приёмкой D39.134).
|
||||
> ⚠ **Эррата 15.08-б (D39.134 п.2а, вписана по аудиту корпуса):** клейм «зоны сошлись на 13 НЕЗАВИСИМО» (строкой выше и в D39.132 п.2г) СНЯТ — платформа прочитала число из незакоммиченного дерева движка и сама это записала (`platform/internal/ingest/exit.go:63-64`); на силу ратификации не влияет.
|
||||
> ⚠ **Эррата 15.08-в (D39.136 п.5):** форма контракт-ревью «фазный воркфлоу оркестратора» ОТМЕНЕНА словом владельца тем же днём — исполняет ОТДЕЛЬНАЯ СЕССИЯ со своим онбордингом (норма D39.120 п.2; оркестратор — автор части ратификаций 0.2.3, author≠reviewer); запущенная воркфлоу-фаза 1 остановлена, её результаты выброшены; промт — `docs/CONTRACT_REVIEW_SESSION_PROMPT.md`.
|
||||
> ⛔⛔ **Эррата 08.09-д (`D39.229` п.2) — «ЧИСЛА ПЕРЕ-СНЯТЫ МНОЮ» ДОКАЗЫВАЛИ ПОЧТИ НИЧЕГО О ПРЕДМЕТЕ ПАКА, И ЭТО КЛАСС `D39.202`, ПРИМЕНЁННЫЙ К САМОЙ БАТАРЕЕ.** Пункт 2 записывает: «`go test ./... -count=1` → 20 пакетов `ok` · 0 FAIL · EXIT=0». Ровно эту картинку печатает машина БЕЗ Postgres, потому что `go test` без `-v` скипы не показывает вовсе. Замер в моём окружении: `TM_PLATFORM_TEST_DSN` пуст, прогон даёт **431 скип**, и среди них — **все десять тестов `internal/books/limit_test.go`**, то есть весь пин ЦЕНТРАЛЬНОГО механизма пака. `go test ./internal/books/ -run TestTheHostRunsNoMoreCutsAtOnceThanItsCapAllows -v` в том же окружении печатает `SKIP` и следом `PASS`. ⇒ мой приёмочный прогон потолка не касался ни разу. **Нашёл охотник вне карты, и доказал не рассуждением, а двусторонней посадкой:** ослабленный семафор (`NewWeighted(limit+3)`) без DSN даёт `ok 0.009s`, с DSN — `FAIL: TestTheHostRunsNoMoreCutsAtOnceThanItsCapAllows`. ⭐ **Пробел закрыт исполнением, а не оговоркой:** я подняла стенд (сокет `/tmp/.s.PGSQL.5432`) и прогнала оба флагманских теста с живой базой — **PASS, 0.81 с и 2.45 с**. Механизм ЗАПИНЕН по-настоящему; неверен был мой прибор, а не работа зоны. ⇒ **НОРМА: приёмочный прогон печатает счёт СКИПОВ рядом с числом `ok`, иначе «пере-снято мною» и «пере-снято на четырёхстах невыполненных тестах» неразличимы.** Гейт зоны (`make check`) скипы печатает и пустой лог объявляет красным — а голый `go test`, которым мерила приёмка, слеп по построению. ⚠ И `D39.228` п.2 (движковая батарея) той же поправке НЕ подлежит: там гейтов хоста нет, скипов 4 и они названы.
|
||||
> ⚠⚠ **Эррата 08.09-г (`D39.228` п.1 и п.3) — ТРИ ОШИБКИ ОДНОГО АКТА, НАЙДЕНЫ КРОСС-МОДЕЛЬНЫМ РЕВЬЮ РАТИФИКАЦИЙ, которое норма велела провести ДО ратификации, а я провела ПОСЛЕ.** **(а) ⛔ ЦЕНА БАМПА НАЗВАНА ДЕНЬГАМИ, КОТОРЫХ ТАМ НЕТ.** Пункт 3 пишет, что бамп `manifestVersion` «выбрасывает каждый сохранённый сайдкар и ПЕРЕКУПАЕТ каждую книгу». Код говорит другое и говорит это четырежды (`manifest.go:78`, `:99`, `:118`, `:729`): «discard every stored sidecar and **re-cut** / **re-chunk** every book». Ре-чанк — процессор, не деньги: единственный денежный читатель манифеста (`rebill.go`) на нулевом манифесте не объявляет ряд перепокупкой, а делает дорогую сверку контент-хешей и при совпадении продолжает как `$0 resume`. Настоящая цена бампа — пере-нарезка на каждом чтении, одна дорогая проверка в гейте согласия и **релиз платформы В НОГУ** (`KnownManifestVersion`), и последний довод СИЛЬНЕЕ денежного, но в ноте не назван. ⇒ **правило пункта 3 остаётся в силе, довод под ним заменён:** запрет бампа держится на двузонном релизе, а не на перепокупке. ⚠ Следующий, кто станет взвешивать бамп, взвесил бы не ту цену. **(б) ⛔ СТРОКА 312 ЗАКРЫТА НАПОЛОВИНУ И УДАЛЕНА ЦЕЛИКОМ — тот же класс, что 253, в том же акте решённый ПРОТИВОПОЛОЖНО.** Живым остатком 312 был Д-3 — «увидит ли ноту ЧЕЛОВЕК»; после лендинга поле `TOCUnreadable` пишется в манифест и не читается никем: **0 хитов `toc_unreadable` в `platform/` при 200 `.go`**. Факт переехал из лога в файл, которого никто не открывает, и для пользователя не изменилось ничего. Строка ВОЗВРАЩЕНА суженной до платформенной половины; класс A для этого поля объявлен там же (акт объявлял его только для `consolidation`). **(в) ⛔ ЭРРАТА 08.09-в ЗАКРЫЛА 1 НОСИТЕЛЬ ИЗ 6.** «253 закрыта» стояло ещё в `05-decisions-index.md`, `docs/README.md`, CURRENT-STATE `docs/PROGRESS.md` и баннере архивного промта — а следующая сессия онбордится с CURRENT-STATE, а не с шапки журнала. Приведены к правде вместе с 312. ⚠ Это МОЯ ЖЕ норма «класс закрыт только со ЗНАМЕНАТЕЛЕМ N из M», применённая к моей же эррате и не исполненная. **(г) Атрибуция коммита.** `f1404f0` (акт ПЛАТФОРМЫ) унёс закрытие ДВИЖКОВЫХ рядов 312/355/357/358 и сужение 253; движковый акт `e9a0f78` бэклога не трогал вовсе. Историю не переписываю — читателю `git log -- docs/BACKLOG.md` объясняет эта строка.
|
||||
> ⚠ **Эррата 08.09-в (`D39.228` п.1) — АКТ ОБЪЯВИЛ ЗАКРЫТОЙ СТРОКУ, У КОТОРОЙ ЗАКРЫТА ПОЛОВИНА.** Пункт 1 писал «закрыты строки 253 · 355 · 357 · 358». Для 253 это неверно: её собственное тело называет лечением (б) «полнота консолидации в сайдкар **+ поле на `BankPage`**», и второй половины нет — у секции `consolidation` ноль читателей, класс A заведён сознательно. ⇒ строка СУЖЕНА до платформенной половины, не удалена; 355 · 357 · 358 · 312 закрыты и удалены. ⛔ **Класс `D39.167` п.1 в чистом виде, и поймала его та же норма, что его называет:** «каждое утверждение акта о ряде сверяется его СТАТУСОМ в тот же заход» — сверка сделана через час после акта, а не до, и это разрыв в МОЁМ порядке: ратификация и сверка носителей обязаны идти ОДНИМ движением, иначе акт живёт с переоценкой ровно столько, сколько я собираюсь до неё дойти.
|
||||
> ⚠⚠ **Эррата 08.09-б (`D39.221`) — МОЙ РАТИФИКАЦИОННЫЙ КОММИТ ОСТАВИЛ ГЕЙТ ВЕРСИИ КОНТРАКТА КРАСНЫМ НА СУТКИ, И ЭТО ТОЧНАЯ ИНВЕРСИЯ ПОРЯДКА, КОТОРЫЙ САМ ЖЕ ПРОЕКТ РАТИФИЦИРОВАЛ.** `D39.208` п.1: код идёт первым с ЧЕСТНО КРАСНЫМ гейтом версии, канон гасит его вторым — «гейт не подгоняли под мир, а мир привели к гейту». Я сделала наоборот. Замер (`git show <коммит>:<файл>`): на `fda0679`, лендинге зоны, канон `0.12.0` И `httpapi/capabilities.go` `ContractVersion = "0.12.0"` ⇒ гейт ЗЕЛЁНЫЙ, и число акта «батарея 20/8/`EXIT=0`» — честное, под сомнение НЕ ставится. Следующий коммит, мой `3d90943`, увёл канон на `0.13.0` и константу за собой не потянул ⇒ `gates.TestTheAnnouncedContractVersionIsTheOneTheCanonRatified` красен с 07.09: «this build announces contract 0.12.0 and the ratified canon is 0.13.0». Практическое следствие названо самим гейтом: клиент, сгенерённый по объявленному `0.12.0`, откажет на формах, которые деплой реально возвращает. ⛔ **Нашла это платформенная сессия на СВОЁМ входном baseline, через сутки, и только потому, что промт велел снимать его самостоятельно** — то есть между моим ратификационным коммитом и следующей сессией зоны батарею не гоняет никто. Константу поднимает зона (её файл), заказанность объявлена мной явно: это обслуживание от ратифицированной смены (`D39.183`), а не правка ради зелени. ⚠ Урок в свою сторону и он общий: **бампнув канон, я обязана пере-гонять гейт ТОЙ зоны, чей код канон судит** — мой собственный `counts.py --check` этого класса не видит по построению, он сверяет доки с доками.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue