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

6.7 KiB

แก้บัคจาก 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 นั้นเสร็จแล้ว