Skip to content

docs(app): 回填維護項 5+6(清殘留分支/清 dev DB)——並救回一份未合併的測試、更正一條寫錯的機制 - #49

Merged
thothawei merged 2 commits into
mainfrom
claude/next-todo-task-5aace1
Jul 28, 2026
Merged

thothawei merged 2 commits into
mainfrom
claude/next-todo-task-5aace1

Conversation

@thothawei

Copy link
Copy Markdown
Owner

做了什麼

TODO「下次任務」裡唯一不需外部資源、也不寫 DB 的項目:維護項 5 清開發殘留 worktree/舊分支

項目
本地分支(三 repo 合計) 76 5
worktree 18 3(僅剩兩個進行中工作區)
remote 舊分支 17 0

app 55→2、admin 2→1、dispatch 19→2;admin 的 remote 本來就乾淨。

重點不是刪,是刪之前的舉證

前兩批「救回」(app #48、dispatch #49)之所以存在,就是因為有人把未合併的分支當成已合併。所以這次的判定不看 commit message、也不只看 PR 狀態

  1. git merge-base --is-ancestor <branch> main → ancestor 即安全。
  2. 非 ancestor 者查對應 PR;MERGED 還要再比對 headRefOid——squash merge 後本地 tip 可能又長出新 commit,PR 頁面不會告訴你。→ 40 條 MERGED 分支的本地 tip 全數等於合併時的 tip
  3. 剩下 4 條例外逐條看 diff。
分支 判定
app claude/todo-review-priority-54ffe7#40 CLOSED) 已救回(測試在 #48、功能碼在 #41
app claude/project-planning-docs-803c8e#37 CLOSED) 純文件,T1–T5 逐項都已在現行 TODO 有對應
dispatch claude/driver-phone-profile#42 CLOSED) 已被取代——那份 service 測試每一條都被 main 的 handler/driver_profile_test.go(真 DB)覆蓋;且「空字串=清除電話」在 main 已改成 400 拒絕,原測拿到 main 反而會 FAIL
dispatch claude/determined-shannon-17f4ac從未開 PR 🐛 有漏,見下

撈到的東西:dispatch PR #50

determined-shannon 的功能碼(PickUpResultdropoff_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

thothawei and others added 2 commits July 28, 2026 08:57
三個 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>
@thothawei thothawei changed the title docs(app): 回填維護項 5「清開發殘留」——並救回一份未合併的測試 docs(app): 回填維護項 5+6(清殘留分支/清 dev DB)——並救回一份未合併的測試、更正一條寫錯的機制 Jul 28, 2026
@thothawei

Copy link
Copy Markdown
Owner Author

追加:維護項 6「清 dev DB 測試殘留」也完成了(commit 6977b84

清理

docker compose down -v 砍掉 line-fleet-dispatch_postgis_data(使用者拍板「砍掉重練」)。動手前先核對不會損失設定fleet_settings 每個值都等於 migration 預設、admin 由 app 啟動時重種。順手清掉維護項 5 遺留的兩個孤兒 volume(各 114MB、LINKS=0,共釋出 228MB)。

驗證重建後仍可用(不只是刪掉):migration 自動跑到 000023、admins 重種 1 筆、fleet_settings 回預設、其餘業務表全 0;POST /api/admin/login(admin/admin)200 拿到 token、未帶 token 的 GET /api/customer/fees 正確 401

比「刪掉了」更重要的兩件事

1. 原待辦寫錯的機制,已更正。 舊敘述說殘留的「線上」司機擋在派單佇列前。讀 dispatchRoundStore.NearbyDriverIDs 後確認跨 session 不成立:候選只從 Redis drivers:geo 取,且每個候選還要 driver:<id>:locupdated_at 在心跳鮮度內。compose 的 redis 沒掛 volumedown 之後派單池是空的(實測 dbsize 0、zcard drivers:geo 0)。2026-07-27 那次白跑是同一個 session 內司機還在送心跳造成的,不是跨 session 的殘留。

2. 盤點到真正會咬下一次的坑。 GoOnlinestatus=OnTrip 的司機直接 return、不改狀態GoOfflineErrDriverOnTrip。上次留下 3 個卡在「載客中」的司機(id 4 o5-driver、11、13)——重用這些帳號時,App 顯示上線成功,但派單要求 Idle 所以永遠收不到單,也無法離線,而且沒有任何錯誤訊息。另有 4 張未結案訂單讓 4 個測試乘客一律拿到「已有進行中訂單」。

下次做 E2E 前請注意

DB 是全新的,沒有任何測試帳號——司機/乘客都要重新註冊,司機還要走 O5 車輛審核(admin 核准)才能接單。

🤖 Generated with Claude Code

@thothawei
thothawei merged commit b672fdd into main Jul 28, 2026
2 checks passed
@thothawei
thothawei deleted the claude/next-todo-task-5aace1 branch July 28, 2026 01:17
thothawei added a commit that referenced this pull request Jul 28, 2026
盤點 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant