---
title: 检测器 FP 口径治理 —— 三类分桶（已实测/无样本/报告型）
tags: [静默失败, 检测器, A14, 铁律7]
created: 2026-09-12
status: final
---

# 检测器 FP 口径治理（2026-09-12）

## 一、问题：A14 台账永远报「10 个未实测」

铁律7 要求「新检测器第一版必须先量假阳性率，FP ≥ 30% 不许接台账」。
但实测 10 个之后发现：**其中一半根本没有可量的东西** ——

| 类型 | 实例 | 为什么不适用 |
|---|---|---|
| 违规检测器 · 有命中 | `residue_audit` | ✓ 可量（本次量到 2 命中） |
| 违规检测器 · 0 命中 | `orphan_claim_guard` / `scan_dead_guard` / `midstring_injection_guard` / `source_capability_audit` | 树内 0 命中 ⇒ **无样本可判**（按既有规矩「禁编 0」） |
| 信息型审计器 | `daily_health_check` / `digest_audit` / `engine_verify_audit` / `evening_2150_audit` / `system_audit` | 输出的是**报告/达成率**，不是「违规命中」⇒ FP 口径不适用 |

把三类混在一个「未实测」计数里 → 指标永远红着、且**逼着人给不适用者编数字**。

## 二、修法：分桶 + 如实报

`detector_registry.json` 每个检测器加 `fp_status`：
`measured` / `unmeasurable`（0 命中，禁编 0） / `not_applicable`（报告型）。
`detector_audit.py` 相应改成四桶输出：

```
FP 口径: 已实测 9 · 无样本可测 4 · 报告型(不适用) 5 · 真未测 0
```

**指标含义变了**：从「有多少个没量」→「**真未测 = 0**」才是有意义的红线。
（与 A7「库容当漂移 = 制造指标充数」同一思路：**指标必须问它到底在测什么**。）

## 三、顺带修掉的两个小缺陷

1. `detector_audit --quick` 把 FP 统计显示成 `0/0`
   —— 根因：FP 统计写在循环末尾、且在 `if quick: continue` **之后** ⇒ quick 时全被跳过。
   修：FP 口径来自 registry，与是否实跑 selftest 无关 → 移到分支之前。
2. `evening_2150_audit.run()` 吞异常返回 `""`（失败与「无输出」不可区分）—— 已登记为已知局限，未修。

## 四、实测得到的真实发现（residue_audit 的 2 处命中均为 TP）

```
scripts/dragon_preselect.py     396 行  ← dragon_preselect_wrapper.sh 实际执行的
stock_workspace/dragon_preselect.py 492 行  ← 更新（多 _load_filtered_data：跳过全市场 build_market）
scripts/system_self_heal.py     ≠  stock_workspace/system_self_heal.py
```

⇒ **同名副本已经分叉，且 wrapper 跑的是旧的那份** —— 新改进从未生效。
这与 `bin/vector_memory.sh`（scripts 版的陈旧副本）属同一类：**改到了不生效的那份**。
（处置需老板定：两份以哪份为准 —— 会改变分析输出，不擅自动。）
