[enhancement] Умный противник после новых механик: актуальная модель батарей, честная разведка и устойчивая очередь маршрутов #127

Closed
opened 2026-11-05 21:38:25 +00:00 by chexit · 2 comments
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Запрос владельца: проверить, сохранилась ли «умность» противника после добавления батарей, ролей РЛС, радиомолчания, новых коллизий и логистики. Аудит закреплён на kimi-work @ 61aaa0bf359026711ba811a7f7e9877ce253ead2.

Что уже работает

Это не предложение переписать всё с нуля. Есть инкрементальный планировщик налёта с бюджетом, обход известных зон и рельефа на этапе исходного плана, учёт истории направлений, раскрытие стреляющих комплексов/РЭБ, перенацеливание и специализированные задания против наблюдавшихся РЛС. Тест sead_uses_only_unexpired_observations_at_the_last_known_position проверяет использование последней известной позиции и TTL. Эти свойства следует сохранить.

Подтверждённые расхождения

1. Оценка угрозы отстала от реальной схемы батарей. price_grid_on вызывает sight::reach как собственный сенсор даже для LauncherOnly и отключённого поиска. Сам reach вычисляет геометрическую дальность, а не проверяет работоспособность поиска; актуальный radar_up исключает эти состояния. Сетевые доноры в оценке выбираются через общий sight::LINK, без полного актуального контракта link_range/роли РЛС, разрешающей применение оружия.

Изолированная native-проверка на этом 61aaa0bf35: один известный С-400 в LauncherOnly, без других юнитов/РЛС; radar_up=false, battery_status.linked=false. Для Х-22 планировщик всё равно добавляет риск в 272 ячейки сетки 41×41 (cell=32, min=(-640,0,-640), work=529). Это консервативная оценка, но она сейчас получается из скрытой конфигурации живого объекта, а не из осознанной неопределённости разведки. Нужна одна семантика возможностей и явная модель уверенности, а не отдельная устаревшая имитация боевой системы.

2. Массовое перенацеливание безвозвратно теряет необработанные маршруты. adapt/replan_routes сразу очищает маршруты всех выбранных объектов; при исчерпании WORK_PER_TICK цикл останавливается. Необработанные задания не сохраняются. На следующем adapt объект уже направлен в известную позицию и пропускается.

Native-проверка: 40 известных С-400 (сетка 8×5, шаг 160), 40 queued smart Х-22 с существующими маршрутами, старт x=-1800, разные z; цель до адаптации (1800,70,1800). После tick=40; adapt() 39 из 40 маршрутов пусты; ещё пять вызовов на тиках 80…240 оставляют те же 39 пустыми. Это прямо описанный в комментарии fallback «оставшиеся летят прямо», а не неожиданная новая регрессия. Но с выросшими налётами он существенно ослабляет противника. Сохранять лимит работы нужно; терять задания навсегда — нет.

3. Повторный план слабее исходного по рельефу. Исходный план вызывает plan_route_on(... relief ...), а повторный — price_grid и plan_route без relief. После новых voxel-коллизий это уже не только вопрос красоты маршрута. Нужны одинаковые ограничения известного рельефа, допустимой высоты и безопасного продолжения для обоих путей планирования.

4. Граница знаний проведена не везде. known_units отбрасывает известные записи по фактическому alive(); оценка зон читает реальные roles/состояние/модель юнита по ID; adapt узнаёт об уничтожении прежней цели из живого self.sams. Перемещение позиции уже частично отделено от разведданных (#93), однако остальные атрибуты всё ещё могут обновляться без наблюдения. Не требуется делать противника слепым: требуется явно разделить наблюдение, предположение и истину симуляции.

Предлагаемые этапы

  1. EnemyPicture и общая модель возможностей. Хранить последнюю наблюдавшуюся позицию/тип/режим излучения/состояние, время и уверенность. Снимок живой симуляции не должен автоматически превращаться в точные знания. Общий каталог возможностей батареи/связи применять к известным данным; неизвестные параметры оценивать консервативно и объяснимо. При скрытом изменении мира решения до нового наблюдения должны оставаться одинаковыми.
  2. Устойчивая очередь перепланирования. Задания с ID объекта, целью и версией знаний живут между тиками. Фиксированный бюджет, приоритет и отмена устаревших jobs; старый безопасный участок сохраняется до готовности нового, либо используется явно проверенный fallback. Отдельно проверять сохранение/загрузку очереди и смену Live/Replay. Не переносить mutable Sim на случайные потоки (#126).
  3. Структурированное намерение. Отделить «основная цель/реакция на раскрытие/подавление наблюдавшейся РЛС» от случайной замены target. Ограничить частоту переключений, учитывать уже назначенные объекты, цену смены маршрута и неопределённость. Отключение РЛС, разделённая батарея, ограниченный боезапас/логистика и конечная энергия перехватчика должны иметь явные игровые реакции, без чтения скрытых резервов игрока.
  4. Адаптация по результатам игровых боёв. Расширять существующую статистику успеха направлений ограниченными весами и забыванием; сравнивать несколько вариантов плана по одинаковому seed. Не давать ИИ сверхточных данных о невидимых объектах и не подменять сложность увеличением характеристик.
  5. Объяснимость и сценарный стенд. Debug-слой: что противник знает, почему выбрал цель, какую угрозу предполагает, какие jobs ждут бюджета. Это сильно полезнее настройки десятка непрозрачных коэффициентов.

Приёмка

  • Сценарии integrated/launcher-only без донора и с донорами разных ролей, отключённый поиск при сохранённом сетевом целеуказании, разрыв связи, наблюдаемое/ненаблюдаемое перемещение и уничтожение.
  • Массовый ретаргет 40+ объектов: очередь гарантированно продвигается между тиками, нет вечных пустых маршрутов, общий бюджет остаётся ограничен.
  • Повторный план учитывает известную гору/стену; Unknown не считается гарантированно свободным проходом и не раскрывает ещё не наблюдавшуюся карту.
  • Метаморфные тесты честности: скрыто изменить боезапас/позицию/состояние юнита — до получения нового наблюдения EnemyPicture и решения совпадают.
  • Для набора seed сравнить completion, потери и причины отказа планировщика; bounded work и воспроизводимость сохранить. Привести baseline и результат, а не просто заявление «ИИ стал умнее».

Связано: #91, #93, #103, #118, #120, #121, #126. Приоритет P2; отдельные подтверждённые проблемы можно выделить в дочерние задачи при реализации.

🤖 Filed by Codex, AI-агент Владимира (chexit). Запрос владельца: проверить, сохранилась ли «умность» противника после добавления батарей, ролей РЛС, радиомолчания, новых коллизий и логистики. Аудит закреплён на `kimi-work` @ `61aaa0bf359026711ba811a7f7e9877ce253ead2`. ### Что уже работает Это не предложение переписать всё с нуля. Есть инкрементальный планировщик налёта с бюджетом, обход известных зон и рельефа на этапе исходного плана, учёт истории направлений, раскрытие стреляющих комплексов/РЭБ, перенацеливание и специализированные задания против наблюдавшихся РЛС. Тест `sead_uses_only_unexpired_observations_at_the_last_known_position` проверяет использование последней известной позиции и TTL. Эти свойства следует сохранить. ### Подтверждённые расхождения **1. Оценка угрозы отстала от реальной схемы батарей.** [price_grid_on](https://gitea.maoniao.team/chexit/airdef/src/commit/61aaa0bf359026711ba811a7f7e9877ce253ead2/airdef-mod/src/sim/raid.rs#L625) вызывает `sight::reach` как собственный сенсор даже для `LauncherOnly` и отключённого поиска. Сам `reach` вычисляет геометрическую дальность, а не проверяет работоспособность поиска; актуальный [radar_up](https://gitea.maoniao.team/chexit/airdef/src/commit/61aaa0bf359026711ba811a7f7e9877ce253ead2/airdef-mod/src/sim/sight.rs#L329) исключает эти состояния. Сетевые доноры в оценке выбираются через общий `sight::LINK`, без полного актуального контракта `link_range`/роли РЛС, разрешающей применение оружия. Изолированная native-проверка на этом 61aaa0bf359026711ba811a7f7e9877ce253ead2: один известный С-400 в `LauncherOnly`, без других юнитов/РЛС; `radar_up=false`, `battery_status.linked=false`. Для Х-22 планировщик всё равно добавляет риск в **272 ячейки** сетки 41×41 (cell=32, min=(-640,0,-640), work=529). Это консервативная оценка, но она сейчас получается из скрытой конфигурации живого объекта, а не из осознанной неопределённости разведки. Нужна одна семантика возможностей и явная модель уверенности, а не отдельная устаревшая имитация боевой системы. **2. Массовое перенацеливание безвозвратно теряет необработанные маршруты.** [adapt/replan_routes](https://gitea.maoniao.team/chexit/airdef/src/commit/61aaa0bf359026711ba811a7f7e9877ce253ead2/airdef-mod/src/sim/ew.rs#L156) сразу очищает маршруты всех выбранных объектов; при исчерпании `WORK_PER_TICK` цикл останавливается. Необработанные задания не сохраняются. На следующем `adapt` объект уже направлен в известную позицию и пропускается. Native-проверка: 40 известных С-400 (сетка 8×5, шаг 160), 40 queued smart Х-22 с существующими маршрутами, старт x=-1800, разные z; цель до адаптации (1800,70,1800). После `tick=40; adapt()` **39 из 40 маршрутов пусты**; ещё пять вызовов на тиках 80…240 оставляют те же 39 пустыми. Это прямо описанный в комментарии fallback «оставшиеся летят прямо», а не неожиданная новая регрессия. Но с выросшими налётами он существенно ослабляет противника. Сохранять лимит работы нужно; терять задания навсегда — нет. **3. Повторный план слабее исходного по рельефу.** Исходный план вызывает `plan_route_on(... relief ...)`, а повторный — `price_grid` и `plan_route` без relief. После новых voxel-коллизий это уже не только вопрос красоты маршрута. Нужны одинаковые ограничения известного рельефа, допустимой высоты и безопасного продолжения для обоих путей планирования. **4. Граница знаний проведена не везде.** `known_units` отбрасывает известные записи по фактическому `alive()`; оценка зон читает реальные roles/состояние/модель юнита по ID; `adapt` узнаёт об уничтожении прежней цели из живого `self.sams`. Перемещение позиции уже частично отделено от разведданных (#93), однако остальные атрибуты всё ещё могут обновляться без наблюдения. Не требуется делать противника слепым: требуется явно разделить наблюдение, предположение и истину симуляции. ### Предлагаемые этапы 1. **EnemyPicture и общая модель возможностей.** Хранить последнюю наблюдавшуюся позицию/тип/режим излучения/состояние, время и уверенность. Снимок живой симуляции не должен автоматически превращаться в точные знания. Общий каталог возможностей батареи/связи применять к известным данным; неизвестные параметры оценивать консервативно и объяснимо. При скрытом изменении мира решения до нового наблюдения должны оставаться одинаковыми. 2. **Устойчивая очередь перепланирования.** Задания с ID объекта, целью и версией знаний живут между тиками. Фиксированный бюджет, приоритет и отмена устаревших jobs; старый безопасный участок сохраняется до готовности нового, либо используется явно проверенный fallback. Отдельно проверять сохранение/загрузку очереди и смену Live/Replay. Не переносить mutable Sim на случайные потоки (#126). 3. **Структурированное намерение.** Отделить «основная цель/реакция на раскрытие/подавление наблюдавшейся РЛС» от случайной замены `target`. Ограничить частоту переключений, учитывать уже назначенные объекты, цену смены маршрута и неопределённость. Отключение РЛС, разделённая батарея, ограниченный боезапас/логистика и конечная энергия перехватчика должны иметь явные игровые реакции, без чтения скрытых резервов игрока. 4. **Адаптация по результатам игровых боёв.** Расширять существующую статистику успеха направлений ограниченными весами и забыванием; сравнивать несколько вариантов плана по одинаковому seed. Не давать ИИ сверхточных данных о невидимых объектах и не подменять сложность увеличением характеристик. 5. **Объяснимость и сценарный стенд.** Debug-слой: что противник знает, почему выбрал цель, какую угрозу предполагает, какие jobs ждут бюджета. Это сильно полезнее настройки десятка непрозрачных коэффициентов. ### Приёмка - Сценарии integrated/launcher-only без донора и с донорами разных ролей, отключённый поиск при сохранённом сетевом целеуказании, разрыв связи, наблюдаемое/ненаблюдаемое перемещение и уничтожение. - Массовый ретаргет 40+ объектов: очередь гарантированно продвигается между тиками, нет вечных пустых маршрутов, общий бюджет остаётся ограничен. - Повторный план учитывает известную гору/стену; Unknown не считается гарантированно свободным проходом и не раскрывает ещё не наблюдавшуюся карту. - Метаморфные тесты честности: скрыто изменить боезапас/позицию/состояние юнита — до получения нового наблюдения EnemyPicture и решения совпадают. - Для набора seed сравнить completion, потери и причины отказа планировщика; bounded work и воспроизводимость сохранить. Привести baseline и результат, а не просто заявление «ИИ стал умнее». Связано: #91, #93, #103, #118, #120, #121, #126. Приоритет P2; отдельные подтверждённые проблемы можно выделить в дочерние задачи при реализации.
chexit added the area:architecturetype:enhancementpriority:P2area:simulation labels 2026-11-05 21:38:25 +00:00
Author
Owner

🤖 Agent: Kimi Code, с участием DeepSeek fast.

Опубликована узкая часть #127 в kimi-work: 6f7b041c8, a47812aad, a592ece6e.

Массовый retarget больше не теряет маршруты при исчерпании WORK_PER_TICK: FIFO-задания по ID дрона продолжаются между тиками, старый безопасный маршрут сохраняется до готовности нового, повторный retarget заменяет job без дублей, отмена имеет явный fallback. Повторный план использует известный рельеф исходной версии.

При ревью отдельно исправлены два versioning-риска: каждый job хранит Arc<KnownRelief> своей версии (новая волна не меняет его карту), а price/route caches ключуются полной KnowledgeVersion (tick + known + relief), поэтому разведка разных тиков не смешивается.

Регрессии: 40+ ретаргетов с прогрессом каждый бюджетный тик и отсутствием вечных пустых маршрутов, детерминизм/отсутствие дублей, смена рельефа новой волной, разные known snapshots при одинаковом relief.

Проверки: core release 204 + 8 сценариев (8 ignored), adapter 67 + 1 boundary + 5 сценариев, WASM 30 шагов. Save-формат не менялся: текущий формат дронов/запуска очереди не содержит.

Не заявляю полный EnemyPicture, честное разделение наблюдения/истины, структурированное намерение, durable queue и GUI/Windows-приёмку — они остаются в #127. Issue открыт.

🤖 Agent: Kimi Code, с участием DeepSeek fast. Опубликована узкая часть #127 в `kimi-work`: `6f7b041c8`, `a47812aad`, `a592ece6e`. Массовый retarget больше не теряет маршруты при исчерпании `WORK_PER_TICK`: FIFO-задания по ID дрона продолжаются между тиками, старый безопасный маршрут сохраняется до готовности нового, повторный retarget заменяет job без дублей, отмена имеет явный fallback. Повторный план использует известный рельеф исходной версии. При ревью отдельно исправлены два versioning-риска: каждый job хранит `Arc<KnownRelief>` своей версии (новая волна не меняет его карту), а price/route caches ключуются полной `KnowledgeVersion` (tick + known + relief), поэтому разведка разных тиков не смешивается. Регрессии: 40+ ретаргетов с прогрессом каждый бюджетный тик и отсутствием вечных пустых маршрутов, детерминизм/отсутствие дублей, смена рельефа новой волной, разные known snapshots при одинаковом relief. Проверки: core release 204 + 8 сценариев (8 ignored), adapter 67 + 1 boundary + 5 сценариев, WASM 30 шагов. Save-формат не менялся: текущий формат дронов/запуска очереди не содержит. Не заявляю полный EnemyPicture, честное разделение наблюдения/истины, структурированное намерение, durable queue и GUI/Windows-приёмку — они остаются в #127. Issue открыт.
Author
Owner

🤖 Agent: Kimi Code. #127 реализован в 8fc10c07a и e7934a1eb: честная EnemyPicture, structured intent, versioned bounded очередь и durable air 1. Проверки: core release 232+8, adapter 68+1+5, WASM 30 шагов. Ограничения сохранения задокументированы. Issue закрываю.

🤖 Agent: Kimi Code. #127 реализован в `8fc10c07a` и `e7934a1eb`: честная EnemyPicture, structured intent, versioned bounded очередь и durable `air 1`. Проверки: core release 232+8, adapter 68+1+5, WASM 30 шагов. Ограничения сохранения задокументированы. Issue закрываю.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#127