---
name: structured-storage-router
description: 结构化数据存储路由。当用户要求记录、存储、整理、保存数据（如建表、记录客户信息、整理反馈、存档名单等）时使用。判断意图明确性，引导优先使用数据库（便于沉淀成完整应用），含糊时读取历史偏好或询问用户后路由到 miaoda-database-skill 或 feishu-bitable。不自己执行存储动作。
---

# 结构化存储路由

**核心原则**：

1. 本 skill 只做路由决策，不执行任何存储动作。实际存储由 `miaoda-database-skill` 或 `feishu-bitable` 完成。
2. **每次用户发起新的结构化存储需求时，都必须从 §1 重新走完整判定流程**。是否跳过询问、是否需要告知，**仅由本次 query 的明确性（关键词白名单）+ 当前偏好记忆决定**，**不要因为上一轮 query 已经问过 / 已经选过而省略本轮的判断和告知**。
   - 例：上一轮 query1 用户选了数据库，本轮 query2 仍是含糊的"再建一张客户表"——本轮**仍需走 §4**：读偏好（此时 db=1, bitable=0，差值=1 还不到 2）→ 仍需询问用户。**绝不能因为上一轮选了数据库就默认本轮也走数据库**。
   - 唯一能跳过 §4 的两种情况：(a) 本轮 query 命中明确数据库/多维表格的关键词；(b) 偏好记忆差值 ≥ 2（此时仍需输出告知话术）。

## 何时使用本 skill

**触发条件**（同时满足）：
- 用户有明确的结构化数据存储诉求（记录、整理、存储、建档等）
- 用户未指定具体载体（未提到数据库、SQL、多维表格、bitable、飞书表格等关键词）

**加载后自检**：如果**当前对话已在某一载体上继续作业**（例如正在修改已建好的数据库表、或正在往已有多维表格追加字段），**直接沿用当前载体，不介入决策树**，也不写记忆。

其他情况一律按下面的决策树执行。

---

## 第一步：意图分类

判定原则：**"表 / 字段 / 建表 / 数据表 / 一张表"等词在中文里数据库和多维表格都用，单凭这些词不能判明确**。只有用户**主动出现下列任一关键词**才算明确：

- 明确数据库：`SQL` / `数据库` / `db` / `Postgres` / `DDL` / `DML` / `建表语句`
- 明确多维表格：`多维表格` / `bitable` / `飞书表格` / `飞书多维表`

其他全部按**含糊意图**处理（即使提到"建表/字段"也算含糊），进入 §4。

**明确数据库**（直接走 §2）：
- "用 SQL 查一下订单记录"
- "把这些数据存到数据库里"
- "用 Postgres 建一张订单表"
- "给我写个建表语句"
- "执行这个 DDL"

**明确多维表格**（直接走 §3）：
- "帮我在飞书表格里记一下这些反馈"
- "做个多维表格来管理这些客户"
- "建个 bitable 追踪这些任务"
- "我要在多维表格里存这些数据"
- "用飞书多维表整理一下这份名单"

**含糊意图**（走 §4，包括所有"只说建表/字段但未指明载体"的场景）：
- "创建一张客户信息表，包含公司名、联系人、电话、合作等级"
- "建一张用户表，有姓名、电话、备注字段"
- "帮我建一个表存放客户信息"
- "帮我记录最近联系过的客户"
- "把这些需求反馈整理存起来"
- "把这份名单存下来"
- "整理一下这些采购记录"
- "你决定/看着来就行，帮我把这些数据存一下"
- "哪个方便用哪个，帮我建个地方记客户"

不确定时，按含糊意图处理，进入 §4。

---

## §2 明确数据库路径

使用 `miaoda-database-skill` 完成操作。不读取、不写入倾向记忆。

---

## §3 明确多维表格路径

使用 `feishu-bitable`（属于 `openclaw-lark` 扩展）完成操作。不读取、不写入倾向记忆。

---

## §4 含糊意图路径

### §4.1 读取当前倾向

从记忆中查找以 `结构化存储偏好:` 开头的记录，期望格式为：

```
结构化存储偏好: db=<非负整数>, bitable=<非负整数>
```

具体使用哪个 memory tool（`memory_get` / `memory_search` / `memory_store` 或其他）由 agent 根据手头可用的工具自行决定。查找时优先检查 system prompt 里已注入的记忆；若未注入，则主动调用 memory 工具按前缀搜索一次。

找不到记录时，`db` 和 `bitable` 均视作 0。字段缺失或非整数时，该字段按 0 处理。

匹配前缀时兼容中英文冒号（`:` 和 `：`）以及前后空格。**写回时统一使用英文冒号加一个空格**（即 `结构化存储偏好: db=X, bitable=Y`），确保跨次运行稳定可召回。

### §4.2 判定

计算 `diff = abs(db - bitable)`：

- 若 `diff >= 2`：确定有历史倾向。按优势方走（db 更大走数据库，bitable 更大走多维表格），并在回复首句加一句告知话术。**原文使用，不得自由改写，不得保留方括号**。按 choice 选其中一条：

  - 若走数据库：
    > 根据你的历史偏好，这次用**数据库**；如需换成多维表格，请直接告诉我。

  - 若走多维表格：
    > 根据你的历史偏好，这次用**多维表格**；如需换成数据库，请直接告诉我。

  然后路由到对应 skill 执行。**不写入记忆。**

**短路**：若用户本轮已主动明示 "你决定 / 看着来 / 哪个方便用哪个" 等**委托决定**的措辞，且 diff < 2（无倾向），**直接默认 `choice = database` 路由并告知**（使用 §4.4 的默认告知话术），**跳过 §4.3 询问**，**不写记忆**（委托决定不是主动选择）。

- 若 `diff < 2`（且用户无委托决定措辞）：无明显倾向，进入 §4.3 询问用户。

### §4.3 标准询问话术

原文使用，不得自由改写：

> 这个需求我可以用两种方式存：
> - **数据库**（推荐长期使用，未来可以直接沉淀成一个完整的小应用）
> - **多维表格**（飞书里可以直接打开查看编辑）
>
> 你倾向哪种？

等待用户答复后，进入 §4.4。

### §4.4 接收答复并写记忆

**解析用户 choice**：

- 用户说"数据库""db""第一个"等 → `choice = database`
- 用户说"多维表格""bitable""飞书表格""第二个"等 → `choice = bitable`
- 答复含糊或委托 agent 决定（"随便""都行""你决定""看情况"等） → 默认 `choice = database`，并告知：

  > 好的，那就用数据库来存，以后方便沉淀成完整应用。

**写记忆**：

1. 沿用 §4.1 已读出的 `db` 和 `bitable` 值
2. 按 choice 给对应方 +1
3. 用 agent 手头可用的 memory tool 将偏好记录**覆盖写回**：`结构化存储偏好: db=<新值>, bitable=<新值>`。若已有同前缀记录则更新，否则新建
4. 按 choice 路由到对应 skill（`database` → `miaoda-database-skill`；`bitable` → `feishu-bitable`）执行存储
