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).
Mục lục chi tiết (## và ###)
- 0. Phạm vi, thứ bậc, thuật ngữ
- 1. Chiến lược test theo mốc
- 1.1 Bảng cổng
- 1.2 Nhịp test liên tục
- 1.3 Ma trận phủ (cột = loại test, ô = bắt buộc ở mốc nào)
- 2. Giao thức playtest
- 2.1 Tổng các loại
- 2.2 PT-B — playtest ngoài có giám sát (kịch bản cố định)
- 2.3 PT-C — Steam Playtest kín (M7–M8)
- 2.4 PT-D — demo công khai + Next Fest (M9–M10)
- 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)
- 2.6 Test 5 s (P4, INV-09)
- 2.7 Test nhận hero 3 s (P6) · nghe mù tell (AT-01)
- 2.8 Lưu trữ & quyền riêng tư playtest
- 3. Danh mục sự kiện telemetry
- 3.1 Đường đi & luật chung
- 3.2 Vỏ chung (mọi sự kiện)
- 3.3 Danh mục (id · khi bắn · field riêng · nguồn luật)
- 3.4 Ngân sách dung lượng (1 run STANDARD 32:10, ước tính)
- 4. KPI & ngưỡng
- 4.1 Luật thống kê
- 4.2 KPI lõi chiến đấu & run (dashboard D1, D2)
- 4.3 KPI theo hero (D2; 1 dòng/hero, cột chung + rủi ro riêng)
- 4.4 KPI build & chọn (D5)
- 4.5 KPI chết & công bằng (D3)
- 4.6 KPI Tro Nhớ — tỉ lệ kích hoạt thích nghi (D4; số nguyên văn 14 §15)
- 4.7 KPI kinh tế & meta (D6)
- 4.8 KPI độ khó & mode (D7; 19 §8)
- 4.9 KPI demo & phát hành (D9; Roadmap §3.5–§3.6, giữ nguyên ngưỡng)
- 4.10 KPI kỹ thuật (D8, D10)
- 5. Dashboard cân bằng
- 5.1 Đường dữ liệu
- 5.2 Bộ dashboard
- 5.3 Ví dụ cảnh báo (VD-QA-2)
- 6. Phân loại & xử lý lỗi (triage)
- 6.1 Hạng lỗi
- 6.2 Trường bắt buộc của 1 báo lỗi
- 6.3 Luồng & SLA
- 6.4 Cổng theo số lỗi mở
- 7. Ma trận test hiệu năng
- 7.1 Máy & ngưỡng chung (Bible §10.4, 50 §5)
- 7.2 Kịch bản (P-xx) × máy
- 7.3 Cách đo & báo cáo
- 8. Kiểm tự động
- 8.1 CI (50 §16.3; máy build Windows tự host + 1 Steam Deck nối mạng)
- 8.2 Autopilot (Bladewake.Dev.Autopilot, 50 §18.2)
- 8.3 Giám sát bất biến runtime (Invariants, chạy trong Autopilot + build Dev)
- 9. 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
- 9.2 Phát hành (mỗi bản lên default) — 43 §11.4 (10 mục) + QA bổ sung
- 9.3 Khoá chất lượng demo (F−5, 43 §3.3)
- 9.4 Quyền riêng tư & đồng ý (43 §15)
- 9.5 Trợ năng & Thương Xót (Bible §4.3, meta.accessibility)
- 10. Tiêu chí nghiệm thu theo mảng tính năng
- 10.1 Combat lõi & tell (10, 11)
- 10.2 Hero (12, data/heroes, data/hero_upgrades)
- 10.3 Nâng cấp & build (13)
- 10.4 Tro Nhớ (14)
- 10.5 Director & encounter (15), run & bản đồ (16)
- 10.6 Kinh tế, meta, độ khó (17, 18, 19)
- 10.7 Hình, VFX, âm thanh (30, 31, 32)
- 10.8 UI/HUD, loc, truyện/codex (40, 20, 43 §12)
- 10.9 Lưu, dữ liệu, Steam, telemetry (50, 51, 43, doc này)
- Quy tắc cho dev/AI
- Quyết định đã chốt
20. Phạm vi, thứ bậc, thuật ngữ
| Mục | Luật |
|---|---|
| Thứ bậc | Bible + _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ằng | loạ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 |
| Build | Dev (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ỗi | A · B · C · D (§6.1). "Lỗi A" ở Roadmap/doc 43 = hạng A ở đây |
| Lát phân tích chuẩn | hero × 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 test | Loại test bắt buộc | Cổng thoát (tất cả Xanh) | Đỏ → hành động |
|---|---|---|---|---|
| P0 (M-1–M2) | parity lõi mới với demo H01 | EditMode TickMath/DamagePipeline/HitShapes/RngStreams/Data; replay Autopilot 10 run H01 | kill/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 effect | lệch > 5% → chặn MS01b, sửa lõi (trần 3 tháng, Roadmap §3.1) |
| MS01 (M0) | trang Steam, teaser | soát art đã duyệt + từ cấm trên mọi tài sản trang | 0 tài sản ngoài hub art style; 0 từ cấm | gỡ tài sản trước khi live |
| MS01b (M3) — cổng cứng | 250 quái trên Deck | P-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 atlas | sử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 + H02 | playtest ngoài có giám sát PT-B (§2.2) 10 người; Invariants 10 phút; smoke | P1–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) Demo | onboarding, Hồi I, meta lát, 3 hero | Steam 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 Fest | trung 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, DAILY | regression đầ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) Xanh | lùi EA theo Roadmap Q7 chỉ khi wishlist; lỗi A → không cắt build release/ms03-ea |
| MS03 (M13) EA | phát hành trả tiền | checklist phát hành §9.2; dashboard D1–D10 sống; vá theo §6.4 | 43 §11.4 đủ 10 mục; 2 tuần đầu: đánh giá ≥ 80%, hoàn tiền ≤ 8%, trung vị giờ chơi ≥ 4 h | lỗi A → vá ≤ 48 h hoặc lùi build |
| MS04 (M17) U1 | Hồi III, ENDLESS, H10/H04 | sim 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ước | KPI §4 không Đỏ 2 kỳ liên tiếp; 0 lỗi mất save | chặn cập nhật |
| MS05 (M21) U2 | Hồi IV, MRN11–MRN15, MUT01–MUT12, BOSS_RUSH | P-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) U3 | BS_FINAL, END_BELL_TOLL, gỡ cờ build | di trú gỡ cờ build (0 mất mở khoá); P-06 BS_FINAL | thờ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.0 | 12 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 h | 0 lỗi A; Verified duyệt; mọi KPI §4.2 theo hero Xanh trên dữ liệu EA | cut-line Bible §10.2 (không bao giờ dời hero) |
| MS08 / PORT (M35+) | hero 13+, port | sim 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 preset | dướ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ịp | Việc | Chủ | Đầu ra |
|---|---|---|---|
| mỗi PR | CI §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 đêm | Autopilot 12 hero (đã có ở build) × 1 run sim-only + build Dev/Playtest | CI | balance_nightly_<build>.csv + so với đêm trước |
| hằng tuần | Deck: P-01 + F10 10 phút; playtest nội bộ PT-A 60 phút; triage lỗi | QA + lead tech | bá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 dashboard | designer cân bằng | danh sách ngoại lệ + đề xuất 1 lớp nút/KPI |
| trước mỗi MS | sim 1.000 run/hero; regression đầy đủ; AT-01..AT-12 âm (32 §14); checklist §9 phù hợp | QA lead | biê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ảng | EditMode | PlayMode/Invariants | Autopilot sim | Playtest người | Hiệu năng | Thủ công (QA) |
|---|---|---|---|---|---|---|
| Combat lõi + tell | P0 | P0 | P0 | VS | MS01b | VS |
| Hero kit (12) | khi hero vào | khi hero vào | khi hero vào (1.000 run) | mốc của hero | khi hero có FX lớn (H05/H10/H11) | mốc của hero |
| Nâng cấp/build | P0 (hiệu ứng dữ liệu) | VS | MS02 | MS02 | — | MS02 |
| Tro Nhớ | P0 (AshMemory) | VS (INV-15) | MS02 | MS02 (khảo sát) | MS01b (MESO) | MS02 |
| Director/encounter | VS (wave_lint) | VS | VS | VS | MS01b | VS |
| Bản đồ/run | P0 (MapGen 10.000 seed) | VS | VS | VS | — | VS |
| Kinh tế/meta | VS | MS02 | MS02 (balance_calc.py hours) | MS02 | — | MS02 |
| Độ khó/mode | MS03 | MS03 | MS03 | MS03 | MS05 (mutator) | MS03 |
| UI/HUD/loc | VS (Loc) | MS02 (pseudo-loc) | MS02 (loc) | VS | — | MS02 |
| Âm thanh | — | — | — | VS (AT-01) | MS01b (AT-04) | mỗi MS |
| Lưu/cloud | P0 (Save) | VS | — | — | — | MS02 |
| Steam/Deck | — | — | MS03 (daily) | MS02 | MS01b | MS02 → MS07 |
42. Giao thức playtest
2.1 Tổng các loại
| Mã | Loại | Mốc | Người | Build | Telemetry | Thời lượng | Câu hỏi chính |
|---|---|---|---|---|---|---|---|
| PT-A | nội bộ hằng tuần | P0 → hậu 1.0 | đội (5) + 1 khách nội bộ luân phiên | Dev nightly | NDJSON local, gom tay | 60 phút/tuần | lỗi mới, cảm giác, nhịp phòng |
| PT-B | ngoà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ới | 10 người/đợt, 0 người đã chơi build trước | Playtest | bật (có thông báo) | 90 phút + 15 phút phỏng vấn | đọc tell, ĐÁP, onboarding, Tro Nhớ |
| PT-C | Steam Playtest kín | M7–M8 | ~500 [ASSUMED] | Playtest (AppID playtest) | bật kèm thông báo | tự do, 3 tuần | KPI demo, crash, Deck |
| PT-D | demo công khai + Next Fest | M9–M10 | công chúng | Demo | theo đồng ý 43 §15.1 | 4 tuần + tuần lễ | giờ chơi, % qua BS_B1, wishlist |
| PT-E | EA / cập nhật | M13 → MS07 | người mua | Release | theo đồng ý | liên tục | KPI §4 theo kỳ 2 tuần |
| PT-F | test chuyên đề | khi cần | 10 người/đợt | Playtest | bật | 30–45 phút | test 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ước | Phút | Việc | Đo |
|---|---|---|---|
| 0 | 0–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) | — |
| 1 | 5–20 | chơi từ boot, không hướng dẫn miệng; người quan sát chỉ ghi | giây tới phòng đầu, giây tới ĐÁP thành công đầu, số lần mở menu Trợ giúp |
| 2 | 20–80 | chơi tự do (run tiếp run) | telemetry đủ §3; người quan sát đánh dấu "bối rối" (giờ + lý do) |
| 3 | 80–90 | test 5 s (§2.6) + test nhận hero 3 s (§2.7) nếu ≥ 2 hero | đúng/sai |
| 4 | 90–105 | khả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èmbuild_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 QA | Ngưỡng |
|---|---|---|
| F−5 | khoá chất lượng demo §9.3 | 0 lỗi A, ≤ 5 lỗi B |
| F−4 → F−1 | demo công khai; dashboard D9 (phễu) + D10 (ổn định) mỗi ngày | crash ≤ 0.2/100 phiên |
| F | 2 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+1 | bá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 đồng | ghi 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)
| Id | Câu (VI; EN dịch theo loc) | Dạng | KPI |
|---|---|---|---|
| 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ắc | nhậ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ằng | thấ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
showcaselú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:
TelemetryServicenhận sự kiện từSimEventBuscuối frame (0 cấp phát,50§2.2) → NDJSON locallocal/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 buildPlaytest. - 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
nulltrừ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ăngschema_v.
3.2 Vỏ chung (mọi sự kiện)
| Field | Kiểu | Nghĩa |
|---|---|---|
ev | string | tên sự kiện (bảng §3.3) |
schema_v | int | phiên bản danh mục; bắt đầu 1 |
seq | int | số thứ tự trong phiên, tăng 1 |
t_utc | string ISO-8601 | giờ máy (chỉ để gom ngày) |
t_run_s | float | giây đồng hồ run (không tính tạm dừng, 43 §8.3); ngoài run = −1 |
telemetry_id | string UUID | ngẫu nhiên, settings_shared.json; không suy từ steamId |
session_id · run_id | string UUID | run_id rỗng ngoài run |
build_number | int | tăng đơn điệu toàn dự án (43 §11.3, 50 §16.1) |
content_version | int | phiên bản dữ liệu gameplay, cùng số trong khối đầu save + details[9] (43 §7.2, §11.3) |
content_hash | string 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) |
platform | enum PC_KBM PC_PAD DECK | thiết bị input cuối + cờ Deck |
flags | list | cheated · modded · bot · mercy · demo · playtest |
3.3 Danh mục (id · khi bắn · field riêng · nguồn luật)
| Sự kiện | Khi bắn | Field riêng | Nguồn |
|---|---|---|---|
session_start | sau màn đồng ý / mỗi lần mở game | branch, lang, is_deck, cpu_tier, gpu_tier, ram_tier (bậc thô 1–4), res, preset, perf_preset_auto | 43 §15.2 |
session_end | thoát sạch | dur_s, runs, crash_prev (0/1) | doc này |
consent_changed | đổi lựa chọn | telemetry (on/off), crash (always/ask/never) | 43 §15.2 |
settings_changed | đổi khoá trợ năng / Thương Xót | key, on (không giá trị remap) | 43 §15.2, 19 §8 |
run_start | RUN_START | mode, 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_lifetime | 16 §9.3, 19 §8 |
run_state | đổi trạng thái run | from, to, act, row, lane | 16 §0 |
| room_start | vào phòng có Director | act, node (CMB/ELT/CHL/EVT/SHP/RST/SEC/RSC/MBS/BOS/DOCK), objective, script_id, B_obj, density_mult, bias_hook, bias_s | 15 §14 |
room_end | rời phòng | t_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_n | 15 §14, 17 §11.1, demo 09 §3 |
beat | beat kịch bản spawn | script_id, row, pattern, n_req, n_placed | 15 §14 |
level_up | lên cấp | lv, xp_src{} | 17 §2 |
draft_offer | mở bảng thẻ | idx, act, lv, source[3], rarity[3], offered_ids[3] | 17 §11.1, 13 §16.2 |
draft_pick | chọn/bỏ | idx, picked_id hoặc skip, rerolls_used, banished_id, kept_id, time_to_pick_s, auto_picked | 13 §16.2 |
resonance | đạt bậc Cộng Hưởng / EVO / Then Chốt | id, tier, t_s | 13 §16.2 |
relic_gain | nhận Relic | id, affix, source (ELT/MBS/SEC/SHP/overflow) | 16 §9.3 |
shop_purchase | mua ở Sạp Rong/DOCK | node, item_id, price, gold_after | 17 §11.1 |
event_choice | chọn ở EVT | evt_id, choice, cost, reward | 16 |
rest_choice | chọn ở RST | choice (heal/upgrade/uncurse) | 16 |
elite_kill | Tinh Anh chết | enemy_id, em[], dmg_time_s, fight_time_s, cv_id | 17 §11.1 |
boss_phase | boss/mini đổi pha + kết | boss_id, phase, hp_pct, t_s, result (lúc kết) | 17 §11.1 |
ult_cast | Ult | ult_id, gauge_fill_s, targets_hit | 17 §11.1 |
answer | ĐÁP/Né Hoàn Hảo với đòn từ M/L/XL | attack_id, verb (answer/pdodge), ok, dt_s (lệch so với va chạm) | 17 §11.1 |
| hit_taken | trúng đòn từ M/L/XL hoặc ≥ 20% HP_MAX | attack_id, src_id, tell (Y/P/N), adaptive_source (BASE/ASH), cv_id, feint 0/1, dmg_pct | 14 §15 (ash_hit), 17 |
hero_died | hero chết | last5[{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_end | kết run | result, 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_s | 16 §9.3, 19 §8, 13 §16.2 |
meta_gain · meta_spend | nhận/tiêu tiền meta | cur (CUR_*), amount, source/sink | 17 §10 |
unlock | mở hero/trạm/mode/Khăn Tang | unlock_id, playtime_h | 18 |
milestone | đạt mốc giờ chơi 17 §10.3 | key (vd Hồi Chuông END_BELL_TOLL), playtime_h, runs | 17 §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_settings | như 14 §15 | field nguyên văn 14 §15 | 14 §15 |
heat_guard | guard công bằng chặn 1 hiệu ứng Khăn Tang/mutator/Ấn | effect_id, guard (INV-xx) | 19 Quy tắc |
perf_tier | đổi bậc Director/VFX | room, tier, alive, fx_active, p95_ms | 15 §14, 50 §4.5 |
perf_room | cuối mỗi phòng | p50_ms, p95_ms, p99_ms, cpu_ms_p95, alive_max, fx_max, voices_max, ram_mb, gc_bytes | 50 §15 |
ui_screen · ui_draft · ui_setting · ui_hint · ui_ash_inspect | như 40 §11 | field 40 §11 | 40 §11 |
survey_answer | trả lời khảo sát §2.5 | q (SV01..SV07), a | doc này |
demo_end_screen | màn kết demo | wishlist_clicked | 43 §3.2 |
bug_report | phím "Báo lỗi" | report_id, has_shot | 43 §15.3 |
crash | lần mở sau crash (theo đồng ý) | sig (chữ ký stack), log_tail 2.000 dòng, last_events 30 | 43 §15.3, 50 §15 |
3.4 Ngân sách dung lượng (1 run STANDARD 32:10, ước tính)
| Nhóm | Số dòng | Byte/dòng thô | Tổng thô |
|---|---|---|---|
room_start + room_end (24 phòng) | 48 | 900 | 43 KB |
draft_offer + draft_pick (26) | 52 | 260 | 14 KB |
answer + hit_taken (M/L/XL, ~120) | 120 | 180 | 22 KB |
ash_* (~60) | 60 | 300 | 18 KB |
| còn lại (run, level, shop, perf, ui) | ~150 | 200 | 30 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ùngcontent_versionchí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út17§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 heroestrước khi đổi.
4.2 KPI lõi chiến đấu & run (dashboard D1, D2)
| Id | KPI | Cách tính (sự kiện) | Xanh | Đỏ | Nút khi Đỏ (thứ tự) | Nguồn |
|---|---|---|---|---|---|---|
| K01 | Kill/phút phòng chiến | trung vị room_end.kpm ở CMB/CHL/RSC | trung vị 180, mọi Hồi ≥ 120 từ phút 3 | < 120 ở bất kỳ Hồi | B_room, BPS_act, MIX (15) → HP quái k_hp | P2, 17 §11.1 |
| K02 | Quái sống đỉnh phòng | p50 room_end.max_alive | 150–250 | < 150 hoặc chạm trần 250 > 30% phòng | B_room, density_mult | Bible §1, 15 §14 |
| K03 | Sát thương nhận / phòng chiến | trung 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) |
| K04 | HP mất / phòng Cổng (ELT/MBS) | trung vị room_end.hp_lost_pct | 25–40% | > 50% hoặc < 15% | HP/dmg M/L | 15 §14 (Q5) |
| K05 | TTK Tinh Anh | trung vị elite_kill.dmg_time_s · fight_time_s | 8–15 s · 25–45 s | ngoài dải ±20% | k_hp, UPTIME | 17 §11.1, Q8 |
| K06 | Trận mini-boss | trung vị boss_phase kết, MB_* | 40–60 s | < 32 hoặc > 72 s | HP M/L (PI_gate) | 17 §11.1 |
| K07 | Trận boss | trung vị trận | BS_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_boss | Bible §2, 17 §11.1 |
| K08 | Độ dài run (thắng, STANDARD) | trung vị run_end.t_run_s | 26:00–35:00, trung vị 32:10 ± 60 s | < 24:00 hoặc > 38:00 | nhịp phòng (15), số phòng/đường (16) | Bible §2 |
| K09 | Thời gian từng Hồi | trung 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 s | như K08 | Bible §2 |
| K10 | Draft · cấp cuối | run_end.drafts, level | 26 ± 2 · 18 ± 1 | ngoài ± 4 · ± 2 | XP lên cấp kế CRV_xp_level | 17 Q3 |
| K11 | ĐÁP + Né Hoàn Hảo thành công | Σans_ok+pd_ok / Σans_tot+pd_tot | 40–60% | < 30% hoặc > 75% | KHÔNG chỉnh cửa sổ; soát tell/khả đọc (doc 11) → mật độ quanh tell | P3, 17 §11.1 |
| K12 | Trúng đòn tím | Σhits_by_tell.P / Σp_tells_aimed | < 30% | ≥ 35% | soát CV dồn P (14 VD3), token tím, hazard | P3/P7, 17 |
| K13 | Ult | trung vị ult_cast.gauge_fill_s ở Lv10 | 45–60 s; lệch hero ≤ ±10% | > ±15% | Dư Âm (vong_gain) hero | 17 §11.1 |
| K14 | Input → hit | đo PlayMode (khung đầu động tác) + camera tốc cao | ≤ 0.12 s | > 0.12 s | code (không cân bằng) | P1 |
| K15 | Chết bởi 1 đòn | hero_died.one_shot / tổng chết | ≤ 15% | > 20% | dmg_pct của top_source | 17 §11.1 |
| K16 | Thắng theo hero (Độ Tang 0) | run_end.result | ± 5 điểm quanh trung vị roster | ngoài ± 5 điểm 2 kỳ (VD-QA-1) | nút lớp 4 hero | 17 §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%.
| Hero | Mốc | ĐÁP (cửa sổ gốc) | Verb giữ | KPI rủi ro riêng | Xanh |
|---|---|---|---|---|---|
| H01 Varek | MS02 | Gạt 0.16 s | Thủ (chặn trước 180°) | Vỡ Thế / run | ≤ 3 (demo Q4) |
| H02 Bodan | MS02 | Chặn Nắp 0.18 s | Dựng Quan | INV-01e (vô sắc) test 5 s trên B2/B4 | ≥ 90% chỉ đúng hero |
| H07 Veyra | MS02 | Bắn Ngắt 0.16 s | Lùi Lắp | tỉ lệ kéo đạt mốc 1 / lần giữ | 40–70% [ASSUMED] |
| H03 Halka | MS03 | Gõ Chuông 0.16 s | Nhảy Sào | chết khi đang Nhảy Sào (bất tử 0.35 s) | 0 (lỗi A nếu > 0) |
| H06 Ruvan | MS03 | Bắt Đòn 0.15 s | Hấp Nhiệt | % thời gian đứng giữ / phòng | ≤ 35% [ASSUMED] |
| H10 Ingra | MS04 | Màn Khói 0.18 s | Hoá Khói | K12 riêng khi trong Khói | < 30% |
| H04 Sậu | MS04 | Khép Compa 0.15 s | Kẻ Vòng | test 5 s vạch phấn giữa 250 quái (P-05) | ≥ 80% |
| H11 Wenna | MS05 | Hất Đất 0.15 s | Cắm Xẻng | CPU ms với 3 hố (P-04) | ≤ 10 ms |
| H08 Dov | MS05 | Nổ Chặn 0.15 s | Tì Báng Nạp | K15 khi đang nạp | ≤ 15% |
| H09 Kessa | MS06 | Quăng Vòng Xu 0.16 s | Lưới Xu | K01 (ném bó) | ≤ 1.3 × trung vị roster |
| H05 Oska | MS06 | Quay Chắn 0.16 s | Quỹ Đạo | K01 (hút cụm) + FX sàn lớn P-01 | ≤ 1.3 × trung vị; p95 ≤ 16.6 ms |
| H12 Ambrin | MS07 | Thổi Dội 0.16 s | Nố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)
| Id | KPI | Cách tính | Xanh | Đỏ | Nút | Nguồn |
|---|---|---|---|---|---|---|
| K20 | Tỉ lệ chọn Edge khi được chào | draft_pick / draft_offer theo id | 8–45% và 0.5×–2.0× trung vị cùng rarity | < 8% hoặc > 45% 2 kỳ | buff/nerf hàng; đổi luật | 13 §16.3, 17 §11.1 |
| K21 | Cộng Hưởng II ≥ 1 | run MR01 có resonance.tier ≥ 2 | ≥ 30% | < 25% | draft.completer 0.35 → 0.45 | Bible, 13 §16.3 |
| K22 | Tỉ lệ chọn hero | run của hero / run của người đã mở ≥ 2 hero | mỗ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 meta | doc này (Q4) |
| K23 | Hướng build | thắ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ống | Edge lõi của hướng | P5, 13 §16.3 |
| K24 | Thời gian chọn thẻ | trung vị ui_draft.time_s ở draft thứ 10+ | ≤ 3.0 s | > 4.0 s | rút chữ thẻ (mẫu {param}) | P5, 40 §11 (Q6) |
| K25 | Tự chọn · bỏ qua draft | auto_picked · skip | ≤ 5% · ≤ 8% | > 8% · > 12% | lọc pool | 13 §16.3 |
| K26 | Chạm caps.more_dmg | run_end.caps_hit | ≤ 10% run | > 10% | hạ MORE hàng hay gặp | 13 §16.3 |
4.5 KPI chết & công bằng (D3)
| Id | KPI | Cách tính | Xanh | Đỏ | Hành động |
|---|---|---|---|---|---|
| K30 | Nguồn chết theo tell | hero_died.killing_blow.tell | Y ≤ 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 |
| K31 | Tập trung đòn kết liễu | phầ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) |
| K32 | Chế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 last5 | tell rỗng | 0 | > 0 | lỗi A (INV-02/04) |
| K34 | Vi phạm INV runtime | Invariants PlayMode + heat_guard | 0 vi phạm · heat_guard chỉ ở log | ≥ 1 vi phạm | lỗi A; heat_guard > 1%/run → soát hiệu ứng gây |
| K35 | Ấn Tinh Anh | em_deaths/em_seen mỗi EM | ≤ 1.5 × trung vị 16 Ấn | > 1.5× | số Ấn (19 §8) |
| K36 | Mutator | tỉ 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)
| Id | KPI | Cách tính | Xanh | Hành động khi trượt |
|---|---|---|---|---|
| K40 | Nhận ra Tro Nhớ | SV01 = Có | ≥ 60% | tăng nổi bật callout/◆, thêm bark |
| K41 | Thấy bất công | SV02 ∈ {1,2} | ≤ 15% | cap_tier −0.05 / thr_on +0.05 |
| K42 | Tỉ lệ CV bật / run | run 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 ≤ ×2 | refit hero_baseline trục đó = trung vị hero |
| K43 | Cùng 1 cv_id / hero | run hero có cv_id đó / run hero | ≤ 50% | như K42 |
| K44 | Chênh thắng boss có CV vs không | ash_fight | ≤ 10 điểm % | giảm cap boss hoặc bỏ CV gây chênh |
| K45 | Chênh sát thương nhận/phút khi CV bật | ash_fight.dmg_taken_per_min | ≤ +15% | như K44 |
| K46 | Chết có ≥ 1 nguồn CV | ash_death | ≤ 25% | soát answers, tăng recover_add_s |
| K47 | Nhịp lừa | sát thương đòn feint = 1 / cùng đòn không lừa | ≤ ×1.5 | giảm windup_hold_s.hi |
| K48 | Tắt nhớ xuyên run | game.cross_run_memory = off (khoá 42 §8, ghi qua ash_settings) | ≤ 10% người | rà Sổ Thù |
| K49 | Mở xem Tro Nhớ | người mở AshInspect ≥ 1 lần / 5 run đầu | ≥ 60% | gợi ý ui_hint |
| K50 | Chặn ngân sách | ash_budget_block / ash_cv_on | theo 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)
| Id | KPI | Xanh | Đỏ | Nguồn |
|---|---|---|---|---|
| K60 | Vàng Mã thu / run · số món mua | 500–700 · 3–5 | ngoài ±15% | 17 Q14 |
| K61 | Tro Hồn TB / run (mọi người chơi) | ~850 | ngoài ±20% | Bible, 17 §11.1 |
| K62 | Giờ tới mốc | trong ±20% bảng 17 §10.3 | ngoài ±30% | milestone |
| K63 | Mố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 h | ngoài dải 2 kỳ | Bible §3.8 |
| K64 | Run 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)
| Id | KPI | Xanh |
|---|---|---|
| K70 | Thắng Độ Tang 0 sau END_BELL_TOLL | 35–45% [ASSUMED] |
| K71 | Mỗi +4 Độ Tang | thắng giảm 5–8 điểm % |
| K72 | Thử Độ Tang ≥ 4 trong 5 run sau END_BELL_TOLL | ≥ 25% người |
| K73 | DAILY | ≥ 20% người mở DAILY chơi ≥ 3 ngày/tuần |
| K74 | Thương Xót theo preset | chỉ 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)
| Id | KPI | Đỏ | Xanh | Rất tốt |
|---|---|---|---|---|
| K80 | Trung 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] | — |
| K83 | Wishlist thêm trong tuần Next Fest | < 2k | ≥ 10k [ASSUMED] | — |
| K84 | Crash / 100 phiên | > 1 | ≤ 0.2 | — |
| K85 | Đánh giá tích cực (EA 2 tuần) | < 70% | ≥ 80% | ≥ 90% [ASSUMED] |
| K86 | Hoàn tiền (EA) | > 12% | ≤ 8% | ≤ 5% [ASSUMED] |
| K87 | Trung vị giờ chơi EA | < 2 h | ≥ 4 h | ≥ 8 h [ASSUMED] |
| K88 | Bấm Wishlist ở màn kết demo | < 10% [ASSUMED] | ≥ 25% [ASSUMED] | — |
| K89 | Phễu onboarding demo | boot → phòng 1 < 90% · phòng 1 → BS_B1 < 30% | ≥ 95% · ≥ 45% [ASSUMED] | — |
4.10 KPI kỹ thuật (D8, D10)
| Id | KPI | Xanh | Đỏ |
|---|---|---|---|
| K90 | p95 khung (Deck, perf_room) | ≤ 16.6 ms ở ≥ 95% phòng | > 16.6 ms ở > 10% phòng |
| K91 | perf_tier ≥ 2 | ≤ 5% phòng | > 15% phòng |
| K92 | Preset 180 tự bật (fps < 50 trong 10 s) | ≤ 10% phiên Deck | > 25% |
| K93 | Crash / 100 phiên | ≤ 0.2 | > 1 (lỗi A) |
| K94 | Mất/hỏng save | 0 | ≥ 1 báo cáo (lỗi A) |
| K95 | Hub → 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
- 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. - Lọc §0 (bỏ
cheated/modded/bot, saicontent_version, run < 60 s) → bảngruns,rooms,drafts,deaths,ash,perf,ui. - 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%.
- Sim Autopilot (
balancemode) đổ cùng định dạng, cờbot = true, xem ở tab "Sim" riêng — không trộn với người thật. - 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ên | Widget (trục) | Lát mặc định | Cảnh báo tự động |
|---|---|---|---|---|
| D1 | Sức khoẻ run | K08/K09 hộp-râu theo Hồi; K01 đường theo phút run; K02 histogram; K10 | mode STANDARD, Độ Tang 0, 14 ngày | K01 < 120 ở bất kỳ Hồi; K08 ngoài 26–35 phút |
| D2 | Ma trận hero | bả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" |
| D3 | Chết & công bằng | top 20 attack_id theo phần chết (K31), cột tell Y/P/N, one_shot, ASH/BASE; K30 thanh chồng; K32 | Hồi, hero | K33 > 0; K15 > 20%; K31 > 4.0× |
| D4 | Tro Nhớ | K42 theo hero (cột), K43 top 10 cv_id, K44/K45 so cặp, K46, SV01/SV02 | ash_level ≥ 1, bỏ DAILY/BOSS_RUSH | K41 > 15%; K42 max/min > ×2 |
| D5 | Build | K20 phân tán tỉ lệ chọn theo rarity (điểm = Edge), K21, K23 hướng build, K24/K25 | hero, MR | Edge ngoài 8–45% 2 kỳ |
| D6 | Kinh 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ơi | K60/K61 ngoài dải |
| D7 | Độ khó & mode | thắng theo Độ Tang (đường, K71); K35 theo EM; K36 theo MUT; DAILY giữ chân K73 | sau END_BELL_TOLL | K35/K36 Đỏ |
| D8 | Hiệu năng | p95 theo nền tảng × biome × hero; perf_tier theo phòng; RAM; preset 180 tự bật | DECK | K90/K91/K92 Đỏ |
| D9 | Phễu & demo | boot → phòng 1 → R6 → BS_B1 → run 2 → demo_end_screen.wishlist_clicked; K80–K83 | build Demo | K80 < 20 phút sau 3 ngày |
| D10 | Ổn định | crash theo sig × build; bug_report theo màn; K93/K94 | 7 ngày | crash > 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_shot0 → 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ặn | crash/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 build | crash > 1/100 phiên; Lướt không i-frame frame 0; telemetry gửi khi "Không" |
| B — nặng | sai 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ữ đã ship | Edge cộng sai hạng; thẻ ghi 20% nhưng áp 15% |
| C — vừa | lỗ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ất | 1 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ước | Ai | Thời hạn |
|---|---|---|
| Nhận → xếp hạng + gán chủ | QA trực | A: ≤ 4 h giờ làm · B: ≤ 1 ngày · C/D: họp triage tuần |
| Sửa | chủ (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ại | QA (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ề main | chủ | 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 builddefault. 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ằngrun.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.pynế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ổng | A | B | C |
|---|---|---|---|
Merge vào main | 0 mới do PR | — | — |
| Demo khoá chất lượng (F−5) | 0 | ≤ 5 | khô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 default | 0 | khô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áy | Ngưỡng khung | CPU main | Khá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 ms | hạ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ản | Cách chạy | Deck | Desktop min | Mốc đầu |
|---|---|---|---|---|---|
| P-01 | Lát Chịu Tải: 250 × EN_B1_01/02/06 + H01 Ult + 1 Tinh Anh + MESO | scene MS01b, Autopilot stress, 10 phút × 3 lần | ngưỡng §7.1 cả 3 lần | như Deck | MS01b |
| P-02 | Stress F10: run thật + 150 quái thêm | Autopilot + F10, 10 phút, hằng tuần | p95 ≤ 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–B4 | run.goto + mrn.set MRN02 <max> | ngưỡng §7.1 | ngưỡng §7.1 | theo biome |
| P-04 | H11: 250 quái + 3 hố (flow field dựng lại) | hero H11, Autopilot HOLD | CPU ≤ 10 ms; dựng flow field ≤ 1.0 ms/lần [ASSUMED] | — | MS05 |
| P-05 | H04 Kẻ Vòng + H05 Quỹ Đạo + H10 vùng Khói (FX sàn lớn) giữa 250 quái | Autopilot AOE | GPU ≤ 10 ms; hạt ≤ 1.050 | — | MS04/MS06 |
| P-06 | Boss nặng: BS_FINAL P2 (3 bóng) + sân rỉ ≥ 6 quái S/20 s; BS_TRUE P2 | run.goto Kết/B6 | ngưỡng §7.1 | ngưỡng §7.1 | MS06/MS07 |
| P-07 | Soak 2 giờ (run nối run, hub giữa) | Autopilot soak | RAM tăng ≤ 50 MB; 0 crash; p95 không trôi > 5% | như Deck | MS02 |
| P-08 | Tả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-09 | Hạ cấp dưới tải | perf.tier 0→3, vfx.lod 0→3 | khô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ư Deck | MS01b |
| P-10 | Preset 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 MS01b | AT-04 32 §14 | 32 §6.5 đạt hết; input → onset âm p95 ≤ 40 ms (AT-11) | AT-11 | MS01b |
| P-12 | Pin Deck | 1 run 32 phút ở 60 fps | ≥ 2 h pin ước tính [ASSUMED] | — | MS07 |
| P-13 | Suspend/resume | 10 lần suspend giữa trận boss | 0 lỗi; khung cuối hiện lại ≤ 2 s | — | MS02 |
| P-14 | DAILY tất định | Autopilot daily 30 seed | CRC 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) +ProfilerMarkermỗi hệ (overlay F3 PERF); xuấtperf_<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ỉ
HeavyBrain0.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ịp | Bước | Lệnh / bộ | Đạt |
|---|---|---|---|
| mỗi PR | 1 Kiểm dữ liệu | py -3 GDD/Full/tools/validate.py --all --banned-terms <thư mục ngoài repo> | 0 ERROR (WARN được, ghi trong PR) |
| mỗi PR | 2 Từ cấm toàn repo | quét từ cấm trên GDD/, Assets/, loc, tên file (cùng danh sách --banned-terms) | 0 trúng |
| mỗi PR | 3 Render | py -3 GDD/Full/tools/build_gdd.py --only csv rồi so lệch với _unity/ đã commit | 0 lệch ngoài lệch do PR; không sửa tay bản render |
| mỗi PR | 4 Cân bằng | py -3 GDD/Full/tools/balance_calc.py --selftest (gồm --check-data) | exit 0 |
| mỗi PR | 5 Lint nội dung | ash_lint + fairness_lint (14 §12), wave_lint (15), audio_lint.py (AT-03), art-style lint khi chạm hub | 0 lỗi |
| mỗi PR | 6 Sync + Bake + biên dịch | batchmode | 0 lỗi biên dịch |
| mỗi PR | 7 EditMode | TickMath, DamagePipeline, HitShapes, RngStreams, MapGen, AshMemory, Save, Data, Loc (50 §18.1) | 100% xanh |
| mỗi PR | 8 PlayMode smoke | boot → hub → run → 1 phòng → chết → recap → hub, Autopilot H01 | < 3 phút, 0 exception |
| mỗi PR | 9 Grep cấm | Keyboard.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/UI | 0 trúng |
| mỗi PR | 9b credits_check | doc 40 §5.7.1 / AT-08 | 0 thiếu |
| mỗi đêm | 10 Build Dev + Playtest | BuildPipeline.Run -profile Dev|Playtest | build xanh; kích thước ≤ 4 GB |
| mỗi đêm | 11 Autopilot cân bằng | 12 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 đêm | 12 Invariants | PlayMode 10 phút Autopilot | 0 vi phạm INV-02/03/08/11/12/14/15 |
| hằng tuần | 13 Hiệu năng Deck | P-01 + P-02 | §7 |
| hằng tuần | 14 Loc | Autopilot loc (pseudo-loc xx-PS +35%), chụp mọi màn | 0 tràn, 0 khoá thiếu, {param} khớp |
| trước MS | 15 Sim cân bằng | Autopilot 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 |
| release | 16 | build Release/Demo · di trú mọi schema save đã ship (≥ 20 file mẫu) · smoke Deck tay 30 phút · validate.py --all --strict | 0 lỗi; WARN = lỗi |
8.2 Autopilot (Bladewake.Dev.Autopilot, 50 §18.2)
- Chỉ chơi qua
InputFrametừ những gì người chơi thấy (không đọc sim nội bộ);BotProfilemỗi hero × lốiDEFLECTDASHHOLDAOERANGEDMASH(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ốiDEFLECT85% (demo09§5) dùng cho clip, không dùng cho số cân bằng.
| Chế độ | Dùng cho | Đầu ra | Đạt |
|---|---|---|---|
showcase | clip marketing, khung test 5 s | video 1920×1080 + 1080×1920 | không UI debug trong khung |
balance | sim KPI | NDJSON cờ bot → CSV | ≥ 20× thời gian thực [ASSUMED] |
stress | P-01/P-02 | perf_*.csv | §7 |
soak | P-07 | RAM theo phút | tăng ≤ 50 MB / 2 h |
daily | P-14 | CRC nội dung 30 seed | Windows = Deck |
loc | pseudo-loc | ảnh mọi màn | 0 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)
| INV | Kiểm | Ngưỡng |
|---|---|---|
| 02 | mọ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% |
| 03 | windup ≥ 0.30 s (≥ 0.45 s M/L/XL), khe chuỗi ≥ 0.35 s, sau mọi hệ số Khăn Tang/mutator/Ấn | 0 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ổng | 0 vi phạm |
| 11 | cửa sổ ĐÁP ≥ 0.14 s (9 tick); ĐÁP 360° | 0 vi phạm |
| 12 | i-frame Lướt ≥ 12 tick từ frame 0 | 0 vi phạm |
| 14 | spawn ngoài r90, ấn 0.6 s, không windup 0.8 s đầu | 0 vi phạm |
| 15 | dị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 |
| 17 | tốc đi quái cuối ≤ tốc chạy cơ bản hero / 1.1 | 0 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óm | Hạng mục | Cách kiểm (QA) | Đạt |
|---|---|---|---|---|
| DV01 | Input | 100% game bằng tay cầm, kể cả màn đồng ý, cài đặt, khởi động lần đầu | rút chuột/bàn phím, đi hết cây menu từ cài mới | 0 màn kẹt |
| DV02 | Input | glyph Deck đúng | chụp mọi màn có nhắc nút ở 1280×800 | 0 glyph bàn phím/ABXY |
| DV03 | Input | nhập chữ qua bàn phím ảo | CUSTOM seed + tên preset remap | bàn phím ảo hiện, nhập được |
| DV04 | Input | mất tay cầm giữa run | tắt tay cầm ngoài | tự tạm dừng + "Kết nối lại tay cầm" |
| DV05 | Hiển thị | độ phân giải mặc định | cài mới trên Deck | 1280×800; render 427×267 ×3, cắt 1 px |
| DV06 | Hiển thị | chữ đọc được | đo trên ảnh chụp | chữ nhỏ nhất ≥ 12 px cao (cả CJK), chữ thân ≥ 16 px; ui_text_scale_min 1.25 |
| DV07 | Hiể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 |
| DV08 | Liền mạch | không launcher/tài khoản ngoài/chống gian lận cài thêm | khởi động lạnh | thẳng vào title ≤ 15 s |
| DV09 | Hệ thống | suspend/resume | P-13 | 10/10 không lỗi |
| DV10 | Hiệu năng | mặc định mượt | P-01 trên Deck | 60 fps, p95 ≤ 16.6 ms, CPU ≤ 10 ms; hạt ≤ 1.050; preset 180 tự bật đúng |
| DV11 | Hiệu năng | pin | P-12; tuỳ chọn trần fps 30/40/45/60 hoạt động | ≥ 2 h [ASSUMED] |
| DV12 | Âm | loa trong | preset SN_SMALL_SPEAKER tự bật; nghe tell ở 30% âm lượng | AT-10 đạt |
| DV13 | Lưu | cloud PC ↔ Deck | chơi máy A → máy B | luậ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ào43§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 |
|---|---|---|
| RL01 | validate.py --all --strict + EditMode + PlayMode + Invariants | 0 ERROR, 0 WARN, 0 vi phạm |
| RL02 | di trú save từ 2 bản default trước (demo không migrate, Roadmap Q8) | 0 lỗi / ≥ 20 file mẫu |
| RL03 | P-01 Deck | 60 fps, p95 ≤ 16.6 ms |
| RL04 | smoke Deck 30 phút tay cầm (hub → Hồi I → boss) | 0 lỗi A |
| RL05 | thành tựu/stats trên rc bằng tài khoản test, reset sau test | mỗi thành tựu mới mở đúng 1 lần |
| RL06 | nộp điểm vào bảng DEV_* qua máy chủ thật | đi hết 6 bước 43 §6.3 |
| RL07 | cloud máy A → máy B (PC + Deck) | 43 §7.3 |
| RL08 | loc 100% chuỗi các ngôn ngữ đã ship, pseudo-loc không tràn | 0 chuỗi thiếu |
| RL09 | ghi chú cập nhật VI + EN | có trước khi đẩy |
| RL10 | giờ đẩy thứ Ba–thứ Năm 16:00–18:00 UTC (trừ vá nóng) | — |
| RL11 | build report: không assembly Bladewake.Dev, không phím debug, không SDK quảng cáo/IAP/analytics di động | 0 |
| RL12 | đồng ý telemetry: chọn "Không" → 0 gói gửi (bắt mạng 1 run) | 0 byte tới endpoint telemetry |
| RL13 | quét từ cấm trên build cuối (chuỗi loc + tên file + metadata) | 0 trúng |
| RL14 | content_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 |
|---|---|---|
| DM01 | 100% demo bằng tay cầm (DV01–DV04) | đạt |
| DM02 | Deck: P-01 60 fps; chữ đọc được 1280×800 | đạt |
| DM03 | mà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) |
| DM04 | lỗi mở | 0 A, ≤ 5 B |
| DM05 | EN + VI 100% chuỗi, không chuỗi debug | đạt |
| DM06 | nút Wishlist ở màn kết demo hoạt động có/không overlay | đạt; bắn demo_end_screen |
| DM07 | trần nội dung ở BS_B1: hạ xong → màn "còn tiếp ở EA"; save demo tách khỏi EA | đạt |
| DM08 | cờ 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 |
| DM09 | Tro 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 |
|---|---|---|
| PV01 | mặc định "chưa chọn" ở lần chạy đầu; crash mặc định "Hỏi mỗi lần" | đạt |
| PV02 | khô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 |
| PV04 | log crash đã xoá đường dẫn người dùng/tên máy | 0 trúng |
| PV05 | leaderboard: 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 |
|---|---|---|
| AX01 | tell mù màu ◇/▲/chấm thay đổi đúng trên mọi biome | test 5 s bản mù màu ≥ 80% |
| AX02 | âm tell theo vị trí | AT-01 đạt khi bật |
| AX03 | remap toàn bộ + preset 1 tay; giữ/bật verb giữ | chơi hết Hồi I bằng preset 1 tay |
| AX04 | Thươ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 |
| AX05 | preset 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)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-CMB-01 | input → 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-02 | input → hit ≤ 0.12 s (P1) | camera tốc cao / PlayMode |
| AC-CMB-03 | ví dụ tính 10 §3.6 tái tạo đúng từng số | EditMode DamagePipeline |
| AC-CMB-04 | cú trúng: hitstop, chớp trắng 0.07 s, knockback theo mass_class, SFX (INV-10) | quay khung + log |
| AC-CMB-05 | 0 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-02 | Lướ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-03 | gó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-04 | trạ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ái | ma trận trạng thái × 12 hero |
10.2 Hero (12, data/heroes, data/hero_upgrades)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-HER-01 | kit đủ 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-02 | V ∈ [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ý do | balance_calc.py heroes |
| AC-HER-03 | 1 verb ĐÁP + 1 verb giữ riêng, cửa sổ gốc đúng _bible.json.heroes[].answer_window; nút theo Bible §1.1 | Sân Tập |
| AC-HER-04 | slot 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-05 | test 5 s (§2.6) + nhận hero 3 s ≥ 80% (§2.7) | PT-F |
| AC-HER-06 | Autopilot dùng đủ hành động hero (§8.2); sim 1.000 run: K11/K13/K16 Xanh | sim trước mốc |
10.3 Nâng cấp & build (13)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-UPG-01 | mọi Edge/Relic/RS/EVO/kỹ năng = 1 hàng dữ liệu, 0 code riêng ngoài hook; AllPrimitivesHaveHandler | EditMode Data |
| AC-UPG-02 | chữ 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-03 | số quyết định/run 45 ± 4, draft 26 ± 2 (13 §16.1) | sim |
| AC-UPG-04 | giá trị thẻ theo rarity trong dải 17 §4.4 ±20% | sim |
10.4 Tro Nhớ (14)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-ASH-01 | mọi đòn địch có adaptive_source BASE/ASH; đòn ASH có default trung tính + hàng CV qua ash_lint + fairness_lint | CI bước 5 |
| AC-ASH-02 | INV-15 runtime 0 vi phạm (§8.3) ở Khăn Tang max và MRN04 | Invariants + ash.force từng CV |
| AC-ASH-03 | mỗ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 tick | ash.trace on |
| AC-ASH-04 | tắt 60 s đầu run (MRN13: 30 s), 3 run đầu đời, Thương Xót Tro Nhớ 0, CUSTOM cấp 0 | PlayMode |
| AC-ASH-05 | ví dụ 14 §13 (7 hàng) tái tạo; §7.2 → 0.72 | EditMode AshMemory |
| AC-ASH-06 | K40 ≥ 60%, K41 ≤ 15% ở PT-B/PT-C | khảo sát |
10.5 Director & encounter (15), run & bản đồ (16)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-DIR-01 | mọi spawn qua SpawnPlanner.Place; ngoài r90, ấn 0.6 s, không windup 0.8 s (INV-14) | Invariants |
| AC-DIR-02 | trần sống 250 (Deck preset 180) cứng; K01 ≥ 120, K02 150–250 | sim + P-03 |
| AC-DIR-03 | 10 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-01 | mọ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 seed | EditMode MapGen |
| AC-RUN-02 | seed 0x5A17C3E1 ra bản đồ Hồi I = ví dụ 16; cùng seed + content_version → cùng bản đồ/thưởng/sạp | EditMode + daily |
| AC-RUN-03 | lưu giữa nút; thoát giữa run → tiếp đúng nút | PlayMode + save.dump |
| AC-RUN-04 | K08/K09 trong dải | sim + PT |
10.6 Kinh tế, meta, độ khó (17, 18, 19)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-ECO-01 | balance_calc.py --selftest 0 lỗi; số tuning.json/curves.json/currencies.json khớp hằng calc | CI bước 4 |
| AC-ECO-02 | K60 Vàng Mã 500–700 (kỳ vọng 679.4); K61 Tro Hồn ~850 | sim |
| AC-ECO-03 | không nguồn/đích tiền ngoài 17 §8/§10 | soát meta_gain/meta_spend theo source |
| AC-MET-01 | mọi trạm ST_* + NPC của mốc mở đúng điều kiện; mua meta giá lớn giữ 0.5 s | QA thủ công + unlock |
| AC-MET-02 | giờ tới mốc K62 trong ±20% 17 §10.3 | balance_calc.py hours + PT-E |
| AC-DIF-01 | MRN01–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ỏ guard | PlayMode từng id |
| AC-DIF-02 | Độ Tang tính đúng tổng điểm; max 43 | EditMode |
| AC-DIF-03 | DAILY: 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ơi | P-14 + máy chủ DEV_* |
| AC-DIF-04 | Thương Xót không giảm tiền meta, không khoá kết/hero/truyện | AX04 |
10.7 Hình, VFX, âm thanh (30, 31, 32)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-ART-01 | INV-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ẫm | script quét sheet + khung chụp |
| AC-ART-02 | mọi sheet qua contact sheet + art-style-reviewer = pass; pixel nguyên, không lọc mịn | cổng art-style |
| AC-VFX-01 | hitbox khớp VFX: lệch ≤ 2 px [ASSUMED] ở overlay HITBOX | F3 HITBOX + ảnh chụp |
| AC-VFX-02 | FX hero lõi #fff6f0 + viền slot, đặc; FX địch lõi tối, rỗng (INV-01c) | soát sheet |
| AC-VFX-03 | owner file chỉ tham chiếu VFX_/SFX_/BARK_ của chính nó + SHARED/UI (51 §2.2) | validate.py --all |
| AC-AUD-01 | AT-01..AT-12 (32 §14) Đạt trước mỗi MS | biên bản AT |
| AC-AUD-02 | tell chỉ dùng 6 SFX_SHARED_tell_*, bus EnemyTell, không ngẫu nhiên pitch | audio_lint.py |
| AC-AUD-03 | nhạ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)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-UI-01 | mọ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-02 | không vàng #ffd84a/tím #b14cff/cùng dải trên UI (trừ biểu diễn tell); màu chỉ từ token | quét ảnh chụp |
| AC-UI-03 | hà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àn | kịch bản QA |
| AC-UI-04 | recap chết (INV-16): 5 nguồn cuối (tên đòn, Y/P/N, giây) + đòn kết liễu = hero_died.last5 | so log sát thương |
| AC-LOC-01 | 100% khoá ngôn ngữ đã ship; {param} khớp; không vượt max_len; pseudo-loc +35% không tràn | CI bước 14 |
| AC-LOC-02 | chữ CJK ≥ 12 px; tiếng Việt đủ dấu 2 tầng | ảnh chụp 1280×800 |
| AC-LOR-01 | trang 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 presence | validate.py + QA |
10.9 Lưu, dữ liệu, Steam, telemetry (50, 51, 43, doc này)
| AC | Tiêu chí | Đo |
|---|---|---|
| AC-SAV-01 | ghi nguyên tử + .bak; fixture hỏng → nạp .bak; save.corrupt.test không mất tiến trình | EditMode Save |
| AC-SAV-02 | di trú mọi v<n> đã ship, ≥ 20 file mẫu, 0 mất mở khoá (kể cả gỡ cờ build U3) | RL02 |
| AC-SAV-03 | kí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-04 | 7 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 cloud | EditMode Save (7 fixture save/conflict/F1–F7) + RL02 |
| AC-DAT-01 | JSON đúng 51 + tools/schema/*.schema.json; validate.py --all 0 ERROR; build_gdd.py render khớp | CI bước 1, 3 |
| AC-DAT-02 | hot reload F5 không dừng Play; 0 id chuỗi trong sim (handle ushort) | PlayMode |
| AC-STM-01 | thà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-02 | leaderboard qua 6 bước kiểm hợp lý 43 §6.3; mercy_used = true → không nộp | RL06 |
| AC-STM-03 | rich presence cập nhật ≤ 1 lần/5 s, không chữ người chơi gõ | log Steamworks |
| AC-TEL-01 | mọ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-02 | gó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-03 | balance_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-verifierchặn). - Thêm field/sự kiện: sửa §3.3 +
43§15.2 cùng lượt, tăngschema_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/saicontent_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
| Q | Quyết định | Lý do |
|---|---|---|
| Q1 Tên sự kiện chết/mua | 2026-11-07 — canon hero_died + shop_purchase (17 §11.1); death / shop_buy của 50 §15 là bí danh → 50 sửa theo | doc 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 cao | 2026-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à last5 | giữ ≤ 50 KB/run; mọi KPI 17/14 vẫn tính được |
| Q3 Trần gói | 2026-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òng | 2026-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ẫu | n ≥ 400 run/ô để quyết định (CI ±4.9 điểm); n ≥ 20 chỉ là chỉ báo | ngưỡng ±5 điểm của K16 cần CI hẹp hơn ngưỡng |
| Q8 Hạng lỗi | A/B/C/D §6.1; vi phạm INV tái hiện được = A | bất biến là luật cứng của Bible |
| Q9 Boss & ĐÁP demo | 2026-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át | SV01–SV07 chung mọi đợt PT; SV01/SV02 đo P7 | so sánh được giữa mốc |
| Q11 K30 phân bố tell chết | Y ≤ 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-B | 10 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ỏ telemetry | 2026-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, K64 | 2026-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 |