← 回主控台

業餘 → 專業賽事平台:底層對齊規劃

2026-07-15 拍板。前提:先走業餘平台,再慢慢往專業靠。本頁回答:哪些底層現在就要鋪(不鋪以後大改)、UI 現在只露業餘需要的一小角、以及明確現在不要做的清單。搭配 SOP 差距分析(業界怎麼做)與 三賽事流程圖(我們現在怎麼做)。
判斷標準(整份規劃只有這一條):UI 隨時能改、能藏、能收合 — 便宜;資料模型、寫入鏈、身分權限一旦跑了真資料,以後要改 = 遷移+回填+全 reader 重寫 — 貴。所以「以後要專業」的東西,現在只做三件事:表開對、鏈拆對、權限入口收攏成一個 Gate;UI 用預設值+收合把複雜度藏起來,業餘用戶完全無感。

一、五大核心組別 → 平台角色模型(這是最重要的一塊地基)

Gemini 的五組架構值得採用,但業餘賽事常常「一人分飾五角」。做法:底層開一張賽事職務表,權限檢查收攏成單一 Gate;業餘 UI 只顯示「+ 加工作人員」(預設=競賽組全權),專業版才把五組下拉展開。這樣未來加任何組別/細權限都只是加 enum 值,不用重寫散落各處的權限判斷。

組別(Gemini SOP)職責ArenaMate 現況底層動作(現在)業餘 UI 露出
大會總幹事總控/跨組協調= 主辦館 owner/admin(有)職務表 role=director,主辦 owner 自動入座不顯示(就是建賽的人)
競賽組賽制/抽籤/賽程/裁判/紀錄台/計分大部分有(精靈/排程器/裁判);裁判長角色 v2 進場role=competition;裁判長=head_referee(v2 批)「+ 工作人員」預設此組
場務器材組場地/器材/劃線/清潔借場地 venue_request 有;器材 checklist 無role=venue_ops 先佔位不顯示(P2 才有功能)
行政公關組報名收費/文宣/獎盃/開幕頒獎報名費帳本有、banner 有;頒獎無role=admin_pr 先佔位;帳本權限改走職務 Gate不顯示
醫護安全組醫護/急救箱/送醫動線role=medical 先佔位;安全資訊 jsonb(見 G7)精靈收合段「安全與保險(選填)」

表:arena_tournament_staff(tournament_id, profile_id, role, created_by);Gate:tournamentCan(profileId, tid, capability) — 所有「我能不能管這場」從此只走這一個入口,現有 canManageGym 判斷收進去。

二、「現在不做、以後大改」地基清單(G1–G7)

G1 賽事職務表 + 權限單一 Gate 批2

不做的後果權限判斷現在散在各 View 用「是不是館幹部」判;等專業版要分組分權時,每一處都要重找重改(全 codebase 手術)。
現在最小做法一張表+一個 Gate+把現有判斷收進 Gate(行為完全不變)。
業餘 UI賽事管理頁一行「工作人員 +」,加人=競賽組全權。五組下拉先不出現。

G2 成績兩段式寫回(確認窗口) 批1·裁判v2

不做的後果現在比分一寫回就立刻進 SLP/Elo/晉級/榮譽,錯了無法矯正;以後要加「申訴 30 分鐘窗口/隊長簽名確認」= 重寫整條結算鏈。這是最典型的地基。
現在最小做法寫回 orchestrator 拆成 record(記分)→ commit(結算)兩段,中間窗口可設;業餘預設窗口=0 分鐘(立即 commit,行為跟現在一模一樣)。窗口內可發異議→凍結待裁決。
業餘 UI零變化。賽事設定多一個收合開關「成績確認窗口」,預設關。

G3 per-match 裁判指派表(含報酬+簽核欄位) 批1·裁判v2

不做的後果v2 反正要開這張表;若欄位沒一次留好(每場費率快照 fee_snapshot、裁判長簽核 signed_off_by/at),之後補=回填已完賽資料,而且執法履歷/裁判費結算兩個功能都卡在它上面。
現在最小做法v2 的指派表直接帶 fee_snapshot、signed_off_by/at、source(invited/temp/handover)欄位。裁判單場報酬現在就做:賽事設定「裁判 $X/場、線審 $Y/場」→ 結算頁自動算應領(記帳,金流先 mock,同報名費帳本模式)。
業餘 UI費率欄留空=義務裁判(不顯示錢);有填才出現結算區。

G4 競賽規程快照 + 報名同意版本化 批2

不做的後果規程是「參賽契約」。現在報名沒有「同意了哪一版規則」的紀錄;以後出退費/資格爭議無憑據,補做要動整條報名鏈+歷史資料無法回溯。
現在最小做法賽事表加 regulations jsonb(從精靈既有設定自動組裝:資格/賽制/截止/退費/棄權/申訴條款模板,主辦零額外輸入);報名寫入 agreed_regulations_at + 版本 hash。
業餘 UI精靈末頁多一頁自動生成的「競賽規程」預覽;報名 flow 多一個勾選「我已閱讀並同意」。

G5 種子基準日(strength 快照) 批2

不做的後果種子用「當下」實力分,抽籤後分數變動會被質疑;歷史賽事無法回答「當時憑什麼排他第一種子」。事後補=無法回填。
現在最小做法定案(maybeAutoDraw / 手動產表)時把每個參賽者的 entrantStrength 快照存進 bracket_data.seeds,顯示「以 X/X 實力分為準」。約十行。
業餘 UI對戰圖角落一行小字。

G6 排程約束:同人不重疊 + 最低休息 批1·裁判v2

不做的後果planRoundBatchSchedule 的呼叫介面會被越來越多地方用(三賽事+倒排期);約束參數晚加=每個呼叫端重談。而且這是選手最有感的排程 bug(兼項/跨隊撞場)。
現在最小做法排程 Gate 加兩條純規則:同 user_profile_id 兩場不重疊、間隔 ≥ minRestMinutes(預設 30);裁判指派也吃同一條(裁判自己的比賽/執法不重疊)。
業餘 UI零變化(排程器自動遵守);衝突時紅字提示。

G7 安全/保險/雨備 資訊欄位 批2

不做的後果後果小(jsonb 隨時能加),但便宜到不做可惜;而且「延期 vs 取消」的雨備條款要跟 G4 規程一起長,分開做會做兩次。
現在最小做法賽事表 safety jsonb:保單號/AED 位置/緊急聯絡人/雨備方案(延期或取消)。條款文字進 G4 規程模板。
業餘 UI精靈收合段「安全與保險(選填)」,全空也能建賽。

三、現在就做的小功能(業餘也直接受益)

四、三批 Roadmap

內容狀態
批 1 裁判 v2+結算地基per-match 指派(G3 含報酬/簽核欄位)、長名單多選含段位、部份出席+順位遞補、N=3 天未回自動棄權、x=2 天未定通知主辦、臨時裁判/轉交、50km 邀請池、球員不可兼正式裁判 Gate、G2 兩段式寫回(窗口預設 0)G6 排程約束、接線 decideFriendlyStart 降級賽制任務卡已開,規格已存 memory
批 2 賽事治理地基G1 職務表+權限單一 Gate(五組模型)、G4 規程快照+報名同意、G5 種子基準日、G7 安全欄位;順帶:候補名單擴賽制規劃完成,待批 1 落地後開
批 3 營運便利整賽延期 flow(颱風季)、大會螢幕、Next-up 叫場推播、秩序冊/成績 PDF、執法履歷簽核+匯出、頒獎 run-of-show、賽後問卷照 SOP 頁 P1→P2 依序

五、明確「現在不要做」(避免過度工程)

一句話:批 1 把「裁判+結算」的骨架換對,批 2 把「權限+規程」的骨架換對 — 這兩批做完,之後從業餘長成專業平台都是加 UI 和開開關,不再動骨頭。

拍板紀錄:x=2 天、N=3 天(2026-07-15)。本頁與 /arena-sop-gap.html、裁判 v2 任務卡互相引用。