@optima-chat/optima-agent 0.8.99 → 0.8.100
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/skills/ingesting-sources/SKILL.md +21 -30
- package/.claude/skills/initializing-kb/SKILL.md +72 -57
- package/.claude/skills/kol-outreach/SKILL.md +213 -431
- package/.claude/skills/linting-the-wiki/SKILL.md +17 -26
- package/.claude/skills/querying-the-wiki/SKILL.md +20 -27
- package/.claude/skills/updating-related-pages/SKILL.md +19 -30
- package/package.json +1 -1
|
@@ -1,42 +1,37 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ingesting-sources
|
|
3
|
-
description:
|
|
3
|
+
description: "将新素材收录到知识库。当用户说'收录这篇文章'、'把这个加到知识库'时使用。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Ingesting Sources
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
把原始材料做第一次落库,进入持续维护的 wiki 结构。产物不只是摘要,而是一页来源页,以及一份"还有哪些页面需要随之更新"的映射。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 启动 SOP
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
1. `ls ~/kb/REGISTRY.md`
|
|
13
|
+
- 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
|
|
14
|
+
2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
|
|
15
|
+
3. 确定目标 KB:
|
|
16
|
+
- 用户明确指定了 KB slug 或主题 → 直接用
|
|
17
|
+
- 只有一个 active KB → 用它
|
|
18
|
+
- 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
|
|
19
|
+
4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
|
|
16
20
|
|
|
17
|
-
##
|
|
21
|
+
## Ingest 流程
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
- 泛化问答
|
|
21
|
-
|
|
22
|
-
## 工作规则
|
|
23
|
-
|
|
24
|
-
来源页不仅要说明来源说了什么,还要说明它会如何影响 wiki 的其他部分。
|
|
25
|
-
|
|
26
|
-
## 流程
|
|
27
|
-
|
|
28
|
-
使用这个 skill 时,按以下顺序进行:
|
|
29
|
-
|
|
30
|
-
1. 在 `raw/` 中定位来源文件
|
|
23
|
+
1. 在 `~/kb/<slug>/raw/` 中定位来源文件
|
|
31
24
|
2. 仔细阅读来源,提取主要论点、证据、实体和开放问题
|
|
32
|
-
3. 在
|
|
25
|
+
3. 在 `~/kb/<slug>/wiki/sources/` 中创建或更新对应页面
|
|
33
26
|
4. 列出哪些 entity、overview 和 analysis 页面受到影响
|
|
34
|
-
5.
|
|
35
|
-
6. 如果这个来源是首次进入 wiki
|
|
27
|
+
5. 如果任务范围包含来源页之外的更新,交给 updating-related-pages 处理,或执行一次有边界的相关页更新
|
|
28
|
+
6. 如果这个来源是首次进入 wiki,更新 `~/kb/<slug>/index.md` 和 `~/kb/<slug>/log.md`
|
|
29
|
+
7. 追加 `~/kb/PROGRESS.md`
|
|
30
|
+
8. `cd ~/kb && git add -A && git commit -m "[<slug>] ingest: <来源名>"`
|
|
36
31
|
|
|
37
32
|
## 来源页内容
|
|
38
33
|
|
|
39
|
-
|
|
34
|
+
来源页应至少包含:
|
|
40
35
|
|
|
41
36
|
- 来源标题
|
|
42
37
|
- 简短摘要
|
|
@@ -48,9 +43,7 @@ description: Use when new source material needs to be incorporated into a mainta
|
|
|
48
43
|
|
|
49
44
|
## 抽取规则
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- 将来源明确表达的内容与你自己的综合推断区分开
|
|
46
|
+
- 将来源明确表达的内容与综合推断区分开
|
|
54
47
|
- 不要把大段原文直接复制进 wiki
|
|
55
48
|
- 优先写成简洁、可链接、之后可更新的陈述
|
|
56
49
|
- 当来源含混或不完整时,显式记录不确定性
|
|
@@ -58,7 +51,7 @@ description: Use when new source material needs to be incorporated into a mainta
|
|
|
58
51
|
|
|
59
52
|
## 何时创建相关页面
|
|
60
53
|
|
|
61
|
-
|
|
54
|
+
出现下列情况时应建议新建页面:
|
|
62
55
|
|
|
63
56
|
- 某个人、组织、产品或概念很重要,但还没有稳定页面
|
|
64
57
|
- 来源引入了一个新的 recurring topic
|
|
@@ -72,5 +65,3 @@ description: Use when new source material needs to be incorporated into a mainta
|
|
|
72
65
|
- 一页可用的 `wiki/sources/` 页面
|
|
73
66
|
- 一份清晰的受影响页面列表
|
|
74
67
|
- 足够明确的结构,使下一步 update 很自然
|
|
75
|
-
|
|
76
|
-
如果 ingest 最终只留下了一段模糊摘要,而没有连到 wiki 的其他部分,那它就是不完整的。
|
|
@@ -1,80 +1,79 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: initializing-kb
|
|
3
|
-
description:
|
|
3
|
+
description: "创建新知识库或初始化 ~/kb/ 工作空间。当用户说'建个知识库'、'我想整理XX的知识'时使用。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Initializing KB
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
创建一个基于 Markdown 的知识库。主要产物是 `~/kb/<slug>/` 目录和其中的 `AGENTS.md`。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 核心:~/kb/ 工作目录
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
- 定义命名约定
|
|
14
|
-
- 定义 ingest、query 和 lint 工作流
|
|
15
|
-
- 创建或更新 `AGENTS.md`
|
|
12
|
+
所有知识库都在 `~/kb/` 下,每个知识库一个子目录。
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
```text
|
|
15
|
+
~/kb/
|
|
16
|
+
├── REGISTRY.md
|
|
17
|
+
├── PROGRESS.md
|
|
18
|
+
├── <slug>/
|
|
19
|
+
│ ├── AGENTS.md
|
|
20
|
+
│ ├── index.md
|
|
21
|
+
│ ├── log.md
|
|
22
|
+
│ ├── raw/
|
|
23
|
+
│ └── wiki/
|
|
24
|
+
│ ├── overview/
|
|
25
|
+
│ ├── entities/
|
|
26
|
+
│ ├── sources/
|
|
27
|
+
│ └── analyses/
|
|
28
|
+
└── .git/
|
|
29
|
+
```
|
|
21
30
|
|
|
22
|
-
##
|
|
31
|
+
## 启动 SOP
|
|
23
32
|
|
|
24
|
-
|
|
33
|
+
1. `ls ~/kb/REGISTRY.md`
|
|
34
|
+
- 不存在 → 初始化根目录(见下方"首次初始化")
|
|
35
|
+
- 存在 → 读 `REGISTRY.md`,了解已有的知识库
|
|
36
|
+
2. 询问用户要创建什么主题的知识库
|
|
25
37
|
|
|
26
|
-
##
|
|
38
|
+
## 首次初始化
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
如果 `~/kb/` 不存在:
|
|
29
41
|
|
|
30
|
-
1.
|
|
31
|
-
2.
|
|
32
|
-
3. 判断现有结构是可小修复用,还是需要更强约束的重整
|
|
33
|
-
4. 定义这个仓库所需的最小页面类型集合
|
|
34
|
-
5. 编写或更新 `AGENTS.md`
|
|
35
|
-
6. 做少量与规则匹配的模板调整,保证仓库布局和规则一致
|
|
42
|
+
1. `mkdir -p ~/kb`
|
|
43
|
+
2. 创建 `~/kb/REGISTRY.md`:
|
|
36
44
|
|
|
37
|
-
|
|
45
|
+
```markdown
|
|
46
|
+
# 知识库注册表
|
|
38
47
|
|
|
39
|
-
|
|
48
|
+
| slug | 主题 | 状态 | 创建日期 | 说明 |
|
|
49
|
+
|------|------|------|----------|------|
|
|
50
|
+
```
|
|
40
51
|
|
|
41
|
-
|
|
52
|
+
3. 创建 `~/kb/PROGRESS.md`:
|
|
42
53
|
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
overview/
|
|
47
|
-
entities/
|
|
48
|
-
sources/
|
|
49
|
-
analyses/
|
|
50
|
-
index.md
|
|
51
|
-
log.md
|
|
52
|
-
AGENTS.md
|
|
53
|
-
```
|
|
54
|
+
```markdown
|
|
55
|
+
# 知识库工作日志
|
|
56
|
+
```
|
|
54
57
|
|
|
55
|
-
|
|
58
|
+
4. `cd ~/kb && git init && git add -A && git commit -m "init kb workspace"`
|
|
56
59
|
|
|
57
|
-
|
|
60
|
+
## 创建知识库
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
- `
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
- 实体页:`kebab-case-entity-name.md`
|
|
73
|
-
- 综述页:`kebab-case-topic-name.md`
|
|
62
|
+
1. 询问用户知识库主题
|
|
63
|
+
2. 从主题生成 kebab-case slug 建议(不带 `-kb` 后缀)
|
|
64
|
+
3. 校验 slug:
|
|
65
|
+
- 匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
|
|
66
|
+
- 不与 `REGISTRY.md` 已有 slug 重复
|
|
67
|
+
- 让用户确认或修改
|
|
68
|
+
4. `mkdir -p ~/kb/<slug>`
|
|
69
|
+
5. 检查当前素材(如果用户指定了已有目录或文件)
|
|
70
|
+
6. 确定所需的最小页面类型集合
|
|
71
|
+
7. 创建 `AGENTS.md`(见下方"AGENTS.md 内容")
|
|
72
|
+
8. 创建 `index.md`、`log.md`、`raw/`、`wiki/overview/`、`wiki/entities/`、`wiki/sources/`、`wiki/analyses/`
|
|
73
|
+
9. 追加 `~/kb/REGISTRY.md` 新行
|
|
74
|
+
10. `cd ~/kb && git add -A && git commit -m "[<slug>] init: <主题>"`
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
## `AGENTS.md` 必须定义什么
|
|
76
|
+
## AGENTS.md 内容
|
|
78
77
|
|
|
79
78
|
至少应包含:
|
|
80
79
|
|
|
@@ -89,6 +88,24 @@ AGENTS.md
|
|
|
89
88
|
- 何时应新建页面,而不是继续扩写旧页
|
|
90
89
|
- agent 修改后的输出要求
|
|
91
90
|
|
|
91
|
+
## 页面模型
|
|
92
|
+
|
|
93
|
+
默认页面职责:
|
|
94
|
+
|
|
95
|
+
- `wiki/sources/`:每个来源一页
|
|
96
|
+
- `wiki/entities/`:每个跨多个来源反复出现的稳定实体或概念一页
|
|
97
|
+
- `wiki/overview/`:每个主题或认知领域一页
|
|
98
|
+
- `wiki/analyses/`:长期有效的答案、比较、综合或决策记录
|
|
99
|
+
|
|
100
|
+
避免混淆这些角色。
|
|
101
|
+
|
|
102
|
+
## 命名规则
|
|
103
|
+
|
|
104
|
+
- 来源页:`YYYY-MM-DD-short-source-name.md`
|
|
105
|
+
- 分析页:`YYYY-MM-DD-short-analysis-name.md`
|
|
106
|
+
- 实体页:`kebab-case-entity-name.md`
|
|
107
|
+
- 综述页:`kebab-case-topic-name.md`
|
|
108
|
+
|
|
92
109
|
## 好的结果
|
|
93
110
|
|
|
94
111
|
一个好的 schema 应该让这些决策变得容易:
|
|
@@ -98,5 +115,3 @@ AGENTS.md
|
|
|
98
115
|
- 一个高价值答案应该写回哪里
|
|
99
116
|
- 冲突信息应如何呈现
|
|
100
117
|
- 之后如何再次找到这些页面
|
|
101
|
-
|
|
102
|
-
如果更新完 `AGENTS.md` 之后这些决策仍然模糊,说明 schema 还没有完成。
|
|
@@ -1,450 +1,232 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: kol-outreach
|
|
3
|
-
description:
|
|
3
|
+
description: |
|
|
4
|
+
KOL outreach automation: discover TikTok KOLs, extract emails, send personalized outreach, handle replies, negotiate deals.
|
|
5
|
+
Trigger: user says '帮我找 KOL', 'KOL 建联', 'KOL 进展', or message contains [KOL_INBOUND:{campaignId}] / [KOL_INBOUND].
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# KOL 建联
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
端到端 TikTok KOL 建联自动化:发现、触达、谈判、成交。
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
## 核心:~/kol-outreach/ 工作目录
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
- 运行时默认零打扰,优先按已固化配置执行
|
|
14
|
-
- 本 skill 只负责操作,不解释系统实现
|
|
14
|
+
所有状态都在 `~/kol-outreach/`(单个 git repo)。每次会话只做一件事。
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
**每次会话启动**:
|
|
17
|
+
|
|
18
|
+
1. 检查 `~/kol-outreach/BRAND.md` 是否存在且已完整填写 — 不存在或未完成则走初始化
|
|
19
|
+
2. 读 `CAMPAIGNS.md` — 了解所有 campaign 状态
|
|
20
|
+
3. `git -C ~/kol-outreach log --oneline -5` — 最近变更
|
|
21
|
+
4. 根据用户意图 + 文件状态决定本次操作
|
|
22
|
+
|
|
23
|
+
| 文件 | 层级 | 用途 |
|
|
24
|
+
|------|------|------|
|
|
25
|
+
| `BRAND.md` | merchant | 品牌素材、兜底话术、升级关键词 |
|
|
26
|
+
| `MERCHANT_LIMITS.md` | merchant | 日发信配额(跨 campaign 共享) |
|
|
27
|
+
| `CAMPAIGNS.md` | merchant | campaign 索引 |
|
|
28
|
+
| `PROGRESS.md` | merchant | 跨 campaign 关键事件 |
|
|
29
|
+
| `campaigns/{id}/CONFIG.md` | campaign | 商品、预算、条款、运行参数 |
|
|
30
|
+
| `campaigns/{id}/KOLS.md` | campaign | KOL 状态索引(status: `pending_outreach` / `awaiting_reply` / `in_progress` / `deal_reached` / `needs_merchant_followup` / `rejected` / `expired` / `send_error` / `no_contact`) |
|
|
31
|
+
| `campaigns/{id}/TEMPLATES.md` | campaign | 邮件模板(LLM 只填变量) |
|
|
32
|
+
| `campaigns/{id}/PROGRESS.md` | campaign | 本 campaign 事件日志 |
|
|
33
|
+
| `campaigns/{id}/CONVERSATIONS/{username}.md` | campaign | 每个 KOL 的完整对话 |
|
|
17
34
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
3.
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
- 追加到 `KOLS.md`
|
|
199
|
-
- `status=no_contact`
|
|
200
|
-
- `git commit -m "[{campaignId}] discovered N KOLs"`
|
|
201
|
-
|
|
202
|
-
8. 发送首发 outreach
|
|
203
|
-
- 只处理 `status=pending_outreach`,并限制在本轮发送量内
|
|
204
|
-
- 读取 `TEMPLATES.md` 中的 `first_outreach_v1`
|
|
205
|
-
- 让 LLM 只输出模板变量 JSON,例如:
|
|
206
|
-
|
|
207
|
-
```json
|
|
208
|
-
{
|
|
209
|
-
"kol_first_name": "...",
|
|
210
|
-
"opener_line": "...",
|
|
211
|
-
"fit_reason": "...",
|
|
212
|
-
"product_one_liner": "..."
|
|
213
|
-
}
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
- 用模板渲染正文,不要直接自由写 body
|
|
217
|
-
- 终检:
|
|
218
|
-
- body 不含 `forbidden_phrases`
|
|
219
|
-
- body 长度 `<= 2000`
|
|
220
|
-
- 任一不过:
|
|
221
|
-
- 写 `KOLS.md` 为 `send_error`
|
|
222
|
-
- 记 `PROGRESS.md`
|
|
223
|
-
- 跳过该 KOL
|
|
224
|
-
|
|
225
|
-
9. 调 `scout outreach send`
|
|
226
|
-
|
|
227
|
-
```bash
|
|
228
|
-
echo '{
|
|
229
|
-
"to": "kol_email",
|
|
230
|
-
"subject": "Collaboration opportunity with <brand_name>",
|
|
231
|
-
"body": "<rendered body>",
|
|
232
|
-
"from_merchant_id": "<merchantId>",
|
|
233
|
-
"from_campaign_id": "<campaignId>",
|
|
234
|
-
"from_brand_slug": "<BRAND.brand_slug>",
|
|
235
|
-
"from_brand_name": "<BRAND.brand_name>",
|
|
236
|
-
"from_contact_name": "<effective contact_name>"
|
|
237
|
-
}' | scout outreach send
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
10. 写回状态
|
|
241
|
-
- 在 `CONVERSATIONS/{username}.md` 追加 Round 1
|
|
242
|
-
- 把返回的 `message_id` 写入 conversation
|
|
243
|
-
- 更新 `KOLS.md`
|
|
244
|
-
- `pending_outreach -> awaiting_reply`
|
|
245
|
-
- `offer = first_offer`
|
|
246
|
-
- 更新 `MERCHANT_LIMITS.md`
|
|
247
|
-
- `sent_today += 1`
|
|
248
|
-
- 追加本 campaign 的 `PROGRESS.md`
|
|
249
|
-
- 重要事件同步追加 merchant `PROGRESS.md`
|
|
250
|
-
- `git commit -m "[{campaignId}] outreach sent to @{username}"`
|
|
251
|
-
|
|
252
|
-
11. 告诉商家本次发送结果。
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
## 流程 D:处理 KOL 回信
|
|
257
|
-
|
|
258
|
-
先按这个顺序执行:
|
|
259
|
-
|
|
260
|
-
- 先确定 campaign 和 KOL
|
|
261
|
-
- 先做预检,再决定是否调用 LLM
|
|
262
|
-
- LLM 只输出结构化决策,不直接写邮件正文
|
|
263
|
-
- 任何校验不过都降级为 `escalate`
|
|
264
|
-
- 每轮处理完都要写回文件、commit,并调用 `sentinel report`
|
|
265
|
-
|
|
266
|
-
1. 读取本次 inbound 的消息内容
|
|
267
|
-
- 从当前消息中读取:
|
|
268
|
-
- `From`
|
|
269
|
-
- `Subject`
|
|
270
|
-
- `Message-ID`
|
|
271
|
-
- `In-Reply-To`
|
|
272
|
-
- `References`
|
|
273
|
-
- `Body`
|
|
274
|
-
|
|
275
|
-
2. 确定 campaign
|
|
276
|
-
- 如果消息包含 `[KOL_INBOUND:{campaignId}]`:只处理该 campaign
|
|
277
|
-
- 如果消息包含 `[KOL_INBOUND]`:稍后在步骤 3 通过 `from_email` 匹配 campaign
|
|
278
|
-
|
|
279
|
-
3. 按 `from_email` 匹配 KOL
|
|
280
|
-
- `campaignId` 已知:只读该 campaign 的 `KOLS.md`
|
|
281
|
-
- `campaignId` 未知:遍历 `~/kol-outreach/campaigns/*/KOLS.md`
|
|
282
|
-
- 匹配结果:
|
|
283
|
-
- 唯一匹配:继续
|
|
284
|
-
- 多个匹配:选 `last_update` 最新的 campaign
|
|
285
|
-
- 无匹配:按 orphan inbound 处理并退出
|
|
286
|
-
- 同一 campaign 内同一 email 有多条记录时,取 `status` 非终态的活跃记录
|
|
287
|
-
|
|
288
|
-
4. 读取所需文件
|
|
289
|
-
- `CONFIG.md`
|
|
290
|
-
- `BRAND.md`
|
|
291
|
-
- `CONVERSATIONS/{username}.md`
|
|
292
|
-
|
|
293
|
-
5. 先做预检
|
|
294
|
-
- `rounds >= CONFIG.max_rounds`:`escalate`
|
|
295
|
-
- 对话时长 `>= CONFIG.max_days`:`expired`
|
|
296
|
-
- 最新回信 body 命中 `escalation_keywords`:`escalate`
|
|
297
|
-
- 最后一条 inbound round 的 `message_id` 与本次 `in_reply_to` 不一致:按幂等性异常处理
|
|
298
|
-
|
|
299
|
-
6. 如果预检触发异常
|
|
300
|
-
- 用 `escalate_fallback_v1` 模板渲染兜底回复
|
|
301
|
-
- 调 `scout outreach send` 发出回复
|
|
302
|
-
- 更新 `KOLS.md` 为 `needs_merchant_followup`
|
|
303
|
-
- 写 `PROGRESS.md`
|
|
304
|
-
- `git commit`
|
|
305
|
-
- `sentinel report --condition-met true --summary "layer2 escalate" --action-taken "..."`
|
|
306
|
-
- 退出
|
|
307
|
-
|
|
308
|
-
7. 调用 LLM 生成结构化决策
|
|
309
|
-
- 输入:`CONFIG.md`、`BRAND.md`、`CONVERSATIONS/{username}.md`、最新回信、模板变量列表
|
|
310
|
-
- 输出 JSON,例如:
|
|
311
|
-
|
|
312
|
-
```json
|
|
313
|
-
{
|
|
314
|
-
"action": "counter_offer | accept | decline | clarify | escalate",
|
|
315
|
-
"new_price": 200,
|
|
316
|
-
"final_price": 250,
|
|
317
|
-
"concessions": ["video_retention_90d"],
|
|
318
|
-
"template_id": "counter_offer_v1",
|
|
319
|
-
"template_vars": {},
|
|
320
|
-
"reasoning": "..."
|
|
321
|
-
}
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
8. 校验 LLM 输出
|
|
325
|
-
- `action ∈ {counter_offer, accept, decline, clarify, escalate}`
|
|
326
|
-
- 如果 `counter_offer`
|
|
327
|
-
- `CONFIG.first_offer <= new_price <= CONFIG.max_price`
|
|
328
|
-
- `new_price - previous_offer <= CONFIG.max_step`
|
|
329
|
-
- 如果 `accept`
|
|
330
|
-
- `CONFIG.first_offer <= final_price <= CONFIG.max_price`
|
|
331
|
-
- `committed_so_far + final_price <= CONFIG.total_budget`
|
|
332
|
-
- `concessions` 只能来自允许集合
|
|
333
|
-
- `template_id` 必须存在于本 campaign 的 `TEMPLATES.md`
|
|
334
|
-
- 任一不通过:降级为 `escalate`
|
|
335
|
-
|
|
336
|
-
9. 渲染模板并终检
|
|
337
|
-
- 用 `template_id + template_vars` 渲染最终 body
|
|
338
|
-
- 终检:
|
|
339
|
-
- body 不含 `forbidden_phrases`
|
|
340
|
-
- body 长度 `<= 2000`
|
|
341
|
-
- 不通过:降级为 `escalate`
|
|
342
|
-
|
|
343
|
-
10. 发送回复
|
|
344
|
-
- 调 `scout outreach send`
|
|
345
|
-
- 带上:
|
|
346
|
-
- `in_reply_to = KOL 的 message_id`
|
|
347
|
-
- `references = 原 references + KOL 的 message_id`
|
|
348
|
-
- 拿到新 `message_id`
|
|
349
|
-
|
|
350
|
-
11. 写回状态
|
|
351
|
-
- 在 `CONVERSATIONS/{username}.md` 追加新一轮,保留完整 LLM decision JSON
|
|
352
|
-
- 更新 `KOLS.md`
|
|
353
|
-
- 更新 `rounds`
|
|
354
|
-
- 更新 `current_offer`
|
|
355
|
-
- 更新 `last_update`
|
|
356
|
-
- `accept -> deal_reached`
|
|
357
|
-
- 其他正常回复 -> `awaiting_reply`
|
|
358
|
-
- 更新 `MERCHANT_LIMITS.md`
|
|
359
|
-
- `sent_today += 1`
|
|
360
|
-
- 如果 `action == accept`
|
|
361
|
-
- 给商家注册邮箱发送 `deal_confirmation_v1`
|
|
362
|
-
- 在 merchant `PROGRESS.md` 记录达成合作
|
|
363
|
-
- 追加 campaign `PROGRESS.md`
|
|
364
|
-
- `git commit -m "[{campaignId}] round N {action} with @{username}"`
|
|
365
|
-
|
|
366
|
-
12. 调 `sentinel report`
|
|
367
|
-
|
|
368
|
-
```bash
|
|
369
|
-
sentinel report --condition-met true --summary "..." --action-taken "..."
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
## 流程 E:查询进展
|
|
375
|
-
|
|
376
|
-
1. 读 `CAMPAIGNS.md`
|
|
377
|
-
|
|
378
|
-
2. 确定范围
|
|
379
|
-
- 用户指定 campaign:只汇报该 campaign
|
|
380
|
-
- 未指定且只有一个 active:只汇报该 campaign
|
|
381
|
-
- 未指定且有多个 active:先给跨 campaign 摘要,再提示用户可继续查看单个 campaign
|
|
382
|
-
|
|
383
|
-
3. 跨 campaign 摘要
|
|
384
|
-
- 对每个 campaign 读 `KOLS.md`
|
|
385
|
-
- 统计:
|
|
386
|
-
- `in_flight`
|
|
387
|
-
- `deal_reached`
|
|
388
|
-
- `needs_merchant_followup`
|
|
389
|
-
- 读 `CONFIG.md` 的 `total_budget`,计算已承诺预算
|
|
390
|
-
- 读 `MERCHANT_LIMITS.md` 的今日 `sent_today`
|
|
391
|
-
- 以 markdown 表格汇报
|
|
392
|
-
|
|
393
|
-
4. 单 campaign 详情
|
|
394
|
-
- 读 `KOLS.md` 按 `status` 分桶
|
|
395
|
-
- 对每个 `needs_merchant_followup`,读对应 `CONVERSATIONS/{username}.md`,总结 KOL 诉求
|
|
396
|
-
- 读 campaign `PROGRESS.md` 最近 5 条
|
|
397
|
-
- 输出:
|
|
398
|
-
- 关键统计
|
|
399
|
-
- 需要人工处理的事项
|
|
400
|
-
- 最近进展
|
|
401
|
-
|
|
402
|
-
---
|
|
403
|
-
|
|
404
|
-
## 异常处理
|
|
405
|
-
|
|
406
|
-
- `scout outreach send` 返回 `ok: false`
|
|
407
|
-
- 更新 `KOLS.md` 为 `send_error`
|
|
408
|
-
- 记 `PROGRESS.md`
|
|
409
|
-
- 不要中断其他 KOL 的处理
|
|
410
|
-
|
|
411
|
-
- LLM 结构化输出格式错误
|
|
412
|
-
- 重试 1 次
|
|
413
|
-
- 仍失败:降级为 `escalate`
|
|
414
|
-
|
|
415
|
-
- unknown campaign
|
|
416
|
-
- 写 merchant `PROGRESS.md`
|
|
417
|
-
- `sentinel report --condition-met false --summary "unknown campaign"`
|
|
418
|
-
- 退出
|
|
35
|
+
## Session 路由
|
|
36
|
+
|
|
37
|
+
按优先级依次判断:
|
|
38
|
+
|
|
39
|
+
| 条件 | 流程 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| 消息含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]` | → 回信处理 |
|
|
42
|
+
| `~/kol-outreach/BRAND.md` 不存在 | → 商家初始化 → 创建 Campaign |
|
|
43
|
+
| 用户提到了新商品 + 该商品无对应 campaign | → 创建 Campaign |
|
|
44
|
+
| 用户要求发送 outreach / 开始建联 | → 发现 + Outreach |
|
|
45
|
+
| 用户问进展 / 状态 / 数据 | → 查询进度 |
|
|
46
|
+
|
|
47
|
+
**Campaign 定位**:用户指定了 campaign 用指定值;未指定时读 `CAMPAIGNS.md`——只有一个 active 就用它,多个则列出让商家选。
|
|
48
|
+
|
|
49
|
+
## 商家初始化
|
|
50
|
+
|
|
51
|
+
只在 `~/kol-outreach/BRAND.md` 不存在或未完整填写时执行。
|
|
52
|
+
|
|
53
|
+
1. `cp -r $CLAUDE_SKILL_DIR/template/merchant/. ~/kol-outreach/` 并 `git init`
|
|
54
|
+
2. 对话式填写 `BRAND.md`:
|
|
55
|
+
- `brand_name` → 生成 `brand_slug` 建议 → `scout outreach brand-slug check` 验证全局唯一 → 冲突则换 → `scout outreach brand-slug claim` 锁定
|
|
56
|
+
- 填完品牌基础、兜底话术、升级关键词(中英双语必填)、禁用词
|
|
57
|
+
3. 填写 `MERCHANT_LIMITS.md`(默认 `max_daily_sends: 50`)
|
|
58
|
+
4. `git add -A && git commit -m "merchant onboarding complete"`
|
|
59
|
+
5. 继续创建第一个 campaign
|
|
60
|
+
|
|
61
|
+
## 创建 Campaign
|
|
62
|
+
|
|
63
|
+
1. 确定 `campaignId`:从商品标题生成 kebab-case slug,校验唯一且匹配 `^[a-z0-9][a-z0-9-]{0,29}$`
|
|
64
|
+
2. `cp -r $CLAUDE_SKILL_DIR/template/campaign/. ~/kol-outreach/campaigns/{campaignId}/`
|
|
65
|
+
3. 对话式填写 `CONFIG.md`,**逐段确认**:
|
|
66
|
+
- 商品信息 → KOL 画像 → 预算报价 → 合作条款 → 运行参数
|
|
67
|
+
- 预算校验:`max_price >= target_price >= first_offer`,`max_step <= max_price - first_offer`,`total_budget >= max_price`
|
|
68
|
+
- 不通过则说明原因、给建议、重新问(不退出)
|
|
69
|
+
4. 更新 `CAMPAIGNS.md` 追加新行
|
|
70
|
+
5. `git add -A && git commit -m "[{campaignId}] campaign ready"`
|
|
71
|
+
6. 问商家是否立即开始发现 KOL
|
|
72
|
+
|
|
73
|
+
## 发现 KOL + 首发 Outreach
|
|
74
|
+
|
|
75
|
+
**前置检查**(任一不过则告知商家并退出):
|
|
76
|
+
- campaign 状态为 `active`
|
|
77
|
+
- 本 campaign 在谈 KOL 数(`awaiting_reply` + `in_progress`)< `max_concurrent_kols`
|
|
78
|
+
- merchant 今日发信数(`MERCHANT_LIMITS.md`)< `max_daily_sends`
|
|
79
|
+
- UTC 跨天时先归档昨天计数、重置 `sent_today=0`
|
|
80
|
+
|
|
81
|
+
**发现**:
|
|
82
|
+
|
|
83
|
+
1. `scout tiktok creators --follower-count <range> --country <region> --limit <N> --format json`
|
|
84
|
+
2. 过滤:`engagement < 2%` 丢弃、已在 `KOLS.md` 丢弃、粉丝量不在区间丢弃
|
|
85
|
+
3. 对每个候选:`scout tiktok creator-products @username --limit 5`,从 bio 提取 email
|
|
86
|
+
4. 写入 `KOLS.md`:有 email → `pending_outreach`,无 email → `no_contact`
|
|
87
|
+
5. `git commit -m "[{campaignId}] discovered N KOLs"`
|
|
88
|
+
|
|
89
|
+
**Outreach**:
|
|
90
|
+
|
|
91
|
+
对每个 `pending_outreach` KOL(不超过本轮发送量):
|
|
92
|
+
|
|
93
|
+
1. 读 `TEMPLATES.md` 的 `first_outreach_v1`
|
|
94
|
+
2. 产出模板变量 JSON(`kol_first_name`, `opener_line`, `fit_reason`, `product_one_liner`)
|
|
95
|
+
3. 渲染模板 → 终检(见「护栏」Layer 4)→ `scout outreach send`,JSON 必须包含:
|
|
96
|
+
`to`, `subject`, `body`, `from_merchant_id`, `from_campaign_id`, `from_brand_slug`, `from_brand_name`, `from_contact_name`
|
|
97
|
+
4. 发送成功(`ok: true`)→ 写 `CONVERSATIONS/{username}.md`(Round 1)+ 更新 `KOLS.md` → `awaiting_reply` + `MERCHANT_LIMITS.md` sent_today +1
|
|
98
|
+
5. 发送失败(`ok: false`)→ 标 `send_error`,不计入 sent_today,跳过该 KOL,不中断其他
|
|
99
|
+
|
|
100
|
+
全部完成后:`git commit -m "[{campaignId}] outreach sent to N KOLs"` + 更新 PROGRESS.md
|
|
101
|
+
|
|
102
|
+
## 处理 KOL 回信
|
|
103
|
+
|
|
104
|
+
触发:消息含 `[KOL_INBOUND:{campaignId}]` 或 `[KOL_INBOUND]`。
|
|
105
|
+
|
|
106
|
+
1. 从消息中提取 `From`, `Subject`, `Message-ID`, `In-Reply-To`, `Body`
|
|
107
|
+
2. 定位 KOL:
|
|
108
|
+
- `campaignId` 已知 → 读该 campaign 的 `KOLS.md`,按 `from_email` 匹配
|
|
109
|
+
- `campaignId` 未知 → 遍历所有 `campaigns/*/KOLS.md`,按 `from_email` 匹配,多个取 `last_update` 最新
|
|
110
|
+
- 无匹配 → 写 PROGRESS.md + `sentinel report --condition-met false` + 退出
|
|
111
|
+
3. 读 `CONFIG.md` + `BRAND.md` + `CONVERSATIONS/{username}.md`
|
|
112
|
+
4. **预检**(见「护栏」Layer 2)→ 任一触发则发 `escalate_fallback_v1` 并退出
|
|
113
|
+
5. 按「谈判策略」产出结构化决策 JSON
|
|
114
|
+
6. **后验**(见「护栏」Layer 3)→ 不通过则降级为 escalate
|
|
115
|
+
7. 渲染模板 → **终检**(见「护栏」Layer 4)→ `scout outreach send`
|
|
116
|
+
- 回信必须带 `in_reply_to`(KOL 的 `message_id`)和 `references`(`CONVERSATIONS` 里的完整 message-id chain)
|
|
117
|
+
8. 写回 `CONVERSATIONS/{username}.md` + `KOLS.md` + `MERCHANT_LIMITS.md`
|
|
118
|
+
9. 如果 `accept` → 发 `deal_confirmation_v1`,标 `deal_reached`
|
|
119
|
+
10. `git commit -m "[{campaignId}] round N {action} @{username}"`
|
|
120
|
+
11. `sentinel report --condition-met true --summary "..." --action-taken "..."`
|
|
121
|
+
|
|
122
|
+
## 查询进度
|
|
123
|
+
|
|
124
|
+
- **多 campaign**:读每个 campaign 的 `KOLS.md`,按 status 分桶统计,输出 markdown 表格 + merchant 级 `sent_today` 信息
|
|
125
|
+
- **单 campaign**:读 `KOLS.md` 全表 + `PROGRESS.md` 最近 5 条。对每个 `needs_merchant_followup`,读 `CONVERSATIONS/{username}.md` 最后一轮,总结 KOL 诉求
|
|
126
|
+
- 只读不写,不 commit
|
|
127
|
+
|
|
128
|
+
## 谈判策略
|
|
129
|
+
|
|
130
|
+
处理 KOL 回信时,产出一个结构化决策 JSON:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"action": "counter_offer | accept | decline | clarify | escalate",
|
|
135
|
+
"new_price": null,
|
|
136
|
+
"final_price": null,
|
|
137
|
+
"concessions": [],
|
|
138
|
+
"template_id": "...",
|
|
139
|
+
"template_vars": {},
|
|
140
|
+
"reasoning": "..."
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**决策框架**:
|
|
145
|
+
|
|
146
|
+
| KOL 回应 | 判断 | action |
|
|
147
|
+
|----------|------|--------|
|
|
148
|
+
| KOL 报价 ≤ `first_offer` | 低于预期,直接接受 | `accept` |
|
|
149
|
+
| KOL 报价 ≤ `target_price` | 在目标范围内,可接受 | `accept` |
|
|
150
|
+
| KOL 报价 ≤ `max_price` | 超出目标但可谈,渐进加价 | `counter_offer` |
|
|
151
|
+
| KOL 报价 > `max_price` | 超预算,回一次低价试探 | `counter_offer`(报 `target_price`) |
|
|
152
|
+
| KOL 连续 2 轮报价 > `max_price` | 已试探过,差距太大 | `decline` |
|
|
153
|
+
| KOL 对之前的 counter 再次还价,且 ≤ `max_price` | 拉锯中,评估是否值得让步 | `counter_offer` 或 `accept` |
|
|
154
|
+
| KOL 明确拒绝合作 | 尊重意愿 | `decline` |
|
|
155
|
+
| KOL 问非价格问题(产品细节、时间线等) | 信息补充 | `clarify` |
|
|
156
|
+
| KOL 提到超出授权范围的话题 | 不要硬答 | `escalate` |
|
|
157
|
+
|
|
158
|
+
**出价规则**:
|
|
159
|
+
|
|
160
|
+
- 首次 counter:从 `first_offer` 开始
|
|
161
|
+
- 每轮加价不超过 `max_step`
|
|
162
|
+
- 绝不超过 `max_price`
|
|
163
|
+
- 加 concession 时优先用 `allowed_uses` 里的授权项(转发、二创等)作为附加价值,而非直接加钱
|
|
164
|
+
- 本 campaign 已承诺预算(`deal_reached` 的 offer 总和)+ 本次报价不能超 `total_budget`
|
|
165
|
+
|
|
166
|
+
**tone**:
|
|
167
|
+
|
|
168
|
+
- 专业友好,不卑不亢
|
|
169
|
+
- 不要用 "unfortunately" / "sadly" — 直接说 "our budget is..."
|
|
170
|
+
- 每封回信开头用一句话承接 KOL 上一封的内容(`acknowledge_line`)
|
|
171
|
+
- 永远不要透露 `max_price`、`total_budget`、或谈判策略
|
|
172
|
+
|
|
173
|
+
## 护栏
|
|
174
|
+
|
|
175
|
+
四层防线。任一层失败都**不问商家**——自动降级为发兜底话术 + 标记 `needs_merchant_followup`。
|
|
176
|
+
|
|
177
|
+
### Layer 1 — Onboarding 校验
|
|
178
|
+
|
|
179
|
+
写 `BRAND.md` / `CONFIG.md` 时执行:
|
|
180
|
+
- 所有必填字段非空
|
|
181
|
+
- `brand_slug` 全局唯一(通过 `scout outreach brand-slug check`)
|
|
182
|
+
- `max_price >= target_price >= first_offer`
|
|
183
|
+
- `max_step <= max_price - first_offer`
|
|
184
|
+
- `total_budget >= max_price`
|
|
185
|
+
- `escalation_keywords` 中英双语都有
|
|
186
|
+
- 不通过 → 继续追问,不退出 onboarding
|
|
187
|
+
|
|
188
|
+
### Layer 2 — 回信预检(调 LLM 前)
|
|
189
|
+
|
|
190
|
+
- `rounds >= max_rounds` → `needs_merchant_followup`
|
|
191
|
+
- `now - started >= max_days` → 标 `expired`,**不发邮件**,直接退出
|
|
192
|
+
- KOL 回信命中 `escalation_keywords`(中英双语匹配) → 发 `escalate_fallback_v1`
|
|
193
|
+
- `in_reply_to` 与 conversation 最后一条 inbound 的 `message_id` 不一致 → 发 `escalate_fallback_v1`
|
|
194
|
+
|
|
195
|
+
### Layer 3 — 决策后验(产出 JSON 后)
|
|
196
|
+
|
|
197
|
+
- `action` 必须在白名单内
|
|
198
|
+
- `counter_offer`: `first_offer <= new_price <= max_price`,`new_price - previous_offer <= max_step`
|
|
199
|
+
- `accept`: `first_offer <= final_price <= max_price`,`committed + final_price <= total_budget`
|
|
200
|
+
- `concessions ⊆ allowed_terms`
|
|
201
|
+
- `template_id` 存在于 `TEMPLATES.md`
|
|
202
|
+
- 任一不通过 → 降级 `escalate`,不重试
|
|
203
|
+
|
|
204
|
+
### Layer 4 — 内容终检(发送前)
|
|
205
|
+
|
|
206
|
+
- body 不含 `forbidden_phrases`
|
|
207
|
+
- body 长度 ≤ 2000 字符
|
|
208
|
+
- 不通过 → 不发送,降级 `escalate`
|
|
209
|
+
|
|
210
|
+
## 允许的命令
|
|
211
|
+
|
|
212
|
+
- `scout tiktok creators` / `scout tiktok creator-products`
|
|
213
|
+
- `scout outreach send` / `scout outreach brand-slug check|claim`
|
|
214
|
+
- `sentinel report`
|
|
419
215
|
|
|
420
|
-
|
|
421
|
-
- 写对应 `PROGRESS.md`
|
|
422
|
-
- `sentinel report --condition-met false`
|
|
423
|
-
- 退出
|
|
216
|
+
## 常见错误
|
|
424
217
|
|
|
425
|
-
|
|
426
|
-
- 说明冲突原因
|
|
427
|
-
- 修复后重试
|
|
428
|
-
- 不要擅自 reset
|
|
218
|
+
❌ 自由撰写邮件正文 → ✅ 只产出模板变量 JSON,用 TEMPLATES.md 渲染
|
|
429
219
|
|
|
430
|
-
|
|
431
|
-
- 读 `MERCHANT_LIMITS.md` 时先归档昨天计数,再继续
|
|
220
|
+
❌ 一次 session 混做多个流程 → ✅ 单会话单任务
|
|
432
221
|
|
|
433
|
-
|
|
222
|
+
❌ 每一小步都 git commit → ✅ 每个逻辑动作完成后 commit 一次(发现、outreach、单个回信处理)
|
|
434
223
|
|
|
435
|
-
|
|
224
|
+
❌ 护栏失败后重试 LLM → ✅ 直接降级为 escalate
|
|
436
225
|
|
|
437
|
-
|
|
226
|
+
❌ 透露 max_price / total_budget / 谈判策略 → ✅ 只透露当前报价
|
|
438
227
|
|
|
439
|
-
|
|
440
|
-
- `scout tiktok creator-products`
|
|
441
|
-
- `scout outreach send`
|
|
442
|
-
- `scout outreach brand-slug check|claim`
|
|
443
|
-
- `sentinel report`
|
|
228
|
+
❌ expired 的 KOL 还发邮件 → ✅ 标 expired 直接退出,不发信
|
|
444
229
|
|
|
445
|
-
|
|
230
|
+
❌ 修改不属于当前任务的 campaign 状态 → ✅ 只操作当前 campaign
|
|
446
231
|
|
|
447
|
-
|
|
448
|
-
- 不要跳过本地 workspace 状态检查
|
|
449
|
-
- 不要一次 session 混做多个流程
|
|
450
|
-
- 不要修改不属于本次任务的 campaign 状态
|
|
232
|
+
❌ scout outreach send 失败就中断全部 → ✅ 标 send_error 跳过该 KOL,继续其他
|
|
@@ -1,45 +1,36 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linting-the-wiki
|
|
3
|
-
description:
|
|
3
|
+
description: "检查知识库健康度。当用户说'检查知识库'、'知识库有什么问题'时使用。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Linting The Wiki
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
检查 wiki 随时间推移后的完整性和可维护性。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 启动 SOP
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
12
|
+
1. `ls ~/kb/REGISTRY.md`
|
|
13
|
+
- 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
|
|
14
|
+
2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
|
|
15
|
+
3. 确定目标 KB:
|
|
16
|
+
- 用户明确指定了 KB slug 或主题 → 直接用
|
|
17
|
+
- 用户说"全部 lint" → 遍历所有 active KB
|
|
18
|
+
- 只有一个 active KB → 用它
|
|
19
|
+
- 多个 active → 列出让用户选
|
|
20
|
+
4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
|
|
19
21
|
|
|
20
|
-
##
|
|
22
|
+
## Lint 流程
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
- 无边界 wiki 重写
|
|
24
|
-
|
|
25
|
-
## 工作规则
|
|
26
|
-
|
|
27
|
-
lint 的目标是让维护债务变得可见。如果某条结论已经过时或被冲突信息挑战,这件事应该很容易被发现。
|
|
28
|
-
|
|
29
|
-
## 流程
|
|
30
|
-
|
|
31
|
-
使用这个 skill 时,按以下顺序进行:
|
|
32
|
-
|
|
33
|
-
1. 检查 `index.md`、关键 wiki 目录和一组有代表性的页面
|
|
24
|
+
1. 检查 `~/kb/<slug>/index.md`、关键 wiki 目录和一组有代表性的页面
|
|
34
25
|
2. 先识别结构性问题,再决定是否动手修改
|
|
35
26
|
3. 按类型归类问题:链接、覆盖度、过时、矛盾、重复、页面规模或索引问题
|
|
36
27
|
4. 除非用户要求更大范围修复,否则只应用小而明确的修补
|
|
37
28
|
5. 清楚报告仍未解决的问题
|
|
29
|
+
6. 追加 `~/kb/PROGRESS.md`
|
|
30
|
+
7. `cd ~/kb && git add -A && git commit -m "[<slug>] lint: <发现N个问题,修复M个>"`
|
|
38
31
|
|
|
39
32
|
## 要检查什么
|
|
40
33
|
|
|
41
|
-
应检查:
|
|
42
|
-
|
|
43
34
|
- 没有入链或出链的页面
|
|
44
35
|
- 被反复提及但没有独立页面的实体或概念
|
|
45
36
|
- 本应并入 overview 的 analysis 页面,或反过来的情况
|
|
@@ -57,7 +48,7 @@ lint 的目标是让维护债务变得可见。如果某条结论已经过时或
|
|
|
57
48
|
- 澄清过时标签
|
|
58
49
|
- 就地标出矛盾
|
|
59
50
|
|
|
60
|
-
不要把 lint
|
|
51
|
+
不要把 lint 变成无边界重写。需要更深层次调整时,明确说出来并停下,除非用户明确要求继续。
|
|
61
52
|
|
|
62
53
|
## 最小交付标准
|
|
63
54
|
|
|
@@ -1,38 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: querying-the-wiki
|
|
3
|
-
description:
|
|
3
|
+
description: "从已有知识库中查询和回答问题。当用户提到的话题可能在 ~/kb/ 的某个知识库中有覆盖时使用。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Querying The Wiki
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
通过把维护后的 wiki 视为主要知识层来回答问题。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 启动 SOP
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
1. `ls ~/kb/REGISTRY.md`
|
|
13
|
+
- 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
|
|
14
|
+
2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
|
|
15
|
+
3. 确定目标 KB:
|
|
16
|
+
- 用户明确指定了 KB slug 或主题 → 直接用
|
|
17
|
+
- 只有一个 active KB → 用它
|
|
18
|
+
- 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
|
|
19
|
+
4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
|
|
16
20
|
|
|
17
|
-
##
|
|
21
|
+
## 查询流程
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
- 大规模维护性重构
|
|
21
|
-
|
|
22
|
-
## 工作规则
|
|
23
|
-
|
|
24
|
-
如果一个答案之后大概率还会有用,就应把它保存在 wiki 中,而不是只留在聊天里。
|
|
25
|
-
|
|
26
|
-
## 流程
|
|
27
|
-
|
|
28
|
-
使用这个 skill 时,按以下顺序进行:
|
|
29
|
-
|
|
30
|
-
1. 阅读 `index.md`
|
|
23
|
+
1. 读 `~/kb/<slug>/index.md`
|
|
31
24
|
2. 找到最相关的 wiki 页面
|
|
32
|
-
3.
|
|
25
|
+
3. 优先基于维护后的页面回答
|
|
33
26
|
4. 只有在 wiki 不完整或含混时才回到 raw sources
|
|
34
27
|
5. 判断这个答案是否应该被保留
|
|
35
|
-
6.
|
|
28
|
+
6. 如果应该,写进 `~/kb/<slug>/wiki/analyses/` 或对应 overview 页面
|
|
29
|
+
7. 追加 `~/kb/PROGRESS.md`
|
|
30
|
+
8. `cd ~/kb && git add -A && git commit -m "[<slug>] query: <一句话>"`
|
|
36
31
|
|
|
37
32
|
## Query 规则
|
|
38
33
|
|
|
@@ -42,7 +37,7 @@ description: Use when answering questions against an existing wiki-like knowledg
|
|
|
42
37
|
- 当答案依赖不完整或过时的 wiki 覆盖时,要说清楚
|
|
43
38
|
- 把 source-backed 内容与综合推断区分开
|
|
44
39
|
- 标出这个问题是否暴露了 wiki 的结构性空缺
|
|
45
|
-
-
|
|
40
|
+
- 在答案中显式引用所使用的 wiki 页面;如果回看了 raw sources,也要说明
|
|
46
41
|
|
|
47
42
|
## 何时保留结果
|
|
48
43
|
|
|
@@ -53,14 +48,12 @@ description: Use when answering questions against an existing wiki-like knowledg
|
|
|
53
48
|
- 这个答案形成了可长期复用的综合
|
|
54
49
|
- 这个答案解决了当前 wiki 尚未解释清楚的混乱点
|
|
55
50
|
|
|
56
|
-
独立的长期输出应进入 `wiki/analyses
|
|
51
|
+
独立的长期输出应进入 `wiki/analyses/`。如果主要是改进某个主题的现有综述,则写入对应 overview 页面。
|
|
57
52
|
|
|
58
53
|
## 最小交付标准
|
|
59
54
|
|
|
60
55
|
一次成功的 query 至少应产出:
|
|
61
56
|
|
|
62
57
|
- 一个直接回答用户问题的结果
|
|
63
|
-
-
|
|
58
|
+
- 在答案中明确引用使用了哪些 wiki 页面
|
|
64
59
|
- 清楚说明这个结果是否值得被保留
|
|
65
|
-
|
|
66
|
-
如果答案暴露了长期缺口,却没有说明 wiki 该在哪里补强,这次 query 就是不完整的。
|
|
@@ -1,40 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: updating-related-pages
|
|
3
|
-
description:
|
|
3
|
+
description: "在 ingest 后同步更新知识库的关联页面。通常由 ingesting-sources 触发,不单独使用。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Updating Related Pages
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
在来源 ingest 之后,同步 wiki 的其他部分。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 启动 SOP
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
12
|
+
1. `ls ~/kb/REGISTRY.md`
|
|
13
|
+
- 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
|
|
14
|
+
2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
|
|
15
|
+
3. 确定目标 KB:
|
|
16
|
+
- 用户明确指定了 KB slug 或主题 → 直接用
|
|
17
|
+
- 只有一个 active KB → 用它
|
|
18
|
+
- 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
|
|
19
|
+
4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
|
|
18
20
|
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
- 独自承担完整 ingest 流程
|
|
22
|
-
- 替代 query 行为
|
|
23
|
-
|
|
24
|
-
## 工作规则
|
|
25
|
-
|
|
26
|
-
当新证据改变已有认知时,不要静默覆盖旧结论。应把修正过程明确写出来。
|
|
27
|
-
|
|
28
|
-
## 流程
|
|
29
|
-
|
|
30
|
-
使用这个 skill 时,按以下顺序进行:
|
|
21
|
+
## 更新流程
|
|
31
22
|
|
|
32
23
|
1. 从来源页或 ingest 产出的 affected-page 列表开始
|
|
33
24
|
2. 确认哪些 entity、overview 和 analysis 页面需要更新
|
|
34
25
|
3. 优先更新现有页面,而不是先新建页面
|
|
35
|
-
4.
|
|
36
|
-
5.
|
|
37
|
-
6. 如果这次变更实质性影响了 wiki
|
|
26
|
+
4. 为变更后的页面补齐或修复交叉链接
|
|
27
|
+
5. 如果创建了新的长期页面,更新 `~/kb/<slug>/index.md`
|
|
28
|
+
6. 如果这次变更实质性影响了 wiki,在 `~/kb/<slug>/log.md` 中追加记录
|
|
29
|
+
7. 追加 `~/kb/PROGRESS.md`
|
|
30
|
+
8. `cd ~/kb && git add -A && git commit -m "[<slug>] update: <更新了哪些页面>"`
|
|
38
31
|
|
|
39
32
|
## 更新规则
|
|
40
33
|
|
|
@@ -55,8 +48,6 @@ description: Use when newly ingested source material affects existing entity pag
|
|
|
55
48
|
- 更新当前理解
|
|
56
49
|
- 让之后的读者仍然看得出分歧在哪里
|
|
57
50
|
|
|
58
|
-
页面要体现“理解是如何变化的”,而不只是“它发生了变化”。
|
|
59
|
-
|
|
60
51
|
## 何时创建新页面
|
|
61
52
|
|
|
62
53
|
只有在下列情况下才应新建页面:
|
|
@@ -65,12 +56,10 @@ description: Use when newly ingested source material affects existing entity pag
|
|
|
65
56
|
- 某个 analysis 或 comparison 已经有独立长期价值
|
|
66
57
|
- 现有页面已经过宽,无法干净吸收这次更新
|
|
67
58
|
|
|
68
|
-
如果对现有页面做一次聚焦更新会让 wiki 更清楚,那就不要新建页面。
|
|
69
|
-
|
|
70
59
|
## 最小交付标准
|
|
71
60
|
|
|
72
61
|
一次成功的 related-page update 至少应留下:
|
|
73
62
|
|
|
74
|
-
-
|
|
63
|
+
- 被同步更新过的相关页面
|
|
75
64
|
- source、entity、overview 和 analysis 页面之间清晰的交叉链接
|
|
76
|
-
-
|
|
65
|
+
- 在适用时,对"理解发生变化"有可见处理
|