break-down-course-goal 是做什么的?
将一个客户的 inputs.json 转换为 tree.json:一棵以课程目标为根的树,其中每条边表示 “子节点是参与者必须能够使用 Claude 做的事情,以便其父节点能够发生。”
本技能的设计选择:自下而上(evidence-up)。 该方法并非从顶部分解目标。它从标准和周目标出发,询问当每个目标达成时,什么必须是可观察到的真实情况,以及参与者必须做什么来产生该证据,然后从这些动作反向推演至目标。目标是最后连接的东西,而非首先要拆分的东西。边的含义相同;仅构建顺序不同。
输入与输出
- 运行文件夹: 由用户指定。所有读取和写入操作均在该文件夹内进行。
- 读取:
<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 由分别独立的子 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。用一句话为你的版本辩护。”
推介、选择、日志
- 编写
<run>/tree-pitches.md:每版本一行,A — <一句话>,B — …,C — …,每个都命名其设计选择。没有版本被标记为推荐。你可以指出任何版本中的事实错误;你不投票。 - 演示者做选择。运行
python <skill>/scripts/pick.py <run> <A|B|C> "<理由(如有)>"。在提出之前,读取decisions.md(如果存在)以免重复提出已拒绝的选项。 - 再次门控
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,因为组织者已经在运行报名。