Dota Live Test

SkillMonitoring & ops

Runs a live Dota 2 test match, saves the console log to disk, and greps it to check code changes worked.

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Dota Live Test skill

About this skill

Run a live match in Dota 2 Tools, save the console log to disk, then grep to verify changes. Trigger: the user says "实机验证" (live verification), "跑一局看看" (run a match), or "帮我测一下" (test it for me), or when a change depends on engine runtime behavior (event send/receive, modifier effects, API chains) t

What this skill tells your AI

The instructions your AI receives, as published by windy10v10ai/game in .claude/skills/dota-live-test/SKILL.md and read by ahel’s review.

实机验证的关键是日志落盘:让 Dota 把控制台输出写进文件,用 grep 读,而不是截图读 VConsole 窗口。

con_logfile 在 Source 2 不是有效命令,运行时开不了文件日志,只能在启动参数里加。

验 bot AI 行为:用自动对局

验电脑的交战、回防、推进、物品施放时,不手动开局,用 npm run perf 跑无人值守的一局(第 3~5 步由脚本代劳),第 1、6 步照常:

npm run perf -- --server tools --mode soak --soakMinutes 30 --soakTimescale 2 --minGames 1 --maxGames 1

按要验的场景加参数(全部选项见 src/scripts/perf.js 的 parseArgs):

场景参数
天辉强推电脑高地与基地--boost false --radiantPlayers 5 --radiantMultiplier 10 --direMultiplier 1
物品施放--testItems item_a,item_b:开局发物品并停掉买卖装备
指定英雄出场--botHeroes axe,lion
  • 加速不超过 2 倍,更高会拖垮服务器
  • 每局结束在运行目录写 anomaly-<N>.md(卡住、远路不传送、挤在一起、打撤来回切、没任务、建筑挨打没人到场),先读它再 grep 细节。手动局用 npm run bot-anomaly [日志路径] 出同样的报告
  • 下一局启动会删掉 console.log,要留的日志先拷到 scratchpad
  • 天辉被替成 AI 顶位,报告只统计人数多的一方;天辉那侧的行为不代表真实玩家

派子代理跑

下面的步骤是照本宣科的固定流程,判断日志算不算通过则要改动的上下文。分工:子代理跑流程并回报观察,主会话做判断。

用 Agent 工具、model: "sonnet",一轮验证派一个,跑完即结束;要再验一轮就再派一个。子代理是冷启动,交接里写全:改了什么、要不要本地后端、怎么触发、期待哪几行日志。

  • 只回报观察:哪几行出现了、时间戳是多少、断在哪一步。诊断和改代码留给主会话
  • 开工先查端口,没起的自己起——上一轮的后台进程不一定还活着
  • 不收尾:关不关由主会话决定,见第 6 步

验证点只有一两个时,写交接比自己跑还贵,直接自己跑。

拿到这份 skill 的子代理从第 1 步开始,不再往下派。

步骤

1. 编译改动

改了 src/vscripts/ 跑一次 npm run build:vscripts。content/panorama/ 下的 .js 由 tools 自动编译并热重载,不用手动处理。

完成判据:编译无报错。

2. 决定要不要本地后端

只验游戏内逻辑(技能、modifier、AI、UI)跳到第 3 步。要验 API 链路才起后端。

后端在 C:/Users/windy/Documents/GitHub/firebase(需要 java):

firebase emulators:start --only firestore,auth --import ./firestore-backup --project windy10v10ai
cd api && npm run start

两条都用 Bash 的 run_in_background 起,输出写进任务文件,不要前台轮询。模拟器占 8080 / 9099,API 占 3001,等 3001 进入 LISTENING 再开局,否则开局请求会打空。

同时确认 src/vscripts/api/api-client.local.ts 的 GetApiTarget() 返回 'local'。

完成判据:netstat -ano | grep -E ":(8080|9099|3001)\b.*LISTENING" 三个端口都在。

3. 启动 Dota

Dota 已在运行时直接 Start-Process 会开出第二个实例,只弹一个 Source2 - Warning 窗口,要先 Stop-Process -Name dota2 -Force。

$dota = "C:\Program Files (x86)\Steam\steamapps\common\dota 2 beta\game\bin\win64"; Start-Process -FilePath "$dota\dota2.exe" -WorkingDirectory $dota -ArgumentList '-novid','-tools','-addon','windy10v10ai','-condebug','-conclearlog','+dota_launch_custom_game','windy10v10ai','dota'

-condebug 把输出写到 <dota>/game/dota/console.log,-conclearlog 每次启动清空该文件,避免跨会话累积。+dota_launch_custom_game 让地图自动加载,不需要点任何按钮。

完成判据:console.log 出现且体积在涨。

4. 触发要验的流程

开局流程(/game/start、队伍选择、抽奖初始化)在地图加载时自动跑完,第 3 步就已经触发。

需要再跑一遍时有两种重开方式:

  • 重启进程,参数同上。慢一两分钟,任何环境都能用。
  • VConsole 命令框输入 dota_launch_custom_game windy10v10ai dota,几秒钟重新加载。需要能操作窗口,即桌面应用的 computer-use MCP;Claude Code CLI 里没有这套工具。

重开前记下当前行数(wc -l < console.log),之后用 awk 'NR>N' 只看新增部分。

完成判据:日志里出现目标流程的第一条输出。

5. 读日志

grep -n "ApiHtmlProxy\|GameStartProxy" "C:/Program Files (x86)/Steam/steamapps/common/dota 2 beta/game/dota/console.log"

两路输出都在同一个文件里,按前缀区分:

前缀来源
[VScript]服务端 print()
[PanoramaScript]客户端 $.Msg()

每行带 MM/DD HH:MM:SS 时间戳,跨端时序(谁先谁后、间隔多久)直接读得出来,是定位握手和时机类问题的主要依据。

等日志出现用 Bash 的 run_in_background 跑 until grep -q ...; do sleep 5; done。

完成判据:目标流程的每一步都在日志里找到对应行,或明确指出断在哪一步。

6. 收尾

关不关由主会话决定,子代理一律不关——中途关掉,下一轮还要重起一遍。三种情况:

  • 全部验证结束 → 关
  • 还要再验一轮 → 留着
  • 用户说开着没事 → 留着

留着的时候要把留了哪些进程告诉用户,别让它们在后台无声占着端口。

要关的时候,TaskStop 只杀后台任务的外层 shell,模拟器的 java 和 API 的 node 会活下来,要按 PID 补杀,再确认三个端口都已释放。Dota 退出后按需删 console.log。

派出去的子代理与子会话本身也要收尾:它回报完成后就停掉并归档,没提交过东西的 worktree 与分支一并删干净。这是一次派活的最后一步,不要等用户问「怎么又没关」。

完成判据:关掉时三个端口全部释放;留着时已经把留了什么告诉用户;派出去的会话没有一个还挂着。

临时调试日志

为定位问题临时加的 print / $.Msg 在问题定位完后要删干净,只留下调用与结果两类。判据:一次请求的日志量不随数据量增长(不整条打印响应体)。

Signals

GitHub stars
78
Forks
39
Last commit
Oct 2026
Advanced
Item type
skill
Key
dota-live-test
Source
github.com/windy10v10ai/game