跳轉到

Reward Claims Architecture

概念概覽

核心結論

核心知識

核心結論

settlement_reward_ledger 的欄位(claiming_run_idapplied_run_id)語義強綁 settlement runs,不可直接泛化為通用 claim registry。正確做法是新建獨立的 reward_claims 表。

適用場景

  • OpenStickerPack(即時開包獎勵)和 SettlePlayer(結算獎勵)兩條路徑都應寫 reward_claims
  • 結算獎勵不應依賴 mutable aggregate(如 progress.sets_reward_claimed),真相必須收斂到 ledger 或 claims 表

判斷原則

當既有 ledger/log 表帶有強業務語義欄位時(如 run_id 綁定特定業務流程),不要為了省事泛化它——新建表的短期成本低於長期語義污染的修復成本。

經驗教訓

  • settlement_reward_ledger 是結算專用 ledger,claiming_run_id/applied_run_id 強綁 settlement_runs,語義不可泛化

  • 通用 reward_claims 表應從零設計,讓不同 claim path(pack open、settlement、活動發放)都能寫入

  • 結算獎勵的冪等性真相應在 claims 表而非業務 aggregate 欄位

常見陷阱

  • 直接在 settlement_reward_ledger 加欄位來支援「非結算」場景,會導致 run_id 語義污染

  • 依賴 progress.sets_reward_claimed 等 mutable field 作為已領獎依據,資料一致性無保證

最佳實踐

  • 新建 generic reward_claims 表,以 claim_source(pack_open / settlement / activity)區分來源

  • 所有 reward grant path 統一走 playerRewardGranter.GrantRewards,補 wiring 到 main.go

相關概念

相關視角

以下頁面與本概念共享主題,但從不同角度切入。保留獨立視角同時提供交叉參考:

來源 Sessions

日期 Session 貢獻摘要

| 2026-03-31 | c903e4ed-15e4-4a39-b7b8-30b428e38075 | 釐清 settlement_reward_ledger 語義邊界,確立通用 reward_claims 表的必要性與建表原則 |


本概念頁面由 Semi-Brain Wiki 系統自動維護

最後更新: 2026-03-31