三個月導入路線圖(統整版V2)
本文件為統整初稿 V1 的升級版本,整合 Integration Expert 整合決策報告中的全部架構調整。V2 與 V1 最大的差異在於:成熟度路徑新增 Level 3.5(String Freeze 先行),Month 2 加入去污名化 Workshop 和 QA 批次視窗機制,Month 3 正式啟用 Hotfix SOP。
設計哲學:文化轉變需要有序的衝擊劑量。V1 在 Month 2 同時引入 Feature Freeze 設定和掉車 SOP,文化衝擊集中,V2 透過分層設計(String Freeze → 掉車預演 → Feature Freeze → Hotfix)讓每個月有一個主要的文化升級點。
相關文件:04-環境建置指南(統整版V2) | 05-團隊導入策略(統整版V2)
成熟度路徑總覽
V2 的成熟度設計新增了 Level 3.5 這個中間站,讓從「沒有截止日文化」到「完整 Feature Freeze 文化」的轉型更有緩衝:
| 成熟度 | 描述 | 達成時機 | 核心機制 |
|---|---|---|---|
| Level 2(現況) | 版本有日期但可以延誤,沒有截止點文化 | 導入前 | — |
| Level 3(Month 1) | Linear 環境建立,全員加入,基礎 Automation 運作 | Month 1 Week 3 | Android ALPHA 驗證 + Testing Notes Template |
| Level 3.5(Month 1 末) | String Freeze 試水:第一次讓「截止點是死的」變成真實體驗 | Month 1 Week 4 | String Freeze 第一次執行 |
| Level 4(Month 2) | 掉車 SOP 第一次執行,去污名化 Workshop 完成,QA 批次視窗啟動 | Month 2 Week 2-3 | 掉車 SOP + QA 批次視窗 |
| Level 5(Month 3) | 完整 Feature Freeze 文化,Hotfix SOP 正式運作 | Month 3 | Hotfix SOP + 第三次掉車自動執行 |
為什麼需要 Level 3.5(String Freeze 先行)
String Freeze 和 Feature Freeze 的核心差異:
| 面向 | String Freeze(Level 3.5) | Feature Freeze(Level 4-5) |
|---|---|---|
| 影響範圍 | 所有 UI 文字和 Copy | 所有功能的增刪 |
| 情緒衝擊 | 低(翻譯晚了很好理解) | 高(功能掉車涉及 RD 個人感受) |
| 破壞性 | 幾乎為零(文字調整不影響功能) | 中高(功能掉車影響版本內容) |
| 文化建立目的 | 讓全員體驗「有截止點且不可延伸」 | 讓全員體驗「列車不等人」 |
String Freeze 之所以作為試水,是因為它能在幾乎沒有衝突的情況下建立「截止點是死的」這個最基本的文化認知。當 MKT 知道文字在某日之後不能改,他們必須在截止日前完成文案確認——這個體驗本身就是 Feature Freeze 文化的預演。
三個月總覽
Month 1(建立基礎 + String Freeze 試水)
├── Level 3 目標:Linear 環境所有 P0 項目完成
├── Android ALPHA 驗證:確認自動通知機制可靠
├── Testing Notes Template:建立填寫規範,全員理解
├── DORA 基線:7 個指標全部測量現況
├── Feature Freeze 概念宣告:為 Month 2 文化轉變預熱
├── Firebase Crashlytics Alert 設定(Month 1 末)
└── Level 3.5 目標:String Freeze 第一次試水(Week 4)
Month 2(文化轉變:掉車 SOP + QA 批次視窗)
├── 去污名化 Workshop(Week 1):60分鐘,在真實掉車前去除心理障礙
├── Feature Freeze 第一次執行(Week 1-2 設定)
├── 掉車 SOP 首次實際執行(Week 2-3)
├── QA 批次視窗啟動(Week 1):週二 + 週四 PM 固定 QA 時段
├── String Freeze 第一次完整執行(以 Month 2 某版本為試驗對象)
└── Testing Notes 填寫率追蹤:目標 > 80%
Month 3(指標達標 + Hotfix SOP 正式運作)
├── Hotfix SOP 正式培訓(Week 1)
├── QA / Shawn 全面接入 Linear
├── 第一次完整「列車準時發車」(含掉車 + 準時提交)
├── 掉車自動化(第 3 次起不需 RM + PO 逐次確認)
└── DORA + 消費者 App 7 個指標首次完整評估
時間軸
Week: W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12
────────────────────────────────────────────────────────────
M1: ████████████████████
↑ ↑ ↑ ↑
Template DORA ALPHA String
建立 基線 驗證 Freeze
試水
M2: ████████████████████
↑ ↑ ↑ ↑
Workshop Freeze 掉車 QA批次
去污名化 執行 SOP 視窗
M3: ████████████████████
↑ ↑ ↑ ↑
Hotfix QA 列車 指標
SOP 全接 準時 評估
Month 1:建立基礎 + String Freeze 試水
月度目標
- 完成 Linear 環境所有 P0 項目
- 驗證 Android ALPHA 自動通知機制
- 建立 Testing Notes Template 並制定填寫規範
- 完成 DORA 基線 + 消費者 App 3 個特有指標的現況測量
- 向全員宣告 Feature Freeze 概念,為 Month 2 預熱
- 在 Month 1 末完成 Firebase Crashlytics Alert 設定(低成本高保護)
- 執行 String Freeze 第一次試水(Level 3.5 里程碑)
現況繼承清單
| 項目 | 狀態 | Month 1 動作 |
|---|---|---|
| Workspace + Team(REL)設定 | 完成 | 繼承,無需重做 |
| Workflow States(11 個) | 完成 | 評估是否加入 Waiting for Others(M2 試行) |
| Labels | 完成 | 新增 [Hotfix] Label(紅色) |
| GitHub Integration | 完成 | 驗證 branchPattern 設定(P0 優先) |
| Slack Integration | 完成 | 驗證 ALPHA 通知觸發;建立 release-hotfix Channel |
| Projects(版本容器) | 待建立 | P0 |
| Issue Templates(含 Testing Notes) | 待建立 | P0 |
| Automation Rules | 待建立 | P0 |
| 邀請全員加入 Workspace | 待執行 | P0 |
任務清單
M1-01:branchPattern 設定與驗收測試(最優先 P0)
負責人:David
重要:branchPattern 是所有 Automation 的前提條件,必須在其他 Automation 設定之前完成,並通過驗收測試。
完成條件:
- Settings → Teams → Release Tracker → Automations → Pull request and commit automation
- 設定三條 Branch Rules:
- feature/* + PR opened → Issue 狀態改為 In Development
- staging/* + PR merged → Issue 狀態改為 Ready for Test
- main/* + PR merged → Issue 狀態改為 Released
- 執行驗收測試:建立測試 PR 合併到 staging/* → 確認 Issue 狀態自動改變
- 驗收測試必須通過才能繼續後續 Automation 設定
期限:Month 1 Week 1(第一個執行的任務)
M1-02:Projects 建立與版本容器設定
負責人:David
完成條件:
- 建立下一個版本的 Project(版本號待確認)
- Project 包含以下 Milestones:
Sprint Planning 完成String Freeze(新增,日期:Feature Freeze 前 7-10 天,由 Sherridy 決定)Feature Freeze(日期由 Sherridy 決定)First ALPHA 發出All QA PassedRelease CandidateReleased
- 所有現有進行中的功能 Issue 移入 Project
String Freeze Milestone 說明:在 V2 中,每個版本 Project 都應設定 String Freeze Milestone,時間點通常在 Feature Freeze 前 7-10 天。String Freeze 代表所有 UI 文字和 Copy 的最後截止日,MKT 的翻譯工作必須在此日期前確認所有文案。
期限:Month 1 Week 1
M1-03:Issue Template 建立(含 Testing Notes)
負責人:David(建置)+ Sherridy(定義填寫規範)
完成條件:建立三個 Template(詳細格式見 04-環境建置指南(統整版V2)):
- 新功能規劃(PO 使用)—— 含 Testing Notes 欄位,PO 在 Planning 必填初始版本
- QA 測項(Sub-issue 使用)
- Bug 修復(Ready for Fix 時使用)
全員 Slack 公告:在 #forest-release 發布 Template 用途與填寫責任分工說明
期限:Month 1 Week 1(P0,必須在 M1-04 前完成)
M1-04:Android ALPHA 機制驗證
負責人:David + Tolyn(Android RD)
背景:Android Ready for Test 的自動 QA 通知依賴版本號含 -ALPHA。此機制不可因導入而中斷,必須在 Month 1 驗證其可靠性。必須連續 2 次成功觸發才算驗證通過。
完成條件:
- 建立測試用 Issue(加 Label: Android)
- 模擬 PR 合併到
staging/android-*分支 - 確認三個關鍵點:
- CI/CD 產生的 build 版本號含 -ALPHA(如 5.8.0-ALPHA1)
- Linear Issue 狀態自動變為 Ready for Test
- forest_android_testcenter 收到含 -ALPHA 版本號的 Slack 通知
- 連續 2 次測試 PR 均成功觸發,視為驗證通過
- 在 Issue Comment 記錄驗收結果,加上 Label [ALPHA-Verified]
依賴項:M1-01(branchPattern 已驗收通過)
期限:Month 1 Week 2
M1-05:DORA 基線 + 消費者 App 指標現況測量
負責人:David + Sherridy
完成條件:以下 7 個指標均有現況測量數據:
DORA 4 個指標:
- Lead Time:過去 3 個版本,功能從進入 Planning 到版本 Released 的平均天數
- Deployment Frequency:過去 6 個月,iOS / Android 各發布了幾次版本
- Change Failure Rate:過去 6 個月,緊急修復版本數 / 總發布次數
- MTTR:過去 3 個重大 Bug,從最早發現記錄到修復完成的時間
消費者 App 3 個特有指標: 5. Testing Notes 填寫率:過去 3 個版本 Issues 中有測試注意事項記錄的比例(預期基線:0%) 6. 版本延誤頻率:過去 3 個版本,幾次版本發布比預定日期晚超過 3 天? 7. Crash-free Session Rate 現況:Firebase Crashlytics 查詢 iOS / Android 當前基線數字
記錄格式:建立一份 Linear Project Comment 記錄各指標現況數字與測量方法
期限:Month 1 Week 2
M1-06:Feature Freeze 概念宣告 + Hotfix 環境建立
負責人:David(環境建立)+ Sherridy(公告)
兩個子任務:
子任務 A:Feature Freeze 概念宣告
- 在
#forest-release發布 Feature Freeze 概念說明公告(參考 V1 格式) - 確認全員已讀(至少 Sherridy / Shawn / QA 在 Slack 回覆確認理解)
子任務 B:Hotfix 環境預建(為 Month 3 正式使用預先準備)
- 建立
#release-hotfixSlack Channel(Automation 通知用) - 在 Linear 建立 [Hotfix] Label(顏色:#DC2626 深紅)
- 在 Linear 建立 Hotfix Automation:Issue 加上 [Hotfix] Label → 自動發通知到 release-hotfix + 自動設定 Priority 為 Urgent(詳見 04-環境建置指南(統整版V2))
- 建立 release-hotfix Slack Channel 並邀請相關人員(David、Sherridy、Ezou、RD Lead)
依賴項:M1-03(Template 建立後才宣告,顯示準備充分)
期限:Month 1 Week 3
M1-07:Automation Rules 建立
負責人:David
完成條件:建立 Automation 1-7(詳細設定見 04-環境建置指南(統整版V2)):
| Automation | 說明 | 技術可行性 |
|---|---|---|
| #1 iOS Ready for Test 通知 | 狀態改為 Ready for Test + Label iOS → Slack 通知 | ✅ Linear 原生 |
| #2 Android Ready for Test 通知 | 同上 + Label Android | ✅ Linear 原生 |
| #3 Server/Web Ready for Test 通知 | 同上 + Label Server/Web | ✅ Linear 原生 |
| #4 Released 時間戳記錄 | 狀態改為 Released → Comment + Webhook | ✅ Linear 原生(DORA 部分需 n8n) |
| #5 Testing Notes 提醒(降級版) | 狀態改為 In Development → 無條件發 Comment | ✅ 降級後可行(無法判斷 Description 是否空白) |
| #6 Ready for Test 個別確認 | 狀態改為 Ready for Test → Comment 提醒 QA | ✅ Linear 原生 |
| #7 Ready for Fix 通知 | 狀態改為 Ready for Fix → Slack + DM | ✅ Linear 原生 |
重要說明(Automation 5 降級):
- 原設計意圖:Testing Notes 為空時發警告
- 降級原因:Linear Automation 無法讀取 Description 內容
- 降級後設計:Issue 進入 In Development 時,無條件發 Comment 提醒(「PO / RD 請確認:此 Issue 的測試注意事項是否已填寫?若已填寫請忽略此提醒;若尚未填寫請在 Planning 完成前補充。」)
- [Testing-Notes-Missing] Label 改為 RM 在 Weekly Review 時人工標注
Feature Freeze 提醒注意事項:
- Linear 原生不支援「距 Milestone 日期 N 天」觸發
- ⚠️ Month 1-2 替代方案(Google Calendar):RM 在建立版本 Milestone 時,同步在 Google Calendar 建立「Feature Freeze 前 48 小時提醒」事件,事件觸發時手動在 product-release 發 Freeze 通知
- Month 3 升級方案(n8n):n8n 每天查詢 Linear API,找出 48 小時內即將到來的 Milestone,自動在 Slack 發提醒
期限:Month 1 Week 3-4
M1-08:Firebase Crashlytics Alert 設定(新增至 Month 1)
負責人:David(設定)+ Shawn(確認可接收通知)
為什麼前移至 Month 1:Firebase Crashlytics Alert 的配置成本低(設定約 1-2 小時),但一旦上線就能即時保護發布安全。V1 將此設定放在 Month 3,意味著整個導入期的前兩個月沒有自動 Crash 監控保護。
完成條件:
- Firebase Console → Crashlytics → Alerts 設定:
- Crash-free session rate < 98.5%(Forest App 初期閾值,略低於 Duolingo 的 99.5%,待 3 個月後依數據調整)
- 通知方式:Webhook → Slack forest-release(或 Email → 手動轉 Slack)
- 確認 Shawn + David 均可收到 Alert 通知
- 在 Linear Project Comment 記錄 Alert 設定完成時間
MTTR 計時說明:MTTR 從 Firebase Alert 觸發時開始計算,時間戳以 Slack 通知的時間為準。
期限:Month 1 Week 4
M1-09:String Freeze 第一次試水(Level 3.5 里程碑)
負責人:Sherridy(決策)+ MKT 負責人(執行)
這是 V2 最重要的新增任務,也是 Level 3.5 的核心。
背景設計邏輯:String Freeze 是讓全員在低衝突情境下體驗「截止點是死的」這個文化的機制。它的違反成本說明:
- 對 MKT 的影響:String Freeze 後的文字修改需要等下個版本,MKT 的翻譯工作(通常需要 7-14 天)必須以 String Freeze 日期為截止計算
- 對 RD 的影響:String Freeze 後不允許修改 hardcoded 文字,所有 UI Copy 的修改請求需 RM 確認是否可作 Exception
- 建立文化印象:第一次 String Freeze 執行時,RM 要讓截止點是「認真的」——任何違反都要走 Exception 申請流程,即使是很小的文字調整
完成條件:
- 在當前版本的 Linear Project 中設定
String FreezeMilestone(日期) - 在
#forest-release發布 String Freeze 公告:[v5.x.x String Freeze 公告] String Freeze 日期:[日期] String Freeze 代表什麼? 所有 UI 文字和 Copy(包括 App 內文字、按鈕文字、 錯誤訊息、通知文字)在此日期後不再接受修改。 原因:MKT 的翻譯工作需要固定的文字版本, 如果文字在翻譯期間修改,翻譯品質和一致性會受影響。 例外申請:如有緊急文字需求,請在 <span class="tag">forest-release</span> @sherridy 提出,需要說明原因和緊急程度。 - MKT 確認翻譯任務可在 String Freeze 前完成
- String Freeze 日期到來後,RM 確認未收到 Exception 申請(或已妥善處理)
文化里程碑意義:第一次 String Freeze 的成功執行,代表 Forest App 正式進入 Level 3.5——全員已有「截止點存在且不可任意延伸」的體驗。
期限:Month 1 Week 4(配合版本 Cycle 時程)
Month 1 成功指標
| 指標 | 目標值 | 驗收方式 |
|---|---|---|
| Linear 環境所有 P0 項目完成 | 100% | Checklist 全勾 |
| branchPattern 驗收測試通過 | 通過 | 驗收測試記錄 |
| Testing Notes Template 上線 | 完成 | 至少 1 個真實功能 Issue 使用新 Template |
| Android ALPHA 驗證通過 | 連續 2 次成功觸發 | [ALPHA-Verified] Label 標記 |
| DORA + 消費者 App 7 個指標均有基線數據 | 7/7 | 測量記錄文件 |
| Feature Freeze 概念宣告 | 全員確認理解 | Slack 回覆記錄 |
| Firebase Crashlytics Alert 設定完成 | 完成 | Alert 觸發測試通過 |
| [Hotfix] Label + release-hotfix Channel 建立 | 完成 | 環境確認 |
| String Freeze 第一次試水(Level 3.5) | 完成 | MKT 確認 + RM 公告記錄 |
Month 1 末文化里程碑
- 全員已知道 Linear 是什麼、為什麼要用
- Android ALPHA 機制已驗證可靠
- 「截止點是死的」的第一次文化體驗完成(String Freeze)
- 緊急 Hotfix 的基礎環境已建立(Level 5 的前置條件)
Month 2:文化轉變(掉車 SOP + QA 批次視窗)
月度目標
- 執行去污名化 Workshop(Week 1):60 分鐘,在真實掉車前去除心理障礙
- 所有 RD 開始全面使用 Linear 追蹤開發中 Issue
- 第一次 Feature Freeze 正式設定與執行
- 掉車 SOP 首次實際執行
- QA 批次視窗機制啟動(Week 1):Fei Chen + Jimmy 設定固定 QA 工作節奏
- String Freeze 第一次完整執行(以某個 Month 2 版本為試驗對象)
- Testing Notes 填寫率追蹤正式開始,目標 > 80%
重要設計說明:為什麼 Workshop 移至 Month 2 Week 1
V1 版本的「掉車預演會議」設計在 Month 1 Week 4 執行。V2 的調整理由如下:
- Month 1 Week 4 已有 String Freeze 試水(Level 3.5),文化衝擊已足夠
- 去污名化 Workshop 的最佳時機是「緊接在第一次真實掉車之前」,而非提前一個月
- Month 2 Week 1 執行 Workshop 後,Week 2-3 立即面對真實 Feature Freeze + 掉車場景,學習效果最佳
任務清單
M2-01:去污名化 Workshop(V2 新增,Level 4 前置)
負責人:David(主持)+ Sherridy(主要參與者)+ RD Lead Ezou + QA Fei Chen
時機:Month 2 Week 1,Feature Freeze 第一次設定的同一週
形式:60 分鐘 Workshop(建議結合 Planning 會議進行,避免佔用額外時間)
完整議程:
[0-10 分鐘] 角色演練——理解對方的壓力點
形式:RM(Sherridy)扮演 RD,RD(Ezou)扮演 RM
劇本:
「RM」(Sherridy 扮演):「我的功能還差 2 天,可以等我嗎?」
「RD」(Ezou 扮演):「這個版本已經有 3 個功能準時了,等你的話
那 3 個功能的 QA 時間就被壓縮了。」
討論:互相說出扮演對方時感受到的壓力
[10-30 分鐘] 掉車情境模擬
從 SOP 的第 1 步走到第 5 步:
Step 1:Feature Freeze 前 3 天,David 列出 In Development Issue 清單
Step 2:Sherridy 詢問 RD(Ezou):「FOR-XXX 能在 Freeze 前完成嗎?」
Step 3:Ezou 誠實回答:「不確定,可能需要多 2 天」
Step 4:Sherridy 宣布掉車決定 + 說明心理安全聲明
Step 5:David 在 Linear 執行移動操作 + 公告
全員確認:「我知道我在這個流程中要做什麼」
[30-40 分鐘] 心理安全宣言(RM 公開承諾)
Sherridy 公開說明:
「掉車不計入個人績效,只計入版本學習。
我承諾:
1. 第一次掉車的原因永遠是流程問題,不是個人問題
2. 掉車後被掉車 RD 的下一班時程會在 24 小時內確認
3. 如果掉車決定讓你感到委屈,你可以直接找我討論
4. 我會在 Slack 公告時說明決策邏輯,不是只發結果」
David 在 Linear 建立「版本學習記錄」格式預覽
[40-60 分鐘] 掉車記錄格式預覽
讓所有人看到「掉車記錄長什麼樣」:
- Linear Issue Comment 的記錄格式
- Slack 公告的格式
- 掉車功能在下一班 Project 中的狀態
重點:讓大家知道「掉車不是消失,是轉移」
Q&A:收集所有顧慮,David 記錄並承諾在 Freeze 前回應
完成條件:
- Workshop 完成,每位與會者在 Slack
#linear-導入發一句話說明「我對掉車 SOP 的理解是……」 - Sherridy 的心理安全承諾已公開記錄(在 forest-release 或 Linear Comment 中)
期限:Month 2 Week 1(Feature Freeze 第一次執行前必須完成)
M2-02:QA 批次視窗機制啟動(V2 新增)
負責人:Fei Chen + Jimmy(設計工作節奏)+ David(Linear 視圖設定)
背景:個別 Issue 觸發(Issue 完成 → 立即 Ready for Test)是 V1 已確認的正確設計。但純粹個別觸發模式下,Fei Chen 和 Jimmy 會面臨高頻 context switching——每收到一個 Ready for Test 通知就要停下來切換。V2 加入批次視窗機制解決這個問題。
設計原則:
- 個別觸發(Issue 進入 Ready for Test)繼續執行,確保通知及時
- QA 在收到通知後,Issue 自動進入「待測 Queue」,不要求立刻開始測試
- QA 在固定批次時段集中處理 Queue 中的 Issue
- 例外:[Priority: Urgent] 的 Issue 可以在批次時段外即時處理(需 RM 標注)
具體設計:
批次視窗時間(建議,Fei Chen + Jimmy 可依實際節奏調整):
週二 PM 14:00-18:00
週四 PM 14:00-18:00
在批次視窗外收到 Ready for Test 通知的處理:
→ Issue 出現在 QA 待測 Queue 中
→ 下一個批次視窗統一處理
→ Fei Chen 不需要立即切換(除非 Issue 有 [Priority: Urgent] Label)
例外(可以在批次視窗外立即測試):
→ Issue 有 [Priority: Urgent] Label(需 RM 手動加)
→ 接近 Feature Freeze 的 Issue(RM 評估後加 Urgent Label)
Linear 視圖設定(詳細步驟見 04-環境建置指南(統整版V2)):
David 在 Linear 建立「QA 待測 Queue」Custom View:
- Filter:Status = Ready for Test 或 Testing
- Filter:Assignee = Fei Chen 或 Jimmy
- Sort by:Priority(高到低)→ Due Date(近到遠)
- View 層級:Team View(兩人都能看到)
向 RD 的說明(培訓素材):
「你的功能 Ready for Test 後,為什麼不立刻被測試?」
「QA 使用批次視窗機制來保護他們的認知資源。你的 Issue 已進入 QA 的待測 Queue,會在下個批次視窗(週二或週四下午)開始測試。如果你的 Issue 接近 Feature Freeze 或有緊急需求,請通知 Sherridy 加上 Urgent Label,可以插隊到批次視窗外即時測試。」
完成條件:
- QA 待測 Queue 視圖在 Linear 設定完成
- Fei Chen + Jimmy 確認批次視窗時間並在 Slack 公告
- 第一個批次視窗執行後,Fei Chen 在 forest-release 分享使用心得
期限:Month 2 Week 1 設定;Week 2 開始正式執行
M2-03:Feature Freeze 第一次正式設定
負責人:Sherridy(決策)+ David(Linear 操作)
完成條件:
Step 1 — Planning 完成後 24 小時內:
- Sherridy 與 Ezou(RD Lead)確認本版本 Issue 的工作量評估
- 決定 String Freeze 日期(Feature Freeze 前 7-10 天)
- 決定 Feature Freeze 日期(Cycle 結束前至少 7 天)
Step 2 — 在 Linear 設定 Milestones:
- String Freeze Milestone:加入日期
- Feature Freeze Milestone:加入日期
Step 3 — 同步設定 Google Calendar 提醒(Feature Freeze 48h 提醒替代方案):
- RM 在個人 Google Calendar 建立「[版本號] Feature Freeze 前 48 小時提醒」事件
- 事件設定在 Feature Freeze 日期前 2 天
- 事件觸發時,RM 手動在 product-release 發 Freeze 通知
Step 4 — 公告 Freeze 日期:
- 在 forest-release 發布 String Freeze + Feature Freeze 日期的雙重公告
掉車保守模式說明(V2 精確化):
- 前 2 次掉車:RM + PO 確認後執行(保守模式)
- 第 3 次起:自動掉車,事後通知(Duolingo 模式)
- 退出保守模式的確認時間點:Month 2 的 Sprint Review,由 David 主持確認前 2 次掉車後文化是否已接受
期限:Month 2 Week 1
M2-04:掉車 SOP 首次實際執行
負責人:Sherridy(決策)+ David(Linear 操作)
背景:M2-01 去污名化 Workshop 是心理準備,M2-04 是真實執行。在 Feature Freeze 前掃描中,刻意選擇一個影響最小的功能(非核心、非承諾),走一次完整的掉車 SOP。
完整掉車 SOP(5 步驟):
Step 1:風險識別(Feature Freeze 前 3 天)
David 查詢 Linear,列出本版本中仍在 In Development / Planning 的 Issue
→ 整理清單呈報 Sherridy
Step 2:RD 誠實評估
Sherridy 詢問相關 RD:「FOR-XXX 能在 Freeze 前完成嗎?」
RD 在 Issue Comment 記錄評估(非只在 Slack)
Step 3:RM + PO 確認掉車(保守模式,前兩次執行)
Sherridy 在 Issue Comment 記錄:
「決定:FOR-XXX 掉車,移至 v5.x+1.x
原因:RD 評估 Feature Freeze 前無法完成
決定時間:[日期]
批准:Sherridy」
David 在 Linear 執行操作:將 Issue 移出當前 Project,加入下一個 Project
為 Issue 加上 [Dropped] Label(通用 Label,不建版本特定 Label)
在 Issue Comment 補充:「掉車自 v5.x.x,預計列入 v5.x+1.x」
Step 4:文件化公告
Sherridy 在 <span class="tag">forest-release</span> 發布公告(心理安全宣言格式):
「[功能名稱] 這次掉車,不是因為 RD 表現不好。
功能掉車是列車準時的代價,而準時的列車讓用戶信任我們。
[功能名稱] 已排入下一班(v5.x+1.x),不是被取消。
感謝 [RD 姓名] 誠實地評估了完成時間。」
Step 5:回顧(掉車後 1 週)
在週會討論:
- 掉車決定是否及時?
- 被掉車功能在下一班進展如何?
- 去污名化 Workshop 的效果如何?有什麼需要調整?
Dropped Label 設計說明(V2 修正):
- V1 設計:[Dropped from vX.X.X],每個版本一個新 Label(長期累積大量單次 Label)
- V2 修正:通用 [Dropped] Label + Issue Comment 記錄版本號
- 理由:Label 管理的可持續性——版本特定 Label 難以管理和搜索
完成條件:至少 1 個 Issue 走完完整的 5 步驟,所有步驟均有 Linear 記錄
期限:Month 2 Week 2-3(隨 Feature Freeze 執行自然發生)
M2-05:String Freeze 完整執行
負責人:Sherridy(決策)+ MKT(翻譯確認)
背景:Month 1 Week 4 的 String Freeze 是試水(讓大家知道機制存在),Month 2 的 String Freeze 是完整執行(MKT 翻譯工作已依 String Freeze 日期計劃)。
完成條件:
- String Freeze Milestone 日期到來
- 確認所有 UI 文字和 Copy 已在截止日前確認
- 如有 Exception 申請,已透過 RM 確認並記錄
- MKT 翻譯工作以 String Freeze 版本的文字為基礎開始進行
期限:Month 2 Week 2-3(配合版本 Cycle)
M2-06:Testing Notes 填寫率追蹤啟動
負責人:David(每週追蹤)+ Sherridy / Shawn(填寫責任)
完成條件:
- David 每週從 Linear 統計新建 Issues 的測試注意事項填寫率
- 若填寫率 < 80%,在 forest-release 發 Slack 提醒
- 個別未填寫的 Issue,RM 在 Weekly Review 時手動加上 [Testing-Notes-Missing] Label
三方確認機制說明(V2 更名):
- V1 稱「雙向強制」,V2 改稱「三方確認機制(PO + RD + QA)」
- 機制說明:PO 在 Planning 初始填寫 → RD 在 In Development 補充技術邊界 → QA 在展測項和 Testing 時雙重讀取
- 誠實標注:此機制依賴人工紀律,非工具強制
- PR Template 加入確認欄位(RD 的工具支撐點,最接近強制的設計):
- 「已更新 Linear Issue 的測試注意事項(如有新的技術邊界):Y / N / 無更新」
- PR Template 修改由 Ezou(RD Lead)確認可行性
目標:Month 2 結束時,新建 Issue 的 Testing Notes 填寫率 > 80%
期限:Month 2 Week 1 開始,全月持續
Month 2 成功指標
| 指標 | 目標值 | 驗收方式 |
|---|---|---|
| 去污名化 Workshop 完成 | 1 次 | 會議記錄 + 全員 Slack 回覆 |
| QA 批次視窗機制啟動 | 完成 | Linear 視圖設定 + QA 確認使用 |
| Feature Freeze 第一次成功設定與執行 | 1 次 | Linear Milestone + Slack 公告記錄 |
| 掉車 SOP 首次完整走完 | 至少 1 個 Issue | 5 步驟均有 Linear 記錄 |
| String Freeze 完整執行 | 1 次 | MKT 確認 + 無未申請 Exception |
| Testing Notes 填寫率 | > 80%(新建 Issue) | 每週追蹤數據 |
| RD 使用 Linear 追蹤開發中 Issue 比例 | > 80% | Linear 活躍用戶統計 |
| PR Template 含 Testing Notes 確認欄位 | 已建立 | Ezou 確認 |
Month 2 末文化里程碑
- 「截止點是死的」已有兩次真實體驗(String Freeze × 2)
- 第一次掉車已發生且以正向方式處理(去污名化有效)
- QA 已建立批次工作節奏,Fei Chen + Jimmy 不再高頻切換
- 全員知道掉車 SOP 的 5 步驟和自己的角色
Month 3:指標達標 + Hotfix SOP 正式運作
月度目標
- Hotfix SOP 正式培訓(Week 1):讓全員知道緊急通道如何運作
- QA(Fei Chen / Jimmy)和 Shawn 全面接入 Linear
- 第一次完整「列車準時發車」(含功能掉車 + 版本準時提交)
- 掉車自動化(第 3 次起不需 RM + PO 逐次確認)
- DORA 4 個 + 消費者 App 3 個指標首次完整評估
- Feature Freeze 提醒升級(評估從 Google Calendar 升級到 n8n 自動化)
任務清單
M3-01:Hotfix SOP 正式培訓(V2 新增,Week 1)
負責人:David(主持)+ Sherridy + Ezou
背景:Hotfix SOP 是 Release Train 文化中的「緊急超車道」。沒有設計好的超車道,每次緊急情況都會變成特例討論,消耗 RM 的信任資本。Month 1 已建立 Hotfix 基礎環境(Label + Channel),Month 3 Week 1 進行正式培訓,讓全員知道觸發條件和各自責任。
Hotfix SOP 完整設計(30 分鐘培訓):
[Hotfix 觸發條件]
PO 判定為 P0 Bug(David 或 Ezou,兩人其一即可)
PO 判定 P0 Bug 的主要參考指標:
- Crash-free session rate < 99.0%(Firebase Crashlytics)
- 付費功能(訂閱購買、Forest 幣)出現中斷報告
- 影響 > 10% 用戶的核心功能失效(例:計時器不啟動、通知完全失效)
[授權人]
PO(David 或 Ezou,兩人其一即可,不需要兩人都同意,確保緊急時決策速度)
[Hotfix 執行 5 步驟]
Step 1:Firebase Alert 觸發 → MTTR 計時開始
→ 自動推送到 Slack <span class="tag">release-monitor</span>
→ RM 識別觸發情況,通知 PO
Step 2:PO 判定並授權 Hotfix
→ PO(David 或 Ezou)確認觸發情況,判定是否為 P0 Bug
→ PO 在 Slack 發出 Hotfix 啟動通知(文字記錄,作為授權依據)
→ RM 接收通知,開始協調後續執行流程
Step 2b:建立 Hotfix Issue
→ Issue Title:[Hotfix] [問題描述]
→ 加 Label:[Hotfix](紅色)
→ Priority:Urgent(Automation 自動設定)
→ Assignee:最資深 RD(由 Ezou 指派)
→ 建立獨立 Hotfix Cycle:命名「Hotfix-[版本號]-[日期]」(如 Hotfix-v5.8.1-2026-03-15)
Step 3:快速修復
→ RD 建立 Hotfix 分支(命名:hotfix/vX.X.X,從 main 切出)
→ 修復完成後,PR 直接合併到 Main Branch(不需等 Feature Freeze)
→ 只需 RD Lead(Ezou)代碼審查,不需要 PO Review
Step 4:QA 快速回歸測試
→ 目標:2 小時內完成
→ 測試範圍:核心功能(計時器/種樹)+ Hotfix 相關功能
→ 使用 [Priority: Urgent] Label,可在 QA 批次視窗外即時處理
Step 5:發版
→ RM 決定 Patch Release(如 v5.8.1)或 Minor Release
→ Shawn 送審:
- Android:Google Play 分級發布(通常 2-4 小時審核)
- iOS:App Store 審核(通常 24-48 小時;緊急情況可申請 Expedited Review 縮短至數小時)
→ 發版後在 <span class="tag">release-hotfix</span> 公告
→ 在 Hotfix Issue Comment 記錄 MTTR:
「MTTR:從 Firebase Alert [時間戳] 到 App Store 發版 [時間戳] = [X 小時]」
[Android vs iOS Hotfix 差異]
Android:Google Play 的分級發布更新,通常 2-4 小時審核
iOS:App Store 審核通常 24-48 小時
緊急情況:申請 Expedited Review(在 App Store Connect 送審說明中說明緊急原因)
短期緩解(未完全 Hotfix 前):若有 Feature Flag,可使用 Server-side Kill Switch
[Hotfix 文化說明]
Hotfix 是例外通道,不是常規流程。
使用頻率過高(月 > 2 次)是需要改善測試流程的信號,而非調整 Hotfix SOP。
完成條件:
- 30 分鐘培訓完成,所有與會者知道自己的 Hotfix 角色
- 在 Linear 建立 Hotfix SOP 文件(存在對應 Project Document 中)
- 全員確認已加入 release-hotfix Channel
期限:Month 3 Week 1
M3-02:全員培訓(Week 1-3 分批執行)
負責人:David(主持)
Week 1:Shawn + Sherridy 深度培訓(含 Hotfix SOP)
培訓內容:
1. Phased Release 監控操作(Shawn 主要新增責任)
2. Firebase Crashlytics 查看方式(Shawn)
3. Hotfix SOP 實際演練(Shawn 作為送審人的角色)
4. App Store Expedited Review 申請流程(Shawn)
5. 掉車 SOP 回顧 + 掉車自動化說明(第 3 次起不需確認)
6. Cycle 回顧指標格式(Sherridy + Shawn 共同確認)
Week 2:QA 培訓(Fei Chen + Jimmy)
培訓內容:
1. 三方確認機制完整說明(PO + RD + QA 三方,非雙向強制)
2. QA 批次視窗進階操作(如何處理 Urgent Label 插隊)
3. Hotfix 快速回歸測試的範圍界定(核心功能 + Hotfix 相關功能)
4. iOS vs Android 版本確認差異
5. 回測計數格式:「[回測 N] 問題描述」Comment 格式
Week 3:翻譯 Gate + 發布流程
培訓內容:
1. Feature Freeze + String Freeze 完整操作說明(兩個截止點的關係)
2. Phased Release 監控 SOP(全員理解,Shawn 主責)
3. Firebase Alert → Slack 通知的自動化機制說明
4. n8n Feature Freeze 提醒升級評估(若技術條件允許)
期限:Month 3 Week 1-3
M3-03:掉車自動化確認(第 3 次起自動執行)
負責人:Sherridy(決策)+ David(記錄)
背景:V2 的精確化設計——「第 3 次掉車起自動執行」取代 V1 模糊的「第 3-5 次後評估」。
確認流程(Month 2 Sprint Review 中執行):
- David 呈現前 2 次掉車的執行記錄
- Sherridy 主持討論:「前 2 次掉車執行後,文化是否已接受?」
- 全員確認後,宣布第 3 次起採用「自動掉車,事後通知」模式
- 記錄確認結果在 Linear Project Comment
如果 Month 2 Sprint Review 中決定延長保守期:
- 再執行 1-2 次保守模式掉車
- 在 Month 3 Week 2 重新評估
期限:Month 3 Week 1(確認 Month 2 Sprint Review 的決定)
M3-04:第一次完整「列車準時發車」
負責人:Sherridy(Feature Freeze 決策)+ Shawn(送審)+ David(協調)
這是 V2 統整版的核心文化里程碑。
成功的 5 個條件:
- String Freeze 日期按時執行(沒有因文字調整壓力延後)
- Feature Freeze 日期按時執行(沒有因功能壓力推後)
- 至少有 1 個 Issue 掉車,且掉車決定在 Freeze 前完成(非臨時決定)
- 版本在預定日期提交 App Store / Google Play(沒有延誤超過 3 天)
- Crash-free Session Rate 在 Phased Release 7 天期間維持 > 98.5%(沒有觸發 Hotfix)
完成後的公告格式:
「v5.x.x 準時發車!
本次版本功能:[功能列表]
掉車功能:[Issue 編號 + 名稱](已排入 v5.x+1.x)
String Freeze 執行:[日期] ✅
Feature Freeze 執行:[日期] ✅
提交時間:[日期](預定時間 ✅)
Crash-free rate(Day 7):XX%(目標 > 98.5% ✅)
這是 Forest App 第一次真正執行「列車不等人」。
感謝每一位的配合。
下一班列車(v5.x+1.x)的 String Freeze:[日期]
下一班列車的 Feature Freeze:[日期]」
期限:Month 3 Week 3-4(配合版本發布節奏)
M3-05:Feature Freeze 提醒升級評估(n8n 方案)
負責人:David(技術評估)
背景:Month 1-2 使用 Google Calendar 手動提醒(替代方案 B)。Month 3 評估是否升級到 n8n 定時查詢(替代方案 A)。
評估條件:
- n8n 基礎設施已穩定運行(DORA Webhook 已在 n8n 上)
- David 有時間進行一次性配置(預估 2-4 小時工時)
n8n 方案設計(如選擇升級):
n8n Cron Job 設定:
執行頻率:每天 09:00(台北時間)
查詢:Linear API → 找出 48 小時內即將到來的 Milestone
判斷:Milestone 名稱包含「Feature Freeze」
動作:發 Slack 訊息到 <span class="tag">product-release</span>
Slack 訊息格式:
「📌 Feature Freeze 提前警告(自動通知)
Project:[版本名]
Feature Freeze 日期:[日期](還有 2 天)
以下 Issue 尚未 Ready for Test:[Issue 清單]
請 @sherridy 確認:
① 這些功能預計在 Freeze 前完成?
② 或需要啟動掉車 SOP?」
期限:Month 3 Week 2(評估);若決定升級,Week 3 完成設定
M3-06:DORA + 消費者 App 7 個指標首次完整評估
負責人:Sherridy(主持)+ David(數據收集)
完成條件:完成以下指標的 M3 實際數值,並與 M1 基線對比:
| 指標 | M1 基線 | M3 目標 | M3 實際 | 達標? |
|---|---|---|---|---|
| Lead Time | [待測] | ≤ 4 週 | ||
| Deployment Frequency | [待測] | 每 2 週一版本 | ||
| Change Failure Rate | [待測] | < 15% | ||
| MTTR(Firebase Alert 起算) | [待測] | < 3 天 | ||
| Crash-free Session Rate | [待測] | > 98.5% | ||
| Testing Notes 填寫率 | 0% | > 90% | ||
| 版本準時發車率 | [待測] | 第 1 次成功 |
期限:Month 3 Week 4
Month 3 成功指標
| 指標 | 目標值 | 驗收方式 |
|---|---|---|
| Hotfix SOP 培訓完成 | 全員知道角色和觸發條件 | 培訓記錄 |
| 所有角色每週 Linear 登入率 | > 80% | Linear 活躍用戶統計 |
| DORA Lead Time | ≤ 4 週 | M3-06 指標評估 |
| DORA Change Failure Rate | < 15% | M3-06 指標評估 |
| DORA MTTR | < 3 天 | Firebase + Linear 記錄 |
| Crash-free Session Rate | > 98.5% | Firebase Crashlytics |
| Testing Notes 填寫率 | > 90% | 每週追蹤數據 |
| 第一次完整列車準時發車 | 1 次成功 | M3-04 完成條件 |
| 掉車自動化確認(第 3 次起) | 已確認 | Sprint Review 記錄 |
Month 3 末文化里程碑
- Level 5 達成:完整 Feature Freeze 文化(String Freeze + Feature Freeze + 掉車自動化)
- Hotfix SOP 已知但未必觸發(有超車道,比沒有更重要)
- QA 批次視窗已是自然的工作節奏,不再需要刻意維護
- 第一個完整列車準時出發,數據可量化
7 個成功指標追蹤總覽
| 指標 | 類型 | 開始追蹤 | Month 2 目標 | Month 3 目標 |
|---|---|---|---|---|
| Lead Time | DORA | M1 基線 | 不惡化 | ≤ 4 週 |
| Deployment Frequency | DORA | M1 基線 | 維持節奏 | 每 2 週一版本 |
| Change Failure Rate | DORA | M1 基線 | 不惡化 | < 15% |
| MTTR(Firebase Alert 起算) | DORA | M1 末起 | 建立計算起點 | < 3 天 |
| Crash-free Session Rate | 消費者 App | M1 末基線 | > 98.5% | > 98.5% |
| Testing Notes 填寫率 | 消費者 App | M2 起追蹤 | > 80% | > 90% |
| 版本準時發車率 | 消費者 App | M3 起 | — | 第 1 次成功 |
角色責任矩陣
| 任務 | David | Sherridy | Shawn | Ezou | Fei Chen | Jimmy | RD |
|---|---|---|---|---|---|---|---|
| Linear 環境建置 | 主責 | 審核 | — | 協助 | — | — | — |
| Feature Freeze 決策 | 操作 | 主責 | 意見 | 意見 | — | — | — |
| String Freeze 決策 | 紀錄 | 主責 | MKT 協調 | — | — | — | — |
| 掉車 SOP 執行 | 操作 | 決策 | 意見 | 意見 | — | — | 評估 |
| 去污名化 Workshop | 主持 | 承諾 | — | 扮演 | 參與 | — | 參與 |
| QA 批次視窗 | 視圖設定 | 例外批准 | — | — | 主責 | 主責 | 了解 |
| Hotfix SOP 執行 | 協調 | 授權 | 送審 | 授權 | 快速回歸 | — | 修復 |
| DORA 指標追蹤 | 數據收集 | 主持回顧 | — | — | — | — | — |
| Firebase 監控 | 設定 | 知情 | 日常監控 | 備援授權 | — | — | — |
回退計劃
以下任何一個條件觸發時,啟動回退討論(David + Sherridy 決策):
| 觸發條件 | 回退動作 |
|---|---|
| DORA 任一指標惡化 > 20%(對比 M1 基線) | 停止擴展,召開 30 分鐘緊急診斷會議 |
| Android ALPHA 通知連續失效 > 2 次 | 暫停 Android Automation,回到手動通知,調查 CI/CD 設定 |
| Crash Rate 在 Phased Release 超過 1.5% | 啟動 Hotfix SOP;若 Hotfix 無法快速完成,考慮暫停 Phased Release |
| Testing Notes 填寫率連續 2 個 Cycle < 60% | 召開說明會,評估 PR Template 是否有效 |
| 去污名化 Workshop 後仍有嚴重掉車文化阻力 | 暫停強制掉車,回到「軟性 Feature Freeze」(記錄但不強制移除 Issue) |
| QA 批次視窗造成 Issue 積壓(待測 Queue > 10 個) | Sherridy 評估是否增加批次頻率或臨時增加 Urgent 處理 |
消費者 App 業界參照里程碑
| 業界參照 | 對應 Forest App 里程碑 | 所在月份 |
|---|---|---|
| Duolingo:String Freeze 文化 | String Freeze 試水成功 | M1 末 |
| Todoist:Feature Freeze 首次執行 | Feature Freeze 第一次執行 | M2 W1-2 |
| Duolingo:去污名化設計(掉車不等於失敗) | 去污名化 Workshop | M2 W1 |
| Headspace:Hotfix SOP 正式化 | Hotfix SOP 培訓 | M3 W1 |
| Todoist:批次 QA 窗口 | QA 批次視窗機制 | M2 W1 |
| Duolingo:Release Train 完整運作 | 第一次列車準時發車 | M3 W3-4 |
相關文件:04-環境建置指南(統整版V2) | 05-團隊導入策略(統整版V2)
linear 路線圖 統整版V2 ReleaseTrain 掉車SOP 測試注意事項 DORA StringFreeze HotfixSOP QA批次視窗