# memindadm 内 Goose 网关策略中心设计

> **定位：** `memindadm` 后台内的一个功能模块，不是独立治理平台，也不是 Plaza 审核后台的一部分。
>
> **目标：** 做一个可配置、可审计、可扩展的 Goose 网关策略中心。
>
> **原则：** 不做大而全的中台，不引入复杂流程编排，先把策略控制、路由分发、审计留痕做扎实。
>
> **边界：** 该模块只做旁路审计和策略决策，不改变现有 Goose 服务的核心行为，不把 Goose 变成被动依赖，也不在第一阶段强制改造现有 Goose 服务链路。它归属 `memindadm` 的用户管理后台，不归属 Plaza 审核后台。
>
> **统一要求：** `Goose / Aider / OpenHands` 的 LLM 配置必须收敛到 `memindadm`，后台只保留一套统一模型配置与执行器绑定，不允许给 Goose 单独再开一套独立 LLM 设置。

## 1. 背景

现有 `memindadm` 后台已经承担了平台管理、能力配置、审计查看等职责。基于这套后台能力，可以新增一个面向 Goose 调用链路的策略模块，用来统一管理：

- 输入内容过滤
- 敏感词与敏感表达屏蔽
- 输出话术约束
- 执行器分配策略
- 高风险操作拦截与人工确认
- 调用审计与复盘

这里的核心不是“再做一个后台”，而是把 Goose 的调用前、调用中、调用后策略，纳入 `memindadm` 统一管理。

### 1.1 非侵入式要求

这一版必须满足两个硬约束：

1. 现有 Goose 服务仍然可以按原方式独立运行。
2. `memindadm` 只在调用入口、审计链路、策略配置层提供旁路能力，不要求 Goose 原服务先完成深度改造。

换句话说：

- 先接策略，不先改服务。
- 先留审计，不先改执行。
- 先做可观察性，不先做强制接管。

如果后续要把 `memindadm` 的策略真正注入到 Goose 执行链路里，再单独做一个可控的接入阶段。

### 1.2 统一模型配置要求

模型配置必须只有一个控制平面：

- `memindadm` 维护 Provider、API Key、Base URL、模型列表、默认模型。
- `Goose`、`Aider`、`OpenHands` 只从 `memindadm` 读取模型绑定。
- 后台不再出现“Goose 单独配置 LLM”的入口。
- 某个执行器如果暂时不用，可以禁用绑定，但不能绕开 `memindadm` 单独配。

迁移期间如果需要，可以先停掉原来的独立 Goose 服务配置，让它完全切到 `memindadm` 的统一配置上。

## 2. 设计目标

这个模块要解决的事情很明确：

1. 当前任务是否允许执行。
2. 输入内容是否包含敏感信息。
3. 输出话术是否符合产品约束。
4. 当前任务应该由 Goose 自处理、Aider 执行，还是 OpenHands 执行。
5. 是否需要人工确认。
6. 执行结果是否需要记录、复核或回滚。
7. `Goose / Aider / OpenHands` 是否使用同一 Provider 下的不同模型绑定。

最终效果是：

- `memindadm` = 策略配置与审计后台
- `memindadm` = 统一模型与策略控制台
- Goose Gateway = 策略执行入口
- Aider / OpenHands = 具体执行器
- Audit Log = 全链路留痕

## 3. 总体架构

```mermaid
flowchart TD
  U["用户 / 前端 / 管理员"] --> A["memindadm 后台"]
  A --> P["Goose 网关策略中心"]
  P --> G["Goose Gateway"]
  G --> E["策略判断引擎"]
  E --> F["内容过滤规则"]
  E --> S["话术约束规则"]
  E --> R["执行器分配规则"]
  E --> H["高风险操作规则"]
  E --> M["人工确认规则"]
  E --> X["执行器路由"]
  X --> G1["Goose 自处理"]
  X --> G2["Aider 执行"]
  X --> G3["OpenHands 执行"]
  G1 --> L["结果 / Diff / 审计日志"]
  G2 --> L
  G3 --> L
  L --> A
```

### 架构解读

- `memindadm` 负责配置和查看，不直接承担执行。
- Goose Gateway 是统一入口，所有 Goose 相关调用都从这里经过。
- 策略判断引擎先做规则匹配，再决定是否执行、交给谁执行、是否要人工确认。
- 执行结果回流到 `memindadm` 审计中心。

## 4. 菜单结构

建议在 `memindadm` 下新增一个一级菜单：

- `Goose 网关`

下面放 5 个子菜单即可，保持克制：

1. 内容过滤
2. 敏感词
3. 话术约束
4. 执行策略
5. 调用日志

同时建议保留或升级原有 `LLM 配置` 页面为 `统一模型中心`，专门管理：

- Provider
- API Key
- Base URL
- 模型列表
- 默认模型
- 执行器绑定

这个页面要同时服务 `Goose / Aider / OpenHands`，不是只给 Goose 用。

如果后续确实需要，再补：

- 风险规则
- 人工确认
- 策略测试

第一版不建议拆太多页，避免后台变复杂。

## 5. 核心模块

### 5.1 内容过滤规则

内容过滤用于处理三类文本：

- `input`：用户输入
- `prompt`：发给 Goose / Aider / OpenHands 的任务内容
- `output`：最终返回给用户的内容

推荐支持的匹配方式：

- 关键词匹配
- 正则表达式匹配
- 敏感字段检测
- 文件路径检测
- 高危命令检测
- 代码操作风险检测

推荐动作：

- `pass`：允许通过
- `mask`：脱敏替换
- `block`：阻断执行
- `confirm`：需要人工确认
- `log_only`：只记录不拦截

示例：

```yaml
rule_id: filter_001
name: 禁止输出密钥
target: output
type: regex
pattern: "(sk-[a-zA-Z0-9]{20,}|AKIA[0-9A-Z]{16})"
action: mask
replacement: "[已屏蔽密钥]"
level: high
enabled: true
```

### 5.2 敏感词管理

敏感词不建议只做单一词库，最好分层：

- 基础敏感词：明确禁止出现的词
- 业务敏感词：项目、客户、合同、价格、内部系统等
- 技术敏感词：密钥、Token、数据库连接串、服务器地址、生产账号等

对于技术类内容，不建议一律 `block`。更合理的策略是：

- 普通讨论：允许
- 包含真实值：脱敏
- 涉及生产操作：人工确认
- 要求输出密钥：阻断

### 5.3 话术约束

话术约束主要用于控制 Goose 的表达方式，避免输出不符合产品定位的内容。

建议分三类：

1. 固定禁止话术
2. 固定推荐话术
3. 场景化话术模板

示例模板：

```yaml
scene: coding_task_result
name: 编码任务完成话术
template:
  - 执行器：{executor}
  - 修改范围：{changed_files}
  - 测试结果：{test_result}
  - 风险提示：{risk_summary}
  - 下一步建议：{next_action}
```

### 5.4 执行器分配策略

执行器建议分成 5 类：

- `goose`：分析、设计、轻量编排
- `aider`：小范围代码修改、补丁式修复
- `openhands`：复杂开发任务、多文件改造、仓库探索、命令执行
- `manual`：需要人工确认
- `reject`：拒绝执行

建议第一阶段使用规则引擎，不做复杂模型决策。

示例策略：

```yaml
policy_id: route_001
name: 小范围代码修改走 Aider
conditions:
  task_type: code_change
  max_files: 3
  requires_browser: false
  requires_long_running_env: false
  risk_level: low
executor: aider
priority: 100
enabled: true
---
policy_id: route_002
name: 复杂仓库任务走 OpenHands
conditions:
  task_type:
    - feature_dev
    - bug_fix_complex
    - repo_refactor
  min_files: 4
  requires_command_execution: true
executor: openhands
priority: 90
enabled: true
---
policy_id: route_003
name: 只分析不改代码走 Goose
conditions:
  task_type:
    - architecture_design
    - code_review
    - requirement_analysis
  write_permission_required: false
executor: goose
priority: 80
enabled: true
---
policy_id: route_004
name: 高风险操作需要人工确认
conditions:
  risk_keywords:
    - 删除数据库
    - 生产环境
    - 支付接口
    - 权限系统
    - 用户数据
  risk_level: high
executor: manual
priority: 200
enabled: true
```

优先级原则：

- 高风险规则优先
- 阻断规则优先
- 人工确认优先
- 明确执行器规则优先
- 默认 Goose 自处理

### 5.5 任务识别器

Goose Gateway 在执行前需要先把用户任务识别成结构化结果。

示例：

```json
{
  "task_type": "feature_dev",
  "risk_level": "medium",
  "requires_code_change": true,
  "requires_command_execution": true,
  "estimated_files": 5,
  "requires_browser": false,
  "target_repo": "memind-h5",
  "suggested_executor": "openhands"
}
```

推荐流程：

1. 用户输入
2. LLM 初步识别任务类型
3. 规则引擎二次校验
4. 匹配执行器策略
5. 生成执行计划

### 5.6 高风险操作控制

高风险类型建议内置：

- 生产数据库操作
- 删除文件或目录
- 批量修改用户数据
- 支付、充值、订单相关逻辑
- 权限、登录、Token、密钥相关逻辑
- 服务器部署、重启、停止服务
- 对外发送消息、邮件、公众号发布

这些动作统一进入人工确认：

```text
confirm_required = true
```

确认内容应包含：

- 任务说明
- 执行器
- 目标仓库
- 计划修改文件
- 预计执行命令
- 风险点
- 回滚建议

## 6. 调用流程

### 6.1 普通任务

```text
用户提交任务
  ↓
Goose Gateway 接收
  ↓
内容过滤
  ↓
任务识别
  ↓
执行器策略匹配
  ↓
调用 Aider / OpenHands / Goose
  ↓
结果过滤
  ↓
话术约束
  ↓
返回用户
  ↓
写入审计日志
```

### 6.2 高风险任务

```text
用户提交任务
  ↓
内容过滤
  ↓
命中高风险规则
  ↓
生成执行计划
  ↓
进入人工确认
  ↓
管理员确认
  ↓
执行器执行
  ↓
结果审计
  ↓
返回用户
```

## 7. 审计日志

每一次调用都必须记录。

建议字段：

- `request_id`
- `user_id`
- 原始输入
- 过滤结果
- 命中规则
- 任务类型
- 风险等级
- 选择的执行器
- 执行参数
- 执行日志
- 修改文件
- diff 摘要
- 测试结果
- 最终输出
- 创建时间
- 完成时间
- 执行状态

审计日志第一阶段可以先不做复杂可视化，但数据库结构要先预留。

## 8. 表结构建议

### `goose_policy_rule`

- `id`
- `rule_name`
- `rule_type`
- `target`
- `match_type`
- `pattern`
- `action`
- `risk_level`
- `priority`
- `enabled`
- `created_at`
- `updated_at`

### `goose_sensitive_word`

- `id`
- `group_name`
- `word`
- `scope`
- `action`
- `enabled`
- `created_at`
- `updated_at`

### `goose_route_policy`

- `id`
- `policy_name`
- `task_type`
- `conditions_json`
- `executor`
- `priority`
- `enabled`
- `created_at`
- `updated_at`

### `goose_execution_log`

- `id`
- `request_id`
- `user_id`
- `task_type`
- `risk_level`
- `executor`
- `input_text`
- `filtered_input`
- `matched_rules_json`
- `execution_status`
- `execution_summary`
- `diff_summary`
- `test_result`
- `llm_provider`
- `llm_model`
- `created_at`
- `finished_at`

### `goose_manual_confirm`

- `id`
- `request_id`
- `confirm_type`
- `risk_summary`
- `planned_action`
- `status`
- `operator_id`
- `confirmed_at`
- `created_at`

## 9. `memindadm` 后台页面建议

### 9.1 内容过滤规则页

字段：

- 规则名称
- 检测对象
- 匹配方式
- 关键词 / 正则
- 处理动作
- 风险等级
- 是否启用
- 优先级

### 9.2 敏感词管理页

字段：

- 词库分组
- 敏感词
- 作用范围
- 处理动作
- 是否启用

### 9.3 话术约束页

字段：

- 场景
- 禁止话术
- 推荐话术
- 输出模板
- 是否启用

### 9.4 执行器分配策略页

字段：

- 策略名称
- 任务类型
- 条件配置
- 目标执行器
- 风险等级
- 优先级
- 是否启用

### 9.5 调用日志页

字段：

- 请求时间
- 用户
- 任务类型
- 命中规则
- 执行器
- 风险等级
- 执行状态
- 详情查看

## 10. MVP 范围

第一阶段只做小而精，不做复杂流程引擎。

### 必须做

1. 内容过滤规则配置
2. 敏感词配置
3. 执行器分配策略配置
4. Goose 调用前策略判断
5. Aider / OpenHands 路由选择
6. 调用审计日志
7. 统一模型中心

### 可以暂缓

1. 多级审批
2. 复杂权限矩阵
3. 策略版本管理
4. 复杂可视化编排
5. 自动回滚
6. 多租户策略隔离

## 11. 推荐落地顺序

### 第一步：先做表和日志

先把规则、敏感词、执行器策略、日志表建起来。

### 第二步：做 Goose Gateway 策略判断

在 Goose 调用前增加统一入口：

```text
before_execute(task)
```

负责：

- 过滤输入
- 识别任务
- 判断风险
- 选择执行器
- 生成执行计划

### 第三步：接入 Aider

先支持小范围代码任务走 Aider，因为调用简单、成本低、见效快。

### 第四步：接入 OpenHands

再把复杂任务转给 OpenHands，让它负责仓库探索、多文件开发和命令执行。

### 第五步：把 Goose 也切到统一模型中心

Goose 不再使用单独的模型配置页面，而是直接读取 `memindadm` 的统一模型中心。必要时可以先停掉原来独立的 Goose LLM 配置，保证入口只有一个。

### 第六步：做 `memindadm` 后台页面

先做简单 CRUD，不追求复杂交互。

## 12. 预期效果

完成后，`memindadm` 会具备一套轻量级 Goose 网关治理能力：

- 可配置内容过滤
- 可配置敏感词屏蔽
- 可配置话术约束
- 可配置执行器路由
- 可拦截高风险操作
- 可审计每次调用过程

这样 Goose 不再只是单一 Agent，而是变成一个可以统一调度 Aider、OpenHands、Claude Code 等工具的策略入口。

## 13. 最终定位

- `memindadm` = 用户与策略后台
- `Goose Gateway` = Agent 编排入口
- `Aider` = 小型代码修改执行器
- `OpenHands` = 复杂代码任务执行器
- `Goose` = 策略与分析执行器，模型同样来自统一模型中心
- `Policy Center` = 安全与路由规则中心
- `Audit Log` = 行为留痕与复盘中心

第一版建议在产品命名上保持克制，后台菜单直接叫：

- `Goose 网关`

只放这 5 个子菜单：

1. 内容过滤
2. 敏感词
3. 话术约束
4. 执行策略
5. 调用日志

这样产品上小，架构上完整，后续可以自然扩展。
