# Post Review

> 赛后复盘：获取比赛结果，对比推荐记录，计算命中率，分析失误原因，更新长期统计。在用户说「复盘」「昨天结果怎么样」「战绩」或每日09:30定时触发时使用。

- Skill: `philipbo/post-review` (Agent Skill)
- Install (CLI): `npx skillmds@latest add philipbo/post-review`
- Raw SKILL.md: https://api.skillmd.com/api/skills/philipbo/post-review/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: philipbo (https://skillmd.com/u/philipbo)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/philipbo/post-review

---


# 赛后复盘（post-review）

获取已完场比赛的结果，对比推荐记录，计算命中率，分析失误原因，更新长期统计。

## 输入

- 需要复盘的日期（默认：昨天）
- 当日推荐记录（从 memory 中读取）

## 执行步骤

### 步骤 1：读取推荐记录

从每日记忆中获取需要复盘的推荐。**若 `memory/{复盘日期}.md` 不存在**，视为无推荐记录，直接执行下方「如果没有找到推荐记录」的后续逻辑（告知龙王、写入 ## 赛后复盘、结束）。

```
memory_get memory/{复盘日期}.md
```

找到推荐部分：在 memory 文件中查找所有**二级标题**为以下之一的 section：

- `## 推荐`
- `## 推荐（*)`（\* 为时间，如 14:25）

**取文件中最后出现的一个**作为当日最终推荐。从该 section 内提取精选场次表、候补场次表、串关组合。

**区分精选场次和候补场次**：

- 精选场次：提取联赛、主队、客队、推荐内容、信心度、比赛ID
- 候补场次：同样提取，但标记为「候补」

**复盘主体 = 精选场次**（龙王实际投注的场次）。候补场次也做结果核对，但单独展示作为参考（"如果选了会怎样"），不计入主要命中率统计。

**补追待复盘场次**：检查前 3 天（{复盘日期-1} 到 {复盘日期-3}）的 memory 文件，如果其中有标记为「待复盘」的场次，一并纳入本次复盘。这些场次：

- 在复盘报告中标注为「补复盘（原推荐日期：{日期}）」
- 命中率计入原推荐日的统计；更新 MEMORY.md 累计值时合并入原推荐日贡献即可，**无需修改原日 memory 的 `## 赛后复盘`**
- 命中率和泊松 Top 6 校验正常计算

如果没有找到推荐记录（当日 + 待复盘均无）：

- 告知龙王「{日期}没有推荐记录，无需复盘」
- **仍须在 `memory/{复盘日期}.md` 中追加写入**（若文件不存在则创建）：
  ```
  ## 赛后复盘
  {日期} 无推荐记录，无需复盘。
  ```
  以便 Heartbeat 不再重复触发复盘补漏。
- 结束流程（不执行步骤 2–9，不更新 MEMORY.md）

### 步骤 2：获取比赛结果

从推荐记录中取出每场比赛的比赛 ID，逐场打开分析页获取最终比分：

```
agent-browser tab new https://zq.titan007.com/analysis/{matchId}cn.htm
agent-browser wait --load networkidle
agent-browser snapshot
→ 提取页面顶部的最终比分（完场后页面会显示比分）
agent-browser tab close
```

逐场获取，每场间隔 1-2 秒。

如果推荐记录中比赛 ID 丢失，退化到列表页方案：

```
agent-browser open https://jc.titan007.com/index.aspx
agent-browser wait --load networkidle
→ 如需查看昨日赛程，切换日期选择器
→ agent-browser snapshot 或 eval 提取已完场比赛的比分
```

### 步骤 3：逐场核对

对每场推荐的比赛：

1. **匹配比赛**：通过主客队名在赛果列表中找到对应比赛
2. **获取比分**：记录最终比分（如 2:1）
3. **判断命中**：

**胜平负**：

| 推荐类型               | 命中判断规则                                                                                                                                                         |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 固定 2 项（首选+次选） | 推荐为 首选 + 次选（如 平+胜、胜平/平负/胜负）。实际赛果命中**首选或次选任一**即算该场胜平负命中。赛果判定：主胜=主队进球>客队，平局=主队=客队，客胜=客队进球>主队。 |

**亚盘完整规则**：

设净胜球 = 主队进球 - 客队进球，盘口 H = 主队让球数（正值主让，负值主受让）。调整后净胜球 D = 净胜球 - H。

| 盘口类型     | 举例                | 上盘（让球方）赢 | 走水       | 下盘（受让方）赢 |
| ------------ | ------------------- | ---------------- | ---------- | ---------------- |
| 整数盘       | -1, 0, +1           | D > 0            | D = 0      | D < 0            |
| 半球盘       | -0.5, -1.5, +0.5    | D > 0            | 不可能走水 | D < 0            |
| 四分之一球盘 | -0.75, -1.25, +0.25 | D > 0（全赢）    | —          | D < 0（全输）    |
| ↑ 同上       | ↑                   | —                | —          | —                |

**四分之一球盘详细规则**（-0.75 = 半球/一球, -1.25 = 一球/球半, +0.25 = 平手/半球 等）：

- 将盘口拆为两注：H₁ = H - 0.25, H₂ = H + 0.25
- 分别按整数/半球盘规则判定两注的输赢
- **全赢**：两注都赢 → 命中
- **赢半**：一注赢 + 一注走水 → 命中（半），统计计 0.5 场命中
- **输半**：一注输 + 一注走水 → 未中（半），统计计 0.5 场未中
- **全输**：两注都输 → 未中

**大小球完整规则**：

设总进球 T = 主队进球 + 客队进球。

| 盘口类型     | 举例       | 大球赢                         | 走水     | 小球赢   |
| ------------ | ---------- | ------------------------------ | -------- | -------- |
| 半数盘       | 2.5, 3.5   | T > 盘口                       | 不可能   | T < 盘口 |
| 整数盘       | 2, 3       | T > 盘口                       | T = 盘口 | T < 盘口 |
| 四分之一数盘 | 2.25, 2.75 | 拆两注，规则同让球四分之一球盘 | —        | 同上     |

**大小球首选/次选（新口径）**：

- 若推荐记录中大小球写为「首选 …；次选 …」：
  - **严格命中（用于统计）**：只判定**首选**是否命中（次选不计入命中率分子分母，仅用于覆盖展示）。
  - **覆盖命中（用于风控评估）**：首选或次选任一命中则记为覆盖命中（可在逐场报告里单独写一行，不计入主命中率）。
- 若推荐记录中大小球仅有单一方向（旧记录）：按旧规则直接判定该方向命中即可。

4. **标记结果**：命中 / 未中 / 走水 / 赢半 / 输半

**走水和半赢半输场次的统计规则**：

- **走水**：不计入命中率（分子分母均排除），复盘报告中单独列出「⏸ 走水 N 场」
- **赢半**：分子 +0.5，分母 +1
- **输半**：分子 +0，分母 +1
- 命中率 = (全赢场次 + 赢半场次×0.5) / (总推荐 - 走水场次)

5. **组合推荐处理**：如果是组合推荐（如「主胜 + 大2.5球」），按玩法拆分分别判断命中，计入**各玩法命中率**（玩法类型：胜平负、亚盘、大小球、进球数；让球推荐计入亚盘）；但在"推荐场次"维度仍算 1 场，任一玩法命中即视为该场命中。**标注「⚠️ 观望」的玩法**：该场在该玩法上不计入推荐数、不计入命中数（分子分母均排除），与 recommendation 的「多玩法统计规则」一致。
6. **比分预测核对**：将实际比分与推荐比分对比（泊松相关比分最多 6 个）
   - 完全命中其中一个 → 标记 🎯 精准命中
   - 未命中但总进球数一致 → 标记「进球数正确」
   - 完全不中 → 标记「比分未中」

- 从当日 memory 读取「泊松比分简表」，只检查实际比分是否落在 Top 6 中；不再读取或要求完整 0:0～7:7 概率表。
- **两套比分增强**：若该场在 ## 深度分析 中存在「与大小球同方向 Top 3」——即当时有大小球 vs 泊松矛盾、存了两套比分——则分别检查实际比分是否命中「整体 Top 3」或「同方向 Top 3」，用于对比矛盾场次的方向选择。

7. **串关核对**：从当日 memory 读取串关组合建议，逐个组合判断
   - **2 串 1**：两场推荐都命中 → 串关命中；任一未中 → 串关未中
   - **3 串 1**：三场推荐全部命中 → 串关命中；任一未中 → 串关未中
   - 比分串关：两场比分都精准命中 → 串关命中
   - 混合串关（如 1 场比分 + 1 场胜平负）：各自按对应规则判断，全部命中才算串关命中
   - 记录每个组合的预期赔率和实际结果

### 步骤 3.5：分析质量自评（泊松模型质量）

用以下指标评估比分模型质量：

- **Top 6 命中**：实际比分是否出现在泊松比分简表 Top 6 中？
  - Top 4 命中 = 模型优秀
  - Top 5-6 命中 = 模型合理
  - Top 6 之外 = 模型偏差大，需检查 λ 值设定
- **λ 偏差方向**：实际总进球 vs 预期总进球（λ1+λ2），判断 λ 是系统性偏高还是偏低
- **两套比分场次**：若该场深度分析中存在「与大小球同方向 Top 3」，在逐场输出中写「整体 Top3 命中/未中；同方向 Top3 命中/未中」，便于长期对比两套策略

### 步骤 4：分析复盘（逐场，不只看未命中）

对步骤 2 提取的**每一场精选场次**（及待复盘场次），从 memory 中读取该场的深度分析摘要：

- **定位方式**：在 `## 深度分析` 中按该场 **matchId**（摘要块内含 `比赛ID: {matchId}`）或 **联赛 + 主队 + 客队** 匹配到对应的 `### {联赛} {主队} vs {客队}（...）` 摘要块，再读取其下「综合评估」「泊松比分简表」等子块。若某场在 ## 深度分析 中无对应块（如补复盘且原日未存摘要），该场 4a 中泊松锚定等写「无摘要」或省略。

```
memory_get memory/{复盘日期}.md
```

**4a. 关键判断回顾（每场都做）**

回顾深度分析第 8 步的「关键点/疑点/矛盾」，逐一与实际结果对照：

- 当时识别的**矛盾信号**——实际结果支持了哪一方？
  - 例：「亚盘看好主队但欧指偏向平局」→ 实际结果是平局 → 欧指信号更准
- 当时标注的**风险点**——有没有真的发生？
  - 例：「轮换风险」→ 确实轮换了 3 名主力，导致进攻乏力
- 当时的**核心判断依据**——赛后来看是否成立？
  - 例：「看好主胜的核心依据是主场 5 连胜」→ 但对手近 5 场客场 4 胜 1 平，均值回归更该看客队
- **RLM 信号**——逆向线路移动最终指向了正确方向吗？
- **泊松方向校验**：从该场深度分析摘要读取「大小球 vs 泊松比分」或其他方向矛盾。结合赛果注明：当时泊松方向、盘赔方向、推荐方向分别是什么，实际结果支持哪一侧；不再复盘 EV。
- **大小球盘口锚定（A 方案）**（若摘要中有）：从该场深度分析摘要的「泊松比分简表」头两行读取 `大小球盘口锚定 = 启用/未启用（w=0.25, line=..., λtot: X→Y）`。逐场报告中必须带一行，便于长期评估锚定是否在“帮忙还是拖后腿”：
  - 启用：记录 line（含 2.25→2.5 / 2.75→3.0 的近似结果）、锚定前后 λtot 变化（Δλtot=Y−X）
  - 未启用：写「未启用」
  - 若摘要缺失该字段（旧格式）则写「无记录（旧摘要）」并不计入锚定统计

输出：每场 2-3 句话的判断回顾。

**4b. 失误分析（仅未命中场次）**

对未命中的场次，深入分析失误原因：

- 哪个维度的判断与实际不符？
- 是信息不足还是判断逻辑有误？
- 是否有赛前未预见的因素（红牌、伤退、天气等）？
- 泊松 λ 值是偏高还是偏低？偏了多少？

**4c. 经验教训提炼（每次复盘必做）**

从本日所有场次（命中 + 未中）中，提炼**可复用的教训**。不是就事论事，而是找到可以指导未来分析的规律：

格式：

```
💡 教训：{一句话概括}
   来源：{联赛} {主队} vs {客队}（{命中/未中}）
   详情：{具体发现}
   行动：{未来遇到类似情况怎么做}
```

**好教训的标准**：

- 可泛化（不只对这一场有用，对同类型比赛都有参考价值）
- 可行动（明确告诉未来分析时该怎么调整）
- 有数据支撑（不是"运气不好"这种无意义的总结）

示例：

```
💡 教训：盘赔分歧时欧指比亚盘更可靠
   来源：[英超] 热刺 vs 利物浦（未中）
  详情：亚盘看好热刺让球（历史用词：亚盘方向），但欧指和平博都偏向客胜。最终选了亚盘方向，实际客胜。
   行动：欧指与亚盘方向矛盾时，优先信任欧指（尤其平博方向），亚盘可能受注码影响失真。

💡 教训：赛程陷阱信号在豪门 vs 弱旅局中有效率极高
   来源：[西甲] 皇马 vs 赫塔菲（命中）
   详情：皇马下一场欧冠半决赛，本场果然精神松懈，只赢 1:0，低于预期。
   行动：继续给「⚡ 赛程陷阱」标记高权重，豪门 vs 弱旅 + 下场有大赛 = 小球 + 低比分是大概率。
```

将有价值的教训写入 MEMORY.md 的「关键教训」部分。**不是每天都有新教训**——如果今天没有新发现，不硬写。但如果有，一定要记下来。

### 步骤 4.5：反事实分析

对每场推荐做"如果反着买会怎样"的回顾，帮助识别系统性偏差：

- **推荐主胜但实际客胜/平局**：如果反着买（客胜/平局），赔率是多少？盈利几何？
- **推荐大球但实际小球**：反向操作收益如何？
- **比分未中**：实际比分是否不在泊松 Top 6 中？λ 值是否明显偏高或偏低？

输出格式：

```
🔄 反事实分析：
- {比赛1}：推荐{推荐} → 实际{结果}。反向操作赔率 {X.XX}，{反思}
- {比赛2}：...
```

关注的模式：

- 如果连续多天反着买都能中 → 存在系统性方向偏差，需要在策略调优中记录
- 如果实际比分持续不在泊松 Top 6 内 → λ 值估算可能系统性偏高或偏低

### 步骤 5：计算统计

**当日统计**：

- 推荐场次数（含赢半/输半各计 1 场）
- 命中场次数（全赢计 1，赢半计 0.5）
- 走水场次数（不计入命中率）
- 命中率 = (全赢 + 赢半×0.5) / (总推荐 - 走水)（与步骤 3 公式一致）
- 大小球盘口锚定（A 方案）效果统计（仅统计有记录的场次；旧摘要缺字段的不计入）：
  - 启用锚定场次：N 场；未启用：M 场
  - **大小球严格命中率对比（首选）**：启用组 {XX%} vs 未启用组 {XX%}
  - **λtot 误差对比**（可选，若你在逐场里已计算）：启用组平均 |(实际总进球)-(锚定后 λtot)| vs 未启用组平均 |(实际总进球)-(原 λtot)|

**更新累计统计**：

先读取 MEMORY.md 中的现有统计：

```
memory_get MEMORY.md
```

更新（与 MEMORY.md 结构一致）：

- **累计战绩 · 总**：总推荐 += 当日推荐数，总命中 += 当日命中数，累计命中率 = 总命中 / 总推荐
- **累计战绩 · 各联赛**：按联赛维度累加推荐数、命中数，更新该表（新出现的联赛自动增加一行）；命中率 = 该联赛命中数 / 该联赛推荐数
- **比分预测统计 · 总**：精准命中数、进球数正确数、精准率、泊松模型质量
- **比分预测统计 · 各联赛**：按联赛维度累加精准命中、进球数正确、推荐场次，更新该表（新联赛自动增加一行）；精准率 = 该联赛精准命中 / 该联赛推荐场次
- **各玩法命中率**：按玩法类型累加，玩法为 **胜平负、亚盘、大小球、进球数** 四类（让球推荐计入亚盘）；更新表格中对应行的推荐数、命中数、命中率
- 泊松模型质量：Top 4 命中率、Top 6 命中率、λ 偏差方向
- 串关统计：推荐组合数、命中组合数、按串关类型分（2串1/3串1/比分串/混合串）
- 反事实偏差监测：是否存在连续反向命中趋势

### 步骤 6：策略复盘（当累计数据 >= 20 场时）

当累计推荐达到 20 场以上，额外做一次策略复盘：

- 哪个联赛命中率最高/最低？
- 哪个玩法命中率最高/最低？
- 高信心度推荐的命中率 vs 中信心度的命中率？
- 是否需要调整策略？（如「英冠命中率持续低于 40%，建议降低英冠场次的优先级」）

将策略复盘结论写入 MEMORY.md 的「策略调优记录」部分。

### 步骤 7：生成复盘报告

```
📋 {日期} 复盘报告

✅ 命中：
  - [{联赛}] {主队} {比分} {客队} | 推荐：{推荐内容} → ✅ 命中
    🔗 https://zq.titan007.com/analysis/{matchId}cn.htm
    比分预测：{比分1} / {比分2} / {比分3} / {比分4} → {🎯精准/进球数正确/未中}
    {若大小球有首选/次选：大小球覆盖：{✅覆盖命中/❌覆盖未中}（首选：{✅/❌/走水/赢半/输半}；次选：{✅/❌/走水/赢半/输半}；统计仅算首选）}
    泊松 Top6：{命中/未中}（如命中：{比分} {概率}%）
    {若该场有两套比分，多一行：整体Top3 {命中/未中}；同方向Top3 {命中/未中}}
    OU锚定：{启用/未启用}（line {X}，λtot {X.XX}→{Y.YY}，Δ{+/-X.XX}；w=0.25）{或 无记录（旧摘要）}
    关键判断回顾：{当时的矛盾/风险信号与实际结果的对照}

❌ 未中：
  - [{联赛}] {主队} {比分} {客队} | 推荐：{推荐内容} → ❌ 未中
    🔗 https://zq.titan007.com/analysis/{matchId}cn.htm
    比分预测：{比分1} / {比分2} / {比分3} / {比分4} → {🎯精准/进球数正确/未中}
    {若大小球有首选/次选：大小球覆盖：{✅覆盖命中/❌覆盖未中}（首选：{✅/❌/走水/赢半/输半}；次选：{✅/❌/走水/赢半/输半}；统计仅算首选）}
    泊松 Top6：{命中/未中}（如命中：{比分} {概率}%）
    {若该场有两套比分，多一行：整体Top3 {命中/未中}；同方向Top3 {命中/未中}}
    OU锚定：{启用/未启用}（line {X}，λtot {X.XX}→{Y.YY}，Δ{+/-X.XX}；w=0.25）{或 无记录（旧摘要）}
    关键判断回顾：{当时的矛盾/风险信号与实际结果的对照}
    失误分析：{哪个环节判断错误、为什么错}

🔄 反事实分析：
  - {比赛1}：推荐{推荐} → 实际{结果}。反向赔率 {X.XX}，{反思}
  - ...

💡 今日教训：
  - {教训1：一句话概括} → 行动：{未来怎么做}
  - {教训2}（如有）
  - （无新发现则写「今日无新教训」）

📈 当日战绩：推荐 {N} 场，命中 {N} 场，命中率 {XX}%
📈 比分预测：精准命中 {N} 场，进球数正确 {N} 场
📈 泊松模型质量：Top 4 命中 {N}/{总N}，Top 6 命中 {N}/{总N}，λ 偏差 {偏高/偏低/正常}
📈 OU锚定效果（大小球盘口锚定，A方案）：启用 {N} 场 / 未启用 {M} 场；大小球严格命中率 启用 {XX%} vs 未启用 {XX%}
📈 串关复盘：
  - 组合A（2串1）：{场次1} + {场次2} → {✅全中/❌场次X未中}（预期赔率 {XX}）
  - 组合B（...）：...
📈 累计战绩：推荐 {N} 场，命中 {N} 场，命中率 {XX}%
📈 累计比分：精准命中 {N}/{总N}（{XX}%），Top 6 命中 {N}/{总N}
📈 累计串关：推荐 {N} 组，命中 {N} 组（{XX}%）
```

如果有策略复盘结论，追加：

```
🔧 策略观察：
  - {结论1}
  - {结论2}
```

### 步骤 8：写入记忆

**每日记忆**：将复盘报告写入 `memory/{复盘日期}.md`：

- 若该文件中**已存在** `## 赛后复盘` section → **替换**该 section 的内容为本次复盘报告（同一复盘日只保留最新一次结果，不追加第二段）
- 若不存在 → 在文件末尾**追加**上述 section 及内容

```
## 赛后复盘

{完整复盘报告}

### 样本数据（结构化，供后续程序抽取）

> 仅记录“已在本次复盘中计算/展示过”的关键字段，不新增抓取步骤。

| matchId | 联赛 | 主队 vs 客队 | 比分 | 胜平负命中(首/次任一) | 亚盘命中 | 大小球严格(首选) | 大小球覆盖(首或次) | 比分命中 | 泊松Top6 | 两套比分命中(如有) | OU锚定(启用/未启用/无记录) | λtot(原→锚定后，如有) |
| ------ | ---- | ----------- | ---- | --------------------- | -------- | --------------- | ------------------ | -------- | --------- | ------------------ | -------------------------- | --------------------- |
| {matchId} | {联赛} | {主队} vs {客队} | {X:X} | {✅/❌} | {✅/❌/走水/赢半/输半/观望} | {✅/❌/走水/赢半/输半/观望} | {✅/❌/—} | {🎯/进球数正确/未中} | {✅/❌} | {整体Top3✅/❌；同方向Top3✅/❌/—} | {启用/未启用/无记录} | {X.XX→Y.YY/—} |
```

**长期记忆**：更新 `MEMORY.md`（与 MEMORY 中「累计战绩」「比分预测统计」「各玩法命中率」结构一致）：

- **累计战绩**：总数字 +「各联赛」表（按联赛累加，新联赛加行）
- **比分预测统计**：总数字 +「各联赛」表（按联赛累加，新联赛加行）
- **各玩法命中率**：胜平负、亚盘、大小球、进球数 四类表格（让球计入亚盘）
- 串关、泊松质量等其余统计项
- 如有新的策略结论，追加到「策略调优记录」
- 如有新的教训，追加到「关键教训」

注意 MEMORY.md 维护规则：

- **策略调优记录**：不允许重复。新策略与已有条目主题相同时，合并更新原条目（补充新数据/案例、修正结论），不另起一条
- **关键教训**：不允许重复。新教训与已有条目主题相同时，合并更新原条目（追加验证案例、强化或修正结论），不另起一条

### 步骤 9：推送

通过 messaging 工具将复盘报告推送给龙王。

## 特殊场景

### 比赛未全部完场

如果部分推荐比赛尚未完场（如凌晨场次）：

- 先复盘已完场的
- 标记未完场的为「待复盘」，写入当日 memory：若该日 memory 中**已存在** `### 待复盘` 子块 → **替换**该子块内容为本次待复盘表格；若不存在 → 在 `## 赛后复盘` 下追加该子块。格式如下：

```
### 待复盘

| 比赛 | 比赛ID | 推荐 | 原因 |
| ---- | ------ | ---- | ---- |
| {主队} vs {客队} | {matchId} | {推荐内容} | 比赛未完场 |
```

- **补追机制**：后续每次复盘时，步骤 1 会自动检查前 3 天的「待复盘」场次并补上。超过 3 天仍未完场的（推迟/取消），按「取消」处理，将「待复盘」改为「已取消」

### 比赛取消/推迟

- 标记为「取消」或「延期」
- 不计入命中率统计

### 首次复盘（无历史数据）

- 正常计算当日统计
- 累计统计 = 当日统计
- 跳过策略复盘（数据不足）

## 输出

复盘报告（文本格式），已推送或已写入记忆。MEMORY.md 已更新。

