break-down-course-goal 是做什麼的?
將客戶的 inputs.json 轉換為 tree.json:一棵以課程目標為根節點的能力樹,其中每條邊代表「子節點是參與者為了讓父節點發生,而必須能夠與 Claude 共同完成的事項。」
此技能的設計選擇:證據向上。 此方法並非從頂端向下分解目標。它從標準與每週目標出發,問的是當每個目標達成時,必須可觀察到什麼,以及參與者必須做什麼才能產生該證據,然後從這些動作逆向推回目標。目標是最後才串聯的,而不是最先拆分的。邊的含義完全相同;只有建構順序不同。
輸入與輸出
- **執行資料夾:**由使用者指定。所有讀寫操作皆在此資料夾內進行。
- 讀取:
<run>/inputs.json(schemah0-inputs/1)。客戶事實僅來自此檔案。不讀取任何其他關於客戶的資料。 - 寫入:
tree-A.json、tree-B.json、tree-C.json、tree-pitches.md;選定後寫入tree.json、skills-list.md並在decisions.md中新增一行記錄。 - 閘門: 在包含
schemas/的資料夾中執行python schemas/validate.py h1 <run>/tree-X.json --inputs <run>/inputs.json必須輸出PASS。修正並重新執行直到通過。若無法達成PASS,則停止並回報剩餘錯誤;絕不提交未通過的檔案。 - 指令碼(位於此技能的
scripts/中,全部以 UTF-8 寫入):order_leaves.py <tree.json>:根據節點計算leaf_order並寫入檔案。絕不手動撰寫leaf_order。render_leaves.py <tree.json> [<out.md>]:將leaf_order渲染為編號的葉節點清單skills-list.md。絕不手動撰寫該清單。pick.py <run> <A|B|C> ["reason"]:將選定的版本複製為tree.json並附加記錄到decisions.md。
方法(A 版:證據向上)
依照此順序進行。過程中保留一份草稿清單;僅有樹本身會被寫入檔案。
步驟 0. 整理輸入
- 將
goal完全複製到樹的goal中。 - 將每個
constraints項目分類到以下兩堆之一:- 約束樹:關於資料(來源、讀寫)或範圍(包含或不包含的內容)。在步驟 2–4 中使用。
- 交付:關於時間、長度、課程次數、格式、排程。將其放入
set_aside,並完全複製該約束,加上一行說明原因(「交付限制;此樹僅關於能力」)。它絕不會塑造、調整大小、拆分或合併任何節點。
- 將
presenter_owned(若有)視為背景資訊。這些永遠不是節點,且任何節點不得要求參與者執行這些事項。 - 在建構之前,立即列出詞彙表中的問題:
- 每個以
UNRESOLVED或PROVISIONAL開頭的詞彙值 → 一個undefined_term缺口,即使目標未使用該詞彙; - 目標、每週目標、標準或約束中出現,但詞彙表未定義且樹依賴其定義的任何詞彙(例如:什麼算作一個要檢查的單位、資料檔案的格式為何)→ 一個
undefined_term缺口。 請勿自行定義任何此類術語。當某個節點依賴於某個未定義術語時,請措辭使該節點在沒有定義的情況下仍可運作,並註明該缺口。
- 每個以
步驟 1. 記錄證據
對於每個標準:其證據就是 pass_if,按字面解讀。寫下一行:「可觀察到:<pass_if>,由 產生,來自 。」
對於每個每週目標:寫下若達成該目標,他人可以看到什麼(產品、記錄、可見的變化)。如果目標是關於信心或舒適度且沒有產品,則指出能夠顯示該狀態的最小可見行為(例如:「參與者自行提出後續要求後,存在一個修訂版本」)。
步驟 2. 為每條證據命名產生它的動作
對於每條證據行,問:「參與者與 Claude 一起做了什麼,而留下了這個證據?」 將其寫成帶有受詞的命令式動作(「產生……」、「標記……」、「要求 Claude……」),絕對不要寫成主題(「提示工程」、「資料素養」)。
- 如果兩條證據行由同一個動作產生,則它們共用一個動作。
- 每個不同的動作成為一個頂層節點(根節點的子節點),並設定
serves,列出其證據所服務的每個每週目標和標準 ID。 - 覆蓋率檢查:輸入中的每個
W和CID 必須至少出現在一個頂層的serves中。如果某個每週目標的證據實際上是在另一個動作內部產生的(其較小版本),則該頂層動作也服務於它,且較小的動作成為其後代。 - 如果兩個頂層動作彼此依賴(一個需要另一個的產出),則用
prereqs連結它們,而不是巢狀嵌套。
步驟 3. 從每個動作逆向推導
對於每個節點,問:「在這件事發生之前,他們必須能夠與 Claude 一起做什麼?」 每個新的答案成為一個子節點。
- 只有與 Claude 一起完成的動作才是子節點。向 Claude 提問算在內,判斷、檢查或根據 Claude 的輸出採取行動也算(這是參與者負責的一半工作)。既未涉及 Claude 也未涉及 Claude 輸出的步驟(操作其他工具、發送東西)則不是節點:它要麼由設定檔或領域知識涵蓋,要麼是一個缺口(「輸入未說明誰/如何……」)。
- 如果答案已經是其他地方的節點,則用
prereqs連結它,而不是重複複製。 - 多個兄弟節點共有的先決條件應放在它們的最低共同父節點之下,而不是放在某個兄弟節點的分支內;否則兄弟節點的
prereqs指向需要它的分支時,order_leaves.py會報告為循環。 - 僅按此問題進行拆分。絕不為了配合課程、實驗室、時間或任何教學方式而拆分、合併或調整節點大小。
步驟 4. 在底層停止並記錄
當步驟 3 的問題不再產生新答案時,停止拆分該節點。該節點即為葉節點,並獲得 floor:
profile:參與者設定檔已涵蓋之前的部分(引用或改寫哪個設定檔欄位)。domain_knowledge:這是參與者自身工作的常識,且在輸入中有說明(說明出處)。inputs_stop:輸入中沒有任何資訊能讓您進一步深入(說明缺少什麼,若重要則新增一個缺口)。 當唯一剩下的先決條件是現有的節點時,它們在prereqs中;選擇能夠解釋為什麼沒有新的先決條件的原因,並在detail中說明「其餘先決條件已是現有節點:……」。
步驟 5. 資料與 Claude 聲明
- 資料。 任何需要資料的節點都應有
data條目:what,以及source(取自輸入):live、read-only(真實資料,僅讀取從不寫回;絕不憑空發明)、sample或own(參與者自己的)。在quote中完全複製說明資料來源的輸入句子。若輸入未說明資料來源,使用UNRESOLVED,省略quote,並新增一個data_provenance缺口,指明該節點。 - 聲明。 任何假設 Claude 產品能做某事(例如讀取附件、應要求修改、指向來源行)的節點,都應有
claims條目並帶verify: true,除非您引用目前文件的 URL 來證明該能力(此時使用cite而非verify)。兩者不可並存。
步驟 6. 串聯目標
最後才建立根節點:parent: null,skill = 將目標重新表述為參與者的動作,無 serves,無 floor。將每個頂層節點指向根節點。節點從 N1(根節點)開始向上編號。檢查:
- 除根節點外,每個節點都有父節點;葉節點有
floor,非葉節點則無;僅有根節點的子節點有serves; - 任何
skill中都沒有時間、格式或排程相關的詞彙。
步驟 7. 排序、閘門檢查、渲染
python <skill>/scripts/order_leaves.py <run>/tree-A.json(設定leaf_order;若遇到循環則失敗,代表需要修正prereqs的迴圈)。- 對
tree-A.json執行閘門檢查直到顯示PASS。 - 將步驟 0、3、4 和 5 中的所有問題填入
gaps。缺口會回報,但不會被填補。
三個版本
每個執行都會從相同的 inputs.json 和相同的 schema 產出三個通過閘門的樹。B 版和 C 版來自各自獨立的新子代理(絕非分支),每個僅獲得其下方簡報、執行資料夾路徑、此技能的 scripts/ 路徑以及閘門指令。若平台沒有子代理功能,請自行撰寫 B 和 C 版,並在 tree-pitches.md 頂端加上這句話:「B 版和 C 版是由同一個模型扮演的,而非獨立執行。」
B 版簡報(替代設計選擇:目標向下分解)。
「僅讀取 <run>/inputs.json。透過從頂端向下分解目標來建構 <run>/tree-B.json(schema h1-tree/1):將根目標拆分為其組成的動作,然後持續拆分每個動作,直到問『在這之前他們必須與 Claude 一起做什麼?』不再產生新答案為止(然後記錄 floor)。邊的含義:子節點是參與者為了讓父節點發生而必須能夠與 Claude 一起完成的事項。每個根子節點宣告 serves;每個 W 和 C ID 都必須被服務。技能是動作,不是主題。交付限制(時間、長度、格式)放入 set_aside 並附上原因;資料限制約束樹;主持人擁有的項目永遠不是節點。資料來源僅來自輸入,並完全引用輸入中的句子,否則使用 UNRESOLVED 加上缺口。回報每個 UNRESOLVED/PROVISIONAL 詞彙術語及每個未定義的術語為缺口;絕不自行定義。Claude 產品聲明帶有 verify: true。執行 scripts/order_leaves.py 設定 leaf_order,然後執行閘門檢查直到輸出 PASS。回傳一句話為您的版本辯護,需說明設計選擇。」
C 版簡報(反對派 / 事實查核員)。
「僅讀取 <run>/inputs.json 和 <run>/tree-A.json。攻擊 A 版的前提:對於每個節點,問它是否真的是與 Claude 一起完成的事項,是否是其父節點所需,以及其證據是否能由其作者以外的人檢查。根據目前文件(docs.claude.com, support.claude.com)查核每個關於 Claude 產品的聲明;對無法確認的內容保留 verify: true,對可以確認的內容引用 URL。移除無法驗證或無法衡量的內容,將重複項合併到 prereqs 中,並提出更精簡或更安全的樹。保持相同的 schema、邊的含義和規則:每個 W 和 C ID 都被服務,動詞而非主題,葉節點有 floor,交付限制放入 set_aside,資料來源引用自輸入或使用 UNRESOLVED 加上缺口,未定義的術語回報而不定義。撰寫 <run>/tree-C.json,執行 scripts/order_leaves.py,然後執行閘門檢查直到 PASS。回傳一句話為您的版本辯護。」
簡報、選定、記錄
- 撰寫
<run>/tree-pitches.md:每個版本一行,A — <一句話>、B — …、C — …,每個都說明其設計選擇。沒有版本標記為推薦。您可以指出任何版本中的事實錯誤;但您不投票。 - 由主持人選定。執行
python <skill>/scripts/pick.py <run> <A|B|C> "<reason given, if any>"。在提出之前,請先讀取decisions.md(若存在),以免提出已遭拒絕的提案。 - 再次對
tree.json執行閘門檢查,然後執行python <skill>/scripts/render_leaves.py <run>/tree.json→<run>/skills-list.md。
回報(給使用者,在每次執行結束時)
- 已寫入的檔案;
- 每個版本的閘門輸出;
- 每個缺口(未定義的術語、資料來源問題等),如樹中所列;
- 每個被擱置的限制及其原因;
- B 版和 C 版是獨立子代理還是角色扮演。
發明範例(通用,非來自任何客戶)
目標:「每個志工組織者使用 Claude 將報名表轉換為班表,並針對每班次與報名表進行比對。」標準:pass_if: 每位組織者有一個已修正的班次,以及與其比對的報名表列。
- 步驟 1 證據:「存在每位組織者的一個已修正班次以及與其比對的報名表列。」
- 步驟 2 動作(頂層,服務於該標準):「將每個班次與報名表進行比對,修正任何報名表不支援的班次,並記錄該列。」
- 步驟 3 逆向步驟:「要求 Claude 顯示每個班次所對應的報名表列」(與 Claude 一起)→ 子節點。「打開報名表」(未與 Claude 一起)→ 不是節點;設定檔或缺口。
- 步驟 4 葉節點的 floor:「判斷一個列是否支援一個班次」:
domain_knowledge,因為組織者已經在運行報名流程。