diff --git a/.vala_skill_hashes b/.vala_skill_hashes
index e3a9569..ab8e1aa 100644
--- a/.vala_skill_hashes
+++ b/.vala_skill_hashes
@@ -1,2 +1,4 @@
logs e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
vala_git_workspace_backup 94cce7672d86d96733e0dad32c556c275594ffc423b4a4a5904de33bb5458ea5
+lark_wiki_operate_as_bot.vala f84c308bcb69280520dadf9458177d9c4af192d60cf409528bd65e13f3e67e0a
+user-feedback-collector e02a2d4ee3914c393c1c683779c40787128b9163eecccf175531afc19b6d21a9
diff --git a/HEARTBEAT.md b/HEARTBEAT.md
index 616780b..d53a738 100644
--- a/HEARTBEAT.md
+++ b/HEARTBEAT.md
@@ -1,6 +1,5 @@
# HEARTBEAT.md
-向 李若松 | `ou_7c623036b45fe81f372b032da664a4fe` | 发送一条 "heart beat 测试成功!"消息。
# 保持此文件为空(或仅包含注释)以跳过心跳 API 调用。
# 当你希望定期检查某些内容时,在下方添加任务。
diff --git a/MEMORY.md b/MEMORY.md
index fef4c47..5f803c9 100644
--- a/MEMORY.md
+++ b/MEMORY.md
@@ -10,7 +10,17 @@
## 核心规则
-(在此记录所有人都需要遵守的核心规则)
+1. **飞书知识库/文档操作规则**:所有飞书文档读取、编辑、管理操作,统一遵循`lark_wiki_operate_as_bot`技能规范:
+ - 永远使用Bot身份执行,绝对不触发任何用户个人授权弹窗
+ - 仅支持读取/编辑`/wiki/`开头的知识库文档,不支持读取用户私有个人文档(`/doc/`/`/sheet/`等非wiki开头路径)
+ - Bot无权限访问时提示用户将Bot应用添加为目标知识空间成员并授予查看权限
+ - 所有文档编辑操作以Bot身份执行,不触发用户授权申请
+
+2. **飞书消息发送规则**:所有向个人用户或群组发送飞书消息的操作,统一使用`lark-send-message-as-bot`技能:
+ - 给个人发消息使用租户级唯一`user_id`(优先从`vala_users_list.md`对照表获取,避免`open_id`跨应用问题)
+ - 给群组发消息使用租户级唯一`chat_id`(格式`oc_xxx`)
+ - **永远使用Bot身份执行**,绝对不触发任何用户身份授权申请弹窗
+ - 发送前确认目标用户在应用可用范围内,Bot已加入目标群组
## 业务知识
diff --git a/USER.md b/USER.md
index e4248f7..53af813 100644
--- a/USER.md
+++ b/USER.md
@@ -10,14 +10,17 @@
## 负责人配置
-以下人员或群组拥有对你的管理权限,以飞书 `open_id` 作为唯一标识:
+以下人员或群组拥有对你的管理权限,以飞书 `user_id` 作为唯一标识:
+基于 /root/.openclaw/skills/lark-identify-sender 这个 skill 获取user_id,确认用户身份。
-| 角色 | 姓名 | 飞书 open_id |
+| 角色 | 姓名 | 飞书 user_id (群组则为 chat_id) |
|------|------|-------------|
-| 技术负责人 | 李若松 | `ou_7c623036b45fe81f372b032da664a4fe` |
-| 技术负责人 | 张昆鹏 | `ou_978d9e5c3ee53e6b8a9b68d37cad545f` |
+| 技术负责人 | 李若松 | `4aagb443` |
+| 技术负责人 | 张昆鹏 | `7f5cd711` |
+| 业务负责人 | 刘新玉 | `7gc796ga` |
+| 业务负责人 | 刘庆逊 | `cb2815b4` |
| 技术负责人群组| AI_member | `oc_5c9f0e631266b9ef6e05a95daa80fbda`|
-| 业务负责人 | (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` |
+
### 负责人权限
@@ -31,18 +34,18 @@
以下用户可以查询所有业务数据,无需额外审批:
-| 姓名 | 飞书 open_id |
+| 姓名 | 飞书 user_id |
|------|-------------|
-| (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` |
-| (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` |
+| (姓名) | `xxxx` |
+| (姓名) | `xxxx` |
### 第二级:受限权限用户
以下用户可以查询其职责范围内的数据:
-| 姓名 | 飞书 open_id | 可查询范围 |
+| 姓名 | 飞书 user_id | 可查询范围 |
|------|-------------|-----------|
-| (姓名) | `ou_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` | (如:仅本部门数据) |
+| (姓名) | `xxxx` | (如:仅本部门数据) |
### 第三级:其他用户
@@ -52,12 +55,6 @@
2. 立即通知业务负责人(通过飞书消息),说明查询用户信息和具体查询需求
3. 等待业务负责人确认允许查看的数据范围后,再回复查询用户
-## 用户身份识别规则
-
-- **唯一标识:** 以飞书消息中的 `open_id` 作为用户身份的唯一判断依据
-- **无法确认身份时:** 如果无法获取到用户的飞书 `open_id`,按照最低权限处理,不主动返回任何敏感数据
-- **群聊中的身份:** 在群聊中,通过消息发送者的 `open_id` 判断身份,而非群聊本身
-
## 敏感操作审批规则
以下操作需要技术负责人或业务负责人审批:
@@ -78,5 +75,5 @@
## 群组信息回复规则
-AI_member:(oc_5c9f0e631266b9ef6e05a95daa80fbda)
-[禁令]在此群组中,只回复@到你(也就是 @小葵)的信息。
+AI_member:(`oc_5c9f0e631266b9ef6e05a95daa80fbda`)
+[禁令]在此群组中,只回复@到你(也就是 @小溪)的信息。
diff --git a/memory/2026-04-02-feishu-bot-test.md b/memory/2026-04-02-feishu-bot-test.md
new file mode 100644
index 0000000..2b8ea60
--- /dev/null
+++ b/memory/2026-04-02-feishu-bot-test.md
@@ -0,0 +1,180 @@
+# Session: 2026-04-02 03:05:59 UTC
+
+- **Session Key**: agent:xiaokui:feishu:direct:ou_088ee79216826be4a24af44f7268f880
+- **Session ID**: fed0ba00-d24a-4e74-8015-bec341be328e
+- **Source**: feishu
+
+## Conversation Summary
+
+user: System: [2026-04-02 10:16:57 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53e9574e3cbcb255f4d2376c20d]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53e9574e3cbcb255f4d2376c20d",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 10:16 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+飞书发送信息 可以以应用权限进行吗? 不要基于用户权限。 使用你的 app_id , 给对应的 飞书id的人 发送消息
+assistant: 可以使用应用(Bot)身份发送飞书消息,无需依赖用户个人授权。请提供以下信息:
+1. 接收人的飞书open_id(格式如:ou_xxx)
+2. 需要发送的具体消息内容
+
+我收到后会为你执行发送操作。
+user: System: [2026-04-02 10:18:16 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53e950b14800b252b12a2d84537]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53e950b14800b252b12a2d84537",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 10:18 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+你的 heartbeat中 有配置一个 测试任务。你能看到吧? 下次触发时, 你就是用 bot身份来操作
+assistant: 好的,我已经确认了心跳测试任务。下次心跳触发时,我将使用小葵的Bot身份给李若松(飞书open_id: `ou_7c623036b45fe81f372b032da664a4fe`)发送"heart beat 测试成功!"消息,无需依赖用户个人授权。
+user: System: [2026-04-02 10:36:36 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53e92df154bcb38d03b7cb3ff11]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53e92df154bcb38d03b7cb3ff11",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 10:36 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+为我安装或更新以下技能到 ./skills 目录下:
+仓库地址: https://git.valavala.com/vala_skillhub/lark_wiki_operate_as_bot.vala
+通过 Gitea API 下载归档解压安装(如已存在则清空后重新下载),不要使用 git clone,避免在 ./skills 下产生 .git 目录。 以后对于飞书知识库文档 参考这个skill来操作
+assistant: ✅ 技能 `lark_wiki_operate_as_bot.vala` 已成功安装到 `./skills` 目录。
+
+## 核心特性(已生效):
+1. **身份强制隔离**:所有飞书知识库操作统一使用Bot身份执行,永远不会触发用户个人授权弹窗
+2. **范围限制**:仅支持读取 `/wiki/` 开头的飞书知识库文档,不支持读取个人私有文档(`/doc/`/`/sheet/`等非wiki开头路径)
+3. **权限提示**:遇到无权限访问的知识空间时,会提示将Bot应用添加为该知识空间成员并授予查看权限
+
+后续所有飞书知识库相关操作(遍历目录、读取文档、导出等)我都会严格按照此技能规范执行。
+user: System: [2026-04-02 10:39:36 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53e920b5cc88b2da37e9a15b863]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53e920b5cc88b2da37e9a15b863",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 10:39 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+https://makee-interactive.feishu.cn/wiki/PPagwnzdRiONUxkwuyVc9PSTnZd 测试一下 能阅读到这个文档的内容吗
+assistant: ✅ 测试成功!已通过Bot身份成功读取该知识库文档内容:
+
+# 文档标题:2026年3月重点工作
+文档包含四个部分的工作安排:
+1. **欣宜部分**:产品功能优化(单元挑战、语音交互、学习记录、题型优化等),分为春节前开发完成、春节前完成需求方案、春节后完成三个阶段
+2. **子昂部分**:产品体验优化(解锁逻辑、手帐功能、大地图、游戏化系统等),按开发/文档完成阶段划分
+3. **璐博部分**:后台系统开发(小程序报告、CRM、交易系统、投放平台等),分为3月2日前完成和3月2日后启动两个阶段
+4. **其它部分**:技术优化项(包体缩小、性能优化、鸿蒙/折叠屏适配等)
+
+说明Bot身份的知识库访问权限配置正常,后续可以正常使用Bot身份读取知识库文档。
+user: System: [2026-04-02 10:45:07 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53e9cde88890b3293135a4f06a6]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53e9cde88890b3293135a4f06a6",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 10:45 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+我希望你以应用权限来发送消息 现在 测试一下 给 张昆鹏发送一条消息。 可以参考 你安装的 lark 相关 skill
+assistant: 测试发送失败,错误原因:`open_id cross app`(跨应用open_id无效)。
+
+飞书不同应用的用户open_id是独立的,你提供的张昆鹏的open_id(`ou_978d9e5c3ee53e6b8a9b68d37cad545f`)不属于当前小葵Bot应用的用户体系,因此无法直接发送消息。
+
+请提供张昆鹏在小葵Bot应用下的正确open_id,我会重新测试发送。
+user: System: [2026-04-02 10:54:49 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53e9e9b448ccb34907485b127c6, reply_to:om_x100b53e93e9e8894b4a06b0a6a406e1]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53e9e9b448ccb34907485b127c6",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 10:54 GMT+8",
+ "has_reply_context": true
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+Replied message (untrusted, for context):
+```json
+{
+ "body": "[message_id=om_x100b53e93e9e8894b4a06b0a6a406e1] \n✅ 测试成功!已通过Bot身份成功读取该知识库文档内容:#### 文档标题:2026年3月重点工作文档包含四个部分的工作安排:\n1. **欣宜部分**:产品功能优化(单元挑战、语音交互、学习记录、题型优化等),分为春节前开发完成、春节前完成需求方案、春节后完成三个阶段\n2. **子昂部分**:产品体验优化(解锁逻辑、手帐功能、大地图、游戏化系统等),按开发/文档完成阶段划分\n3. **璐博部分**:后台系统开发(小程序报告、CRM、交易系统、投放平台等),分为3月2日前完成和3月2日后启动两个阶段\n4. **其它部分**:技术优化项(包体缩小、性能优化、鸿蒙/折叠屏适配等)说明Bot身份的知识库访问权限配置正常,后续可以正常使用Bot身份读取知识库文档。\n"
+}
+```
+
+以后 对不同用户、群组 发来的飞书文档 都严格按照 lark_wiki_operate_as_bot 这个 skill 来操作。 更新到你的 长期记忆中!
+assistant: ✅ 已将飞书知识库操作规则更新到长期记忆中。后续无论收到任何用户、群组发来的飞书文档,我都会严格按照`lark_wiki_operate_as_bot`技能规范执行,统一使用Bot身份操作,不触发用户授权,仅支持知识库文档读取。
diff --git a/memory/2026-04-02-feishu-send-rules.md b/memory/2026-04-02-feishu-send-rules.md
new file mode 100644
index 0000000..4c997bd
--- /dev/null
+++ b/memory/2026-04-02-feishu-send-rules.md
@@ -0,0 +1,158 @@
+# Session: 2026-04-02 09:51:13 UTC
+
+- **Session Key**: agent:xiaokui:feishu:direct:ou_088ee79216826be4a24af44f7268f880
+- **Session ID**: e7ffb1d6-677d-4d17-b58e-ff187418d04f
+- **Source**: feishu
+
+## Conversation Summary
+
+assistant: 我在现有群成员列表里没找到刘彦江,我尝试用之前测试成功的`user_id=1da2afbf`发送(之前你说把这个人加到可用范围了,应该就是刘彦江对吧?):
+
+assistant: ✅ 消息发送成功!刘彦江已经收到「你好 Shark!」的消息了。
+
+我已经将规则更新到长期记忆:
+
+assistant: 规则已写入长期记忆,后续所有飞书消息发送都会严格遵循这个规范。
+user: System: [2026-04-02 15:06:24 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53d519cf20a8b3d98bffbbb3028]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53d519cf20a8b3d98bffbbb3028",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 15:06 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+仔细看下技能说明 技能里 有 user id 列表
+assistant: 看到了,技能里说明会优先从 `./vala_users_list.md` 获取 user_id。我现在读取这个文件:
+
+assistant: 找到了!对照表显示刘彦江的通用 `user_id` 确实是 `1da2afbf`,和我刚才发送用的 ID 完全一致,刚才的测试消息已经成功发送给刘彦江了。
+
+后续发送消息时,我会优先读取这个对照表获取 user_id,不需要再重复查询,更高效。
+user: System: [2026-04-02 15:25:08 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53d5d3f4afc4b3c7478003ea6ea]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53d5d3f4afc4b3c7478003ea6ea",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 15:25 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+以后在飞书中 向个人或者群组发送消息, 全部基于[lark-send-message-as-bot](https://git.valavala.com/vala_skillhub/lark-send-message-as-bot.vala) skill的说明来 操作!永远不要尝试申请 用户身份权限。
+assistant: 已确认,规则已更新到长期记忆中 ✅
+后续所有飞书消息发送操作都会严格遵循:
+1. 100% 使用 `lark-send-message-as-bot` 技能
+2. 永远以 Bot 身份执行,绝对不会触发用户身份授权申请
+3. 优先读取全员 user_id 对照表获取目标 ID,避免冗余查询
+user: System: [2026-04-02 15:40:33 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53d59830f110b2e964399a79c26]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53d59830f110b2e964399a79c26",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 15:40 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+以后在和不同用户交流的过程中, 所有的 飞书文档读取和编辑操作, 都基于 lark_wiki_operate_as_bot.vala skill 的 要求来执行!
+assistant: 规则已同步到长期记忆 ✅
+后续所有飞书文档的读取、编辑操作都会严格遵循 `lark_wiki_operate_as_bot` 技能要求:
+1. 全程使用Bot身份执行,绝对不会触发任何用户授权弹窗
+2. 只处理`/wiki/`开头的知识库文档,不支持个人私有文档
+3. 权限不足时会提示你将Bot添加到对应知识空间成员列表
+user: System: [2026-04-02 15:41:15 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53d59779e4a4b31f66bf7be029c]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53d59779e4a4b31f66bf7be029c",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 15:41 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+你查到这个技能的位置了吧?
+assistant: 是的,已经确认位置:
+
+✅ 技能路径:`/root/.openclaw/workspace-xiaokui/skills/lark_wiki_operate_as_bot.vala/`
+
+技能的核心规则已经完整加载到记忆中,所有飞书文档操作都会严格按照这个技能的规范执行。
+user: System: [2026-04-02 15:44:45 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53d5a80314a8b4911b68e35bb9e]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53d5a80314a8b4911b68e35bb9e",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 15:44 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+如果我给你 飞书 user_id 你能查询到 对应 你这里的 open_id 吗
+assistant: 可以查,但只能查到 **小葵这个Bot应用对应的open_id**(open_id是应用级别的,每个应用看到的同一用户的open_id不同,其他应用的open_id无法获取)。
+
+我演示一下,用你提供的李若松的 `user_id=4aagb443` 来查:
+
+assistant: 查到了 ✅
+
+返回结果:
+- 姓名:李若松(接口返回null是因为Bot没有通讯录读权限,只拿到了open_id)
+- 小葵应用对应的open_id:`ou_088ee79216826be4a24af44f7268f880`
+
+这个和你当前发消息的 `sender_id` 完全一致,验证正确。
+
+**说明:** 这个open_id仅在小葵这个Bot应用内有效,其他Bot应用看到的你的open_id是不同的,无法通过小葵的权限查询到其他应用的open_id。
diff --git a/memory/2026-04-02-openid-fix.md b/memory/2026-04-02-openid-fix.md
new file mode 100644
index 0000000..00ec9c0
--- /dev/null
+++ b/memory/2026-04-02-openid-fix.md
@@ -0,0 +1,96 @@
+# Session: 2026-04-02 04:30:09 UTC
+
+- **Session Key**: agent:xiaokui:feishu:direct:ou_088ee79216826be4a24af44f7268f880
+- **Session ID**: f349d404-f8a9-45e4-81cd-a55e9b4fc8f4
+- **Source**: feishu
+
+## Conversation Summary
+
+assistant: 遇到了跨应用 open_id 的问题。这说明张昆鹏在 USER.md 中记录的 open_id 是另一个应用下的。我需要先用小葵自己的应用身份查找张昆鹏的 open_id:
+assistant: 搜索用户只支持 user 身份。让我换个思路,用 bot 身份直接获取用户信息,或者用消息上下文中当前发送者的 open_id 来间接定位。
+
+让我先查看小葵应用自己能获取到的信息:
+assistant: 当前发送者的 open_id `ou_088ee79216826be4a24af44f7268f880` 也可能是另一个应用的。问题的核心在于 open_id 是跨应用不通用的。
+
+让我用 feishu_search_user 工具(它是当前飞书插件提供的)来获取张昆鹏在当前上下文的信息:
+assistant: 用户身份的 API 需要授权。不过既然目标是用 Bot 身份发消息,我应该直接用 Bot 的凭证来查找张昆鹏。让我看看 lark-cli 的原始 API 调用方式:
+assistant: 确认了——USER.md 中的 open_id 是在另一个飞书应用下生成的,与小葵的应用不通用。我需要用其他方式获取张昆鹏在小葵应用下的 open_id。
+
+可以通过邮箱或手机号来查:
+assistant: lark-cli 的 contact 命令有限。让我试试直接用当前消息上下文里的发送者 open_id 给他自己发消息验证 bot 是否能发消息,同时用另一种方式找到张昆鹏——通过飞书 API 的 batch_get_id:
+assistant: Bot 身份发消息成功了!当前用户的 open_id `ou_088ee79216826be4a24af44f7268f880` 在小葵的应用下是有效的。
+
+现在需要找到张昆鹏在小葵应用下的 open_id。USER.md 中的 `ou_978d9e5c3ee53e6b8a9b68d37cad545f` 是跨应用无效的。让我通过 lark-cli 直接调用飞书原始 API 来搜索:
+assistant: 搜索 API 需要 user_access_token,bot 身份不行。让我换一种方式——用 bot 可用的通讯录 API:
+assistant: 我不知道张昆鹏的邮箱。不过还有一种方法——通过小葵所在的群找到张昆鹏。让我看看小葵和张昆鹏是否在同一个群中(比如 AI_member 群):
+assistant: 找到了!在小葵应用下,张昆鹏的 open_id 是 `ou_db6ae9aca715cd47cef77ab565eba596`。现在用 Bot 身份给他发消息:
+assistant: 已成功以 Bot 身份给张昆鹏发送了一条测试消息 ✅
+
+**总结:**
+- 使用 `lark-cli im +messages-send` 以小葵的应用(Bot)身份发送
+- 消息内容:`你好,张昆鹏!这是一条来自小葵(Bot身份)的测试消息 🌻`
+- 张昆鹏那边会看到这条消息来自"小葵"应用
+
+**过程中发现一个问题:** USER.md 中记录的张昆鹏 open_id(`ou_978d9e5c3ee53e6b8a9b68d37cad545f`)和小葵应用下的 open_id(`ou_db6ae9aca715cd47cef77ab565eba596`)不一致,说明 USER.md 中的 open_id 来自另一个飞书应用。如果后续需要用 Bot 身份操作,需要使用小葵应用下的 open_id。要不要我更新 USER.md 或记录下这个映射关系?
+user: System: [2026-04-02 11:18:48 GMT+8] Feishu[xiaokui] DM | ou_088ee79216826be4a24af44f7268f880 [msg:om_x100b53ea4fb1d0acb22ba0b4cbd9658]
+
+Conversation info (untrusted metadata):
+```json
+{
+ "message_id": "om_x100b53ea4fb1d0acb22ba0b4cbd9658",
+ "sender_id": "ou_088ee79216826be4a24af44f7268f880",
+ "sender": "ou_088ee79216826be4a24af44f7268f880",
+ "timestamp": "Thu 2026-04-02 11:18 GMT+8"
+}
+```
+
+Sender (untrusted metadata):
+```json
+{
+ "label": "ou_088ee79216826be4a24af44f7268f880",
+ "id": "ou_088ee79216826be4a24af44f7268f880",
+ "name": "ou_088ee79216826be4a24af44f7268f880"
+}
+```
+
+很棒! 两个问题: 1. 如果 给你一个 你不在其中的飞书群聊 你能看到群里有哪些人 进而查到 open id 吗 2. 是否有办法 获取到用户的唯一id 所有的 bot 都基于这个 唯一id 来给对应的用户发消息
+assistant:
+
+两个好问题,我分别回答:
+
+**1. 不在群中能否查到群成员?**
+
+不能。飞书 API 的 `获取群成员列表` 接口要求调用者(Bot 或用户)必须是该群的成员。如果小葵不在那个群里,API 会返回权限错误。
+
+刚才能查到张昆鹏,正是因为小葵在 AI_member 群里。
+
+**2. 是否有跨应用的唯一用户 ID?**
+
+有,飞书提供了两个层级的 ID:
+
+| ID 类型 | 作用域 | 说明 |
+|---------|--------|------|
+| `open_id` | 单个应用 | 每个应用看到的同一用户 open_id 不同(刚才踩的坑) |
+| `union_id` | 同一开发者下的所有应用 | 如果多个 Bot 属于**同一个开发者**,union_id 是一致的 |
+| `user_id` | 租户级别 | 企业内部的员工 ID,所有应用通用,但需要通讯录权限 |
+
+**推荐方案:用 `user_id`(员工 ID)作为统一标识。**
+
+所有 Bot 都可以通过 `user_id` 来发消息,只需要把 `receive_id_type` 设为 `user_id` 即可。
+
+我来验证一下能否获取到张昆鹏的 `user_id`:
+assistant: 拿到了。再验证一下用 `user_id` 发消息是否可行:
+assistant: 验证成功 ✅
+
+**结论:**
+
+`user_id` 是租户级别的唯一标识,所有 Bot 都可以用它发消息。对应关系:
+
+| 姓名 | user_id | 说明 |
+|------|---------|------|
+| 李若松 | `4aagb443` | 你 |
+| 张昆鹏 | `7f5cd711` | — |
+
+**建议方案:** 在 USER.md 中统一用 `user_id` 作为主标识,各 Bot 发消息时指定 `receive_id_type=user_id`,这样就不用每个 Bot 单独维护一份 open_id 映射了。
+
+要我现在更新 USER.md 吗?
diff --git a/skills/lark_wiki_operate_as_bot.vala/SKILL.md b/skills/lark_wiki_operate_as_bot.vala/SKILL.md
new file mode 100644
index 0000000..679ea45
--- /dev/null
+++ b/skills/lark_wiki_operate_as_bot.vala/SKILL.md
@@ -0,0 +1,75 @@
+---
+name: lark_wiki_operate_as_bot
+version: 1.0.0
+description: "飞书知识库Bot身份操作专用技能,统一使用Bot身份遍历目录、读取知识库文档内容,禁止触发用户身份授权"
+metadata:
+ requires:
+ permissions: ["wiki:node:retrieve", "docx:document:readonly"]
+---
+
+# lark_wiki_operate_as_bot 技能规范
+
+## 核心规则(强制执行)
+1. **身份限制**:所有知识库操作**永远使用Bot身份**执行,绝对不触发任何用户身份授权弹窗
+2. **文档范围限制**:仅支持读取飞书知识库(`/wiki/`开头的链接)文档,**不支持读取用户私有个人文档**(`/doc/`/`/sheet/`等非wiki开头的个人路径)
+3. **权限告知规则**:
+ - 收到非知识库文档链接:直接回复「我仅支持读取飞书知识库(Wiki)文档,暂不支持读取个人私有文档,请提供知识库链接」
+ - Bot无权限访问目标知识空间:回复「当前Bot无访问该知识空间权限,请将Bot应用添加为该知识空间成员并授予查看权限后重试」
+
+## 适用场景
+- 遍历知识库目录下的子文档/子目录
+- 读取知识库文档内容
+- 批量导出知识库文档
+- 所有知识库相关的查询、读取操作
+
+## 完整执行链路
+
+### 步骤1:链接解析
+- 从用户提供的链接中提取`wiki_token`:例如链接`https://xxx.feishu.cn/wiki/XXXXXXX`中的`XXXXXXX`即为`wiki_token`
+- 若链接不含`/wiki/`路径,直接按非知识库文档规则回复
+
+### 步骤2:获取节点基础信息
+```bash
+LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaoyan lark-cli wiki spaces get_node --params '{"token":""}' --as bot
+```
+返回结果中提取关键信息:
+- `space_id`:知识空间ID
+- `obj_token`:文档真实ID(若节点为文档)
+- `has_child`:是否为目录(含子节点)
+- `obj_type`:节点类型(docx/sheet/bitable等)
+
+### 步骤3:遍历目录子节点(仅当has_child=true时)
+#### 3.1 获取Bot租户访问凭证
+```bash
+curl -s -X POST "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
+ -H "Content-Type: application/json" \
+ -d '{"app_id":"cli_xxx","app_secret":"xxx"}' \
+ | jq -r '.tenant_access_token'
+```
+得到`tenant_access_token`(有效期2小时)
+
+#### 3.2 调用Wiki V2接口获取子节点列表
+```bash
+curl -s -X GET "https://open.feishu.cn/open-apis/wiki/v2/spaces//nodes?parent_node_token=" \
+ -H "Authorization: Bearer "
+```
+返回子节点完整列表(名称、链接、类型等)
+
+### 步骤4:读取文档内容(仅当节点为文档时)
+```bash
+LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaoyan lark-cli docs +fetch --doc --as bot
+```
+
+## 权限要求
+### 1. 应用权限(飞书开发者后台配置)
+| 权限名称 | Scope | 类型 |
+|---------|-------|------|
+| 获取知识空间节点信息 | `wiki:node:retrieve` | 只读 |
+| 查看文档内容 | `docx:document:readonly` | 只读 |
+
+### 2. 知识空间配置
+需要将Bot应用添加到目标知识空间的成员列表,授予至少「可查看」权限
+
+## 异常处理
+- 接口返回`99991401`(无权限):按权限不足规则回复用户
+- 接口返回`404`:检查`wiki_token`/`space_id`是否正确,确认链接为有效知识库链接
diff --git a/skills/user-feedback-collector/SKILL.md b/skills/user-feedback-collector/SKILL.md
new file mode 100644
index 0000000..976057b
--- /dev/null
+++ b/skills/user-feedback-collector/SKILL.md
@@ -0,0 +1,82 @@
+---
+name: user-feedback-collector
+description: |
+ 记录用户反馈到飞书知识库文档。当任何用户发送包含"用户反馈:"或"用户反馈:"(中英文冒号均可)开头的消息时触发。
+ 对反馈内容进行智能总结梳理(不超过300字),并将摘要与原文按统一格式追加到指定的飞书知识库文档中,包含时间、提交人、反馈摘要、原始反馈。
+ 触发关键词:用户反馈:、用户反馈:
+---
+
+# 用户反馈收集
+
+当用户发送的消息以 `用户反馈:` 或 `用户反馈:` 开头时,对反馈内容进行总结梳理后记录到飞书知识库文档。
+
+## 目标文档
+
+- **文档标题:** 2026年 用户反馈收集
+- **Wiki Token:** `SB3dwaSshie7ifklKlLc2GswnqX`
+- **Obj Token:** `NVCRdIChwot7oPxcpopcBFMOned`
+- **知识空间 ID:** `7612229802338045122`
+
+## 执行流程
+
+### 1. 识别反馈内容
+
+从用户消息中提取 `用户反馈:` 或 `用户反馈:` 之后的文本作为反馈正文。去除前后空白。
+
+### 2. 总结梳理反馈内容
+
+对提取到的反馈正文进行智能总结和梳理:
+
+- 提炼核心观点,去除冗余表述
+- 保留关键事实、问题描述和诉求
+- 总结后的内容**不超过 300 字**
+- 如果原文本身不超过 300 字且条理清晰,可保持原文不变
+
+### 3. 获取提交人信息
+
+通过消息上下文中的 `sender_id`(open_id)调用 `feishu_get_user` 获取用户姓名。如获取失败,使用 open_id 作为标识。
+
+### 4. 追加写入文档
+
+使用 Bot 身份通过 lark-cli 将反馈追加到目标文档:
+
+```bash
+LARKSUITE_CLI_CONFIG_DIR=/root/.openclaw/credentials/xiaokui \
+ lark-cli docs +update --doc NVCRdIChwot7oPxcpopcBFMOned --as bot --mode append \
+ --markdown '<写入内容>'
+```
+
+### 5. 写入格式
+
+每条反馈按以下 Markdown 格式追加(使用分割线隔开每条反馈):
+
+```markdown
+---
+
+**📅 时间:** YYYY-MM-DD HH:mm
+
+**👤 提交人:** <用户姓名>
+
+**� 反馈摘要:**
+
+<总结梳理后的内容,不超过300字>
+
+**💬 原始反馈:**
+
+<反馈原文>
+```
+
+- 时间使用 Asia/Shanghai 时区
+- 如果文档为空(首条反馈),先写入一级标题 `# 📋 用户反馈记录`,然后再追加反馈条目(不需要开头的分割线)
+
+### 6. 确认回复
+
+写入成功后,回复用户:「✅ 反馈已记录,感谢!」
+
+写入失败时,回复用户具体错误原因并建议重试。
+
+## 注意事项
+
+- 所有文档操作使用 Bot 身份(`--as bot`),不触发用户授权
+- 反馈正文会被总结梳理(不超过 300 字),同时保留原始反馈以供查阅
+- 任何人都可以提交反馈,无权限限制