fix(devshard): дать ноде replay собственных pre-floor diffs при старте
Оригинал: fix(devshard): let a node replay its own pre-floor diffs on startup

Проблема
обеспечить соблюдение минимального уровня токенов вывода (#1391) добавлена проверка MinTokensFloor для applyStartInference . Эта проверка также выполняется при воспроизведении, поэтому узел, который выдавал выводы до того, как приземлился на пол, не может перезапуститься — он повторно запускает правило, написанное после того, как были сделаны его собственные различия:
replay nonce 12: max_tokens ниже минимального этажа min_tokens: max_tokens 1, этаж 64
Отказ от дифференциала ничего не отменяет. Это уже часть записанного корня состояния; отказ только удерживает узел в нерабочем состоянии.
Исправить
Отделяйте создание новой работы от воспроизведения уже принятой работы.
state.ApplyPersisted устанавливает replayingPersisted в тот же мьютекс, что и Apply, и очищает его с помощью defer
проверка пола пропускается только на этом пути
- на него переключаются оба сайта повторных вызовов: user/recover.go (шлюз) и cmd/devshardd/session/manager.go (хост-демон)
Ровно одна проверка ослаблена, и только одна, охраняющая создание новых работ. Живой трафик все еще должен соответствовать полу.
Тесты
Тест
Пакет
Обложки
TestApplyPersisted_ReplaysAStartWrittenBeforeTheFloor
государство
политический раскол, и что послабление не переживет призыв
TestRecoverSession_ReplaysADiffWrittenBeforeTheMaxTokensFloor
пользователь
путь восстановления шлюза, на основе затравленного дифференциала под полом
TestRecoverSessions_ReplaysADiffWrittenBeforeTheMaxTokensFloor
cmd/devshardd/сессия
путь восстановления демона хоста
Каждое приспособление утверждает, что ApplyLocal по-прежнему отклоняет разницу перед ее заполнением, поэтому тест не может молча прекратить воспроизведение ошибки.
Протестировано мутацией — 4/4 убито, каждый из них сначала проверен на компиляцию: Floor игнорирует флаг повтора; флаг никогда не сбрасывался; каждый сайт воспроизведения вернулся к ApplyLocal.
state , user и cmd/devshardd/session проходят полностью.

Problem
enforce inference tokens floor (#1391) added a MinTokensFloor check to applyStartInference . That check also runs on replay , so a node that served inferences before the floor landed cannot restart — it re-runs a rule written after its own diffs were made:
replay nonce 12: max_tokens below min_tokens floor: max_tokens 1, floor 64
Refusing the diff undoes nothing. It is already part of a recorded state root; the refusal only keeps the node down.
Fix
Separate authoring new work from replaying work already accepted .
state.ApplyPersisted sets replayingPersisted under the same mutex as the apply and clears it via defer
the floor check is skipped only on that path
both replay call sites switch to it: user/recover.go (gateway) and cmd/devshardd/session/manager.go (host daemon)
Exactly one check is relaxed, and only the one guarding creation of new work. Live traffic still has to meet the floor.
Tests
Test
Package
Covers
TestApplyPersisted_ReplaysAStartWrittenBeforeTheFloor
state
the policy split, and that the relaxation does not outlive the call
TestRecoverSession_ReplaysADiffWrittenBeforeTheMaxTokensFloor
user
the gateway's recovery path, from a seeded sub-floor diff
TestRecoverSessions_ReplaysADiffWrittenBeforeTheMaxTokensFloor
cmd/devshardd/session
the host daemon's recovery path
Each fixture asserts ApplyLocal still rejects the diff before seeding it, so the test cannot silently stop reproducing the failure.
Mutation-tested — 4/4 killed , each verified to compile first: floor ignores the replay flag; flag never cleared; each replay site reverted to ApplyLocal .
state , user and cmd/devshardd/session pass in full.
Проблема
обеспечить соблюдение минимального уровня токенов вывода (#1391) добавлена проверка MinTokensFloor для applyStartInference . Эта проверка также выполняется при воспроизведении, поэтому узел, который выдавал выводы до того, как приземлился на пол, не может перезапуститься — он повторно запускает правило, написанное после того, как были сделаны его собственные различия:
replay nonce 12: max_tokens ниже минимального этажа min_tokens: max_tokens 1, этаж 64
Отказ от дифференциала ничего не отменяет. Это уже часть записанного корня состояния; отказ только удерживает узел в нерабочем состоянии.
Исправить
Отделяйте создание новой работы от воспроизведения уже принятой работы.
state.ApplyPersisted устанавливает replayingPersisted в тот же мьютекс, что и Apply, и очищает его с помощью defer
проверка пола пропускается только на этом пути
Ровно одна проверка ослаблена, и только одна, охраняющая создание новых работ. Живой трафик все еще должен соответствовать полу.
Тесты
Тест
Пакет
Обложки
TestApplyPersisted_ReplaysAStartWrittenBeforeTheFloor
государство
политический раскол, и что послабление не переживет призыв
TestRecoverSession_ReplaysADiffWrittenBeforeTheMaxTokensFloor
пользователь
путь восстановления шлюза, на основе затравленного дифференциала под полом
TestRecoverSessions_ReplaysADiffWrittenBeforeTheMaxTokensFloor
cmd/devshardd/сессия
путь восстановления демона хоста
Каждое приспособление утверждает, что ApplyLocal по-прежнему отклоняет разницу перед ее заполнением, поэтому тест не может молча прекратить воспроизведение ошибки.
Протестировано мутацией — 4/4 убито, каждый из них сначала проверен на компиляцию: Floor игнорирует флаг повтора; флаг никогда не сбрасывался; каждый сайт воспроизведения вернулся к ApplyLocal.
state , user и cmd/devshardd/session проходят полностью.