diff --git a/docs/skill-content-framework.md b/docs/skill-content-framework.md
index a60ab8c1..1b179e8c 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`、`recipes/`(shared 层:`recipes/shared/`、`recipes/lite-catalog.md`) |
+| 与 mono 全局文同名迁移 | `error-codes`、`url-patterns`、`capability-limits`、`channel-login`、`global-reference`、`recipes/`(`conventions.md`、`meta.md`、`lite-catalog.md`) |
产品专属规则(如 AI 表格 `field-rules`)允许下沉到对应 `dingtalk-*`,须在覆盖表注明。
diff --git a/skills/embed.go b/skills/embed.go
index 4229bb23..bc2e514f 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,
-// dingtalk-shared/references/recipes/shared) that plain embed patterns would skip.
+// mono/references/best_practices/_common) 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 758048ed..305270c6 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. 按[「多源并行采集」](recipes/shared/conventions.md#多源并行采集公共模式)执行 → 补充背景
3. `doc create --name "<报告名>" --content "<分析报告>"` |
+| generate-data-report | 1. 同 read-aitable 步骤 1-3
2. 按[「多源并行采集」](recipes/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/recipes/shared/conventions.md b/skills/multi/dingtalk-aitable/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-aitable/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-aitable/references/recipes/conventions.md
diff --git a/skills/multi/dingtalk-contact/references/08-directory.md b/skills/multi/dingtalk-contact/references/08-directory.md
index f6124313..b2433676 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)。通用批量/并行见 [recipes/shared/conventions.md](recipes/shared/conventions.md)。
+> 产品命令见 [contact.md](./contact.md)。通用批量/并行见 [recipes/conventions.md](recipes/conventions.md)。
## 专用规则(#8 非 lite 步骤必守)
@@ -15,7 +15,7 @@
3. 将「姓名 + 部门 + 职位」列表展示给用户,请用户确认选择哪一位
4. 使用用户确认的 `userId` 继续后续操作
> **根因**:`aisearch person` 不返回完整部门信息,无法仅凭搜索结果区分同名用户。**必须**追加 `contact user get` 获取部门信息才能消歧。
-- **批量**:多个 `userId` 用 `contact user get --ids id1,id2,...`;多部门成员列表按需并行,遵守单次批量上限与 [recipes/shared/conventions.md](recipes/shared/conventions.md)。
+- **批量**:多个 `userId` 用 `contact user get --ids id1,id2,...`;多部门成员列表按需并行,遵守单次批量上限与 [recipes/conventions.md](recipes/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/recipes/shared/conventions.md b/skills/multi/dingtalk-contact/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-contact/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-contact/references/recipes/conventions.md
diff --git a/skills/multi/dingtalk-doc/references/recipes/shared/conventions.md b/skills/multi/dingtalk-doc/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-doc/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-doc/references/recipes/conventions.md
diff --git a/skills/multi/dingtalk-mail/references/09-mail.md b/skills/multi/dingtalk-mail/references/09-mail.md
index aebb7c23..12636d5e 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)。通用批量/并行见 [recipes/shared/conventions.md](recipes/shared/conventions.md)。
+> 产品命令见 [mail.md](./mail.md)。通用批量/并行见 [recipes/conventions.md](recipes/conventions.md)。
## 专用规则(#9 非 lite 步骤必守)
diff --git a/skills/multi/dingtalk-mail/references/recipes/shared/conventions.md b/skills/multi/dingtalk-mail/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-mail/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-mail/references/recipes/conventions.md
diff --git a/skills/multi/dingtalk-minutes/references/07-minutes.md b/skills/multi/dingtalk-minutes/references/07-minutes.md
index ac60a658..df937adc 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]` → 获取行动项列表 无脚本时按[「多源并行采集」](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 "<通知内容>"` 通知已创建 |
+| meeting-followup | 1. **提取待办优先**:`python scripts/minutes_extract_todos.py [--id ] [--limit N]` → 获取行动项列表 无脚本时按[「多源并行采集」](recipes/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/recipes/shared/conventions.md b/skills/multi/dingtalk-minutes/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-minutes/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-minutes/references/recipes/conventions.md
diff --git a/skills/multi/dingtalk-shared/SKILL.md b/skills/multi/dingtalk-shared/SKILL.md
index c799f7b1..9512b9eb 100644
--- a/skills/multi/dingtalk-shared/SKILL.md
+++ b/skills/multi/dingtalk-shared/SKILL.md
@@ -45,7 +45,7 @@ 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/recipes/shared/conventions.md) |
+| 批量/多源采集 | [conventions.md](references/recipes/conventions.md) |
| 固定短流程 | [lite-catalog.md](references/recipes/lite-catalog.md) 对应章节 |
产品命令、脚本和字段细节位于对应产品 skill,不在 `dingtalk-shared` 重复维护。
diff --git a/skills/multi/dingtalk-shared/references/recipes/shared/conventions.md b/skills/multi/dingtalk-shared/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-shared/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-shared/references/recipes/conventions.md
diff --git a/skills/multi/dingtalk-shared/references/recipes/shared/meta.md b/skills/multi/dingtalk-shared/references/recipes/meta.md
similarity index 100%
rename from skills/multi/dingtalk-shared/references/recipes/shared/meta.md
rename to skills/multi/dingtalk-shared/references/recipes/meta.md
diff --git a/skills/multi/dingtalk-shared/references/workflow-routing.md b/skills/multi/dingtalk-shared/references/workflow-routing.md
index 31ca210f..ddbaac44 100644
--- a/skills/multi/dingtalk-shared/references/workflow-routing.md
+++ b/skills/multi/dingtalk-shared/references/workflow-routing.md
@@ -29,7 +29,7 @@ skill 完成。
- 单一目标、短链路、无多源汇总:在
[lite-catalog.md](recipes/lite-catalog.md) 中只读取对应 recipe。
- 涉及多源采集、批量处理、交叉分析、汇总/归纳或三个以上产品:使用上表的完整
- 行动指南,并按 [conventions.md](recipes/shared/conventions.md) 执行批量和
+ 行动指南,并按 [conventions.md](recipes/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 8afe5d4f..594fc609 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. 按[「多源并行采集」](recipes/shared/conventions.md#多源并行采集公共模式)执行
2. 交叉比对各源数据
3. `doc create --name "<报告名>" --content "<报告内容>"` |
-| batch-create-todo | 1. 按[「多源并行采集」](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 `,逐项核对标题、执行者、优先级和截止时间;不能只以退出码或创建响应作为成功证据 |
+| generate-progress-report | 1. 按[「多源并行采集」](recipes/conventions.md#多源并行采集公共模式)执行
2. 交叉比对各源数据
3. `doc create --name "<报告名>" --content "<报告内容>"` |
+| batch-create-todo | 1. 按[「多源并行采集」](recipes/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/recipes/shared/conventions.md b/skills/multi/dingtalk-todo/references/recipes/conventions.md
similarity index 100%
rename from skills/multi/dingtalk-todo/references/recipes/shared/conventions.md
rename to skills/multi/dingtalk-todo/references/recipes/conventions.md
diff --git a/skills_embed.go b/skills_embed.go
index b992d1a5..c9525b74 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.
-// dingtalk-shared/references/recipes/shared — are included rather than skipped.
+// mono/references/best_practices/_common — are included rather than skipped.
//
//go:embed all:skills/mono all:skills/multi
var EmbeddedSkills embed.FS