From cdb45c023b86898117a6bd2b83b24719dd68f5fd Mon Sep 17 00:00:00 2001 From: tei Date: Sat, 10 Oct 2026 16:17:16 +0900 Subject: [PATCH] docs: investigate STEP-110 R0 placement attribution --- ...R0_Placement跨段归因与缓存安全边界调查_v1.md | 116 ++++++++++++++++++ .../STEP-110_R0_Placement跨段归因只读调查_v1.md | 31 +++++ ...lacement跨段归因只读调查_Codex完成报告_v1.md | 42 +++++++ 粒子开发记录.md | 9 ++ 4 files changed, 198 insertions(+) create mode 100644 docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md create mode 100644 docs/50_Step记录/STEP-110_R0_Placement跨段归因只读调查_v1.md create mode 100644 docs/报告/STEP-110_R0_Placement跨段归因只读调查_Codex完成报告_v1.md diff --git a/docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md b/docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md new file mode 100644 index 000000000..9d8570add --- /dev/null +++ b/docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md @@ -0,0 +1,116 @@ +# R0 Placement 跨段归因与缓存安全边界调查 v1 + +**STEP-110,2026-10-10;状态:PARTIAL(只读调查,非修复验收)。** + +**执行记录**:Codex CLI 0.161.0 实际会话模型 gpt-6-astra,推理 high,完成源码和历史证据审查;其报告写入阶段重复无响应,故本报告由 GPT 指挥 RDC 根据 Codex 调查结论独立回读关键源码后落盘。未运行测试、编译、ADB,也未修改业务实现。所有源码行号以调查起点 particle/main 2df504c 为准。 + +## 1. 发行源码核对 + +| 来源 | Git 提交 | 实际意义 | +|---|---|---| +| V23 GSRL Source Lock | 87f3d1c59a52581fb8339f0ea7d106b9f4b94fef | RN / Android Native 13.6.1-particle.23 构建源码 | +| V23 Tag 剥离后提交 | a0a4787b4379ab2819943d20ce05a7ae760a88c3 | 构建提交之后的发行资料提交;注释 Tag 对象本身是 3ce42184… | +| 当前 particle/main 和 origin/particle/main 调查起点 | 2df504cdc0403bdad85d3f31f16fd54a8744abac | 包含后续 STEP-109 尚未发行的 FieldSnapshot 比较优化 | + +Codex 通过 Git Blob 对照确认:src/mln/renderer/render_orchestrator.cpp、renderer_impl.cpp、src/mln/text/placement.cpp、include/mln/renderer/render_segment.hpp、src/mln/renderer/retained_underlay_cache.cpp 和 particle_fast_path.hpp 在上述三个提交完全相同。此范围内 main 的分析适用于 V23;不能反推 STEP-109 优化已在 V23 APK 生效。 + +NavSea 输入冻结事实:Android 13 FZG1-2 V23,R0 [0,31) RETAINED 含地名 Symbol,C1 后续 82 层 CONTINUOUS。15.24 秒期间 placementChanged=true、R0 placementGatePassed=false、build/reuse=0、fallback/invalidation=453、fastPathHit Δ0、fastPathMiss Δ452,CPU 约 99%。**快照只能证实 Gate 未通过,不能证实 C1 引发 R0 Symbol 实际位置变化。** + +## 2. Q1:Placement 产生、传播、状态语义 + +1. src/mln/renderer/renderer.cpp:53-65:先尝试 tryRenderParticleFastFrame;未命中即创建 RenderTree、prepare、完整 render,再缓存 prepared tree。 +2. src/mln/renderer/render_orchestrator.cpp:737-749:逐个 RenderLayer.prepare,依据动态 needsPlacement() 构建 layersNeedPlacement。该集合与 R0 的结构性 placementCapable 不是一回事。 +3. 同文件 :758-773:反向遍历整个 RenderTree 的需要 Placement 的图层,CrossTileSymbolIndex.addLayer 汇聚 Tile/Symbol 变化。该过程是整图范围,不按 Segment 独立产生。 +4. 同文件 :775-810:在 Continuous 模式,placementChanged = !placementController.placementIsRecent(now, zoom, override)。为 true 才调用 Placement::create、placeLayers、setPlacement;否则 setPlacementStale。随后取全局 symbolFadeChange,调用 hasTransitions 控制 needsRepaint。它表示**本轮要重新 Placement**,不表示 R0 最终视觉结果必然不同;为 false 也不保证新旧 R0 内容相等。 +5. 同文件 :811-823:非 Continuous 模式还有每次非空 Symbol Layers 就重算的特殊路径,不应混同天气播放运行态。 +6. 同文件 :840-848:全局 Placement、layersNeedPlacement、symbolBucketsChanged 进入 RenderTree。Renderer 再独立判断各 Retained Segment。 + +src/mln/text/placement.cpp:45-59 CollisionGroups::get 在 crossSourceCollisions=false 时为不同 Source 创建隔离 collision group;开启时跨 Source Symbol 可以互相影响。**Source 不是 Segment**,同 Source 跨段仍存在相互影响,反之分段并不天然保证视觉隔离。 + +src/mln/text/placement.cpp:688-748 根据新旧 placed icon/text 更新 opacity 与 fadeStartTime;:1282、:1319 提供 symbolFadeChange / hasTransitions。shaders/symbol_sdf.vertex.glsl:153-158 和 shaders/symbol_text_and_icon.vertex.glsl:153-158 表明 alpha 依赖 symbol fade uniform。即使符号几何未变,透明度也可能变化。symbolFadeChange、placementTransitionActive 是全局时间/过渡量,不是 R0 独立验收结果。 + +Source layout/tile/visibility、Camera、Animation、Transition 均可能令 RenderTree prepare 或 Placement 状态变化;普通非 Symbol 粒子/颜色动画可以触发 repaint,但**不能单靠 repaint 来源判定 R0 新旧 placed 结果**。 + +## 3. Q2:R0 Cache Gate 的真实数据流 + +src/mln/renderer/renderer_impl.cpp:634-686 对每个 RETAINED Segment 分别取得: +- retainedRangeContentFingerprint / layerContentChanged; +- retainedSegmentSourceState 的 ready、stable、revision; +- 组合的 segmentContentRevision; +- retainedSegmentIsStable; +- retainedRangeHasPlacementCapableLayer 结构性 placementCapable; +- renderSegmentPlacementGatePassed 的结果。 + +**确切 Gate**:include/mln/renderer/render_segment.hpp:85-90 规定:无 Placement 能力的段直接放行 Placement Gate;否则必须同时满足 placementChanged=false、symbolFadeChange=0、placementTransitionActive=false。它读取的后三者是全局状态,不读取“事件由 C1 发起”或 R0 实际视觉等价证明。 + +src/mln/renderer/renderer_impl.cpp:661-686:Cache 支持还需要 Style/Sprite/global resources ready、Continuous 模式、没有 3D/debug、segmentStable、无 legacy/unsupported layer。Gate 失败可选择 static-placement 并传递给 cache.evaluate;:681-692 只有 Build/Reuse 才申请资源。:998-1028 先判断 global-live fallback,否则以 visitRenderSegmentExecution 顺序执行每段 composite/live,保持层序;actualExecution=live 不是证明 R0 Symbol 真变化,只表示本帧未从缓存 Composite。 + +src/mln/renderer/renderer_impl.cpp:590-630 还保留聚合的 retainedPlacementStable 和 Fast Path 支持判定,说明每段 Gate 局部化**不等于**整个 Fast Path 可局部化。 + +src/mln/renderer/retained_underlay_cache.cpp:85-105 将 camera/boundary、topology、content、tile、static-transition、static-placement 分别归类;:359-379 的 invalidate 更新 lastInvalidationReason,releaseResources 释放缓存,没有“每帧清零历史原因”的语义。因此早期快照当前 placementChanged=false 同时保留 lastInvalidationReason=static-placement **不是直接矛盾证据**;必须在同一帧比较 Gate、cacheSupported、decision、lastReason 的采样时序。 + +STEP-102/STEP-106 的作用边界是 **placement-free Retained 的局部复用**。本机原始 Android 保存日志 artifacts/maplibre-particle/step106-t2-fix/runtime-T2/stream.log 末尾 tick130:placementChanged=true、crossSourceCollisions=true,但两个 placementCapable=false 的 Retained 段显示 actual=composite、decision=reuse、build=1、reuse=3878;内部 Annotation Symbol 被放入后续 Continuous。T1 的 Symbol-bearing Retained 未解除保守回退。**历史验收未证明含地名 Symbol 的 R0 可复用。** + +## 4. Q3:七种反事实场景 + +| 场景 | Placement 事件来源能否定位 | R0 视觉是否可独立证明不变 | Reuse 必要安全条件 | V23 结论 | +|---|---|---|---|---| +| 1 R0 地名静态,C1 只更新非 Symbol 粒子/颜色 | 可按 Layer/Repaint 来源条件性追踪,Placement Controller 仍是全局 | 不能凭 C1 非 Symbol 就证明 | R0 Tile/layout/content/Camera、全部 Symbol placed/opacity/fade 与缓存时等价,无其他全局影响 | 无充分逐段证明;fail-closed | +| 2 C1 Symbol 改动,不同 Source、crossSourceCollisions 关闭 | Source mutation 可区分 | 隔离碰撞降低风险,但仍不能独立证明 R0 Fade/Camera/其他 Source 状态不变 | 确认 Source 独立、Collision group 隔离、R0 自身配置、Tile、Fade 和层序均稳定 | 仅全局 Gate;fail-closed | +| 3 C1 Symbol 改动且跨源碰撞开启 | 可以部分追踪事件 Source | **不能**;跨 Source Symbol 可能排斥 R0 地名 | 比较新旧全局 Collision 后 R0 每个文本/图标位置、显隐、Opacity、层序 | 无独立证明;fail-closed | +| 4 R0 Symbol layout/tile/visibility/zoom 改动 | 局部 revision/fingerprint 可见 | 默认不能 | 重新 Placement / Build 缓存后验证 R0 版本和绘制结果 | 失效正确;fail-closed | +| 5 Camera pan/zoom/rotation/pitch 改动 | Camera/signature/matrix 可识别 | 旧屏幕纹理通常不等价 | 新 Camera、projection、viewport 对应重新构建缓存并核对碰撞 | Camera/Boundary Gate;fail-closed | +| 6 Fade/Placement Transition 活跃或刚结束 | Controller 可观察过渡 | 不能由几何稳定推出 opacity 稳定 | 所有 R0 Symbol opacity/fade、Transition 与缓存时等价,且状态稳定 | 只有全局 Fade/Transition Gate;fail-closed | +| 7 C1 自动插入 Annotation Symbol | 验证场景的 Annotation layer 可追踪;NavSea 实际归段需运行证据 | 不能:跨段 Annotation 可能参与全局 Collision | 明确真实层序、Source/collision 关系,证明 R0 新旧 placed/fade 等价 | STEP-106 只覆盖 placement-free 段;fail-closed | + +重点:不同 Segment **不是** Collision 独立证据。仅识别“谁引起 Placement”并不足以让 R0 安全 Reuse;必须满足实际视觉、相机、图层顺序以及已缓存纹理的等价性。 + +## 5. Q4:Fast Path 的其他独立必要 Gate + +Renderer 的 Fast Path 在完整 RenderTree 之前尝试。src/mln/renderer/renderer_impl.cpp:590-630 的 Retained eligibility/单 C 支持是前置条件;src/mln/renderer/particle_fast_path.hpp 的 Fast Path 判定还检查 boundary、topology、staticStable、hasPlacementTransition、pending changes、nonparticle transition/repaint、fading tiles、是否 Particle repaint、still image、continuous mode、debug、unsupported continuous layer、supported scene、annotation mutation 等。 + +因此**R0 cache 有效是相关 Fast Path 的必要条件之一,绝不是充分条件**。当前 cache-invalid 说明首先在此受阻,不允许宣称修好 R0 就一定 hit,也不能在本 STEP 扩大调查到 C1 82 层所有性能开销或实施多 Continuous 优化。 + +## 6. 数据流 / 状态流 + +Host 更新 / Style / Source / Camera / 动画 +→ Renderer::update 尝试 Fast Path(未命中时) +→ RenderOrchestrator.createRenderTree +→ 全局 layer.prepare / needsPlacement / CrossTileIndex / PlacementController +→ 全局 placementChanged / symbolFadeChange / hasTransitions +→ 对各 Retained 段独立:Source ready/stable/revision + Fingerprint + structural placementCapable +→ placement-free 段绕开全局 Placement Gate;Symbol-bearing 段使用全局三项严格 Gate +→ Style/Resource/Camera/Revision 安全校验 +→ Cache Build / Reuse / Fallback +→ 保序 RenderSegment Composite / Live +→ Fast Path 另有单 C、pending、unsupported continuous 等 Gate。 + +## 7. 确定事实、假设、证据不足 + +| 确定事实 | 不能直接断言的假设 | 需要补的证据 | +|---|---|---| +| V23 核心 Placement/Cache 逻辑与当前 main 等价 | C1 变化直接导致 R0 视觉改变 | NavSea 同一帧事件来源、各 Source mutation、R0 全 Symbol 新旧结果 | +| placementChanged 是全局计算触发量 | placementChanged=true 意味 R0 所有地名改变 | per-R0 placed/opacity/fade 结果签名 | +| 含 Symbol 的 R0 使用 global conservative Gate | R0 453 次 fallback 是已证的性能 Bug | 既有语义被违反的状态不变量;当前并无证据 | +| T2 实验 placement-free 段重复复用 | 现有 T2 足以支持含 Symbol R0 | NavSea 实际 Source/Annotation/跨源碰撞和真实设备对照 | +| STEP-109 main 更改没有改 Gate | V23 已有 STEP-109 修复 | 需下一正式发行 GSRL 和设备验收(本 Step 禁止) | + +## 8. 必选结论矩阵 + +| 维度 | 明确判定 | +|---|---| +| Placement 事件来源能否定位 | **条件性可区分**(Source/Layer 可追踪,global Placement 本身不标 per-Segment 责任) | +| 能否证明 R0 视觉最终未变化 | **需扩展内部安全证据** | +| 现有 Gate 性质 | **正确的设计保守限制**,不是已证明违反 STEP-102 语义的 Bug | +| 缓存失效主要责任 | **多因素**:Native Placement 缺少 per-R0 结果证据 + Native 全局 Gate,受 Collision 语义和 Host Style/Annotation 组合影响 | +| 下一步 | **Native 内部诊断补强 → 安全判据设计 → 另行授权真机对照**;若改公共接口/Host,则交 Integration 协商 | + +## 9. 依赖顺序与最小后续验证 + +1. 在不影响生产安全和公开 API 的前提下,记录 placement 重算触发原因与时间,拆分 Source/Layer/Camera/Tile/transition 事件; +2. 设计 per-R0 Placement **结果等价安全证据**,至少包含 R0 Symbol placed IDs、位置、可见性、text/icon opacity/fade、Collision group、Tile/glyph/source 版本、Camera 和合成顺序;先审查其不变量; +3. 只有确证 R0 不受 C1 影响时,才另立有边界的 Native Gate 优化任务;不能先去掉 placementChanged; +4. 再调查 Fast Path 单 C / unsupported / pending 等 Gate;进行等条件 V23 与后续版本 CPU/Frame/Visual A-B; +5. 如需要 NavSea 配合改 Style/Annotation 或改公共 Contract/API,形成 Integration 阻塞请求,不在 STEP-110 擅自实施。 + +**调查状态:PARTIAL。** 已完成静态因果审计、源码版本对照和 STEP-106 历史证据核对;缺少生产 R0 per-Symbol 等价、事件逐帧对应和 CPU 因果实测。这是安全证据边界,不是“R0 已修好”“缓存已命中”“CPU 已下降”。 diff --git a/docs/50_Step记录/STEP-110_R0_Placement跨段归因只读调查_v1.md b/docs/50_Step记录/STEP-110_R0_Placement跨段归因只读调查_v1.md new file mode 100644 index 000000000..8d1f008d4 --- /dev/null +++ b/docs/50_Step记录/STEP-110_R0_Placement跨段归因只读调查_v1.md @@ -0,0 +1,31 @@ +# STEP-110 R0 Placement 跨段归因只读调查 v1 + +- 日期:2026-10-10 +- 状态:**PARTIAL(调查性质;非修复/性能 PASS)** +- 仓库:/Users/tei/dev/MapLibreParticleLab;分支 particle/main +- 调查起点 HEAD:2df504cdc0403bdad85d3f31f16fd54a8744abac +- V23 Source Lock:87f3d1c59a52581fb8339f0ea7d106b9f4b94fef;V23 tag peeled commit:a0a4787b4379ab2819943d20ce05a7ae760a88c3 +- Codex 实际模型:gpt-6-astra / high(CLI 启动日志确认),CLI 0.161.0;Codex 调查完成,文档交付会话多次卡住,之后由 RDC 整理、落盘并独立审查关键源码。 +- 主报告:docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md + +## 已完成 + +1. 读取 STEP-110 任务书、根 AGENTS/基线、项目总则,以及 STEP-088/089/090/092/094/099/100/102/106/108/109。 +2. 比较 V23 GSRL build Commit、Tag commit 和 main;核心六份 Renderer/Placement/Cache/Fast Path Git Blob 完全一致。 +3. 只读追踪 Renderer::update、RenderOrchestrator::createRenderTree、CrossTileSymbolIndex、PlacementController、RenderTree、per-segment Placement Gate、Retained Cache、Fast Path。 +4. 读取 STEP-106 本机既有 T1/T2 设备日志,确认 placement-free Retained 段复用,不推定含 Symbol R0 可复用。 +5. 回答 Q1–Q4、七个反事实场景、结论矩阵与风险优先级,并明示 cannot prove 的范围。 +6. 不涉及 Native/JS/Kotlin/测试代码修改;未运行测试、Jest、构建、Gradle、CMake、Bazel、ADB 或设备验证。 + +## PARTIAL 原因 + +- NavSea 生产 R0 逐 Symbol placement/fade/visibility 等价证据缺失;只读源码不足以证明 C1 的 Placement 变化完全不影响 R0。 +- 本次不允许插桩、修改 Core 算法、重测 NavSea 或新建安全机制。 +- 需要另行授权 Native 内部诊断/安全判据,再进行跨 Source 碰撞与真实 CPU/视觉 A-B。 +- 本地报告写入由 RDC 完成,不能误称 Codex 已直接交付文档。 + +## 结论及停手范围 + +R0 含地名 Symbol,V23 全局 Placement/Fade Gate 的保守失效与现有设计相容;**当前没有证据判定为既有不变量遭破坏的 Bug**。对 placement-free R 的 STEP-102 隔离已通过历史测试,不能直接解除 placement-bearing R0 的 Gate。 + +Git 收尾证据以 STEP-110 完成报告和最终 RDC Git 验收为准;禁止提交原来未跟踪的 STEP-110 任务书或其他无关文件。本任务无正式 Binary/Source Lock 发行。 diff --git a/docs/报告/STEP-110_R0_Placement跨段归因只读调查_Codex完成报告_v1.md b/docs/报告/STEP-110_R0_Placement跨段归因只读调查_Codex完成报告_v1.md new file mode 100644 index 000000000..226125002 --- /dev/null +++ b/docs/报告/STEP-110_R0_Placement跨段归因只读调查_Codex完成报告_v1.md @@ -0,0 +1,42 @@ +# STEP-110 R0 Placement 跨段归因只读调查 — Codex 调查 / RDC 收尾报告 v1 + +**2026-10-10|状态:PARTIAL(调查);Git 交付另行核验。** + +## 1. 真实执行边界 + +- Mac:Mac.lan,仓库 /Users/tei/dev/MapLibreParticleLab,分支 particle/main;起点 2df504cdc0403bdad85d3f31f16fd54a8744abac。 +- Codex CLI v0.161.0,实际启动输出确认模型 **gpt-6-astra**、推理 **high**,会话 01a12495-eb1a-78e3-ab8d-25554c6c207b。 +- Codex 完成只读调查与关键结论输出;但生成文档阶段两次长期无进展,由 RDC 终止并确认会话退出。因此**不能将 Codex 调查进程记为自然完成或将其声称为直接写出了文档**。 +- GPT 指挥 RDC 独立核查代码路径与 Git 状态、编写报告、Step 和追加开发记录,负责后续 scoped Git/Push 验收。 +- 原有未跟踪任务书 docs/40_任务/STEP-110_R0_Placement跨段归因只读调查_Codex任务_v1.md 保持原样、不提交。 +- 严守调查边界:没有编译、链接、测试、Jest、Gradle、ADB、设备操作;未修改 Native/JS/Kotlin、NavSea、Integration 或正式发行 Tag/Source Lock。 + +## 2. 任务项逐项验收 + +| 事项 | 状态 | 证据 / 限制 | +|---|---|---| +| 任务书与项目规定、既有 STEP 阅读 | 已完成 | Codex 会话逐项读取;本机原始日志和必要历史记录已交叉对照 | +| V23 Tag、构建源码、main 对照 | 已完成 | GSRL 源码 87f3d1c,Tag 提交 a0a4787,调查起点 2df504c;六份关键代码 Blob 一致 | +| Q1 Placement Controller/Collision/Transition | 已完成(源码调查) | 主报告第 2 章,文件、函数与行号;非 NavSea 实时归因实验 | +| Q2 per-segment Gate/Cache/Reason | 已完成(源码调查) | 主报告第 3 章;global gate 与 source-local revision 区分 | +| Q3 七种反事实场景安全判断 | 已完成(安全边界判定) | 主报告第 4 章;无法证明者明确 fail-closed | +| Q4 Fast Path 独立前置依赖 | 已完成(源码调查) | 主报告第 5 章;R0 缓存不是 Fast Path 充分条件 | +| STEP-106 T1/T2 历史验证重读 | 已完成 | 已保存设备 stream.log,仅用历史证据,不做新设备测试 | +| NavSea R0 per-Symbol 视觉等价 | **无法验证** | 无生产 Placement/Collision/Opacity 逐帧签名,不得静态猜测 | +| 真机 CPU 降低、R0 缓存命中 | **未完成(本 Step 禁止执行)** | 当前只有任务书提供的症状,不能声称改善 | +| Native Gate/公共 API 修改 | **未完成(本 Step 禁止)** | 本任务只读 | +| 任务文档及简短开发记录 | **已完成(RDC 补充落盘)** | 指定三份本 Step 报告/记录和开发记录追加 | +| scoped commit、普通 push、远端核验 | **以报告的 Git 收尾补记为准** | 首次 Mac 远端通信出现 DNS 解析异常,不允许提前宣称 Push PASS | + +## 3. 核心调查结论 + +现有 Source/Layer 事件可有条件地追踪,但 PlacementController 更新在整图语义下执行,V23 缺少可直接供 R0 复用的逐段视觉结果等价证明。跨 Source Collision 开启时,C1 Symbol 可能影响 R0 地名/图标;关闭时仍必须检查 Source 归属、Fade、Tile、Camera、层序。含 Symbol 的 R0 采用全局 Placement/Fade/Transition Gate 属于**正确保守限制**,目前未找到现有契约或不变量被违背的明确 Bug。 + +推荐顺序:Native 内部来源与逐段结果诊断 → 可证明安全的 Placement 等价判据 → 单独授权实现和 FZG1-2 对照 → 再审查 Fast Path 其他 Gate。不得先取消保护,也不在本任务更改 C-001/C-002。 + +## 4. Git 收尾字段 + +- 调查起点 branch:particle/main。 +- 调查起点 HEAD:2df504cdc0403bdad85d3f31f16fd54a8744abac。 +- 待提交路径:docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md、docs/50_Step记录/STEP-110_R0_Placement跨段归因只读调查_v1.md、docs/报告/STEP-110_R0_Placement跨段归因只读调查_Codex完成报告_v1.md、粒子开发记录.md。 +- Scoped commit / commit message / push result / remote branch / Final HEAD:**由后续 RDC 独立 Git 验证补记,不预填或虚报。** diff --git a/粒子开发记录.md b/粒子开发记录.md index c3a4924b2..cd6e08ff2 100644 --- a/粒子开发记录.md +++ b/粒子开发记录.md @@ -1108,3 +1108,12 @@ Android V3-08 单次综合验收已完成并关闭。Native `13.4.1-particle.2` - 对 Mac particle/main 正式 V23 源码只读核查发现:Particle 与 WeatherColor Renderer 对稳定的 Source T0/T1 仍可能在每帧执行 vector/valid 全数组比较;V21 FZG 热点仅作方向依据,不冒充 V23 实测。 - 在两个 Native Renderer 文件内保存与 GPU 资源对应的不可变 shared_ptr 快照身份;同一已验证快照用 O(1) 身份判断,新对象仍走严格数据/端点比较。未修改 RN API、RenderSegment Gate 或已发行 V23 产物。 - 本轮 git diff --check PASS;Mac Metal Core opt 编译触发 649 actions 大量重编译,主动中止且核验 Bazel PID 已退出,故编译 NOT COMPLETED / NOT PASS;Android/iOS 性能 A/B 尚未取得。阶段记录:docs/50_Step记录/STEP-109_V23_CPU_FieldSnapshot深比较快路_v1.md;报告:docs/报告/STEP-109_V23_CPU_FieldSnapshot深比较快路_RDC阶段报告_v1.md。 + + +### 2026-10-10 STEP-110 R0 Placement 跨段归因只读调查(PARTIAL) + +- 按 NavSea V23 R0 [0,31) 含 Symbol、C1 82 层、static-placement/fastPathMiss 问题,在 Mac particle/main 执行 Codex GPT-6 Astra High 只读调查。Codex 取证完成但文档阶段多次停滞,由 GPT/RDC 独立回读源码并完成三份报告和本记录。 +- V23 GSRL 构建源码 87f3d1c,Tag peeled commit a0a4787,调查起点 main 2df504c;Renderer/Placement/Cache/Fast Path 六份关键源码 Git Blob 三者一致,STEP-109 后续 FieldSnapshot 优化不是 V23 制品事实。 +- 结论:Placement 事件可条件性追源,但不能据此证明 R0 地名 Symbol 位置、显隐、碰撞与 Fade 不变;V23 对 placement-bearing R0 使用全局保守 Gate,与 STEP-102/106 对 placement-free Retained 局部复用的边界一致,**并未证明 Gate Bug**。STEP-106 T2 的两个 placement-free R 可在 global placementChanged=true 下复用,不适用于 R0 含地名 Symbol。 +- 下一步需先形成 per-R0 视觉等价证据与独立诊断,再考虑 Native 内部 Gate 优化;跨项目 API/Style 改动交 Integration。未编译、未运行测试/设备、未更改 Native 或交付发行,状态 PARTIAL。 +- 报告:docs/20_调查/R0_Placement跨段归因与缓存安全边界调查_v1.md;docs/50_Step记录/STEP-110_R0_Placement跨段归因只读调查_v1.md;docs/报告/STEP-110_R0_Placement跨段归因只读调查_Codex完成报告_v1.md。Git Commit/Push 状态以完成报告补记和 RDC 独立核验为准。