# Tanya 高尔夫去噪规则（云端副本）

云端 HTML：https://tanya-denoise-rules.pages.dev/
云端 Markdown：https://tanya-denoise-rules.pages.dev/rules.md

本文件供经验记忆 / AI 直接读取。本地仓库另有同文真源，冲突时以本云端 v5 与用户当次口头锁定为准。

---
name: Tanya高尔夫去噪规则
description: >-
  Tanya 高尔夫统计去噪与球杆识别的唯一真源。凡 Arccos/Garmin 对账、NOCLUB、开球杆、
  坏洞/好洞、截图补标、球杆手册数字，开工先读全文。后一条覆盖前一条。
---

# Tanya 高尔夫去噪规则（v5 · 2026-08-25）

球员：**只 Tanya**。Melissa 数据禁止写入 Tanya 库。Melissa 当场逐洞校对走另一份：`Grok/experience_outbox/Arccos Garmin 逐洞校对.md`。

**本文件是去噪规则唯一真源。** 网页（tanya-golf-clubs / tanya-club-book / birdie-holes / bad-holes）是展示层，可能滞后。展示数字与本文冲突时，以本文为准，不得拿网页上的 `bag_inferred` 九号木压过开球默认 Driver。

后写入的条款覆盖先前旧口径。改规则须升版本号并留痕。

跨平台副本（内容应一致，更新时覆盖）：

- **云端（经验记忆优先读）**：https://tanya-denoise-rules.pages.dev/ 以及纯文本 https://tanya-denoise-rules.pages.dev/rules.md
- 本机可编辑原稿：`Grok/experience_outbox/Tanya高尔夫去噪规则.md`
- Basic Memory `codex-memory` → `experience/tanya-高尔夫去噪规则`

改规则：先改本机原稿，再发布到云端，并覆盖 Basic Memory。四站顶栏链到云端页。网页统计是展示层，可能滞后。

## 0. 给所有 AI：什么时候必须读本文

凡任务涉及下列任一项，开工先读全文，再动手：

- Tanya 高尔夫统计、去噪、重清、球杆手册、记分卡
- Arccos / Garmin 对账、NOCLUB、未打标、传感器断档
- 开球用了哪根杆、补 Garmin 截图上的漏标
- 好洞 / 坏洞诊断页上的杆序

未获用户当次明确授权：**不要改** `tanya_arccos_v2.sqlite`，不要把练习场从库里删掉，不要把 Melissa 场并进来。展示层改杆 ≠ 改账本。

---

## 0.1 本版新增（用户 2026-08-24 原话，已锁定）

> 正常的非3杆洞开球应该都是 driver，除非特别情况才用其他杆来开球，可参考同球场其它日子的数据来判断。

完整条款见 **§9**。这条覆盖旧「par4/5 开球 = Driver 或球道木」以及「按这一杆飞了多少码在全包里猜杆」——**码数短不能单独构成特别情况**。

## 0.2 本版新增（用户 2026-08-25 锁定）

满挥杆（Driver / 木 / 铁 / 铁木，不含挖起杆和推杆）在发球台或离旗很远时出现只有几码的 GPS，作废**距离**，不改杆号。完整条款见 **§20.1**。§9「飞得短不改杆号」仍然成立。果岭边 8/9 铁十几码切滚不杀。未经当次批准不改 sqlite。

---

## 1. 六层数据源

| 层 | 是什么 | 角色 |
|---|---|---|
| A | Arccos API / 原始 JSON+FIT | 数字层。旧主时间线 263 场（至 2026-05-03） |
| B | Garmin 导出（GDPR `DI-GOLF`，165 场，2023-05-28～2026-07-16） | 数字层。旧管线重叠场只当对照，仅 18 场进主库 |
| C | Arccos Mac 截图 | 截图层 |
| D | Garmin Mac 截图 | 截图层 |
| E | Arccos / Garmin **手机**截图 | 截图层，**比 Mac 准** |
| F | 正式比赛官网 / BlueGolf 成绩页 | 正式比赛名单 + 洞分优先 |

四层综合 = A + B + 两边截图（C/D/E）。手机洞图优先于 Mac 洞图。拧不成一股 → 人工确认，不猜。原值保留，判定另列 `source`。

## 2. 场次与成绩

1. **正式比赛**：Tanya 所有年份 BlueGolf 成绩页上列出的场都算。例：`scpgajt.bluegolf.com` 档案 `yzhan`。不限某一场活动。
2. **洞分**：有官网听官网；没官网听 Garmin。不再默认听 Arccos API。
3. **完整场**：只认记满 9 洞或 18 洞。少洞 = 练习。
4. **练习场**：留库、标练习，默认不进 KPI，可翻。不整场删除。用户原话（2026-08-19）：没打满 9 洞的场次不用管（不必补截、不必从 backup 追）。

## 3. 推杆

1. 推杆距离一律作废，只计次数。
2. Garmin 与 Arccos **次数一致** → 用该次数。
3. 不一致 → 推杆数 = 该洞洞分 − 推杆前已打杆数（再扣已确认的罚杆）。
4. 「推杆前打了几杆」：四层综合，无死规则；拧不成问人。
5. Garmin 导出常无逐杆推杆，但洞级推杆数仍在；计分可用，推杆页在 Garmin 窗口可能是空的。「用杆次数」不能跨 Arccos/Garmin 这条界线比大小。

## 4. 逐杆字段（四层综合）

对照 Garmin 数字、Arccos 数字、两边截图；拧不成问人。层间相差 **≤5 码** 的距离/左右偏移不算差异。

- 有没有这一杆 / 杆序
- 球杆（**不再默认「冲突听 Garmin」**）
- 非推杆距离
- 左右偏移（不再单靠反推旗杆）
- 球位（tee / 球道 / 长草 / 沙坑 / 果岭）；unknown 不猜
- 罚杆
- 起点 / 落点 GPS（上果岭终点勿默认当旗杆）

## 5. 硬红线

- 推杆距离作废
- `club_raw` 永不覆盖
- unknown 不静默填 hit
- 不可信显式列出，不悄悄删
- 对外页不写内部术语；AI 署名按既定页脚口径
- 编码 ≠ 度数：Arccos `clubType` 是内部 ID（`56`＝60° Lob，`42/Sw`＝56° Sand，`18`＝9 木，`16`＝7 木，`14`＝4 木，`3`＝5 木）。新数字码先 GPS 配对 + 屏幕标签实证，禁按数字当度数。
- Arccos round 明细 `distance` 字段是**米**不是码。库存真码走 `distance_yd`，原值留 `distance_raw_m`。

## 6. 落库与动手纪律

**v4.1 增补（用户 2026-08-24 晚原话锁定）**：「不能只改覆盖层，底层数据直接改，只要我审核了就要改底层数据。」——凡经用户当次审核批准的球杆/字段修正，必须直接写入 `tanya_arccos_v2.sqlite`（改 `club_final`/`club_source=manual_confirmed`/`club_confidence`，并写 `corrections_log` 留痕），不得只落展示覆盖层。`club_raw` 永不覆盖（§5）不变；未经审核的仍不准改库。首批已入库：2026-08-24 的 11 杆（10 杆 §9 开球 Driver + Los Robles 370577465:9:4 九铁），corrections_log ts=20260824_201658。


- 未经用户当次明确授权，不改 `tanya_arccos_v2.sqlite`。
- 不把练习场从库里删除。
- 不把 Melissa 场并进 Tanya。
- 展示层改杆（覆盖层 / 截图补标）必须可逆留痕；账本不改除非用户批准。
- 规则变更后：全量重跑 + 机械门禁 + 阴性对照抽验（抽已确认正确样本，验证未被误改）。

## 7. 第一杆起点（2026-08-20）

每个球洞的第一杆起点必须是 Tee。Garmin 若把第一杆起点记成 rough / fairway / 其他，一律视为错误记录，改成 tee。不要用 Garmin 第一落点覆盖 Tee。按图也不改第一杆起点（只标第一杆落点）。

## 8. 传感器断档与 NOCLUB（2026-08-20 锁定）

断档判定三条件：窗口前后月度使用正常 ＋ 窗口内该系统连续为零 ＋ 同期另一系统或成绩推算表明该类击球仍存在。断档杆随时间轮换，**不可一次探测永久沿用**。

**断档窗口内：**

1. `NOCLUB` 击球第一候选 ＝ 当期**没电的那几根杆**（集合内再用距离带分辨）。
2. 该系统对涉断档杆的「改判」不可信，反转以另一系统为准。
3. **活着的杆**若真打了，通常会打上标。空白开球不要猜成当时还活着的杆。

### 窗口 A：2026-05-09 → 2026-06-16（连续 10 场）

没电：8 铁 / 9 铁 / 50° / 56° / 60° / 9 木。原始打标＝0。  
P 杆（Pitching Wedge）多数场次仍有实测，**不是**整段没电。没电的短铁挥出去，Garmin 记 NOCLUB，管线曾低置信猜成 PW。

已锁定必须改：2026-06-14 Los Robles 第 9 洞第 4 杆，NOCLUB、95.7 码、长草，原推断 P wedge → **9 铁**（备选 8 铁）。窗口 A 里其余 85–125 码 NOCLUB 已是 8/9 铁的保持。三杆洞发球已核的 8/9 铁保持。不要把 150 码以上三杆洞改成 8/9 铁。

### 窗口 B：2026-07-01 → 2026-07-16

没电：一号木 / 四号木。8/9 铁和 P 杆都活着。  
**开球 NOCLUB 判 Driver**（与 §9 一致）。

---

## 9. 非三杆洞开球默认 Driver（2026-08-24 用户锁定）

**正常的非 3 杆洞（Par 4 / Par 5）开球默认是 Driver。** 除非特别情况，才用其他杆开球。特别情况可参考**同球场其它日子、同一洞**的开球杆来判断。

### 9.1 什么算「特别情况」（要有独立证据）

下列之一才可改判为非 Driver：

- Garmin 或 Arccos **当场打上了**非 Driver，且该杆传感器当时是**活的**（不是 NOCLUB）。
- 同球场同洞近若干场，稳定用同一根非 Driver（例如极短的 par 4 习惯用 3 木）。
- 洞是 Par 3：本条不适用；par 3 开球按洞长选杆（见规则 13）。

### 9.2 什么不算特别情况

- **这一杆飞得短**（例如 133 码）。可能是打薄、打歪、GPS 只量到这么远，杆号仍按 Driver。
- 全包距离核密度把该码数判成 9 木 / 5 铁 / 4 木（`bag_inferred`）。距离带**不得压过**本条。
- 网页「坏洞诊断 / 球杆手册」上已经写成九号木。展示层滞后，不是现场确认。

### 9.3 与断档规则叠用

窗口 B 里一号木传感器是死的，开球经常是 NOCLUB。此时：

1. 第一候选是没电集合 {Driver, 4 Wood}，不是活着的 9 木。
2. Par 4/5 开球再按本条落到 **Driver**。
3. 码数短只说明这一杆打短了，不改杆号。

### 9.4 反例（必须按本条改）

2026-07-06 Encino 1 号洞，Par 4，Garmin 原文 NOCLUB、133 码。`bag_inferred` 写成 9 Wood（低置信：9 木 44% > 5 铁 30% > Driver 9%）。同洞历史几乎全是 Driver（181–239 码）。当日九号木传感器是活的，三杆洞的 `3w` 都打上了标。按本条应标 **Driver**（短开球），截图补标写 `D 133 yds`，不得写 `9w 133 yds`。

---

## 10. 球杆识别与纠错（吸收手册 v3，规则 13 已被 §9 覆盖）

来源：用户历次口述 + 数据实证。修订须升版本。

### A. 证据源与优先级

1. **双源同杆即定案**：同一杆 Arccos 与 Garmin 记同一根杆 → 最高置信直接采用。
2. **双源冲突不再默认听 Garmin**（2026-08-19 重清覆盖旧口径）。例外：①涉事杆处于其传感器断档窗口 → 反转以另一系统为准；②距离带 / 洞上下文 / 截图一致反向 → 进人工队列，不机械改判。
3. **屏幕证据高于 API 数值**：Dashboard/Connect 页面逐字杆名标签与轨迹图，与 API 冲突时以图为准（`source=screenshot_evidence`）。
4. **编码 ≠ 度数**：见 §5。
5. **单源场次仅完整 9/18 洞可信**；不完整＝疑似练习，整场不进统计、不作推断基准。
6. **推杆只计次数**：见 §3。`"Pu 打 92 码"` 类记录判记录错误（走 15）。

### B. 球包结构

7. **球包 ≤14 根；6i/7i/8i/9i/PW 恒在包内**。
8. **分时代球包名册（候选集只能取自当期名册）**：
   - 2026 用户口径：Dr、3 木或 4 木、7 木、9 木、6i–9i、PW、52°（系统侧记 50°）、56°、60°、Pu。
   - 数据实证快照（2026-08-14）：4 木用于 2026 年 1–6 月，3 木自 06-14 回归；5 铁 2026 年实际在用（待用户确认是否长期在包）；2026 球包无 Hybrid（Hybrid 属早年）。
   - 3 木 / 4 木共存性存疑时段两者皆留候选，靠距离带 + 传感器存活 + **§9 开球默认**分辨。
9. **换杆侦测**：连续 ≥2 月双系统零记录且此后不再出现＝退役换杆；仅单系统消失＝传感器问题（走 §8）。

### C. 传感器断档

10–12. 见 **§8**。不要与 §8 各写一套。

### D. 逐杆上下文推断链（对 unknown 按序叠加）

13. **洞上下文先验（已被 §9 收紧）**：
    - **Par 4 / Par 5 第一杆 = Driver**，除非 §9 的特别情况。
    - Par 3 第一杆按洞长落带选杆。
    - 球在果岭＝Pu。
    - 果岭边 ≤35 码＝楔杆族为主。例外：极少数用 8 铁 / 9 铁做 bump-and-run；楔杆距离带不匹配且轨迹呈低飞滚动时才启用 8i/9i 为低先验候选。
14. **距离带匹配（按球位条件化）**：每杆用满挥子集建 p10–p90 带（楔杆切/满双峰分层，禁全样本中位）。  
    - **fairway**：攻果岭极大概率用「最近期平均距离最匹配」的那根杆 → 距离带为强证据，落带唯一即可定案。  
    - **长草**：可能加一号杆补偿；候选＝距离匹配杆及其加一号杆，置信降一档，需 16/17 佐证。  
    - **脱困位**：故意短打/低飞/横出，**距离匹配失效**。  
    - **发球台 Par 4/5**：距离带**不得压过 §9**。
15. **物理带排错**：距离落物理不可能区（Pu>40 码、Dr<40 码非果岭边、6i>210 码等）→ 判记错杆或距离坏。Dr 打到 133 码**不是**物理不可能，走 §9（短开球），不改成 9 木。
16. **同场同杆距离一致性**。
17. **同球场同洞历史用杆**（§9 的主要佐证）：近 N 场同洞用杆频次；无该球场历史时降级用「同洞长同 par」全库分布，置信降档。
18. **离旗距离匹配**（攻果岭，与 14 联用）：近期优先于全史。发球台 Par 4/5 不适用本条来推翻 Driver。
19. **杆序逻辑闭合**：本杆终点＝下一杆起点；候选代入后全洞须讲得通。

### E. 去噪与记录错误检测

20. **幽灵杆**：Garmin 非推杆 <3 码；Arccos 老数据 <5 码多为真实短切，禁一刀切。须叠加：**剔除该杆后记分卡仍能配平才判幽灵**。约 1 码夹在两记正常杆中间的，另见逐洞校对技能（试杆误触）；删杆会重算上一杆 GPS，须用户确认。
20.1 **满挥杆远距离短飞（2026-08-25）**：满挥杆（Driver / 木 / 铁 / 铁木；按**展示杆名**判定，不含挖起杆和推杆，也不用可能脏的 `family` 字段），同时满足全部三条：
    1. 发球台，或起点离旗 ≥80 码；
    2. GPS 飞行距离 <20 码；
    3. 离旗几乎没靠近（起点离旗 − 终点离旗 <15 码）。
    则展示层将该杆距离/左右/中位/散点作废（`du=1`）。`should_ignore` 默认仍=0，洞分不动，杆号不改。不得用本条改 NOCLUB 推断。只有按 §20 删掉后记分卡仍配平，才考虑删杆——本条默认不删。§9 仍然成立：飞得短不改杆号。果岭边 8/9 铁十几码是真切滚（非发球台且起点离旗 <80）不杀。四站必须走同一函数同一键；只部署其中一站 = 没做完。未经用户当次批准不把本条写回 sqlite。
21. **重复记录**：同洞相邻杆时间戳/GPS/原始距离全同 → 副本隔离。
22. **漏杆致距离聚合**：单杆距离 ≥0.9×洞长且洞内杆数不足 → 疑似聚合；GPS 起止直线与 meters 一致性终裁。
23. **GPS 漂移**：>350 码或轨迹出场 → 距离作废（原值保留）。
24. **洞内杆数账**：非推杆+推杆 ≠ 总杆 → 全洞标记漏记/多记，距离类统计降权。

### F. 外部对账与置信

25. **外部锚**：比赛日总杆与 BlueGolf 官方成绩逐场对账；洞 par 用 `sum(par)=总杆−相对杆差` 自校验；不吻合如实报，禁止硬凑。
26. **置信分级**：high（多证据同向）直接落库；med 落库+复核标记；low/冲突 → unknown 进人工队列，附 AI 建议。一切推断写 `club_source`，`club_raw` 永不覆盖。  
    **§9 的 Par 4/5 开球 Driver 是用户锁定，不是低置信猜测。** 码数异常只加「短开球」标记，不把杆号退回 unknown 再让距离模型改成 9 木。
27. 规则变更后全量重跑 + 门禁 + 阴性对照。
28. **56°/60° 合并**：无传感器区分的场次不强行二选一；统计展示可合并为「56°/60° 挖起杆」。果岭边混用同此。

### G. 洞序重建与记分卡配平

29. **卡面推杆优先，禁碰巧配平**：库内推杆行为 0 而记分卡 putts>0 时必须合成推杆。严禁因「非推杆+罚杆==总杆」就把最后一根非推杆判为入洞。真假切进口诀：判入洞且卡面 putts==0 → 真切进（保护）；卡面 putts>0 仍判入洞 → 必假。
30. **去噪标记必须贯通下游**：ghost / 距离作废 / should_ignore 必须被洞序与计分消费。「标了但计分不认」= 合同缺口。
31. **先剔幽灵再配平；罚杆不转嫁**：拆不开就整洞 skip 并披露——宁 skip 勿假账。
32. **恒等式对 ≠ 归属对**：洞级配平只能保总账。凡 |单杆净杆|≥1.5 的非推杆逐条复核。
33. **第 1 杆状态 sanity**：首杆 to_pin 远短于洞长（<洞长 50%，或 par≥4 且 <120 码）→ 不得套发球台**状态**（中途开录）。这是状态机，**不是**把杆号改成短杆；杆号仍走 §9。
34. **洞长缺失禁用首杆 to_pin 代理**；从球场数据补，补不到按盲档披露。
35. **同杆连击不接近旗 = 冗余/漏杆嫌疑**。
36. **「改一推即可配平」不构成证据**；删几何自洽的杆来凑配平 = 造数，禁止。
37. **时代球包违规**：记录的杆不在当期名册 → 标 review，不直接采信。
38. **地理围栏证据**：可逆留痕（`corrections_log`）。
39. **极端值双向白名单**：真惨案 / 真切进必须保护。修复附「勿误杀清单」。
40. **修复验收三件套**：①目标案例修前/修后逐条对照；②勿误杀清单不变；③恒等式零 FAIL。缺一回炉。

---

## 11. 截图补标（本规则的下游用法）

给 Garmin 洞图补漏标时：

1. 只补「有码数、没有杆号」的标签。原厂已写的 `7i` / `SW` / `LW` / `6i` / `3w` 不动。
2. 杆号按**本文**判定，不按网页去噪结果盲从。
3. 格式跟 Garmin 原厂：`{短码} {码数} yds`（如 `D 246 yds`），短码：Driver=`D`，9 木=`9w`，沙杆=`SW`。
4. 只改本地副本，不改 Garmin 云端、不改 sqlite、不覆盖 Codex `final/` 原图，除非用户另说。

---

## 12. 相关路径（线索，不是第二真源）

| 用途 | 路径 |
|---|---|
| 本规则真源（云端，优先读） | https://tanya-denoise-rules.pages.dev/ 以及 `/rules.md` |
| 本规则真源（本机原稿） | `Grok/experience_outbox/Tanya高尔夫去噪规则.md` |
| 任务目录副本 | `8-24-Cursor/tanya_golf_denoise_rules_20260824/Tanya高尔夫去噪规则.md` |
| 库（只读） | `8-12/tanya_golf_denoise_20260813/01_build/tanya_arccos_v2.sqlite` |
| 旧手册（已被吸收） | `8-12/.../14_club_id_rules/球杆识别规则手册_v3.md` |
| 旧重清稿（已被吸收） | `8-12/.../16_rescore_rules/Tanya高尔夫重清规则_20260819.md` |
| NOCLUB 覆盖层 | `8-18-Cursor/tanya_golf_reclean_complete_20260820/overlay/noclub_remap.json` |
| Melissa 当场校对 | `Grok/experience_outbox/Arccos Garmin 逐洞校对.md` |

---

版本：v1 → v2 → v3（2026-08-14，规则 29–40）→ v4（2026-08-24）→ v4.1（2026-08-24 晚，§6 增补「审核后直接改底层」）→ **v5（2026-08-25，§20.1 满挥远距离短飞作废距离）**。  
写入：Cursor · Grok 4.6 · 2026-08-25。
