원클릭으로
game-ai-adaptation
BoardGame 游戏 AI 接入入口。用于 AI/机器人/自动玩家、ai.ts、自动响应、watchdog、强制跳过、卡死兜底和响应窗口门禁。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
BoardGame 游戏 AI 接入入口。用于 AI/机器人/自动玩家、ai.ts、自动响应、watchdog、强制跳过、卡死兜底和响应窗口门禁。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
BoardGame 项目内参考图生成 Three.js 程序化模型流程。用于 img2threejs、图生模型、参考图重建、Three.js 游戏资产原型、书本/棋盘/卡牌/道具 3D 模型任务;在动手写模型前先拆参考图结构并建立“参考图区域到模型部件/材质”的追踪表,禁止把参考图当整面贴图贴皮,也禁止脱离参考图生成泛主题模型。
BoardGame 线上反馈批量收口流程。用于未关闭反馈、排重、真假 bug 分诊、并行修复、状态回写、关闭误报/重复反馈。
BoardGame 规则 bug 修复流程。用于卡牌、技能、Token、状态、阶段、伤害、资源、升级/基础差异、结算顺序和审计漏审。
BoardGame Git 操作入口。用于提交、推送、同步主分支、pre-push 阻塞、PR、worktree、fork、merge 等协作场景。
BoardGame 新游戏创建或资源/data intake 流程。用于新增游戏、只给图片/位置先开工;按现有游戏模式分阶段推进并验收。
BoardGame 截图交付流程。用于打开图、给我看图、看截图、图呢、端到端截图;最终验收图默认走图片预览站。
| name | game-ai-adaptation |
| description | BoardGame 游戏 AI 接入入口。用于 AI/机器人/自动玩家、ai.ts、自动响应、watchdog、强制跳过、卡死兜底和响应窗口门禁。 |
出现下列任一情况就触发本技能:
src/games/<gameId>/ai.tsAI 接入、AI 适配、AI 卡死、自动跳过、强制推进、watchdog、response-window、无解交互若用户关注的是“AI 蠢 / 打法优化 / 策略设计 / 对比大杀四方 / 英雄或卡组画像 / 评分模型重构”,先读项目 skill:.codex/skill/game-ai-strategy-design/SKILL.md。本技能只负责 AI 合法动作、交互闭环、卡死和兜底。
docs/ai-rules/engine-systems.mddocs/ai-rules/testing-audit.mdreferences/checklist.mdreferences/response-window-watchdog.mdreferences/vitest-templates.mdevidence/engine/online-ai-watchdog-strong-audit-2026-04-12.mdevidence/engine/ai-stall-loop-full-chain-audit-2026-04-12.mdevidence/dicethrone/dicethrone-ai-interaction-audit-2026-04-11.mdevidence/dicethrone/dicethrone-ai-interaction-audit-2026-04-12.mdevidence/dicethrone/dicethrone-response-window-retrigger-audit-2026-04-12.mdevidence/dicethrone/dicethrone-discard-undo-loop-audit-2026-04-11.mddomain/execute.ts / domain/systems.ts 中创建交互InteractionSystem 负责:
sys.interaction.current / queuecreateSimpleChoice() / createMultistepChoice()resolveInteraction()playerView() 对非当前玩家隐藏交互详情,并只暴露 isBlocked关键事实:
createSimpleChoice() 若传入空选项,会直接打印错误:这是卡死前兆,不是可接受状态playerView 中看不到 current,只会看到 isBlocked=trueResponseWindowSystem 负责:
RESPONSE_WINDOW_EVENTS.OPENED / CLOSEDRESPONSE_PASSSYS_RESPONSE_WINDOW_FORCE_CLOSEallowedCommandsresponderExemptCommandsallowNonResponderCommand关键事实:
RESPONSE_PASSpendingInteractionId / stale queue / reopen 事件再次卡住SYS_RESPONSE_WINDOW_FORCE_CLOSE,再继续把 AI 阶段收口src/engine/transport/server.tssrc/engine/transport/onlineAiRecovery.ts
resolveForceSkippableHiddenAiInteraction()resolveForceEndTurnForStalledAi()resolveForceAdvancePhaseAfterRecovery()resolveUnsatisfiableReasonFromInteraction()buildOnlineAiRecoveryStateSnapshot()buildUnsatisfiableInteractionStateSnapshot()关键事实:
applyPlayerView(match, playerId) 生成 seat view 才能诊断interaction.current == null && isBlocked == true,要优先怀疑隐藏交互currentResponderId === human 简化成“一律返回 null”。正确判断是:
nullSYS_RESPONSE_WINDOW_FORCE_CLOSE禁止:
validate() 会拒绝的命令留给 AIdisabled=true 选项当成可行动作removable=false 的状态/标记当成可移除目标rollConfirmed=true 之后继续生成重掷动作必须:
至少要有一个:
SYS_INTERACTION_RESPONDSYS_INTERACTION_CANCELRESPONSE_PASSADVANCE_PHASEEND_PHASE)没有收口命令的交互 = 设计缺陷,不是“AI 之后再补”
允许:
RESPONSE_PASSSYS_RESPONSE_WINDOW_FORCE_CLOSE,再做 follow-up advance禁止:
RESPONSE_PASS / 选项选择watchdog 是最后兜底,不是第一修法。
优先级必须是:
默认口径(当前仓库):
minimumActionDelayMs 只决定“延迟时长”,不决定“哪些动作延迟”LocalGameProvider 的动作类型门控决定只要本轮要改 AI、自动回合、watchdog、自动跳过、自动确认、自动推进、ai.ts 或 AI 相关 UI,就必须先把当前链路里的动作分成两类:
最低清单必须至少点名:
没写出这份清单前,不得实施。
当用户明确说“不要改延迟”时,仍必须主动检查并补齐以下项目,而不是把问题简化成“那就不动 AI 了”:
实现落点(必须同步 src 与 e2e/src):
src/engine/transport/react.tsxe2e/src/engine/transport/react.tsxFAST_AI_COMMAND_TYPES(本步快速放行)NO_FOLLOW_UP_DELAY_ACTION_KINDS(本步执行后不应给下一步上 gate)shouldSkipFollowUpActionDelay()收口判定(必须带日志证据):
[LOCAL_AI_PERF] scheduled/dispatched/command-progress 验证:
gateDelayMs=0gateDelayMs≈minimumActionDelayMs默认应判为可见动作的包括:
默认应判为静默动作的包括:
advance phase如果某一步介于两者之间,按用户体感归类:用户会不会把它当作“这一步已经发生了”。会,就按可见动作处理;不会,就按静默动作处理。
表现:
empty-options根因常见点:
createSimpleChoice() 传入空 optionsoptionsGenerator 失效后没刷新multi.min > enabledOptions.length避免方式:
autoRefresh / optionsGeneratormin=0 时提供 done 或空提交闭环autoCancelOption / skip / doneguard:
SYS_INTERACTION_CANCELresolveForceSkippableHiddenAiInteraction()empty-options / all-options-disabled / min-selection-unreachable表现:
interaction.currentisBlocked=true根因常见点:
playerView 可见避免方式:
applyPlayerView(match, playerId) 结果resolveForceEndTurnForStalledAi()guard:
SYS_INTERACTION_RESPOND表现:
RESPONSE_WINDOW_OPENED 音效不断响根因常见点:
避免方式:
sourceId / interactionId / 已确认标记 做一次性 guardguard:
SYS_RESPONSE_WINDOW_FORCE_CLOSE,不是傻发 ADVANCE_PHASERESPONSE_PASS表现:
根因常见点:
避免方式:
interactionId / sourceId 上,AI 不要无限重试同一失败动作guard:
onlineAiRecovery.ts 的 loop 检测只当最终兜底ai.ts 本地先断掉循环表现:
根因常见点:
避免方式:
currentPlayerIdcurrentResponderIdseatControllers红线:
先确认这次动的是哪一层:
src/games/<gameId>/ai.tssrc/games/<gameId>/domain/**src/engine/systems/InteractionSystem.ts / ResponseWindowSystem.tssrc/engine/transport/server.ts / onlineAiRecovery.ts必须写清:
没有这四条,先别改代码。
对每个交互类型都问四个问题:
优先顺序:
至少要有:
优先放:
src/engine/transport/__tests__/server.test.ts适合测:
SYS_RESPONSE_WINDOW_FORCE_CLOSE 再收口RESPONSE_PASS优先放:
src/games/dicethrone/__tests__/basic-commands-coverage.test.tssrc/games/dicethrone/__tests__/flow.test.tssrc/games/dicethrone/__tests__/response-window-interaction-lock.test.tssrc/games/dicethrone/__tests__/token-response-window.test.ts适合测:
优先放:
src/games/smashup/__tests__/promptSystem.test.tssrc/games/smashup/__tests__/beforeScoring-window-stuck.test.tssrc/games/smashup/__tests__/duplicateInteractionRespond.test.tssrc/games/smashup/__tests__/afterscoring-window-skip-base-clear.test.ts适合测:
优先放:
src/games/summonerwars/__tests__/basic-commands-coverage.test.tssrc/games/summonerwars/__tests__/interaction-chain-comprehensive.test.tssrc/games/summonerwars/__tests__/flow.test.ts适合测:
evidence/engine/...evidence/<gameId>/...interactionId / sourceIdcurrentResponderId / responderQueue(若涉及 response-window)playerView / isBlocked(若涉及 hidden interaction)legalActions / unsatisfiable reasonAI seat only / human guard__tests__playerViewFORCE_CLOSE + follow-up,不是无效 ADVANCE_PHASEnpx eslint <改动文件> 已通过references/checklist.mdreferences/vitest-templates.md