Add rank, friends, fishing, and camp treasure with T2 studio models and skill presentation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
udx
2026-10-21 23:01:31 +08:00
co-authored by Cursor
parent 89e0fa246f
commit 079313fb06
677 changed files with 395371 additions and 9692 deletions
@@ -0,0 +1,8 @@
{
"status": "pass",
"inactiveParent": true,
"disabledAnimator": true,
"reenabledSampling": true,
"hiddenUnit": true,
"warnings": 0
}
+18
View File
@@ -0,0 +1,18 @@
{
"status": "pass",
"realAccountRestored": true,
"coinsCandyLevelShotsRosterFormationUnchanged": true,
"playMode": "stopped",
"scene": "Assets/Scenes/Boot.unity",
"sceneDirty": false,
"gameView": [
1080,
1920
],
"isolatedPort": 18085,
"isolatedServerStopped": true,
"developmentPort8080Healthy": true,
"postfixConsoleCursor": 350546,
"postfixConsoleErrors": 0,
"postfixConsoleWarnings": 0
}
+42
View File
@@ -0,0 +1,42 @@
{
"status": "pass",
"cases": [
{
"stage": 1,
"traceHashExact": true,
"outcomeExact": true,
"rewardExact": true,
"statsExact": true
},
{
"stage": 2,
"traceHashExact": true,
"outcomeExact": true,
"rewardExact": true,
"statsExact": true
},
{
"stage": 3,
"traceHashExact": true,
"outcomeExact": true,
"rewardExact": true,
"statsExact": true
},
{
"stage": 4,
"traceHashExact": true,
"outcomeExact": true,
"rewardExact": true,
"statsExact": true
},
{
"stage": 5,
"traceHashExact": true,
"outcomeExact": true,
"rewardExact": true,
"statsExact": true
}
],
"finalWalletRosterFormationExact": true,
"repeatClearNoReward": true
}
@@ -0,0 +1,7 @@
{
"status": "pass",
"authoritative": true,
"finalStateExact": true,
"animatorWarnings": 0,
"errors": 0
}
+973
View File
@@ -0,0 +1,973 @@
{
"battles": [
{
"formation": [
0,
1,
-1,
-1,
-1,
-1
],
"level": 2,
"result": {
"chest": 0,
"configVersion": "greenfield-1-2787887803fd",
"defeated": 9,
"durability": 10,
"duration": 64.15,
"firstClear": true,
"id": "first-day-command-9",
"leaks": [
0,
0,
0
],
"logicVersion": 1,
"reward": {
"balls": 3,
"candy": 40,
"coins": 80
},
"rulesVersion": 3,
"stageId": 1,
"stats": [
{
"absorbed": 0.0,
"damage": 16.04,
"healing": 0.0,
"pet": 0,
"skills": 8,
"slot": 0
},
{
"absorbed": 0.0,
"damage": 775.96,
"healing": 0.0,
"pet": 1,
"skills": 7,
"slot": 1
}
],
"traceHash": "134ea42cbb43ac95049c5fd27797134f5184f8cf52cc36d2516f3552e001b912",
"won": true
},
"shots": 2,
"stage": 1
},
{
"formation": [
0,
1,
-1,
-1,
-1,
-1
],
"level": 2,
"result": {
"configVersion": "greenfield-1-2787887803fd",
"defeated": 9,
"durability": 10,
"duration": 64.3,
"firstClear": true,
"id": "first-day-command-18",
"leaks": [
0,
0,
0
],
"logicVersion": 1,
"reward": {
"balls": 3,
"candy": 50,
"coins": 90
},
"rulesVersion": 3,
"stageId": 2,
"stats": [
{
"absorbed": 0.0,
"damage": 15.0,
"healing": 0.0,
"pet": 0,
"skills": 8,
"slot": 0
},
{
"absorbed": 0.0,
"damage": 838.65,
"healing": 0.0,
"pet": 1,
"skills": 7,
"slot": 1
}
],
"traceHash": "11b1bc2504da5de50cc683b82fc9257645d9229c743f79201bf6130598f0e574",
"won": true
},
"shots": 2,
"stage": 2
},
{
"formation": [
0,
2,
1,
-1,
-1,
-1
],
"level": 3,
"result": {
"chest": 1,
"configVersion": "greenfield-1-2787887803fd",
"defeated": 9,
"durability": 10,
"duration": 76.55,
"firstClear": true,
"id": "first-day-command-23",
"leaks": [
0,
0,
0
],
"logicVersion": 1,
"reward": {
"balls": 3,
"candy": 60,
"coins": 100
},
"rulesVersion": 3,
"stageId": 3,
"stats": [
{
"absorbed": 64.0,
"damage": 321.2,
"healing": 0.0,
"pet": 0,
"skills": 10,
"slot": 0
},
{
"absorbed": 0.0,
"damage": 260.4,
"healing": 0.0,
"pet": 1,
"skills": 4,
"slot": 2
},
{
"absorbed": 0.0,
"damage": 191.2,
"healing": 170.0,
"pet": 2,
"skills": 18,
"slot": 1
}
],
"traceHash": "698b4a6bca55d662c25e24400225f49b7fe45313006574829e2dedb797a2f94d",
"won": true
},
"shots": 2,
"stage": 3
},
{
"formation": [
0,
2,
1,
-1,
-1,
-1
],
"level": 4,
"result": {
"configVersion": "greenfield-1-2787887803fd",
"defeated": 9,
"durability": 10,
"duration": 74.3,
"firstClear": true,
"id": "first-day-command-28",
"leaks": [
0,
0,
0
],
"logicVersion": 1,
"reward": {
"balls": 3,
"candy": 70,
"coins": 110
},
"rulesVersion": 3,
"stageId": 4,
"stats": [
{
"absorbed": 46.0,
"damage": 257.4,
"healing": 0.0,
"pet": 0,
"skills": 10,
"slot": 0
},
{
"absorbed": 0.0,
"damage": 364.1,
"healing": 0.0,
"pet": 1,
"skills": 4,
"slot": 2
},
{
"absorbed": 0.0,
"damage": 279.4,
"healing": 122.0,
"pet": 2,
"skills": 13,
"slot": 1
}
],
"traceHash": "e835b75654fbe68b87a0e0369d6cdfd7389a4f2a6bb37223695c3e637852c66d",
"won": true
},
"shots": 2,
"stage": 4
},
{
"formation": [
0,
-1,
1,
-1,
2,
-1
],
"level": 5,
"result": {
"chest": 2,
"configVersion": "greenfield-1-2787887803fd",
"defeated": 8,
"durability": 5,
"duration": 87.10000000000001,
"firstClear": true,
"id": "first-day-command-33",
"leaks": [
0,
0,
1
],
"logicVersion": 1,
"reward": {
"balls": 5,
"candy": 100,
"coins": 200
},
"rulesVersion": 3,
"stageId": 5,
"stats": [
{
"absorbed": 78.0,
"damage": 313.3,
"healing": 0.0,
"pet": 0,
"skills": 11,
"slot": 0
},
{
"absorbed": 0.0,
"damage": 279.5,
"healing": 0.0,
"pet": 1,
"skills": 3,
"slot": 2
},
{
"absorbed": 0.0,
"damage": 305.9,
"healing": 280.0,
"pet": 2,
"skills": 25,
"slot": 4
}
],
"traceHash": "d26d25c5f159375339d2d2f3090b871db56e41c7f049efd1259d4891906d9fca",
"won": true
},
"shots": 2,
"stage": 5
}
],
"final": {
"ballRecoveryUnix": 1900040000,
"balls": 62,
"campInteractions": 0,
"campLayout": [
-1,
-1,
-1
],
"candy": 110,
"captureCount": 0,
"captureTutorialDone": true,
"challengeBadges": [
0,
0,
0,
0,
0
],
"challengeBestMs": [
0,
0,
0,
0,
0
],
"challengeRankAt": [
0,
0,
0,
0,
0
],
"chestDailyClaimed": 0,
"chests": [
0,
1,
1
],
"cleared": true,
"clearedStages": [
1,
1,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"coins": 720,
"dailyClaimed": [
0,
0,
0
],
"dailyDay": 21991,
"dailyProgress": [
2,
1,
0
],
"decorations": [
0,
0,
0
],
"duplicateStreak": 0,
"fishBest": 0,
"fishPlayed": 0,
"formation": [
0,
-1,
1,
-1,
2,
-1
],
"friendBlocked": [],
"friendIds": [],
"friendIn": [],
"friendOut": [],
"giftFrom": [],
"giftSent": [],
"goalClaimed": true,
"lastBattle": "first-day-command-35",
"lastCandy": 20,
"lastCoins": 40,
"lastShot": "first-day-command-4",
"level": 5,
"mails": [
{
"body": "欢迎和伙伴一起开启冒险!\n这份小小补给可用于弹珠发射和伙伴训练,请在有效期内领取。",
"claimed": true,
"expired": false,
"expiresAt": 1900644800,
"mailId": "welcome_supply_v1",
"read": true,
"reward": {
"balls": 5,
"candy": 20,
"coins": 0,
"tickets": 0
},
"sentAt": 1900040000,
"title": "欢迎来到小镇"
},
{
"body": "冒险首通、每日任务和七日登录都有独立奖励。\n邮件附件只有点击领取后才会到账;没有附件的通知只需阅读。",
"claimed": false,
"expired": false,
"expiresAt": 1900644800,
"mailId": "camp_notice_v1",
"read": false,
"reward": {
"balls": 0,
"candy": 0,
"coins": 0,
"tickets": 0
},
"sentAt": 1900040000,
"title": "营地来信"
}
],
"pendingAim": 0,
"pendingBattle": "",
"pendingFish": "",
"pendingShot": "",
"restPet": 0,
"revision": 33,
"schema": 14,
"selectedStage": 5,
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"shopBought": [
1,
0,
0
],
"shots": 2,
"signinClaimed": [
1,
0,
0,
0,
0,
0,
0
],
"signinDays": 1,
"stages": [
1,
1,
1,
0,
0,
0,
0,
0,
0,
0
],
"storyRankAt": 1900040195,
"tickets": 0,
"treasurePlayed": 0,
"treasureSeen": []
},
"initial": {
"ballRecoveryUnix": 1900040000,
"balls": 20,
"campInteractions": 0,
"campLayout": [
-1,
-1,
-1
],
"candy": 0,
"captureCount": 0,
"captureTutorialDone": false,
"challengeBadges": [
0,
0,
0,
0,
0
],
"challengeBestMs": [
0,
0,
0,
0,
0
],
"challengeRankAt": [
0,
0,
0,
0,
0
],
"chestDailyClaimed": 0,
"chests": [
0,
0,
0
],
"cleared": false,
"clearedStages": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"coins": 0,
"dailyClaimed": [
0,
0,
0
],
"dailyDay": 21991,
"dailyProgress": [
0,
0,
0
],
"decorations": [
0,
0,
0
],
"duplicateStreak": 0,
"fishBest": 0,
"fishPlayed": 0,
"formation": [
0,
1,
-1,
-1,
-1,
-1
],
"friendBlocked": [],
"friendIds": [],
"friendIn": [],
"friendOut": [],
"giftFrom": [],
"giftSent": [],
"goalClaimed": false,
"lastBattle": "",
"lastCandy": 0,
"lastCoins": 0,
"lastShot": "",
"level": 1,
"mails": [
{
"body": "欢迎和伙伴一起开启冒险!\n这份小小补给可用于弹珠发射和伙伴训练,请在有效期内领取。",
"claimed": false,
"expired": false,
"expiresAt": 1900644800,
"mailId": "welcome_supply_v1",
"read": false,
"reward": {
"balls": 5,
"candy": 20,
"coins": 0,
"tickets": 0
},
"sentAt": 1900040000,
"title": "欢迎来到小镇"
},
{
"body": "冒险首通、每日任务和七日登录都有独立奖励。\n邮件附件只有点击领取后才会到账;没有附件的通知只需阅读。",
"claimed": false,
"expired": false,
"expiresAt": 1900644800,
"mailId": "camp_notice_v1",
"read": false,
"reward": {
"balls": 0,
"candy": 0,
"coins": 0,
"tickets": 0
},
"sentAt": 1900040000,
"title": "营地来信"
}
],
"pendingAim": 0,
"pendingBattle": "",
"pendingFish": "",
"pendingShot": "",
"restPet": 0,
"revision": 1,
"schema": 14,
"selectedStage": 1,
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"shopBought": [
0,
0,
0
],
"shots": 0,
"signinClaimed": [
0,
0,
0,
0,
0,
0,
0
],
"signinDays": 1,
"stages": [
1,
1,
0,
0,
0,
0,
0,
0,
0,
0
],
"storyRankAt": 0,
"tickets": 0,
"treasurePlayed": 0,
"treasureSeen": []
},
"injectedClock": true,
"operations": [
{
"action": "shot.begin",
"balls": 19,
"candy": 0,
"coins": 0,
"level": 1,
"shots": 0
},
{
"action": "shot.finish",
"balls": 19,
"candy": 20,
"coins": 40,
"level": 1,
"shots": 1
},
{
"action": "capture",
"balls": 19,
"candy": 20,
"coins": 40,
"level": 1,
"shots": 1
},
{
"action": "shot.begin",
"balls": 18,
"candy": 20,
"coins": 40,
"level": 1,
"shots": 1
},
{
"action": "shot.finish",
"balls": 18,
"candy": 40,
"coins": 80,
"level": 1,
"shots": 2
},
{
"action": "train",
"balls": 18,
"candy": 10,
"coins": 80,
"level": 2,
"shots": 2
},
{
"action": "stage.select",
"balls": 18,
"candy": 10,
"coins": 80,
"level": 2,
"shots": 2
},
{
"action": "autoDeploy",
"balls": 18,
"candy": 10,
"coins": 80,
"level": 2,
"shots": 2
},
{
"action": "battle.begin",
"balls": 18,
"candy": 10,
"coins": 80,
"level": 2,
"shots": 2
},
{
"action": "battle.finish",
"balls": 21,
"candy": 50,
"coins": 160,
"level": 2,
"shots": 2
},
{
"action": "goal.claim",
"balls": 26,
"candy": 50,
"coins": 160,
"level": 2,
"shots": 2
},
{
"action": "mail.claimAll",
"balls": 31,
"candy": 70,
"coins": 160,
"level": 2,
"shots": 2
},
{
"action": "signin.claim",
"balls": 41,
"candy": 70,
"coins": 160,
"level": 2,
"shots": 2
},
{
"action": "shop.buy",
"balls": 46,
"candy": 70,
"coins": 160,
"level": 2,
"shots": 2
},
{
"action": "chest.open",
"balls": 48,
"candy": 100,
"coins": 220,
"level": 2,
"shots": 2
},
{
"action": "stage.select",
"balls": 48,
"candy": 100,
"coins": 220,
"level": 2,
"shots": 2
},
{
"action": "autoDeploy",
"balls": 48,
"candy": 100,
"coins": 220,
"level": 2,
"shots": 2
},
{
"action": "battle.begin",
"balls": 48,
"candy": 100,
"coins": 220,
"level": 2,
"shots": 2
},
{
"action": "battle.finish",
"balls": 51,
"candy": 150,
"coins": 310,
"level": 2,
"shots": 2
},
{
"action": "train",
"balls": 51,
"candy": 90,
"coins": 310,
"level": 3,
"shots": 2
},
{
"action": "stage.select",
"balls": 51,
"candy": 90,
"coins": 310,
"level": 3,
"shots": 2
},
{
"action": "autoDeploy",
"balls": 51,
"candy": 90,
"coins": 310,
"level": 3,
"shots": 2
},
{
"action": "battle.begin",
"balls": 51,
"candy": 90,
"coins": 310,
"level": 3,
"shots": 2
},
{
"action": "battle.finish",
"balls": 54,
"candy": 150,
"coins": 410,
"level": 3,
"shots": 2
},
{
"action": "train",
"balls": 54,
"candy": 60,
"coins": 410,
"level": 4,
"shots": 2
},
{
"action": "stage.select",
"balls": 54,
"candy": 60,
"coins": 410,
"level": 4,
"shots": 2
},
{
"action": "autoDeploy",
"balls": 54,
"candy": 60,
"coins": 410,
"level": 4,
"shots": 2
},
{
"action": "battle.begin",
"balls": 54,
"candy": 60,
"coins": 410,
"level": 4,
"shots": 2
},
{
"action": "battle.finish",
"balls": 57,
"candy": 130,
"coins": 520,
"level": 4,
"shots": 2
},
{
"action": "train",
"balls": 57,
"candy": 10,
"coins": 520,
"level": 5,
"shots": 2
},
{
"action": "stage.select",
"balls": 57,
"candy": 10,
"coins": 520,
"level": 5,
"shots": 2
},
{
"action": "autoDeploy",
"balls": 57,
"candy": 10,
"coins": 520,
"level": 5,
"shots": 2
},
{
"action": "battle.begin",
"balls": 57,
"candy": 10,
"coins": 520,
"level": 5,
"shots": 2
},
{
"action": "battle.finish",
"balls": 62,
"candy": 110,
"coins": 720,
"level": 5,
"shots": 2
},
{
"action": "battle.begin",
"balls": 62,
"candy": 110,
"coins": 720,
"level": 5,
"shots": 2
},
{
"action": "battle.finish",
"balls": 62,
"candy": 110,
"coins": 720,
"level": 5,
"shots": 2
}
],
"repeatClearNoReward": true,
"seededResources": false,
"status": "pass"
}
+217
View File
@@ -0,0 +1,217 @@
{
"kind": "guide",
"status": "pass",
"operations": [
{
"action": "shot",
"before": {
"coins": 0,
"candy": 0,
"balls": 20,
"tickets": 0,
"level": 1,
"shots": 0,
"stages": [
1,
1,
0,
0,
0,
0,
0,
0,
0,
0
],
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"formation": [
0,
1,
-1,
-1,
-1,
-1
]
},
"after": {
"coins": 40,
"candy": 20,
"balls": 19,
"tickets": 1,
"level": 1,
"shots": 1,
"stages": [
1,
1,
0,
0,
0,
0,
0,
0,
0,
0
],
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"formation": [
0,
1,
-1,
-1,
-1,
-1
]
}
},
{
"action": "shot",
"before": {
"coins": 40,
"candy": 20,
"balls": 19,
"tickets": 0,
"level": 1,
"shots": 1,
"stages": [
1,
1,
1,
0,
0,
0,
0,
0,
0,
0
],
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"formation": [
0,
1,
-1,
-1,
-1,
-1
]
},
"after": {
"coins": 80,
"candy": 40,
"balls": 18,
"tickets": 0,
"level": 1,
"shots": 2,
"stages": [
1,
1,
1,
0,
0,
0,
0,
0,
0,
0
],
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"formation": [
0,
1,
-1,
-1,
-1,
-1
]
}
}
],
"step": "guide complete",
"updatedUtc": "2026-10-21T14:44:01.2279718Z",
"current": {
"coins": 80,
"candy": 10,
"balls": 18,
"tickets": 0,
"level": 2,
"shots": 2,
"stages": [
1,
1,
1,
0,
0,
0,
0,
0,
0,
0
],
"shards": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"formation": [
0,
1,
-1,
-1,
-1,
-1
]
},
"shortage": "发射弹珠,补足训练糖果",
"ready": "用糖果做一次共享训练",
"trained": "布阵并完成教学关 1-1"
}
File diff suppressed because it is too large Load Diff
+46
View File
@@ -0,0 +1,46 @@
# G3 新账号至 1-5 验收
2026-10-21。新账号以初始20枚弹珠、岩团团和火喵出发,教学捕捉获得芽芽,使用正常奖励、训练和推荐布阵,通过最新技能规则的1-1~1-5。无需普通随机捕捉、T2或注入资源。本轮不调整战斗数值。
## 路径与结果
两次零度发射共得糖果40、金币80;第一发的券用于教学芽芽。先训练至Lv.2完成1-1,再领取教学目标、欢迎邮件、第1日签到、商店免费补给和1-1掉落的绿野补给箱。此后用通关收益依次训练至Lv.3/4/5,全程三只伙伴均为T1。
| 关卡 | 训练等级 | 布阵(每条路线前/后) | 服务端逻辑时长 | 击退 | 剩余耐久 |
| --- | --- | --- | --- | --- | --- |
| 1-1 | 2 | 岩团团/火喵 | 64.15秒 | 9/9 | 10/10 |
| 1-2 | 2 | 岩团团/火喵 | 64.30秒 | 9/9 | 10/10 |
| 1-3 | 3 | 岩团团/芽芽;火喵/空 | 76.55秒 | 9/9 | 10/10 |
| 1-4 | 4 | 岩团团/芽芽;火喵/空 | 74.30秒 | 9/9 | 10/10 |
| 1-5 | 5 | 岩团团/空;火喵/空;芽芽/空 | 87.10秒 | 8/9 | 5/10 |
客户端最后事件时钟比服务端总时长少一个50ms tick,非回放偏差。真实UI使用2倍速,最早结算时间约束仍生效。
最终金币 **720**、糖果 **110**、弹珠 **62**、券 **0**,Lv.5、发射数2。训练共花糖果300。未领取每日任务、每日宝箱、1-3碎片自选箱及1-5大礼箱;这不是首日全部资源上限。没有普通捕捉或进化开销,不能据此断言所有抽取/消费选择都同样顺畅。
## 修复
1. 教学捕捉后仅有20糖果时,旧引导直接要求训练,但训练需30。`MainHudView.GuideTask`现在根据服务端训练费用和实际余额提示:糖果不足且有弹珠→先发射补糖果;弹珠也不足→免费补给;够用→训练;训练后→布阵。复用原JSON/Prefab骨架,真实新账号验证20→40→训练后10糖果的文案切换和显示。
2. 隐藏的敌人/模型仍逐帧调用`Animator.Play/Update`,产生大量警告。`BattleSkillPresentation.Animate`跳过未激活或禁用的Animator;恢复显示后按绝对战斗时钟采样,不改逻辑事件。实际Prefab隐藏父节点、禁用/重启Animator和隐藏单位检查通过。修复后真实新账号实播1-1,权威终态一致,Animator警告和错误均为0。
## 证据与复验
- [FirstFive/ui_run.json](FirstFive/ui_run.json):18085隔离数据库、新注册账号、真实EventSystem射线点击,覆盖发射、教学捕捉、训练、选关、推荐布阵、五场完整权威战斗和首通奖励。UI路径没有注入时钟、随机数或存档。
- [FirstFive/server_run.json](FirstFive/server_run.json):`first_day_tests`在独立临时数据库经相同业务命令推进,仅推进测试时钟越过播放等待。没有预置钱包/拥有/通关状态;额外重打1-5,钱包和宝箱不增加。
- [FirstFive/parity.json](FirstFive/parity.json):五份轨迹SHA256、胜负、耐久、击退、奖励、统计和最终钱包/伙伴/阵容一致。
- `FirstFive/ui_guide.json`、`animation_lifecycle.json`、`postfix_battle.json`:两处修复的专项回执;`VerifyG3.Domain`另覆盖零弹珠和训练费用变化。
- CTest四组通过:权威战斗、技能样例、原玩法事务、首日推进;Python技能契约8项通过;Unity编译完成。
- 截图:`AIClient/Assets/Screenshots/first_five_formation{1..5}.png`、`first_five_result{1..5}.png`、`first_five_guide_shortage.png`/`first_five_guide_ready.png`。已目视检查三路布阵、结算和新文案。
- [FirstFive/cleanup.json](FirstFive/cleanup.json):原账号与端点恢复,金币/糖果/等级/发射数/伙伴/阵容不变;退出Play,Boot无脏状态,Game View 1080×1920。18085进程按可执行路径/端口/数据库核对后关闭,8080健康且未重启;修复后日志游标350529~350546无新增警告/错误。
```powershell
cmake --build AIServer/build-g1 --config Release --target first_day_tests
AIServer/build-g1/Release/first_day_tests.exe Tools/output/first_five/server_run.json
ctest --test-dir AIServer/build-g1 -C Release --output-on-failure
```
UI:启动独立`127.0.0.1:18085`,数据库仅置于`Tools/output/first_five/`;Pipeline在Boot Play Mode运行`VerifyFirstFive.Begin`,从`ui_run.json`轮询完成,再`Cleanup`恢复原账号。`BeginGuide`/`AnimationLifecycle`/`BeginBattleSmoke`是专项入口;`BeginBattleSmoke`接在`BeginGuide`后运行,异步状态写入同目录。每批结束先`Cleanup`再退出Play,不对真实端点或活动中账号启动验收。
## 后续
首日前五关未发现资源硬卡点;1-5已有损失,保留当前数值进入试玩。仍需真人首次操作、微信真机帧率/内存/首屏加载、主包与热更资源体积实测。本轮未构建或发布Player,不构成微信性能达标证据。