@ -132,13 +132,20 @@ skill 只是五个接入面之一,兼容层覆盖全部五面。
- 为什么: 2026-09-30 探针显示同一批 skill 在三端各维护一份( Claude `~/.claude/skills` 、Codex `source-command-*` 副本、DSH 手写 `.dsh/skills` ),是实际的重复与漂移源。先把 skill 中的确定性步骤下沉为炼境 MCP 工具,让 skill 变薄,再做投影。
- 为什么: 2026-09-30 探针显示同一批 skill 在三端各维护一份( Claude `~/.claude/skills` 、Codex `source-command-*` 副本、DSH 手写 `.dsh/skills` ),是实际的重复与漂移源。先把 skill 中的确定性步骤下沉为炼境 MCP 工具,让 skill 变薄,再做投影。
- 不做:炼境不执行推理类 skill( 无模型、会丢失会话代码上下文、越过「不替 agent 思考」边界);不以运行时拉取 skill 正文作为主路径(炼境离线即失效、脱离 Git 分支)。
- 不做:炼境不执行推理类 skill( 无模型、会丢失会话代码上下文、越过「不替 agent 思考」边界);不以运行时拉取 skill 正文作为主路径(炼境离线即失效、脱离 Git 分支)。
### 📋 P7 — MCP 服务器说明的三端支持验证
### ✅ P7 — MCP 服务器说明的三端支持验证
- status: to do
- status: done
- complexity: S
- complexity: S
- files: src-tauri/src/mcp_server.rs, docs/ai-context/agent-button-system.md
- files: .blueprint/modules/agent-client-parity.md, docs/ai-context/agent-button-system.md( 结论为部分支持, src-tauri/src/mcp_server.rs 与 lian-jing skill 均不改)
- depends: P1
- depends: P1
- acceptance: "agent_verify: [三端无头探针] 在 initialize 下发唯一标记的 instructions, 判定三端是否把它带入模型上下文。全部支持则把引导提示迁到服务器说明, 本地 skill 只保留 MCP 不可达时的排障步骤;部分支持则如实记录、保留 skill 引导。"
- acceptance: "agent_verify: [三端无头探针] 在 initialize 下发唯一标记的 instructions, 判定三端是否把它带入模型上下文。全部支持则把引导提示迁到服务器说明, 本地 skill 只保留 MCP 不可达时的排障步骤;部分支持则如实记录、保留 skill 引导。"
- 为什么: Claude 已实证会把 lian-jing 的服务器说明带入上下文;若三端皆支持,引导提示可由炼境集中维护。
- 为什么: Claude 已实证会把 lian-jing 的服务器说明带入上下文;若三端皆支持,引导提示可由炼境集中维护。
- 结论( 2026-10-03) : 部分支持。Claude Code 与 DSH 会把 initialize 下发的 instructions 带入模型上下文, Codex 不会。按 acceptance 不迁移:引导提示仍以 lian-jing skill( 及 AGENTS.md 托管块)为三端单一来源,服务器说明保持现状,只作 Claude/DSH 的增强层;三端都须遵守的规则不得只写在服务器说明里(已写入 agent-button-system.md「本地 Agent 控制面的稳定边界」)。
- verification: "2026-10-03 三端无头探针( 零凭据; 不改用户配置, 不连运行中的炼境) : node 写的最小 MCP 桩服务( streamable-http, 纯 JSON 响应),每端两个端口——实验组 initialize 带 instructions, 内含该端专属随机标记; 对照组不带 instructions 字段,其余完全相同。标记只出现在 instructions 里,工具 probe_ping 的名字、描述和返回值都不含标记。同一问题: 「MCP 服务器说明里有什么标记字符串?只回答标记,不调用工具,没收到就答 NONE」。桩服务记录收到的请求, 用来证明客户端确实完成了 initialize → tools/list。
① Claude Code 2.1.173( claude-sonnet-4-6; claude -p --mcp-config --strict-mcp-config --tools '', cwd 为空目录):支持。实验组 init 显示 ljprobe connected, 答出 LJ-P7-3067CE459B; 对照组答 NONE; 实验组输入 token 多 99( 10774 对 10675) , 与多出的说明长度相符。
② Codex CLI 0.155.0-alpha.9.2( codex exec --json -s read-only, -c mcp_servers.ljprobe.url 临时覆盖, 用户默认模型, cwd 为空目录):不支持。实验组、对照组都答 NONE; 桩服务日志证明 initialize( codex-mcp-client, 协议 2025-06-18) 与 tools/list 均成功,即说明已送达客户端、但没进入模型;两组输入 token 完全相同( 16320 = 16320; 换宽问法「全部上下文里是否有 LJ-P7- 开头的字符串」为 16335 = 16335) ; 该会话 rollout 文件中标记出现 0 次。正向对照:让模型调用 probe_ping, 它确实发起 mcp_tool_call(server=ljprobe, tool=probe_ping)(被 approval policy never 拦下) , 说明桩服务的工具在模型视野里, NONE 不是没连上。加开发中特性 --enable mcp_2026_07_28 后仍答 NONE, 输入 token 仍为 16320。
③ DSH( 桌面版内置运行时 headless; --patch 叠加层停用用户已有的三个 MCP 条目、插入指向桩服务的 dsh-mcp-client 条目,用户 ~/.dsh 与 DSH_HOME 均未改):支持。实验组答出 LJ-P7-B0628021BF, 思考过程原样复述了说明全文; 对照组答 NONE; 实验组输入 token 多 53( 6487 对 6434) 。DSH 在 initialize 前先发 server/discover, 桩服务与炼境一样回 -32601, DSH 随即回退到 initialize → tools/list; 其 mcp-client 配置有 maxInstructionBytes( 默认 32768) 。
探针脚本、桩服务与原始日志留在本机 %TEMP%\lj-p7-probe( 未入库, P4 固化时可参考)。"
- known_limits: "Claude 与 DSH 只验了无头模式, Claude 只用了 sonnet-4-6; Codex 未验 TUI 与桌面版(桌面版可能走 app-server 路径,结论可能不同),也未验 SSE 传输。探针用的是桩服务的中英混合短说明,未用炼境真实说明(中文 238 字、UTF-8 500 字节,远低于 DSH 默认上限 32768 字节) 实测。Codex 后续版本若开始带入服务器说明, 按「检测行为而非嗅探版本」重跑本探针( P4 固化后纳入矩阵) , 三端都支持时再迁移。现有服务器说明五条要点中, 「先读状态」「canonical project_id」「开发变量先查后登记」在 skill 有对应条目; 「其他写操作须用户明确确认」与「unavailable/unknown 不得当作成功」在 skill 与 AGENTS.md 中只有分场景表述(合并 PR、CI workflow、工具链安装; MCP 不可用时不伪造诊断) , Codex 会话只能从这些条目与工具描述获知——是否补成通用条目留待下次改 skill 时一并处理(需升接入包版本),本卡不改。"
### 📋 P8 — 一键接入:创建/添加子项目即完成三端可用
### 📋 P8 — 一键接入:创建/添加子项目即完成三端可用
- status: todo
- status: todo