Day 4 建立了規格卡:一句話任務、輸入輸出、範圍、護欄與成功標準。今天不再談抽象原則,直接把演唱會購票安全檢查 skill 的需求寫完整。目標是讓明天開始實作時,每一個檔案都有理由,每一個結果都能驗收。
這支 skill 的價值不是「看起來懂售票」,而是穩定回答一個窄問題:使用者提供的網址,是否屬於我們有證據確認的官方售票管道?
成功標準有四條:
ticket-guard
檢查使用者提供的演唱會售票網址,判斷其域名是否命中已驗證的官方來源,並用固定格式回報結果與證據。
當使用者:
不因為只出現「演唱會」或「門票」就觸發。使用者若只是問活動日期、座位或票價,這不是本 skill 的工作。
至少一個可解析的完整網址,例如:
https://tickets.example.com/event/123
可以同時接受使用者的補充文字,例如「這是朋友傳給我的」。補充文字能提供背景,但不能取代網址證據。
在比對前必須:
tickets.example.com 與 example.com 的授權範圍可能不同。第一版只使用版本庫裡的 references/sources.md。每筆官方來源至少包含:
模型記憶、搜尋摘要、頁面長得像官方網站,都不能直接升級成官方來源。新增清單項目必須有可追溯的官方證據。
結果只能是三種:
OFFICIAL:host 或規格允許的子網域規則命中已驗證清單。UNCONFIRMED:未命中清單,或出現仿冒風險訊號,但證據不足以斷言詐騙。INSUFFICIENT_INPUT:缺少完整網址,或網址無法解析。第一版不提供 SCAM 類別。沒有調查與法律層級的證據,skill 不應直接指控。
流程順序固定,避免不同執行產生不同答案:
官方清單比對必須由確定性腳本完成,不交給語言模型自由判斷。模型負責解釋結果,不負責改寫分類。
未命中官方清單時,可以檢查:
命中風險訊號仍然只回報 UNCONFIRMED,並列出觀察到的訊號。訊號是提醒,不是定罪。
status: OFFICIAL | UNCONFIRMED | INSUFFICIENT_INPUT
checked_url: 使用者提供的完整網址
normalized_host: 正規化後的 host,無法解析時為 null
evidence:
- 命中的來源紀錄或風險訊號
next_step: 建議的下一個安全步驟
給人的回答可以是自然語言,但必須忠實映射這五個欄位。不能把 UNCONFIRMED 改寫成「看起來沒問題」。
輸入:清單裡的官方 host。
預期:OFFICIAL,回傳對應紀錄與驗證日期。
輸入:同一 host,但混用大寫或帶結尾點。
預期:正規化後仍穩定命中。
輸入:與官方域名只差一個字元。
預期:UNCONFIRMED,列出相似域名訊號,不使用「確定詐騙」。
輸入:official-name.example.net,但真正官方根域名不是 example.net。
預期:UNCONFIRMED,不能因子網域含官方名稱而放行。
輸入:沒有完整網址。
預期:INSUFFICIENT_INPUT,只要求補完整連結。
輸入:官方網址加上「幫我買兩張」。
預期:只完成來源分類,清楚說購買不在此 skill 範圍。
第一版需求完成的條件不是「寫出一份 SKILL.md」,而是:
這份需求已經替實作做了幾個決定:需要一份 SKILL.md、一份 references/sources.md、一支域名檢查腳本,以及之後可重用的測試案例。沒有任何檔案是因為「skill 通常長這樣」才出現,而是由需求推導出來。
Day 6 開始動手:建立目錄骨架與第一版 SKILL.md,讓今天的需求第一次變成可執行流程。