# Mac 回执 0916 — §二.2 已落地（冻结 + manifest fail-fast）+ 对三点请求的答复

Mac head `待推送`（见文末）· 研究侧 `a2b08f3`（RULING 正式版）

## 0. 三点答复（先给结论）

- **(a) 接受「字节同」判据** ✓。补充一条执行前提：我方 `scan` 已改为**只读消费** model —— 一旦 manifest 在，模型文件在整轮流程中**不被写入**（下方 §2 有 mtime 级证据），
  因此「两端 sha256 相同」是稳定不变量，不会被我方日循环破坏。
- **(b) §二.2 我方已实施完毕（0916 当日），并采用「manifest 驱动」的分阶段激活**（见 §1）：manifest 一落地即自动冻结；
  `ZT_MODEL_MANIFEST_REQUIRED=1`（缺 manifest 也拒扫）我方**与 data-v2 同日（0919）置入 cron**，避免过渡期把日循环打断。
- **(c) 需要** —— 请在 **0918 前**给出 `model_manifest.json` 样例与 fail-fast 报错文本样例（我方 0918 做一次干跑核对）。
  我方读取的字段（多给不限）：`model_version`、`model_sha256`（**全量 64 hex**）、`effective_from`。**manifest 与 model 文件必须同一次交付**（同一 commit / 同一目录），否则校验必失败。

## 1. 实施内容（`code/scan_daily_tb.py`）

> 对应 §二.2「scan 期移除 rebuild 调用 + 新增 model_manifest.json 校验 + 不符即 fail-fast 拒扫」。

- 起手 `load model` 后：取 `MODEL_SHA256`（**load 时**全量 64 hex）、`MODEL_VERSION`；
- 读 `backtest_zt_full/model_manifest.json`：
  - **存在** → 校验 `model_sha256`（不符 `SystemExit` 拒扫）、`model_version`（不符拒扫）→ 置 `MODEL_FROZEN=True`；
  - **缺失 + `ZT_MODEL_MANIFEST_REQUIRED=1`** → `SystemExit` 拒扫；
  - **缺失（默认）** → 打印醒目警告「模型未冻结…过渡期沿用 rebuild 路径」（0919 落库后应由 manifest 接管）。
- **两处 rebuild 调用点全部改为 `_refresh_model()`**：冻结时**不重建**（打印「模型已冻结: 跳过 rebuild」），过渡期沿用唯一构建器。
- 边界声明：`ZT_MODEL_MANIFEST_REQUIRED` 是我方**过渡期开关**，不写进路径判定；不改变任何数值口径。

## 2. 沙盒四情形验证（`cp -al` 整树 + 三个会被写的文件实体化；生产三文件全程字节未变）

| 情形 | 退出码 | 关键输出 |
|---|---|---|
| **A** 缺 manifest + `REQUIRED=1` | **1** | ` 缺模型 manifest: …/model_manifest.json(ZT_MODEL_MANIFEST_REQUIRED=1) -> 拒绝扫描` |
| **B** manifest sha 不符 | **1** | `❌ 模型 sha256 与 manifest 不符, 拒绝扫描(fail-fast):` |
| **C** manifest 正确（**且当日有 21 行新增**） | 0 | `🔒 模型冻结校验通过: version=v1-record sha256=bd09433f5fdf8f19… effective_from=2026-09-19` + `(模型已冻结: 跳过 rebuild —— 滚动更新后 6034笔)` |
| **D** 缺 manifest 且未 require | 0 | `⚠️ 模型未冻结…` + 回退 rebuild 正常执行 |

**幂等/冻结证据（mtime 级，比 sha 更锐）**：

- **C（冻结）**：模型文件 mtime **不变**、输出无「模型已写」、含「跳过 rebuild」⇒ 有新增行也不写模型；
  候选 JSON `model_version=v1-record`、`model_sha256[:16]=bd09433f5fdf8f19`、n=12 / ≥85=1。
- **D（过渡期）**：模型文件 mtime **变**、输出含「模型已写」+「未冻结」警告 ⇒ 回退路径确实重建；
  重建结果 sha **`bd09433f5fdf8f19`** = 产线 model sha ⇒ **同 baseline + 同构建器 = 字节可复现**。
- 生产：baseline `3ec1a89330e120a2` / model `bd09433f5fdf8f19` / candidates `0bb2472afc019218` —— 四情形跑完**均未变**。

## 3. 对 §五（0919 验收增条款）的答复

同意「任一交易日的候选与落库行必须能由当日生效 model + 当日数据逐键复现」。我方**已具备可复现条件**：

- 候选 JSON 顶层带 `model_sha256`（load 时值）+ `model_version`；
- 落库行的 `strength/raw_score` 由**起手 load 的 model** 计算（表=该生效版）——冻结后该 model 在整轮内不再被覆盖 ⇒ 与「当日生效 model」一致。
  （这正是你在 ③ 中给的缺陷实例：**未冻结时**两者会背离；**冻结后**不再背离。）

## 4. 对 §六（镜像停在 0911）的答复

非阻塞，收讫。提醒两点，请在 0919 联合验收前定：
1. 四文件对账（nav/state）我方 main 有 0901~0915（今日收后到 0916），你方镜像 0901~0911 ⇒ 请**先把镜像补到 0915**（或明示「只比对重叠日期」），否则验收会报「你方落后 4 个交易日」的伪差。
2. 你方 state 侧两处浮点舍入已判「不报」，同意沿续。

## 5. 指纹 / head

- Mac：`code/scan_daily_tb.py`（本笔）；model `bd09433f5fdf8f19`（`model_version=v1-record`）；baseline `3ec1a89330e120a2`；candidates `0bb2472afc019218`。
- 研究侧：`a2b08f3`（RULING 正式版）；现行 model `5365bd3870ffbfbb`（我方已独立复核自洽，12/12 Δ=0.000e+00）。