@netpilot/skills 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +17 -0
- package/README.md +6 -1
- package/docs/skill-evolution.md +43 -0
- package/docs/skill-localization.md +60 -0
- package/package.json +1 -1
- package/skills/ask/SKILL.md +19 -13
- package/skills/ask/references/phase-boundaries.md +70 -0
- package/skills/code-review/SKILL.md +14 -14
- package/skills/codebase-design/SKILL.md +2 -2
- package/skills/diagnosing-bugs/SKILL.md +8 -2
- package/skills/diagnosing-bugs/scripts/hitl-loop.template.mjs +3 -1
- package/skills/domain-modeling/SKILL.md +1 -1
- package/skills/grill-me/SKILL.md +2 -2
- package/skills/grill-me/agents/openai.yaml +2 -2
- package/skills/grill-with-docs/SKILL.md +5 -5
- package/skills/grill-with-docs/agents/openai.yaml +1 -1
- package/skills/grilling/SKILL.md +27 -11
- package/skills/grilling/agents/openai.yaml +2 -2
- package/skills/handoff/SKILL.md +1 -1
- package/skills/implement/SKILL.md +2 -2
- package/skills/implement/references/verification.md +32 -0
- package/skills/improve-codebase-architecture/SKILL.md +7 -5
- package/skills/prototype/SKILL.md +3 -3
- package/skills/prototype/references/logic.md +38 -58
- package/skills/prototype/references/ui.md +51 -43
- package/skills/research/SKILL.md +4 -2
- package/skills/resolving-merge-conflicts/SKILL.md +1 -1
- package/skills/tdd/SKILL.md +9 -7
- package/skills/teach/SKILL.md +13 -13
- package/skills/to-questionnaire/SKILL.md +57 -0
- package/skills/to-questionnaire/agents/openai.yaml +6 -0
- package/skills/to-spec/SKILL.md +12 -10
- package/skills/to-tickets/SKILL.md +2 -2
- package/skills/triage/SKILL.md +9 -9
- package/skills/wait-what/SKILL.md +7 -0
- package/skills/wait-what/agents/openai.yaml +6 -0
- package/skills/wayfinder/SKILL.md +16 -16
- package/skills/wizard/SKILL.md +51 -0
- package/skills/wizard/agents/openai.yaml +6 -0
- package/skills/wizard/template.sh +272 -0
- package/skills/writing-for-agents/SKILL-MECHANICS.md +70 -0
- package/skills/writing-for-agents/SKILL.md +93 -0
- package/skills/writing-for-agents/agents/openai.yaml +6 -0
- package/skills/writing-for-agents/references/behavioral-evaluation.md +29 -0
- package/skills/writing-great-skills/SKILL.md +0 -125
- package/skills/writing-great-skills/agents/openai.yaml +0 -6
- package/skills/writing-great-skills/references/glossary.md +0 -279
package/skills/grilling/SKILL.md
CHANGED
|
@@ -1,22 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: grilling
|
|
3
|
-
description: 当用户要压力测试一项计划、决策或想法,使用 grill 类触发语,或另一 skill
|
|
3
|
+
description: 当用户要压力测试一项计划、决策或想法,使用 grill 类触发语,或另一 skill 需要通过 rounds 与 frontier 形成共同理解时使用;普通问答、开放式头脑风暴或已明确的执行任务不使用。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Grilling
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**Relentless(毫不松懈)**地访谈用户,直到双方形成共同理解。把讨论绘制成 **design tree(决策树)**:每项决定都会分叉出依赖它的其他决定。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
以 **rounds(轮次)**推进这棵树。**frontier(当前可询问的决策集合)**是前置条件已经解决的全部决定,也就是现在不需要猜测尚未听到的答案、可以立即询问的问题。每一轮询问整个 frontier:给每个问题编号,并给出推荐答案。随后等待用户回答,再进入下一轮。
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
2. 选择当前最可能改变范围、方案或风险的一个开放分支。
|
|
14
|
-
3. 一次只问一个问题,并等待用户回答后再继续。每个问题都给出你的推荐答案及最关键的理由或取舍;推荐不是替用户作决定。
|
|
15
|
-
4. 检查回答是否解决了该分支,是否与较早决定冲突,以及是否暴露了新的上游依赖。必要时先处理新依赖,再回到原分支。
|
|
16
|
-
5. 更新决策树并继续,直到每个重要分支都已解决、明确 deferred,或经用户确认为 out of scope。需要研究、原型、外部权限或未来信息时,把访谈标记为暂停/阻塞并返回所需证据;不能把这些未决分支当作已经形成 shared understanding。
|
|
12
|
+
每轮使用下面的格式,保留问题编号、推荐答案和问题之间的分隔:
|
|
17
13
|
|
|
18
|
-
|
|
14
|
+
```text
|
|
15
|
+
❓ **Q1** - **<问题标题>**:<问题正文;可以包含多个段落或选项>
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
➡️ <推荐答案>
|
|
21
18
|
|
|
22
|
-
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
❓ **Q2** - **<问题标题>**:<问题正文;可以包含多个段落或选项>
|
|
22
|
+
|
|
23
|
+
➡️ <推荐答案>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
用户每回答一轮,design tree 都会改变:已解决的决定会把 frontier 向外推进,并解锁依赖它们的问题。根据回答重新计算 frontier,再询问下一轮。本轮中某个问题如果仍依赖另一个开放问题的答案,就属于后续轮次,不能放进当前轮。
|
|
27
|
+
|
|
28
|
+
查明 _facts(事实)_ 是 agent 的工作,不能转嫁给用户。Frontier 问题需要文件系统、工具或其他环境事实时,dispatch subagent(派发子代理)去查明。不要因此阻塞整个轮次:正在运行的探索是一个尚未解决的前置条件,所以只有依赖它的问题等待 subagent 返回;立即询问 frontier 中其余问题。_decisions 属于用户_:把每项选择交给用户并等待回答,推荐答案不能替用户作决定。
|
|
29
|
+
|
|
30
|
+
宿主没有可用子代理,或当前任务禁止委派时,由当前 agent 只读查明该事实;本轮其余已就绪问题仍可先问,依赖该事实的问题留到查明后。只降级执行方式,不猜答案,也不把可自行查明的事实转问用户。
|
|
31
|
+
|
|
32
|
+
当 frontier 为空时,访谈达到 Completion Criterion(完成条件):design tree 的每个 branch 都已访问,没有 silent assumption(未明说的假设)。
|
|
33
|
+
|
|
34
|
+
Frontier 为空后仍不能立即行动;必须等待用户确认双方已经形成共同理解。
|
|
35
|
+
|
|
36
|
+
除只读查明 facts 外,在用户明确确认双方已经形成共同理解前,不基于方案执行任何写入或外部动作,包括实施、建 issue、写 spec、改 tracker 状态或创建 artifact。`grill-with-docs` 是显式 wrapper:它只在当前 round 中每个具体 decision 已由用户确认后,按自身授权即时沉淀文档。
|
|
37
|
+
|
|
38
|
+
用户确认后才结束访谈并把结果交回调用方。若由另一 skill 调用,返回已确认 decisions、仍未解决的 branches 及所需证据,由调用方决定产物格式和下一步;不要夺取调用方的 workflow。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "Grilling"
|
|
3
|
-
short_description: "
|
|
4
|
-
default_prompt: "请使用 $grilling
|
|
3
|
+
short_description: "按 frontier 分轮压力测试计划、决策或想法,并逐题给出推荐答案"
|
|
4
|
+
default_prompt: "请使用 $grilling 建立 design tree,每轮询问整个 frontier,并为每个问题给出推荐答案。"
|
|
5
5
|
policy:
|
|
6
6
|
allow_implicit_invocation: true
|
package/skills/handoff/SKILL.md
CHANGED
|
@@ -24,8 +24,8 @@ disable-model-invocation: true
|
|
|
24
24
|
1. 从已批准的 spec、ticket 或验收标准开始;范围仍有关键歧义时返回 `ask`、`grilling` 或 `to-spec`,不要自行扩展需求。
|
|
25
25
|
2. 在适用且存在可观察行为时,在预先确认的 seams 上使用 `tdd`,一次完成一个 test → minimal implementation 的垂直切片。纯文档、机械配置或没有可测试行为的改动不适用时记录原因,并执行与风险相称的定向验证。结构整理留到完整 diff 可见后的审查阶段。
|
|
26
26
|
3. 定期运行 typecheck 和单个相关测试文件,使失败靠近引入它的切片。
|
|
27
|
-
4.
|
|
28
|
-
5. 使用 `code-review` 对同一 fixed point 做 Standards + Spec 双轴审查。修复确认的问题后,重跑受影响验证。
|
|
27
|
+
4. 所有切片完成后,仓库存在完整测试套件时运行一次。无法运行时如实记录原因与剩余风险,不能把未运行写成通过。需要证明用户可观察结果、执行浏览器验收或处理检查阻塞时,读取 [验收证据](references/verification.md),完成后返回本流程。
|
|
28
|
+
5. 使用 `code-review` 对同一 fixed point(固定比较点) 做 Standards + Spec 双轴审查。修复确认的问题后,重跑受影响验证。
|
|
29
29
|
6. 检查最终 diff 只包含当前任务。按动作授权 commit,并在证据支持时更新 tracker 状态或关闭明确任务。
|
|
30
30
|
|
|
31
31
|
规格与真实代码约束冲突时停止扩展实现:记录证据、受影响验收标准和最小决策点,把控制权交还用户。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 验收证据
|
|
2
|
+
|
|
3
|
+
用于实施后的验收,不是另一个工作流入口。先从当前用户要求、已批准规格和项目验证规则确定必需证据;只读分析、纯文档和机械修改不自动升级成浏览器或端到端测试。
|
|
4
|
+
|
|
5
|
+
## 把检查对应到要求
|
|
6
|
+
|
|
7
|
+
每项验收要求应对应实际检查或可定位证据;同一证据可覆盖多项要求。复用仓库现有命令和测试,不凭空发明 `qa`、`verification` 命令,也不为凑清单安装工具。已有有效证据可复用,但要核对它对应当前待交付版本;审查后有修改时重跑受影响检查。
|
|
8
|
+
|
|
9
|
+
| 变更与要求 | 合适的证据 |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| 文档、metadata、命令说明 | 结构与引用检查;说明涉及命令时确认其实际存在 |
|
|
12
|
+
| 逻辑、状态、API 行为 | 在已确认 Seam 上运行定向测试,覆盖该要求涉及的成功和失败路径 |
|
|
13
|
+
| 页面布局、交互或可访问性 | 按项目认可的浏览器工具操作实际页面,记录入口、步骤与结果;涉及视觉结果时保留截图 |
|
|
14
|
+
| 构建、配置或产物生成 | 项目要求的构建/配置检查,并读取生成结果;编译成功不能替代行为验收 |
|
|
15
|
+
|
|
16
|
+
UI 验收从本次改变的行为出发:例如表单提交,就核对实际输入、提交结果、失败反馈与重复操作;布局修改就核对受影响的视口和内容状态。仅当对应要求或变更风险相关时扩大到键盘、响应式、空态、加载态和错误态,不机械要求每次覆盖整个产品。
|
|
17
|
+
|
|
18
|
+
## 工具与权限边界
|
|
19
|
+
|
|
20
|
+
已有 `agent:test-verifier` 可执行命令验证时,传入范围、必需检查和项目规则,让它返回实际命令与证据;不可用时主 agent 执行同样检查。浏览器操作使用当前可用且项目认可的工具,不把只读前端审查当成真实浏览器验收。
|
|
21
|
+
|
|
22
|
+
测试优先使用本地或隔离环境及假数据。遇到真实支付、发送消息、生产写入或其他未授权副作用时停在该动作之前,继续执行独立的安全检查,并准确报告缺少哪项授权或替代环境。
|
|
23
|
+
|
|
24
|
+
## 结果与恢复
|
|
25
|
+
|
|
26
|
+
- **passed**:当前范围的必需检查均已执行成功,并有对应证据。
|
|
27
|
+
- **failed**:已执行的检查观察到不符合要求的结果;记录复现入口和失败信号。
|
|
28
|
+
- **blocked**:必需检查无法执行;记录缺失环境、工具、访问条件及恢复后的第一步。其他检查通过不能抵消该缺口。
|
|
29
|
+
|
|
30
|
+
同时存在失败与阻塞时,两者都报告。结论只覆盖本次实际检查的范围;截图只证明捕获的页面状态,单元测试通过不证明真实服务连接成功。报告保留命令、退出码、关键观察和证据路径,避免复制完整日志或敏感内容。
|
|
31
|
+
|
|
32
|
+
记录检查前后的工作树变化。工具产生非预期受版本控制修改时保留现场并交由实施流程处理,不清理或回滚用户改动,也不把该次验证报告为全部通过。验收完成后回到 `implement` 的独立审查与交付步骤,不因验收通过而自动提交或发布。
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
|
|
7
7
|
# Improve Codebase Architecture
|
|
8
8
|
|
|
9
|
-
发现 architectural friction
|
|
9
|
+
发现 architectural friction(架构摩擦),并提出把 shallow module 深化为 deep module 的机会。目标是提高 testability、locality、leverage 和 agent navigability。
|
|
10
10
|
|
|
11
11
|
先调用 `$codebase-design` 获取 Module、Interface、Implementation、Depth、Seam、Adapter、Leverage、Locality、deletion test 与 design-it-twice 的准确含义。领域名称来自 `CONTEXT.md`,已有约束来自 ADR。
|
|
12
12
|
|
|
@@ -33,7 +33,7 @@ disable-model-invocation: true
|
|
|
33
33
|
|
|
34
34
|
先读领域 glossary 和相关 ADR。
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
启动一个只读子代理探索代码库,按真实理解摩擦有机寻找;宿主不支持子代理时由当前 agent 执行相同的只读探索:
|
|
37
37
|
|
|
38
38
|
- 理解一个概念是否需要在许多小 Module 之间跳转;
|
|
39
39
|
- Module 是否 shallow:Interface 几乎和 Implementation 一样复杂;
|
|
@@ -45,7 +45,7 @@ disable-model-invocation: true
|
|
|
45
45
|
|
|
46
46
|
对每个候选项执行 deletion test:删除该 Module 会让复杂性集中到一个清楚位置,还是只把代码搬到别处?只有前者才是可信 deepening signal。
|
|
47
47
|
|
|
48
|
-
## 生成 HTML
|
|
48
|
+
## 生成 HTML 报告
|
|
49
49
|
|
|
50
50
|
把单文件报告写入操作系统临时目录:
|
|
51
51
|
|
|
@@ -68,6 +68,8 @@ disable-model-invocation: true
|
|
|
68
68
|
- Recommendation strength:Strong、Worth exploring 或 Speculative;
|
|
69
69
|
- 与 ADR 冲突时的明确 warning。
|
|
70
70
|
|
|
71
|
+
**ADR 冲突**:只有真实摩擦足以支持重新审视该 ADR 时才展示候选,并明确标记,例如“与 ADR-0007 冲突,但值得重新讨论,因为……”。不要列出 ADR 禁止的所有理论重构。
|
|
72
|
+
|
|
71
73
|
结尾只给一个 Top recommendation。
|
|
72
74
|
|
|
73
75
|
使用 `CONTEXT.md` 中的领域名称和 `$codebase-design` 中的架构词汇。不要用泛化的“更干净”“更好维护”代替可解释收益。
|
|
@@ -78,11 +80,11 @@ disable-model-invocation: true
|
|
|
78
80
|
|
|
79
81
|
用户选择候选项后:
|
|
80
82
|
|
|
81
|
-
1. 调用 `$grilling
|
|
83
|
+
1. 调用 `$grilling`,以 rounds 询问当前全部 frontier,确认约束、依赖、deep Module 的 shape、Seam 后的职责和能够保留的测试。
|
|
82
84
|
2. 领域词汇变化时调用 `$domain-modeling`:
|
|
83
85
|
- 新概念确实稳定时加入 `CONTEXT.md`;
|
|
84
86
|
- fuzzy term 被澄清时立即更新;
|
|
85
87
|
- hard-to-reverse decision 形成时建议 ADR。
|
|
86
|
-
3. 用户以长期有效、会影响未来扫描的理由拒绝候选项时,询问是否记录 ADR
|
|
88
|
+
3. 用户以长期有效、会影响未来扫描的理由拒绝候选项时,询问是否记录 ADR;跳过临时性理由(例如“现在不值得做”)和自明的理由。
|
|
87
89
|
4. 需要比较多个 Interface 设计时调用 `$codebase-design`,使用 design-it-twice。
|
|
88
90
|
5. 返回 candidate decision、推荐 Interface 方向、测试 Seam 和下一步;实际重构交给 `$to-spec` 或 `$implement`。
|
|
@@ -5,13 +5,13 @@ description: 当关键设计问题不能只靠讨论确定,需要用可丢弃
|
|
|
5
5
|
|
|
6
6
|
# Prototype
|
|
7
7
|
|
|
8
|
-
Prototype
|
|
8
|
+
Prototype(原型)是**用可丢弃代码回答一个问题**。问题决定它的形状。
|
|
9
9
|
|
|
10
10
|
## 选择分支
|
|
11
11
|
|
|
12
12
|
从用户提示、相邻代码或一次澄清中确认问题:
|
|
13
13
|
|
|
14
|
-
- **“这套 logic / state model 是否合理?”** → 读取 [logic.md](references/logic.md)
|
|
14
|
+
- **“这套 logic / state model 是否合理?”** → 读取 [logic.md](references/logic.md),构建一个可分享的单文件 HTML:同时提供 free-play buttons(自由操作按钮)与 tabbed guided walkthroughs(分标签页的引导演练),让非开发者也能推动纸面上难以判断的状态。
|
|
15
15
|
- **“它应该长什么样?”** → 读取 [ui.md](references/ui.md),在一个 route 上生成数个结构上明显不同的 UI variants,通过 URL search param 和浮动底栏切换。
|
|
16
16
|
|
|
17
17
|
两个分支产物完全不同,选错会浪费整个实验。问题确实有歧义且用户暂时不可达时,根据相邻代码选择:backend Module 默认 logic,page/component 默认 UI,并在 prototype 顶部明确写出假设。
|
|
@@ -19,7 +19,7 @@ Prototype 是**用可丢弃代码回答一个问题**。问题决定它的形状
|
|
|
19
19
|
## 两种分支都遵守的规则
|
|
20
20
|
|
|
21
21
|
1. **从第一天起就是 throwaway,并明确标记。** 代码放在最接近未来使用位置的地方,使上下文清楚;命名必须让读者一眼看出它不是 production。UI route 遵循项目既有 routing convention,不发明新的顶层结构。
|
|
22
|
-
2.
|
|
22
|
+
2. **启动不需要思考。** UI prototype 从项目现有 task runner 的一条命令启动,例如 `pnpm <name>`、`python <path>` 或 `bun <path>`;logic demo 是用户双击即可打开的单个 HTML 文件。
|
|
23
23
|
3. **默认不持久化。** 状态放在内存。若问题本身涉及数据库,使用 scratch database 或名称明确标注 `PROTOTYPE — wipe me` 的本地文件。
|
|
24
24
|
4. **跳过 polish。** 不写测试,不补与可运行无关的错误处理,不提前抽象。目标是快速学习。
|
|
25
25
|
5. **完整展示状态。** 每次 logic action 或 UI variant 切换后,输出或渲染完整相关状态,使变化可见。
|
|
@@ -1,87 +1,67 @@
|
|
|
1
1
|
# Logic Prototype
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个自包含的 HTML 文件——一份 **shareable demo(可分享演示)**——让任何人通过点击按钮推动 state model。问题涉及 **business logic、state transitions 或 data shape** 时使用:这些模型在纸面上看起来合理,只有真正经过具体情形时才会显出不对劲。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
因为它只有一个文件、无需安装,所以可以直接交给非开发者,例如设计师、产品经理或领域专家,让他们亲自感受模型。因此它必须使用他们的语言,而不是代码作者的语言。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- “这套 data model 能否表达某个边界情况?”
|
|
9
|
-
- “实现前我想先感受一下 API 应该是什么形状。”
|
|
10
|
-
- 用户需要“按键并观察状态改变”。
|
|
7
|
+
## 何时适合这种形态
|
|
11
8
|
|
|
12
|
-
|
|
9
|
+
- “我不确定 X 之后再发生 Y 时,这个 state machine 是否正确处理 edge case。”
|
|
10
|
+
- “这套 data model 是否真的能表达某种情况?”
|
|
11
|
+
- “写正式实现前,我想先感受 API 应该是什么形状。”
|
|
12
|
+
- 任何需要某个人 **按按钮并观察状态改变** 的问题。
|
|
13
|
+
|
|
14
|
+
如果问题是“它应该长什么样”,说明选错了分支,改用 [ui.md](ui.md)。
|
|
13
15
|
|
|
14
16
|
## 流程
|
|
15
17
|
|
|
16
18
|
### 1. 写明问题
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
### 2. 选择语言
|
|
21
|
-
|
|
22
|
-
使用宿主项目已有语言、runtime 与 task runner。项目没有明显 runtime 时再询问,不要只为 prototype 引入新工具链。
|
|
23
|
-
|
|
24
|
-
### 3. 把 logic 隔离为可移植 Module
|
|
25
|
-
|
|
26
|
-
把真正回答问题的逻辑放到小而 pure 的 Interface 后。TUI 是 throwaway;logic module 应能独立提取。
|
|
27
|
-
|
|
28
|
-
按问题选择:
|
|
29
|
-
|
|
30
|
-
- **Pure reducer**:`(state, action) => state`。适用于 actions 是离散 events,且 state 可表示为单一值的情况。
|
|
31
|
-
- **Explicit state machine**:适用于“当前究竟允许哪些 actions”本身就是待验证问题的情况。
|
|
32
|
-
- **作用于 plain data type 的一组 pure functions**:适用于不存在隐式 current state、只有数据转换的情况。
|
|
33
|
-
- **Method surface 清楚的 class/module**:仅在 logic 确实拥有持续内部状态时使用。
|
|
34
|
-
|
|
35
|
-
根据问题选择,不根据 TUI 接线便利选择。Logic 内不得包含 I/O、terminal code 或用于控制流的 `console.log`。TUI 可以 import logic,logic 不得反向依赖 TUI。
|
|
36
|
-
|
|
37
|
-
### 4. 构建最小 TUI
|
|
20
|
+
写代码前,先写明要验证哪套 state model、回答哪个问题。用一段话放在 demo 顶部可见的 intro 中,而不只是代码 comment。回答错问题的 logic prototype 完全是浪费;明确写出问题,用户无论正在旁观还是之后 AFK 回来,都能核对它。
|
|
38
21
|
|
|
39
|
-
|
|
22
|
+
### 2. 在可移植 Module 中隔离 logic
|
|
40
23
|
|
|
41
|
-
|
|
24
|
+
把真正回答问题的 logic 放进单一 `<script>` block,写成小而 pure、以后可从页面中提取并放进真实 codebase 的 Module。周围的页面是 throwaway;这个 Module 不是。
|
|
42
25
|
|
|
43
|
-
|
|
44
|
-
2. **Keyboard shortcuts**:例如 `[a] add user [d] delete user [t] tick clock [q] quit`。
|
|
26
|
+
正确形态取决于问题:
|
|
45
27
|
|
|
46
|
-
|
|
28
|
+
- **Pure reducer**——`(state, action) => state`。Actions 是离散 events,且 state 是单一值时适用。
|
|
29
|
+
- **State machine**——显式 states 与 transitions。“当前究竟允许哪些 actions”本身就是问题的一部分时适用。
|
|
30
|
+
- **作用于 plain data type 的少量 pure functions**。没有隐式 current state、只有 transformations 时适用。
|
|
31
|
+
- **拥有清楚 method surface 的 class 或 module**。仅在 logic 确实拥有持续内部状态时使用。
|
|
47
32
|
|
|
48
|
-
|
|
49
|
-
2. 启动时渲染;
|
|
50
|
-
3. 每次读取一个 key 或一行;
|
|
51
|
-
4. dispatch 到 handler;
|
|
52
|
-
5. 每次 action 后重绘完整 frame;
|
|
53
|
-
6. 持续循环直到 quit。
|
|
33
|
+
选择最符合问题的形态,*而不是*最容易接到页面上的形态。保持 pure:不引用 DOM,不引用 `document`,button handlers 也不能伸进内部。页面单向调用 logic,logic 不反向流向页面。这样 prototype 才能超越自身寿命:问题回答后,已经验证的 reducer、machine 或 function set 可以独立进入正式 Module;只有另行授权 `$implement` 后才能执行这项正式写入。
|
|
54
34
|
|
|
55
|
-
|
|
35
|
+
### 3. 构建 shareable HTML 文件
|
|
56
36
|
|
|
57
|
-
|
|
37
|
+
只用一个 plain HTML/CSS/JS 文件:不用 framework、bundler 或 server,全部 inline,使它可以双击打开,也可以通过邮件转交。任何人打开文件就能运行。
|
|
58
38
|
|
|
59
|
-
|
|
39
|
+
面向非开发者编写。每个 label 都使用 **domain language**,而不是代码术语;buttons 和 state 应像业务,而不是像 reducer。用朴素语言解释正在发生什么。
|
|
60
40
|
|
|
61
|
-
|
|
41
|
+
从上到下采用清楚的层级:
|
|
62
42
|
|
|
63
|
-
|
|
43
|
+
1. **标题和一句话说明**:说明这个 demo 能探索什么,也就是步骤 1 的问题。
|
|
44
|
+
2. **当前状态**:把完整相关 state 渲染为可读 panel,使用有 label 的字段而不是 raw JSON;每次点击后重新渲染,让变化可见。若能帮助非开发者跟上,再指出刚刚改变了什么。
|
|
45
|
+
3. **Free-play buttons**(自由操作按钮):每个 action 一个 button,并且始终可用,让任何人按任意顺序探索模型。每次点击都 dispatch 对应 action,再重新渲染 state。
|
|
46
|
+
4. **Guided walkthroughs**(引导演练):提供一组 **scenarios(场景)**,每个 scenario 一个 tab。每个 tab 先用简短的日常语言说明它建立的情形和需要观察的重点,再列出该 scenario 中应按顺序点击的 **buttons**。每一步都是真实 button:点击会执行该 action 并进入下一步。启动 walkthrough 时重置到已知 initial state,使同一 scenario 每次都以相同方式运行。
|
|
64
47
|
|
|
65
|
-
|
|
48
|
+
选择能展示棘手情况的 scenarios:happy path、tricky edge case,以及一次本应 illegal 的尝试;它们正是纸面上难以推理的部分。
|
|
66
49
|
|
|
67
|
-
|
|
68
|
-
- “我以为这个字段会变成另一种状态。”
|
|
69
|
-
- “这里缺少一个状态。”
|
|
50
|
+
外观可以漂亮,但要克制:清楚的排版、宽松的间距、一种强调色。不要动画或噱头,不要让任何东西与 state 和 buttons 争夺注意力。
|
|
70
51
|
|
|
71
|
-
|
|
52
|
+
### 4. 交给对方操作
|
|
72
53
|
|
|
73
|
-
|
|
54
|
+
把文件发给对方,或替对方打开。他们可以在方便时完成 walkthroughs 和 free-play;最有价值的时刻通常是“等等,这不应该发生”或“原来如此,我以为 X 会不一样”——这些是 *idea* 中的 bugs,也正是 prototype 的目的。对方需要新 action 或新 scenario 时就加入;prototypes 会演进。
|
|
74
55
|
|
|
75
|
-
|
|
56
|
+
### 5. 捕获答案与 prototype
|
|
76
57
|
|
|
77
|
-
|
|
78
|
-
- TUI shell 与完整实验记录保留在已授权的 throwaway branch;
|
|
79
|
-
- 主分支不保留 TUI shell。
|
|
58
|
+
Prototype 回答问题后,先捕获答案,再按主 [SKILL](../SKILL.md) 的方式捕获 prototype。Logic 分支的映射是:已经验证的 reducer、machine 或 function set 是可供正式实现吸收的 decision;只有另行授权 `$implement` 后才写入正式 Module。HTML shell 则进入保留 prototype 一手证据的 throwaway branch;因为它是单个自包含文件,所以在那里仍然可以轻松重新运行。
|
|
80
59
|
|
|
81
60
|
## 反模式
|
|
82
61
|
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
62
|
+
- **不要补测试。** 需要测试的 prototype 已经不再是 prototype。
|
|
63
|
+
- **不要连接真实数据库。** 除非问题专门关于 persistence,否则使用 in-memory state。
|
|
64
|
+
- **不要泛化。** 不处理“以后可能支持 X”之类的问题;prototype 只回答一个问题。
|
|
65
|
+
- **不要把 logic 与页面混在一起。** Pure Module 一旦引用 DOM、`document` 或 button handlers,就无法独立提取。页面只是 pure Module 外的一层薄 shell。
|
|
66
|
+
- **不要引入 framework、bundler 或 server。** 接收者应当双击一个文件;React app 或 dev server 会破坏“shareable”这一目标。
|
|
67
|
+
- **不要把 HTML shell 送入 production。** 页面是为了人工点击而优化的;真正值得保留的是背后的 logic Module,而且仍须另行授权 `$implement`。
|
|
@@ -1,57 +1,64 @@
|
|
|
1
1
|
# UI Prototype
|
|
2
2
|
|
|
3
|
-
在一个 route
|
|
3
|
+
在一个 route 上生成 **数个结构上显著不同的 UI variants**,并通过浮动底栏切换。用户在浏览器中逐个比较,选定一个方案或组合各方案的优点,然后丢弃其余方案。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
如果问题是 logic/state 而不是外观,说明选错了分支,改用 [logic.md](logic.md)。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 何时适合这种形态
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
- “实现 dashboard
|
|
11
|
-
- “尝试 settings screen
|
|
9
|
+
- “这个页面应该长什么样?”
|
|
10
|
+
- “实现 dashboard 前,我想先看几个方案。”
|
|
11
|
+
- “尝试 settings screen 的另一种 layout。”
|
|
12
|
+
- 任何本来会让用户花一天在脑中比较三份模糊 mockup(界面草图) 的情形。
|
|
12
13
|
|
|
13
|
-
##
|
|
14
|
+
## 两种形态——强烈优先 A
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
当 UI prototype **紧贴应用其余部分**——真实页头、真实侧栏、真实数据、真实信息密度——时,会更容易判断。孤立的 throwaway route 是一个 vacuum:每个 variant 单独看起来都不错。只要存在合理的已有页面可以承载 variants,就默认使用 A;只有 prototype 确实没有附近的归宿时才使用 B。
|
|
16
17
|
|
|
17
18
|
### A:调整已有页面
|
|
18
19
|
|
|
19
|
-
Route
|
|
20
|
+
Route 已经存在。通过 `?variant=` URL search param 在 **同一个 route** 上切换 variants。现有 data fetching、params 和 auth 全部保留,只替换 render。除非有具体理由,否则选择 A。
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
即使新内容还没有自己的 page,只要它自然属于某个已有页面——dashboard 的新 section、settings screen 的新 card,或现有 flow 的新 step——仍属于 A。把 variants mount 到 host page 内。
|
|
22
23
|
|
|
23
24
|
### B:全新页面
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
只有要验证的内容确实没有任何已有页面可容纳时才使用,例如完全新的 top-level surface,或无法合理嵌入别处的 flow。
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
按项目已有 routing convention 创建 **throwaway route**,不要发明新的顶层结构。名称必须明显表明它是 prototype,例如 path 或 filename 包含 `prototype`。仍使用相同的 `?variant=` pattern。
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
选择 B 前再核对一次:它真的无法嵌入已有页面吗?空 route 会隐藏 design problems,而有真实内容的页面会把它们暴露出来。
|
|
31
|
+
|
|
32
|
+
两种形态共用完全相同的浮动底栏。
|
|
30
33
|
|
|
31
34
|
## 流程
|
|
32
35
|
|
|
33
|
-
### 1.
|
|
36
|
+
### 1. 写明问题并选择 N
|
|
34
37
|
|
|
35
|
-
默认 **3 variants
|
|
38
|
+
默认 **3 variants**。超过 5 个后,它们通常不再 radically different,而只是噪声,因此上限为 5。
|
|
36
39
|
|
|
37
|
-
在 prototype
|
|
40
|
+
在 prototype 所在位置或文件顶部 comment 写下一行 plan:
|
|
38
41
|
|
|
39
42
|
> 在现有 `/settings` route 上提供 3 个 settings page variants,通过 `?variant=` 切换。
|
|
40
43
|
|
|
44
|
+
无论用户在线可以提出异议,还是暂时 AFK,这行 plan 都能供之后核对。
|
|
45
|
+
|
|
41
46
|
### 2. 生成结构上显著不同的 variants
|
|
42
47
|
|
|
43
|
-
|
|
48
|
+
起草每个 variant,并逐一满足:
|
|
44
49
|
|
|
45
|
-
- page purpose
|
|
46
|
-
-
|
|
50
|
+
- page purpose 与它可以访问的 data;
|
|
51
|
+
- 项目既有 component library / styling system,例如 TailwindCSS、shadcn、MUI 或 plain CSS;
|
|
47
52
|
- 清楚的 exported component name,例如 `VariantA`、`VariantB`、`VariantC`。
|
|
48
53
|
|
|
49
|
-
Variants
|
|
54
|
+
Variants 必须 **结构不同**:布局、信息层级或主要操作方式不同,而不只是颜色。三个只有轻微差别的 card grid 不是 UI prototype,只是 wallpaper。两个 draft 太相似时,明确要求其中一个“不要使用 card grid”并重新设计。
|
|
50
55
|
|
|
51
56
|
### 3. 连接切换逻辑
|
|
52
57
|
|
|
58
|
+
在 route 上创建单一 switcher component:
|
|
59
|
+
|
|
53
60
|
```tsx
|
|
54
|
-
// pseudo-code
|
|
61
|
+
// pseudo-code——按项目 framework 调整
|
|
55
62
|
const variant = searchParams.get("variant") ?? "A";
|
|
56
63
|
|
|
57
64
|
return (
|
|
@@ -67,42 +74,43 @@ return (
|
|
|
67
74
|
);
|
|
68
75
|
```
|
|
69
76
|
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
形态 A:所有现有 data fetching 留在 switcher 上方,只替换各 variant 的 rendered subtree。
|
|
78
|
+
|
|
79
|
+
形态 B:`/prototype/<name>` 下的 throwaway route mount 同一个 switcher。
|
|
72
80
|
|
|
73
81
|
### 4. 浮动 switcher
|
|
74
82
|
|
|
75
|
-
|
|
83
|
+
在屏幕底部中央固定一个小型栏,包含三部分:
|
|
76
84
|
|
|
77
|
-
-
|
|
78
|
-
- label
|
|
79
|
-
-
|
|
85
|
+
- **左箭头**:切换到前一个 variant,并首尾循环;
|
|
86
|
+
- **Variant label**:显示当前 variant key;如果 variant export 了名称,也一起显示,例如 `B — Sidebar layout`;
|
|
87
|
+
- **右箭头**:向后切换,并首尾循环。
|
|
80
88
|
|
|
81
89
|
行为:
|
|
82
90
|
|
|
83
|
-
-
|
|
84
|
-
- `←` 与 `→`
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
- 点击箭头时用项目 framework 的 router 更新 URL search param,例如 Next 的 `router.replace` 或 React Router 的 `navigate`,使 variant 可分享并在 reload 后保持稳定;
|
|
92
|
+
- `←` 与 `→` 键也可切换;focus 位于 `<input>`、`<textarea>` 或 `[contenteditable]` 时不得截获方向键;
|
|
93
|
+
- switcher 必须在视觉上明显独立于被评估页面,例如高对比胶囊形样式加轻微阴影,使人清楚它不属于设计本身;
|
|
94
|
+
- 在 production builds 中隐藏:使用 `process.env.NODE_ENV !== "production"` 或等价检查,避免一次意外 merge 把底栏交付给用户。
|
|
95
|
+
|
|
96
|
+
Switcher 只实现一次,放在项目既有 shared UI 位置,让两种形态复用。
|
|
89
97
|
|
|
90
98
|
### 5. 交给用户比较
|
|
91
99
|
|
|
92
|
-
给出完整 URL 与 variant keys
|
|
100
|
+
给出完整 URL 与 `?variant=` keys。用户可以在方便时逐个比较。最有价值的反馈通常是“我想要 B 的 header 和 C 的 sidebar”——这才是他们真正想要的设计。
|
|
93
101
|
|
|
94
102
|
### 6. 捕获结论并清理
|
|
95
103
|
|
|
96
|
-
|
|
104
|
+
Variant 胜出后,先捕获答案——哪个 variant 以及为什么——再按主 [SKILL](../SKILL.md) 的方式捕获 prototype。只有另行授权 `$implement` 后,才能把 winner 写入正式代码;其余内容进入 throwaway branch,而不是 main:
|
|
105
|
+
|
|
106
|
+
- **形态 A**:把 winner 作为现有 page 的正式实现输入;获得 `$implement` 授权后吸收 winner,并从 main 移除 losing variants 与 switcher。
|
|
107
|
+
- **形态 B**:把 winner 作为真实 route 的正式实现输入;获得 `$implement` 授权后吸收 winner,并从 main 移除 throwaway route 与 switcher。
|
|
97
108
|
|
|
98
|
-
|
|
99
|
-
- Sub-shape B:把 winner 作为真实 route 的实现输入;只有另行授权 `$implement` 后才写入正式代码,并从主分支移除 throwaway route 与 switcher。
|
|
100
|
-
- 完整 variants 作为 primary source 留在已授权的 throwaway branch,而不是主分支。
|
|
109
|
+
完整 variants 是 primary source,因此保留在 throwaway branch,而不是丢进垃圾箱;variant components 与 switcher 如果留在 main,会很快 rot,并让下一位读者困惑。
|
|
101
110
|
|
|
102
111
|
## 反模式
|
|
103
112
|
|
|
104
|
-
- Variants
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
- 把 losing variants 或 switcher 留在主分支腐化。
|
|
113
|
+
- **Variants 只改变颜色或文案。** 那只是 tweak,不是 prototype;真正的 variants 对结构持不同意见。
|
|
114
|
+
- **Variants 共享过多代码。** 共用 `<Header>` 没问题,共用 `<Layout>` 会破坏目的;每个 variant 都必须能丢掉现有 layout。
|
|
115
|
+
- **把 variants 接到真实 mutations。** 只读 prototype 没问题;需要 mutation 时指向 stub。问题是“它应该长什么样”,不是“backend 是否工作”。
|
|
116
|
+
- **把 prototype 直接提升为 production。** Variant code 是在 prototype 约束下写的,没有测试,错误处理也最少。获得 `$implement` 授权后,仍须按生产标准重新实现、补齐 error handling 和 tests。
|
package/skills/research/SKILL.md
CHANGED
|
@@ -5,11 +5,13 @@ description: 当任务需要依据高可信一手资料调查问题、核验文
|
|
|
5
5
|
|
|
6
6
|
# Research
|
|
7
7
|
|
|
8
|
-
启动一个 **background agent
|
|
8
|
+
启动一个 **background agent(后台子代理)** 执行阅读工作,使调用者可以同时推进其他不依赖研究结论的任务。
|
|
9
|
+
|
|
10
|
+
宿主没有可用子代理,或当前任务禁止委派时,由当前 agent 执行同样的研究并保存相同证据;明确说明改为串行,不虚构派发。并行只能改变执行方式,不能降低下列来源与引用要求。
|
|
9
11
|
|
|
10
12
|
后台 agent 的职责只有三项:
|
|
11
13
|
|
|
12
|
-
1. 依据 **primary sources
|
|
14
|
+
1. 依据 **primary sources(一手来源)** 调查问题:官方文档、源代码、规范、论文或 first-party API,而不是二手总结。每项事实都追溯到拥有该事实的一手来源。
|
|
13
15
|
2. 把结论写入一份 Markdown 文件;每项可验证 claim 或事实都在出现位置直接引用拥有该事实的一手来源,而不是只给整篇文档附一组链接。
|
|
14
16
|
3. 遵循仓库现有研究文档位置与命名约定;没有约定时选择合理位置,并明确返回绝对或仓库相对路径。
|
|
15
17
|
|
|
@@ -5,7 +5,7 @@ description: 当 Git 已处于 merge 或 rebase 中且存在冲突,需要依
|
|
|
5
5
|
|
|
6
6
|
# Resolving Merge Conflicts
|
|
7
7
|
|
|
8
|
-
逐 hunk
|
|
8
|
+
逐 hunk(差异块)解决正在进行的 merge 或 rebase。目标是保存双方原始意图,并使项目重新通过检查;不是选择“ours 全赢”或“theirs 全赢”。
|
|
9
9
|
|
|
10
10
|
## 动作门禁
|
|
11
11
|
|
package/skills/tdd/SKILL.md
CHANGED
|
@@ -11,7 +11,7 @@ TDD 是 **red → green** 循环。本 skill 说明什么测试值得保留、
|
|
|
11
11
|
|
|
12
12
|
## 好测试是什么
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
测试通过公开 Interface 验证 behavior,而不是 Implementation 内部细节。代码内部可以完全重写;只要外部 behavior 不变,测试就不应变化。
|
|
15
15
|
|
|
16
16
|
好测试读起来像 specification,例如:
|
|
17
17
|
|
|
@@ -21,19 +21,21 @@ TDD 是 **red → green** 循环。本 skill 说明什么测试值得保留、
|
|
|
21
21
|
|
|
22
22
|
## Seam:测试放在哪里
|
|
23
23
|
|
|
24
|
-
**Seam** 是测试观察 behavior
|
|
24
|
+
**Seam** 是测试观察 behavior 的公开 Interface。测试位于 Seam,不伸进内部实现。
|
|
25
25
|
|
|
26
|
-
只在预先确认的 Seams
|
|
26
|
+
只在预先确认的 Seams 上测试。写测试前列出公开 Interface 与本次要测试的 Seams,并取得用户确认,或确认它们已在批准的 spec/plan 中明确;不要在每个 cycle 重复询问已批准的同一 Seam。
|
|
27
27
|
|
|
28
28
|
核心问题:
|
|
29
29
|
|
|
30
|
-
>
|
|
30
|
+
> 公开 Interface 是什么?哪些 Seams 值得测试?
|
|
31
|
+
|
|
32
|
+
当 Interface 的形状本身仍未确定——Module 应有多深、Seam 放在哪里、Interface 暴露什么——读取 `$codebase-design`(Claude 使用 Skill 工具调用 `codebase-design`)的共享参考。它统一 Module、Interface、Depth、Seam、Adapter、Leverage 与 Locality 的含义;读完返回当前 TDD 循环,不另开设计会话。
|
|
31
33
|
|
|
32
34
|
## 反模式
|
|
33
35
|
|
|
34
|
-
- **Implementation-coupled
|
|
35
|
-
- **Tautological
|
|
36
|
-
- **Horizontal slicing
|
|
36
|
+
- **Implementation-coupled(与实现耦合)**:mock 内部协作者、测试私有方法,或通过旁路验证,例如绕过 Interface 直接查询数据库。判断信号是:behavior 没变,内部重构却让测试失败。
|
|
37
|
+
- **Tautological(同义反复)**:断言用与 Implementation 相同的方式重新计算 expected value,例如 `expect(add(a, b)).toBe(a + b)`。它按构造就无法反驳代码。Expected value 必须来自独立事实:known-good literal、手工演算例子或 spec。
|
|
38
|
+
- **Horizontal slicing(水平切片)**:先写完所有测试,再写全部实现。批量测试验证的是想象中的 behavior,过早锁定测试结构,也无法利用上一轮实现带来的信息。改用 **vertical slices(垂直切片)**:一个 test → 一个 implementation → 重复;每个 test 都是响应上一轮事实的 **tracer bullet(曳光弹)**。
|
|
37
39
|
|
|
38
40
|
## 循环规则
|
|
39
41
|
|
package/skills/teach/SKILL.md
CHANGED
|
@@ -30,9 +30,9 @@ disable-model-invocation: true
|
|
|
30
30
|
|
|
31
31
|
深层学习需要三样东西:
|
|
32
32
|
|
|
33
|
-
- **Knowledge
|
|
34
|
-
- **Skills
|
|
35
|
-
- **Wisdom
|
|
33
|
+
- **Knowledge(知识)**:来自高质量、高可信资料的知识;
|
|
34
|
+
- **Skills(技能)**:通过与你设计的、高度相关且可交互的课程练习获得的技能;
|
|
35
|
+
- **Wisdom(实践判断力)**:在学习环境之外与其他学习者和实践者互动后形成的判断力。
|
|
36
36
|
|
|
37
37
|
在 `RESOURCES.md` 尚未拥有足够可靠资料前,优先补齐资料。不要把参数化记忆当作事实来源。不同主题的重心不同:理论主题可能更依赖 Knowledge;身体、表演或操作性主题可能更依赖 Skills。
|
|
38
38
|
|
|
@@ -40,14 +40,14 @@ disable-model-invocation: true
|
|
|
40
40
|
|
|
41
41
|
区分两种学习强度:
|
|
42
42
|
|
|
43
|
-
- **Fluency strength
|
|
44
|
-
- **Storage strength
|
|
43
|
+
- **Fluency strength(流畅强度)**:当下能够顺畅提取或复述;
|
|
44
|
+
- **Storage strength(存储强度)**:经过时间后仍能提取、应用和迁移。
|
|
45
45
|
|
|
46
|
-
流畅会制造已经掌握的错觉,长期保持才是目标。用 desirable difficulty 建立 Storage strength:
|
|
46
|
+
流畅会制造已经掌握的错觉,长期保持才是目标。用 desirable difficulty(有益难度) 建立 Storage strength:
|
|
47
47
|
|
|
48
|
-
- retrieval practice
|
|
49
|
-
- spacing
|
|
50
|
-
- interleaving
|
|
48
|
+
- retrieval practice(提取练习):不看答案,从记忆中提取;
|
|
49
|
+
- spacing(间隔练习):把练习分散到不同时间;
|
|
50
|
+
- interleaving(交错练习):在技能练习中交错相关主题,而不是连续重复同一题型。
|
|
51
51
|
|
|
52
52
|
## 每次教学会话
|
|
53
53
|
|
|
@@ -56,7 +56,7 @@ disable-model-invocation: true
|
|
|
56
56
|
3. 用短诊断、回忆题或小任务估计用户当前基础和 Zone of Proximal Development。自述可以作为线索,但不能替代掌握证据。
|
|
57
57
|
4. 从高可信资料获得本课所需 Knowledge;资料不足、事实可能变化或用户要求核验时,使用 `$research` 完成有停止条件的调查,再把筛选后的来源写入 `RESOURCES.md`。
|
|
58
58
|
5. 只设计下一节最小课程:一个目标、必要知识、一次主动练习、紧反馈和一个高可信主要来源。课程必须直接服务 mission,并位于用户的 Zone of Proximal Development。
|
|
59
|
-
6.
|
|
59
|
+
6. 用户完成练习后检查证据。只有用户能正确回忆、应用或迁移时,才更新学习记录或术语表;讲过不等于学会。
|
|
60
60
|
7. 总结本次小胜利、仍不稳固之处、适合的复习时机和下一节候选目标。
|
|
61
61
|
|
|
62
62
|
`$teach` 可以调用 `$grilling` 或 `$research`;被调用 skill 返回访谈结果或证据后,控制权回到当前教学会话,不启动第二个 `$teach`。
|
|
@@ -97,11 +97,11 @@ Mission 会随着 Skills 和 Knowledge 增长而变化。变化时先与用户
|
|
|
97
97
|
|
|
98
98
|
Lesson 应围绕用户要获得的一项 skill 设计,只教授获得该 skill 必需的 Knowledge。先给必要知识,再让用户进入互动反馈循环。
|
|
99
99
|
|
|
100
|
-
Knowledge 必须优先来自 `RESOURCES.md` 中的可信资料。课程中的事实性主张应就近链接外部来源;推断和经验判断明确标注。获取 Knowledge
|
|
100
|
+
Knowledge 必须优先来自 `RESOURCES.md` 中的可信资料。课程中的事实性主张应就近链接外部来源;推断和经验判断明确标注。获取 Knowledge 时,无关难度会占用理解所需的工作记忆,应尽量降低。
|
|
101
101
|
|
|
102
102
|
## 技能
|
|
103
103
|
|
|
104
|
-
Knowledge 关乎获得,Skills 关乎耐久与迁移。技能练习可以有意增加难度,因为 effortful retrieval 会提高 Storage strength。
|
|
104
|
+
Knowledge 关乎获得,Skills 关乎耐久与迁移。技能练习可以有意增加难度,因为 effortful retrieval(费力提取) 会提高 Storage strength。
|
|
105
105
|
|
|
106
106
|
可用形式包括:
|
|
107
107
|
|
|
@@ -127,7 +127,7 @@ Wisdom 来自在学习环境之外检验 Skills。遇到需要实践判断的问
|
|
|
127
127
|
- 流程的算法与流程图;
|
|
128
128
|
- 动作、姿势和练习序列;
|
|
129
129
|
- 训练动作与计划;
|
|
130
|
-
-
|
|
130
|
+
- 任何具有专门术语的主题 glossary。
|
|
131
131
|
|
|
132
132
|
Glossary 尤其重要。一旦建立,后续 lessons、references 和 learning records 都应使用其中的 canonical language。
|
|
133
133
|
|