Make the degradation ask whether a classified attempt is in hand, keep the halt event for the halt, and fold in the echo-recovery miscount the key turns on

This commit is contained in:
heaven 2026-09-11 22:09:13 +03:00
parent 3fce077dee
commit aa867bad45

View file

@ -59,8 +59,16 @@
### 4.1 Деградация — **делай РОВНО так в ЧАСТИ РЕШЕНИЯ, сам решай КАК**
**Ровно так (решено владельцем, отступление = пинг):**
- отказ резервации на попытке **≥1** при существующем оплаченном результате попытки 0 ⇒ **флаг**, а не
ошибка наверх;
- отказ резервации ⇒ **флаг**, а не ошибка наверх — ⛔ **но предикат НЕ «индекс попытки ≥1»: эта
формулировка была моей, и она теряла бы юниты НАВСЕГДА** (поймала исполняющая сессия, я пере-проверил
кодом). Индекс попытки ПЕРЕ-ПРИСВАИВАЕТСЯ прогулкой по сожжённым ключам
(`backend/internal/pipeline/stagerun.go:201`=`attempt = att.attempt`; правило —
`stagerun.go:519`=`BURNED KEYS ARE WALKED OVER HERE`), поэтому после остановленного прогона ПЕРВАЯ
свежая покупка позиции уже идёт под индексом ≥1, а в руках нет ни текста, ни классификации. Флаг там
написал бы вердикт юниту, которого ни разу не перевели, — и поскольку `resolvedForResume` истинна для
любого флага, кроме `cancelled` (`cutcall.go:293`=`FlagReason(cs.FlagReason) != FlagCancelled`), юнит
стал бы терминальным вместе со сожжёнными деньгами. ⇒ **предикат: «в руках есть ОПЛАЧЕННАЯ
КЛАССИФИЦИРОВАННАЯ попытка»** (есть `judged`/`last`), а не «индекс ≥1»;
- у флага **СВОЯ причина**, отличная от исчерпания регенераций: читатель и оператор обязаны отличать «мы
перепробовали всё» от «денег не хватило на вторую попытку»;
- волна **идёт дальше**.
@ -84,10 +92,18 @@
публикует денежный факт: событие `ceiling` + защёлка + `exit 4`, и платформа пишет прогону `paused` и
просит пополнить. После деградации этот путь исчезает: терминальные ветки `flagged` и `clean` несут только
объём, а `Money` висит на ошибочных (`backend/internal/pipeline/events.go`, греп `terminal`). **Читателю
кончились деньги — и никто ему этого не говорит.** ⇒ **делай РОВНО так:** прогон, отказавший только РЕТРАЮ,
**по-прежнему публикует денежный факт** — либо явно НЕ публикует, и тогда довод записан в отчёте и в коде.
⚠ И рядом живёт комментарий, который твой пак сделает ложным, если факт пропадёт: `runevents.go`, греп
`ITS PRESENCE RULE` — «правило присутствия — „потолок был достигнут“, а не „исход = ceiling“».
кончились деньги — и никто ему этого не говорит.** ⛔ **НО НЕ ЧЕРЕЗ `ceilingReached` — развилку разрешила исполняющая сессия, и её довод сильнее моего
первоначального «публикуй».** Я пере-проверил кодом: событие идемпотентно по ПРОГОННОМУ флагу
(`backend/internal/pipeline/events.go:454`=`already := e.ceilingSaid`), поэтому отказ ретраю **СЪЕЛ БЫ
событие настоящей остановки** позже в том же прогоне, и платформа осталась бы с остановкой без причины.
Плюс `Halted: true` переводит идущий прогон в паузу НА ХОДУ. ⇒ **делай РОВНО так: денежный факт виден
НОВОЙ ПРИЧИНОЙ на проводе юнита плюс операторской строкой с недостачей (`shortfall`); событие
`ceiling`-остановки НЕ публикуется.** Довод записывается и в код, и в отчёт.
**И зеркало, которое твой пак делает ложным В СТОРОНУ ОТСУТСТВИЯ:** `backend/internal/runevents/runevents.go:289`=`ITS PRESENCE RULE IS`
говорит «правило присутствия — „потолок был ДОСТИГНУТ“, а не „исход = ceiling“». После пака потолок бывает
достигнут, а `Money` нет. ⇒ сузь прозу до «ОСТАНОВИЛ прогон» **в своей зоне** и **назови мне зеркала вне
её** (платформенный приёмник событий, канон 14) — я отнесу. Чужое не правь.
**Решаешь сам и аргументируешь:** имя причины · где ставится деградация. ⛔ **И вот ШТАТНЫЙ носитель,
который первая редакция промта пропустила:** у `runAttempt` уже есть параметр **`mandatory`** — «позволено
@ -110,6 +126,12 @@
завершён), **а не `exit 4`**. ⚠ Не «успехом»: `exit 0` требует, чтобы флагов не было вовсе, а флаг здесь
есть по построению — это и есть честный исход.
**И заточка, которую дала исполняющая сессия, — она идёт В АКТ:** лечение клина НЕ зависит от того,
кончился прогон кодом 2 или 4. Даже когда потолок исчерпан совсем и попытка 0 следующего юнита законно
останавливает книгу, у деградированного юнита **всё равно появляется строка** — то есть следствие (1)
закрыто и в окне `exit 4`. **Пин ниже стережёт более узкое окно, чем сам выигрыш**, и это надо сказать, а
не выдать окно пина за границу лечения.
**И назови СУЖЕНИЕ, иначе будешь ловить недостижимое:** утверждение верно в ОКНЕ, когда остатка потолка
хватает на попытку 0 каждого следующего юнита. Кончился потолок совсем — попытка 0 следующего юнита
обязательна, отказ по ней штатно останавливает книгу, и `exit 4` возвращается ЗАКОННО. Фикстуру строй
@ -130,7 +152,21 @@
`TestEveryOperatorMessageIsCatalogued` — внести новое сообщение в
`backend/internal/pipeline/testdata/operator-messages.txt`.
### 4.3 Платформенная половина — **твоё дело назвать, не построить**
### 4.3 ⛔ ДЕФЕКТ, КОТОРЫЙ ТВОЙ ПАК НАКОРМИТ — и он НЕ латентный. Чинить ЗДЕСЬ
Нашла исполняющая сессия, посылку я пере-проверил и **она у неё неверна в СТОРОНУ МЯГКОСТИ**.
`backend/internal/pipeline/quality.go` (греп `draftEchoRecovered`) считает эхо ВОССТАНОВЛЕННЫМ по одному
признаку — `FirstFlagReason == cjk_artifact`, — **не спрашивая, флагована ли строка сейчас и чем**. Денежный
отказ эхо-рероллу даст ровно эту картину: первый флаг — эхо, итоговый — денежный, реролла не было, а отчёт
скажет «восстановлено».
**Сессия назвала это латентным «потому что ключ 0». Ключ НЕ ноль:** `regenerate_echo_before_escalate: 1`
стоит **во всех ЧЕТЫРЁХ боевых конфигах** (`backend/configs/pipeline-c1.yaml`, `-c2`, `-arm-glm`,
`-arm-mistral` — сверено мною по каждому). ⇒ дефект оживает **в день лендинга твоего пака**, а не когда-то
потом. **Чини его в этом паке и пинь** — «диспозиция в отчёте» здесь недостаточна.
### 4.4 Платформенная половина — **твоё дело назвать, не построить**
Карта заметок платформы **РУКОПИСНАЯ** (`platform/internal/ingest/notes.go`) и уезжает независимо от
словаря движка. Цена несделанного **замерена**: `PD-246` — минор 0.10.0 сутки жил ЛОЖНЫМ на проводе, причина
@ -146,7 +182,7 @@
`TestAFlaggedUnitIsNotReportedAsDelivered`). Значит грант за него не съеден, а книга честно короче — это
хорошая новость, но она обязана быть СКАЗАНА в отчёте, иначе следующая смена откроет её заново.
### 4.4 Приложение — ДВА пина, краснеющих по УДАЧЕ (ряд 379, ОБЕ половины)
### 4.5 Приложение — ДВА пина, краснеющих по УДАЧЕ (ряд 379, ОБЕ половины)
Отдельная от §4.1 работа; делай её ПОСЛЕ основной. ⛔ **И мой диагноз здесь был НЕВЕРЕН — опровергнут
замером, а не мнением. Читай, чем именно, иначе повторишь мою ошибку.**