diff --git a/docs/skill-content-framework.md b/docs/skill-content-framework.md
index 2dd17405..a60ab8c1 100644
--- a/docs/skill-content-framework.md
+++ b/docs/skill-content-framework.md
@@ -71,7 +71,7 @@ skills/mono/
| 跨产品路由 / 工作流 | `references/routing.md`、`workflow-routing.md`、`intent-guide.md` |
| 运行时最小契约长文 | `references/runtime-contract.md`(受 context-budget 约束) |
| 全局协议(确认门禁 / Schema 教学等) | `references/`;见质检基线 |
-| 与 mono 全局文同名迁移 | `error-codes`、`url-patterns`、`capability-limits`、`channel-login`、`global-reference`、`best_practices/` |
+| 与 mono 全局文同名迁移 | `error-codes`、`url-patterns`、`capability-limits`、`channel-login`、`global-reference`、`recipes/`(shared 层:`recipes/shared/`、`recipes/lite-catalog.md`) |
产品专属规则(如 AI 表格 `field-rules`)允许下沉到对应 `dingtalk-*`,须在覆盖表注明。
diff --git a/skills/embed.go b/skills/embed.go
index dc65806c..4229bb23 100644
--- a/skills/embed.go
+++ b/skills/embed.go
@@ -23,7 +23,7 @@ import "embed"
// FS holds the peer mono and multi installable skill trees. Schema-generation
// inputs live under internal/cli and are intentionally not embedded. The all:
// prefix keeps underscore-prefixed directories (for example,
-// references/best_practices/_common) that plain embed patterns would skip.
+// dingtalk-shared/references/recipes/shared) that plain embed patterns would skip.
//
//go:embed all:mono all:multi
var FS embed.FS
diff --git a/skills/multi/dingtalk-aitable/references/06-data-analytics.md b/skills/multi/dingtalk-aitable/references/06-data-analytics.md
index 41e8d5bf..48535156 100644
--- a/skills/multi/dingtalk-aitable/references/06-data-analytics.md
+++ b/skills/multi/dingtalk-aitable/references/06-data-analytics.md
@@ -5,7 +5,7 @@
| Recipe | 行动指南(固定路线) |
|--------|-------------------|
| read-aitable | 1. `aitable base search --query "<表格名>"` → 取 `baseId`/`tableId`
2. `aitable field get --base-id --table-id ` → 取 `fieldId`
3. `aitable record query --base-id --table-id ` → 取记录(分页)
需要筛选时 `--filters` 格式见 [aitable-filter-sort.md](./aitable/aitable-filter-sort.md),根节点必须是 `{"operator":"and\|or","operands":[...]}`
4. 总结数据 |
-| generate-data-report | 1. 同 read-aitable 步骤 1-3
2. 按[「多源并行采集」](_common/conventions.md#多源并行采集公共模式)执行 → 补充背景
3. `doc create --name "<报告名>" --content "<分析报告>"` |
+| generate-data-report | 1. 同 read-aitable 步骤 1-3
2. 按[「多源并行采集」](../../dingtalk-shared/references/recipes/shared/conventions.md#多源并行采集公共模式)执行 → 补充背景
3. `doc create --name "<报告名>" --content "<分析报告>"` |
| create-aitable-record | **批量导入优先**:`python scripts/import_records.py data.csv\|data.json [batch_size]`(自动分批创建)
单条/少量:1. `aitable base search --query "<表格名>"` → 取 `baseId`/`tableId`
2. `aitable field get --base-id --table-id ` → 取 `fieldId` 与类型
3. `aitable record create --base-id --table-id --records '[{"cells":{"":"值"}}]'` |
| update-aitable-record | 1. `aitable base search --query "<表格名>"` → 取 `baseId`/`tableId`
2. `aitable record query --base-id --table-id ` → 取 `recordId`,**先展示让用户确认**
3. `aitable record update --base-id --table-id --records '[{"recordId":"","cells":{...}}]'` |
| search-aitable-template | 1. `aitable template search --query "<关键词>"` → 取 `templateId`
2. 用户选定
3. `aitable base create --name "<表格名>" --template-id ` → 取 `baseId` |
diff --git a/skills/multi/dingtalk-aitable/references/_common/conventions.md b/skills/multi/dingtalk-aitable/references/_common/conventions.md
deleted file mode 100644
index 803212b8..00000000
--- a/skills/multi/dingtalk-aitable/references/_common/conventions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 业务域通用规范
-
-> 仅服务本 skill 已迁入的行动指南。安全门控、危险操作确认、`--format json` 等已在本 skill 的 `SKILL.md` 中定义,此处不重复。
-
-## 批量查询规范
-
-| # | 规范 |
-|---|------|
-| 1 | **并行查详情**:拿到多个 ID 后,用 `&` 合并到同一条 Shell 命令并行执行 + `wait`,**严禁逐条串行** |
-| 2 | **翻页**:分页接口须拉全直至无更多 |
-| 3 | **优先批量 API**:有批量接口则用批量;无则按 #1 并行 |
-| 4 | **群消息**:必须先 `chat search --query` 得 `openConversationId`,再 `chat message list --group --time "" --direction older`;多群同条命令并行 |
-| 5 | **列表少轮次**:带条件搜索/列表 → 一次采全详情;**禁止**无新参数时重复同一 `list` / `search` |
-
-## 多源并行采集(公共模式)
-
-> recipe 引用方式:`按「多源并行采集」执行(关键词=,时间=至)`。
-
-- 同条 Shell:`&` 并行 + `wait`;分页须采全。
-- 只保留与主题相关的数据,无关丢弃。
-- 有批量详情接口优先;否则并行拉详情(见上表 #1)。
-- 具体采哪些产品列表由对应 **行动指南 recipe** 与当前产品参考决定;不要引入本文档未覆盖的产品路线。
-
-## 字段术语与 ID 传递
-
-> list 返回 JSON 后,必须提取下表字段传给后续命令。**禁止用其他字段替代。**
-
-| 字段 | 来源 | 传递给 |
-|------|------|--------|
-| `taskUuid` | `minutes list` | `minutes get summary/info/batch --id(s)` |
-| `userId` | `aisearch person` / `contact user search` / `contact dept list-members` | `contact user get --ids`、`todo --executors`、`calendar --users` |
-| `deptId` | `contact dept search` | `contact dept list-members --ids `;多子部门时对每个子部门分别 `dept search` 取 id |
-| `nodeId` | `drive search` / `wiki node search` | `doc read/update --node`、`drive copy/move/rename/delete --node` |
-| `nodeId` | `wiki node list` 中的 folder 类型节点 / `wiki node create --type folder` | `wiki node list --folder`、`wiki node create --folder`、`drive upload --folder`、`drive copy/move --folder` |
-| `eventId` | `calendar event list` | `calendar event get/update --id` |
-| `processInstanceId` | `oa approval list-*` | `oa approval detail/approve --instance-id` |
-| `openConversationId` | `chat search` | `chat message list/send --group` |
-| `todoTaskId` | `todo task list` | `todo task update/done --task-id` |
-| `reportId` | `report inbox list` / `report outbox list` | `report entry get/stats --report-id` |
-| `baseId` / `tableId` | `aitable base search` | `aitable record query --base-id --table-id` |
-| `dentryUuid` | `drive list` / `drive mkdir` | `drive info/download/copy/move/rename/delete --node`、`drive list/mkdir/upload/copy/move --folder` |
-| `dentryId` | `drive info` 的数字字段 | 仅用于 `chat message send --dentry-id` |
-
-**ID 边界硬约束**:`dentryId` 通常是纯数字,只表示聊天文件消息需要的钉盘条目数字 ID;它不是父目录 ID。遇到 `drive --node/--folder`、`doc --node`、`wiki node --folder` 时,只能使用 `dentryUuid` / `nodeId` / 文档 URL。若当前上下文只有数字型 `dentryId`,必须先重新 `drive list` / `drive search` / `wiki node list` 获取正确 ID,不能把该数字直接代入后续命令。
diff --git a/skills/multi/dingtalk-contact/references/08-directory.md b/skills/multi/dingtalk-contact/references/08-directory.md
index 2ba71c68..ff65f87f 100644
--- a/skills/multi/dingtalk-contact/references/08-directory.md
+++ b/skills/multi/dingtalk-contact/references/08-directory.md
@@ -1,7 +1,7 @@
# 通讯录(组织架构)
> **SKILL.md** 中 #8 内联 3 条 **lite**:`get-contact-self`、`search-person`、`search-user`。下列 recipe、专用规则与消歧请在命中 #8 且**超出**上述 lite 时阅读本文。
-> 产品命令见 [contact.md](./contact.md)。通用批量/并行见 [_common/conventions.md](_common/conventions.md)。
+> 产品命令见 [contact.md](./contact.md)。通用批量/并行见 [conventions.md](../../dingtalk-shared/references/recipes/shared/conventions.md)。
## 专用规则(#8 非 lite 步骤必守)
@@ -15,7 +15,7 @@
3. 将「姓名 + 部门 + 职位」列表展示给用户,请用户确认选择哪一位
4. 使用用户确认的 `userId` 继续后续操作
> **根因**:`aisearch person` 不返回完整部门信息,无法仅凭搜索结果区分同名用户。**必须**追加 `contact user get` 获取部门信息才能消歧。
-- **批量**:多个 `userId` 用 `contact user get --ids id1,id2,...`;多部门成员列表按需并行,遵守单次批量上限与 [_common/conventions.md](_common/conventions.md)。
+- **批量**:多个 `userId` 用 `contact user get --ids id1,id2,...`;多部门成员列表按需并行,遵守单次批量上限与 [conventions.md](../../dingtalk-shared/references/recipes/shared/conventions.md)。
- **子部门枚举**:已知父部门 `deptId` 时**优先** `contact dept list-children --dept <父deptId>` 直接拿到完整子部门列表;只知道部门名时先 `contact dept search --query "<父部门名>"` 取 `deptId` 再 `list-children`;用户明示的子部门名(无需枚举)可直接 `dept search` 命中。多子部门展开见 `explore-subdepts-and-members`。
## 与其他场景消歧
diff --git a/skills/multi/dingtalk-contact/references/_common/conventions.md b/skills/multi/dingtalk-contact/references/_common/conventions.md
deleted file mode 100644
index 803212b8..00000000
--- a/skills/multi/dingtalk-contact/references/_common/conventions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 业务域通用规范
-
-> 仅服务本 skill 已迁入的行动指南。安全门控、危险操作确认、`--format json` 等已在本 skill 的 `SKILL.md` 中定义,此处不重复。
-
-## 批量查询规范
-
-| # | 规范 |
-|---|------|
-| 1 | **并行查详情**:拿到多个 ID 后,用 `&` 合并到同一条 Shell 命令并行执行 + `wait`,**严禁逐条串行** |
-| 2 | **翻页**:分页接口须拉全直至无更多 |
-| 3 | **优先批量 API**:有批量接口则用批量;无则按 #1 并行 |
-| 4 | **群消息**:必须先 `chat search --query` 得 `openConversationId`,再 `chat message list --group --time "" --direction older`;多群同条命令并行 |
-| 5 | **列表少轮次**:带条件搜索/列表 → 一次采全详情;**禁止**无新参数时重复同一 `list` / `search` |
-
-## 多源并行采集(公共模式)
-
-> recipe 引用方式:`按「多源并行采集」执行(关键词=,时间=至)`。
-
-- 同条 Shell:`&` 并行 + `wait`;分页须采全。
-- 只保留与主题相关的数据,无关丢弃。
-- 有批量详情接口优先;否则并行拉详情(见上表 #1)。
-- 具体采哪些产品列表由对应 **行动指南 recipe** 与当前产品参考决定;不要引入本文档未覆盖的产品路线。
-
-## 字段术语与 ID 传递
-
-> list 返回 JSON 后,必须提取下表字段传给后续命令。**禁止用其他字段替代。**
-
-| 字段 | 来源 | 传递给 |
-|------|------|--------|
-| `taskUuid` | `minutes list` | `minutes get summary/info/batch --id(s)` |
-| `userId` | `aisearch person` / `contact user search` / `contact dept list-members` | `contact user get --ids`、`todo --executors`、`calendar --users` |
-| `deptId` | `contact dept search` | `contact dept list-members --ids `;多子部门时对每个子部门分别 `dept search` 取 id |
-| `nodeId` | `drive search` / `wiki node search` | `doc read/update --node`、`drive copy/move/rename/delete --node` |
-| `nodeId` | `wiki node list` 中的 folder 类型节点 / `wiki node create --type folder` | `wiki node list --folder`、`wiki node create --folder`、`drive upload --folder`、`drive copy/move --folder` |
-| `eventId` | `calendar event list` | `calendar event get/update --id` |
-| `processInstanceId` | `oa approval list-*` | `oa approval detail/approve --instance-id` |
-| `openConversationId` | `chat search` | `chat message list/send --group` |
-| `todoTaskId` | `todo task list` | `todo task update/done --task-id` |
-| `reportId` | `report inbox list` / `report outbox list` | `report entry get/stats --report-id` |
-| `baseId` / `tableId` | `aitable base search` | `aitable record query --base-id --table-id` |
-| `dentryUuid` | `drive list` / `drive mkdir` | `drive info/download/copy/move/rename/delete --node`、`drive list/mkdir/upload/copy/move --folder` |
-| `dentryId` | `drive info` 的数字字段 | 仅用于 `chat message send --dentry-id` |
-
-**ID 边界硬约束**:`dentryId` 通常是纯数字,只表示聊天文件消息需要的钉盘条目数字 ID;它不是父目录 ID。遇到 `drive --node/--folder`、`doc --node`、`wiki node --folder` 时,只能使用 `dentryUuid` / `nodeId` / 文档 URL。若当前上下文只有数字型 `dentryId`,必须先重新 `drive list` / `drive search` / `wiki node list` 获取正确 ID,不能把该数字直接代入后续命令。
diff --git a/skills/multi/dingtalk-doc/references/_common/conventions.md b/skills/multi/dingtalk-doc/references/_common/conventions.md
deleted file mode 100644
index 803212b8..00000000
--- a/skills/multi/dingtalk-doc/references/_common/conventions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 业务域通用规范
-
-> 仅服务本 skill 已迁入的行动指南。安全门控、危险操作确认、`--format json` 等已在本 skill 的 `SKILL.md` 中定义,此处不重复。
-
-## 批量查询规范
-
-| # | 规范 |
-|---|------|
-| 1 | **并行查详情**:拿到多个 ID 后,用 `&` 合并到同一条 Shell 命令并行执行 + `wait`,**严禁逐条串行** |
-| 2 | **翻页**:分页接口须拉全直至无更多 |
-| 3 | **优先批量 API**:有批量接口则用批量;无则按 #1 并行 |
-| 4 | **群消息**:必须先 `chat search --query` 得 `openConversationId`,再 `chat message list --group --time "" --direction older`;多群同条命令并行 |
-| 5 | **列表少轮次**:带条件搜索/列表 → 一次采全详情;**禁止**无新参数时重复同一 `list` / `search` |
-
-## 多源并行采集(公共模式)
-
-> recipe 引用方式:`按「多源并行采集」执行(关键词=,时间=至)`。
-
-- 同条 Shell:`&` 并行 + `wait`;分页须采全。
-- 只保留与主题相关的数据,无关丢弃。
-- 有批量详情接口优先;否则并行拉详情(见上表 #1)。
-- 具体采哪些产品列表由对应 **行动指南 recipe** 与当前产品参考决定;不要引入本文档未覆盖的产品路线。
-
-## 字段术语与 ID 传递
-
-> list 返回 JSON 后,必须提取下表字段传给后续命令。**禁止用其他字段替代。**
-
-| 字段 | 来源 | 传递给 |
-|------|------|--------|
-| `taskUuid` | `minutes list` | `minutes get summary/info/batch --id(s)` |
-| `userId` | `aisearch person` / `contact user search` / `contact dept list-members` | `contact user get --ids`、`todo --executors`、`calendar --users` |
-| `deptId` | `contact dept search` | `contact dept list-members --ids `;多子部门时对每个子部门分别 `dept search` 取 id |
-| `nodeId` | `drive search` / `wiki node search` | `doc read/update --node`、`drive copy/move/rename/delete --node` |
-| `nodeId` | `wiki node list` 中的 folder 类型节点 / `wiki node create --type folder` | `wiki node list --folder`、`wiki node create --folder`、`drive upload --folder`、`drive copy/move --folder` |
-| `eventId` | `calendar event list` | `calendar event get/update --id` |
-| `processInstanceId` | `oa approval list-*` | `oa approval detail/approve --instance-id` |
-| `openConversationId` | `chat search` | `chat message list/send --group` |
-| `todoTaskId` | `todo task list` | `todo task update/done --task-id` |
-| `reportId` | `report inbox list` / `report outbox list` | `report entry get/stats --report-id` |
-| `baseId` / `tableId` | `aitable base search` | `aitable record query --base-id --table-id` |
-| `dentryUuid` | `drive list` / `drive mkdir` | `drive info/download/copy/move/rename/delete --node`、`drive list/mkdir/upload/copy/move --folder` |
-| `dentryId` | `drive info` 的数字字段 | 仅用于 `chat message send --dentry-id` |
-
-**ID 边界硬约束**:`dentryId` 通常是纯数字,只表示聊天文件消息需要的钉盘条目数字 ID;它不是父目录 ID。遇到 `drive --node/--folder`、`doc --node`、`wiki node --folder` 时,只能使用 `dentryUuid` / `nodeId` / 文档 URL。若当前上下文只有数字型 `dentryId`,必须先重新 `drive list` / `drive search` / `wiki node list` 获取正确 ID,不能把该数字直接代入后续命令。
diff --git a/skills/multi/dingtalk-mail/references/09-mail.md b/skills/multi/dingtalk-mail/references/09-mail.md
index dcf365ee..7a35ab99 100644
--- a/skills/multi/dingtalk-mail/references/09-mail.md
+++ b/skills/multi/dingtalk-mail/references/09-mail.md
@@ -1,7 +1,7 @@
# 邮件
> 邮件的 4 条 **lite** recipe:`mail-list-mailbox`、`mail-search`、`mail-send`、`mail-reply-forward`,见 [lite-recipes.md](./lite-recipes.md)。下列专用规则与消歧请在命中邮件场景且**超出**上述 lite 时阅读本文。
-> 产品命令见 [mail.md](./mail.md)。通用批量/并行见 [_common/conventions.md](_common/conventions.md)。
+> 产品命令见 [mail.md](./mail.md)。通用批量/并行见 [conventions.md](../../dingtalk-shared/references/recipes/shared/conventions.md)。
## 专用规则(#9 非 lite 步骤必守)
diff --git a/skills/multi/dingtalk-mail/references/_common/conventions.md b/skills/multi/dingtalk-mail/references/_common/conventions.md
deleted file mode 100644
index 803212b8..00000000
--- a/skills/multi/dingtalk-mail/references/_common/conventions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 业务域通用规范
-
-> 仅服务本 skill 已迁入的行动指南。安全门控、危险操作确认、`--format json` 等已在本 skill 的 `SKILL.md` 中定义,此处不重复。
-
-## 批量查询规范
-
-| # | 规范 |
-|---|------|
-| 1 | **并行查详情**:拿到多个 ID 后,用 `&` 合并到同一条 Shell 命令并行执行 + `wait`,**严禁逐条串行** |
-| 2 | **翻页**:分页接口须拉全直至无更多 |
-| 3 | **优先批量 API**:有批量接口则用批量;无则按 #1 并行 |
-| 4 | **群消息**:必须先 `chat search --query` 得 `openConversationId`,再 `chat message list --group --time "" --direction older`;多群同条命令并行 |
-| 5 | **列表少轮次**:带条件搜索/列表 → 一次采全详情;**禁止**无新参数时重复同一 `list` / `search` |
-
-## 多源并行采集(公共模式)
-
-> recipe 引用方式:`按「多源并行采集」执行(关键词=,时间=至)`。
-
-- 同条 Shell:`&` 并行 + `wait`;分页须采全。
-- 只保留与主题相关的数据,无关丢弃。
-- 有批量详情接口优先;否则并行拉详情(见上表 #1)。
-- 具体采哪些产品列表由对应 **行动指南 recipe** 与当前产品参考决定;不要引入本文档未覆盖的产品路线。
-
-## 字段术语与 ID 传递
-
-> list 返回 JSON 后,必须提取下表字段传给后续命令。**禁止用其他字段替代。**
-
-| 字段 | 来源 | 传递给 |
-|------|------|--------|
-| `taskUuid` | `minutes list` | `minutes get summary/info/batch --id(s)` |
-| `userId` | `aisearch person` / `contact user search` / `contact dept list-members` | `contact user get --ids`、`todo --executors`、`calendar --users` |
-| `deptId` | `contact dept search` | `contact dept list-members --ids `;多子部门时对每个子部门分别 `dept search` 取 id |
-| `nodeId` | `drive search` / `wiki node search` | `doc read/update --node`、`drive copy/move/rename/delete --node` |
-| `nodeId` | `wiki node list` 中的 folder 类型节点 / `wiki node create --type folder` | `wiki node list --folder`、`wiki node create --folder`、`drive upload --folder`、`drive copy/move --folder` |
-| `eventId` | `calendar event list` | `calendar event get/update --id` |
-| `processInstanceId` | `oa approval list-*` | `oa approval detail/approve --instance-id` |
-| `openConversationId` | `chat search` | `chat message list/send --group` |
-| `todoTaskId` | `todo task list` | `todo task update/done --task-id` |
-| `reportId` | `report inbox list` / `report outbox list` | `report entry get/stats --report-id` |
-| `baseId` / `tableId` | `aitable base search` | `aitable record query --base-id --table-id` |
-| `dentryUuid` | `drive list` / `drive mkdir` | `drive info/download/copy/move/rename/delete --node`、`drive list/mkdir/upload/copy/move --folder` |
-| `dentryId` | `drive info` 的数字字段 | 仅用于 `chat message send --dentry-id` |
-
-**ID 边界硬约束**:`dentryId` 通常是纯数字,只表示聊天文件消息需要的钉盘条目数字 ID;它不是父目录 ID。遇到 `drive --node/--folder`、`doc --node`、`wiki node --folder` 时,只能使用 `dentryUuid` / `nodeId` / 文档 URL。若当前上下文只有数字型 `dentryId`,必须先重新 `drive list` / `drive search` / `wiki node list` 获取正确 ID,不能把该数字直接代入后续命令。
diff --git a/skills/multi/dingtalk-minutes/references/07-minutes.md b/skills/multi/dingtalk-minutes/references/07-minutes.md
index 54534645..57b02877 100644
--- a/skills/multi/dingtalk-minutes/references/07-minutes.md
+++ b/skills/multi/dingtalk-minutes/references/07-minutes.md
@@ -27,7 +27,7 @@ dws minutes list mine --limit 5 --format json
| Recipe | 行动指南(固定路线) |
| ---------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| meeting-followup | 1. **提取待办优先**:`python scripts/minutes_extract_todos.py [--id ] [--limit N]` → 获取行动项列表 无脚本时按[「多源并行采集」](_common/conventions.md#多源并行采集公共模式)执行 2. 提取行动项 3. `aisearch person --keyword "<姓名>" --dimension name` → 取 `userId` → `todo task create --title "<行动项>" --executors --priority <10/20/30/40>`(每条行动项;批量时切到 `dingtalk-todo` 的 batch-create-todo recipe,批量脚本只在该 sub-skill 内可用) 4. `chat message send --group --text "<通知内容>"` 通知已创建 |
+| meeting-followup | 1. **提取待办优先**:`python scripts/minutes_extract_todos.py [--id ] [--limit N]` → 获取行动项列表 无脚本时按[「多源并行采集」](../../dingtalk-shared/references/recipes/shared/conventions.md#多源并行采集公共模式)执行 2. 提取行动项 3. `aisearch person --keyword "<姓名>" --dimension name` → 取 `userId` → `todo task create --title "<行动项>" --executors --priority <10/20/30/40>`(每条行动项;批量时切到 `dingtalk-todo` 的 batch-create-todo recipe,批量脚本只在该 sub-skill 内可用) 4. `chat message send --group --text "<通知内容>"` 通知已创建 |
| share-minutes | **拉摘要优先**:`python scripts/minutes_recent_summary.py [--limit N] [--output summary.md]` → 获取近期听记摘要 备选手动:1. `minutes list mine` → 取 `taskUuid` 2. 用户选定 3. `minutes get summary --id ` → 取摘要 4. 单聊:`aisearch person --keyword "<姓名>" --dimension name` → 取 `openDingTalkId` → `chat message send --open-dingtalk-id --text "<摘要内容>"`(推荐);群聊:`--group --text "<摘要内容>"` 发送。仅当无法获取 openDingTalkId 时才用 `--user `(备选) |
| browse-minutes | 1. `minutes list all --query "<关键词>" --limit ` → 取全量 `taskUuid`(翻页直至无更多;无主题筛选用 `minutes list mine`;**有时间范围时加 `--start`/`--end` 服务端过滤**,如 `--start "2026-04-01T00:00:00+08:00" --end "2026-04-30T23:59:59+08:00"`) 2. **详情/元数据优先** `minutes get batch --ids `(仅 API 上限时拆多批);**摘要专项**且无 batch 字段时再用并行 `get summary` 或 `**python scripts/minutes_recent_summary.py --limit `** 3. 汇总展示;**同一用户诉求下避免**「半截 list → 再 list 剩余」「拆 4 条一批 summary 连跑多轮」等无必要拆分 |
| minutes-raw-export | 适用"下载/导出最近一周听记原文/逐字稿/转写内容/完整记录":1. 按用户时间词计算 `--start` / `--end`(最近一周示例:7 天前 00:00:00+08:00 到今天 23:59:59+08:00) 2. `minutes list all --start "" --end "" --format json` 获取范围内所有可见听记;为空时直接说明无相关数据 3. 对列表中每个 `taskUuid` 逐一 `minutes get transcription --id --format json`,如返回 `cursor` / `nextToken` / `nextCursor`,继续用 `--cursor ` 拉完后续页 4. 交付文件或最终回复必须包含各听记的真实转写段落,可附标题/时间/组织,禁止只交 summary 或让用户再选某一条 |
diff --git a/skills/multi/dingtalk-minutes/references/_common/conventions.md b/skills/multi/dingtalk-minutes/references/_common/conventions.md
deleted file mode 100644
index 803212b8..00000000
--- a/skills/multi/dingtalk-minutes/references/_common/conventions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 业务域通用规范
-
-> 仅服务本 skill 已迁入的行动指南。安全门控、危险操作确认、`--format json` 等已在本 skill 的 `SKILL.md` 中定义,此处不重复。
-
-## 批量查询规范
-
-| # | 规范 |
-|---|------|
-| 1 | **并行查详情**:拿到多个 ID 后,用 `&` 合并到同一条 Shell 命令并行执行 + `wait`,**严禁逐条串行** |
-| 2 | **翻页**:分页接口须拉全直至无更多 |
-| 3 | **优先批量 API**:有批量接口则用批量;无则按 #1 并行 |
-| 4 | **群消息**:必须先 `chat search --query` 得 `openConversationId`,再 `chat message list --group --time "" --direction older`;多群同条命令并行 |
-| 5 | **列表少轮次**:带条件搜索/列表 → 一次采全详情;**禁止**无新参数时重复同一 `list` / `search` |
-
-## 多源并行采集(公共模式)
-
-> recipe 引用方式:`按「多源并行采集」执行(关键词=,时间=至)`。
-
-- 同条 Shell:`&` 并行 + `wait`;分页须采全。
-- 只保留与主题相关的数据,无关丢弃。
-- 有批量详情接口优先;否则并行拉详情(见上表 #1)。
-- 具体采哪些产品列表由对应 **行动指南 recipe** 与当前产品参考决定;不要引入本文档未覆盖的产品路线。
-
-## 字段术语与 ID 传递
-
-> list 返回 JSON 后,必须提取下表字段传给后续命令。**禁止用其他字段替代。**
-
-| 字段 | 来源 | 传递给 |
-|------|------|--------|
-| `taskUuid` | `minutes list` | `minutes get summary/info/batch --id(s)` |
-| `userId` | `aisearch person` / `contact user search` / `contact dept list-members` | `contact user get --ids`、`todo --executors`、`calendar --users` |
-| `deptId` | `contact dept search` | `contact dept list-members --ids `;多子部门时对每个子部门分别 `dept search` 取 id |
-| `nodeId` | `drive search` / `wiki node search` | `doc read/update --node`、`drive copy/move/rename/delete --node` |
-| `nodeId` | `wiki node list` 中的 folder 类型节点 / `wiki node create --type folder` | `wiki node list --folder`、`wiki node create --folder`、`drive upload --folder`、`drive copy/move --folder` |
-| `eventId` | `calendar event list` | `calendar event get/update --id` |
-| `processInstanceId` | `oa approval list-*` | `oa approval detail/approve --instance-id` |
-| `openConversationId` | `chat search` | `chat message list/send --group` |
-| `todoTaskId` | `todo task list` | `todo task update/done --task-id` |
-| `reportId` | `report inbox list` / `report outbox list` | `report entry get/stats --report-id` |
-| `baseId` / `tableId` | `aitable base search` | `aitable record query --base-id --table-id` |
-| `dentryUuid` | `drive list` / `drive mkdir` | `drive info/download/copy/move/rename/delete --node`、`drive list/mkdir/upload/copy/move --folder` |
-| `dentryId` | `drive info` 的数字字段 | 仅用于 `chat message send --dentry-id` |
-
-**ID 边界硬约束**:`dentryId` 通常是纯数字,只表示聊天文件消息需要的钉盘条目数字 ID;它不是父目录 ID。遇到 `drive --node/--folder`、`doc --node`、`wiki node --folder` 时,只能使用 `dentryUuid` / `nodeId` / 文档 URL。若当前上下文只有数字型 `dentryId`,必须先重新 `drive list` / `drive search` / `wiki node list` 获取正确 ID,不能把该数字直接代入后续命令。
diff --git a/skills/multi/dingtalk-shared/SKILL.md b/skills/multi/dingtalk-shared/SKILL.md
index e5040c42..c799f7b1 100644
--- a/skills/multi/dingtalk-shared/SKILL.md
+++ b/skills/multi/dingtalk-shared/SKILL.md
@@ -45,8 +45,8 @@ metadata:
| `confirmation_required` / 写操作确认 | [confirmation.md](references/confirmation.md) |
| 命令发现、Schema / `--compact` / `--all` | [schema-usage.md](references/schema-usage.md) |
| 怀疑能力不支持 | [capability-limits.md](references/capability-limits.md) |
-| 批量/多源采集 | [conventions.md](references/best_practices/_common/conventions.md) |
-| 固定短流程 | [lite-recipes.md](references/best_practices/_common/lite-recipes.md) 对应章节 |
+| 批量/多源采集 | [conventions.md](references/recipes/shared/conventions.md) |
+| 固定短流程 | [lite-catalog.md](references/recipes/lite-catalog.md) 对应章节 |
产品命令、脚本和字段细节位于对应产品 skill,不在 `dingtalk-shared` 重复维护。
diff --git a/skills/multi/dingtalk-shared/references/best_practices/_common/lite-recipes.md b/skills/multi/dingtalk-shared/references/recipes/lite-catalog.md
similarity index 100%
rename from skills/multi/dingtalk-shared/references/best_practices/_common/lite-recipes.md
rename to skills/multi/dingtalk-shared/references/recipes/lite-catalog.md
diff --git a/skills/multi/dingtalk-shared/references/best_practices/_common/conventions.md b/skills/multi/dingtalk-shared/references/recipes/shared/conventions.md
similarity index 98%
rename from skills/multi/dingtalk-shared/references/best_practices/_common/conventions.md
rename to skills/multi/dingtalk-shared/references/recipes/shared/conventions.md
index d8608c85..7bb63314 100644
--- a/skills/multi/dingtalk-shared/references/best_practices/_common/conventions.md
+++ b/skills/multi/dingtalk-shared/references/recipes/shared/conventions.md
@@ -1,7 +1,7 @@
# 通用规范
> full recipe 执行时的共享规范。安全门控、危险操作确认、`--format json` 等已在根 [SKILL.md](../../../SKILL.md) 中定义,此处不重复。
-> Recipe 元规范(YAML frontmatter、命名、三层架构)见 [recipe-conventions.md](recipe-conventions.md)。
+> Recipe 元规范(YAML frontmatter、命名、三层架构)见 [meta.md](meta.md)。
## 批量查询规范
diff --git a/skills/multi/dingtalk-shared/references/best_practices/_common/recipe-conventions.md b/skills/multi/dingtalk-shared/references/recipes/shared/meta.md
similarity index 100%
rename from skills/multi/dingtalk-shared/references/best_practices/_common/recipe-conventions.md
rename to skills/multi/dingtalk-shared/references/recipes/shared/meta.md
diff --git a/skills/multi/dingtalk-shared/references/workflow-routing.md b/skills/multi/dingtalk-shared/references/workflow-routing.md
index d01cb0c0..31ca210f 100644
--- a/skills/multi/dingtalk-shared/references/workflow-routing.md
+++ b/skills/multi/dingtalk-shared/references/workflow-routing.md
@@ -27,9 +27,9 @@ skill 完成。
## Lite 与 Full
- 单一目标、短链路、无多源汇总:在
- [lite-recipes.md](best_practices/_common/lite-recipes.md) 中只读取对应 recipe。
+ [lite-catalog.md](recipes/lite-catalog.md) 中只读取对应 recipe。
- 涉及多源采集、批量处理、交叉分析、汇总/归纳或三个以上产品:使用上表的完整
- 行动指南,并按 [conventions.md](best_practices/_common/conventions.md) 执行批量和
+ 行动指南,并按 [conventions.md](recipes/shared/conventions.md) 执行批量和
ID 传递规则。
- 产品 skill 已内联完整步骤时,直接执行其步骤,不再重复读取通用 recipe。
diff --git a/skills/multi/dingtalk-todo/references/02-task.md b/skills/multi/dingtalk-todo/references/02-task.md
index 70beefee..c46ed45a 100644
--- a/skills/multi/dingtalk-todo/references/02-task.md
+++ b/skills/multi/dingtalk-todo/references/02-task.md
@@ -14,6 +14,6 @@
| Recipe | 行动指南(固定路线) |
|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| generate-progress-report | 1. 按[「多源并行采集」](_common/conventions.md#多源并行采集公共模式)执行
2. 交叉比对各源数据
3. `doc create --name "<报告名>" --content "<报告内容>"` |
-| batch-create-todo | 1. 按[「多源并行采集」](_common/conventions.md#多源并行采集公共模式)执行 → 从结果提取任务条目
2. 每条:`aisearch person --keyword "<姓名>" --dimension name` → 取真实 `userId`;同名时先消歧
3. 逐条执行 `todo task create --title "<标题>" --executors --priority <10/20/30/40>`,从每次响应收集真实 `todoTaskId`;单批超 30 条须用户确认
4. 对全部 `todoTaskId` 并行执行 `todo task get --task-id `,逐项核对标题、执行者、优先级和截止时间;不能只以退出码或创建响应作为成功证据 |
+| generate-progress-report | 1. 按[「多源并行采集」](../../dingtalk-shared/references/recipes/shared/conventions.md#多源并行采集公共模式)执行
2. 交叉比对各源数据
3. `doc create --name "<报告名>" --content "<报告内容>"` |
+| batch-create-todo | 1. 按[「多源并行采集」](../../dingtalk-shared/references/recipes/shared/conventions.md#多源并行采集公共模式)执行 → 从结果提取任务条目
2. 每条:`aisearch person --keyword "<姓名>" --dimension name` → 取真实 `userId`;同名时先消歧
3. 逐条执行 `todo task create --title "<标题>" --executors --priority <10/20/30/40>`,从每次响应收集真实 `todoTaskId`;单批超 30 条须用户确认
4. 对全部 `todoTaskId` 并行执行 `todo task get --task-id `,逐项核对标题、执行者、优先级和截止时间;不能只以退出码或创建响应作为成功证据 |
| assign-and-notify | 1. `aisearch person --keyword "<姓名>" --dimension name` → 取 `userId`
2. `todo task create --title "<标题>" --executors --priority <10/20/30/40>` → 取 `todoTaskId`
3. `todo task get --task-id ` 回读任务,确认无误后再通知
4. `chat search --query "<群名>"` → 取 `openConversationId` → `chat message send --group --text "<通知内容>"` |
diff --git a/skills/multi/dingtalk-todo/references/_common/conventions.md b/skills/multi/dingtalk-todo/references/_common/conventions.md
deleted file mode 100644
index 803212b8..00000000
--- a/skills/multi/dingtalk-todo/references/_common/conventions.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# 业务域通用规范
-
-> 仅服务本 skill 已迁入的行动指南。安全门控、危险操作确认、`--format json` 等已在本 skill 的 `SKILL.md` 中定义,此处不重复。
-
-## 批量查询规范
-
-| # | 规范 |
-|---|------|
-| 1 | **并行查详情**:拿到多个 ID 后,用 `&` 合并到同一条 Shell 命令并行执行 + `wait`,**严禁逐条串行** |
-| 2 | **翻页**:分页接口须拉全直至无更多 |
-| 3 | **优先批量 API**:有批量接口则用批量;无则按 #1 并行 |
-| 4 | **群消息**:必须先 `chat search --query` 得 `openConversationId`,再 `chat message list --group --time "" --direction older`;多群同条命令并行 |
-| 5 | **列表少轮次**:带条件搜索/列表 → 一次采全详情;**禁止**无新参数时重复同一 `list` / `search` |
-
-## 多源并行采集(公共模式)
-
-> recipe 引用方式:`按「多源并行采集」执行(关键词=,时间=至)`。
-
-- 同条 Shell:`&` 并行 + `wait`;分页须采全。
-- 只保留与主题相关的数据,无关丢弃。
-- 有批量详情接口优先;否则并行拉详情(见上表 #1)。
-- 具体采哪些产品列表由对应 **行动指南 recipe** 与当前产品参考决定;不要引入本文档未覆盖的产品路线。
-
-## 字段术语与 ID 传递
-
-> list 返回 JSON 后,必须提取下表字段传给后续命令。**禁止用其他字段替代。**
-
-| 字段 | 来源 | 传递给 |
-|------|------|--------|
-| `taskUuid` | `minutes list` | `minutes get summary/info/batch --id(s)` |
-| `userId` | `aisearch person` / `contact user search` / `contact dept list-members` | `contact user get --ids`、`todo --executors`、`calendar --users` |
-| `deptId` | `contact dept search` | `contact dept list-members --ids `;多子部门时对每个子部门分别 `dept search` 取 id |
-| `nodeId` | `drive search` / `wiki node search` | `doc read/update --node`、`drive copy/move/rename/delete --node` |
-| `nodeId` | `wiki node list` 中的 folder 类型节点 / `wiki node create --type folder` | `wiki node list --folder`、`wiki node create --folder`、`drive upload --folder`、`drive copy/move --folder` |
-| `eventId` | `calendar event list` | `calendar event get/update --id` |
-| `processInstanceId` | `oa approval list-*` | `oa approval detail/approve --instance-id` |
-| `openConversationId` | `chat search` | `chat message list/send --group` |
-| `todoTaskId` | `todo task list` | `todo task update/done --task-id` |
-| `reportId` | `report inbox list` / `report outbox list` | `report entry get/stats --report-id` |
-| `baseId` / `tableId` | `aitable base search` | `aitable record query --base-id --table-id` |
-| `dentryUuid` | `drive list` / `drive mkdir` | `drive info/download/copy/move/rename/delete --node`、`drive list/mkdir/upload/copy/move --folder` |
-| `dentryId` | `drive info` 的数字字段 | 仅用于 `chat message send --dentry-id` |
-
-**ID 边界硬约束**:`dentryId` 通常是纯数字,只表示聊天文件消息需要的钉盘条目数字 ID;它不是父目录 ID。遇到 `drive --node/--folder`、`doc --node`、`wiki node --folder` 时,只能使用 `dentryUuid` / `nodeId` / 文档 URL。若当前上下文只有数字型 `dentryId`,必须先重新 `drive list` / `drive search` / `wiki node list` 获取正确 ID,不能把该数字直接代入后续命令。
diff --git a/skills_embed.go b/skills_embed.go
index bf36ee46..b992d1a5 100644
--- a/skills_embed.go
+++ b/skills_embed.go
@@ -23,7 +23,7 @@ import "embed"
// into the binary. Retired build-only inputs (for example the former
// internal/cli/schema_hints tree) must stay absent from this embed. The `all:`
// prefix is required so dot/underscore entries — e.g.
-// references/best_practices/_common — are included rather than skipped.
+// dingtalk-shared/references/recipes/shared — are included rather than skipped.
//
//go:embed all:skills/mono all:skills/multi
var EmbeddedSkills embed.FS