Community研究与数据分析github.com

jagp/break-down-course-goal

将课程目标、周目标及其成功标准分解为一个能力树,描述参与者必须使用 Claude 完成哪些操作。

break-down-course-goal 是什么?

该技能用于将客户提供的 `inputs.json`(包含课程目标、周目标及成功标准)转换为一个能力树 `tree.json`。其核心设计理念为“自下而上构建证据”:不直接从顶部分解目标,而是从成功标准及每周目标出发,首先确定每个目标达成时必须“可观察到的证据”,然后识别参与者必须使用 Claude 执行何种操作来产生该证据,最后反向推演直至根目标。该技能支持生成三个版本(A/B/C)的能力树,涵盖自下而上、自上而下及对照/校验三种设计思路,并通过门控验证确保树结构符合 schema 要求。它非常适合用于 AI 教学助手(如 Claude Code、Cursor、Codex)或课程设计场景,帮助系统化地规划参与者与 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 做的事情,以便其父节点能够发生。”

本技能的设计选择:自下而上(evidence-up)。 该方法并非从顶部分解目标。它从标准和周目标出发,询问当每个目标达成时,什么必须是可观察到的真实情况,以及参与者必须做什么来产生该证据,然后从这些动作反向推演至目标。目标是最后连接的东西,而非首先要拆分的东西。边的含义相同;仅构建顺序不同。

输入与输出

  • 运行文件夹: 由用户指定。所有读取和写入操作均在该文件夹内进行。
  • 读取: <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 由分别独立的子 agent(绝非分支)生成,每个子 agent 只接收其下方的简要说明、运行文件夹路径、本技能的 scripts/ 路径以及门控命令。如果平台没有子 agent,则自行编写 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> "<理由(如有)>"。在提出之前,读取 decisions.md(如果存在)以免重复提出已拒绝的选项。
  3. 再次门控 tree.json,然后运行 python <skill>/scripts/render_leaves.py <run>/tree.json → <run>/skills-list.md。

报告(在运行结束时向用户报告)

  • 写入的文件;
  • 每个版本的门控输出;
  • 每个缺口(未定义术语、数据来源、其他),如树中所列;
  • 每个搁置的约束及其理由;
  • B 和 C 是独立子 agent 还是角色扮演。

虚构示例(通用,非来自任何客户)

目标:“每位志愿组织者使用 Claude 将报名表转换为轮班表,并对照报名表检查每个槽位。” 标准:“pass_if:每位组织者有一个更正的槽位,以及与之对照的报名行。”

  • 步骤 1 证据:“存在针对每位组织者的一个更正槽位及与之对照的行。”
  • 步骤 2 动作(顶级,服务该标准):“对照报名表检查每个轮班表槽位,并更正报名表不支持的槽位,记录该行。”
  • 步骤 3 反向推演:“让 Claude 显示每个槽位来自报名表的哪一行”(使用 Claude)→ 子节点。“打-开报名表”(不使用 Claude)→ 不是节点;由资料或缺口覆盖。
  • 步骤 4 叶子“判断某行是否支持某槽位”的 floor:domain_knowledge,因为组织者已经在运行报名。

相关技能