@netpilot/skills 0.6.0 → 0.8.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.
Files changed (36) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/AGENTS.md +1 -1
  5. package/CHANGELOG.md +17 -0
  6. package/README.md +5 -1
  7. package/agents/codex/backend-reviewer.toml +4 -2
  8. package/agents/codex/frontend-reviewer.toml +2 -1
  9. package/agents/codex/migration-reviewer.toml +14 -0
  10. package/agents/codex/security-reviewer.toml +13 -0
  11. package/docs/agent-authoring.md +15 -0
  12. package/package.json +1 -1
  13. package/skills/ask/SKILL.md +11 -10
  14. package/skills/ask/references/phase-boundaries.md +70 -0
  15. package/skills/grill-me/SKILL.md +2 -2
  16. package/skills/grill-me/agents/openai.yaml +2 -2
  17. package/skills/grill-with-docs/SKILL.md +5 -5
  18. package/skills/grill-with-docs/agents/openai.yaml +1 -1
  19. package/skills/grilling/SKILL.md +19 -11
  20. package/skills/grilling/agents/openai.yaml +2 -2
  21. package/skills/improve-codebase-architecture/SKILL.md +1 -1
  22. package/skills/prototype/SKILL.md +2 -2
  23. package/skills/prototype/references/logic.md +38 -58
  24. package/skills/prototype/references/ui.md +50 -42
  25. package/skills/to-questionnaire/SKILL.md +57 -0
  26. package/skills/to-questionnaire/agents/openai.yaml +6 -0
  27. package/skills/triage/SKILL.md +1 -1
  28. package/skills/wait-what/SKILL.md +7 -0
  29. package/skills/wait-what/agents/openai.yaml +6 -0
  30. package/skills/wayfinder/SKILL.md +1 -1
  31. package/skills/writing-for-agents/SKILL-MECHANICS.md +62 -0
  32. package/skills/writing-for-agents/SKILL.md +91 -0
  33. package/skills/writing-for-agents/agents/openai.yaml +6 -0
  34. package/skills/writing-great-skills/SKILL.md +0 -125
  35. package/skills/writing-great-skills/agents/openai.yaml +0 -6
  36. package/skills/writing-great-skills/references/glossary.md +0 -279
@@ -10,7 +10,7 @@
10
10
  "name": "netpilot-skills",
11
11
  "source": "./",
12
12
  "description": "中文工程协作 skills 与可组合工作流",
13
- "version": "0.6.0",
13
+ "version": "0.8.0",
14
14
  "author": {
15
15
  "name": "NetPilot"
16
16
  },
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "netpilot-skills",
4
4
  "displayName": "NetPilot Skills",
5
- "version": "0.6.0",
5
+ "version": "0.8.0",
6
6
  "description": "面向 Claude Code 的中文工程协作 skills 与可组合工作流",
7
7
  "author": {
8
8
  "name": "NetPilot"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "netpilot-skills",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "面向 Codex 的中文工程协作 skills 与可组合工作流",
5
5
  "author": {
6
6
  "name": "NetPilot"
package/AGENTS.md CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  ## Skill 编写
15
15
 
16
- - 修改 skill 前读取 `skills/writing-great-skills/SKILL.md`。
16
+ - 修改 skill 前读取 `skills/writing-for-agents/SKILL.md`;涉及 Skill invocation、frontmatter 或 Router Skill 时继续读取其 `SKILL-MECHANICS.md`。
17
17
  - 每个 `SKILL.md` 的 description 必须说明触发范围和关键边界。Skill 真正包含顺序 steps 时,每一步在原位置结束于可检查的 completion criterion;reference-only skill 不为此伪造步骤。不得强制追加全局“完成标准”或“反模式”模板,反模式只在它提供上游方法本身的诊断价值时保留。
18
18
  - 新 skill 使用 kebab-case,并通过官方 skill 脚手架创建。
19
19
  - 每个 skill 必须提供 `agents/openai.yaml`;`default_prompt` 显式提到 `$skill-name`。
package/CHANGELOG.md CHANGED
@@ -4,6 +4,23 @@
4
4
 
5
5
  ## Unreleased
6
6
 
7
+ ## 0.8.0
8
+
9
+ - 按“保留优先”同步上游 v1.2.2 的关键方法:保留限定词、步骤顺序、completion criteria、诊断例子与 progressive disclosure 附件,只做去个人化、中文化、真实宿主映射和权限门禁适配。
10
+ - 将 `writing-great-skills` 原子迁移为 model-invoked 的 `writing-for-agents`,把适用范围扩展到全部 agent-consumed documents,并保留独立的 `SKILL-MECHANICS.md`;受管理的旧安装会安全移除,用户修改过的旧副本继续作为冲突保留。
11
+ - 将 `grilling` 及其调用方同步为 rounds/frontier 访谈:每轮询问所有已解锁决策,事实探索只阻塞其下游问题,frontier 清空后仍须用户确认 shared understanding。
12
+ - 为 `ask` 恢复完整 phase-boundary decision tree,固定 Continue → Clear / fresh context → `$handoff` → Subagent → Compact 的判断顺序,并把 handoff 收紧到真正需要 portability 的场景。
13
+ - 将 logic prototype 从 TUI 改为可双击和转交的单文件 HTML,恢复 free-play、tabbed walkthroughs、pure logic/DOM separation,以及 UI prototype 中用于区分两种形态的例子、理由和失败模式。
14
+ - 新增显式入口 `to-questionnaire` 与 `wait-what`:前者生成面向外部知识持有者的完整 discovery questionnaire,后者保持极短,只用项目术语补足上下文并重述上一条消息。
15
+ - 与 `@netpilot/harness` 协调发布同一 `v0.8.0` 标签;Skills 继续负责用户级能力,Harness 只负责项目级工程约束和 Agents。
16
+
17
+ ## 0.7.0
18
+
19
+ - 新增用户级 `security-reviewer` 与 `migration-reviewer`:前者按应用、Agent/Tool 与供应链 profile 审查信任边界,后者按 Expand → Migrate → Contract 审查 schema、回填、兼容切换与恢复;两者均保持 high / read-only 和统一 P0–P3 证据契约。
20
+ - 扩展 `backend-reviewer` 的 API 消费者兼容、查询、索引、Redis 与 fail-safe 检查,扩展 `frontend-reviewer` 的 contract 漂移、服务端授权和浏览器 console/network 证据要求。
21
+ - 在 Agent 编写规范中固定六个默认角色的主任务路由、去重与串行降级边界;打包、README 与 roster 测试同步覆盖 6 个 Codex Agents。
22
+ - 与 `@netpilot/harness` 协调发布同一 `v0.7.0` 标签;Harness 只路由用户级安全与 migration reviewer,不在项目 `.codex/agents` 复制同名角色。
23
+
7
24
  ## 0.6.0
8
25
 
9
26
  - 将用户级与项目级安装状态迁移到中性的 `.agents/.state/skills-installer`;旧 `.netpilot-skills` 在 apply 时经锁保护、目录身份复核后原子迁移,preview 仅报告计划。旧版客户端留下的精确空目录可安全自愈,真实双状态或目标冲突仍整批停止。
package/README.md CHANGED
@@ -70,6 +70,7 @@ Codex 使用 `$skill-name`;Claude Code 用户级安装使用 `/skill-name`。
70
70
  | 访谈 | `grill-me` | 深入盘问但不写文档 | 当前对话中的共识 |
71
71
  | 访谈 | `grill-with-docs` | 访谈时同步沉淀文档 | 领域文档与 ADR |
72
72
  | 访谈 | `grilling` | 供其他 Skills 复用访谈 | 已确认决定与未决分支 |
73
+ | 访谈 | `to-questionnaire` | 向掌握关键信息的人收集事实或决定 | 可异步填写的问卷 |
73
74
  | 探索 | `wayfinder` | 大型工作仍处于 fog of war | Decision map 与 frontier |
74
75
  | 探索 | `research` | 核验陌生或变化中的事实 | 带一手引用的研究文档 |
75
76
  | 探索 | `prototype` | 用低成本实验验证假设 | Throwaway artifact 与 verdict |
@@ -85,7 +86,8 @@ Codex 使用 `$skill-name`;Claude Code 用户级安装使用 `/skill-name`。
85
86
  | 质量 | `resolving-merge-conflicts` | 解决 merge/rebase 冲突 | 已验证的冲突解决结果 |
86
87
  | 维护 | `triage` | 推进 issue 或外部 PR | 标签、brief、评论或关闭结果 |
87
88
  | 连续性 | `handoff` | 跨会话或人员交接 | 可恢复的状态与下一步 |
88
- | 维护 | `writing-great-skills` | 创建、本地化或审查 Skill | 可验证的 Skill |
89
+ | 连续性 | `wait-what` | 上一条消息缺少背景或过于复杂 | 更简明的重述 |
90
+ | 维护 | `writing-for-agents` | 编写 Agent 使用的规则、Skill 或指针文档 | 可预测的 Agent 文档 |
89
91
 
90
92
  ## Codex Agents
91
93
 
@@ -93,6 +95,8 @@ Codex 使用 `$skill-name`;Claude Code 用户级安装使用 `/skill-name`。
93
95
  | --- | --- | --- |
94
96
  | `frontend-reviewer` | 前端状态、交互、可访问性和测试审查 | high / read-only |
95
97
  | `backend-reviewer` | 接口、权限、事务和数据一致性审查 | high / read-only |
98
+ | `security-reviewer` | 应用、Agent、Tool 与供应链安全审查 | high / read-only |
99
+ | `migration-reviewer` | schema、回填、兼容切换与恢复审查 | high / read-only |
96
100
  | `architecture-designer` | 模块边界、依赖和迁移方案比较 | high / read-only |
97
101
  | `test-verifier` | 执行测试、类型检查、lint 和构建 | medium / workspace-write |
98
102
 
@@ -1,11 +1,13 @@
1
1
  name = "backend-reviewer"
2
- description = "只读审查后端与接口变更的契约、权限、数据一致性、事务并发、幂等性、可观测性和测试风险。"
2
+ description = "只读审查后端、接口与数据访问变更的契约兼容、权限、事务并发、幂等性、可观测性和测试风险。"
3
3
  model_reasoning_effort = "high"
4
4
  sandbox_mode = "read-only"
5
5
  developer_instructions = """
6
6
  像后端代码所有者一样审查,优先正确性、安全边界和数据完整性。
7
7
  先读取适用的 AGENTS.md、规格、后端标准、接口契约、数据模型和完整 diff,再追踪必要的调用方、迁移与测试。
8
- 重点检查输入验证、认证授权、租户隔离、事务边界、并发与竞态、幂等、错误语义、重试、资源释放、日志与指标以及回归测试。
8
+ 重点检查输入验证、认证授权、租户隔离、事务边界、并发与竞态、幂等、错误语义、有限重试、资源释放、日志与指标以及回归测试。
9
+ 接口变更同时检查字段、枚举、分页、错误码、deprecation 和消费者兼容;数据库与缓存变更检查查询规模、索引、N+1、连接生命周期、Redis 失效与 fail-safe 行为。
10
+ 破坏性 schema 变更、回填或数据修复交给 migration reviewer;需要完整攻击路径或供应链判断时交给 security reviewer,避免在本角色重复专项清单。
9
11
  不要修改文件,不要执行生产或数据写入,不要把缺少个人偏好的抽象当成问题。
10
12
  返回固定结果:status 只能是 completed 或 blocked;finding priority 只能是 P0、P1、P2 或 P3。
11
13
  每个 finding 返回 file 与 line、trigger、impact、evidence 和 minimal fix,并明确区分已证实问题、未知项和建议验证。
@@ -5,7 +5,8 @@ sandbox_mode = "read-only"
5
5
  developer_instructions = """
6
6
  像前端代码所有者一样审查,但只报告有证据、可触发且值得修复的问题。
7
7
  先读取适用的 AGENTS.md、规格、前端标准、设计系统约束和完整 diff,再检查必要的调用方与测试。
8
- 重点检查行为正确性、状态同步、竞态与取消、错误和加载状态、键盘与屏幕阅读器可用性、组件职责、渲染成本以及测试缺口。
8
+ 重点检查行为正确性、状态同步、竞态与取消、loading、error、empty 与 success 状态、键盘与屏幕阅读器可用性、组件职责、渲染成本以及测试缺口。
9
+ 检查前端 contract 与真实接口是否漂移,路由、菜单和按钮权限是否被误作服务端授权;涉及运行时交互时要求可复现的浏览器、console 与 network 证据,不能用静态推断冒充真实验收。
9
10
  不要修改文件,不要安装依赖,不要把纯风格偏好或无法证明影响的猜测列为 finding。
10
11
  返回固定结果:status 只能是 completed 或 blocked;finding priority 只能是 P0、P1、P2 或 P3。
11
12
  每个 finding 返回 file 与 line、trigger、impact、evidence 和 minimal fix,并明确区分已证实问题与推断。
@@ -0,0 +1,14 @@
1
+ name = "migration-reviewer"
2
+ description = "只读审查 schema migration、回填、数据修复、兼容切换与旧路径删除的安全性和可恢复性。"
3
+ model_reasoning_effort = "high"
4
+ sandbox_mode = "read-only"
5
+ developer_instructions = """
6
+ 只做迁移审查,不修改文件,不执行数据库或数据写入,不连接生产环境。
7
+ 先读取适用的 AGENTS.md、CONTEXT、数据库与兼容性标准、schema diff、migration、回填脚本、数据规模、消费者清单、发布与恢复证据。
8
+ 以 Expand → Migrate → Contract 为默认顺序,检查新旧代码与数据的兼容窗口、部署顺序、锁表与长事务、索引构建、默认值和非空约束、大表批处理、限速、checkpoint、可重入、幂等、差异核对和失败样本。
9
+ 检查旧写冻结、双写或双读的事实源、消费者迁移、删除前零使用证据,以及 backup restore、rollback 或 forward-fix 是否与真实失败模式匹配。
10
+ 不要把本地 schema 校验当成生产可执行证据;生产数据量、隔离级别、执行计划、维护窗口或恢复演练缺失时明确列为 unknown。
11
+ 返回固定结果:status 只能是 completed 或 blocked;finding priority 只能是 P0、P1、P2 或 P3。
12
+ 每个 finding 返回 file 与 line、phase、trigger、数据量或并发假设、impact、evidence 和 minimal fix,并区分已证实问题、推断和开放问题。
13
+ 没有可执行问题时显式返回 no findings;最后列出 unknowns、未覆盖消费者与未执行验证。
14
+ """
@@ -0,0 +1,13 @@
1
+ name = "security-reviewer"
2
+ description = "只读审查应用、Agent 与供应链变更中的信任边界、权限、敏感数据、注入和特权工具风险。"
3
+ model_reasoning_effort = "high"
4
+ sandbox_mode = "read-only"
5
+ developer_instructions = """
6
+ 只做安全审查,不修改文件,不执行外部写入、生产操作或攻击性探测。
7
+ 先读取适用的 AGENTS.md、CONTEXT、security standards、威胁模型、完整 diff、配置、契约和拒绝路径测试,再标出 trusted source、untrusted source、transform、sink、数据敏感度与授权点。
8
+ 按变更选择最小必要 profile:应用安全检查认证授权、租户隔离、输入验证、XSS、CSRF、SSRF、SQL、shell 与 path 注入、文件上传、Webhook 重放、secrets、PII 和支付边界;Agent 与 Tool 安全检查外部内容到 privileged sink 的 source → transform → sink 路径、工具组合权限、持久记忆和 prompt injection;供应链安全检查依赖与 lockfile、CI action、Plugin、MCP、构建脚本的 provenance、版本固定、最小权限、更新和撤销证据。
9
+ 不要把已连接工具等同于授权,不要仅依赖 prompt 过滤或模型自律宣称风险已消除;未命中的 profile 不展开通用清单。
10
+ 返回固定结果:status 只能是 completed 或 blocked;finding priority 只能是 P0、P1、P2 或 P3。
11
+ 每个 finding 返回 file 与 line、profile、source、transform、sink、trigger、impact、evidence 和 minimal fix,并区分已证实问题、推断和开放问题。
12
+ 没有可执行问题时显式返回 no findings;最后列出 unknowns、未验证边界与未执行验证,不把未覆盖范围写成通过。
13
+ """
@@ -48,6 +48,21 @@ Agent 不应成为完整工作流、项目规范副本或长期人格。实现
48
48
 
49
49
  只读 Agent 返回事实、可定位证据、推断、未知项和建议下一步。Reviewer 使用 `completed | blocked` 状态和 P0–P3 finding,并返回 trigger、impact、evidence 与 minimal fix。Architecture designer 固定返回 current state、options、recommendation、migration slices、validation、decisions 与 unknowns。Verifier 使用 `passed | failed | blocked`,返回实际命令、退出码、关键输出、未执行项、执行前后工作树、环境限制和 `workspace_change`;新增 tracked diff 时不得返回 passed。不得把建议写成已经验证的结论。
50
50
 
51
+ ## 默认路由
52
+
53
+ 主 agent 按任务的主要风险面选择最少数量的角色;同一 finding 不交给多个 reviewer 重复判断。Agent 不可用时由主 agent 串行执行相同检查,并保留相同证据与失败标准。
54
+
55
+ | 主任务类型 | Agent | 不应代替 |
56
+ | --- | --- | --- |
57
+ | 模块 Interface、依赖方向、数据流与迁移方案比较 | `architecture-designer` | diff finding 或实现 |
58
+ | 后端、接口、事务、查询与缓存审查 | `backend-reviewer` | 专项安全或 migration 审查 |
59
+ | 前端状态、交互、可访问性与浏览器证据审查 | `frontend-reviewer` | 真实浏览器验收或服务端授权 |
60
+ | 应用、Agent、Tool 与供应链安全审查 | `security-reviewer` | 渗透测试或外部 mutation |
61
+ | schema、回填、数据修复与兼容切换审查 | `migration-reviewer` | 数据库写入或生产执行 |
62
+ | 执行已有测试、typecheck、lint 与 build | `test-verifier` | 测试设计审查或实现修复 |
63
+
64
+ 普通代码定位继续使用内置 `explorer`,实现继续使用内置 `worker`。测试质量由适用 reviewer 或 `code-review` 的 Standards 轴判断,不能把 `test-verifier` 扩成既执行又评价自身证据的万能角色。
65
+
51
66
  ## 双宿主策略
52
67
 
53
68
  Skills 保持 Codex 与 Claude Code 共用单源。Agent 配置是宿主专用适配,不强求两种宿主使用相同格式、模型名或权限语义。真正支持 Claude Code Agent 时,在独立宿主目录中实现并建立能力映射,不复制 Skill 工作流。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netpilot/skills",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "面向 Codex 与 Claude Code 的中文工程协作 skills 与可选 Codex agents",
5
5
  "keywords": [
6
6
  "codex",
@@ -15,10 +15,7 @@ disable-model-invocation: true
15
15
  这是多数产品与工程工作的路线。
16
16
 
17
17
  1. **`grill-with-docs`**:通过访谈磨清想法。有代码库,并希望把结论保留到 `CONTEXT.md` 或 ADR 时从这里开始。没有代码库则使用 `grill-me`。二者都复用同一个 `grilling` 访谈引擎;区别是 `grill-with-docs` 会留下项目文档。
18
- 2. **分支——所有问题都能通过讨论确定吗?** 如果某个问题需要可运行答案,例如状态、业务逻辑或必须亲眼比较的 UI,则通过 `handoff` 往返一次原型会话:
19
- - 用 `handoff` 保存当前上下文,并在新会话中引用该文件;
20
- - 用 `prototype` 以可丢弃代码回答问题;
21
- - 再用 `handoff` 把结论带回原想法会话。
18
+ 2. **分支——所有问题都能通过讨论确定吗?** 如果某个问题需要 runnable answer,例如状态、business logic 或必须亲眼比较的 UI,则 detour 到 `prototype`。在 phase boundary 按 [Phase Boundaries](references/phase-boundaries.md) 选择承载方式:同一 task 可以保留 Primary Source 时 Continue;prototype 需要独立且可 AFK 时使用 Subagent;只有切换宿主、目录或 worktree 等确实需要 portability 时,才用 `$handoff` 往返。
22
19
  3. **分支——是否需要多个会话才能完成?**
23
20
  - **是**:用 `to-spec` 把讨论整理成规格,再用 `to-tickets` 拆成 tracer-bullet tickets,并声明 blocking edges。远程 tracker 使用 native blocking;本地 tracker 使用一票一文件。随后每个 ticket 都在新鲜上下文中单独调用 `implement`。
24
21
  - **否**:在当前上下文直接调用 `implement`。
@@ -29,7 +26,7 @@ disable-model-invocation: true
29
26
 
30
27
  步骤 1–3 应留在一个连续上下文中:在 `to-tickets` 完成前不要 compact 或 clear,使访谈、规格和 tickets 建立在同一套推理上。每个 `implement` 随后从 ticket 开始,使用独立的新鲜上下文。
31
28
 
32
- 接近当前宿主与模型的可靠推理区边缘时,就提前用 `handoff` 转到新会话;不要等到判断质量已经下降。这里不依赖固定 token 数,因为不同宿主与模型的有效上下文不同。
29
+ 只在 phase boundary 做这项选择;按 Continue → Clear / fresh context → `$handoff` Subagent → Compact 的顺序,首个 yes 即为结果。若下一阶段需要当前 context 作为 Primary Source,或当前宿主与模型的可靠推理区仍足够,优先 Continue;若 relevant context 不能继续容纳下一阶段,使用宿主真实的 Compact 能力,而不是伪造固定 token 阈值。
33
30
 
34
31
  ## 入口支线
35
32
 
@@ -50,18 +47,22 @@ disable-model-invocation: true
50
47
 
51
48
  词语本身是问题时可直接调用;否则由上层流程按需调用。
52
49
 
53
- ## 跨会话
50
+ ## Phase Boundaries
54
51
 
55
- - **`handoff`**:当前会话已满、需要分叉到 prototype,或要交给其他 agent/人工时,把上下文写成 Markdown 文件。不要留在原处继续;打开新会话并引用该文件。它是上下文窗口之间的桥。
56
- - **宿主内置 compact**:留在同一会话,仅将较早消息摘要化。只在阶段之间的有意断点使用;不要在阶段中途 compact。`handoff` 创建新的继续点,compact 延续原会话。
52
+ `$handoff` 只在需要 portability 时使用:跨宿主、跨目录或仓库、交给同事,或 mid-phase 分叉 side task。相同宿主、相同目录且 context 仍 relevant 时,它不是一般 context-window bridge。
53
+
54
+ 读取 [phase-boundaries.md](references/phase-boundaries.md),按完整 ordered tree 比较 Continue、Clear / fresh context、`$handoff`、Subagent 与 Compact。除 Continue 外都会把 Primary Source 变成 lossy Secondary Source,所以先排除 Continue;Compact 是树底部的 default,而不是 first reach。
57
55
 
58
56
  ## 独立能力
59
57
 
60
58
  - **`grill-me`**:无代码库、无本地文档写入的深入访谈。
61
- - **`prototype`**:用从一开始就可丢弃的小程序回答一个设计问题;保留答案,删除或隔离实验代码。
59
+ - **`grilling`**:可被其他 skills 复用的访谈 primitive;以 rounds 询问整个 frontier,facts 由 agent 查明,decisions 由用户作出。
60
+ - **`prototype`**:用从一开始就可丢弃的小程序回答一个设计问题;保留答案,把完整实验代码移出 main 并留在带 context pointer 的 throwaway branch。
62
61
  - **`research`**:把阅读工作交给 background agent,以一手资料形成带引用的 Markdown artifact。研究为主流程提供材料,不代替后续判断。
62
+ - **`to-questionnaire`**:当阻塞信息在另一位知识持有者手里时,先询问 send 而不是 subject,再生成交给对方填写的 discovery questionnaire。回答可进入 `grill-with-docs` 或 `to-spec`。
63
+ - **`wait-what`**:上一条消息没有讲清楚时,用缺失 context 和项目 canonical terms 重新讲述;它只修复当前消息。
63
64
  - **`teach`**:以指定目录为状态化工作区,跨会话学习一个主题。
64
- - **`writing-great-skills`**:创建、改写、本地化或评估 skills
65
+ - **`writing-for-agents`**:创建或改写供 agent 使用的文档,包括 skills、`AGENTS.md` / `CLAUDE.md` 和由 Context Pointer 到达的 reference
65
66
  - **`resolving-merge-conflicts`**:处理已经开始的 merge/rebase 冲突,不主动发起合并。
66
67
 
67
68
  ## 路由与授权
@@ -0,0 +1,70 @@
1
+ # Phase Boundaries
2
+
3
+ **Phase** 是一个 task 内的一段工作,例如 grilling、implementation 或 QA。定义刻意保持 fuzzy:当你想到“好,这一段完成了”,一个 phase 就结束。
4
+
5
+ **Phase boundary** 是两个 phases 之间的间隙,也是唯一应该做下面选择的位置。Mid-phase 没有这项选择:Continue,或把剩余工作拆给 subagents。Mid-phase 压缩会让 agent 丢失正在处理的 thread。
6
+
7
+ ## 五个选项
8
+
9
+ | Option | 作用 |
10
+ | --- | --- |
11
+ | **Continue** | 留在当前 task,不发生 context switch。 |
12
+ | **Clear / fresh context** | 在完全不携带当前 context 的新 task 中开始。宿主有原生 clear 时使用该能力,否则显式新建 task。 |
13
+ | **`$handoff`** | 写一份 portable Markdown,并用它在其他位置启动 task。 |
14
+ | **Subagent** | 把任务发送到独立 context window,等待其报告返回。 |
15
+ | **Compact** | 用宿主真实的 context compaction / summary 能力压缩当前 context,再继续下一阶段。 |
16
+
17
+ ## 决策树
18
+
19
+ 在 boundary 从上到下判断,第一个 **yes** 获胜。
20
+
21
+ ### 1. 能否继续留在当前任务
22
+
23
+ 有两种 yes:
24
+
25
+ - 下一 phase 需要当前 phase 作为 **Primary Source**;
26
+ - 当前宿主与模型的可靠推理区仍足以容纳下一 phase。
27
+
28
+ Grilling → implementation 是标准 yes:implementation 需要逐字的 reasoning,而不是它的 summary。Continue 不花时间,也不损失信息,所以必须先排除它,再考虑其他动作。
29
+
30
+ ### 2. 当前上下文是否与下一阶段无关
31
+
32
+ 当前 task 中的 exploration、decisions 与 dead ends 是否都可丢弃?如果是,选择 **Clear / fresh context**。这是最便宜的切换:不需要写文档或生成 summary,并把完整 window 交还给下一阶段。
33
+
34
+ 判断错误的成本是单向的。清掉 relevant context 会丢失已经建立的 _why_,之后重新读取 diff 也无法恢复。
35
+
36
+ ### 3. 是否真的需要 handoff
37
+
38
+ `$handoff` 很窄,只在下列情况需要:
39
+
40
+ - 切换到 **new harness**;
41
+ - 移动到 **new directory**、worktree 或 repo;
42
+ - 把工作交给 **colleague**;
43
+ - 不打断当前工作地分叉一个 mid-phase **side task**。
44
+
45
+ 这就是完整 clause。Handoff 购买的是 **portability**——一份可以移动的文件。如果没有任何内容需要移动,就不需要 handoff。
46
+
47
+ ### 4. 任务能否 AFK 完成
48
+
49
+ 任务是否已经足够窄,可以在人离开键盘后独立执行,不需要 steering?如果是,交给 **Subagent**,当前 task 保持不动。自动 review 是标准例子:subagent 读取 diff 并返回报告,执行期间不需要用户。
50
+
51
+ ### 5. 否则选择 Compact
52
+
53
+ Context 仍然 relevant、宿主和目录不变,而且用户需要留在 loop 中时,决策树落到 **Compact**。给 compaction 一条说明,明确下一 phase 需要什么,例如“接下来要 QA 这个区域”,使 summary 保留所需材料。
54
+
55
+ Compact 是 **default, not the first reach**。它位于树的底部,因为前四个问题都更便宜或更精确。从 Compact 开始的 Failure Mode,是一个 fresh task 对 summary 压平的 decision 产生自信但错误的理解。
56
+
57
+ ## Primary Source 与 Secondary Source
58
+
59
+ 除 Continue 外,每个选择都会把 **Primary Source** 转成 **Secondary Source**:原 task 的完整发生过程被它的 summary 或空 context 取代。
60
+
61
+ | Source | Information | Noise | Room to move |
62
+ | --- | --- | --- | --- |
63
+ | Primary(Continue) | Full | Lots | Little |
64
+ | Secondary(Compact、`$handoff` 或 fresh context) | Lossy | Less | Lots |
65
+
66
+ 这就是问题 1 放在最前面的原因:只有 staying 的成本大于信息损失时,才支付 lossiness。
67
+
68
+ ## 这些是 Judgment Calls
69
+
70
+ 这些问题没有客观唯一答案;同一个 boundary 在不同日期可能走向不同分支。价值来自只在 boundary 判断,并且每次都按固定顺序询问。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: grill-me
3
- description: 对计划、设计、决策或想法开展一次毫不松懈的逐题访谈,直到关键分支形成共同理解。
3
+ description: 对计划、设计、决策或想法开展一次毫不松懈的分轮访谈,直到整个 frontier 形成共同理解。
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -8,6 +8,6 @@ disable-model-invocation: true
8
8
 
9
9
  运行 `$grilling`,以用户当前提供的计划、设计、决策或想法为访谈对象。
10
10
 
11
- `grill-me` 只是显式用户入口;访谈方法、问题顺序和停止判断全部由 `$grilling` 负责。
11
+ `grill-me` 只是显式用户入口;rounds、frontier、问题格式和停止判断全部由 `$grilling` 负责。
12
12
 
13
13
  `grill-me` 是 **stateless**:可以只读查明事实,但不创建或修改任何本地或远程 artifact,包括项目文件、临时交接文件、Git、tracker 或外部状态。唯一产物是当前对话中被磨清的共同理解。如果用户希望在访谈过程中同步维护 `CONTEXT.md`、领域术语或 ADR,说明差异并建议用户显式改用 `$grill-with-docs`,不要在本入口中静默切换为写入模式。
@@ -1,6 +1,6 @@
1
1
  interface:
2
2
  display_name: "Grill Me"
3
- short_description: "对计划、设计或决策开展逐题压力测试,直到形成共同理解"
4
- default_prompt: "请使用 $grill-me 对这个计划或设计逐题深入访谈,并为每个决策给出推荐答案。"
3
+ short_description: "对计划、设计或决策开展分轮压力测试,直到整个 frontier 清空"
4
+ default_prompt: "请使用 $grill-me 对这个计划或设计开展分轮访谈,并为 frontier 中每个决策给出推荐答案。"
5
5
  policy:
6
6
  allow_implicit_invocation: false
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: grill-with-docs
3
- description: 对计划或设计开展毫不松懈的逐题访谈,并在决定形成时同步维护项目领域文档与重要决策。
3
+ description: 对计划或设计开展毫不松懈的分轮访谈,并在每轮决定形成时同步维护项目领域文档与重要决策。
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
7
7
  # Grill With Docs
8
8
 
9
- 运行 `$grilling`,并在同一会话中使用 `$domain-modeling`。`$grilling` 负责沿决策树一次一题形成共同理解;`$domain-modeling` 负责把刚刚确认的领域语言和长期重要决定沉淀到正确文档。两者保持各自职责,不复制流程。
9
+ 运行 `$grilling`,并在同一会话中使用 `$domain-modeling`。`$grilling` 负责沿 design tree 以 rounds 询问整个 frontier;`$domain-modeling` 负责把当前 round 刚刚确认的领域语言和长期重要 decisions 沉淀到正确文档。两者保持各自职责,不复制流程。
10
10
 
11
11
  ## 写入边界
12
12
 
@@ -17,12 +17,12 @@ disable-model-invocation: true
17
17
  ## 组合循环
18
18
 
19
19
  1. 读取当前计划或设计、相关项目规则、已有 `CONTEXT.md`、上下文映射和 ADR。可以查明的事实直接查明。
20
- 2. 让 `$grilling` 选择并提出当前唯一的问题,给出推荐答案并等待用户决定。
21
- 3. 决定形成后,让 `$domain-modeling` 判断它是否属于稳定领域语言或值得长期保留的架构决策:
20
+ 2. 让 `$grilling` 计算并提出当前整个 frontier,逐题给出推荐答案,然后等待用户回答本轮。
21
+ 3. 对本轮已经由用户确认的每个 decision,让 `$domain-modeling` 判断它是否属于稳定领域语言或值得长期保留的架构决策:
22
22
  - 已确认的主术语、紧凑定义、上下文边界和不变量,最小化更新到相应 `CONTEXT.md`;
23
23
  - 改变成本高、缺少背景会令人意外且存在真实替代方案的决定,按仓库既有格式创建、更新或 supersede ADR;
24
24
  - 假设、临时偏好、普通实现细节和未决问题保留在访谈状态中,不写成项目事实。
25
- 4. 文档处理完成后把控制权交回当前 `$grilling` 循环,再进入下一个决策分支。不要递归启动新的访谈。
25
+ 4. 本轮文档处理完成后把控制权交回当前 `$grilling`,根据回答重新计算 frontier,再进入下一轮。不要递归启动新的访谈。
26
26
  5. 用户确认形成共同理解后,报告已确认结论、实际修改的文档、未写入的假设与未决项,以及适合的下一入口。
27
27
 
28
28
  更新应随着决定形成而发生,不把所有结论积压到会话末尾。发现新回答与现有代码或文档冲突时,展示证据并让用户裁决,不静默覆盖。
@@ -1,6 +1,6 @@
1
1
  interface:
2
2
  display_name: "Grill With Docs"
3
- short_description: "逐题挑战计划或设计,同时维护 CONTEXT 与必要 ADR"
3
+ short_description: "分轮挑战计划或设计,同时维护 CONTEXT 与必要 ADR"
4
4
  default_prompt: "请使用 $grill-with-docs 深入检验这个方案,并同步维护已确认的领域术语与重要决策。"
5
5
  policy:
6
6
  allow_implicit_invocation: false
@@ -1,22 +1,30 @@
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
+ 毫不松懈地访谈用户,直到双方形成共同理解。把讨论绘制成 **design tree**:每个 decision 都会分叉出依赖它的 decisions。
9
9
 
10
- ## 访谈循环
10
+ **rounds** 推进这棵树。**frontier** 是 prerequisites 已经解决的全部 decisions,也就是现在不需要猜测尚未听到的答案、可以立即询问的问题。每一轮询问整个 frontier:给每个问题编号,并给出推荐答案。随后等待用户回答,再进入下一轮。
11
11
 
12
- 1. 从当前对话、用户提供的材料和可用环境中建立决策树。区分已知事实、暂定假设、用户已经作出的决定和仍开放的分支。
13
- 2. 选择当前最可能改变范围、方案或风险的一个开放分支。
14
- 3. 一次只问一个问题,并等待用户回答后再继续。每个问题都给出你的推荐答案及最关键的理由或取舍;推荐不是替用户作决定。
15
- 4. 检查回答是否解决了该分支,是否与较早决定冲突,以及是否暴露了新的上游依赖。必要时先处理新依赖,再回到原分支。
16
- 5. 更新决策树并继续,直到每个重要分支都已解决、明确 deferred,或经用户确认为 out of scope。需要研究、原型、外部权限或未来信息时,把访谈标记为暂停/阻塞并返回所需证据;不能把这些未决分支当作已经形成 shared understanding。
12
+ 每个问题都使用下面的格式:
17
13
 
18
- 如果一个事实可以通过文件系统、代码、文档或可用工具查明,先自行查明并把证据带回问题中,不要把检索工作转嫁给用户。决定属于用户:即使你有强烈推荐,也要把选择交给用户并等待回答。
14
+ ```text
15
+ ❓ **Q1** - **<问题标题>**:<问题正文;可以包含多个 paragraphs 或 multiple choices>
19
16
 
20
- 除只读查明事实外,在用户明确确认双方已经形成共同理解前,不基于方案执行任何写入或外部动作,包括实施、建 issue、写 spec、改 tracker 状态或创建 artifact。`grill-with-docs` 是显式 wrapper:它只在每个具体决定已经由用户确认后,按自身授权即时沉淀文档。
17
+ ➡️ <推荐答案>
18
+ ```
21
19
 
22
- 用户确认后才结束访谈并把结果交回调用方。若由另一 skill 调用,返回已确认决定、仍未解决的分支及所需证据,由调用方决定产物格式和下一步;不要夺取调用方的工作流。
20
+ 用户每回答一轮,design tree 都会改变:已解决的 decisions 会把 frontier 向外推进,并解锁依赖它们的问题。根据回答重新计算 frontier,再询问下一轮。本轮中某个问题如果仍依赖另一个开放问题的答案,就属于 _later round_,不能放进当前轮。
21
+
22
+ 查明 _facts_ 是 agent 的工作,不能转嫁给用户。Frontier 问题需要文件系统、工具或其他 environment facts 时,dispatch subagent 去查明。不要因此阻塞整个 round:正在运行的探索是一个尚未解决的 prerequisite,所以只有依赖它的问题等待 subagent 返回;立即询问 frontier 中其余问题。_decisions 属于用户_:把每项选择交给用户并等待回答,推荐答案不能替用户作决定。
23
+
24
+ 当 frontier 为空时,访谈达到 Completion Criterion:design tree 的每个 branch 都已访问,没有 silent assumption。
25
+
26
+ Frontier 为空后仍不能立即行动;必须等待用户确认双方已经形成共同理解。
27
+
28
+ 除只读查明 facts 外,在用户明确确认双方已经形成共同理解前,不基于方案执行任何写入或外部动作,包括实施、建 issue、写 spec、改 tracker 状态或创建 artifact。`grill-with-docs` 是显式 wrapper:它只在当前 round 中每个具体 decision 已由用户确认后,按自身授权即时沉淀文档。
29
+
30
+ 用户确认后才结束访谈并把结果交回调用方。若由另一 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
@@ -78,7 +78,7 @@ disable-model-invocation: true
78
78
 
79
79
  用户选择候选项后:
80
80
 
81
- 1. 调用 `$grilling`,一次一个问题确认约束、依赖、deep Module 的 shape、Seam 后的职责和能够保留的测试。
81
+ 1. 调用 `$grilling`,以 rounds 询问当前全部 frontier,确认约束、依赖、deep Module 的 shape、Seam 后的职责和能够保留的测试。
82
82
  2. 领域词汇变化时调用 `$domain-modeling`:
83
83
  - 新概念确实稳定时加入 `CONTEXT.md`;
84
84
  - fuzzy term 被澄清时立即更新;
@@ -11,7 +11,7 @@ Prototype 是**用可丢弃代码回答一个问题**。问题决定它的形状
11
11
 
12
12
  从用户提示、相邻代码或一次澄清中确认问题:
13
13
 
14
- - **“这套 logic / state model 是否合理?”** → 读取 [logic.md](references/logic.md),构建一个小型交互式 terminal app,让用户推动纸面上难以判断的状态。
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. **一条命令运行。** 使用项目已有 task runner,例如 `pnpm <name>`、`python <path>` 或 `bun <path>`;用户不应记忆内部文件路径。
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
- 构建一个小型交互式 terminal app,让用户手动推动 business logic、state transition 或 data shape
3
+ 一个自包含的 HTML 文件——一份 **shareable demo**——让任何人通过点击按钮推动 state model。问题涉及 **business logic、state transitions 或 data shape** 时使用:这些模型在纸面上看起来合理,只有真正经过具体情形时才会显出不对劲。
4
4
 
5
- ## 适用情形
5
+ 因为它只有一个文件、无需安装,所以可以直接交给非开发者,例如 designer、PM 或 domain expert,让他们亲自感受模型。因此它必须使用他们的语言,而不是代码作者的语言。
6
6
 
7
- - “我不确定 X 后再发生 Y 时,这个 state machine 是否正确。”
8
- - “这套 data model 能否表达某个边界情况?”
9
- - “实现前我想先感受一下 API 应该是什么形状。”
10
- - 用户需要“按键并观察状态改变”。
7
+ ## 何时适合这种形态
11
8
 
12
- 若问题是“它应该长什么样”,改用 `ui.md`。
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
- README 或主文件顶部用一段话写明待验证的 state model 与问题。用户无论在线还是之后回来,都必须能判断 prototype 是否回答了正确问题。
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
- 每个 tick 清屏并重绘整个 frame,而不是不断追加 scrollback。
22
+ ### 2. 在可移植 Module 中隔离 logic
40
23
 
41
- Frame 按顺序包含:
24
+ 把真正回答问题的 logic 放进单一 `<script>` block,写成小而 pure、以后可从页面中提取并放进真实 codebase 的 Module。周围的页面是 throwaway;这个 Module 不是。
42
25
 
43
- 1. **Current state**:每字段一行或 formatted JSON。字段名/标题可用 bold,timestamp、ID、derived value 可用 dim。已有 styling library 才复用;否则 ANSI escape 足够。
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
- 1. 初始化单一 in-memory state;
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
- 整个 frame 应能放入一个 terminal screen。
35
+ ### 3. 构建 shareable HTML 文件
56
36
 
57
- ### 5. 一条命令运行
37
+ 只用一个 plain HTML/CSS/JS 文件:不用 framework、bundler 或 server,全部 inline,使它可以双击打开,也可以通过邮件转交。任何人打开文件就能运行。
58
38
 
59
- 把运行入口加入现有 `package.json`、`Makefile`、`justfile` `pyproject.toml`。用户应只需执行 `pnpm run <prototype-name>` 或等价命令。
39
+ 面向非开发者编写。每个 label 都使用 **domain language**,而不是代码术语;buttons state 应像业务,而不是像 reducer。用朴素语言解释正在发生什么。
60
40
 
61
- 项目没有 task runner 时,把完整命令写在 prototype 顶部。
41
+ 从上到下采用清楚的层级:
62
42
 
63
- ### 6. 交给用户操作
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
+ 外观可以漂亮,但要克制:清楚的 typography、宽松的 spacing、一个 accent colour。不要 animations 或 gimmicks,不要让任何东西与 state 和 buttons 争夺注意力。
70
51
 
71
- 用户需要新 action 时可以追加,但每次追加都必须继续服务原问题。
52
+ ### 4. 交给对方操作
72
53
 
73
- ### 7. 捕获答案与证据
54
+ 把文件发给对方,或替对方打开。他们可以在方便时完成 walkthroughs 和 free-play;最有价值的时刻通常是“等等,这不应该发生”或“原来如此,我以为 X 会不一样”——这些是 *idea* 中的 bugs,也正是 prototype 的目的。对方需要新 action 或新 scenario 时就加入;prototypes 会演进。
74
55
 
75
- 问题回答后:
56
+ ### 5. 捕获答案与 prototype
76
57
 
77
- - validated reducer、machine 或 pure functions 可以作为正式实现输入;只有另行授权 `$implement` 后才写入正式代码;
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
- - 不给 prototype 本身补测试。
84
- - 除非问题就是 persistence,否则不连接真实数据库。
85
- - 不泛化未来可能需求。
86
- - 不把 logic TUI 混在一起。
87
- - 不把 TUI shell 直接送入生产。
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`。