# Feature Spec: ContentSafety · FilterRule(Ops · ECR-019) > Status: `Active`(Loop continuous · **ECR-019 Closed**) > Parent: WAVE0-FROZEN · Predecessor: ECR-018 Closed > Capability: `ContentSafety` · BC: `Content_Safety` > 授权:`docs/WAVE0/LOOP_AUTHORIZATION.md` ## Non-goals ModerationCase 写回 · CrisisPolicy 配置 · 真 NLP/厂商审核 · UGC · 真支付 · 用户侧硬拦截上线(本切片仅运营只读 + 试匹配) ## L2 Domain | 概念 | 语义 | |------|------| | `FilterRule` | code 唯一;category ∈ {crisis,abuse,spam,pii};action ∈ {flag,block,escalate};system 种子不可本切片删除 | ## L3 API | Method | Path | 权限 | 语义 | |--------|------|------|------| | GET | `/admin/content-safety/filter-rules` | `admin.content_safety.read` | 列表 | | GET | `/admin/content-safety/filter-rules/:id` | 同上 | 详情 | | POST | `/admin/content-safety/evaluate` | 同上 | 试匹配(不写工单) | ## Migration `000020`:`filter_rules` + 种子规则 + 授予 `admin.content_safety.read` ## L4 AC | ID | Then | |----|------| | AC-F-01 | list 含 system 种子 ≥1 | | AC-F-02 | evaluate 命中种子 pattern → matches 非空 | | AC-F-03 | get 未知 id → 404 | | AC-S-01 | 无 Admin → 401 | | AC-S-02 | 无 content_safety.read → 403 | | AC-P-01 | list < 500ms | | AC-O-01 | evaluate 不写 Audit(只读试匹配) | contract_diff: `docs/CONTRACT_DIFF/ECR-019.yaml`