docs(app): 回填維護項 5+6(清殘留分支/清 dev DB)——並救回一份未合併的測試、更正一條寫錯的機制 - #49
Conversation
三個 repo 的殘留:本地分支 76→5、worktree 18→3、remote 舊分支 17→0。 重點不是刪,而是刪之前逐條證明內容真的在 main(前兩批「救回」就是因為 有人把未合併的分支當成已合併)。判定不靠 commit message、也不只看 PR 狀態: MERGED 的分支還要比對 `headRefOid`,因為 squash merge 後本地 tip 可能又長出 新 commit,而 PR 頁面不會告訴你。40 條 MERGED 分支全數 tip 相符。 4 條例外逐條判定:3 條已被取代/已救回,1 條(dispatch `determined-shannon`, **從未開過 PR**)帶著 main 沒有的 dropoff repository 測試,已救回為 dispatch PR #50。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
清理本身:docker compose down -v 砍掉 dev DB volume,重建後驗證 migration 跑到 000023、admin 重種可登入、業務表全 0;順手清掉維護項 5 遺留的兩個孤兒 volume(228MB)。 兩件比「刪掉了」更重要的事: 1. **更正原待辦寫錯的機制**:舊敘述說殘留的「線上」司機擋在派單佇列前。讀 dispatchRound → Store.NearbyDriverIDs 後確認跨 session 不成立——候選只從 Redis drivers:geo 取且要過心跳鮮度,而 compose 的 redis 沒掛 volume,down 之後派單池是空的 (實測 dbsize 0)。那次白跑是同一個 session 內司機還在送心跳造成的。 2. **盤點到真正會咬下一次的坑**:GoOnline 對 status=OnTrip 的司機直接 return 不改狀態、 GoOffline 回 ErrDriverOnTrip。上次留下 3 個卡在「載客中」的司機,重用時 App 顯示 上線成功但永遠收不到單、也無法離線,且沒有任何錯誤訊息。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
追加:維護項 6「清 dev DB 測試殘留」也完成了(commit 6977b84)清理
驗證重建後仍可用(不只是刪掉):migration 自動跑到 000023、 比「刪掉了」更重要的兩件事1. 原待辦寫錯的機制,已更正。 舊敘述說殘留的「線上」司機擋在派單佇列前。讀 2. 盤點到真正會咬下一次的坑。 下次做 E2E 前請注意DB 是全新的,沒有任何測試帳號——司機/乘客都要重新註冊,司機還要走 O5 車輛審核(admin 核准)才能接單。 🤖 Generated with Claude Code |
盤點 A2/A5 前置條件時發現的洞:IOS_PLAN 的散文說階段 1–4、7 都完成, 但**勾選框仍是 [ ]/[~]**(階段 1 的 1-1/1-2/1-3/1-5、3-4、7-1)。 只讀清單的人會以為要重跑那些需要 sudo 的工具鏈步驟。 不照散文打勾,逐條重新取證: - xcode-select -p = /Applications/Xcode.app/...、xcodebuild = Xcode 26.6 (17F113) - xctrace list devices 有 iOS 26.5 runtime;flutter doctor → No issues found! - Info.plist 確認 UIBackgroundModes: location +兩則定位用途說明皆在 - **實跑 flutter build ios --no-codesign --flavor driver -t lib/main_driver.dart → ✓ Built Runner.app (20.6MB),Xcode build 116.8s**(先前只驗過 customer flavor) 更正 7-1:「已寫好但推不上去(token 缺 workflow scope)」是過期敘述—— CI 檔案早就在 main,最近一次完整執行 build-ios success(6 分鐘)。 同時記下它**不是 branch protection 的必要檢查**(PR #49 就是在它 pending 時合掉的)。 「0. 環境現況」表加註為動工前的歷史快照,避免被當成現況讀。 前置條件當日實查:google-services.json 不存在(A2 卡)、 devicectl list devices → No devices found(A5 階段 5 卡)。 Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
做了什麼
TODO「下次任務」裡唯一不需外部資源、也不寫 DB 的項目:維護項 5 清開發殘留 worktree/舊分支。
app 55→2、admin 2→1、dispatch 19→2;admin 的 remote 本來就乾淨。
重點不是刪,是刪之前的舉證
前兩批「救回」(app #48、dispatch #49)之所以存在,就是因為有人把未合併的分支當成已合併。所以這次的判定不看 commit message、也不只看 PR 狀態:
git merge-base --is-ancestor <branch> main→ ancestor 即安全。headRefOid——squash merge 後本地 tip 可能又長出新 commit,PR 頁面不會告訴你。→ 40 條 MERGED 分支的本地 tip 全數等於合併時的 tip。claude/todo-review-priority-54ffe7(#40 CLOSED)claude/project-planning-docs-803c8e(#37 CLOSED)claude/driver-phone-profile(#42 CLOSED)handler/driver_profile_test.go(真 DB)覆蓋;且「空字串=清除電話」在 main 已改成 400 拒絕,原測拿到 main 反而會 FAILclaude/determined-shannon-17f4ac(從未開 PR)撈到的東西:dispatch PR #50
determined-shannon的功能碼(PickUpResult/dropoff_lat/tracking ETA)都在 main,但它帶著一份 main 沒有的internal/repository/ride_dropoff_integration_test.go。原檔測的GetDropoffCoords已從 main 移除,故改寫成對現有 API 的等價覆蓋,救回為 fleet-dispatch#50。真正的價值在其中一條:「未指定目的地 →
DropoffPoint必須是 nil」main 完全沒有。它守的是踩過的GeoPoint.Scan坑——NULL 被當成掃描成功而留下(0,0),導航與計費會把幾內亞灣外海當成真目的地,而且不會報錯。真 PostGIS 實跑 2/2 PASS。教訓:「從未開過 PR」是最危險的一種殘留——它不在任何 PR 列表裡,只有逐條比對 diff 才看得到。
這個 PR 本身
只動
docs/TODO.md(回填完成證據+把「下次開工第一件事」寫清楚:維護項 6 清 dev DB 會寫入,動手前必須先問過使用者)。沒有任何程式碼改動,所以沒有跑flutter test。remote 分支刪除已取得使用者同意(含 4 條未合併的;GitHub 的 PR 頁面仍看得到 diff)。
🤖 Generated with Claude Code