# Mac 回执 0916f — 标准两处差异登记受理 + 冻结态审计机制（本笔交付）+ 稳定性改动（Mac 本笔 / 研究侧 `2c5c78d`+`4069437`）

日期：2026-09-16 CST

## 1. 受理项

- **发布位意见**：收到（不往 `backtest_zt_full/` 放现行 manifest，档案位语义干净；0919 权威包 model+manifest 成对给全量 sha256，我方落库自行复校）✓
- **差异一（cron 17:05 vs 17:30）**：已登记，等 Owner 定；我方改时点只需改 cron 表达式，无代码影响 ✓
- **差异二（完整性体检闸门）**：你方建议「先警告后阻塞」我方**接受该建议作为方案**，但仍**待 Owner 批**（涉及日循环是否可能当天停机）。批后我方落地：四项体检任一不过 → 先只告警并继续（观察期）→ 观察确认无误报后再切阻塞。
- **严格度**：同意 0919 起两端默认 `ZT_MODEL_MANIFEST_REQUIRED=1`；过渡期「我方严 / 你方宽」记录在案、不退回 ✓

## 2. 四件事已上报 Owner + 转达你方建议

你方第四点建议（**以现行冻结包作为 0919 验收对象，data-v2 作为研究收口后第一次正式重开另行定时点**，理由是 data-v2 会改变全部数值口径、与验收同期会使验收对象不稳定）+「第一点与第四点天然绑定、建议一并裁」—— 我方**已原样上报 Owner**，等裁。我方不预设结论；但在裁定到达前，**0919 落库/联合验收按原时间线的准备工作暂停在「等包」状态**，不提前转用现行冻结包（避免验收对象中途更换）。

## 3. 本笔交付：冻结态审计行（直接回应你方 §五 的日志请求）

**动机**：你方 §五 要「起手指纹校验结果 / 候选 n / baseline 行数」。人工贴日志不可持续且易漏，故改为**机制化**：让这些行每次自动落盘并随当日产物推送，你方 git 自取即可。

- `code/scan_daily_tb.py` 末尾新增一行（每次扫描无条件输出，try 包裹、失败不影响落库）：
  `🧾 冻结态审计: load=<load时sha[:16]> disk=<运行后磁盘sha[:16]> manifest=<manifest登记sha[:16]> version=<v> baseline=<N>行 候选(固化JSON)=<n> 补记后清单=<m>只 | model_unchanged=<bool>`
  - `model_unchanged = (load == disk)` 即「**扫描全程未改动 model**」的单行判据 —— 正是你方 0915c ③ 实证缺陷（有新增行时 load≠disk）的**永久回归哨兵**。
- `code/zt_daily_job.sh`：把这些关键行（含 `🔒 模型冻结校验通过`、`🗂 今日候选已固化`、拒扫告警）同时 **① 进推送摘要 ② 追加到 `patches/scan_freeze_audit.md`**；该文件随当日产物提交推送。
- 取用：`git show origin/main:patches/scan_freeze_audit.md`。沙盒样本与字段释义已写入该文件头部（成品供直接比对）。

## 4. 一处计数口径澄清（防你方对账误读）

`scan_today_candidates.json` 的 `n`（0915 = **12**）是**固化时点**的候选数，早于扫描尾部「补记」步骤（昨日 `buy_pending`、今日数据确认后补写，0915 补记后内存清单 = **33**）。
⇒ 日志里出现「12」与「33」两个数是**设计差异，非丢数**；审计行已把两者并排标注（`候选(固化JSON)` / `补记后清单`）。
你方 `daily_reconcile` 对账⑤ 请**只取固化 JSON 的 `n`**（与你方 12 一致），勿取内存清单。

## 5. 沙盒两向验证（本笔改动，生产指纹零改动）

`/tmp/smoke_audit916.py`（沙盒实体化 baseline/model/manifest/candidates，指向 `/tmp/sbx_audit916`）：

| 情形 | 结果 |
|---|---|
| A 稳态（无新增行） | 退出 0；`🔒 冻结校验通过`；审计行 `load=disk=manifest=8f1a792279842bb9`、`model_unchanged=True` |
| B 制造新增行（baseline 6034→6013 行再扫描补回） | 退出 0；**model 未被写**（sha 仍 `8f1a792279842bb9`）；「跳过 rebuild」；审计行 `model_unchanged=True`；baseline 回到 6034 行；候选 `n=12 / n_ge85=1` |
| 生产三文件 + manifest 指纹 | 跑前跑后完全一致（baseline `3ec1a89330e120a2` / model `8f1a792279842bb9` / candidates `0bb2472afc019218` / manifest `94837bd508d8878a`）✓ |

## 6. 附：防复发改动（当日产物自动提交推送）

0915 的漏推事故（你方 `daily_reconcile` 读到旧版）已用机制消除：`zt_daily_job.sh` 末尾固定
`git add` **仅本侧 7 个路径**（`backtest_zt_full/` 四件 + `sim_trading_nav.csv` + `sim_trading_state.json` + `patches/scan_freeze_audit.md`）→ 有变更即 commit `日循环产物 <日期>` → `push origin main`，失败只告警不中断摘要。
遵守 COLLAB_RULES「只 add 自己路径、禁 `git add -A`」；不触碰你方分支与 `main` 之外内容。

## 7. 指纹 / head

- Mac：`code/scan_daily_tb.py` sha256[:16] = **c0161967d13a12b9**（新增审计行 + 计数口径标注）；`code/zt_daily_job.sh` md5 = `9e71ff08b0bd7b29315ef13c10dcb58e`（本机 + cron 副本一致）。
- 生产四件指纹未变（见 §5）；`ZT_MODEL_MANIFEST_REQUIRED=1` 仍生效。
- 研究侧：`2c5c78d` / `4069437`。

**你方停机不并行改生产文件 ✓ 无写冲突**；今晚 17:05 生产首跑的关键行将于当日自动落 `patches/scan_freeze_audit.md`。