Community研究與資料分析github.com

jagp/break-down-course-goal

當需要將課程目標、每週目標及其成功標準(h0 inputs.json)拆解為參與者必須與 Claude 共同完成的能力樹(h1 tree.json)時使用。採用「證據向上」建構方式:從必須可觀察到的真實情況出發,逆向回推到目標。產出三個通過閘門的版本(A/B/C)、簡報與渲染後的葉節點清單。

break-down-course-goal 是什麼?

此技能專門用於將課程目標結構化為能力樹,其中每個邊代表「子節點是參與者為了讓父節點發生,而必須能夠與 Claude 一起完成的事項」。其獨特之處在於採用「證據向上」的設計方法:不是從目標向下分解,而是從成功標準與每週目標開始,先問「必須可觀察到什麼才算達成」,再逐步逆向推導出參與者必須執行的動作。這確保了能力樹完全以可驗證的結果為基礎,而非教學假設。 技能會從單一 inputs.json 檔案產出三個通過閘門的版本(A、B、C),各自採用不同的建構策略:A 版為證據向上(主要方法)、B 版採用傳統的目標向下分解、C 版則扮演事實查核者來挑戰 A 版的假設。產出包含 tree-A/B/C.json、tree-pitches.md(版本簡報)、最終選定的 tree.json、skills-list.md 以及 decisions.md 中的決策記錄。 技能支援透過驗證指令碼(validate.py)進行閘門檢查,並提供 order_leaves.py(計算葉節點順序)、render_leaves.py(產生葉節點清單)與 pick.py(選定版本)等輔助指令碼。所有資料來源僅來自 inputs.json,無定義的術語會回報為缺口而不自行填補。這特別適合需要嚴謹可追溯性與多版本比較的課程設計與 AI 代理輔助教學系統開發人員。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jagp/curriculum-suite/tree/HEAD/skills/break-down-course-goal

Installed? Explore more 研究與資料分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

break-down-course-goal 是做什麼的?

將客戶的 inputs.json 轉換為 tree.json:一棵以課程目標為根節點的能力樹,其中每條邊代表「子節點是參與者為了讓父節點發生,而必須能夠與 Claude 共同完成的事項。」

此技能的設計選擇:證據向上。 此方法並非從頂端向下分解目標。它從標準與每週目標出發,問的是當每個目標達成時,必須可觀察到什麼,以及參與者必須做什麼才能產生該證據,然後從這些動作逆向推回目標。目標是最後才串聯的,而不是最先拆分的。邊的含義完全相同;只有建構順序不同。

輸入與輸出

  • **執行資料夾:**由使用者指定。所有讀寫操作皆在此資料夾內進行。
  • 讀取: <run>/inputs.json(schema h0-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. 整理輸入

  1. 將 goal 完全複製到樹的 goal 中。
  2. 將每個 constraints 項目分類到以下兩堆之一:
    • 約束樹:關於資料(來源、讀寫)或範圍(包含或不包含的內容)。在步驟 2–4 中使用。
    • 交付:關於時間、長度、課程次數、格式、排程。將其放入 set_aside,並完全複製該約束,加上一行說明原因(「交付限制;此樹僅關於能力」)。它絕不會塑造、調整大小、拆分或合併任何節點。
  3. 將 presenter_owned(若有)視為背景資訊。這些永遠不是節點,且任何節點不得要求參與者執行這些事項。
  4. 在建構之前,立即列出詞彙表中的問題:
    • 每個以 UNRESOLVED 或 PROVISIONAL 開頭的詞彙值 → 一個 undefined_term 缺口,即使目標未使用該詞彙;
    • 目標、每週目標、標準或約束中出現,但詞彙表未定義且樹依賴其定義的任何詞彙(例如:什麼算作一個要檢查的單位、資料檔案的格式為何)→ 一個 undefined_term 缺口。 請勿自行定義任何此類術語。當某個節點依賴於某個未定義術語時,請措辭使該節點在沒有定義的情況下仍可運作,並註明該缺口。

步驟 1. 記錄證據

對於每個標準:其證據就是 pass_if,按字面解讀。寫下一行:「可觀察到:<pass_if>,由 產生,來自 。」 對於每個每週目標:寫下若達成該目標,他人可以看到什麼(產品、記錄、可見的變化)。如果目標是關於信心或舒適度且沒有產品,則指出能夠顯示該狀態的最小可見行為(例如:「參與者自行提出後續要求後,存在一個修訂版本」)。

步驟 2. 為每條證據命名產生它的動作

對於每條證據行,問:「參與者與 Claude 一起做了什麼,而留下了這個證據?」 將其寫成帶有受詞的命令式動作(「產生……」、「標記……」、「要求 Claude……」),絕對不要寫成主題(「提示工程」、「資料素養」)。

  • 如果兩條證據行由同一個動作產生,則它們共用一個動作。
  • 每個不同的動作成為一個頂層節點(根節點的子節點),並設定 serves,列出其證據所服務的每個每週目標和標準 ID。
  • 覆蓋率檢查:輸入中的每個 W 和 C ID 必須至少出現在一個頂層的 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. 排序、閘門檢查、渲染

  1. python <skill>/scripts/order_leaves.py <run>/tree-A.json(設定 leaf_order;若遇到循環則失敗,代表需要修正 prereqs 的迴圈)。
  2. 對 tree-A.json 執行閘門檢查直到顯示 PASS。
  3. 將步驟 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。回傳一句話為您的版本辯護。」

簡報、選定、記錄

  1. 撰寫 <run>/tree-pitches.md:每個版本一行,A — <一句話>、B — …、C — …,每個都說明其設計選擇。沒有版本標記為推薦。您可以指出任何版本中的事實錯誤;但您不投票。
  2. 由主持人選定。執行 python <skill>/scripts/pick.py <run> <A|B|C> "<reason given, if any>"。在提出之前,請先讀取 decisions.md(若存在),以免提出已遭拒絕的提案。
  3. 再次對 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,因為組織者已經在運行報名流程。

相關技能