iT邦幫忙

2026 iThome 鐵人賽

DAY 29
0

Day 28 我把 needs-review 的規則對齊 Day 11 的 Schema。

那天的重點是:

不是每個 needs review 都代表同一種過期。

Target User、Problem、Goal 改了,會讓主要流程和功能規格需要重新檢查。

Platform 改了,除了主要流程和功能規格之外,也會讓專案限制和技術設定需要重看。

Usage Scenario 改了,只影響主要流程。

Project Constraints 內容改了,只影響技術設定。

前三條在 engine 層有測試。

Project Constraints 那條寫在 saveConstraints() 裡,Day 28 是用 browser test 守的。

但 Day 28 結尾我留了兩條 browser 層還沒守住的路徑。

今天先補其中一條:

Usage Scenario 編輯後,只讓主要流程需要重新檢查。

ClarifyBuild 是我這系列正在做的小工具:它會把一個模糊的產品 idea,透過幾站釐清流程,整理成 Project Specification,最後再組成 AI Coding Prompt。

今天沒有改產品程式碼。

只新增一條 browser regression。

npm test 從 37 條變成 38 條,全過。


為什麼 engine test 還不夠

Day 28 已經有一條 engine test:

usage scenario changes mark only target project user flow for review

它直接呼叫的是規則本身。

也就是把 usageScenario 這個變更原因直接傳進 markRequirementChangeNeedsReview(),確認結果是:

Target Project User Flow -> needsReview
Feature Specification    -> 不影響
Project Constraints      -> 不影響
Tech Stack               -> 不影響

Target Project User Flow 就是畫面上的「主要流程」。

這條測試很重要。

因為它鎖住的是產品規則。

但使用者不會直接呼叫 engine function。

使用者真正會做的是:

  1. 在 Specify 已經完成 setup
  2. 按「返回調整範圍」
  3. 展開「修改前面的需求」
  4. 修改 Usage Scenario
  5. 儲存
  6. 再按「確認範圍並繼續」
  7. 回到 Specify 看狀態

這一路中間會經過 UI 表單、事件 handler、資料更新、Scope confirmation、Setup Status render,以及 產生 Project Specification button 的 disabled 判斷。

engine test 只能證明規則函式本身是對的。

它不能證明 saveRequirementEdits() 真的把「使用情境改了」辨識成 usageScenario。

也不能證明 Setup Status 最後呈現的是正確的那四行。

所以 Day 29 補的是接線測試。

不是因為產品邏輯不夠多。

而是因為 Day 28 的產品邏輯已經夠明確,現在要確認它真的走得到使用者會走的那條路。


今天選哪一條

Day 29 開始前有兩個小方向。

第一條是 Usage Scenario:

從已完成 setup 的 draft 出發,回 Scope,修改 Usage Scenario,再回 Specify,確認只有主要流程需要重新檢查。

第二條是 Project Constraints:

在 Specify 重新按「確認專案限制」,內容不變,確認技術設定仍完成,產生 Project Specification 不會被鎖住。

兩條都小。

但我今天先選第一條。

原因是兩條缺的程度不一樣。

專案限制那條,Day 28 已經有一條 browser test 守「內容改了,會標技術設定」,缺的只是「內容沒改,不該標」那一半。

Usage Scenario 這條,連「改了,會標主要流程」這一半都沒有 browser test。

它不是只在 engine 裡多一個 case。

還牽涉到這段:

const nextUsageScenario = values.usageScenario.trim();
const currentUsageScenario = state.draft.requirements.usageScenario.value ?? "";
if (currentUsageScenario !== nextUsageScenario) {
  changedDimensions.push("usageScenario");
}

也就是說,browser test 要守的是:

使用者在「修改前面的需求」表單裡改了使用情境,程式真的會把它視為 Usage Scenario changed。

如果這條接線壞掉,engine 規則再正確也不會被用到。

所以 Day 29 先補它。

Project Constraints 內容不變的那條,我留給 Day 30。

剛好鐵人賽只有 30 天。

最後一天可以用它收束 Day 28 結尾列出的 browser 測試缺口。


測試從完成狀態開始

今天新增的測試叫:

browser usage scenario edits only mark target project user flow for review

它不是從空白 idea 開始跑完整流程。

而是沿用既有的 loadCurrentDraft() helper,直接載入一個已完成 setup 的 draft。

一開始先確認 Setup Status 的四項(主要流程、功能規格、專案限制、技術設定)都是完成,產生 Project Specification 可以按。

這個前置確認很重要。

因為今天要測的不是「還沒完成 setup 時不能產生 Project Specification」。

今天要測的是:

原本已經完成的 setup,因為 Usage Scenario 改了,所以只讓主要流程從完成變成需要重新檢查。

如果一開始不是完成狀態,後面就很難判斷到底是誰讓按鈕 disabled。


走一遍使用者真的會按的路

測試接著按 返回調整範圍 進入 Scope,展開 修改前面的需求,只改 Usage Scenario:

研究生在期末整理引用資料時打開產品。

這個欄位在 fixture 裡本來是空的,它是選填,所以這條實際上是從空白補填。

改掉既有內容,或把它清空,走的是同一個比較(currentUsageScenario !== nextUsageScenario)。

我今天沒有各寫一條。

其他 Target User、Problem、Goal、Platform 都不動。

按下儲存後,畫面會出現既有提示:

前段需求已更新,相關規格需要重新檢查。

這句提示對 Usage Scenario 來說說得太重。

它寫「相關規格需要重新檢查」,但下面的斷言是功能規格仍然完成。

文案我今天沒有動。

真正要確認的是回到 Specify 之後,Setup Status 怎麼變。

所以測試再按一次 確認範圍並繼續,回到 Specify。

對照起來是:

項目 改之前 改之後
主要流程 完成 需要重新檢查
功能規格 1 / 1 1 / 1
專案限制 完成 完成
技術設定 完成 完成
產生 Project Specification 可以按 被鎖住

按鈕被鎖住。

但是被鎖住的原因不是功能規格,也不是專案限制,更不是技術設定。

原因只有一個:

主要流程需要重新檢查。

測試也確認功能規格卡片仍然顯示完成:

功能規格:搜尋目前論文 完成

這一行是今天最重要的斷言之一。

因為 Usage Scenario 改了,產品最常被打開的情境可能會影響使用者怎麼走主要流程。

但它不應該直接宣告既有功能規格失效。


為什麼這不是小題大作

這條測試看起來很小。

甚至今天沒有改任何 production code。

但我覺得它是 ClarifyBuild 這種工具很需要的測試。

因為 ClarifyBuild 做的不是單純表單。

它中間有很多「狀態還在,但暫時不能算完成」的情況。

例如:

資料保留
但 needsReview = true
所以不能產生 Project Specification

這種狀態如果只看資料有沒有存在,很容易誤判。

主要流程還在。

功能規格還在。

技術設定也還在。

但其中某些資料已經不該被直接送給 Coding Agent。

Day 27 到 Day 29 其實一直在處理同一件事:

不要因為資料還存在,就假裝它仍然有效。

Day 27 是 Setup Status 不可以把結構合法但內容不完整的 draft 說成完成。

Day 28 是 needs-review 不可以把所有過期原因混在一起。

Day 29 則是確認這條細分後的規則,真的有走過 UI。


測試數字

今天只新增一條 browser test。

所以測試數量從 Day 28 的 37 條變成 38 條。

完整結果是:

npm test
tests 38
pass 38
fail 0

跟前幾天一樣,我的執行環境第一次跑完整測試時,browser tests 因為 local server 不能 bind 到 127.0.0.1 失敗。

放寬本機執行權限後,同一個 npm test 通過。

今天動的程式檔只有 test/browserFlow.test.js。

production source code 沒有變。


Day 30 要怎麼收

鐵人賽只有 30 天。

所以 Day 30 我不想再開一個大功能。

比較好的收束方式是補 Day 28 留下的另一條 browser regression:

Project Constraints 按了確認,但內容沒有變,Tech Stack 不能被標成 needsReview。

也就是確認:

專案限制:完成
技術設定:完成
產生 Project Specification 仍然可以按

這條剛好把 Day 28 的另一個產品判斷補完:

Project Constraints 內容改變才會讓 Tech Stack 需要重新檢查。

不是按一次確認就讓它過期。

還有一件 Day 28 留下的事:Setup Status 斷言的 helper。

我當時說「現在還可以忍」。

今天這條又加了兩組 Setup Status 斷言。

Day 30 補完最後一條,再決定要不要抽。

還有一條沒有測試:沒改內容就按 儲存前段需求,不該標記任何東西。

那條我不排進 30 天內。

Day 30 如果只做 Project Constraints 這一條,再寫一篇收束文,其實就很剛好。

三十天後,ClarifyBuild 不會是一個很大的產品。

但它至少有一個越來越清楚的邊界:

它不只幫你產出規格,也會在規格不該被產出的時候停下來。

Day 29 完成。

明天是最後一天。

再見。


上一篇
Day 28|不是每個 needs review 都代表同一種過期
下一篇
Day 30|不是按了確認,就代表內容改了
系列文
AI 寫不好,可能是我沒說清楚:30 天打造 ClarifyBuild,讓 Vibe Coding 從需求開始 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言