Changelog

本檔記錄 TOYPICK v2 的正式版本變更摘要。

格式參考 Keep a Changelog,版本號採語意化版本(Semantic Versioning)管理。

[1.2.6] - 2026-06-05 — 根治「報到造成進行中局排點被改變」(報到時快照釘選)

Fixed

  • 修正「某局進行中但尚未存分時,有新球員報到,導致正在進行的那局排點被改變」的問題。根因:排點 buildDynamicCourtGames 是無狀態渲染,配對完全由當前報到名單決定;「進行中」的局正常只是渲染時推算出來、並未釘住,且過去只有存過分數的局才會持久化進資料庫。v1.2.5 的 WYSIWYS 修復只覆蓋存分路徑,但「報到」不走存分路徑——名單成長後重新渲染時引擎沒有「這局剛剛長怎樣」的記憶,只能用更大的 template 重算,連進行中的第一局也被重配。這是 v1.2.1~v1.2.5 排點 bug 類別保護傘漏接的最後一個觸發點。

Changed

  • 新增純函式 buildCheckInPersistencePlancourt-schedule-engine.ts),與存分時的 buildSavePersistencePlan 對稱。當球員報到(checkedIn false→true、造成名單成長)時,在名單成長之前先以操作員當下所見的名單渲染排程,把進行中那一局連配對快照寫入 CourtScheduleScore,使其進入「已釘住」集合。名單變大後的重新渲染只在尾端追加新局,不再重洗進行中或已完成的任何一局。
  • 快照掛在 setRegistrationCheckedInregistration-service.ts)中、管理員權限驗證之後、資料庫翻牌之前,僅在成長型報到觸發。冪等(已釘住則為 no-op)、永不覆蓋已有比分的完成局,快照失敗採 best-effort 不阻擋報到。

Added

  • 新增 FUZZ 3(check-in 路徑):模擬真實報到流程(成長前 snapshot、再成長名單、再重渲染),固定種子 PRNG 跑 400 場隨機 session,斷言「報到時進行中的局配對永久不變、所有完成局保持凍結」。
  • 新增 GUARD(check-in 冪等 / no-clobber):驗證 buildCheckInPersistencePlan 對已釘住狀態為 no-op、永不覆蓋已存比分的完成局(防雙重報到或重試覆蓋線上資料)。

Verified

  • node --test tests/court-schedule-fuzz.test.mjs(8/8 pass,含新 check-in 根治與冪等斷言)
  • 全套件 node --test tests/*.test.mjs(94/94 pass)
  • npx tsc --noEmit(綠燈)、npm run build(綠燈)

[1.2.5] - 2026-06-05 — 修復存分後排點被改變(所見即所存)+ 連打懲罰梯度 + fuzz 測試框架

Fixed

  • 修正「儲存第一局比分後,其他局(特別是進行中那局)的對戰排點被改變」的問題。根因:存分持久化計畫 buildSavePersistencePlancourt-schedule-engine.ts)在把某局標記 completed 後重新渲染排程以推算下一進行中局,但對 teamA/teamB 仍為空的槽位會依當下名單即時重算,可能挑出與畫面顯示不同、甚至違反輪休的配對,導致持久化的是「操作員從未看過」的排點。由 fuzz 測試固定種子 seed 5304 穩定重現。
  • 修復方式為所見即所存(WYSIWYS)buildSavePersistencePlan 先以存分前的當前狀態渲染一次排程(即操作員螢幕所見),再於投影中同時釘住「正在儲存的局」與「當下進行中的局」的顯示配對,避免重新渲染時被換成不同配對。釘選只在該局尚無比分時生效,不覆蓋任何已存比分或已持久化隊伍的局。

Changed

  • buildDynamicCourtGames 的連打懲罰由固定值改為依超出程度平方放大(連打 3 局 ×1、4 局 ×4、5 局 ×9…)。讓引擎在必須有人連打時強烈偏好讓「連打最久」的球員優先休息,而非把已連打 4 局的人推到 5、6 局。此分支對未達連打 3 局的健康排程完全休眠,已調校的 6/7/8 人 template 不受影響。

Added

  • 新增 tests/court-schedule-fuzz.test.mjs:property-based fuzz 測試框架,以固定種子 PRNG 模擬上千場真實操作(不同人數、亂序存分、中途加人、legacy 空 teams),每場斷言所有排點不變式,失敗可精準重播。
  • 新增 WYSIWYS 不變式:存分計畫對「正在儲存的局」持久化的配對,必須等於存分前畫面顯示的配對——直接守住本版修復的 bug 類別。
  • 涵蓋 6+ 人連打 ≤ 3 保證(400/400 隨機 session)、亂序存分不洗牌完成局、legacy 空 teams 結構穩定,及已記錄的 4 人開局數學限制。

Verified

  • node --test tests/court-schedule-fuzz.test.mjs(6/6 pass,含上千場隨機 session 與 WYSIWYS 斷言)
  • 既有排點套件 25/25 pass(引擎改動無回歸)
  • npx tsc --noEmit(綠燈)
  • 版本字串測試改為動態比對 package.json,永不再因版本 bump 過時。

[1.2.4] - 2026-06-05 — 修復舊資料(空隊伍欄位)完成局被洗牌

Fixed

  • 修正「儲存某一局比分後,其他已完成局的對戰組合被改變」的問題。根因:v1.2.3 之前存的舊資料 teamA/teamB 欄位為空字串,引擎的釘選判斷 if (savedScore.teamA && savedScore.teamB)court-schedule-engine.ts)對空字串為 falsy,導致這些完成局完全不被釘住——每次 render 都依當下名單即時重算配對。只要名單有任何變動(晚到報到、取消報到、報到順序改變),這些完成局的配對就跟著洗牌。v1.2.3 的修復只對「新存」的局寫入 teams,無法救既有的空 teams 舊 row。實測線上 8 人場(已完成局 1-5、8,皆空 teams)新增第 9 人報到後,第 2、4、8 局配對全被改寫。
  • 修復方式為資料回填:以當前完整名單冷排算出各完成局應有的隊伍,寫回 DB 並釘住。回填僅更新 teamA='' 的舊 row(不覆蓋任何已有 teams 的資料),執行前已備份整張 CourtScheduleScore 表。線上實測:回填後存任一局,6 個已完成局配對全數穩定不變。

Added

  • 新增 scripts/backfill-court-teams.mjs:以真實名單編譯 engine 後冷排,產生回填用的 UPDATE ... WHERE teamA='' SQL。
  • 新增 tests/court-schedule-legacy-teams.test.mjs:回歸測試——已回填 teams 的完成局在名單成長時保持釘住(REGRESSION),並記錄空 teams 完成局會漂移、因此需要回填(GUARD)。

[1.2.3] - 2026-06-05 — 修復晚到報到洗牌進行中局 / 連續上場仍超標

Fixed

  • 修正「新增一名報到球員後,正在進行中的那一局對戰組合被改變」的問題。根因:存分表單永遠只送 status="completed",「進行中」狀態從未被持久化,而是每次 render 時由 fallbackInProgressIndex 即時推斷。已完成的局因為有持久化 teamA/teamB 而被釘住,但推斷出的進行中局不在 pin 集合裡,當晚到報到使名單變大、候選表重算時就被重新洗牌。實測 8 人場第 1 局存分後第 2 局(進行中)E+F vs G+H,新增第 9 人報到後變成 E+H vs F+I
  • 修正「連續上場仍會超過 3 局」的問題。根因:v1.2.2 的 reorderForRest 把整份候選表當成「從第 1 局冷啟動依序打」最佳化,未感知已鎖定前綴(已打/進行中局)累積的連打狀態。穩態雖達標,但晚到報到後重排會破壞輪休——掃描出 22 個違規情境(如 5 人打 3 局後長到 7 人 → 某人連打 5 局)。

Added

  • 新增 src/lib/court-schedule-engine.ts:將排點純邏輯(型別、候選產生、buildDynamicCourtGamesbuildDisplayPlayerNames)抽出為共用模組,供賽點頁(render)與存分 API route(持久化進行中局)共用,不含 Prisma 依賴。
  • 新增 buildSavePersistencePlan(...):存分時計算「該局 completed + 下一局 in_progress(帶當前隊伍)」的 upsert 清單,讓進行中局被持久化、納入 pin 集合,之後晚到報到不再能洗掉它;不會覆蓋已有比分的局。
  • 存分 API route(/api/.../schedule)改為在 status=completed 時讀取報到名單與既有比分,套用 buildSavePersistencePlan 逐筆 upsert。
  • tests/court-schedule-dynamic-behavior.test.mjs:以編譯真實 engine 後 import 的方式做行為回歸——晚到報到不改變進行中局、顯式持久化的進行中局跨名單成長保留、6/7/8/9 人穩態連打 ≤ 3、晚到(6→8、5→7)後連打 ≤ 3、配對與存分無關不變式。

Changed

  • buildDynamicCourtGames 非鎖定槽位的填充,由原本的線性 basePointer 依序取候選,改為「rest-aware 貪婪」:以鎖定前綴的真實連打狀態為種子,每步選連打懲罰最低者。自然順打時冪等(重現原基礎局序),保留 v1.2.1「配對為報到名單的純函數、與存分無關」不變式;當鎖定局來自較小的舊名單時,重排 pending 尾段以符合輪休。

Verified

  • npm test(84 pass / 0 fail,含新行為回歸測試)
  • npm run build(綠燈)
  • 修復前以新行為測試確認 RED(6 測試 2 敗,精準命中兩個 bug),修復後 GREEN。
  • 既有 v1.2.1/v1.2.2 不變式測試全數保留通過。

[1.2.2] - 2026-06-03 — 排點輪休(避免連續上場)

Fixed

  • 修正場地賽點排程「單一球員連續上場過多」的問題(8 人場實測有球員連打 7 局),違反驗收基準 I7(連續上場不超過 3 局)。根因為實際運作的 buildBaseGameCandidatessearchPartnerCoverageSchedule 只優化搭檔覆蓋,以錨點球員貪婪展開,使同一人的搭檔組合被排在相鄰局;檔案內既有的輪休評分(consecutivePenalty 等)從未被呼叫,屬無效程式碼。

Added

  • 新增 reorderForRest(gameSet, playerNames):對既有局集合做確定性重排,每步選「連續上場懲罰最低」者(懲罰 = 上場者目前連續局數平方和,並對已連續 3 局者再上場加重),同分以對戰簽章決勝確保確定性。於 buildBaseGameCandidates 各回傳路徑(6/7/一般含 8 人)回傳前套用。
  • tests/court-schedule-rules.test.mjs 新增 8 人場斷言:連續上場 ≤ 3、出場次數差距為 0。

Changed

  • 排程僅調整各局先後順序;搭檔組合、對戰組合、每位球員出場次數完全不變。

Verified

  • npx tsc --noEmit -p tsconfig.json(型別乾淨)
  • npm run build(綠燈)
  • npm test(78 pass / 0 fail)
  • 端到端離線測試(直接從正式 page.tsx 抽出排程函數):8 人場最長連續上場由 7 降為 2、出場每人 7 局(差距 0)、跑兩次一致、28/28 對搭檔全覆蓋。
  • 存分不洗牌不變式(v1.2.1)保留:重排僅在基礎局序生成階段,已開打的局仍由持久化 teamA/teamB 釘住。

[1.2.1] - 2026-06-03 — 修復存分造成排點對戰洗牌

Fixed

  • 修正場地賽點頁「儲存某一局比分後,其他尚未填分的局對戰組合會被重新洗牌」的問題。根因為 buildDynamicCourtGames 只鎖定「已有比分」的局,其餘的局每次都用貪婪演算法依當前歷史重排;由於鎖定集合會隨存分數量成長,餵給重排的歷史就跟著改變,導致未填分的局配對被打亂。
  • 改為「對戰配對由報到名單確定性產生、與存分無關」:完整賽程由 buildBaseGameCandidates(已報到名單) 一次性決定並依固定順序填滿目標局數;存分只會把比分與狀態依 gameId 疊到對應的局,不再觸發任何重排。

Changed

  • buildDynamicCourtGames 改為兩段式確定性填充:先以各局持久化的 teamA/teamB 釘住「已開打 / 進行中」的局,其餘空位再依 baseCandidates 既定順序、跳過已使用配對依序填入。後到球員報到使名單變大時,已開打的局維持原對戰,只有尚未開打的尾段重新生成。
  • CourtScheduleScore 持久化每局的 teamA/teamB@default("")),作為釘住已開打對戰的依據;存分表單新增隱藏欄位帶入當局對戰,API 與服務層一併寫入。

Verified

  • npx tsc --noEmit -p tsconfig.json(型別乾淨)
  • npm run build(綠燈,/matches/[matchId]/courts/[courtId]/schedule 與對應 API 路由已註冊)
  • npm test(77 pass / 0 fail)
  • 離線行為測試:固定名單下連續存 3 局比分,14 局對戰組合完全不變;7→8 人後到情境下已開打的兩局維持原對戰並擴充為 14 局。

[1.2.0] - 2026-06-01 — 批量報名自動分配

Added

  • 場次詳情頁新增「批量報名(管理員)」區塊:管理員可一次貼上多人名單(每行 姓名,DUPR),系統依場地 sortOrder 由前往後自動分配,單面額滿即跳下一面。
  • 服務層新增純函式 distributeAcrossCourts(可單獨測試的分配演算法,不可變輸入、依 sortOrder 升冪填滿)與 createBatchRegistrations(管理員限定、單次 createMany 批次寫入)。
  • 新增 API 端點 POST /api/registrations/batch,錯誤碼對應 HTTP:管理員限定 403、缺少必填 400、場次不存在 404、其餘 500。
  • 批量結果以結構化分類回傳並於 UI 呈現四類:已排入(落點場地)、已略過(名單內重複 / 此場已報名)、無空位、無效列(姓名與 DUPR 皆為必填)。
  • 新增 tests/batch-registration.test.mjs:涵蓋分配演算法、服務層權限與驗證、API 錯誤碼對應、場次頁批量 UI 契約(4 項)。

Changed

  • 批量報名強制每列同時填寫姓名與 DUPR:DUPR 作為去重鍵,避免空白 DUPR 撞 Registration @@unique([matchId, duprId]) 唯一鍵。
  • createMany 寫入後重新查詢以回填 registration id 與報到狀態,讓批量排入的人員可立即在管理員報到 / 刪除列表中操作。

Verified

  • npx tsc --noEmit -p tsconfig.json(型別乾淨)
  • npm run build(綠燈,/api/registrations/batch 路由已註冊)
  • npm test(76 pass / 0 fail,既有 72 + 新增 4)

[功能] - 2026-05-31 — 站內版本資訊與更新紀錄頁

Fixed

  • 修正首頁「版本資訊」「更新紀錄」按鈕連到 /docs/RELEASE_v1.1.0.md/CHANGELOG.md 靜態路徑時出現 404 的問題。根因為這些檔案位於 repo 的 docs/ 與根目錄,不在 Next.js 對外提供靜態檔的 public/ 目錄。

Added

  • 新增站內頁面 /release(版本資訊)與 /changelog(更新紀錄),以站台深色主題渲染對應 Markdown 內容,兩頁互相連結並可回首頁。
  • 新增輕量 Markdown 轉換器 src/lib/markdown.ts(零相依,僅覆蓋文件實際使用的語法:標題、巢狀清單、行內 code、粗體、段落),輸出結構化節點由 src/components/markdown-view.tsx 安全渲染(不使用 dangerouslySetInnerHTML)。
  • 新增建置前產生器 scripts/gen-doc-content.mjs(掛於 prebuild/predev),將文件內容編入 bundle,使 standalone 容器無需在 runtime 讀檔即可渲染。
  • 新增 tests/markdown.test.mjs:Markdown 解析行為測試(標題層級、巢狀清單、行內語法、生成內容可解析、網域已更新)。

Changed

  • 首頁「版本資訊」「更新紀錄」由開新分頁的外部 .md 連結改為站內 Link 導航。
  • 同步 docs/RELEASE_v1.1.0.md 的部署網域為 https://www.wait2order.com

[修復] - 2026-05-31 — 場次時間時區一致性

Fixed

  • 修正場次時間在不同頁面顯示不一致的問題。根因為日期格式化未指定時區:server component(首頁、過期場次頁,於 UTC 容器執行)與 client component(場次詳情頁,於使用者瀏覽器執行)使用各自的執行環境時區,導致同一場次顯示不同時間。
  • 修正場次建立/編輯送出時的時區偏移:<input type="datetime-local"> 的台灣牆上時間先前被當成 UTC 直接儲存,使 DB 值較正確 UTC 多 8 小時。

Added

  • 新增共用日期工具 src/lib/datetime.tsformatMatchDateTW(一律以 Asia/Taipei 顯示)、toTaipeiDateTimeLocalValue / taipeiDateTimeLocalToISO(datetime-local 與 UTC ISO 互轉,固定 UTC+8,不依賴執行環境時區)。
  • 新增 tests/datetime.test.mjs:7 項時區行為測試(顯示、跨日換算、round-trip 不漂移、跨午夜邊界)。

Changed

  • 首頁、場次詳情頁、過期場次頁的時間顯示改用 formatMatchDateTW
  • 場次建立頁、編輯頁的送出改用 taipeiDateTimeLocalToISO 將台灣時間正確換算為 UTC;編輯頁帶出現值改用 toTaipeiDateTimeLocalValue(取代依賴瀏覽器時區的 getTimezoneOffset())。

Data Migration

  • migrations/2026-05-31_fix_matchdate_tz_offset.sql:將既有 Match.matchDate 一次性減 8 小時,修正先前流程造成的偏移。執行前已 pg_dump 備份,於交易內執行並前後比對。此遷移不具冪等性,僅執行一次。

[功能] - 2026-05-31 — 場次編輯

Added

  • 新增「場次編輯」功能:場次建立後可由建立者修改名稱、地點、日期、說明、場地數量與每面場地人數上限。
    • 服務層 updateMatchsrc/lib/match-service.ts):建立者限定(FORBIDDEN_EDIT_MATCH)、欄位驗證(MISSING_REQUIRED_FIELDS / INVALID_COURT_COUNT 1–10 / INVALID_COURT_CAPACITY ≥1),全程於 $transaction 內執行。
    • API PATCH /api/matches/[matchId]:錯誤碼對應 HTTP(400/403/404/409),破壞性變更回 409 並附 impact 統計。
    • 編輯頁 /matches/[matchId]/edit:載入帶出現值、僅建立者可送出、樣式沿用建立頁。
    • 詳情頁於「刪除場次」旁新增「編輯場次」入口(僅建立者可見)。

Changed

  • 場地數量增加時於交易內新增空場地(容量沿用設定值);減少時移除 sortOrder 最大的多餘場地。

Security

  • 破壞性變更(降低容量低於現有報名數、或移除含報名/比分的場地)採二次確認機制:預設擋下並回傳將刪除的場地、報名、比分筆數,使用者於前端確認後才以 confirmDestructive=true 重送執行(Cascade 連帶刪除)。

Verified

  • 本機 next build 通過、新路由 /matches/[matchId]/edit 已註冊;測試套件 54 項全綠(既有 48 + 新增 6,涵蓋權限、驗證、破壞性確認、加減場地、編輯入口與編輯頁契約)。

[維運] - 2026-05-31

Changed

  • 對外網域正式切換為 wait2order.comCaddyfile 由環境變數 {$TOYPICK2_DOMAIN} 改為寫死 www.wait2order.com,並新增裸網域 wait2order.com 以 301 永久轉址導向 www(保留原始路徑)。此前線上已手動套用,本次正式納入版控。

Fixed

  • 修正 docker compose 啟動時 POSTGRES_PASSWORD variable is not set 警告:compose 變數插值只讀取專案根目錄的 .env(不讀 env_file 指定的 .env.docker),先前缺少 .env 導致 ${POSTGRES_PASSWORD} 插值落空、postgres 服務密碼被當成空字串。
  • 新增專案根目錄 .env(已被 .gitignore.env* 規則忽略,不入版控),內含 POSTGRES_PASSWORD,值與 .env.docker 一致,作為 compose 插值的 single source。此舉可避免 postgres volume 重建時以空密碼初始化、而 app 仍持舊密碼連線造成的密碼漂移故障(延續 1.0.0 對 P1000 認證漂移的防護)。

Verified

  • docker compose config stderr 全程乾淨,警告消失,POSTGRES_PASSWORD 插值為非空值。
  • 三容器維持運行(app / postgres healthy / caddy),未重建 volume、DB 資料完整。
  • 正式站 live 驗證:https://www.wait2order.com/HTTP 200(Caddy + Next.js)、裸網域 wait2order.com 301 轉址至 www 並保留路徑、TLS 憑證有效(CN=www.wait2order.com)、瀏覽器首頁正常顯示 TOYPICK v2 · 正式版 v1.1.0

[1.1.0] - 2026-05-28

Added

  • 比賽詳情頁新增已登入會員的 協助他人報名 模式,可在不登出的情況下替其他人報名。
  • 協助報名成功後,畫面會顯示更清楚的成功訊息,直接標示被協助者姓名與 DUPR(若有)。

Changed

  • 協助報名模式下的 DUPR 調整為可留空,降低現場替臨時到場者建立報名資料的阻力。
  • docs/FEATURE_ACCEPTANCE_BASELINE.mddocs/RELEASE_v1.1.0.md 已補上協助報名相關驗收條目與驗證紀錄。

Fixed

  • 修正已登入會員在協助報名模式下,報名資料可能被會員本人資料覆蓋的風險。
  • 修正協助報名流程先前必填 DUPR、無法處理無 DUPR 到場者的限制。

Verified

  • node --test tests/auth-and-match-shell.test.mjs tests/registration-flow.test.mjs tests/court-schedule-rules.test.mjs
  • npm run build
  • 正式站 browser 驗證:登入會員可切換協助報名、成功替他人建立報名、同 DUPR 重複仍被阻擋

[1.1.0] - 2026-05-27

Changed

  • 動態續排鎖定規則補齊:當前面已有 completed 場次、但尚未手動標記 in_progress 時,系統會自動將「最後一個 completed 之後的第一個既有未完成場次」視為 in_progress
  • 晚到球員加入後,補排起點改為自動鎖定場次之後,避免現場已開打的下一局被重排替換。

Fixed

  • 修正第 1、2 局已填比分後,第 3 局仍可能在動態續排時被換掉的問題。
  • 修正 staged-arrival 情境下,completed 之後的既有未完成局未被正確保留的問題。

Verified

  • node --test tests/court-schedule-rules.test.mjs
  • npm run build
  • 正式站 browser 驗證:A~D 先報到、完成第 1 / 2 局、E~H 後到時,第 3 局會自動顯示 進行中 並保留,只有第 4 局之後補排

[1.1.0] - 2026-05-26

Added

  • 建立比賽頁新增 管理員 Dupr ID 1 / 管理員 Dupr ID 2 欄位,可在場次建立時指定最多兩位管理員。
  • 新增正式版文件:docs/RELEASE_v1.1.0.md

Changed

  • 建立比賽頁的管理員 DUPR 欄位取消字數限制,可輸入完整 DUPR 字串。
  • 建立比賽頁在未登入時會顯示「請先登入會員後再建立比賽」,避免誤判成系統故障。
  • 首頁正式版版本標示由 v1.0.0 升級為 v1.1.0,並改連到本版 release 文件。

Fixed

  • 修正建立比賽流程在 live 驗證時無法成功送出的問題。
  • 修正填入不存在的管理員 DUPR 時缺乏明確可理解建立結果的問題,現在會回傳 Match admin DUPR ID not found
  • 修正場次詳情頁管理員權限相關 schema 上線後的 DB 缺欄位問題(MatchAdmin.duprId)。

Verified

  • node --test tests/auth-and-match-shell.test.mjs tests/registration-flow.test.mjs
  • npm run build
  • 正式站 browser 驗證:登入、建立比賽、管理員 DUPR 錯誤訊息、比賽詳情頁可開啟

[1.0.0] - 2026-05-26

Added

  • 正式上線首頁 /,提供可報名場次列表與主要功能摘要。
  • 新增會員註冊 /register 與會員登入 /login 流程。
  • 登入後首頁右上可顯示會員名稱,並提供登出功能。
  • 新增建立比賽頁 /matches/new,可設定比賽名稱、地點、時間、場地數量與每面場地上限。
  • 新增場次詳情頁 /matches/[matchId],顯示比賽資訊、場地狀態與報名操作。
  • 新增訪客 / 會員報名流程,可依指定場地報名。
  • 新增管理員報到與刪除報名者操作。
  • 新增建立者可見的刪除場次按鈕與刪除流程。
  • 新增各場地獨立賽點頁 /matches/[matchId]/courts/[courtId]/schedule
  • 新增場地參加排點名單顯示,含編號與姓名。
  • 新增完整局數清單顯示。
  • 新增每局比分輸入與持久化儲存。
  • 新增 Docker / Caddy / PostgreSQL 正式部署配置。
  • 新增正式版文件:docs/RELEASE_v1.0.0.md

Changed

  • 場次首頁改為顯示「目前可報名的場次」,只呈現仍有可報名場地的場次。
  • 場次詳情頁改為每個場地提供獨立 賽點 入口。
  • 所有主要使用者頁面補齊 回首頁 導航。
  • 賽點頁補齊 上一頁 / 首頁 導航。
  • 切換場地時,管理員報到列表會跟著該場地同步切換。
  • 報名 / 刪除後,場地容量與名單顯示同步更新。
  • 6 人與 7 人場地排點模板調整為完整局數版本:
    • 6 人 → 8 局
    • 7 人 → 11 局
  • 場地排點已做一版連打優化,降低連續上場過多的情況。
  • 正式站資料庫連線策略調整為 app 使用獨立 DB 帳號 toypickapp,降低 postgres 超級使用者密碼漂移導致全站故障的風險。
  • Docker Compose 設定調整為較一致的 DB password source-of-truth。

Fixed

  • 修正場次詳情頁一度為空白頁的問題。
  • 修正管理員報到列表在切換場地後未正確跟著切換的問題。
  • 修正 儲存比分 僅有按鈕外觀、未真正持久化寫入的問題。
  • 修正正式站反覆出現 Prisma P1000 / This page couldn’t load 的資料庫認證漂移問題。
  • 修正建立者看不到刪除場次按鈕的問題。
  • 修正登入後首頁未顯示會員名稱 / 登出按鈕的問題。

Verified

  • node --test tests/auth-and-match-shell.test.mjs
  • node --test tests/court-schedule-rules.test.mjs
  • node --test tests/docker-artifacts.test.mjs
  • node --test tests/registration-flow.test.mjs
  • npm test
  • npm run build
  • 正式站 browser 驗證:首頁、場次詳情頁、場地賽點頁

---

後續版本將從 1.0.1 / 1.1.0 開始持續記錄修正與功能增量。