給 comeshop-ai watch 監控指向的靜態目標:50 個 use case、281 條驗收條件,每條一頁。
這些是靜態檔,用任何靜態伺服器起來即可:
cd testings/2026-09-05 && python3 -m http.server 8787
每一案先觀測 <案號>/index.html 取得基準,再把監控指向該案的某一條 <案號>-AC-0N.html。兩份都是靜態的,所以差異是決定性的——重跑幾次結果都一樣,這正是驗證變動偵測需要的性質。
每一頁都寫了「應該發生什麼」與「平台必須不做什麼」。多數條目的重點在後者:五十條裡有十一條是在測「讀不到的時候不准說沒有變動」,那是本平台最容易安靜出錯的地方。
結構化來源的觀測方式用同名的 .json;抓頁面的用 /jsonld/0/observed/… 這個 JSON pointer。
做得到:回應的內容——HTTP 200 卻沒有價格、空的 JSON、被付費牆擋住的正文、標題裡的注入字串、超出量綱的數值。
做不到:回應的狀態碼與標頭——429 加 Retry-After、403、逾時、簽章無效。這些要靠能控制回應的伺服器或 stub,靜態檔只能提供那一刻的 body。相關頁面上會明說。
上面五十條驗收假設抓一次就拿得到值。真實網站多半不是——而它們失敗的方式各不相同:
| 登入牆(4 頁) | 內容藏在 session 後面。牆是穩定的,所以「有讀到東西」會被誤當成「讀到了那個東西」,於是永遠回報沒有變動。含一個給流程腳本走的真實表單。 |
|---|---|
| 動態內容(3 頁) | 值由 React 或腳本在載入後寫入。抓取拿到空的 #root,而空殼的雜湊也是穩定的雜湊。含延遲渲染與水合不一致。 |
| URL 與特殊字元(4 頁+對照表) | 有時候變的不是內容而是位址,有時候位址看起來變了其實是同一個東西。追蹤參數、canonical、轉址、路徑編碼,加上十種建立監控時該被拒絕的 URL 形式。 |
| 極端值(6 頁+3 個 JSON) | 數值、文字、惡意內容、形狀、時間、金額。這一組不會讓平台安靜出錯,會讓它大聲出錯——而錯的值比缺席的值更危險,因為錯的值會被拿去行動。 |
驗收條文由建置時讀自規格文件——規格改了,這些頁會跟著改。
一份廠商弱點公告。CVSS、EPSS、KEV 與修補期限都是可觀測欄位。
存取 public 審查 professional_review 0 個必要欄位 5 條驗收
一個需要授權才看得到的物流追蹤頁。用來測試已授權來源與 PII 最小化。
存取 authorized 審查 professional_review 0 個必要欄位 5 條驗收
一個市集搜尋結果頁。這裡的產出是「指控」,所以整案都是候選加人工審查。
存取 public 審查 professional_review 0 個必要欄位 5 條驗收
一個公司申報清單。只有「指定的 Item」變動才算數。
存取 public 審查 professional_review 0 個必要欄位 5 條驗收
一個服務狀態頁。C2 節奏——事故要快,所以觀測頻率高。
存取 mixed 審查 professional_review 0 個必要欄位 5 條驗收
一個標案公告頁。deadline 與附件的變動都要通知,時區不能算錯。
存取 mixed 審查 professional_review 7 個必要欄位 5 條驗收
一個法院 docket 查詢頁,模擬同一案件由 RSS、CourtListener API 與 RECAP 三個來源同時可查到,用來測試多來源去重、時區換算與受限文件的存取邊界。
存取 public 審查 automatic 11 個必要欄位 5 條驗收 條文為引用 extremes
一個股票/ETF watchlist 儀表板,價格由 JS 動態更新,新聞欄位另外標示發布與接收時間,用來測試 crossing 語意、來源延遲與訊號衝突。
存取 public 審查 automatic 11 個必要欄位 5 條驗收 條文為引用 extremes dynamic
一個網域 owner 已完成驗證才看得到的資安 breach exposure 頁面,用來測試驗證邊界、IDN/punycode 正規化與 PII 最小化。
存取 public 審查 automatic 9 個必要欄位 5 條驗收 條文為引用 gated urls
一個模擬電商 checkout 流程的多步驟頁面,包含登入、購物車與付款前確認,用來測試 stop-before-mutation 與跨地區 quorum。
存取 public 審查 automatic 9 個必要欄位 5 條驗收 條文為引用 gated dynamic
一個航班搜尋結果頁,同時呈現含稅/未稅、幣別與行李政策等條件,用來測試跨來源票價比較的口徑一致性。
存取 public 審查 automatic 8 個必要欄位 5 條驗收 條文為引用 extremes
一份主管機關公告頁,呈現條文版本、生效日與 proposed/final 狀態,用來測試純排版 diff 與法律審查邊界。
存取 public 審查 automatic 9 個必要欄位 5 條驗收 條文為引用 extremes
一個演唱會售票頁,座位區與價格會動態變化,包含 queue、CAPTCHA 與追加費用等情境,用來測試不搶票、不繞過 queue 的邊界。
存取 public 審查 automatic 10 個必要欄位 5 條驗收 條文為引用 dynamic extremes
一個商標檢索結果頁,包含近似文字、Unicode 混淆字元與跨租戶查詢情境,用來測試法律候選與相似度門檻。
存取 public 審查 automatic 9 個必要欄位 5 條驗收 條文為引用 urls extremes
一個已登入才看得到的航班行程追蹤頁,呈現已訂票旅客的即時航班狀態,用來測試 codeshare、時區與 consent 撤回邊界。
存取 public 審查 automatic 8 個必要欄位 5 條驗收 條文為引用 gated extremes
一個商品頁,包含多個 variant、賣家與運費稅金組合,URL 含有查詢參數與重複網址情境,用來測試真正可購買性與極端金額。
存取 public 審查 automatic 10 個必要欄位 5 條驗收 條文為引用 urls extremes
一個藝人官方網站的行程/預售頁,JS 動態渲染場次列表;同一場次也出現在授權售票頁與粉絲私人帳號轉貼中。
存取 public 審查 automatic 10 個必要欄位 6 條驗收 條文為引用 dynamic urls
一個 WIPO PATENTSCOPE 風格的公開檢索頁,含 publication、applicant 與 classification 欄位。
存取 public 審查 automatic 10 個必要欄位 5 條驗收 條文為引用 extremes urls
一個航運儀表板,JS 動態渲染 port congestion 與 ETA;同一港口在兩個資料商的儀表板上編號不同。
存取 public 審查 automatic 9 個必要欄位 6 條驗收 條文為引用 extremes dynamic
一個 grants.gov 風格的補助搜尋頁,deadline 以來源時區顯示,並附申請文件附件清單。
存取 public 審查 automatic 12 個必要欄位 5 條驗收 條文為引用 urls extremes
一份自有 API 的 OpenAPI 文件與 changelog 頁,schema hash 與 rate limit 都是可觀測欄位。
存取 public 審查 automatic 10 個必要欄位 6 條驗收 條文為引用 gated urls
一份 NWS CAP 風格的官方警報 feed,geometry 為 polygon,與設施 geofence 相交才有意義。
存取 public 審查 automatic 10 個必要欄位 7 條驗收 條文為引用 dynamic extremes
一個授權運動資料頁,需登入才能看到完整 lineup/injury 明細;比賽開始前更新最頻繁。
存取 public 審查 automatic 10 個必要欄位 6 條驗收 條文為引用 gated dynamic
一個 ClinicalTrials.gov 風格的官方 registry 頁面,protocol 文件與 eligibility 文字都是可觀測欄位。
存取 public 審查 automatic 8 個必要欄位 5 條驗收 條文為引用 urls extremes
一個求職平台的職缺搜尋結果頁,SPA 動態渲染,薪資與 remote 用語常見不一致。
存取 public 審查 automatic 10 個必要欄位 5 條驗收 條文為引用 dynamic gated
一個 App Store Connect 風格的評論管理頁,評分、關鍵字與 volume 都是可觀測欄位。
存取 public 審查 automatic 11 個必要欄位 5 條驗收 條文為引用 extremes gated
一個跨平台的收藏品搜尋結果頁:同一款球鞋或卡牌在多個 marketplace 都可能出現,含 variant、grade、賣家分數與含運總價。
存取 public 審查 automatic 11 個必要欄位 6 條驗收 條文為引用 urls extremes
一個私募公司側寫頁:融資、併購、管理層與公開申報訊號都在頁面上,供 PE/VC/BD 研究,不作投資結論。
存取 public 審查 automatic 12 個必要欄位 6 條驗收 條文為引用 urls extremes
一個房產搜尋結果頁:listing、parcel 公開紀錄與法拍公告都在頁面上,用 polygon geofence 篩選,不作估價或交易。
存取 public 審查 automatic 12 個必要欄位 6 條驗收 條文為引用 extremes urls
一個供應商 Trust Center/SLA 文件頁:條款、價格、subprocessor 與 SLA 數字都可能改變,變更需路由給法遵責任人。
存取 public 審查 automatic 10 個必要欄位 6 條驗收 條文為引用 dynamic gated
一個 GitHub repository 的 release/advisory feed:版本、安全公告與 breaking change 供 release manager 建立分組 migration task。
存取 public 審查 automatic 12 個必要欄位 6 條驗收 條文為引用 urls extremes
一個二手車搜尋結果頁:車型、年式、里程與 VIN 都在頁面上,跨市場比對車源但不評估車況。
存取 public 審查 automatic 11 個必要欄位 6 條驗收 條文為引用 extremes gated
一個翻新商品/替代品頁面:庫存狀態由前端 JS 渲染,需要兩次以上觀測才能確認真的補貨,而不是短暫快取命中。
存取 public 審查 automatic 11 個必要欄位 7 條驗收 條文為引用 dynamic gated
一個餐廳訂位頁:桌位表由前端 JS 動態渲染,符合日期/時段/人數的空位出現時通知,但不自動訂位。
存取 public 審查 automatic 11 個必要欄位 7 條驗收 條文為引用 dynamic urls
一個 app store 搜尋結果頁:keyword 排名、featured 徽章與競品 metadata 都在頁面上,估算資料要標示信賴區間。
存取 public 審查 automatic 12 個必要欄位 7 條驗收 條文為引用 urls extremes
一個飯店房價比較頁:房型、取消政策、早餐與含稅總價由 JS 動態渲染,需 final recheck 後才能確認可 book。
存取 public 審查 automatic 12 個必要欄位 6 條驗收 條文為引用 dynamic gated extremes
一個交通營運者的路線狀態頁,同時對外提供 GTFS-RT 風格 feed;延誤秒數、停駛與恢復狀態都在頁面與 feed 裡。
存取 public 審查 automatic 14 個必要欄位 6 條驗收 條文為引用 dynamic extremes
一個官方消費品 recall 公告頁,商品識別碼、批號與地區範圍都是可觀測欄位。
存取 public 審查 automatic 15 個必要欄位 6 條驗收 條文為引用 urls extremes
一個新聞媒體的文章頁,含 RSS feed 與正文;標題、章節與內容雜湊都可觀測。
存取 public 審查 automatic 13 個必要欄位 6 條驗收 條文為引用 dynamic urls
一個預印本典藏庫的論文頁,版本歷程、撤稿狀態與作者資訊都在頁面上。
存取 public 審查 automatic 14 個必要欄位 6 條驗收 條文為引用 extremes urls
一個官方地震測報頁,含 GeoJSON 事件摘要;規模、深度與座標都可觀測。
存取 public 審查 automatic 13 個必要欄位 6 條驗收 條文為引用 dynamic extremes
一個官方匯率資料頁,含即期與歷史 fixing rate;幣別、日期與 revision 都可觀測。
存取 public 審查 automatic 12 個必要欄位 6 條驗收 條文為引用 gated extremes
一個創作者的頻道/podcast/newsletter 聚合頁,內容發布、贊助與品牌提及都可觀測。
存取 public 審查 automatic 13 個必要欄位 6 條驗收 條文為引用 dynamic gated
一個在地商家頁,加上公開許可公告;地址、營業時間、菜單與許可狀態都可觀測。
存取 public 審查 automatic 14 個必要欄位 7 條驗收 條文為引用 gated dynamic
一個學校招生頁,名額、文件、獎學金與截止時間都可觀測。
存取 public 審查 automatic 13 個必要欄位 6 條驗收 條文為引用 gated urls
一個診所公開預約頁,僅顯示科別、日期與時段空位,無登入、無病歷。
存取 public 審查 automatic 11 個必要欄位 7 條驗收 條文為引用 gated dynamic
前十案的驗收條文是建置時讀進來的:規格文件一改,這些頁面下次產生就跟著改,不會有人需要記得同步。
其餘 40 案的規格以散文寫在逐案章節裡,沒有可供索引的條號,所以那些頁面上的條文是抄來的,並且每一頁都這樣寫明、附上章節位置。抄來的條文會安靜地過期——這不是瑕疵被藏起來,是這批規格目前的形狀,寫在頁面上讓讀者知道該去哪裡對照。
這些目標是逐案寫的,而且應該如此:測試目標必須是某一個具體的商店、feed 或入口網站,否則沒有東西可以指向。
平台本身則相反——它必須在不知道這是哪一案的情況下服務任何目標,這一點由 watch/src/server/no-case-keyed-mappings.test.ts 強制執行。兩者不衝突:fixture 是資料,規則才不能逐案。