EXP-3D-CAJU-HEADROOM-V1 预注册协议(CAJU-V1 Gate 0)
0. 范围
- 本实验只做 CAJU-V1 的 Gate 0:在 Core B 现有引擎上,检验是否存在值得学习的更新动作差异,也就是"是否存在动态动作空间"。
- Gate 1(残差 + JEPA 特征 → 效用 MLP)有两个前提:Gate 0 通过,并且存在真正的 JEPA 预测表征。审计结论是
JEPA_FEATURE_STATUS=NOT_IMPLEMENTED(见jepa_feature_contract.md),所以本轮不可能检验或宣称 JEPA 的独立贡献。Gate 2(AC-JEPA)不执行。 - 锁定前没有读取任何 CAJU 片段的查询或历史视角真值,也没有计算任何动作效用。锁定前只运行了建根目录、几何封存(不读目标深度)、单元测试和一个根目录外的单片段排练(只看耗时和显存,不读真值)。
1. 审计结论(详见 code_audit.md)
- Core B 的 GPU 部分:V1 锁定的
ds_eval.py(sha25636b05c49…),参数为--model ZS --scale-max 0.1 --arms CACHE TTT --ttt-mult 1 --ttt-steps 100。 - CACHE:发布版 DepthSplat(re10k+dl3dv base,高斯尺度上限 0.1),输入 3 个上下文帧加 4 个流帧,测量的平面深度注入为最终的上下文深度。
- TTT:
- 优化对象只有高斯状态的增量:位置、每个高斯特征基内的逐轴对数尺度(旋转固定)、不透明度 logit、SH DC 和高阶 SH。网络权重冻结。
- 优化器为 Adam,eps 1e-15,每个片段新建。学习率是 3DGS 默认值 × 1。
- 损失 = 7 帧有效测量像素上原始渲染深度的相对 L1 + 0.5 × RGB L1。
- 损失出现非有限值时,状态回退到 CACHE。
- 读出:
- ray = depth_z / α / cos;
- F7 = α ≥ 0.5 处取 ray,其余取 R7;
- CORE_B = sqrt(R7 × F7),两者下限 1e-6。
- R7 = 7 帧测量深度的 1 像素 z-buffer 重投影取并集,再做冻结的调和填充。填充常数 2.3736 m,与 V3 相同。
- 旧接口:早期项目的
fuse_down/complete_down快权重写入只存在于旧的 carrier 模块,Core B 不经过它们。
2. 数据
- 来源:ARKitScenes Training 折,
outputs/EXP-3D-RGBD-ARKIT-DATA-V1/manifest_arkit_trainval.json。共 190 条记录,每条记录是一个场所(physical_scene_id),每条 16 帧。 - 划分:
- CAJU_PILOT:8 个 DEV 场所,16 个片段。只做工程检查,不进入任何正式统计。
- CAJU_SEL:16 个 TRAIN 场所,32 个片段。只用来选择最佳固定动作。
- CAJU_EVAL:34 个 TRAIN 场所,68 个片段。在这里测量 oracle headroom。
- 选择规则:182 个 TRAIN 场所 ID 排序后,用
random.Random(20261014)打乱。前 16 个归 SEL,接下来 34 个归 EVAL,其余 132 个不动,保留给可能的后续阶段。 - CAJU_COMPAT:V3 锁中的前两个 ARKIT_SYSTEM3 扫描(4 个片段)。只用于把本实验的引擎与 V3 已封存的 CACHE / TTT_m1 预测对比,不读真值。
- 历史暴露:
- TRAIN 场所曾用于训练逆向 JEPA 变体(JA、JC、JN、JK、JO,以及 502 扫描集合中的 JL / JOL)和 GA carrier。
- DEV 场所曾作为这些训练的开发监控(CTX 臂,cap 3.0)。
- 这些场所都没有用 Core B(发布权重,CACHE / TTT)评测过;发布版 DepthSplat 没有见过 ARKitScenes。
- 因此本实验数据属于训练/开发数据,不是 fresh test,也不声称独立外部验证。
- 受保护数据:受保护的 Hypersim final holdout 不打开,
FINAL_HOLDOUT_TOUCHED=false。
3. 片段
- 片段:每条记录 × 角色(A、B)。
- 帧的分工:
- 上下文:角色帧,A 为 0, 1, 2,B 为 0, 3, 4。
- 流:
stream_frame_ids,从空闲帧中均匀取 4 帧,两个角色共用,通常是 5, 8, 10, 13。 - 查询:
primary_query,即 14、15,晚于所有到达帧。 - 历史视角:流没有用到的空闲帧,通常是 6, 7, 9, 11, 12。它们从未被测量过,都位于第一个和最后一个流帧之间。
- 到达观测:7 帧(3 个上下文加 4 个流帧)的 RGB、测量深度和相机。查询和历史视角只提供相机,用来渲染预测。
- 控制器的信息边界:将来的控制器不能看到未来查询的相机,也不能看到任何未来的 RGB 或深度。
4. 动作(锁定)
| 动作 | TTT 步数 | 状态 |
|---|---|---|
| A0 OFF | 0 | CACHE 状态,不做优化 |
| A1 SHORT | 10 | 同一条 TTT 轨迹的第 10 步状态 |
| A2 FULL | 100 | 第 100 步状态,即 Core B |
- 同一起点:三个动作都从同一个 CACHE 状态出发。SHORT 是 FULL 轨迹的只读快照:快照只做 no-grad 渲染,不影响后续轨迹。
- TTT 不变:TTT 的数学与 V1 的
ds_eval.ttt逐行一致。 - 失败回退:损失非有限时按 V1 的规则回退到 CACHE。失败发生在第 10 步之前时,SHORT 和 FULL 都回退;之后只有 FULL 回退。
- 读出:所有动作都用冻结的 Core B 读出。
- 引擎检查:在试点阶段做,时间在锁定之后、正式回放之前。
- 在前 4 个 PILOT 片段上,用 V1 自己的
ttt独立运行 10 步和 100 步,各运行两次,得到运行间非确定性的底线。回放得到的 SHORT / FULL 与之相差,不得超过 2 × 底线 + 1e-6。 - CACHE 编码两次,检查编码器是否确定。
- 在 CAJU_COMPAT 上,把本引擎的 OFF / FULL 与 V3 封存的 CACHE / TTT_m1 比较。
- 效用层面,同样用 2 × 底线 + 1e-6 的标准检查。
- 检查失败时:在正式回放之前,以修订记录的形式修复。
5. 效用、成本与损害
- 损失与效用:
- 每个查询算 CORE_B 读出在有效真值像素上的 AbsRel。片段损失 L(a) 是两个查询的平均。
- 质量效用 U(a) = L(OFF) − L(a),所以 U(OFF) = 0。
- 成本 C(a):TTT 优化步数,分别为 0、10、100。另外报告 CUDA 同步后的实测秒数。GPU 是共享的,秒数有噪声,不进入任何判定。
- 损害 H(a):分两部分,单独报告。
- 历史视角:H_hist(a) = L_hist(a) − L_hist(OFF),即历史视角上 CORE_B AbsRel 的增加(> 0 为损害)。
- 已观测可靠区域:7 帧中 OFF 已经覆盖、并且归一化深度误差 ≤ 5% 的像素。报告这些像素的误差增量,以及被破坏的像素占比(不再覆盖,或误差超过 5%)。
- 净效用:目前没有可辩护的成本系数和损害系数,所以取 λ_c = λ_h = 0,主判定只用质量效用。成本用质量—计算 Pareto 曲线体现,损害单独报告。不做事后调权重。
- 统计单位:场所,每个场所一个扫描。场所值是两个角色片段的平均。
6. 策略
| 策略 | 定义 |
|---|---|
| FIX | 最佳固定动作:在 CAJU_SEL 上场所平均效用最高的动作,平局取更便宜的。选择结果写入 fixed_action_selection.json,记录哈希后才允许读 CAJU_EVAL 的真值。 |
| ORACLE | 逐片段 oracle:事后为每个片段选效用最高的动作(平局取更便宜的)。这是事后上界,不可部署。 |
| XORACLE(主判定) | 交叉查询 oracle:用一个查询的效用选动作,在另一个查询上评价,两个方向取平均。它去掉了"利用单个查询帧的特异性"带来的乐观偏差,更接近只看片段级信息的选择器能达到的上限。 |
| VORACLE | 场所 oracle:同一场所的两个角色用同一个动作(事后选择)。 |
| XROLE | 交叉角色:用一个角色的效用选动作,在另一个角色上评价。 |
| SUFFICIENT / XSUFFICIENT | 最省充分策略:在效用不低于 U(FIX) − 0.0005 的动作里选最便宜的。XSUFFICIENT 是交叉查询版本,用于计算节省分支。 |
7. Gate 0 判定(锁定)
主判定 QUALITY_HEADROOM_SUPPORTED:在 CAJU_EVAL 的场所上看 XORACLE − FIX,以下四条全部满足:
1. 均值 ≥ 0.0010 AbsRel。这是实用最小值:在真实数据上,Core B 读出中 FULL 相对 OFF 的全部收益约为 0.003,0.001 大约是它的三分之一。
2. 场所 bootstrap(项目统一实现,10,000 次,seed 20260928)的 95% CI 下界 > 0。
3. 每个留一场所均值都 > 0。
4. 正贡献中 top-1 场所的占比 ≤ 0.5。
计算节省分支 COMPUTE_HEADROOM_SUPPORTED:只在主判定不成立时检查,以下全部满足:
- FIX 有成本;
- XSUFFICIENT 的平均步数 ≤ FIX 步数的 50%;
- 质量损失 FIX − XSUFFICIENT 的均值 ≤ 0.0003,且 CI 上界 ≤ 0.0005;
- 没有任何成本 ≤ FIX 50% 的固定动作已经在 0.0005 以内。如果只有这一条不满足,记为 NOT_ESTABLISHED_FIXED_RULE_SUFFICES,意思是固定规则就能省计算,不需要学习。
其余情况:NOT_ESTABLISHED,输出 NO_USEFUL_DYNAMIC_ACTION_SPACE,停止 Utility MLP。
GATE1_ALLOWED:只有 Gate 0 通过、并且 JEPA 特征存在时才为 true。本轮 JEPA 特征不存在,所以无论 Gate 0 结果如何都是 false。如果 Gate 0 通过,只允许准备 non-JEPA 预测器(B2–B4),并给出最小 JEPA 特征提取器的设计和训练成本,由用户决定是否继续。
8. 必须报告的次要量(描述性)
- 动作选择:
- oracle 中各动作的使用频率,以及 XORACLE 的选择频率;
- OFF / SHORT / FULL 各自最优的片段比例;
- 有益 / 有害更新的比例(|U| > 0.0005);
- FULL 相对 SHORT 的边际收益。
- 成本:各动作的额外计算时间。
- 排序变化:排序不同于众数排序的片段比例,以及同一场所两个角色最佳动作相同的比例。
- 质量—计算 Pareto:固定动作及其随机混合,与逐片段 oracle 的前沿(同查询和交叉查询两种)比较,报告 5 / 10 / 25 / 50 / 100 步预算下的优势。
- 损害:历史视角损害和已观测可靠区域损害。
- 残差分组:按更新前残差(第 0 步的深度项)分三组。三分位点用 100 个正式片段算出,不涉及真值。报告每组内有益 / 中性 / 有害片段的分布。
- 特征相关性:若干更新前特征与效用的 Spearman 相关,只作描述。
- 图:图 1–5,依次是动作效用分布、oracle 对固定动作、Pareto、残差对效用、残差分组。Gate 1 的图不生成。
9. 信息契约与完整性(对应任务书第 13 节)
| 项 | 内容 | 检查方式 |
|---|---|---|
| 1 | 未来查询真值不进入任何动作 | 回放只读 7 个到达帧,每个片段审计所有打开的文件,封存中写明 query_depth_read=false |
| 2 | 未来查询真值不进入 JEPA 特征 | 没有 JEPA 特征 |
| 3 | 未来查询真值不进入预测器特征 | 更新前特征只来自 7 个到达帧(已审计) |
| 4 | 反事实分支来自同一初始状态 | OFF = CACHE;SHORT / FULL 是同一轨迹的第 10 / 100 步 |
| 5 | 各动作获得相同的到达观测 | 每个片段只编码一次 |
| 6 | OFF 保留正常缓存与融合 | OFF 是 7 视角 CACHE |
| 7 | R7 对所有动作相同 | 每个目标视角一个几何封存,所有动作共用 |
| 8 | TTT 只读到达帧 | 已审计 |
| 9 | 优化器状态不跨分支污染 | 每个片段新建 Adam;SHORT 是只读快照;与 V1 的独立运行做等价检查 |
| 10 | 扫描之间完整重置 | 每个片段重新编码,记录 CACHE 指纹 |
| 11 | 动作集合不随开发结果改变 | 动作集合在锁中 |
| 12 | opacity 阈值不随真值改变 | 阈值在锁中 |
| 13 | 同一场所的扫描不当作独立单位 | 统计单位是场所 |
| 14 | 部署时只执行所选动作 | Gate 0 不部署选择器,不适用 |
| 15 | 在线成本包含 JEPA 与 MLP | 本轮没有 JEPA / MLP,不适用 |
| 16 | 结果可由原始预测重建 | 打分从封存的 npz 重算;分析运行两次,逐字节一致 |
- 真值读取:只经过
TeacherAccess.query_depth读取,目的为 SEALED_QUERY_EVALUATION,并逐条记录。读取必须在该队列的所有封存完成之后。 - 测试:单元测试覆盖片段规则、选择、读出、效用、oracle、Pareto、判定分支、文件审计、锁和阶段顺序,结果写入
tests.json。
10. 计算预算
- 试点:16 个片段,加上 4 个片段的参考运行(10 + 10 + 100 + 100 步),再加 4 个 COMPAT 片段。在 GPU 4 上与其他进程共用,估计 0.5–1 小时。
- 正式:100 个片段,分 3 片。每个片段约 100 步 TTT 加 3 次读出,与其他进程分时,每片段约 2–3 分钟。合计约 1.5–2 小时墙钟、4–5 GPU 小时,每个进程显存约 6 GB。
- 限制:只用 GPU 4(
cv_gpu_run.sh --with-others);不做任何训练;不下载数据。
11. 执行顺序
- root
- geometry
- test
- rehearsal(根目录外,1 个片段)
- lock
- pilot(GPU)
- pilot-score
- formal(GPU)
- score:依次为 sel → eval → analyze(两次)→ finalize
12. 修订规则
- 锁定后的任何修改,都只能以
audit/amendment_N.json加本文件末尾追加的方式记录,并且必须发生在读取任何正式真值之前。 - 锁定时的文本必须始终是当前文件的精确前缀。
修订 1(2026-10-14,在正式回放之前,没有读取任何正式真值)
触发:试点中,预测层面的引擎检查有两项未通过(见 equivalence/equivalence_report.json):
- SHORT 快照与 V1 独立 10 步运行相比,单像素 depth_z 的最大差为 0.0033 m;阈值是 2 × 底线 + 1e-6,底线为 0.0014 m,阈值约 0.0029 m。
- CAJU_COMPAT 上,FULL 与 V3 封存的 TTT_m1 相比,单像素最大差为 0.353 m;阈值用的是 PILOT 场景的底线,2 × 0.145 m。
其余检查都通过了: - OFF 与 V1、与 V3 都逐位一致; - FULL 与独立运行的差异在底线以内; - 效用层面三个动作都在 2 × 底线 + 1e-6 以内,例如 FULL 回放对独立运行最大 1.1e-5,独立运行之间 7.8e-6。
诊断:见 audit/amendment_1/nondeterminism_diagnostic.py 及其输出 nondeterminism_diagnostic.json,不读任何真值。
- V1 的 TTT 在 GPU 上本身就不确定。同一进程中两次独立运行,10 步后像素差均值 1.2e-7 m、最大 1.4e-3 m;100 步后均值 4.8e-4 m、最大 0.145 m。
- 回放与独立运行之间的差异分布,和两次独立运行之间的差异分布相同:
| 动作 | 指标 | 回放对独立运行 | 独立运行对独立运行 |
|---|---|---|---|
| SHORT | 像素差均值 | 1.19e-7 | 1.18e-7 |
| SHORT | 像素差 p99 | 9.6e-7 | 1.2e-6 |
| FULL | 像素差均值 | 4.66e-4 | 4.75e-4 |
| FULL | 像素差 p99 | 6.5e-3 | 6.7e-3 |
| SHORT | Core B 读出相对差均值 | 3.9e-8 | 4.1e-8 |
| FULL | Core B 读出相对差均值 | 6.0e-5 | 6.0e-5 |
| - 原检查的问题:单像素最大值是极值统计,用一个极值去比另一个极值,本身很不稳定。COMPAT 的阈值又来自另外的场景,尺度不同。 | |||
| - COMPAT 的实际差异:FULL 与 V3 的 Core B 相对差均值 1.7e-4、p99 2.4e-3,与运行间的非确定性同一量级;OFF 与 V3 逐位一致。 |
决定:
- 引擎:不修改任何引擎代码。
- 检查结果:预测层面的单像素最大值检查如实记为未通过。能否进入正式回放,改为同时看两项:
1. 已预注册的效用层面检查,已全部通过;
2. 本诊断的分布比较:回放对独立运行的 Core B 读出相对差,均值和 p99 不超过两次独立运行之间的 1.5 倍,且 OFF 与 V3 逐位一致。也已通过。
- Gate 0 不变:数据、动作、效用、策略、阈值、分析全部不变。
- 非确定性的影响:运行间非确定性对单个片段效用的影响最多约 1e-5,比主判定阈值 0.001 和片段带宽 0.0005 小两个数量级以上,不可能制造或掩盖 headroom。
- caju_finalize.py:相应修改。完整性记录保留原始检查结果,加入本修订的分布检查;其余检查都通过时,状态记为 PASS_WITH_AMENDMENT_1。新的哈希记在 audit/amendment_1.json。
- 正式回放:自动链在检查失败后按设计停止。正式回放在本修订记录之后手动启动,命令就是锁定的 caju_jobs.sh formal。