# 2026-Q2 Skill Changelog 按时间倒序记录本季度的重要变更。 --- ## 2026-05-12: 批量精修 retrieval policy 文案 **类型**:内容调整 **背景**:[待补充] **改动**: - `be96f24`: 跨 6 个 skill 变体调整 `retrieval-policy-forbidden-self-knowledge.md` 的措辞(onprem / support / autoload-onprem / autoload-onprem-rag-only / autoload-support-rag-only 路径下的版本及一份 `retrieval-policy.md`)。 - `7b4f03d`: 在更广的 10 个文件范围内同步更新 `retrieval-policy.md` 与 `retrieval-policy-forbidden-self-knowledge.md` 两套 policy,使各 skill 变体的策略口径保持一致。 **根因**:N/A(非 Bug) **影响**:所有使用 `rag-retrieve` / `rag-retrieve-only` 这两个 hook 的 skill 在策略行为上保持一致;同时影响 onprem 与 support 两个发布分支的部署。 **相关文件**: - `skills/onprem/rag-retrieve/hooks/retrieval-policy*.md` - `skills/support/rag-retrieve/hooks/retrieval-policy*.md` - `skills/autoload/onprem/rag-retrieve/hooks/retrieval-policy*.md` - `skills/autoload/onprem/rag-retrieve-only/hooks/retrieval-policy*.md` - `skills/autoload/support/rag-retrieve-only/hooks/retrieval-policy*.md` **Commit/PR**:`be96f24`, `7b4f03d` --- ## 2026-05-11: 子 agent (SubAgent) 支持 + pmda-drug-info skill **类型**:新功能 **背景**:需要让单个 skill 在主 agent 之外承载多个专用子 agent,按用途隔离上下文与工具集(如 pmda 药品信息场景下的 single-drug / interaction / adverse-event / patient-specific 四个专用 agent)。 **改动**: - 新增 `agent/subagent_loader.py`:扫描 skill 目录下的 `agents/*.md`,按 YAML frontmatter 的 `name` / `description` / `tools` 字段解析为 `SubAgent` 字典;按 `name` 去重,**后扫描的覆盖先扫描的**(last-wins)。 - `agent/deep_assistant.py`:`init_agent` 调用 `load_subagents()`,存在则将 `SubAgentMiddleware`(来自 `deepagents.middleware.subagents`)插在 `CustomFilesystemMiddleware` 之后、`AnthropicPromptCachingMiddleware` 之前,顺序匹配 `create_deep_agent`。 - 新增 `skills/developing/pmda-drug-info/`:完整 skill 包,包含 `.claude-plugin/plugin.json`、`hooks/pre_prompt.py` + `hooks/pmda-instructions.md`、四个 `agents/*.md`、自带 `pmda_server.py` MCP server + `pmda_tools.json`、`mcp_common.py` 工具基础类。 **根因**:N/A **影响**: - skill 包结构新增约定:`agents/*.md` 目录下的 markdown 文件会被加载为子 agent。 - skill 加载流程在 `init_agent` 内增加一次目录扫描;对没有 `agents/` 的 skill 无影响。 - skill 跨 bot 共享时存在 sub-agent 同名冲突的风险——同名 sub-agent 不会报错,而是被后扫描到的覆盖。 **相关文件**: - `agent/subagent_loader.py`(新) - `agent/deep_assistant.py`(接线) - `skills/developing/pmda-drug-info/`(新 skill) **Commit/PR**:`5b634bc` --- ## 2026-05-11: pmda-drug-info MCP server 重写为 mock 实现 **类型**:内部改造 **背景**:[待补充] **改动**:`skills/developing/pmda-drug-info/pmda_server.py` 大幅替换(+322 / -385),保留接口面向 agent 的契约,内部替换为 mock 数据实现。 **根因**:N/A **影响**:pmda-drug-info skill 当前不再依赖外部真实 PMDA 数据源,便于开发期联调。 **相关文件**: - `skills/developing/pmda-drug-info/pmda_server.py` **Commit/PR**:`a92096a` --- ## 2026-05-11: retrieval-policy.md 内容更新 **类型**:内容调整 **背景**:[待补充] **改动**:在 onprem / support / autoload-onprem-rag-only / autoload-support-rag-only 四个版本的 `retrieval-policy.md` 上做了同步内容更新。 **根因**:N/A **影响**:与同月 12 日的 policy 批量精修配套,使 rag-retrieve hook 策略保持一致。 **相关文件**: - `skills/onprem/rag-retrieve/hooks/retrieval-policy.md` - `skills/support/rag-retrieve/hooks/retrieval-policy.md` - `skills/autoload/onprem/rag-retrieve-only/hooks/retrieval-policy.md` - `skills/autoload/support/rag-retrieve-only/hooks/retrieval-policy.md` **Commit/PR**:`e6d1698` --- ## 2026-05-08: 通过 MCP `_meta` 透传 trace_id 给 RAG 工具 **类型**:新功能 **背景**:需要把 catalog-agent 的 trace_id 透传给 MCP 端的 `rag_retrieve` / `table_rag_retrieve` 服务,便于跨进程追踪。 **改动**: - 新增 `agent/mcp_trace_meta.py`:通过 `patch_mcp_client_session_trace_meta()` 对 `mcp.ClientSession.call_tool` 做一次幂等 monkey-patch,调用时若工具名在 `{"rag_retrieve", "table_rag_retrieve"}` 集合内且当前请求上下文有 `trace_id`,则注入到 `kwargs["meta"]["trace_id"]`;并提供 `_call_tool_with_meta_compat` 以兼容旧版 MCP SDK(不接受 `meta=` 关键字时退化为手动构造 `CallToolRequestParams._meta`)。 - `agent/deep_assistant.py`:在 `get_tools_from_mcp()` 入口处调用一次补丁安装。 - 同步调整 `skills/onprem/rag-retrieve/rag_retrieve_server.py` 与 `skills/support/rag-retrieve/rag_retrieve_server.py`,接收并使用 `_meta.trace_id`。 **根因**:N/A **影响**: - `rag_retrieve` / `table_rag_retrieve` 现在在 MCP `_meta` 上必带 `trace_id`(若上下文存在)。 - 全局 monkey-patch 风格 - 只要 `get_tools_from_mcp()` 被调用过一次后,所有 `ClientSession.call_tool` 都会被包装。 **相关文件**: - `agent/mcp_trace_meta.py`(新) - `agent/deep_assistant.py` - `skills/onprem/rag-retrieve/rag_retrieve_server.py` - `skills/support/rag-retrieve/rag_retrieve_server.py` **Commit/PR**:`1f06450` --- ## 2026-05-06: 新增 kfs-answer skill (support 分支) **类型**:新功能 **背景**:[待补充] - 为 support 分支补齐 kfs-answer 能力(onprem 分支此前已有同名 skill)。 **改动**:新增 `skills/support/kfs-answer/`,包括 `SKILL.md` 与 `scripts/` 下的 `query.py` / `search.py` / `detail.py` / `query_db.py` / `format_answer.py` / `merge_citations.py` / `_session.py` 共 7 个脚本(约 1809 行)。 **根因**:N/A **影响**:support 部署版本获得 kfs-answer 能力。 **相关文件**: - `skills/support/kfs-answer/**` **Commit/PR**:`a9227b8` --- ## 2026-05-06: Daytona 沙箱增量同步漏掉符号链接 **类型**:Bug 修复 **背景**:dataset 通过符号链接挂载,但增量同步用 `find -type f` 只匹配普通文件,导致 dataset 符号链接没被检测到也没被打包同步到 Daytona 沙箱;并且 `tar.add()` 默认不 dereference,打进去的是指向宿主机路径的悬空软链。 **改动**: - `utils/daytona_sync._list_local_changed_files`:同时匹配 file 和 symlink (`-type f -o -type l`)。 - `utils/daytona_sync._tar_workspace_entries`:`tar.add(dereference=True)`,把软链解引用为实际内容打包。 - `skills/onprem/kfs-answer/SKILL.md` 和 `prompt/system_prompt_deep_agent.md`:统一数据集路径用复数形式 `datasets/`。 **根因**:`find -type f` 与 `tar.add()` 默认行为对符号链接不友好。 **影响**:Daytona 模式下 kfs-answer 等依赖 dataset 软链的 skill 可以正常使用沙箱内的数据;提示词与 SKILL.md 内的路径口径统一。 **相关文件**: - `utils/daytona_sync.py` - `skills/onprem/kfs-answer/SKILL.md` - `prompt/system_prompt_deep_agent.md` **Commit/PR**:`3c0fa49` --- ## 2026-04-24: PostAgent hooks 非阻塞执行 + 临时停用 ToolOutputLengthMiddleware **类型**:性能优化 / 临时调整 **背景**:非流式响应路径上 `_execute_post_agent_hooks` 是同步等待,阻塞了响应返回。 **改动**: - `routes/chat.py`:非流式分支将 `await _execute_post_agent_hooks(...)` 改为 `asyncio.create_task(_execute_post_agent_hooks(...))`,hook 在后台执行,不阻塞响应。 - `agent/deep_assistant.py`:将 `ToolOutputLengthMiddleware` 整段注释掉(未删除,可恢复)。 - `utils/settings.py`:切换 `DAYTONA_API_KEY` / `DAYTONA_SERVER_URL` 注释行(启用自托管 Daytona,注释掉 SaaS 行)。 **根因**:N/A(性能优化为主) **影响**: - 非流式接口响应不再等待 PostAgent hooks 完成 → hook 中失败/异常**只会被 task 内部的 logger 捕获**,调用方收不到错误反馈。 - 工具输出长度暂时不再被截断,存在超长输出冲爆上下文的风险(中间件已被注释,并未拆除)。 **相关文件**: - `routes/chat.py` - `agent/deep_assistant.py` - `utils/settings.py` **Commit/PR**:`45a9494` --- ## 2026-04-23: PrePrompt hook 内容改为模板占位符注入 **类型**:重构 **背景**:原先 PrePrompt hook 的产出文本是在 `system_prompt_default.format(...)` 之后追加在 prompt 末尾,hook 内容在 prompt 中的位置固定且偏后,模板对它的可见性差。 **改动**:`agent/prompt_loader.load_system_prompt_async`:先执行 `execute_hooks('PrePrompt', config)` 拿到 `hook_content`,然后通过新增的 `{hook_content}` 占位符传入 `system_prompt_default.format(...)`;模板侧 `prompt/system_prompt.md` 增加对应占位符。 **根因**:N/A(结构化注入更可控) **影响**:编写 PrePrompt hook 的 skill 必须依赖模板里 `{hook_content}` 占位符的位置;若使用了未升级的旧模板,hook 内容将不再出现在最终 system prompt 中。 **相关文件**: - `agent/prompt_loader.py` - `prompt/system_prompt.md` **Commit/PR**:`51fbf01` --- ## 2026-04-23: Daytona 沙箱接入 **类型**:新功能 **背景**:技能脚本需要在隔离沙箱中执行(Daytona),避免直接污染宿主机。 **改动**: - `agent/deep_assistant.py`: - 在 `init_agent` 中读取 `DAYTONA_ENABLED` / `DAYTONA_API_KEY` / `DAYTONA_SERVER_URL`,启用时创建 `DaytonaSandbox`;并将 `sandbox` / `sandbox_type` 传到 `create_custom_cli_agent` / `agent.invoke_config`。 - 重构为并行加载:`load_system_prompt_async` 与 `load_mcp_settings_async` 用 `asyncio.gather` 并行;`get_tools_from_mcp` 与 `asyncio.to_thread(init_daytona_sandbox, ...)` 并行;`init_agent` 现在返回 `(agent, checkpointer, sandbox)`(多了 sandbox)。 - `enable_skills` 时 `skills_sources` 从 `"/skills"` 改为 `"/workspace/skills"`(指向沙箱内的路径)。 - `agent/prompt_loader.py`:`agent_dir_path` 在 `DAYTONA_ENABLED=True` 时改为 `/workspace`,否则保持本地路径。 - `utils/daytona_sync.py` 新增(204 行):沙箱与本地 workspace 双向同步。 - `pyproject.toml` / `poetry.lock` / `requirements.txt`:新增 `daytona`、`langchain_daytona` 依赖。 - `utils/settings.py`:新增 `DAYTONA_API_KEY` / `DAYTONA_SERVER_URL` / `DAYTONA_ENABLED` 配置。 **根因**:N/A **影响**: - `init_agent` 返回元组从 2 元素变为 3 元素 (`agent, checkpointer, sandbox`)——**调用方必须同步更新解构**。 - skill 在沙箱模式下的根路径与本地模式不同,所有写死路径的 hook / 脚本需要兼容两种环境。 **相关文件**: - `agent/deep_assistant.py` - `agent/prompt_loader.py` - `utils/daytona_sync.py`(新) - `utils/settings.py` - `pyproject.toml`, `poetry.lock`, `requirements.txt` **Commit/PR**:`c9e0789`, `8446dab` --- ## 2026-04-22: 新增 rag-retrieve-no-citation 与 novare-context 两个开发中 skill **类型**:新功能 **背景**:[待补充] **改动**: - `skills/developing/rag-retrieve-no-citation/`:完整 skill 包,含 `.claude-plugin/plugin.json`、`README.md`、`hooks/pre_prompt.py`、`hooks/retrieval-policy.md` 与 `hooks/retrieval-policy-forbidden-self-knowledge.md`、独立 `rag_retrieve_server.py` + `rag_retrieve_tools.json` + `mcp_common.py`。 - `skills/developing/novare-context/`:包含 `.claude-plugin/plugin.json`、`README.md`、`hooks/pre_prompt.py`。 **根因**:N/A **影响**:开发中 skill 集合扩张,可作为后续正式版本的母版。 **相关文件**: - `skills/developing/rag-retrieve-no-citation/**` - `skills/developing/novare-context/**` **Commit/PR**:`7a30e52` --- ### 2026-05-20 - **变更**: `mcp-ui` 和 `data-dashboard` 从自定义 `uri + data` 工具协议改为 MCP Apps 模式 - **说明**: 静态 HTML App 放在各 skill 的 `apps/` 目录,host 通过 resource URI 加载 iframe,再用 postMessage 传递工具数据 - **修复**: 前端 MCP App resource 请求改为由 `ChatView` 向 `ChatMessage` 传入当前 botId,避免子组件重新创建 bot manager 导致 bot_id 为空 - **作者**: Claude ### 2026-04-20 - **新增**: `skills/autoload/onprem/rag-retrieve/hooks/retrieval-policy-forbidden-self-knowledge.md` - **说明**: 基于现有 `retrieval-policy.md` 衍生出更严格的检索策略,明确禁止在知识问答场景中使用模型自身知识补全答案,要求回答只能来自检索证据 - **作者**: Claude