# 审计说明 — 策略 SoT / 资金门 / 自动兑 USDC（2026-07-30）

## 基线假设

1. **不会**在交易所人工开仓/平仓。  
2. **运行中不会**使用本系统「手动全平 / 手动开一组」（策略跑着时手动开仓本就 409）。  
3. 以策略主线为唯一真相源：盯仓 →（等待预览兑 USDC）→ 选约 → 定仓落库 → 兑 USDC → 资金门 fail-closed → 开仓 → 锁定出场。

## 结论（三轮严格审计后）

本轮按审计清单落地后：**P0 资金门 fail-open、热切 LIVE 护栏、等待写定仓打架、force 砸单、手动/自动双管道、持仓改参、下载备份带密钥** 已关闭或显著收敛。  
残留：币安 LIVE 余额仍未接入（现 fail-closed 拒绝开仓，需接余额或改手动本金）；SIM 资金重置仍默认进资金账户（需划转至交易账户才能开）；机内 zip 仍可能含 `.env`（仅 HTTP 下载已剥离）。

---

## 第一轮审计（改完即审 · 对照清单）

| 原发现 | 处置 | 证据 |
|--------|------|------|
| P0 资金门 fail-open | **已修** | `funds_gate_blocks`：仅双方 `is True` 放行；`None`/异常拦截。`open_pipeline.size_and_gate` + `engine`/`sim` 共用 |
| P0 热切 LIVE | **已修** | `put_runtime`：非默认 `AUTH_SECRET`；切 LIVE 强制 `running=0`/`paused` |
| P1 等待每 tick 写定仓 | **已修** | `prepare_okx_trading_usdc` / `preview_capacity_for_convert` 只预览；落库仅在 `size_and_gate` |
| P1 force 砸单 | **已修** | `force` 参数忽略，45s 冷却始终生效 |
| P1 容量 ask ≠ 选约腿 | **已修** | `assess_open_capacity(option_ask=…)`；`size_and_gate` 传入 `pick` 卖一 |
| P1 手动≠自动 | **已修** | `api/sim.py` 与引擎共用 `size_and_gate` |
| P1 持仓改出场/名义 | **已修** | `put_strategy_settings` 持仓禁止改 exit/qty/leverage/risk_* |
| P1 备份下载含 .env | **已修** | `materialize_download_zip` 剥离后下载 |
| P2 划转不清缓存 | **已修** | `funds.transfer` LIVE 后 `invalidate_live_balance_cache` |
| P2 SIM 弱占坑 | **已修** | `matcher.open_group` 拒绝全部 `BLOCKING_STATUSES` |

**第一轮残留：** 币安余额未接 → LIVE BN 将长期 `wait_funds`（刻意 fail-closed，非放行）。

---

## 第二轮审计（干扰/打架复查）

路径重读：`engine._tick_async` → `prepare_usdc_while_waiting` → pick → `size_and_gate` → LIVE `assert_safe` → `open_group`。

| 检查点 | 结果 |
|--------|------|
| 等待阶段是否写 `perp_qty_eth`/`net_profit_target` | 否（仅 preview assess） |
| 选约失败是否仍兑 USDC | 是（预览名义），不挡「无合格期权」文案分支 |
| 选约后资金门异常是否放行 | 否（`size_and_gate` 返回 ok=False） |
| 手动开仓是否仍 `except: pass` | 否（409 + detail） |
| 持仓 `exit_target` 与设置 | 设置被锁；盯盘用锁定目标（既有逻辑保留） |
| 自动兑与定仓顺序 | 定仓落库 → 兑 → 门；等待只有兑不落库 |

**第二轮新发现（已记残留，未扩 scope）：**

- SIM：`reset_from_equity` 仍进资金账户 → 交易账户空时正确 fail-closed，需手动划转（符合「只认交易账户」）。  
- `state()` 空仓仍 preview 覆盖展示字段名（展示层，不写库，不改出场执行）。

---

## 第三轮审计（实盘安全 + 回归）

| 检查 | 结果 |
|------|------|
| LIVE 开仓 claim/assert | 未改坏；仍在 `size_and_gate` 之后 |
| 冷启动 AUTH_SECRET | 保留；热切现对齐 pause + secret |
| 兑汇账户 | 交易账户；与手动 `/convert` 一致 |
| 单测 | `test_funds_gate` / `test_auto_usdc` / `test_exit_lock` / `test_risk_sizing` 通过 |
| 基线「无交易所人工开平」 | 文档化；代码不依赖该行为做对账放弃 |

**第三轮残留（接受或后续）：**

1. 币安 LIVE 余额未接线 → 开仓被拒直至接入或强制手动本金策略。  
2. 机内自动备份 zip 默认可含 `.env`（磁盘权限模型）；HTTP 下载已无密钥。  
3. LIVE 兑换/划转仍无二次口令（仅登录态）——运行中无人工操作为基线时风险降低。  
4. `localStorage` 长 token / XFF 登录限流等通用 Web 项未本轮改。

---

## 涉及文件

`strategy/open_pipeline.py`（新）· `open_capacity.py` · `auto_usdc.py` · `engine.py` · `api/sim.py` · `api/settings.py` · `api/funds.py` · `api/backup_routes.py` · `backup.py` · `sim/matcher.py` · `tests/test_funds_gate.py` · `tests/test_auto_usdc.py`

## 与上一份审计关系

承接 `审计说明-2026-07-29-开平仓与实盘安全.md`（开平仓 claim/recover）。本份专注 **策略 SoT 不打架 + 资金门/兑汇/热切 LIVE**。
