18 KiB
CM95 S-52 剩余 26 个根因统一修复 Codex 任务 v1
1. 任务性质
这是一次 统一修复任务,不是新的审计任务,也不是继续拆成多个独立 Codex 任务。
当前已完成:
- OpenCPN Code-First S-52 等价审计;
- 206 条 branch 审计;
- 120 FAIL / 86 NOT_PROVEN;
- 120 FAIL 已归并为 38 个 Root Cause;
- Batch 1 已修复并提交 12 个低风险局部根因:
- RC-012
- RC-022
- RC-023
- RC-024
- RC-025
- RC-026
- RC-029
- RC-030
- RC-031
- RC-032
- RC-034
- RC-035
- Batch 1 提交:
f3047a3f06d2eac3f603dcb54646a60fdead2354fix: align local S-52 CSP decisions with OpenCPN
本任务必须在 同一次 Codex 工作流程中 继续处理剩余 26 个根因:
- 25 个已确认代码根因;
- 1 个证据不足根因 RC-021。
不得把本任务退化为“只写规划”“只写报告”“只修一两个 RC 后停止”。
2. 仓库与固定基线
仓库:
/root/sourceserver/cm95
分支:
main
本任务开始基线至少应包含:
f3047a3f06d2eac3f603dcb54646a60fdead2354
OpenCPN 固定参考:
docs/外部参考/OpenCPN源码基线_f7211b4e/
OpenCPN commit:
f7211b4e1874c453e37a7f190aa191c55a25c32e
主要审计输入:
docs/报告/CM95_S52_OpenCPN渲染流程对照审计报告_v2.mddocs/CM95_S52_语义守恒与运行时能力审计标准_v2.mdbuild/audits/cm95_s52_opencpn_code_first_equivalence_v2.json
当前 Production Plan ID:
57e72826db1d3e3e69f0b3b084bef4fb9469b5edc47dc0030fc2ec3e46adecf9
当前正式 release:
cm95-d1-62a85bd40d3a-57e72826db1d
3. 最高优先级约束
- OpenCPN 固定源码是 Source of Truth。
- 修的是 完整 Rule Chain 等价性,不是只让画面“看起来接近”。
- 不得通过删除审计、放宽 Gate、改 FAIL 定义、跳过分支来获得 PASS。
- 不得把 PREVIEW_ONLY 直接改成 IMPLEMENTED,除非对应 runtime consumer 确实完成并有可执行 witness。
- 不得为了 DANGER53 发明 OpenCPN 中不存在的图形资源。
- 不得修改与本任务无关的数据库/importer/Linux 环境文件。
- 当前工作区已有无关未提交修改,必须在开始前记录 SHA-256,并在每个阶段结束后确认未变化。
- 不得使用
git add .。 - 所有阶段必须显式 stage 任务相关文件。
- 无法证明时保守保留 FAIL / NOT_PROVEN,不允许猜测。
- 截图只可作为最终视觉回归,不得作为主要逻辑验收依据。
- 不要每修一个小点就做一次完整 5064 PBF 重扫;需要全量重建/重扫时集中到最终集成阶段一次完成。
4. 剩余 26 个 Root Cause
RC-001
Python hazard resolvers return incomplete ordered nested instruction chains
- Layer: NESTED_CSP_CHAIN
- Risk: MEDIUM
- 影响约 49 FAIL
- 目标:
- OBSTRN04/WRECKS02 恢复完整有序 nested suffix;
- QUAPNT01;
- OBJNAM TX;
- SOUNDG;
- WRECKS tail;
- 正确顺序守恒。
- 注意:Wk TX / WRECKS07 的 Python 生成能力已存在,不要重复归因。
RC-002
Scalar presentation hints do not preserve the executable mixed-opcode chain
- Layer: INSTRUCTION_IR
- Risk: HIGH
- 影响约 20 FAIL
- 目标:
- 建立可执行、有序、带参数的 Rule Chain / Runtime Rule IR;
- 不能继续只依赖 first-per-kind scalar hints;
- initial Lookup + CSP composition 必须守恒;
- Web/runtime 可消费该 IR。
RC-003
Point hazard runtime emits one main symbol and depth text instead of the full chain
- Layer: RUNTIME_EXECUTOR
- Risk: HIGH
- 影响约 26 FAIL
- 目标:
- Point hazard 执行完整 ordered chain;
- 不再只执行一个 SY + 普通 depth text;
- 支持 TX、nested Q、Wk/WRECKS07 等。
RC-004
Hazard runtime rejects line and area geometries before portrayal
- Layer: RUNTIME_EXECUTOR
- Risk: HIGH
- 影响约 23 FAIL
- 目标:
- hazard runtime 支持 Point / Line / Area;
- LS / LC / AC / AP / SY / TX / SOUNDG 按顺序执行。
RC-005
Style compiler executes only the first LS despite a preserved line sequence
- Layer: STYLE_COMPILER
- Risk: MEDIUM
- 影响约 1 FAIL
- 目标:
- 多 LS 顺序执行;
- QUALIN radar double-line 等组合不得丢失。
RC-006
LS style translation collapses DOTT to a solid stroke
- Layer: STYLE_COMPILER
- Risk: MEDIUM
- 影响约 10 FAIL
- 目标:
- SOLD / DASH / DOTT 语义分离;
- 不能把 DOTT 退化成 solid。
RC-007
SOUNDG runtime substitutes ordinary text for the ordered sounding glyph renderer
- Layer: RUNTIME_EXECUTOR
- Risk: HIGH
- 影响约 34 FAIL
- 目标:
- 实现真正 SOUNDG glyph composition;
- 支持 digit glyph、fraction/depth placement、quality/swept marks;
- standalone SOUNDG02 与 hazard nested SOUNDG03 共用。
RC-008
SOUNDG decisions have no feet/fathoms conversion and unit-specific rounding
- Layer: MARINER_STATE
- Risk: MEDIUM
- 影响约 2 FAIL
- 目标:
- metres / feet / fathoms;
- safety depth 阈值同步转换;
- 单位特定 rounding 与 glyph 选择一致。
RC-009
Missing DANGER53 causes whole hazard feature rejection instead of resource fallback
- Layer: RESOURCE_CONTRACT
- Risk: MEDIUM
- 影响约 1 FAIL
- 目标:
- DANGER53 缺失仍按 upstream resource missing 处理;
- 不得发明 DANGER53;
- 不能因此丢弃该 feature 的其他有效 ordered instructions。
RC-010
Runtime wreck isolated-danger decision ignores QUASOU containing 7
- Layer: CSP_DECISION
- Risk: MEDIUM
- 影响约 3 FAIL
- 目标:
- runtime WRECKS 与 Python/OpenCPN 相同处理 QUASOU=7 guard。
RC-011
Wreck no-depth decision invents a symbol when required attributes are absent
- Layer: CSP_DECISION
- Risk: MEDIUM
- 影响约 1 FAIL
- 目标:
- 保留 CATWRK/WATLEV source presence;
- 缺必要属性时不得发明 main symbol;
- Python 与 runtime 统一。
RC-013
Python UDWHAZ DisplayBase promotion also changes display priority
- Layer: RENDER_ORDER_PRIORITY
- Risk: HIGH
- 影响约 2 FAIL
- 目标:
- DisplayBase category 与 display priority 解耦;
- 固定 upstream 中 UDWHAZ 不应顺带改变 DPRI。
RC-014
Runtime UDWHAZ does not propagate the DisplayBase category side effect
- Layer: RUNTIME_EXECUTOR
- Risk: HIGH
- 影响约 2 FAIL
- 目标:
- runtime side effect 独立于是否输出 symbol;
- dry WATLEV 抑制 symbol 时仍保持正确 category side effect。
RC-015
Runtime DEPARE uses invalid supplied depth ranges without normalization
- Layer: CSP_DECISION
- Risk: LOW
- 影响约 1 FAIL
- 目标:
- runtime 与 Python 相同处理 DRVAL2 <= DRVAL1。
RC-016
Runtime DRGARE fill path omits the dredged-area pattern and boundary suffix
- Layer: RUNTIME_EXECUTOR
- Risk: MEDIUM
- 影响约 1 FAIL
- 目标:
- AC + AP(DRGARE01) + LS(DASH,1,CHGRF) 完整执行。
RC-017
DEPCNT safe-line generation bypasses SAFECD/SAFECN lookup instructions
- Layer: NORMALIZATION_LOOKUP
- Risk: MEDIUM
- 影响约 2 FAIL
- 目标:
- 优先执行 SAFECD/SAFECN Lookup INST;
- fixed LS 只作为 lookup 缺失时 fallback。
RC-018
Runtime DEPCNT ignores quality-dependent dashed line selection
- Layer: CSP_DECISION
- Risk: MEDIUM
- 影响约 2 FAIL
- 目标:
- QUAPOS 2..9 → DASH;
- runtime 与 resolver 一致。
RC-019
Safe DEPCNT side effects omit DisplayBase and SCAMIN override
- Layer: MARINER_STATE
- Risk: HIGH
- 影响约 2 FAIL
- 目标:
- safe contour 正确传播 DisplayBase;
- SCAMIN override;
- 不额外改变 DPRI。
RC-020
DEPCNT nonzero unsupported QUAPOS falls through to an unwanted solid line
- Layer: CSP_DECISION
- Risk: LOW
- 影响约 1 FAIL
- 目标:
- absent/zero QUAPOS 与 unsupported nonzero 分离;
- unsupported nonzero 不输出错误 solid line。
RC-021
UNKNOWN_ROOT_CAUSE: normal non-safe DEPCNT FAIL lacks branch-specific evidence
- Layer: EVIDENCE_GAP
- Risk: UNKNOWN
- 影响 1 FAIL
- 目标:
- 建立 branch-specific executable witness;
- 若当前实现等价,则修正该 branch 的审计状态;
- 若 witness 找到真实缺陷,则在本任务中新增最小 RC 说明并修复;
- 不得为了清零 FAIL 强行改判。
RC-027
RESARE OP is materialized as a priority change absent in the fixed upstream parser
- Layer: RENDER_ORDER_PRIORITY
- Risk: HIGH
- 影响约 18 FAIL
- 目标:
- 对固定 upstream 基线,OP 不得产生 upstream parser 不存在的 priority side effect;
- 保留 raw instruction 事实但不要错误改变 DPRI。
RC-028
RESARE boundary mode is frozen at materialization instead of being reselected
- Layer: MARINER_STATE
- Risk: MEDIUM
- 影响约 20 FAIL
- 目标:
- symbolized/plain boundary mode 在 runtime/setting change 时可重选;
- 不冻结为构建时 profile。
RC-033
LIGHTS label emission lacks previous-position/description state
- Layer: MARINER_STATE
- Risk: HIGH
- 影响约 10 FAIL
- 目标:
- 同位置同描述抑制重复;
- 同位置不同描述使用正确 offset;
- 状态只影响 label emission,不破坏 light geometry/arc。
RC-036
LIGHTS height description ignores the selected height unit
- Layer: MARINER_STATE
- Risk: MEDIUM
- 影响约 1 FAIL
- 目标:
- metres/feet;
- feet 使用 HEIGHT / 0.3048 rounding;
- 与 OpenCPN LitDSN 语义一致。
RC-037
CA canvas renderer does not execute scale-dependent arc metrics and width
- Layer: RUNTIME_EXECUTOR
- Risk: HIGH
- 影响约 5 FAIL
- 目标:
- 使用 s52_arc_width;
- scale/SCAMIN-dependent radius/width;
- bearing/pan/zoom/resize 后保持正确;
- 不回退成固定 CSS px/mm。
RC-038
Resolved CSP text bypasses structured text-hint materialization
- Layer: PRESENTATION_MATERIALIZATION
- Risk: MEDIUM
- 影响约 6 FAIL
- 目标:
- resolved CSP TX/TE 进入结构化 text operands;
- 保留 placement、font、offset、color、group;
- 与 ordered Rule IR 兼容。
5. 统一实施顺序
这是一个总任务,但内部必须按依赖顺序推进。
阶段 A:有序 Rule Chain 与 Presentation Contract
优先处理:
- RC-001
- RC-002
- RC-038
- RC-013
- RC-027
目标:
- 完整 ordered chain 可表达;
- initial Lookup + CSP expansion 不丢顺序;
- TX/TE、SY、LS、LC、AC、AP、CA、OP/side effect 能保持参数;
- category、priority、SCAMIN 等 side effect 与 drawing opcode 分离;
- 不再由 first-per-kind scalar 字段承担完整执行语义。
完成后建立临时 witness:
- OBSTRN;
- WRECKS;
- RESARE;
- UDWHAZ;
- CSP-generated TX。
阶段 B:Lookup / CSP / Mariner 语义
处理:
- RC-008
- RC-010
- RC-011
- RC-015
- RC-017
- RC-018
- RC-019
- RC-020
- RC-028
- RC-036
- RC-021
RC-021 在本阶段必须先得到结论。
完成后建立临时 witness:
- SOUNDG units;
- WRECKS QUASOU/presence;
- DEPARE bad range;
- DEPCNT SAFECD/SAFECN + QUAPOS + category/SCAMIN;
- RESARE runtime boundary mode;
- LIGHTS height units;
- DC-OUT-ZERO-NORMAL。
阶段 C:Generic Runtime Rule Executor
处理:
- RC-003
- RC-004
- RC-005
- RC-006
- RC-009
- RC-014
- RC-016
目标:
- Point / Line / Area 都能执行 ordered rules;
- 多 SY、多 LS、TX、LC、AC、AP 不丢;
- DOTT/DASH/SOLD 分离;
- resource missing fail-closed 但不丢整个 chain;
- side effect 可独立执行;
- DRGARE suffix 完整。
不得在 Web runtime 再复制一套与 Python 不同的 OBSTRN/WRECKS 业务判断;应优先消费统一 IR/运行时事实。
阶段 D:Specialized Renderer / Stateful Renderer
处理:
- RC-007
- RC-033
- RC-037
目标:
- SOUNDG glyph renderer;
- LIGHTS previous-position/description state;
- CA scale-aware renderer。
这三项属于专用渲染能力,但必须挂在统一 Rule Executor / IR 上,不建立第三套业务规则。
6. 允许修改范围
根据实际依赖,允许修改以下范围内与 26 RC 直接相关的文件:
src/cm95pbf/csp.pysrc/cm95pbf/presentation.pysrc/cm95pbf/s52.py- 与 ordered rule/runtime facts 直接相关的
src/cm95pbf/文件 tools/cm95_s52_style_compiler.pytools/cm95_s52_runtime_capability_audit.py- 与本任务 Gate/审计输出直接相关的 S-52 audit 工具
config/s52/下 runtime capability / contract 配置web/kyushu_compare.html- 必要的 S-52 PBF/runtime contract 定义
- 本任务产生的中文报告与机器审计 JSON
如果需要修改 PBF schema / runtime contract:
- 先说明为什么 RC-002/side effect 无法在现有 schema 中守恒;
- 只做最小必要变化;
- 更新 schema/version/consumer;
- 最终阶段统一做一次 production rebuild / release audit;
- 不为局部 RC 单独重复全量 5064 PBF。
7. 禁止修改范围
除非某个 Root Cause 有直接证据要求,否则不得修改:
- CM93 importer 数据库逻辑;
- MySQL 导入;
- Linux setup;
- 与 S-52 无关的 README;
- 与本任务无关的 production/importer 工具;
- NavSea;
- 任何与 CM95 S-52 portrayal 无关的模块。
8. 每阶段验证
每个阶段结束必须:
- 用临时
/tmpwitness 精确验证本阶段 RC; - 检查语法/静态结构;
- 运行现有相关非破坏性审计工具;
- 对照 OpenCPN 固定源码;
- 确认原工作区无关 SHA-256 未变化;
- 记录哪些 branch 已具备重新判定条件;
- 不得只凭函数实现“看起来正确”就关闭 FAIL。
阶段性提交允许,但必须显式 stage,仅包含本阶段任务文件。
建议提交信息:
- 阶段 A:
feat: preserve ordered S-52 runtime rule chains - 阶段 B:
fix: align S-52 lookup and mariner semantics - 阶段 C:
feat: execute ordered S-52 runtime rules - 阶段 D:
feat: complete S-52 sounding lights and arc runtime
如实际文件耦合使阶段不能独立提交,可合并提交,但最终完成报告中必须按阶段列出修改。
9. 最终统一回归
所有代码根因处理完成后,必须重新执行 Code-First 等价审计。
至少重新验证:
- OPENCPN_FLOW_EQUIVALENCE
- CSP_BRANCH_EQUIVALENCE
- NESTED_CSP_CALL_GRAPH
- INSTRUCTION_SEQUENCE_EQUIVALENCE
- RUNTIME_OPCODE_COVERAGE
- REAL_DATA_BRANCH_COVERAGE
- RESOURCE_DEPENDENCY_EQUIVALENCE
- MARINER_DEPENDENCY_EQUIVALENCE
- RENDER_ORDER_EQUIVALENCE
- RENDER_CHAIN_CONSERVATION
必须重新生成 branch 状态统计。
禁止直接用:
120 - “预计减少值”
作为新 FAIL 数。
新 FAIL 数必须来自重新运行后的实际 branch audit。
10. Production / PBF 全量重建策略
只有在以下情况之一发生时,最终阶段才做 production rebuild:
- ordered Rule IR 新字段进入 PBF;
- runtime facts contract 改变;
- presentation materialization 输出发生发布数据变化;
- style compiler 需要新的 PBF property;
- release Gate 需要验证新 contract。
若只改 Web runtime 且交付数据不变,则不得为了形式重复完整 production rebuild。
若确需全量:
- 只在全部 26 RC 实施结束后集中执行一次;
- 完整 5064 PBF 扫描只做一次;
- 记录 decode error、branch signature、resource contract、presentation conservation。
11. RC-021 特殊规则
RC-021 不能按普通代码 Bug 处理。
必须为:
DC-OUT-ZERO-NORMAL
建立 branch-specific witness。
允许结果:
A. 当前代码正确
则:
- 记录 witness;
- 将该 branch 从 FAIL 修正为合适状态;
- 说明原 v2 FAIL 为什么属于证据归因错误;
- 不修改无关产品代码。
B. 找到真实缺陷
则:
- 创建最小新增 Root Cause 标识;
- 记录机制;
- 在本任务中修复;
- witness 后再更新 branch 状态。
不得为了让剩余 FAIL 归零而直接改成 PASS。
12. 最终正式输出
本任务完成后生成:
docs/报告/CM95_S52_剩余26个根因统一修复报告_v1.mdbuild/audits/cm95_s52_remaining_26_root_cause_fix_v1.json- 更新后的 Code-First 等价审计机器结果(使用现有同主题版本策略递增,不覆盖历史 v2)
- 如审计标准本身因新 IR/contract 需要补充,则同主题版本递增;如果标准没变,不新建重复文档。
报告至少包含:
- 起始 HEAD;
- 最终 HEAD;
- OpenCPN commit;
- 26 RC 逐项状态;
- RC-021 最终结论;
- 修改文件列表;
- 阶段 A/B/C/D 提交;
- 每阶段 witness;
- 是否改 PBF contract;
- 是否 production rebuild;
- 是否完整扫描 5064 PBF;
- 最终 PASS / FAIL / NOT_PROVEN 数;
- 仍未解决的 branch;
- 仍未解决的 Root Cause;
- Target Portrayal 最终状态。
13. 工作区保护
当前已有无关工作区修改。
开始前:
git status --short- 对所有已有 modified/untracked 路径记录 SHA-256;
- 排除本任务 MD 自身。
每阶段结束:
- 重算 SHA-256;
- 无关文件必须完全一致。
最终提交前:
git diff --cached --name-onlygit diff --cached --statgit diff --cached --check
严禁把已有无关工作区修改提交。
14. 完成条件
只有同时满足以下条件才允许报告“完成”:
- 25 个已确认代码 Root Cause 都有实际修复或有明确阻塞证据;
- RC-021 已完成 branch-specific witness;
- 统一 ordered Rule Chain/IR 不再丢 mixed opcode;
- Point/Line/Area hazard runtime 不再只支持 Point;
- SOUNDG 不再以普通 text 代替 glyph chain;
- 多 LS 与 DOTT 可正确执行;
- UDWHAZ / DEPCNT / RESARE category/priority/SCAMIN side effect 与 upstream 对齐;
- runtime boundary mode 可重新选择;
- LIGHTS stateful label 与 height unit 对齐;
- CA scale-aware;
- resource missing 不导致 whole-chain 丢失;
- 重新运行 Code-First branch audit;
- 新 FAIL/PASS/NOT_PROVEN 数来自实际 audit;
- 原无关工作区 SHA-256 未变化;
- 所有任务相关 commit 已 push 到
origin/main。
如果仍有 FAIL:
- 明确列 branch_id;
- 明确对应 RC;
- 明确为什么本任务不能安全解决;
- 不得声称 Target Portrayal PASS。
15. 最终 Git 收尾
最终阶段必须:
- 显式 stage 任务相关文件;
- 不使用全量 add;
- 检查 staged;
- commit;
- push
origin/main; - 确认
HEAD == origin/main; - 最终回复给出:
- final HEAD;
- 各阶段 commit;
- push 状态;
- 26 RC 状态;
- 新 branch audit 统计;
- Target Portrayal 状态。