🔔 Bladewake GDD
📄 Doc 60 · QA & đo lường

60 — QA, Telemetry & Playtest (kiểm thử, đo đạc, playtest, chứng nhận)

một chỗ duy nhất cho mọi việc kiểm chứng Bladewake từ P0 tới hậu 1.0: chiến lược test theo mốc, giao thức playtest (nội bộ, ngoài có giám sát, Steam Playtest kín, demo công khai + Next Fest, EA), danh mục sự kiện telemetry (id, field, lúc bắn, đồng ý), KPI + ngưỡng + hành động, dashboard cân bằng, luật phân loại lỗi, ma trận test hiệu năng (250 quái, Steam Deck), kiểm tự động (Autopilot, validate.

Cập nhật: 2026-11-07
13
mục ##
52
mục ###
44
bảng
12 116
từ

1Giới thiệu & bản đồ tài liệu

Mục đích: một chỗ duy nhất cho mọi việc kiểm chứng Bladewake từ P0 tới hậu 1.0: chiến lược test theo mốc, giao thức playtest (nội bộ, ngoài có giám sát, Steam Playtest kín, demo công khai + Next Fest, EA), danh mục sự kiện telemetry (id, field, lúc bắn, đồng ý), KPI + ngưỡng + hành động, dashboard cân bằng, luật phân loại lỗi, ma trận test hiệu năng (250 quái, Steam Deck), kiểm tự động (Autopilot, validate.py + build_gdd.py trong CI), checklist chứng nhận (Steam Deck Verified, phát hành, demo) và tiêu chí nghiệm thu theo từng mảng tính năng. Phụ thuộc: 00-Design-Bible.md §1 (P1–P7, INV-01..INV-18), §2 (nhịp 32:10), §3.8, §4.2–4.3, §8.3–8.5, §10, §10.4 + data/_bible.json (invariants, heroes, modes, milestones, adaptive, meta.playtime); 01-Roadmap.md §2–§3, §5; 10–17 (KPI nguồn: 14 §15, 15 §14, 16 §9.3, 17 §11, 13 §16); 19 §8; 32 §14; 40 §11; 43 §3, §8, §11, §15; 50 §4.5, §5, §15–§18; 51 §0–§3; GDD/09-Demo-Test-Plan.md (lịch sử demo). Được dùng bởi: QA (test plan, checklist, triage), producer (cổng mốc, playtest, Next Fest), lead tech (CI, hiệu năng, Autopilot), designer cân bằng (dashboard, nút chỉnh), code Bladewake.Telemetry / Bladewake.Dev.Autopilot / PerfMeter / CrashReporter, máy chủ ingest telemetry, agent /run-backlog + qa-verifier + auto-test-device (tiêu chí nghiệm thu §10), mọi doc hệ thống khi thêm sự kiện/KPI.

Quy ước: [ASSUMED] = số chạy lần đầu, chỉnh bằng dữ liệu playtest; ghi số đo thật thay vào khi có. Ngôn ngữ dữ liệu: tên sự kiện/field tiếng Anh snake_case; mọi nhãn hiển thị tiếng Việt. Ngưỡng 3 mức: Đỏ (chặn mốc / hành động ngay) · Vàng (theo dõi, sửa trong kỳ cân bằng kế) · Xanh (đạt).

Độ dài từng mục (nghìn ký tự)Độ dài từng mục (nghìn ký tự)0. Phạm vi, thứ bậc, thuật ngữ0. Phạm vi, thứ bậc, thuật ngữ: 1.4k1.4k1. Chiến lược test theo mốc1. Chiến lược test theo mốc: 4.5k4.5k2. Giao thức playtest2. Giao thức playtest: 4.9k4.9k3. Danh mục sự kiện telemetry3. Danh mục sự kiện telemetry: 5.7k5.7k4. KPI & ngưỡng4. KPI & ngưỡng: 9.3k9.3k5. Dashboard cân bằng5. Dashboard cân bằng: 2.3k2.3k6. Phân loại & xử lý lỗi (triage)6. Phân loại & xử lý lỗi (triage): 2.6k2.6k7. Ma trận test hiệu năng7. Ma trận test hiệu năng: 2.9k2.9k8. Kiểm tự động8. Kiểm tự động: 3.6k3.6k9. Checklist chứng nhận9. Checklist chứng nhận: 4.2k4.2k10. Tiêu chí nghiệm thu theo mảng tính…10. Tiêu chí nghiệm thu theo mảng tính năng: 8.8k8.8kQuy tắc cho dev/AIQuy tắc cho dev/AI: 1.7k1.7kQuyết định đã chốtQuyết định đã chốt: 2.5k2.5k
Bấm tên mục để nhảy tới mục đó.
Mục lục chi tiết (## và ###)
  1. 0. Phạm vi, thứ bậc, thuật ngữ
  2. 1. Chiến lược test theo mốc
  3. 1.1 Bảng cổng
  4. 1.2 Nhịp test liên tục
  5. 1.3 Ma trận phủ (cột = loại test, ô = bắt buộc ở mốc nào)
  6. 2. Giao thức playtest
  7. 2.1 Tổng các loại
  8. 2.2 PT-B — playtest ngoài có giám sát (kịch bản cố định)
  9. 2.3 PT-C — Steam Playtest kín (M7–M8)
  10. 2.4 PT-D — demo công khai + Next Fest (M9–M10)
  11. 2.5 Khảo sát chuẩn (cuối run; cùng câu cho PT-B/C/D/E; thang 1–5 trừ khi ghi)
  12. 2.6 Test 5 s (P4, INV-09)
  13. 2.7 Test nhận hero 3 s (P6) · nghe mù tell (AT-01)
  14. 2.8 Lưu trữ & quyền riêng tư playtest
  15. 3. Danh mục sự kiện telemetry
  16. 3.1 Đường đi & luật chung
  17. 3.2 Vỏ chung (mọi sự kiện)
  18. 3.3 Danh mục (id · khi bắn · field riêng · nguồn luật)
  19. 3.4 Ngân sách dung lượng (1 run STANDARD 32:10, ước tính)
  20. 4. KPI & ngưỡng
  21. 4.1 Luật thống kê
  22. 4.2 KPI lõi chiến đấu & run (dashboard D1, D2)
  23. 4.3 KPI theo hero (D2; 1 dòng/hero, cột chung + rủi ro riêng)
  24. 4.4 KPI build & chọn (D5)
  25. 4.5 KPI chết & công bằng (D3)
  26. 4.6 KPI Tro Nhớ — tỉ lệ kích hoạt thích nghi (D4; số nguyên văn 14 §15)
  27. 4.7 KPI kinh tế & meta (D6)
  28. 4.8 KPI độ khó & mode (D7; 19 §8)
  29. 4.9 KPI demo & phát hành (D9; Roadmap §3.5–§3.6, giữ nguyên ngưỡng)
  30. 4.10 KPI kỹ thuật (D8, D10)
  31. 5. Dashboard cân bằng
  32. 5.1 Đường dữ liệu
  33. 5.2 Bộ dashboard
  34. 5.3 Ví dụ cảnh báo (VD-QA-2)
  35. 6. Phân loại & xử lý lỗi (triage)
  36. 6.1 Hạng lỗi
  37. 6.2 Trường bắt buộc của 1 báo lỗi
  38. 6.3 Luồng & SLA
  39. 6.4 Cổng theo số lỗi mở
  40. 7. Ma trận test hiệu năng
  41. 7.1 Máy & ngưỡng chung (Bible §10.4, 50 §5)
  42. 7.2 Kịch bản (P-xx) × máy
  43. 7.3 Cách đo & báo cáo
  44. 8. Kiểm tự động
  45. 8.1 CI (50 §16.3; máy build Windows tự host + 1 Steam Deck nối mạng)
  46. 8.2 Autopilot (Bladewake.Dev.Autopilot, 50 §18.2)
  47. 8.3 Giám sát bất biến runtime (Invariants, chạy trong Autopilot + build Dev)
  48. 9. Checklist chứng nhận
  49. 9.1 Steam Deck Verified (nộp M30, mục tiêu MS07; MS03 = Playable nộp M12) — luật ở 43 §8.2, đây là cách QA kiểm
  50. 9.2 Phát hành (mỗi bản lên default) — 43 §11.4 (10 mục) + QA bổ sung
  51. 9.3 Khoá chất lượng demo (F−5, 43 §3.3)
  52. 9.4 Quyền riêng tư & đồng ý (43 §15)
  53. 9.5 Trợ năng & Thương Xót (Bible §4.3, meta.accessibility)
  54. 10. Tiêu chí nghiệm thu theo mảng tính năng
  55. 10.1 Combat lõi & tell (10, 11)
  56. 10.2 Hero (12, data/heroes, data/hero_upgrades)
  57. 10.3 Nâng cấp & build (13)
  58. 10.4 Tro Nhớ (14)
  59. 10.5 Director & encounter (15), run & bản đồ (16)
  60. 10.6 Kinh tế, meta, độ khó (17, 18, 19)
  61. 10.7 Hình, VFX, âm thanh (30, 31, 32)
  62. 10.8 UI/HUD, loc, truyện/codex (40, 20, 43 §12)
  63. 10.9 Lưu, dữ liệu, Steam, telemetry (50, 51, 43, doc này)
  64. Quy tắc cho dev/AI
  65. Quyết định đã chốt

20. Phạm vi, thứ bậc, thuật ngữ

MụcLuật
Thứ bậcBible + _bible.json > doc nền (10–17, 20, 30–32, 51) > doc này > doc khác. KPI có trong Bible (P1–P7, §8.5, §3.8) chỉ đọc lại ở đây, không đổi số. KPI của doc hệ thống (14/15/16/17/19/40) giữ số gốc; doc này hợp nhất tên sự kiện + cách đo + ngưỡng Đỏ
Nguồn số đo(1) Autopilot sim (balance, CI) · (2) playtest nội bộ/ngoài (NDJSON local + quan sát + khảo sát) · (3) telemetry xa (chỉ người đồng ý, 43 §15) · (4) Steamworks (giờ chơi, wishlist, hoàn tiền, đánh giá) · (5) báo crash
Lọc dữ liệu cân bằngloại run có cheated = true (50 §17), modded = true (43 §16 lệch content_hash), bot = true (Autopilot), content_version khác bản đang phân tích, run < 60 s (thoát ngay); Thương Xót tách lát riêng (mercy_used), không loại
BuildDev (BW_DEV) · Playtest (BW_TELEMETRY_REMOTE) · Demo (BW_DEMO) · Release (50 §16.2). Phím debug + Autopilot chỉ có ở Dev
Đơn vịthời gian s (field _s), HP % của HP_MAX (field _pct), khung ms; tick 60 Hz (50 §3.1); tỉ lệ dạng 0–1 trong dữ liệu, % trong doc
Hạng lỗiA · B · C · D (§6.1). "Lỗi A" ở Roadmap/doc 43 = hạng A ở đây
Lát phân tích chuẩnhero × Hồi (I–VI) × Độ Tang (0, 1–7, 8–15, 16–27, 28–43) × mode (5) × nền tảng (PC_KBM, PC_PAD, DECK) × content_version
Thuật ngữĐÁP = verb chạm của hero (bảng §4.3); verb giữ = hold verb; Né Hoàn Hảo = Lướt ≤ 0.15 s trước va chạm (INV-12); Dư Âm = ULT_GAUGE; tell Y/P/N = vàng/tím/vùng đọng (INV-02); CV = thế đáp Tro Nhớ (<ownerId>_CV1/_CV2, 14 Q1)

31. Chiến lược test theo mốc

1.1 Bảng cổng

Mốc (M)Trọng tâm testLoại test bắt buộcCổng thoát (tất cả Xanh)Đỏ → hành động
P0 (M-1–M2)parity lõi mới với demo H01EditMode TickMath/DamagePipeline/HitShapes/RngStreams/Data; replay Autopilot 10 run H01kill/phút, tỉ lệ Gạt, thời gian hạ BS_B1 lệch ≤ 5% so với demo; 18 Edge H01 chạy bằng dữ liệu, 0 nhánh cứng theo effectlệch > 5% → chặn MS01b, sửa lõi (trần 3 tháng, Roadmap §3.1)
MS01 (M0)trang Steam, teasersoát art đã duyệt + từ cấm trên mọi tài sản trang0 tài sản ngoài hub art style; 0 từ cấmgỡ tài sản trước khi live
MS01b (M3) — cổng cứng250 quái trên DeckP-01 §7.2 (10 phút × 3 lần)60 fps · p95 ≤ 16.6 ms · CPU ≤ 10 ms · ≤ 1.500 hạt · ≤ 40 sheet · ≤ 12 VFX chết/frame · ≤ 21 trang atlassửa kiến trúc trước nội dung; dự phòng preset Deck 180
VS (M6, nội bộ)1 run Hồi I đủ vòng, H01 + H02playtest ngoài có giám sát PT-B (§2.2) 10 người; Invariants 10 phút; smokeP1–P4 Bible: input→hit ≤ 0.12 s, 60 fps Deck, ≥ 120 kill/phút từ phút 3, ĐÁP/Né Hoàn Hảo 40–60%, test 5 s đúng với H01 + H02; ≥ 8/10 muốn chơi run 2 [ASSUMED]sửa đọc tell/ĐÁP ở VS, không mang sang demo
MS02 (M10) Demoonboarding, Hồi I, meta lát, 3 heroSteam Playtest kín PT-C (M7–M8, ~500 người); demo công khai PT-D (M9); checklist demo §9.3§4.9 demo KPI; 0 lỗi A, ≤ 5 lỗi B trước F−5 (43 §3.3); crash ≤ 0.5/100 phiên ở PT-C, ≤ 0.2 ở Next Festtrung vị giờ chơi < 20 phút → sửa onboarding/nhịp Hồi I trước EA
Khoá nội dung EA (M12)5 hero, Hồi I–II, DAILYregression đầy đủ §8; P-01 với B2 + 5 hero; test di trú save build M10 nội bộ; nộp đánh giá Deck (Playable)0 lỗi A, ≤ 10 lỗi B [ASSUMED]; loc 5 ngôn ngữ đóng băng; sim 1.000 run/hero (17 §11.3) Xanhlùi EA theo Roadmap Q7 chỉ khi wishlist; lỗi A → không cắt build release/ms03-ea
MS03 (M13) EAphát hành trả tiềnchecklist phát hành §9.2; dashboard D1–D10 sống; vá theo §6.443 §11.4 đủ 10 mục; 2 tuần đầu: đánh giá ≥ 80%, hoàn tiền ≤ 8%, trung vị giờ chơi ≥ 4 hlỗi A → vá ≤ 48 h hoặc lùi build
MS04 (M17) U1Hồi III, ENDLESS, H10/H04sim 1.000 run/hero; P-05 (H04 Kẻ Vòng giữa bầy) + P-01 B3; test di trú 2 bản default trướcKPI §4 không Đỏ 2 kỳ liên tiếp; 0 lỗi mất savechặn cập nhật
MS05 (M21) U2Hồi IV, MRN11–MRN15, MUT01–MUT12, BOSS_RUSHP-04 (H11 hố + 250 quái + 3 hố); sim Độ Tang 0/8/16/24/32/43; DAILY 30 seed CRC Windows ↔ Deck§4.6 Khăn Tang Xanh; CPU ≤ 10 ms với hốcut-line Bible §10.2 bước (1)–(2)
MS06 (M26) U3BS_FINAL, END_BELL_TOLL, gỡ cờ builddi trú gỡ cờ build (0 mất mở khoá); P-06 BS_FINALthời gian tới END_BELL_TOLL trung vị 10–14 h; ≥ 30% người hoạt động đạt trong 30 ngày [ASSUMED]chỉnh kinh tế meta (nút 8, 17 §11.2)
MS07 (M32) 1.012 hero, B6, Deck Verified, 10 ngôn ngữchecklist Verified §9.1 (nộp M30); full regression; test 5 s + nhận hero 3 s cả 12 hero; soak 2 h0 lỗi A; Verified duyệt; mọi KPI §4.2 theo hero Xanh trên dữ liệu EAcut-line Bible §10.2 (không bao giờ dời hero)
MS08 / PORT (M35+)hero 13+, portsim hero mới lọt 17 §3.2 trước phát hành; preset CONSOLE_HANDHELD P-01 với 180 quáiĐÁP/Né Hoàn Hảo 40–60% trên nền tảng mới; 60 fps ở trần presetdưới 60 fps ở 180 → giảm FX/hạt, không hạ dưới 150 quái

1.2 Nhịp test liên tục

NhịpViệcChủĐầu ra
mỗi PRCI §8.1 (validate, render, biên dịch, EditMode, smoke 3 phút, grep cấm)tác giả PRđèn CI; Đỏ = không merge
mỗi đêmAutopilot 12 hero (đã có ở build) × 1 run sim-only + build Dev/PlaytestCIbalance_nightly_<build>.csv + so với đêm trước
hằng tuầnDeck: P-01 + F10 10 phút; playtest nội bộ PT-A 60 phút; triage lỗiQA + lead techbáo cáo hiệu năng + biên bản PT-A
mỗi 2 tuần (từ EA)kỳ cân bằng 17 §11.3 bước 2 trên dashboarddesigner cân bằngdanh sách ngoại lệ + đề xuất 1 lớp nút/KPI
trước mỗi MSsim 1.000 run/hero; regression đầy đủ; AT-01..AT-12 âm (32 §14); checklist §9 phù hợpQA leadbiên bản cổng MS (ký bởi producer)

1.3 Ma trận phủ (cột = loại test, ô = bắt buộc ở mốc nào)

MảngEditModePlayMode/InvariantsAutopilot simPlaytest ngườiHiệu năngThủ công (QA)
Combat lõi + tellP0P0P0VSMS01bVS
Hero kit (12)khi hero vàokhi hero vàokhi hero vào (1.000 run)mốc của herokhi hero có FX lớn (H05/H10/H11)mốc của hero
Nâng cấp/buildP0 (hiệu ứng dữ liệu)VSMS02MS02—MS02
Tro NhớP0 (AshMemory)VS (INV-15)MS02MS02 (khảo sát)MS01b (MESO)MS02
Director/encounterVS (wave_lint)VSVSVSMS01bVS
Bản đồ/runP0 (MapGen 10.000 seed)VSVSVS—VS
Kinh tế/metaVSMS02MS02 (balance_calc.py hours)MS02—MS02
Độ khó/modeMS03MS03MS03MS03MS05 (mutator)MS03
UI/HUD/locVS (Loc)MS02 (pseudo-loc)MS02 (loc)VS—MS02
Âm thanh———VS (AT-01)MS01b (AT-04)mỗi MS
Lưu/cloudP0 (Save)VS———MS02
Steam/Deck——MS03 (daily)MS02MS01bMS02 → MS07

42. Giao thức playtest

2.1 Tổng các loại

MãLoạiMốcNgườiBuildTelemetryThời lượngCâu hỏi chính
PT-Anội bộ hằng tuầnP0 → hậu 1.0đội (5) + 1 khách nội bộ luân phiênDev nightlyNDJSON local, gom tay60 phút/tuầnlỗi mới, cảm giác, nhịp phòng
PT-Bngoài có giám sát (ngồi cạnh / chia sẻ màn hình)VS, trước MS02, trước MS03, mỗi hero mới10 người/đợt, 0 người đã chơi build trướcPlaytestbật (có thông báo)90 phút + 15 phút phỏng vấnđọc tell, ĐÁP, onboarding, Tro Nhớ
PT-CSteam Playtest kínM7–M8~500 [ASSUMED]Playtest (AppID playtest)bật kèm thông báotự do, 3 tuầnKPI demo, crash, Deck
PT-Ddemo công khai + Next FestM9–M10công chúngDemotheo đồng ý 43 §15.14 tuần + tuần lễgiờ chơi, % qua BS_B1, wishlist
PT-EEA / cập nhậtM13 → MS07người muaReleasetheo đồng ýliên tụcKPI §4 theo kỳ 2 tuần
PT-Ftest chuyên đềkhi cần10 người/đợtPlaytestbật30–45 phúttest 5 s, nhận hero 3 s, nghe mù tell, mù màu

2.2 PT-B — playtest ngoài có giám sát (kịch bản cố định)

BướcPhútViệcĐo
00–5đồng ý tham gia + quyền riêng tư, chọn ngôn ngữ, chọn thiết bị (tay cầm mặc định; 3/10 người dùng KBM, 2/10 dùng Deck)—
15–20chơi từ boot, không hướng dẫn miệng; người quan sát chỉ ghigiây tới phòng đầu, giây tới ĐÁP thành công đầu, số lần mở menu Trợ giúp
220–80chơi tự do (run tiếp run)telemetry đủ §3; người quan sát đánh dấu "bối rối" (giờ + lý do)
380–90test 5 s (§2.6) + test nhận hero 3 s (§2.7) nếu ≥ 2 herođúng/sai
490–105khảo sát §2.5 + 5 câu phỏng vấn mở: "lần chết khó hiểu nhất?", "kẻ địch có 'học' bạn không — ở đâu?", "thẻ nào bạn không hiểu?", "muốn chơi run nữa không, vì sao?", "1 điều muốn đổi"trả lời nguyên văn vào playtest/<đợt>/notes.md
  • Quy tắc người quan sát: không gợi ý; người chơi hỏi → trả "bạn nghĩ sao?"; chỉ can thiệp khi kẹt > 3 phút (ghi là lỗi onboarding hạng C).
  • Đạt đợt: ≥ 8/10 hoàn thành bước 2; dữ liệu telemetry ≥ 9/10 người hợp lệ.

2.3 PT-C — Steam Playtest kín (M7–M8)

  • Tuyển: đăng ký trên trang Steam (nút Playtest), mời theo đợt 100 → 200 → 500 [ASSUMED]; mỗi đợt mở sau khi crash đợt trước ≤ 1/100 phiên.
  • Màn khởi động có thông báo telemetry bật (build Playtest); khảo sát §2.5 hiện ở màn kết run thứ 1, 3, 6 (không chặn, có nút "Bỏ qua").
  • Kênh phản hồi: phím "Báo lỗi" trong menu tạm dừng (43 §15.3) + biểu mẫu ngoài game; mỗi báo lỗi tự kèm build_number, content_version, 30 sự kiện gần nhất.
  • Thoát PT-C (43 §3.3): crash ≤ 0.5/100 phiên, trung vị giờ chơi ≥ 25 phút, mọi KPI §4.9 không Đỏ.

2.4 PT-D — demo công khai + Next Fest (M9–M10)

Tuần (F = tuần Next Fest)Việc QANgưỡng
F−5khoá chất lượng demo §9.30 lỗi A, ≤ 5 lỗi B
F−4 → F−1demo công khai; dashboard D9 (phễu) + D10 (ổn định) mỗi ngàycrash ≤ 0.2/100 phiên
F2 bản vá demo tối đa trong tuần (Roadmap §3.5); trực lỗi 2 ca (Mỹ + Âu) [ASSUMED]lỗi A → vá ≤ 24 h trong tuần lễ
F+1báo cáo demo: KPI §4.9 thực đo, top 10 lỗi, top 10 nguyên nhân chết, Q&A cộng đồngghi vào Roadmap §3.5 thay [ASSUMED]
  • Stream của đội: Autopilot không được dùng khi stream (43 §3.3); build stream = build demo công khai.

2.5 Khảo sát chuẩn (cuối run; cùng câu cho PT-B/C/D/E; thang 1–5 trừ khi ghi)

IdCâu (VI; EN dịch theo loc)DạngKPI
SV01"Trong run vừa rồi, có kẻ địch nào thay đổi cách đánh vì thói quen của bạn không?"Có / Không / Không chắcnhận ra Tro Nhớ = "Có" ≥ 60% (P7)
SV02"Nếu có: điều đó công bằng không?" (chỉ hỏi khi SV01 = Có)1 rất bất công … 5 rất công bằngthấy bất công = 1–2 ≤ 15% (P7)
SV03"Bạn có hiểu vì sao mình chết lần cuối?"1–5≥ 4 ở ≥ 75% [ASSUMED]
SV04"Đọc được đòn vàng/tím giữa đám đông?"1–5≥ 4 ở ≥ 70% [ASSUMED]
SV05"Muốn chơi thêm 1 run ngay?"Có / Không≥ 70% [ASSUMED]
SV06"Thẻ nâng cấp dễ hiểu?"1–5≥ 4 ở ≥ 70% [ASSUMED]
SV07"Nhân vật có cảm giác khác hẳn nhân vật trước?" (khi đã chơi ≥ 2 hero)1–5≥ 4 ở ≥ 70% [ASSUMED]
  • Sự kiện survey_answer (§3.3). Khảo sát chỉ hiện ở ≤ 1 run/3 run (PT-E), không hiện ở DAILY lúc nộp điểm.

2.6 Test 5 s (P4, INV-09)

  • Cách làm: chụp 20 khung 1920×1080 (và 1280×800 cho Deck) ngẫu nhiên từ Autopilot showcase lúc ≥ 200 quái, có ≥ 1 tell Y và ≥ 1 tell P; mỗi khung hiện 5 s; người thử chỉ (1) hero ở đâu, (2) đòn nào phải ĐÁP, (3) vùng nào phải Lướt.
  • Phủ: mỗi hero × biome B2 + B4 (INV-09 DEC-2026-11-07-09) + biome của mốc; bản mù màu (◇/▲/chấm) riêng.
  • Đạt: ≥ 90% câu (1) và ≥ 80% câu (2)+(3) đúng với 10 người [ASSUMED] — "test 5 s đúng với cả 12 hero" (P4) = mọi hero đạt ngưỡng.

2.7 Test nhận hero 3 s (P6) · nghe mù tell (AT-01)

  • Nhận hero: 3 s clip FX (không thân hero, không HUD) của 1 hero ngẫu nhiên trong số đã ship; 12 lựa chọn; đạt ≥ 80% đúng mỗi hero (P6), 10 người.
  • Nghe mù: 32 §14 AT-01 — 10 người, 10 phút B1, màn đen 30% thời gian; ≥ 90% gọi đúng Y/P.
  • Nhận hero qua âm: AT-12 ≥ 80%.

2.8 Lưu trữ & quyền riêng tư playtest

  • Thư mục playtest/<yyyy-mm-dd>_<PT>/: notes.md, survey.csv, NDJSON đã gom, KHÔNG ảnh/clip mặt người chơi; ghi hình màn hình chỉ khi người chơi đồng ý bằng chữ.
  • Người tham gia PT-B: mã P01..P10/đợt, không lưu tên/email trong repo; danh sách liên hệ ở công cụ ngoài repo.

53. Danh mục sự kiện telemetry

3.1 Đường đi & luật chung

  • Ghi: TelemetryService nhận sự kiện từ SimEventBus cuối frame (0 cấp phát, 50 §2.2) → NDJSON local local/telemetry_queue/<run_id>.ndjson (mọi build, không cần đồng ý vì không rời máy) → gửi xa chỉ khi đồng ý (43 §15.1) hoặc build Playtest.
  • Gửi: theo lô ở hub / màn kết / thoát; không gửi trong phòng chiến; gzip ≤ 50 KB/run (43 §15.2; xem Q3); hàng chờ ngoại tuyến ≤ 5 MB, đầy → bỏ cũ nhất.
  • Mỗi sự kiện = 1 dòng JSON; field thiếu = bỏ khỏi dòng (không ghi null trừ cv_id).
  • Tần suất cao (đòn trúng, ĐÁP, Lướt) KHÔNG ghi thô mỗi lần: gom thành bộ đếm trong room_end (§3.3); thô chỉ cho đòn của M/L/XL (hit_taken, answer) và 5 nguồn cuối trước khi chết.
  • Thêm field/sự kiện = sửa bảng này + bảng 43 §15.2 cùng lượt; tăng schema_v.

3.2 Vỏ chung (mọi sự kiện)

FieldKiểuNghĩa
evstringtên sự kiện (bảng §3.3)
schema_vintphiên bản danh mục; bắt đầu 1
seqintsố thứ tự trong phiên, tăng 1
t_utcstring ISO-8601giờ máy (chỉ để gom ngày)
t_run_sfloatgiây đồng hồ run (không tính tạm dừng, 43 §8.3); ngoài run = −1
telemetry_idstring UUIDngẫu nhiên, settings_shared.json; không suy từ steamId
session_id · run_idstring UUIDrun_id rỗng ngoài run
build_numberinttăng đơn điệu toàn dự án (43 §11.3, 50 §16.1)
content_versionintphiên bản dữ liệu gameplay, cùng số trong khối đầu save + details[9] (43 §7.2, §11.3)
content_hashstring 8 hex (vd "3fa91c07")hash gói dữ liệu tính lúc khởi động; lệch danh sách hash của build → cờ modded (43 §16)
platformenum PC_KBM PC_PAD DECKthiết bị input cuối + cờ Deck
flagslistcheated · modded · bot · mercy · demo · playtest

3.3 Danh mục (id · khi bắn · field riêng · nguồn luật)

Sự kiệnKhi bắnField riêngNguồn
session_startsau màn đồng ý / mỗi lần mở gamebranch, lang, is_deck, cpu_tier, gpu_tier, ram_tier (bậc thô 1–4), res, preset, perf_preset_auto43 §15.2
session_endthoát sạchdur_s, runs, crash_prev (0/1)doc này
consent_changedđổi lựa chọntelemetry (on/off), crash (always/ask/never)43 §15.2
settings_changedđổi khoá trợ năng / Thương Xótkey, on (không giá trị remap)43 §15.2, 19 §8
run_startRUN_STARTmode, seed64 hoặc daily_key, hero, aspect (Hxx_ASn), ult, skills[2], offering (LVxx), mourning[{id,r}], DoTang, mutators[], mastery_rank, ash_level, mercy_flags{}, runs_lifetime16 §9.3, 19 §8
run_stateđổi trạng thái runfrom, to, act, row, lane16 §0
room_startvào phòng có Directoract, node (CMB/ELT/CHL/EVT/SHP/RST/SEC/RSC/MBS/BOS/DOCK), objective, script_id, B_obj, density_mult, bias_hook, bias_s15 §14
room_endrời phòngt_room_s, kills, kills_by_id{}, kpm (từ giây 15), max_alive, avg_alive, dmg_dealt, dmg_taken_pct, hp_lost_pct, obj_result (win/fail/x2), beats_fired, beats_dropped, ans_tot, ans_ok, ans_by_cls{S,M,L,XL}, pd_tot, pd_ok, dash_n, hold_s, hits_by_tell{Y,P,N}, p_tells_aimed, skill_uses{}, ult_n, potion_n, guard_break_n15 §14, 17 §11.1, demo 09 §3
beatbeat kịch bản spawnscript_id, row, pattern, n_req, n_placed15 §14
level_uplên cấplv, xp_src{}17 §2
draft_offermở bảng thẻidx, act, lv, source[3], rarity[3], offered_ids[3]17 §11.1, 13 §16.2
draft_pickchọn/bỏidx, picked_id hoặc skip, rerolls_used, banished_id, kept_id, time_to_pick_s, auto_picked13 §16.2
resonanceđạt bậc Cộng Hưởng / EVO / Then Chốtid, tier, t_s13 §16.2
relic_gainnhận Relicid, affix, source (ELT/MBS/SEC/SHP/overflow)16 §9.3
shop_purchasemua ở Sạp Rong/DOCKnode, item_id, price, gold_after17 §11.1
event_choicechọn ở EVTevt_id, choice, cost, reward16
rest_choicechọn ở RSTchoice (heal/upgrade/uncurse)16
elite_killTinh Anh chếtenemy_id, em[], dmg_time_s, fight_time_s, cv_id17 §11.1
boss_phaseboss/mini đổi pha + kếtboss_id, phase, hp_pct, t_s, result (lúc kết)17 §11.1
ult_castUltult_id, gauge_fill_s, targets_hit17 §11.1
answerĐÁP/Né Hoàn Hảo với đòn từ M/L/XLattack_id, verb (answer/pdodge), ok, dt_s (lệch so với va chạm)17 §11.1
hit_takentrúng đòn từ M/L/XL hoặc ≥ 20% HP_MAXattack_id, src_id, tell (Y/P/N), adaptive_source (BASE/ASH), cv_id, feint 0/1, dmg_pct14 §15 (ash_hit), 17
hero_diedhero chếtlast5[{attack_id, tell, t_s, dmg_pct, cv_id}], killing_blow, top_source, act, node, one_shot (0/1)INV-16, 17 §11.1
run_endkết runresult, end_node, t_run_s, act_times[], node_path[], drafts, skips, level, kills, max_alive, hp_at_boss_gate[], heals_by_source{}, gold_in, gold_out, relics, owned_final{}, caps_hit{}, deaths_by_attack, lua_gui_used, soul_ash, echo, candle, P, DI, em_seen{}, em_deaths{}, endless_floor, rush_s16 §9.3, 19 §8, 13 §16.2
meta_gain · meta_spendnhận/tiêu tiền metacur (CUR_*), amount, source/sink17 §10
unlockmở hero/trạm/mode/Khăn Tangunlock_id, playtime_h18
milestoneđạt mốc giờ chơi 17 §10.3key (vd Hồi Chuông END_BELL_TOLL), playtime_h, runs17 §11.1
ash_room · ash_cv_on · ash_cv_off · ash_budget_block · ash_spawn_shift · ash_hit · ash_fight · ash_death · ash_trick · ash_settingsnhư 14 §15field nguyên văn 14 §1514 §15
heat_guardguard công bằng chặn 1 hiệu ứng Khăn Tang/mutator/Ấneffect_id, guard (INV-xx)19 Quy tắc
perf_tierđổi bậc Director/VFXroom, tier, alive, fx_active, p95_ms15 §14, 50 §4.5
perf_roomcuối mỗi phòngp50_ms, p95_ms, p99_ms, cpu_ms_p95, alive_max, fx_max, voices_max, ram_mb, gc_bytes50 §15
ui_screen · ui_draft · ui_setting · ui_hint · ui_ash_inspectnhư 40 §11field 40 §1140 §11
survey_answertrả lời khảo sát §2.5q (SV01..SV07), adoc này
demo_end_screenmàn kết demowishlist_clicked43 §3.2
bug_reportphím "Báo lỗi"report_id, has_shot43 §15.3
crashlần mở sau crash (theo đồng ý)sig (chữ ký stack), log_tail 2.000 dòng, last_events 3043 §15.3, 50 §15

3.4 Ngân sách dung lượng (1 run STANDARD 32:10, ước tính)

NhómSố dòngByte/dòng thôTổng thô
room_start + room_end (24 phòng)4890043 KB
draft_offer + draft_pick (26)5226014 KB
answer + hit_taken (M/L/XL, ~120)12018022 KB
ash_* (~60)6030018 KB
còn lại (run, level, shop, perf, ui)~15020030 KB
Tổng~430—~127 KB thô → gzip ~×0.25 ≈ 32 KB ≤ 50 KB

64. KPI & ngưỡng

4.1 Luật thống kê

  • Cỡ mẫu tối thiểu mỗi ô (hero × lát): quyết định cân bằng (EA trở đi) n ≥ 400 run → khoảng tin cậy 95% của tỉ lệ thắng ≈ ±4.9 điểm % (1.96·√(0.25/400) = 0.049); chỉ báo (PT-A/B, sim nội bộ) n ≥ 20 run/hero (17 §11.1), không ra quyết định đổi số canon.
  • Ngoại lệ = lệch ngưỡng Đỏ 2 kỳ 2 tuần liên tiếp (17 §11.3) với cùng content_version chính (bỏ bản vá nóng chỉ sửa crash).
  • Trung vị cho thời gian (TTK, run, chọn thẻ); trung bình cho tỉ lệ; p95 cho khung hình.
  • Mỗi kỳ chỉ chỉnh 1 lớp nút cho 1 KPI (17 §11.3 bước 3); thứ tự nút 17 §11.2; Windup, tell, token, cửa sổ ĐÁP, Lướt KHÔNG phải nút cân bằng.
  • VD-QA-1 (tỉ lệ thắng): H06 có 412 run Độ Tang 0, thắng 120 → 29.1%; trung vị roster 38.0% → lệch −8.9 điểm, CI ±4.4 điểm (1.96·√(0.291·0.709/412)) → ngoài ±5 điểm kể cả cận CI (−4.5) → Đỏ kỳ 1; kỳ 2 vẫn −7 → ngoại lệ → nút lớp 4 (hero, giữ V 0.97–1.03): balance_calc.py heroes trước khi đổi.

4.2 KPI lõi chiến đấu & run (dashboard D1, D2)

IdKPICách tính (sự kiện)XanhĐỏNút khi Đỏ (thứ tự)Nguồn
K01Kill/phút phòng chiếntrung vị room_end.kpm ở CMB/CHL/RSCtrung vị 180, mọi Hồi ≥ 120 từ phút 3< 120 ở bất kỳ HồiB_room, BPS_act, MIX (15) → HP quái k_hpP2, 17 §11.1
K02Quái sống đỉnh phòngp50 room_end.max_alive150–250< 150 hoặc chạm trần 250 > 30% phòngB_room, density_multBible §1, 15 §14
K03Sát thương nhận / phòng chiếntrung vị room_end.dmg_taken_pct ở CMB/CHL/RSC≤ 25% HP_MAX> 30%dmg_pct lớp quái → mật độ17 §11.1 (xem Q5)
K04HP mất / phòng Cổng (ELT/MBS)trung vị room_end.hp_lost_pct25–40%> 50% hoặc < 15%HP/dmg M/L15 §14 (Q5)
K05TTK Tinh Anhtrung vị elite_kill.dmg_time_s · fight_time_s8–15 s · 25–45 sngoài dải ±20%k_hp, UPTIME17 §11.1, Q8
K06Trận mini-bosstrung vị boss_phase kết, MB_*40–60 s< 32 hoặc > 72 sHP M/L (PI_gate)17 §11.1
K07Trận bosstrung vị trậnBS_B1 90 · BS_B2 105 · BS_B3/BS_B4 110 · BS_FINAL 150 · BS_TRUE 180 s, mỗi số ±20%ngoài ±30%T_boss, PI_bossBible §2, 17 §11.1
K08Độ dài run (thắng, STANDARD)trung vị run_end.t_run_s26:00–35:00, trung vị 32:10 ± 60 s< 24:00 hoặc > 38:00nhịp phòng (15), số phòng/đường (16)Bible §2
K09Thời gian từng Hồitrung vị run_end.act_times[i]I 6:30 · II 7:10 · III 7:20 · IV 7:20 · Kết 3:50, mỗi ± 20 s± 60 snhư K08Bible §2
K10Draft · cấp cuốirun_end.drafts, level26 ± 2 · 18 ± 1ngoài ± 4 · ± 2XP lên cấp kế CRV_xp_level17 Q3
K11ĐÁP + Né Hoàn Hảo thành côngΣans_ok+pd_ok / Σans_tot+pd_tot40–60%< 30% hoặc > 75%KHÔNG chỉnh cửa sổ; soát tell/khả đọc (doc 11) → mật độ quanh tellP3, 17 §11.1
K12Trúng đòn tímΣhits_by_tell.P / Σp_tells_aimed< 30%≥ 35%soát CV dồn P (14 VD3), token tím, hazardP3/P7, 17
K13Ulttrung vị ult_cast.gauge_fill_s ở Lv1045–60 s; lệch hero ≤ ±10%> ±15%Dư Âm (vong_gain) hero17 §11.1
K14Input → hitđo PlayMode (khung đầu động tác) + camera tốc cao≤ 0.12 s> 0.12 scode (không cân bằng)P1
K15Chết bởi 1 đònhero_died.one_shot / tổng chết≤ 15%> 20%dmg_pct của top_source17 §11.1
K16Thắng theo hero (Độ Tang 0)run_end.result± 5 điểm quanh trung vị rosterngoài ± 5 điểm 2 kỳ (VD-QA-1)nút lớp 4 hero17 §11.1

4.3 KPI theo hero (D2; 1 dòng/hero, cột chung + rủi ro riêng)

Cột chung mọi hero: K11, K13, K16, K22 (tỉ lệ chọn), K05/K07 theo hero ±15% trung vị roster, 17 §3 ST/HD ±15% (sim), ĐÁP thành công riêng của verb ∈ 40–60%.

HeroMốcĐÁP (cửa sổ gốc)Verb giữKPI rủi ro riêngXanh
H01 VarekMS02Gạt 0.16 sThủ (chặn trước 180°)Vỡ Thế / run≤ 3 (demo Q4)
H02 BodanMS02Chặn Nắp 0.18 sDựng QuanINV-01e (vô sắc) test 5 s trên B2/B4≥ 90% chỉ đúng hero
H07 VeyraMS02Bắn Ngắt 0.16 sLùi Lắptỉ lệ kéo đạt mốc 1 / lần giữ40–70% [ASSUMED]
H03 HalkaMS03Gõ Chuông 0.16 sNhảy Sàochết khi đang Nhảy Sào (bất tử 0.35 s)0 (lỗi A nếu > 0)
H06 RuvanMS03Bắt Đòn 0.15 sHấp Nhiệt% thời gian đứng giữ / phòng≤ 35% [ASSUMED]
H10 IngraMS04Màn Khói 0.18 sHoá KhóiK12 riêng khi trong Khói< 30%
H04 SậuMS04Khép Compa 0.15 sKẻ Vòngtest 5 s vạch phấn giữa 250 quái (P-05)≥ 80%
H11 WennaMS05Hất Đất 0.15 sCắm XẻngCPU ms với 3 hố (P-04)≤ 10 ms
H08 DovMS05Nổ Chặn 0.15 sTì Báng NạpK15 khi đang nạp≤ 15%
H09 KessaMS06Quăng Vòng Xu 0.16 sLưới XuK01 (ném bó)≤ 1.3 × trung vị roster
H05 OskaMS06Quay Chắn 0.16 sQuỹ ĐạoK01 (hút cụm) + FX sàn lớn P-01≤ 1.3 × trung vị; p95 ≤ 16.6 ms
H12 AmbrinMS07Thổi Dội 0.16 sNốt Ngânđồng bộ máy nhịp ↔ nhạc (AT-07)lệch ≤ 5 ms sau 10 phút
  • Mốc hero theo _bible.json.heroes[].milestone (đã khớp bảng Bible §10 ở bản này); lệch → Bible §10 thắng (Roadmap Quy tắc).
  • Cửa sổ ĐÁP cuối = gốc + Thương Xót + Edge/Relic, kẹp ≥ 0.14 s (INV-11); KPI ĐÁP đo ở lát mercy = false.

4.4 KPI build & chọn (D5)

IdKPICách tínhXanhĐỏNútNguồn
K20Tỉ lệ chọn Edge khi được chàodraft_pick / draft_offer theo id8–45% và 0.5×–2.0× trung vị cùng rarity< 8% hoặc > 45% 2 kỳbuff/nerf hàng; đổi luật13 §16.3, 17 §11.1
K21Cộng Hưởng II ≥ 1run MR01 có resonance.tier ≥ 2≥ 30%< 25%draft.completer 0.35 → 0.45Bible, 13 §16.3
K22Tỉ lệ chọn herorun của hero / run của người đã mở ≥ 2 heromỗi hero 0.5×–2.0× của 1/N_mở< 0.5× hoặc > 2.0× 2 kỳ [ASSUMED]soát K16 → kit/Edge lõi; không ép bằng metadoc này (Q4)
K23Hướng buildthắng theo hướng (13 §14)mỗi hướng ≥ 15% thắng của hero; không hướng > 50%; ≥ 4 hướng/hero (P5)< 3 hướng sốngEdge lõi của hướngP5, 13 §16.3
K24Thời gian chọn thẻtrung vị ui_draft.time_s ở draft thứ 10+≤ 3.0 s> 4.0 srút chữ thẻ (mẫu {param})P5, 40 §11 (Q6)
K25Tự chọn · bỏ qua draftauto_picked · skip≤ 5% · ≤ 8%> 8% · > 12%lọc pool13 §16.3
K26Chạm caps.more_dmgrun_end.caps_hit≤ 10% run> 10%hạ MORE hàng hay gặp13 §16.3

4.5 KPI chết & công bằng (D3)

IdKPICách tínhXanhĐỏHành động
K30Nguồn chết theo tellhero_died.killing_blow.tellY ≤ 50% · P ≤ 35% · N ≤ 15% [ASSUMED]N > 20%vùng đọng giết = khó đọc → soát ≤ 4 sát thương/tick (INV-02), độ phủ chấm
K31Tập trung đòn kết liễuphần chết của 1 attack_id / phần xuất hiện của nó trong cùng Hồi≤ 3.0×> 4.0×soát tell + dmg_pct của đòn đó (lớp 3)
K32Chết "không hiểu"SV03 ≤ 2≤ 25%> 35%soát recap INV-16, top 10 đòn của người trả lời ≤ 2
K33Đòn không tell trong last5tell rỗng0> 0lỗi A (INV-02/04)
K34Vi phạm INV runtimeInvariants PlayMode + heat_guard0 vi phạm · heat_guard chỉ ở log≥ 1 vi phạmlỗi A; heat_guard > 1%/run → soát hiệu ứng gây
K35Ấn Tinh Anhem_deaths/em_seen mỗi EM≤ 1.5 × trung vị 16 Ấn> 1.5×số Ấn (19 §8)
K36Mutatortỉ lệ thua Hồi có MUT / không MUT≤ 1.3×> 1.3×số hiệu ứng → pool → ngân sách DI

4.6 KPI Tro Nhớ — tỉ lệ kích hoạt thích nghi (D4; số nguyên văn 14 §15)

IdKPICách tínhXanhHành động khi trượt
K40Nhận ra Tro NhớSV01 = Có≥ 60%tăng nổi bật callout/◆, thêm bark
K41Thấy bất côngSV02 ∈ {1,2}≤ 15%cap_tier −0.05 / thr_on +0.05
K42Tỉ lệ CV bật / runrun có ≥ 1 ash_cv_on / run (sau 60 s đầu, bỏ 3 run đầu đời)theo dõi; chênh giữa hero max/min ≤ ×2refit hero_baseline trục đó = trung vị hero
K43Cùng 1 cv_id / herorun hero có cv_id đó / run hero≤ 50%như K42
K44Chênh thắng boss có CV vs khôngash_fight≤ 10 điểm %giảm cap boss hoặc bỏ CV gây chênh
K45Chênh sát thương nhận/phút khi CV bậtash_fight.dmg_taken_per_min≤ +15%như K44
K46Chết có ≥ 1 nguồn CVash_death≤ 25%soát answers, tăng recover_add_s
K47Nhịp lừasát thương đòn feint = 1 / cùng đòn không lừa≤ ×1.5giảm windup_hold_s.hi
K48Tắt nhớ xuyên rungame.cross_run_memory = off (khoá 42 §8, ghi qua ash_settings)≤ 10% ngườirà Sổ Thù
K49Mở xem Tro Nhớngười mở AshInspect ≥ 1 lần / 5 run đầu≥ 60%gợi ý ui_hint
K50Chặn ngân sáchash_budget_block / ash_cv_ontheo dõi (> 40% = ngân sách Hồi quá chật)soát 14 §11.3
  • Mọi KPI Tro Nhớ đo ở lát ash_level ≥ 1, bỏ DAILY (hồ sơ seed) và BOSS_RUSH (chỉ MICRO) khỏi K44–K46.

4.7 KPI kinh tế & meta (D6)

IdKPIXanhĐỏNguồn
K60Vàng Mã thu / run · số món mua500–700 · 3–5ngoài ±15%17 Q14
K61Tro Hồn TB / run (mọi người chơi)~850ngoài ±20%Bible, 17 §11.1
K62Giờ tới mốctrong ±20% bảng 17 §10.3ngoài ±30%milestone
K63Mốc Bible §3.8 (trung vị)qua Hồi I 1–1.5 h · END_BELL_TOLL 10–14 h · END_QUIET_SHORE 20–28 h · MR20 cả 12 hero 100–130 hngoài dải 2 kỳBible §3.8
K64Run thắng chạm trần Tro Hồn≤ 1.500 (biên Bible)> 1.500 (W 1499,5 sau phòng Hồi IV 32; 17 Q16)meta_gain

4.8 KPI độ khó & mode (D7; 19 §8)

IdKPIXanh
K70Thắng Độ Tang 0 sau END_BELL_TOLL35–45% [ASSUMED]
K71Mỗi +4 Độ Tangthắng giảm 5–8 điểm %
K72Thử Độ Tang ≥ 4 trong 5 run sau END_BELL_TOLL≥ 25% người
K73DAILY≥ 20% người mở DAILY chơi ≥ 3 ngày/tuần
K74Thương Xót theo presetchỉ theo dõi, không mục tiêu

4.9 KPI demo & phát hành (D9; Roadmap §3.5–§3.6, giữ nguyên ngưỡng)

IdKPIĐỏXanhRất tốt
K80Trung vị giờ chơi demo< 20 phút> 30 phút≥ 60 phút [ASSUMED]
K81% người chơi demo qua BS_B1< 15%25–40% [ASSUMED]—
K82% chạy ≥ 2 run< 40%≥ 60% [ASSUMED]—
K83Wishlist thêm trong tuần Next Fest< 2k≥ 10k [ASSUMED]—
K84Crash / 100 phiên> 1≤ 0.2—
K85Đánh giá tích cực (EA 2 tuần)< 70%≥ 80%≥ 90% [ASSUMED]
K86Hoàn tiền (EA)> 12%≤ 8%≤ 5% [ASSUMED]
K87Trung vị giờ chơi EA< 2 h≥ 4 h≥ 8 h [ASSUMED]
K88Bấm Wishlist ở màn kết demo< 10% [ASSUMED]≥ 25% [ASSUMED]—
K89Phễu onboarding demoboot → phòng 1 < 90% · phòng 1 → BS_B1 < 30%≥ 95% · ≥ 45% [ASSUMED]—

4.10 KPI kỹ thuật (D8, D10)

IdKPIXanhĐỏ
K90p95 khung (Deck, perf_room)≤ 16.6 ms ở ≥ 95% phòng> 16.6 ms ở > 10% phòng
K91perf_tier ≥ 2≤ 5% phòng> 15% phòng
K92Preset 180 tự bật (fps < 50 trong 10 s)≤ 10% phiên Deck> 25%
K93Crash / 100 phiên≤ 0.2> 1 (lỗi A)
K94Mất/hỏng save0≥ 1 báo cáo (lỗi A)
K95Hub → run · boot → title (Deck)≤ 5 s · ≤ 8 s> 7 s · > 15 s (giới hạn Verified)

75. Dashboard cân bằng

5.1 Đường dữ liệu

  1. NDJSON (local / gói gửi) → ingest máy chủ telemetry (43 §15.2) → bảng thô theo sự kiện, giữ 13 tháng.
  2. Lọc §0 (bỏ cheated/modded/bot, sai content_version, run < 60 s) → bảng runs, rooms, drafts, deaths, ash, perf, ui.
  3. Tổng hợp mỗi đêm (UTC 03:00) theo lát chuẩn §0 → bảng KPI K01–K95 kèm n và CI 95%.
  4. Sim Autopilot (balance mode) đổ cùng định dạng, cờ bot = true, xem ở tab "Sim" riêng — không trộn với người thật.
  5. Bản dev/QA không có máy chủ: py -3 GDD/Full/tools/balance_calc.py đọc thư mục NDJSON local (50 §15).

5.2 Bộ dashboard

MãTênWidget (trục)Lát mặc địnhCảnh báo tự động
D1Sức khoẻ runK08/K09 hộp-râu theo Hồi; K01 đường theo phút run; K02 histogram; K10mode STANDARD, Độ Tang 0, 14 ngàyK01 < 120 ở bất kỳ Hồi; K08 ngoài 26–35 phút
D2Ma trận herobảng nhiệt hero × Hồi: thắng, K11, K13, K05/K07; cột n + CIĐộ Tang 0, mercy offô Đỏ K16 2 kỳ; n < 400 tô xám "chưa đủ mẫu"
D3Chết & công bằngtop 20 attack_id theo phần chết (K31), cột tell Y/P/N, one_shot, ASH/BASE; K30 thanh chồng; K32Hồi, heroK33 > 0; K15 > 20%; K31 > 4.0×
D4Tro NhớK42 theo hero (cột), K43 top 10 cv_id, K44/K45 so cặp, K46, SV01/SV02ash_level ≥ 1, bỏ DAILY/BOSS_RUSHK41 > 15%; K42 max/min > ×2
D5BuildK20 phân tán tỉ lệ chọn theo rarity (điểm = Edge), K21, K23 hướng build, K24/K25hero, MREdge ngoài 8–45% 2 kỳ
D6Kinh tếVàng Mã thu/chi theo Hồi; Tro Hồn/run; giờ tới mốc (K62/K63) đường tích luỹmọi người chơiK60/K61 ngoài dải
D7Độ khó & modethắng theo Độ Tang (đường, K71); K35 theo EM; K36 theo MUT; DAILY giữ chân K73sau END_BELL_TOLLK35/K36 Đỏ
D8Hiệu năngp95 theo nền tảng × biome × hero; perf_tier theo phòng; RAM; preset 180 tự bậtDECKK90/K91/K92 Đỏ
D9Phễu & demoboot → phòng 1 → R6 → BS_B1 → run 2 → demo_end_screen.wishlist_clicked; K80–K83build DemoK80 < 20 phút sau 3 ngày
D10Ổn địnhcrash theo sig × build; bug_report theo màn; K93/K947 ngàycrash > 1/100 phiên (gọi trực)

5.3 Ví dụ cảnh báo (VD-QA-2)

  • Kỳ EA 2 tuần: D3 cho Sóng Đò BS_B2_A02 Sóng Đò (đòn P) chiếm 9.1% số chết Hồi II nhưng chỉ 2.0% số đòn xuất hiện → K31 = 4.55× > 4.0 → Đỏ; one_shot 0 → không phải sát thương; tell P → soát token tím + hazard trùng lúc (INV-08 trần 5) bằng replay 5 cái chết mẫu; kết luận "vùng P chồng mây B2" → sửa thứ tự vẽ (INV-18), KHÔNG giảm sát thương.

86. Phân loại & xử lý lỗi (triage)

6.1 Hạng lỗi

HạngĐịnh nghĩa (bất kỳ điều kiện)Ví dụ
A — chặncrash/treo; mất/hỏng save; chặn tiến trình (không mở được hero/Hồi/kết đã đạt); vi phạm INV-01..INV-18 tái hiện được; đòn không tell (K33); thành tựu/leaderboard nhận điểm sai hàng loạt; lộ dữ liệu cá nhân/gửi telemetry khi chưa đồng ý; từ cấm/tên thật trong bản buildcrash > 1/100 phiên; Lướt không i-frame frame 0; telemetry gửi khi "Không"
B — nặngsai luật gameplay so với doc/JSON có cách tránh; mất phần thưởng 1 run; số hiển thị sai so với hiệu ứng thật; Deck checklist trượt 1 mục; KPI Đỏ do lỗi (không do cân bằng); chữ chưa dịch ở ngôn ngữ đã shipEdge cộng sai hạng; thẻ ghi 20% nhưng áp 15%
C — vừalỗi hình/âm/UI không làm sai quyết định; chữ tràn ở pseudo-loc; onboarding bối rối (PT-B)FX lệch hitbox ≤ 4 px; glyph ABXY trên Deck ở 1 màn phụ
D — nhẹthẩm mỹ, chính tả, đề xuất1 pixel lệch ở icon
  • Lỗi cân bằng (KPI Đỏ không do bug) KHÔNG vào hạng A–D: đi vòng cân bằng 17 §11.3.

6.2 Trường bắt buộc của 1 báo lỗi

title (≤ 80 ký tự, dạng "<khu> — <triệu chứng>") · severity A–D · build_number · content_version · platform · hero · act/node · seed64 (nếu trong run) · bước tái hiện (đánh số) · kỳ vọng vs thực tế (trích doc/JSON nguồn) · tỉ lệ tái hiện (x/10) · tệp kèm: log, ảnh, run_active.json/save, 30 sự kiện cuối (tự gắn bởi "Báo lỗi" trong game hoặc BugLogger).

  • Thiếu bước tái hiện hoặc build → trạng thái "cần thông tin", không xếp hạng.
  • Trùng: cùng chữ ký stack (crash) hoặc cùng attack_id/màn + triệu chứng → gộp vào lỗi cũ, cộng số lần.

6.3 Luồng & SLA

BướcAiThời hạn
Nhận → xếp hạng + gán chủQA trựcA: ≤ 4 h giờ làm · B: ≤ 1 ngày · C/D: họp triage tuần
Sửachủ (theo module 50 §2.1)A: ngay, chặn merge khác của module · B: trong sprint · C: theo backlog · D: khi rảnh
Kiểm lạiQA (người khác người sửa)≤ 1 ngày sau bản có sửa; đóng chỉ khi tái hiện 0/10
Ngược về mainchủmọi sửa trên release/*/hotfix/* cherry-pick về main (50 §16.1)
  • Sau phát hành (43 §11.4): A → vá nóng ≤ 48 h (Next Fest ≤ 24 h); không vá kịp trong 12 h → lùi build default. B → bản vá kế ≤ 14 ngày (EA).
  • Lỗi "chết không hiểu" từ người chơi: lấy hero_died.last5 + seed → tái hiện bằng run.seed + run.goto (50 §17); không tái hiện được 3 lần → đóng "không đủ dữ liệu", cộng vào K32.
  • Lỗi dữ liệu (JSON sai luật) → sửa JSON + thêm luật vào validate.py nếu luật chưa có (mỗi lỗi dữ liệu tái phát = 1 luật mới).

6.4 Cổng theo số lỗi mở

CổngABC
Merge vào main0 mới do PR——
Demo khoá chất lượng (F−5)0≤ 5không giới hạn, không trong onboarding
Khoá nội dung EA (M12)0≤ 10 [ASSUMED]≤ 60 [ASSUMED]
Mỗi bản lên default0không B mới so với bản trước—
1.0 (M32)0≤ 5 [ASSUMED]≤ 40 [ASSUMED]

97. Ma trận test hiệu năng

7.1 Máy & ngưỡng chung (Bible §10.4, 50 §5)

MáyNgưỡng khungCPU mainKhác
Steam Deck (trần thiết kế)60 fps, p95 ≤ 16.6 ms≤ 10 ms (sim 5.2 + hiển thị 2.8 + dự phòng 2.0)worker Burst ≤ 4 ms; GPU ≤ 10 ms [ASSUMED]; hạt ≤ 1.050 (preset 70%)
Desktop tối thiểu [ASSUMED]60 fps 1080p, p95 ≤ 16.6 ms≤ 10 mshạt ≤ 1.500
Desktop khuyến nghị [ASSUMED]60 fps khoá, p99 ≤ 16.6 ms, 1440p≤ 8 ms [ASSUMED]—

Chung mọi máy: GC.Alloc = 0 B/frame trạng thái ổn định · ≤ 40 sheet VFX · ≤ 12 VFX chết/frame · ≤ 21 trang atlas thường trú · RAM ≤ 3 GB · texture ≤ 1 GB · cài đặt ≤ 4 GB · voice ≤ 56 (29 dành chỗ) · tick bù 2 tick/frame < 5% frame.

7.2 Kịch bản (P-xx) × máy

MãKịch bảnCách chạyDeckDesktop minMốc đầu
P-01Lát Chịu Tải: 250 × EN_B1_01/02/06 + H01 Ult + 1 Tinh Anh + MESOscene MS01b, Autopilot stress, 10 phút × 3 lầnngưỡng §7.1 cả 3 lầnnhư DeckMS01b
P-02Stress F10: run thật + 150 quái thêmAutopilot + F10, 10 phút, hằng tuầnp95 ≤ 16.6 ms; lùi > 10% so với tuần trước → chặn merge—MS01b
P-03Đỉnh phòng TIDE + MRN02 (250 quái) mỗi biome B1–B4run.goto + mrn.set MRN02 <max>ngưỡng §7.1ngưỡng §7.1theo biome
P-04H11: 250 quái + 3 hố (flow field dựng lại)hero H11, Autopilot HOLDCPU ≤ 10 ms; dựng flow field ≤ 1.0 ms/lần [ASSUMED]—MS05
P-05H04 Kẻ Vòng + H05 Quỹ Đạo + H10 vùng Khói (FX sàn lớn) giữa 250 quáiAutopilot AOEGPU ≤ 10 ms; hạt ≤ 1.050—MS04/MS06
P-06Boss nặng: BS_FINAL P2 (3 bóng) + sân rỉ ≥ 6 quái S/20 s; BS_TRUE P2run.goto Kết/B6ngưỡng §7.1ngưỡng §7.1MS06/MS07
P-07Soak 2 giờ (run nối run, hub giữa)Autopilot soakRAM tăng ≤ 50 MB; 0 crash; p95 không trôi > 5%như DeckMS02
P-08Tảiđo boot → title, hub → run, DOCK → Hồi kế≤ 8 s · ≤ 5 s · ≤ 3 s [ASSUMED]; Verified ≤ 15 s≤ 6 · 4 · 2 s [ASSUMED]VS
P-09Hạ cấp dưới tảiperf.tier 0→3, vfx.lod 0→3không bao giờ mất tell Y/P/N, chớp trắng, vòng chân, x-ray, ấn spawn, vùng đích đạn P (50 §4.5)như DeckMS01b
P-10Preset 180 tự bậtép fps < 50 trong 10 s (time.scale + tải giả)bật đúng sau 10 s, chỉ ở phòng sau, log perf_tier—MS02
P-11Âm tải MS01bAT-04 32 §1432 §6.5 đạt hết; input → onset âm p95 ≤ 40 ms (AT-11)AT-11MS01b
P-12Pin Deck1 run 32 phút ở 60 fps≥ 2 h pin ước tính [ASSUMED]—MS07
P-13Suspend/resume10 lần suspend giữa trận boss0 lỗi; khung cuối hiện lại ≤ 2 s—MS02
P-14DAILY tất địnhAutopilot daily 30 seedCRC nội dung Windows = Deck—MS03

7.3 Cách đo & báo cáo

  • Đo bằng PerfMeter (FrameTimingManager, p95 trượt 1 s/2 s) + ProfilerMarker mỗi hệ (overlay F3 PERF); xuất perf_<scenario>_<build>.csv (frame_ms, cpu_ms, alive, fx_active, sheets, voices, gc_bytes mỗi giây).
  • 1 lần đo = 10 phút sau 60 s khởi động; 3 lần; lấy lần tệ nhất.
  • Báo cáo: bảng hệ × ms so với 50 §5.2; hệ vượt ngân sách của nó > 20% → lỗi B gán chủ module dù tổng còn đạt.
  • VD-QA-3: P-02 tuần 31: p95 Deck 15.1 ms (tuần trước 13.4 ms) → lùi 12.7% > 10% → chặn merge; F3 PERF chỉ HeavyBrain 0.4 → 1.1 ms sau PR thêm đồ thị đòn BS_B3 → sửa trước khi mở merge.

108. Kiểm tự động

8.1 CI (50 §16.3; máy build Windows tự host + 1 Steam Deck nối mạng)

NhịpBướcLệnh / bộĐạt
mỗi PR1 Kiểm dữ liệupy -3 GDD/Full/tools/validate.py --all --banned-terms <thư mục ngoài repo>0 ERROR (WARN được, ghi trong PR)
mỗi PR2 Từ cấm toàn repoquét từ cấm trên GDD/, Assets/, loc, tên file (cùng danh sách --banned-terms)0 trúng
mỗi PR3 Renderpy -3 GDD/Full/tools/build_gdd.py --only csv rồi so lệch với _unity/ đã commit0 lệch ngoài lệch do PR; không sửa tay bản render
mỗi PR4 Cân bằngpy -3 GDD/Full/tools/balance_calc.py --selftest (gồm --check-data)exit 0
mỗi PR5 Lint nội dungash_lint + fairness_lint (14 §12), wave_lint (15), audio_lint.py (AT-03), art-style lint khi chạm hub0 lỗi
mỗi PR6 Sync + Bake + biên dịchbatchmode0 lỗi biên dịch
mỗi PR7 EditModeTickMath, DamagePipeline, HitShapes, RngStreams, MapGen, AshMemory, Save, Data, Loc (50 §18.1)100% xanh
mỗi PR8 PlayMode smokeboot → hub → run → 1 phòng → chết → recap → hub, Autopilot H01< 3 phút, 0 exception
mỗi PR9 Grep cấmKeyboard.current/Gamepad.current/Mouse.current/Touchscreen.current ngoài thư mục Input; RNG toàn cục của engine trong logic run (16 §10.1); DateTime.Now; asmdef sim tham chiếu Presentation/UI0 trúng
mỗi PR9b credits_checkdoc 40 §5.7.1 / AT-080 thiếu
mỗi đêm10 Build Dev + PlaytestBuildPipeline.Run -profile Dev|Playtestbuild xanh; kích thước ≤ 4 GB
mỗi đêm11 Autopilot cân bằng12 hero đã có × 1 run sim-only (balance)CSV đêm; lệch K01/K08/K10/K11 > 15% so với đêm trước → cảnh báo
mỗi đêm12 InvariantsPlayMode 10 phút Autopilot0 vi phạm INV-02/03/08/11/12/14/15
hằng tuần13 Hiệu năng DeckP-01 + P-02§7
hằng tuần14 LocAutopilot loc (pseudo-loc xx-PS +35%), chụp mọi màn0 tràn, 0 khoá thiếu, {param} khớp
trước MS15 Sim cân bằngAutopilot balance 1.000 run/hero (17 §11.3 bước 1)17 §3 ST/HD ±15%, PI cuối Hồi ±10%, TTK §5, cấp cuối 18 ± 1
release16build Release/Demo · di trú mọi schema save đã ship (≥ 20 file mẫu) · smoke Deck tay 30 phút · validate.py --all --strict0 lỗi; WARN = lỗi

8.2 Autopilot (Bladewake.Dev.Autopilot, 50 §18.2)

  • Chỉ chơi qua InputFrame từ những gì người chơi thấy (không đọc sim nội bộ); BotProfile mỗi hero × lối DEFLECT DASH HOLD AOE RANGED MASH (kéo trục PSP để thử Tro Nhớ).
  • Chính sách trung vị cho sim cân bằng (17 §11.3): chọn thẻ theo tag, ĐÁP đúng 50%, Né Hoàn Hảo 40%; lối DEFLECT 85% (demo 09 §5) dùng cho clip, không dùng cho số cân bằng.
Chế độDùng choĐầu raĐạt
showcaseclip marketing, khung test 5 svideo 1920×1080 + 1080×1920không UI debug trong khung
balancesim KPINDJSON cờ bot → CSV≥ 20× thời gian thực [ASSUMED]
stressP-01/P-02perf_*.csv§7
soakP-07RAM theo phúttăng ≤ 50 MB / 2 h
dailyP-14CRC nội dung 30 seedWindows = Deck
locpseudo-locảnh mọi màn0 tràn
  • Autopilot phải dùng được hết hành động của hero (demo T6): combo, Lướt, ĐÁP (cận + đạn), verb giữ, Né Hoàn Hảo, 3 kỹ năng, Ult, bình máu, chọn thẻ, Relic; thiếu 1 hành động ở hero mới → hero chưa vào sim.

8.3 Giám sát bất biến runtime (Invariants, chạy trong Autopilot + build Dev)

INVKiểmNgưỡng
02mọi đòn có tell ∈ {Y,P,N} và phát đúng gói (glint 0.12 s trước va chạm cho Y)100%
03windup ≥ 0.30 s (≥ 0.45 s M/L/XL), khe chuỗi ≥ 0.35 s, sau mọi hệ số Khăn Tang/mutator/Ấn0 vi phạm
08≤ 4 windup cận chiến + ≤ 3 loạt đạn nhắm hero; ≤ 3 tell tím sàn từ quái thường, ≤ 5 tổng0 vi phạm
11cửa sổ ĐÁP ≥ 0.14 s (9 tick); ĐÁP 360°0 vi phạm
12i-frame Lướt ≥ 12 tick từ frame 00 vi phạm
14spawn ngoài r90, ấn 0.6 s, không windup 0.8 s đầu0 vi phạm
15dịch trọng số ≤ 20%/35% (50% dưới Khăn Tang); báo ≥ 1.0 s; tắt 60 s đầu run + 3 run đầu đời; spawn MESO ≤ 15%0 vi phạm
17tốc đi quái cuối ≤ tốc chạy cơ bản hero / 1.10 vi phạm

119. Checklist chứng nhận

9.1 Steam Deck Verified (nộp M30, mục tiêu MS07; MS03 = Playable nộp M12) — luật ở 43 §8.2, đây là cách QA kiểm

#NhómHạng mụcCách kiểm (QA)Đạt
DV01Input100% game bằng tay cầm, kể cả màn đồng ý, cài đặt, khởi động lần đầurút chuột/bàn phím, đi hết cây menu từ cài mới0 màn kẹt
DV02Inputglyph Deck đúngchụp mọi màn có nhắc nút ở 1280×8000 glyph bàn phím/ABXY
DV03Inputnhập chữ qua bàn phím ảoCUSTOM seed + tên preset remapbàn phím ảo hiện, nhập được
DV04Inputmất tay cầm giữa runtắt tay cầm ngoàitự tạm dừng + "Kết nối lại tay cầm"
DV05Hiển thịđộ phân giải mặc địnhcài mới trên Deck1280×800; render 427×267 ×3, cắt 1 px
DV06Hiển thịchữ đọc đượcđo trên ảnh chụpchữ nhỏ nhất ≥ 12 px cao (cả CJK), chữ thân ≥ 16 px; ui_text_scale_min 1.25
DV07Hiển thịtell trên 7"test 5 s §2.6 trên Deck với 3 hero≥ 80% đúng; bản mù màu ◇/▲/chấm
DV08Liền mạchkhông launcher/tài khoản ngoài/chống gian lận cài thêmkhởi động lạnhthẳng vào title ≤ 15 s
DV09Hệ thốngsuspend/resumeP-1310/10 không lỗi
DV10Hiệu năngmặc định mượtP-01 trên Deck60 fps, p95 ≤ 16.6 ms, CPU ≤ 10 ms; hạt ≤ 1.050; preset 180 tự bật đúng
DV11Hiệu năngpinP-12; tuỳ chọn trần fps 30/40/45/60 hoạt động≥ 2 h [ASSUMED]
DV12Âmloa trongpreset SN_SMALL_SPEAKER tự bật; nghe tell ở 30% âm lượngAT-10 đạt
DV13Lưucloud PC ↔ Deckchơi máy A → máy Bluật 43 §7.3 đúng
  • Bị trả về → sửa ≤ 2 tuần, nộp lại (43 §8.2); mỗi lần nộp ghi kết quả vào 43 §8.2.

9.2 Phát hành (mỗi bản lên default) — 43 §11.4 (10 mục) + QA bổ sung

#KiểmĐạt
RL01validate.py --all --strict + EditMode + PlayMode + Invariants0 ERROR, 0 WARN, 0 vi phạm
RL02di trú save từ 2 bản default trước (demo không migrate, Roadmap Q8)0 lỗi / ≥ 20 file mẫu
RL03P-01 Deck60 fps, p95 ≤ 16.6 ms
RL04smoke Deck 30 phút tay cầm (hub → Hồi I → boss)0 lỗi A
RL05thành tựu/stats trên rc bằng tài khoản test, reset sau testmỗi thành tựu mới mở đúng 1 lần
RL06nộp điểm vào bảng DEV_* qua máy chủ thậtđi hết 6 bước 43 §6.3
RL07cloud máy A → máy B (PC + Deck)43 §7.3
RL08loc 100% chuỗi các ngôn ngữ đã ship, pseudo-loc không tràn0 chuỗi thiếu
RL09ghi chú cập nhật VI + ENcó trước khi đẩy
RL10giờ đẩy thứ Ba–thứ Năm 16:00–18:00 UTC (trừ vá nóng)—
RL11build report: không assembly Bladewake.Dev, không phím debug, không SDK quảng cáo/IAP/analytics di động0
RL12đồng ý telemetry: chọn "Không" → 0 gói gửi (bắt mạng 1 run)0 byte tới endpoint telemetry
RL13quét từ cấm trên build cuối (chuỗi loc + tên file + metadata)0 trúng
RL14content_version build = _unity/content_version.txt; bảng leaderboard đúng hậu tốkhớp

9.3 Khoá chất lượng demo (F−5, 43 §3.3)

#KiểmĐạt
DM01100% demo bằng tay cầm (DV01–DV04)đạt
DM02Deck: P-01 60 fps; chữ đọc được 1280×800đạt
DM03màn đồng ý telemetry điều hướng tay cầm; 2 nút "Đồng ý"/"Không" ngang nhau, không bỏ qua bằng "Tiếp"đạt (43 S11)
DM04lỗi mở0 A, ≤ 5 B
DM05EN + VI 100% chuỗi, không chuỗi debugđạt
DM06nút Wishlist ở màn kết demo hoạt động có/không overlayđạt; bắn demo_end_screen
DM07trần nội dung ở BS_B1: hạ xong → màn "còn tiếp ở EA"; save demo tách khỏi EAđạt
DM08cờ nội dung BW_DEMO: chỉ H01 H02 H07, Hồi I, STANDARD; mở H02 (xong 1 run) / H07 (150 ĐÁP + 6 CUR_ECHO_SHARD) đúngđạt
DM09Tro Nhớ MICRO + MESO trên B1; MACRO/Sẹo tắt; FTO đã qua trước M9 (Roadmap Q10)đạt

9.4 Quyền riêng tư & đồng ý (43 §15)

#KiểmĐạt
PV01mặc định "chưa chọn" ở lần chạy đầu; crash mặc định "Hỏi mỗi lần"đạt
PV02không thu tên tài khoản, email, IP lưu > 24 h, bạn bè, đường dẫn người dùng, ảnh màn (trừ tick "Đính kèm ảnh")quét gói mẫu: 0 trường cấm
PV03"Xoá dữ liệu đã gửi" tạo yêu cầu theo telemetry_id; "Tạo mã ẩn danh mới" đổi UUIDđạt; xử lý ≤ 30 ngày
PV04log crash đã xoá đường dẫn người dùng/tên máy0 trúng
PV05leaderboard: thông báo + "Chơi không xếp hạng" lần đầu vào DAILY/ENDLESS/BOSS_RUSHđạt

9.5 Trợ năng & Thương Xót (Bible §4.3, meta.accessibility)

#KiểmĐạt
AX01tell mù màu ◇/▲/chấm thay đổi đúng trên mọi biometest 5 s bản mù màu ≥ 80%
AX02âm tell theo vị tríAT-01 đạt khi bật
AX03remap toàn bộ + preset 1 tay; giữ/bật verb giữchơi hết Hồi I bằng preset 1 tay
AX04Thương Xót: −25/−50/−75% sát thương, ĐÁP +0.03/+0.06 s, tốc game 70–100%, Tro Nhớ 0, Phòng Thủ Tự Động 50%mỗi tuỳ chọn đo đúng số; cờ mercy_used khoá leaderboard + thành tựu Độ Tang, không khoá meta/kết/hero
AX05preset FX Deck 70%hạt ≤ 1.050

1210. Tiêu chí nghiệm thu theo mảng tính năng

Luật: 1 tính năng chỉ "xong" khi mọi AC của mảng nó chạm đều Đạt + CI §8.1 xanh + có sự kiện telemetry §3 tương ứng. AC trích số từ doc sở hữu; doc sở hữu đổi số → AC đọc theo, không sửa ở đây trước.

10.1 Combat lõi & tell (10, 11)

ACTiêu chíĐo
AC-CMB-01input → khung đầu động tác ≤ 1 khung; buffer 0.15 s mọi hành động; ưu tiên cùng tick Lướt > ĐÁP > Ult > Kỹ năng > Đánh (INV-07)EditMode TickMath + PlayMode bơm InputFrame
AC-CMB-02input → hit ≤ 0.12 s (P1)camera tốc cao / PlayMode
AC-CMB-03ví dụ tính 10 §3.6 tái tạo đúng từng sốEditMode DamagePipeline
AC-CMB-04cú trúng: hitstop, chớp trắng 0.07 s, knockback theo mass_class, SFX (INV-10)quay khung + log
AC-CMB-050 sát thương va chạm thân (INV-04)Invariants 10 phút
AC-DEF-01ĐÁP trả lời 100% tell Y cận + đạn, hit-test 360°, hụt khoá 0.30 s, tài nguyên 0 vẫn ĐÁP (INV-11)Sân Tập Sân Tập ST_YARD bù nhìn: 50 tell Y × 8 hướng
AC-DEF-02Lướt i-frame ≥ 0.20 s từ frame 0, ≥ 2 lượt, nạp 0.70 s; Né Hoàn Hảo ≤ 0.15 s → World 25% 0.35 s, hoàn 1 lượt, ≤ 1/1.0 s (INV-12)PlayMode khung-chính-xác
AC-DEF-03gói tell Y/P/N đúng INV-02 (glint T−0.12 s ±1 frame, fill tím 25% + rim 2 px, vùng N chấm 2 px ≤ 4 sát thương/tick 0.5 s)quay 60 fps + AT-02
AC-DEF-04trạng thái hero chặn ĐÁP/Lướt phải bất tử hoàn toàn, nếu không chạm ĐÁP/Lướt huỷ trạng tháima trận trạng thái × 12 hero

10.2 Hero (12, data/heroes, data/hero_upgrades)

ACTiêu chíĐo
AC-HER-01kit đủ số theo mốc (Roadmap: MS02 4 SK/1 UL/1 AS/20 Edge · EA 8/2/2/36 + RS1–RS4 + EVO1–EVO2 · 1.0 8/3/3/40 + RS1–RS6 + EVO1–EVO4)validate.py --all coverage
AC-HER-02V ∈ [0.90, 1.10], soạn 0.97–1.03; mọi đòn/kỹ năng balance_calc.py skill XANH hoặc VÀNG có lý dobalance_calc.py heroes
AC-HER-031 verb ĐÁP + 1 verb giữ riêng, cửa sổ gốc đúng _bible.json.heroes[].answer_window; nút theo Bible §1.1Sân Tập
AC-HER-04slot hue + foot_ring đạt INV-01b/INV-09 (ΔE kề ≥ 12, với tell ≥ 25, tương phản ≥ 3:1 mọi sàn B1–B6)script đo màu trên sheet
AC-HER-05test 5 s (§2.6) + nhận hero 3 s ≥ 80% (§2.7)PT-F
AC-HER-06Autopilot dùng đủ hành động hero (§8.2); sim 1.000 run: K11/K13/K16 Xanhsim trước mốc

10.3 Nâng cấp & build (13)

ACTiêu chíĐo
AC-UPG-01mọi Edge/Relic/RS/EVO/kỹ năng = 1 hàng dữ liệu, 0 code riêng ngoài hook; AllPrimitivesHaveHandlerEditMode Data
AC-UPG-02chữ thẻ sinh từ mẫu {param}; mọi {param} có trong params; đọc thẻ trung vị ≤ 3.0 s (K24)Loc + PT-B
AC-UPG-03số quyết định/run 45 ± 4, draft 26 ± 2 (13 §16.1)sim
AC-UPG-04giá trị thẻ theo rarity trong dải 17 §4.4 ±20%sim

10.4 Tro Nhớ (14)

ACTiêu chíĐo
AC-ASH-01mọi đòn địch có adaptive_source BASE/ASH; đòn ASH có default trung tính + hàng CV qua ash_lint + fairness_lintCI bước 5
AC-ASH-02INV-15 runtime 0 vi phạm (§8.3) ở Khăn Tang max và MRN04Invariants + ash.force từng CV
AC-ASH-03mỗi bật/đổi CV phát đủ gói báo (khựng 0.6 s, ◆, callout/bark, SFX), hiệu lực sau ≥ 60 tickash.trace on
AC-ASH-04tắt 60 s đầu run (MRN13: 30 s), 3 run đầu đời, Thương Xót Tro Nhớ 0, CUSTOM cấp 0PlayMode
AC-ASH-05ví dụ 14 §13 (7 hàng) tái tạo; §7.2 → 0.72EditMode AshMemory
AC-ASH-06K40 ≥ 60%, K41 ≤ 15% ở PT-B/PT-Ckhảo sát

10.5 Director & encounter (15), run & bản đồ (16)

ACTiêu chíĐo
AC-DIR-01mọi spawn qua SpawnPlanner.Place; ngoài r90, ấn 0.6 s, không windup 0.8 s (INV-14)Invariants
AC-DIR-02trần sống 250 (Deck preset 180) cứng; K01 ≥ 120, K02 150–250sim + P-03
AC-DIR-0310 mục tiêu chạy đúng luật Bible §2 (VIGIL lò HP 300 50 s, RESCUE kén HP 400, CHASE 45 s …)1 phòng/mục tiêu, kịch bản QA
AC-RUN-01mọi đường R1→R6 thoả luật đường (1 Cổng R2–R4, ≥ 1 tiện ích R3–R5, ≥ 3 chiến) trên 10.000 seedEditMode MapGen
AC-RUN-02seed 0x5A17C3E1 ra bản đồ Hồi I = ví dụ 16; cùng seed + content_version → cùng bản đồ/thưởng/sạpEditMode + daily
AC-RUN-03lưu giữa nút; thoát giữa run → tiếp đúng nútPlayMode + save.dump
AC-RUN-04K08/K09 trong dảisim + PT

10.6 Kinh tế, meta, độ khó (17, 18, 19)

ACTiêu chíĐo
AC-ECO-01balance_calc.py --selftest 0 lỗi; số tuning.json/curves.json/currencies.json khớp hằng calcCI bước 4
AC-ECO-02K60 Vàng Mã 500–700 (kỳ vọng 679.4); K61 Tro Hồn ~850sim
AC-ECO-03không nguồn/đích tiền ngoài 17 §8/§10soát meta_gain/meta_spend theo source
AC-MET-01mọi trạm ST_* + NPC của mốc mở đúng điều kiện; mua meta giá lớn giữ 0.5 sQA thủ công + unlock
AC-MET-02giờ tới mốc K62 trong ±20% 17 §10.3balance_calc.py hours + PT-E
AC-DIF-01MRN01–MRN15 / MUT01–MUT12 / EM01–EM16 áp đúng 1 điểm móc; guard trượt → bỏ hiệu ứng + log heat_guard, không bỏ guardPlayMode từng id
AC-DIF-02Độ Tang tính đúng tổng điểm; max 43EditMode
AC-DIF-03DAILY: cùng ngày = cùng setup mọi máy; 1 lượt nộp/ngày; sai content_version → từ chối điểm, vẫn chơiP-14 + máy chủ DEV_*
AC-DIF-04Thương Xót không giảm tiền meta, không khoá kết/hero/truyệnAX04

10.7 Hình, VFX, âm thanh (30, 31, 32)

ACTiêu chíĐo
AC-ART-01INV-01a: 0 pixel S ≥ 45% hue 32–62° hoặc 260–290° ngoài tell (trừ glint ≤ 2 px/frame); thân địch S ≤ 40%, không đỏ thẫmscript quét sheet + khung chụp
AC-ART-02mọi sheet qua contact sheet + art-style-reviewer = pass; pixel nguyên, không lọc mịncổng art-style
AC-VFX-01hitbox khớp VFX: lệch ≤ 2 px [ASSUMED] ở overlay HITBOXF3 HITBOX + ảnh chụp
AC-VFX-02FX hero lõi #fff6f0 + viền slot, đặc; FX địch lõi tối, rỗng (INV-01c)soát sheet
AC-VFX-03owner file chỉ tham chiếu VFX_/SFX_/BARK_ của chính nó + SHARED/UI (51 §2.2)validate.py --all
AC-AUD-01AT-01..AT-12 (32 §14) Đạt trước mỗi MSbiên bản AT
AC-AUD-02tell chỉ dùng 6 SFX_SHARED_tell_*, bus EnemyTell, không ngẫu nhiên pitchaudio_lint.py
AC-AUD-03nhạc chỉ cue 32 §3.7; credit CC BY đủ (AT-08)validate.py + màn Credits

10.8 UI/HUD, loc, truyện/codex (40, 20, 43 §12)

ACTiêu chíĐo
AC-UI-01mọi màn trong SAFE 427×267, chạy 100% bằng tay cầm, focus đầu đúng spec, glyph theo thiết bị cuối (đổi ≤ 1 frame)DV01–DV02 + Autopilot loc
AC-UI-02không vàng #ffd84a/tím #b14cff/cùng dải trên UI (trừ biểu diễn tell); màu chỉ từ tokenquét ảnh chụp
AC-UI-03hành động phá huỷ giữ UI_C_Hold 1.0 s; mua meta lớn 0.5 s; focus mặc định popup = lựa an toànkịch bản QA
AC-UI-04recap chết (INV-16): 5 nguồn cuối (tên đòn, Y/P/N, giây) + đòn kết liễu = hero_died.last5so log sát thương
AC-LOC-01100% khoá ngôn ngữ đã ship; {param} khớp; không vượt max_len; pseudo-loc +35% không trànCI bước 14
AC-LOC-02chữ CJK ≥ 12 px; tiếng Việt đủ dấu 2 tầngảnh chụp 1280×800
AC-LOR-01trang codex chủ thể = CDX_<id thường> (vd Varek — Kẻ Gặt Tro CDX_h01, Người Gác Chuông CDX_bs_b1, Tháp Chuông Gãy CDX_hub); mở đúng điều kiện; Hồi VI/boss B5–B6 không lộ trong rich presencevalidate.py + QA

10.9 Lưu, dữ liệu, Steam, telemetry (50, 51, 43, doc này)

ACTiêu chíĐo
AC-SAV-01ghi nguyên tử + .bak; fixture hỏng → nạp .bak; save.corrupt.test không mất tiến trìnhEditMode Save
AC-SAV-02di trú mọi v<n> đã ship, ≥ 20 file mẫu, 0 mất mở khoá (kể cả gỡ cờ build U3)RL02
AC-SAV-03kích thước (trần 43 §7.1) meta_<steamId>.json ≤ 512 KB · run_active.json ≤ 256 KB · ash_profile_<steamId>.json ≤ 512 KB · settings_shared.json ≤ 32 KB sau 100 run sim; mỗi file save/ có khối đầu {schema_version, content_version (int), save_seq, utc_written, device_id, checksum} (43 §7.2)đo sau 100 run sim
AC-SAV-047 luật xung đột 43 §7.3 áp đúng thứ tự, 1 fixture/luật: F1 Steam báo xung đột trước khi chạy → game không ghi save/ tới khi hộp thoại Steam xong, nạp đúng bản người chơi chọn · F2 save_seq 380 < cloud_marker 410 → hiện màn "Chọn bản lưu" (2 thẻ tóm tắt, điều hướng tay cầm), bản không chọn nằm ở local/conflict/<file>_<utc>.json, giữ 3 bản/30 ngày · F3 checksum CRC32 sai / JSON cắt cụt → nạp .bak; .bak cũng hỏng → file hỏng chép vào local/conflict/, meta báo "Bản lưu hỏng, đã khôi phục bản gần nhất", run dở bị bỏ · F4 run_active.run_id ≠ meta.active_run_id → bỏ run dở, tiền meta đã gửi giữ nguyên, báo 1 dòng · F5 content_version file = build + 1 → khoá chỉ-đọc, 0 lần ghi đè, báo "Hãy cập nhật game" · F6 content_version file = build − 2 → migration tuần tự v→v+1→v+2 xanh; fixture migration lỗi → bản gốc ở local/conflict/, 0 lần ghi · F7 ash_profile.save_seq 120 vs bản máy khác 118 → dùng bản 120, không gộp. Chung: 0 lần tự xoá dữ liệu cloudEditMode Save (7 fixture save/conflict/F1–F7) + RL02
AC-DAT-01JSON đúng 51 + tools/schema/*.schema.json; validate.py --all 0 ERROR; build_gdd.py render khớpCI bước 1, 3
AC-DAT-02hot reload F5 không dừng Play; 0 id chuỗi trong sim (handle ushort)PlayMode
AC-STM-01thành tựu mở đúng 1 lần; cheat/modded → không thành tựu/leaderboard, không ghi Sổ ThùRL05 + give.*
AC-STM-02leaderboard qua 6 bước kiểm hợp lý 43 §6.3; mercy_used = true → không nộpRL06
AC-STM-03rich presence cập nhật ≤ 1 lần/5 s, không chữ người chơi gõlog Steamworks
AC-TEL-01mọi sự kiện §3.3 có đủ vỏ §3.2; schema_v khớp; 0 sự kiện gửi khi chưa đồng ý (RL12)test bắt gói
AC-TEL-02gói ≤ 50 KB/run gzip; không gửi trong phòng chiến; hàng chờ ≤ 5 MB bỏ cũ nhấtđo 10 run sim
AC-TEL-03balance_calc.py đọc NDJSON local ra K01–K16 khớp dashboard ±1%so 1 thư mục mẫu

13Quy tắc cho dev/AI

  • Đọc doc này + doc sở hữu hệ thống trước khi viết test, thêm sự kiện, đổi ngưỡng; số KPI canon (Bible P1–P7, §3.8, §8.5) không đổi ở đây — đổi chỉ qua DEC- Bible.
  • Mọi tính năng mới: thêm AC vào §10 (mảng tương ứng) + sự kiện §3.3 + KPI §4 nếu đo được + dashboard §5 nếu cần; thiếu AC = task chưa xong (qa-verifier chặn).
  • Thêm field/sự kiện: sửa §3.3 + 43 §15.2 cùng lượt, tăng schema_v; không gửi gì ngoài danh mục; không dữ liệu cá nhân (PV02).
  • Tên sự kiện canon theo §3.3 (hero_died, shop_purchase); tên cũ ở doc khác là bí danh, code chỉ phát tên canon.
  • Sự kiện tần suất cao gom vào room_end; không phát mỗi cú đánh của quái S.
  • Không chỉnh cửa sổ ĐÁP, windup, tell, token, i-frame Lướt để sửa KPI (17 §11.2); KPI ĐÁP Đỏ → soát khả đọc.
  • Ra quyết định cân bằng chỉ khi n ≥ 400/ô và Đỏ 2 kỳ liên tiếp; 1 lớp nút/KPI/kỳ; ghi số cũ → mới trong patch note.
  • Dữ liệu cân bằng luôn lọc cheated/modded/bot/sai content_version; sim Autopilot không trộn với người thật.
  • Mọi PR: CI §8.1 bước 1–9 xanh; sửa .cs → kiểm biên dịch (rule compile-validation); JSON sửa tay → py -3 GDD/Full/tools/validate.py --file <path> --banned-terms <thư mục ngoài repo> exit 0.
  • Lỗi vi phạm INV, mất save, crash, telemetry sai đồng ý = hạng A, không hạ hạng vì "hiếm".
  • Báo lỗi đủ §6.2; lỗi dữ liệu tái phát → thêm luật validate.py.
  • Hiệu năng đo trên Deck là luật cho mọi nền tảng; lùi p95 > 10% chặn merge; hệ vượt ngân sách riêng > 20% = lỗi B.
  • Thay [ASSUMED] bằng số đo khi có; ghi ngày + nguồn ở "Quyết định đã chốt".
  • Không ghi tên game/studio/thương hiệu có thật vào playtest notes, báo lỗi, tài sản test; tên nền tảng chỉ Steam/Steam Deck/Steamworks/Next Fest (Roadmap Q12).

14Quyết định đã chốt

QQuyết địnhLý do
Q1 Tên sự kiện chết/mua2026-11-07 — canon hero_died + shop_purchase (17 §11.1); death / shop_buy của 50 §15 là bí danh → 50 sửa theodoc 17 là doc nền, xếp trên doc 50; 1 tên/sự kiện cho ingest
Q2 Sự kiện tần suất cao2026-11-07 — ĐÁP/Lướt/trúng đòn gom bộ đếm trong room_end; thô chỉ cho đòn M/L/XL, đòn ≥ 20% HP_MAX, adaptive_source = ASH (ash_hit) và last5giữ ≤ 50 KB/run; mọi KPI 17/14 vẫn tính được
Q3 Trần gói2026-11-07 — 50 KB gzip/run (43 §15.2) thay 64 KB (50 §15)lấy số chặt hơn; ước tính §3.4 ≈ 32 KB
Q4 Tỉ lệ chọn hero (K22)2026-11-07 — 0.5×–2.0× của 1/N_mở, chỉ người đã mở ≥ 2 hero [ASSUMED]Bible/doc nền không có KPI chọn hero; cùng dải với K20
Q5 Sát thương nhận / phòng2026-11-07 — hoà giải lệch giữa doc nền: 17 "≤ 25% HP_MAX" áp CMB/CHL/RSC (K03); 15 "25–40%" áp phòng Cổng ELT/MBS (K04)2 doc nền ghi 2 dải cho cùng chỉ số; Cổng nguy hiểm hơn phòng chiến. Cần chủ doc 15 xác nhận
Q6 Đọc thẻ2026-11-07 — K24 Xanh ≤ 3.0 s (P5 Bible, 40 §11); 13 §16.3 "≤ 4 s" dùng làm ngưỡng ĐỏBible thắng doc nền
Q7 Cỡ mẫun ≥ 400 run/ô để quyết định (CI ±4.9 điểm); n ≥ 20 chỉ là chỉ báongưỡng ±5 điểm của K16 cần CI hẹp hơn ngưỡng
Q8 Hạng lỗiA/B/C/D §6.1; vi phạm INV tái hiện được = Abất biến là luật cứng của Bible
Q9 Boss & ĐÁP demo2026-11-07 — 09 Q6 "Boss 60–120 s" và 09 Q2 "< 25% → nới cửa sổ" hết hiệu lực: boss theo Bible §2 ±20% (K07); cửa sổ ĐÁP không phải nút (K11)09 là kế hoạch demo (lịch sử); Bible + 17 §11.2 thắng
Q10 Khảo sátSV01–SV07 chung mọi đợt PT; SV01/SV02 đo P7so sánh được giữa mốc
Q11 K30 phân bố tell chếtY ≤ 50 · P ≤ 35 · N ≤ 15% [ASSUMED]vùng N là sát thương phụ (≤ 4/tick), giết nhiều = khó đọc
Q12 Tần suất PT-B10 người/đợt, mỗi mốc lớn + mỗi hero mớiđủ phát hiện vấn đề đọc tell (≥ 2/10 lặp lại) với chi phí thấp
Q13 File lưu & vỏ telemetry2026-11-07 — AC lưu theo 43 §7.1–7.3 (meta_<steamId>.json 512 KB · run_active.json 256 KB · ash_profile_<steamId>.json 512 KB · settings_shared.json 32 KB; AC-SAV-04 phủ 7 luật xung đột); vỏ §3.2: content_version int (43 §11.3) + thêm content_hash string 8 hex (43 §16)đặc tả save cũ của 50 (profile.json 256 KB, content_version chuỗi) bị 43 thay; QA đo theo file canon để không đánh trượt build đúng
Q14 Hàng đợi telemetry, credits, K642026-11-07 — NDJSON local = local/telemetry_queue/<run_id>.ndjson (50 §15, 43 §7.1); CI thêm bước 9b credits_check (40 §5.7.1 / AT-08); K64 Đỏ > 1.500 (W 1499,5 sau phòng Hồi IV 32) thay > 1.538 gắn phòng Hồi IV 45 cũ1 đường dẫn cho cả 3 doc; số phòng Hồi IV đã đổi nên trần cũ hết hiệu lực