# L5-提示词分布与安全改造方案

- 记录时间：2026-03-26
- 场景：回答“项目里有没有提示词？如何改造更安全？提示词放在哪，什么时候调用？”
- 目标：给出可执行的工程改造路径与落地记录

## 1. 结论（先说结论）
项目当前存在至少两条主要提示词构造链路，但长期主线只能保留一条 authoritative chain：

1) **轻量运行时链路**（`src/agent/runtime.rs`，过渡态）
- 仅有非常基础的固定 system 提示。
- 适用于非完整流程的本地/最小执行场景。
- 不应继续被扩展成主线产品提示词体系。

2) **ZeroClaw 主链路**（`third_party/zeroclaw/*`）
- 这条链路是“系统提示”主体，分为：
  - `Agent` 内部结构化构建器（`SystemPromptBuilder`）
  - `channels` 侧统一字符串拼装
  - `skills / personality / identity / bootstrap 文件 / 工具说明` 等多个注入源
- 这也是你要关注的主要安全面，也是未来应保留的唯一主线。

---

## 2. 提示词分布结构（按文件/模块）

### 2.1 固定系统提示（轻量链路，待收口）
- `src/agent/runtime.rs`
  - `execute_task_with_provider` 的 `ChatMessage { role: "system" ... }`
  - 当前内容：`You are sgClaw. Use browser_action to complete the browser task.`

### 2.2 ZeroClaw `Agent` 内构建的提示词
- `third_party/zeroclaw/src/agent/prompt.rs`
  - `SystemPromptBuilder`（默认 sections）
  - Sections：`ToolHonesty / Tools / Safety / Skills / Workspace / Runtime / ChannelMedia / DateTime`
  - `identity_config`、`skills_prompt_mode`、`security_summary`、`autonomy_level` 会影响注入内容。
- `third_party/zeroclaw/src/agent/agent.rs`
  - `Agent::from_config` 组装 `prompt_builder(SystemPromptBuilder::with_defaults())` 与 `security.prompt_summary()`。
  - `Agent::build_system_prompt` 每次首次 turn 缓存/重构系统提示。
  - `seed_history` 处理恢复会话时避免系统提示重复。

### 2.3 通道侧（channel）系统提示拼装器
- `third_party/zeroclaw/src/channels/mod.rs`
  - `build_system_prompt` / `build_system_prompt_with_mode_and_autonomy`
  - 负责 workspace bootstrap 文件注入、技能注入、工具列表、硬件说明、channel 能力、时区与runtime信息。
  - 会触发 `load_openclaw_bootstrap_files()`（`AGENTS.md/SOUL.md/IDENTITY.md/USER.md/TOOLS.md/MEMORY.md` 等）
  - compact 模式下会传递 `bootstrap_max_chars`（默认压缩上下文）。

### 2.4 技能提示词注入
- `third_party/zeroclaw/src/skills/mod.rs`
  - `skills_to_prompt_with_mode`：
    - `Full`：inline 注入完整 `instructions`
    - `Compact`：只注入摘要+工具清单，完整内容通过工具读取。
- `third_party/zeroclaw/src/tools/read_skill.rs`
  - `read_skill(name)` 负责 compact 模式下按需读取技能全文。

### 2.5 人格/身份上下文注入
- `third_party/zeroclaw/src/agent/personality.rs`
  - 读取 `SOUL.md/IDENTITY.md/USER.md/AGENTS.md/TOOLS.md/HEARTBEAT.md/BOOTSTRAP.md/MEMORY.md`
  - `load_personality` + `render` 组成身份上下文片段。
- `third_party/zeroclaw/src/channels/mod.rs`
  - `load_openclaw_bootstrap_files()` 读取 `AGENTS.md` 等工作区文件。

### 2.6 子代理提示词（可单独注入）
- `third_party/zeroclaw/src/tools/delegate.rs`
  - `build_enriched_system_prompt` 组合 `ToolsSection / SafetySection / SkillsSection / WorkspaceSection / DateTimeSection`
  - 叠加 `agent_config.system_prompt`（可选）

### 2.7 安全模块相关（目前与 prompt 解耦）
- `third_party/zeroclaw/src/security/policy.rs`
  - 安全策略、命令校验、`prompt_summary()`。
- `third_party/zeroclaw/src/security/prompt_guard.rs`
  - 已有 prompt 注入检测能力，但当前代码链上未见到统一接入点（需要补齐）。

---

## 3. 提示词何时调用（触发场景）

### 3.1 WS 网关（持久会话）
- `third_party/zeroclaw/src/gateway/ws.rs`
  - 连接建立后 `Agent::from_config`。
  - 若后端有历史消息：`agent.seed_history(&messages)`。
  - 每条用户消息执行 `agent.turn_streamed`。
  - `turn_streamed`：若历史空则调用 `build_system_prompt()`。

### 3.2 gateway 简版 webhook
- `third_party/zeroclaw/src/gateway/mod.rs`（`run_gateway_chat_simple`）
  - 通过 `channels::build_system_prompt(...)` 构造简版系统提示。

### 3.3 gateway 全功能通道
- `third_party/zeroclaw/src/gateway/mod.rs`（`run_gateway_chat_with_tools`）
  - 走 `agent::process_message`。
  - `process_message` 中每次请求构建一次通道 system prompt。

### 3.4 CLI 主入口（daemon / interactive）
- `third_party/zeroclaw/src/agent/loop_.rs`
  - CLI run 或交互会初始化工具/skills/系统提示后，`agent_turn` 执行。
  - 命令行消息与 tool_loop 共用通道侧 build path。

### 3.5 每轮 Agent 恢复与续接
- `Agent::seed_history()`（持久化会话恢复）
  - 首次首轮会确保系统提示存在；历史中的旧系统提示会被过滤并重建。

### 3.6 交互历史恢复
- `agent/loop_.rs:load_interactive_session_history`
  - 历史文件缺失或首条非系统时，补系统提示。

---

## 4. 安全改造建议（按优先级）

### P0（建议立即做）
0) 收口双主链路
- `sgclaw` 不应长期同时维护一条轻量自定义 prompt 链和一条 zeroclaw 主链。
- 目标是：保留 zeroclaw 主链，sgClaw 仅增加安全摘要、浏览器上下文和受控工具面说明。

1) 接入 `PromptGuard`
- 目前已有 `third_party/zeroclaw/src/security/prompt_guard.rs`
- 在以下入口加扫描并截断/告警：
  - `Agent::turn` / `turn_streamed`
  - `agent::process_message`
  - `gateway simple chat` 和 ws/process path 的入口
- 对注入风险高命令（ignore previous/system override/role confusion）直接 block 或标记高风险。

2) 统一把工作区文件内容做“可注入净化”
- 在注入前清洗 `AGENTS.md`/`SOUL.md` 等：
  - 去控制字符、长度限制、拒绝危险模板片段（如“you are now…”、“ignore previous instructions”）
  - 记录清洗与截断明细（便于审计）。

### P1（1-2次迭代内）
3) 将安全摘要作为结构化 section 强约束
- 在 `SafetySection`/`build_system_prompt_with_mode...` 中统一注入 `security.prompt_summary()`。
- 保证“允许命令/禁用命令/路径/审批要求/速率限制”同步显示，降低模型 trial-and-error。

4) 对 compact/full 模式加分流控制
- 将 `skills prompt mode` 默认由 full 改为 compact。
- full 模式仅在受信任场景启用；compact 场景默认使用 `read_skill`。

5) 工具调用策略在提示词中与执行层双向一致
- 当前提示词有“Do not ask, execute directly”等语义，与执行层策略一致，但对 high-risk 仍需更硬约束。
- 与 `tools::shell` 参数、`security.validate_command_execution`、`tool approval` 形成统一 policy 文档化。

### P2（优化）
6) 统一系统提示模板
- `channels::build_system_prompt_*` 与 `SystemPromptBuilder` 逻辑有重叠。
- 建议抽取公共 section（日期、安全、技能、工具）并做一次性组装，减少版本漂移导致的绕过面。

7) 增加会话级审计
- 当检测到提示词注入高分时：记录原始用户输入哈希、触发规则、决策（block/warn/sanitize）。
- 与工具执行失败（rate limit / blocked path）打通到同一告警链。

---

## 5. 本次已确认的“关键风险”
- `PromptGuard` 尚未在主入口统一挂载（存在检测能力，但未形成强制拦截链）。
- workspace/skills 内容可直接进入 prompt，注入面较宽。
- 两套系统提示构建链路（轻量链路与 zeroclaw 主链）同时存在，容易造成安全策略漂移。
- `sgclaw` 如果继续把浏览器专用提示补丁放在主链外侧，会重新制造第三条 prompt source。

---

## 6. 建议的落地顺序（两周内可完成）
1. 统一入口加 `PromptGuard.scan` + deny/block 映射（最小改动）。
2. 在 `channels` + `personality` 的文件注入点加净化和长度守卫。
3. 安全摘要 section 作为每条提示词的必含块。
4. compact 模式默认开启并补充 `read_skill` 受控流程。
5. 增加一组回归用例：
   - 复现提示词覆盖攻击
   - 系统提示重复/续接场景（seed/reseed）
   - compact/full 两种技能注入对比
