# KDNA 运行时路由

版本: 0.1  
状态: 草案  
规范: `docs/runtime-routing.md`

## 1. 目的

KDNA 运行时路由是决定**是否、哪个、以及如何**为给定任务加载 KDNA 领域的机制。它不是搜索引擎——它是**门控**。它的首要责任是防止错误领域加载（判断污染），同时启用正确领域加载。

**核心原则：没有 KDNA 也比错用 KDNA 更好。**

## 2. 路由器架构

```
用户任务
    ↓
kdna route "<task>" --json
    ↓
┌─────────────────────────────────────────┐
│              KDNA 领域路由器              │
│                                           │
│  1. 意图门    → 需要判断吗？              │
│  2. 否定匹配  → 有排除吗？                │
│  3. 领域匹配  → 有匹配吗？                │
│  4. 信任门    → 可以加载吗？              │
│  5. 歧义门    → 选哪个？                  │
│  6. 输出状态  → 7 状态结果                │
└─────────────────────────────────────────┘
    ↓
Agent 严格执行路由结果
```

## 3. 七种路由状态

### SKIP_NO_JUDGMENT_NEEDED
**条件**：任务是机械性、事实性或程序性的——不需要领域判断。  
**例子**：格式转换、语法修正、文件查找、算术、代码执行、简单翻译。  
**行为**：正常回答。不提及 KDNA。  
**追踪**：记录决定，未加载领域。

### SKIP_NO_LOCAL_DOMAIN
**条件**：任务可能受益于领域判断，但没有已安装的领域覆盖它。  
**例子**："设计一个网站"，但本地只安装了团队管理领域。  
**行为**：使用模型能力正常回答。仅当用户明确询问时才提及可安装的领域。  

### SKIP_WEAK_FIT
**条件**：有领域部分相关但置信度低于阈值。  
**例子**：写作领域对应一个 30% 编辑、70% 创意构思的任务。  
**行为**：正常回答。在追踪中记录弱匹配被考虑并跳过。  

### REJECT_NEGATIVE_MATCH
**条件**：领域的 `does_not_apply_when` 明确排除了这种任务类型。  
**行为**：**阻断加载。** 领域作者明确排除了这种情况。  

### ASK_AMBIGUOUS_DOMAIN
**条件**：两个或以上领域都可能适用，但每个会产生不同的判断框架。  
**行为**：向用户呈现选择。不要静默混合。  

### LOAD_STRONG_FIT
**条件**：一个领域有高置信度匹配，且信任门通过。  
**行为**：`kdna load <domain>`。  

### BLOCK_TRUST_FAILED
**条件**：领域语义匹配，但信任验证失败（签名、yank、许可证、政策）。  
**行为**：阻断加载。  

## 4. 先否定匹配

传统搜索问："这个像不像？"

KDNA 路由先问：**"这个有没有明确说不该用？"**

声明了 `"does_not_apply_when": ["用户只要求前端实现"]` 的领域，必须在任何正向匹配之前被排除。领域作者的边界必须在协议层面被尊重——不能留给 LLM 自己判断。

## 5. 信任门

加载前验证：

1. 签名有效
2. 未被 yank
3. 许可证有效（商业域）
4. 风险等级不超出组织政策
5. 兼容性声明与加载器匹配

## 6. Agent 集成模式

### 模式 A：静默运行时（Claude Code, Codex, OpenCode）
- 自动评估路由
- 强匹配 → 静默加载
- 跳过/弱/拒绝 → 不打扰用户
- 全部追踪供审计

### 模式 B：交互式选择（兼容客户端、创作工具）
- 自动评估路由
- 歧义 → 向用户展示选择
- 无本地域 → 建议发现（但不自动安装）

### 模式 C：策略锁定（企业）
- 管理员配置允许的域、风险等级和自动加载策略
- 路由遵守组织政策门
- 所有决策为合规审计记录

## 7. 发现但不安装

当结果为 `SKIP_NO_LOCAL_DOMAIN` 时，系统可以**建议**注册表中的领域——但不得自动安装或自动加载。

## 8. CLI 集成

`kdna route` 命令是 KDNA 运行时的单一入口。输出符合 `specs/route-result.schema.json`。

Agent 严格执行路由结果：
- `action: load` → `kdna load <domain>`
- `action: skip` → 正常回答
- `action: ask` → 呈现选择
- `action: block` → 停止加载

### 动作/状态映射

| 状态 | 动作 | 行为 |
|------|------|------|
| SKIP_NO_JUDGMENT_NEEDED | skip | 正常回答 |
| SKIP_NO_LOCAL_DOMAIN | skip | 正常回答，被问才提 KDNA |
| SKIP_WEAK_FIT | skip | 正常回答，追踪弱匹配 |
| REJECT_NEGATIVE_MATCH | skip | 正常回答（领域边界排除了此任务） |
| ASK_AMBIGUOUS_DOMAIN | ask | 呈现选择，不混合 |
| LOAD_STRONG_FIT | load | `kdna load <domain>` |
| BLOCK_TRUST_FAILED | block | 停止（信任失败） |
