Files
GaCy-GO/docs/GEMINI-FIXES.md
T

53 lines
6.7 KiB
Markdown
Raw Normal View History

# แก้บัคจาก review งาน Gemini — 2026-11-01
ขอบเขตคือ 7 findings จาก review ของ CW ที่ commit แล้วและ Warp ที่ยังไม่ commit
ไม่ใช่การยืนยันว่าพอร์ต CW ครบทุกระบบหรือแก้บัคทั้ง repository แล้ว
| Finding | การแก้ |
| --- | --- |
| Batch formation เซฟช่องซ้ำ/ตำแหน่งผิด | ทั้ง GridFightUpdatePos และ GEBBMDCOLCH เรียก transaction เดียวกัน ตรวจ Battle, preparation, session revision, UID, ขอบเขต, ช่องซ้ำ, avatar ซ้ำ และ capacity ก่อนเปลี่ยน/บันทึก ส่ง failure เมื่อ save ไม่สำเร็จ |
| Weekly reward ตอบ success ว่าง | คำสั่งรับรางวัลทั้งสองแบบตอบ RET_GRID_FIGHT_CONF_MISS และไม่เปลี่ยนเซฟ จนกว่าจะมี entitlement/grant/claim persistence ที่ยืนยันได้ |
| Talent ปลด ID ใดก็ได้ | Enable/Reset ทั้ง permanent/season ปฏิเสธการเปลี่ยนเซฟ ไม่คืนความสำเร็จปลอม ต้นทาง grid_fight_talent.zig ระบุชัดว่าเป็น stub และยังไม่มีค่าใช้จ่าย/เงื่อนไข/ผลของ talent ที่ยืนยัน |
| Tests เขียนเซฟจริง | gameserver TestMain ใช้สำเนา runtime ใน temp directory; helper กลับ root หมายถึง fixture นี้ กาชา common/API ใช้ temp fixture ต่อ test ไม่มีการ restore backup ทับไฟล์ผู้ใช้ |
| Pos=0 ถูกนับพันธะ | ตัวนับ board/battle และการเลือกเจ้าของ Trailblaze ใช้ช่วงตำแหน่งจาก constants ของ Client และตัด Pos=0 ออก |
| Archive หายหลัง restart | เก็บ serialized archive/favourite ใน snapshot แยกตาม UID โดย archive ถูก append ใน CAS เดียวกับการจบรอบ ไม่มี global in-memory store และไม่สร้างประวัติเมื่อ save ขัดแย้ง |
| Warp mode ไม่ถูกใช้ | API กับ GetGachaInfo ใช้ visibility loader เดียวกัน อ่าน mode ล่าสุดตอนเปิด Warp กรองกับ verified Client banner assets ไม่ส่ง ID จาก Client อื่นเพียงเพราะอยู่ในไฟล์นำเข้า |
คำสั่ง Warp/reload ไม่เขียน roster ทั้งชุดอีกแล้ว เปลี่ยนเฉพาะ warp_unlock_mode
ผ่าน persistent patch ที่ล็อกไฟล์ และรายงานจำนวน banner ที่ผ่านการตรวจจริง
ข้อความ `/unlockall all` ไม่อ้างว่าแจก player resources; `/unlockall skin`
ไม่ตอบสำเร็จเมื่อยังไม่มี implementation
## Archive และ compatibility
- Snapshot เดิมอ่านได้โดยไม่มีการ migrate/write ระหว่างอ่าน
- เพิ่ม `archives` เป็น serialized protobuf ของ FAIHLAKPABN; unknown fields ใน
snapshot/record ยังคงอยู่ การ save CW ปกติไม่ลบ history
- เลข archive ใช้ revision ของ transaction ที่บันทึก จึงไม่เริ่มนับใหม่หลัง restart
- FavourArchive ตรวจ revision และ commit ภายใต้ persistent lock เช่นเดียวกับ run
- ยกเลิก hardcoded archive Client version `4006`; encoding ของ field นี้ยังไม่
ยืนยัน จึงเว้นไว้ ไม่คำนวณจากข้อความ patch version โดยเดา
- Archive ที่อยู่ในหน่วยความจำของ binary รุ่นก่อนจะไม่มีในไฟล์เก่า งานนี้ไม่
สร้างประวัติย้อนหลังจากการคาดเดา
## การตรวจ
เพิ่ม regression tests ที่อ่าน response ผ่าน typed dispatcher/KCP จริง:
- คำสั่ง Talent และรับรางวัลที่ยังไม่รองรับต้องคืน retcode ผิดพลาดและไม่แก้ save
- ปฏิเสธ formation ช่องซ้ำ/ขอบเขตผิด/UID ไม่มี/Battle/session เก่า ทั้งสอง handler;
valid swap ยังสำเร็จ
- Pos=0 และ bench ไม่ให้ board/battle traits; ตัวที่ลงสนามยังมี traits
- Archive และ favourite อ่านกลับจาก snapshot ใหม่ได้; stale save ไม่เพิ่ม history;
normal save ไม่ลบ history
- Warp modes กรองรายการจริงและไม่ปล่อย unverified ID; ค่า off=0 อ่านกลับได้
- คำสั่ง banner ไม่เปลี่ยน freesr-data.json
ผลตรวจ: `go test ./... -count=1`, `go build ./...` และ `git diff --check` ผ่าน
ตรวจ SHA-256 ของ `persistent` และ `freesr-data.json` ก่อน/หลังชุดทดสอบแล้วไม่เปลี่ยน
เป็นการตรวจอัตโนมัติเท่านั้น ต้องตรวจ Client จริงต่อ โดยเฉพาะ batch formation,
archive UI ที่เว้น Client version และการเปิด Warp ตามรายการ asset ที่มีอยู่
งานนี้ไม่เพิ่มการแจก Talent/weekly reward จนกว่าจะมีข้อมูลรองรับ และไม่เปิด
การสุ่มกาชาจาก imported banner schema ที่ยังไม่ยืนยัน การปฏิเสธคำสั่งเหล่านี้
เป็นการแก้ success ปลอม ไม่ใช่การอ้างว่าระบบ gameplay นั้นเสร็จแล้ว