# a207-followup-mcp（M4 · 随访系统）

儿童 CKD 随访系统 MCP。对应 PCP 契约 `follow_up` 输出位。Batch C 交付包（与 M9 报告配对）。

## 工具清单

| 工具 | 类型 | 权限 | 说明 |
|---|---|---|---|
| `schedule_followup` | 写 | 医生/营养师/编排层（MX 收口） | 创建随访计划。频率按 **KDIGO 2024 儿科推荐**自动算（`next_due_date`）。`plan_summary` 全角色可见，`note_to_clinician` 仅临床可见 |
| `get_followup_records` | 读 | 全 caller | 随访记录与计划时间线。**随访计划摘要可见；原始医生备注（doctor_notes / note_to_clinician）仅医生/营养可见，家属/患儿被剔除** |
| `get_adherence_score` | 读/写 | 全 caller | 依从性评分（M4 拥有依从性数据）。三域比率(0-1)→加权复合分(0-100)，落库快照 |
| `get_pew_timeline` | 读 | 全 caller | **PEW 时间线 facade（ADR-007）**：接受 M3 `get_pew_history` 输出并入统一时间线，存储归属 M3，零跨包 import。原名 `get_pew_history`，因与 M3 同名易混淆双跳已更名（P1-2），**不保留旧名别名** |

## 调用方身份（P0-1）

调用方身份**不再是工具入参**，由部署侧通过环境变量 `A207_CALLER` 注入（取值见 `a207_policy.CALLERS`），
模型无法自证身份；未注入时所有工具 fail-closed 抛 `CallerUnknown`。
放行集合统一取自 `a207_policy`（`FOLLOWUP_WRITE_ALLOWED` / `FOLLOWUP_CLINICIAN`），本包不再维护副本。

```bash
A207_CALLER=doctor_assistant python -m a207_followup_mcp.server
```

## 关键设计决策（详见 docs/decisions/ADR-008、ADR-009）

### 1. 随访频率（KDIGO 2024 儿科推荐）
`recommend_followup_interval(ckd_stage, albuminuria_stage)` 返回推荐间隔（天）：

| CKD 分期 | 基础间隔 | 依据 |
|---|---|---|
| G1 / G2 | 180 天（1-2 次/年） | 儿科共识 Rec17 |
| G3a / G3b / G4 | 90 天（≥3-4 次/年） | 儿科共识 Rec17 + NICE NG203 |
| G5 | 60 天（>4 次/年） | 儿科共识 Rec17 |
| G5D | 30 天（每月） | PRNT 2025 人体测量频率 |

白蛋白尿升级：A2 缩短 30 天、A3 缩短 60 天（下限 14 天）。

**文献依据**：
- KDIGO 2024 CKD Guideline, *Kidney Int* 2024;105(4S):S117-S314（Francis et al. *JAMA Pediatr* 2024 儿科要点：儿童 CKD 至少每年评估 GFR+蛋白尿，高风险更频）
- NICE NG203 Table 2（2021，2024 复核）
- 儿科共识 Rec17（Scielo 初级保健儿科 2024，引 Furth 2018 / KDIGO 2012）：G1-2→1-2 次/年，G3-4→≥3-4 次/年，G5→>4 次/年
- PRNT 2025：CKD2-5 人体测量每 1-3 月，CKD5D 每月（*Pediatr Nephrol* 40:69-84）

### 2. 依从性评分公式（透明加权复合分）
```
composite = 100 × (w_diet·diet_ratio + w_med·med_ratio + w_visit·visit_ratio)
等级：≥80 好 / 50-79 中 / <50 差
```
- `diet_ratio`：饮食日记完成率（来自 M3 日记 / M11 打卡）
- `med_ratio`：用药按时率
- `visit_ratio`：随访到场率
- 默认等权（1/3 各），可经 `weights` 调整

**文献依据**：MMAS-8（8 项 Morisky）是 CKD 依从性测量最常用、经验证工具（Springer Med 系统综述 2024；0=高、1-2=中、3-8=低）；儿科可用 CAAMQ。但**儿科 CKD 尚无单一经验证的"营养+用药+就诊"复合评分**（pubmed 24814533 综述：单一工具不充分，应多方法组合）。故本复合分为**系统定义、待临床验证**，等级阈值参照 MMAS-8 风格低/中/高带，非来自单一验证量表。

### 3. 随访记录数据结构（M4 自行设计）
```jsonc
// FollowUpRecord（追加式，add_followup_record）
{
  "record_id": "FR-Pxxxx-xxxxxxxx",
  "visit_date": "YYYY-MM-DD",
  "visit_type": "outpatient|phone|online|dialysis|nutrition_counsel",
  "ckd_stage": "G1..G5D",                 // 当次快照
  "indicators_snapshot": { ... },        // 体重/身高/Scr/eGFR/K/P/Hb 等（可见）
  "plan_summary": "随访计划摘要",          // 全角色可见
  "doctor_notes": "原始医生备注",          // 仅临床角色可见（家属/患儿剔除）
  "created_by": "doctor_assistant",
  "created_at": "ISO"
}
// FollowUpPlan（schedule_followup 产出）
{
  "plan_id": "FP-Pxxxx-xxxxxxxx",
  "cadence": { "interval_days": 90, "anchor_date": "...", "next_due_date": "...",
               "basis": "...", "citation": "..." },
  "visit_type": "...", "status": "active",
  "plan_summary": "...",                  // 全角色可见
  "note_to_clinician": "...",             // 仅临床角色可见
  "created_by": "...", "created_at": "..."
}
```
存储：`data/followup_store.json`，按 `patient_id` 分 `records` / `plans` / `adherence` 三段。

### 4. PEW 历史归属（ADR-007）
PEW 历史由 **M3 拥有并落库**（`a207-nutrition-assessment-mcp-nfyy` 的 `record_pew_risk` / `get_pew_history`）。M4 的 `get_pew_history` 仅作 facade——接受 M3 输出再并入统一随访时间线，**零跨包 import**。详见 `docs/decisions/ADR-007.md`。

## 验证
```bash
python -m py_compile src/a207_followup_mcp/*.py
python tests/test_tools.py   # 全部断言应全过
```

## 已知缺口（非阻断）
- 随访计划暂无"逾期/提醒"外发能力，需 M10 通知 MCP 消费 `next_due_date` 触发提醒（见路线图 Batch D）。
- 依从性三域比率由调用方提供（M3 日记 / M11 打卡 / 就诊记录），M4 不反向查询这些包（零跨包 import）。
