@netpilot/skills 0.7.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.
- 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 +10 -0
- package/README.md +3 -1
- package/package.json +1 -1
- package/skills/ask/SKILL.md +11 -10
- package/skills/ask/references/phase-boundaries.md +70 -0
- 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 +19 -11
- package/skills/grilling/agents/openai.yaml +2 -2
- package/skills/improve-codebase-architecture/SKILL.md +1 -1
- package/skills/prototype/SKILL.md +2 -2
- package/skills/prototype/references/logic.md +38 -58
- package/skills/prototype/references/ui.md +50 -42
- package/skills/to-questionnaire/SKILL.md +57 -0
- package/skills/to-questionnaire/agents/openai.yaml +6 -0
- package/skills/triage/SKILL.md +1 -1
- package/skills/wait-what/SKILL.md +7 -0
- package/skills/wait-what/agents/openai.yaml +6 -0
- package/skills/wayfinder/SKILL.md +1 -1
- package/skills/writing-for-agents/SKILL-MECHANICS.md +62 -0
- package/skills/writing-for-agents/SKILL.md +91 -0
- package/skills/writing-for-agents/agents/openai.yaml +6 -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
|
@@ -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.
|
|
5
|
+
"version": "0.8.0",
|
|
6
6
|
"description": "面向 Claude Code 的中文工程协作 skills 与可组合工作流",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "NetPilot"
|
package/AGENTS.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
## Skill 编写
|
|
15
15
|
|
|
16
|
-
- 修改 skill 前读取 `skills/writing-
|
|
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,16 @@
|
|
|
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
|
+
|
|
7
17
|
## 0.7.0
|
|
8
18
|
|
|
9
19
|
- 新增用户级 `security-reviewer` 与 `migration-reviewer`:前者按应用、Agent/Tool 与供应链 profile 审查信任边界,后者按 Expand → Migrate → Contract 审查 schema、回填、兼容切换与恢复;两者均保持 high / read-only 和统一 P0–P3 证据契约。
|
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
|
-
|
|
|
89
|
+
| 连续性 | `wait-what` | 上一条消息缺少背景或过于复杂 | 更简明的重述 |
|
|
90
|
+
| 维护 | `writing-for-agents` | 编写 Agent 使用的规则、Skill 或指针文档 | 可预测的 Agent 文档 |
|
|
89
91
|
|
|
90
92
|
## Codex Agents
|
|
91
93
|
|
package/package.json
CHANGED
package/skills/ask/SKILL.md
CHANGED
|
@@ -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. **分支——所有问题都能通过讨论确定吗?**
|
|
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
|
-
|
|
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
|
-
-
|
|
56
|
-
|
|
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
|
-
- **`
|
|
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-
|
|
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 判断,并且每次都按固定顺序询问。
|
package/skills/grill-me/SKILL.md
CHANGED
|
@@ -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`
|
|
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`
|
|
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.
|
|
20
|
+
2. 让 `$grilling` 计算并提出当前整个 frontier,逐题给出推荐答案,然后等待用户回答本轮。
|
|
21
|
+
3. 对本轮已经由用户确认的每个 decision,让 `$domain-modeling` 判断它是否属于稳定领域语言或值得长期保留的架构决策:
|
|
22
22
|
- 已确认的主术语、紧凑定义、上下文边界和不变量,最小化更新到相应 `CONTEXT.md`;
|
|
23
23
|
- 改变成本高、缺少背景会令人意外且存在真实替代方案的决定,按仓库既有格式创建、更新或 supersede ADR;
|
|
24
24
|
- 假设、临时偏好、普通实现细节和未决问题保留在访谈状态中,不写成项目事实。
|
|
25
|
-
4.
|
|
25
|
+
4. 本轮文档处理完成后把控制权交回当前 `$grilling`,根据回答重新计算 frontier,再进入下一轮。不要递归启动新的访谈。
|
|
26
26
|
5. 用户确认形成共同理解后,报告已确认结论、实际修改的文档、未写入的假设与未决项,以及适合的下一入口。
|
|
27
27
|
|
|
28
28
|
更新应随着决定形成而发生,不把所有结论积压到会话末尾。发现新回答与现有代码或文档冲突时,展示证据并让用户裁决,不静默覆盖。
|
package/skills/grilling/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
17
|
+
➡️ <推荐答案>
|
|
18
|
+
```
|
|
21
19
|
|
|
22
|
-
|
|
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
|
|
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)
|
|
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
|
+
因为它只有一个文件、无需安装,所以可以直接交给非开发者,例如 designer、PM 或 domain expert,让他们亲自感受模型。因此它必须使用他们的语言,而不是代码作者的语言。
|
|
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
|
+
外观可以漂亮,但要克制:清楚的 typography、宽松的 spacing、一个 accent colour。不要 animations 或 gimmicks,不要让任何东西与 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`。
|