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
- 新增純函式
buildCheckInPersistencePlan(court-schedule-engine.ts),與存分時的buildSavePersistencePlan對稱。當球員報到(checkedInfalse→true、造成名單成長)時,在名單成長之前先以操作員當下所見的名單渲染排程,把進行中那一局連配對快照寫入CourtScheduleScore,使其進入「已釘住」集合。名單變大後的重新渲染只在尾端追加新局,不再重洗進行中或已完成的任何一局。 - 快照掛在
setRegistrationCheckedIn(registration-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
- 修正「儲存第一局比分後,其他局(特別是進行中那局)的對戰排點被改變」的問題。根因:存分持久化計畫
buildSavePersistencePlan(court-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:將排點純邏輯(型別、候選產生、buildDynamicCourtGames、buildDisplayPlayerNames)抽出為共用模組,供賽點頁(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 局)。根因為實際運作的
buildBaseGameCandidates→searchPartnerCoverageSchedule只優化搭檔覆蓋,以錨點球員貪婪展開,使同一人的搭檔組合被排在相鄰局;檔案內既有的輪休評分(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.ts:formatMatchDateTW(一律以 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
- 新增「場次編輯」功能:場次建立後可由建立者修改名稱、地點、日期、說明、場地數量與每面場地人數上限。
- 服務層
updateMatch(src/lib/match-service.ts):建立者限定(FORBIDDEN_EDIT_MATCH)、欄位驗證(MISSING_REQUIRED_FIELDS/INVALID_COURT_COUNT1–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.com:Caddyfile由環境變數{$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 configstderr 全程乾淨,警告消失,POSTGRES_PASSWORD插值為非空值。- 三容器維持運行(
app/postgreshealthy /caddy),未重建 volume、DB 資料完整。 - 正式站 live 驗證:
https://www.wait2order.com/回HTTP 200(Caddy + Next.js)、裸網域wait2order.com301 轉址至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.md與docs/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.mjsnpm 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.mjsnpm 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.mjsnpm 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.mjsnode --test tests/court-schedule-rules.test.mjsnode --test tests/docker-artifacts.test.mjsnode --test tests/registration-flow.test.mjsnpm testnpm run build- 正式站 browser 驗證:首頁、場次詳情頁、場地賽點頁
---
後續版本將從 1.0.1 / 1.1.0 開始持續記錄修正與功能增量。