docs: complete OpenCPN code-first S-52 equivalence audit
This commit is contained in:
289670
build/audits/cm95_s52_opencpn_code_first_equivalence_v2.json
Normal file
289670
build/audits/cm95_s52_opencpn_code_first_equivalence_v2.json
Normal file
File diff suppressed because it is too large
Load Diff
221
docs/CM95_S52_语义守恒与运行时能力审计标准_v2.md
Normal file
221
docs/CM95_S52_语义守恒与运行时能力审计标准_v2.md
Normal file
@@ -0,0 +1,221 @@
|
||||
# CM95 S-52 语义守恒与运行时能力审计标准 v2
|
||||
|
||||
日期:2026-09-20。适用目标:绑定固定 OpenCPN 源码、明确 Production Plan 与具体 target renderer 的流程等价审计。
|
||||
|
||||
## 1. v2 的作用与生产边界
|
||||
|
||||
本标准升级 v1 的 source/presentation/delivery/runtime 守恒要求,新增代码优先的 Gate A–I。它是审计标准,**不表示现有生产 gate 已经实现这些新增检查**,也不改变产品功能、registry、PBF schema 或 importer。
|
||||
|
||||
Data Release PASS 与 Target Portrayal PASS 必须继续分开。资源齐全、PBF可解码、delivery字段存在、capability写IMPLEMENTED、截图看起来接近,分别只能说明局部事实。
|
||||
|
||||
审计真值链:
|
||||
|
||||
`固定 OpenCPN 源码 → typed CM93/S57 object view → Lookup与初始规则 → CSP分支/子调用 → 返回有序指令 → parser规则 → 分阶段renderer及副作用`
|
||||
|
||||
随后正向对照:
|
||||
|
||||
`CM95 Source → s52.py → csp.py → presentation / PBF facts → style compiler → target runtime → 每条primitive consumer`
|
||||
|
||||
不得从最终截图、输出symbol或已损失的PBF反推原始OpenCPN分支,再据此声称等价。
|
||||
|
||||
## 2. 固定基线与证据绑定
|
||||
|
||||
每次审计必须记录:
|
||||
|
||||
- OpenCPN完整commit、固定目录、源码文件SHA-256;先校验,失败立即停止。
|
||||
- CM95起始HEAD、branch、`git status --short --branch`、实际审阅文件SHA;HEAD不能代表工作区未提交代码。
|
||||
- dataset/fingerprint、Plan ID、Builder/Production版本、AOI、zoom/scale ladder、mapping/policy、FID manifest、Lookup IR、resource contract与release/PBF目录及哈希。
|
||||
- target renderer及版本、运行时设置快照、display category、point/boundary table、颜色表、depth/height单位、SCAMIN、display scale、DPI/pixel ratio、raster/vector与GL/DC等适用条件。
|
||||
|
||||
唯一固定源码不包含的上游资源或关联对象实现应标证据不足。历史artifact中的commit字符串或资源hash一致可以证明链路一致性,不能自动补足独立上游定义证明。无正式release时允许count=null并说明evidence unavailable,但代码分支审计仍须完成。
|
||||
|
||||
v2 本轮固定源码为 `docs/外部参考/OpenCPN源码基线_f7211b4e/`,commit `f7211b4e1874c453e37a7f190aa191c55a25c32e`;未来换基线必须新建目录,不能覆盖旧目录或移动冻结tag。
|
||||
|
||||
本轮实例绑定:CM95 审计输入 HEAD `1a07406e6e11fde0425f81b54c7f4a3d2aff6d49`;Production Plan ID `57e72826db1d3e3e69f0b3b084bef4fb9469b5edc47dc0030fc2ec3e46adecf9`;release `cm95-d1-62a85bd40d3a-57e72826db1d`。配套报告与 JSON 记录 12 组、206 条组合式 branch 记录,以及已完成扫描的 5064 个 PBF、1976 个交付 signature;这些数量不等于已证明等价的完整输入数量。总体 Target Portrayal 为 FAIL;Gate A/B/C/D/E/H/I 为 FAIL,Gate F/G 为 NOT_PROVEN。Data Release PASS 仅引用既有 manifest,本轮没有重新验收或提升任何运行时能力状态。
|
||||
|
||||
## 3. 继承 v1 的语义守恒不变量
|
||||
|
||||
### 3.1 Physical Entity 与 Presentation 分离
|
||||
|
||||
同一relation group可以把多个source components合成一个物理delivery Feature,但必须保留component trace。若有N条独立LIGHTS source record,则必须保留N条独立presentation,不能以物理实体去重删除presentation。
|
||||
|
||||
审计分别计算source entity数、presentation数、instruction数、resource数和tile occurrence数。数量相等还不够,必须比较canonical signature **multiset**,避免A+B变成A+A。
|
||||
|
||||
### 3.2 Presentation Signature 与 Tile Occurrence
|
||||
|
||||
每条LIGHTS signature至少覆盖source_record_index、CSP、display category/priority、light mode/symbol、CA outline/color/width、start/end/radius/sector radius、sector sweep、nominal range、rotation/obscured、label/text。
|
||||
|
||||
同一个稳定Feature ID的expected signature multiset必须与actual相等;跨tile出现时signature集合必须守恒。合法按tile选取的不同source成员应先按production实际选择逻辑定义expected,不能把范围差异伪装成payload drift,也不能忽略真实drift。
|
||||
|
||||
多个LIGHTS必须保留`s52_light_presentations`完整数组;主scalar只用于兼容。CA、SY、TX分别审计数组consumer,CA消费数组不推出其他两者也消费数组。
|
||||
|
||||
### 3.3 Production Scope
|
||||
|
||||
Source expected scope必须重放Plan+policy+coverage+tile buffer,而不只是裸AOI bbox:
|
||||
|
||||
1. 每个计划tile计算生产相同的buffer expanded bounds。
|
||||
2. 按zoom scale ladder顺序,以finer coverage先占区域,coarser仅进入剩余visible region。
|
||||
3. AOI边缘合法buffer带入的source同样计入;不能直接按AOI删除。
|
||||
4. 在该tile/native_scale/visible region内实际selected成员上重新选relation base和LIGHTS。
|
||||
5. expected/actual tile occurrence set与signature multiset逐项相等。
|
||||
|
||||
source→presentation、presentation→PBF、PBF→consumer是独立阶段;只扫描PBF不能证明第一段未丢数据。
|
||||
|
||||
### 3.4 CA 与资源
|
||||
|
||||
CA使用屏幕毫米语义,不得预烘焙成地理圆。完整证据包括outline、arc、sector angles/legs、bearing转换、设备像素/逻辑像素、尺度相关缩放及render order。固定上游GL/DC可能有不同路径,必须明确target比较哪一路。
|
||||
|
||||
SY/AP/LC资源存在性、制作正确性、branch实际引用、target实际消费是四个独立检查。资源存在不等于primitive完整执行。
|
||||
|
||||
## 4. 审计状态及维度
|
||||
|
||||
| 状态 | 定义 |
|
||||
|---|---|
|
||||
| PASS | 在声明输入域与环境内,有完整固定源码→决策→中间事实→consumer证据证明等价 |
|
||||
| PARTIAL | 已实现部分分支、primitive或近似表现;不得用于strict portrayal PASS |
|
||||
| FAIL | 有明确缺失、多出、错误条件、参数、次序或副作用 |
|
||||
| NOT_IMPLEMENTED | 对应层没有实现 |
|
||||
| NOT_PROVEN | 有实现但证据不足,或上游该路径行为不确定;必须记录缺证及如何补证 |
|
||||
| NOT_OBSERVED_IN_REAL_DATA | 源码分支保留,完整正式数据扫描未观察到;不是实现状态,也不是PASS |
|
||||
| UPSTREAM_RESOURCE_MISSING | 已证明固定上游资源缺失;若仅历史contract报告而固定定义不可得,另记reported anomaly,独立验证保持NOT_PROVEN |
|
||||
|
||||
每条记录分别保存Python/decision、PBF/facts、consumer、overall、observation状态。某branch族FAIL不意味着其全部具体输入必然出错,例如Q/T可为空;必须写明失败的条件或反例。
|
||||
|
||||
PREVIEW_ONLY、NOT_IMPLEMENTED、capability missing、IMPLEMENTED缺实现证据均不能strict PASS。branch内部有FAIL不能被CSP总体PARTIAL或资源PASS覆盖。无数据或缺失属性不能按0计数;源码缺失不能按“常见规范应如此”猜测。
|
||||
|
||||
## 5. Gate A — OPENCPN_FLOW_EQUIVALENCE
|
||||
|
||||
进入CSP之前必须逐项证明:
|
||||
|
||||
- CM93 class substitution、typed attribute conversion、原始属性presence与null/unknown语义。
|
||||
- geometry及S57/S52 class、point/boundary/line table选择。
|
||||
- Lookup条件排序、数值/字符串/list/空suffix/wildcard/undefined匹配、fallback及没有Lookup的行为。
|
||||
- initial instruction string、DISC、DPRI、radar priority及初始普通指令与CS的相对位置。
|
||||
- SCAMIN、display scale、对象category mutable等入口及会改变CSP可达性的转换。
|
||||
|
||||
至少核对ITDARE→DEPARE、SPOGRD→DMPGRD、FSHHAV→FSHFAC、OFSPRD→CTNARE,以及`$AREAS`的`$SCODE=II25`属性值变为BACKGROUND。不能把后一项误写为对象class改为BACKGROUND。
|
||||
|
||||
源geometry与delivery geometry分别记录,AREA生成outline或代表点不能因此按LINE/POINT CSP重算。Lookup IR如果只来自CM95当前resource input,须注明无法独立证明与固定上游资源一致的边界。
|
||||
|
||||
## 6. Gate B — CSP_BRANCH_EQUIVALENCE
|
||||
|
||||
第一批必须覆盖12组:OBSTRN04、WRECKS02、UDWHAZ03、SOUNDG03、LIGHTS05/LIGHTS06、DEPARE01/DEPARE02、DEPCNT02、SOUNDG02、QUAPOS01/QUAPNT01/QUALIN01、SLCONS03、RESTRN01、RESARE02。
|
||||
|
||||
每个branch至少包含:稳定branch_id、procedure、source geometry/class、typed attributes的presence/value条件、mariner参数、关联对象条件、阈值、nested calls、完整有序sequence、category/priority/SCAMIN副作用、资源、各层实际行为、real_data_count及计数单位、状态、文件/函数/行号证据与unresolved items。
|
||||
|
||||
允许组合式矩阵:共享前缀、后缀、数值格式化、阈值选择分别编号,但必须给出明确组合顺序、父子引用、互斥/覆盖条件。参数stage不得冒充完整terminal branch;branch记录数不得冒充互斥输入域数量或测试覆盖率。SOUNDG数字、Q、OBJNAM后缀不能仅用不展开的名称“支持”。
|
||||
|
||||
必须区分可达实现、注释、`#if 0`、early return后的死代码和注册为NULL的占位。LIGHTS05实际进入LIGHTS06;DEPARE02调度到DEPARE01;hazard调用_UDWHAZ03不等于直接CS(UDWHAZ03)。上游未初始化变量或失败转换不应自行“修正”成理想算法,标NOT_PROVEN并保存源码证据。
|
||||
|
||||
## 7. Gate C — NESTED_CSP_CALL_GRAPH
|
||||
|
||||
从固定源码提取真实图,记录caller/callee、调用条件、参数、返回串插入位置、side effect及所在层。至少包括:
|
||||
|
||||
- OBSTRN04/WRECKS02→_UDWHAZ03、SNDFRM02(sounding formatting)、CSQUAPNT01。
|
||||
- LIGHTS05→LIGHTS06→_selSYcol/_LITDSN01。
|
||||
- SOUNDG02→MP→RenderMPS→每点SOUNDG03→SNDFRM02。
|
||||
- QUAPOS01→CSQUALIN01/CSQUAPNT01;RESTRN01→_RESCSP01。
|
||||
|
||||
画出primitive和mariner-dependent node,标注Python、PBF、style、JS中的决策位置及精确断点。必须另有文字解释,不能只给Mermaid。普通C++ helper串拼接和generic CS opcode递归是不同路径,不能混为一谈。
|
||||
|
||||
## 8. Gate D — INSTRUCTION_SEQUENCE_EQUIVALENCE
|
||||
|
||||
以完整ordered Rule Chain比较,不能只比较SY代码集合。分别记录:
|
||||
|
||||
1. initial LUP instruction。
|
||||
2. CSP raw returned string(含必要的record separators/异常格式)。
|
||||
3. parser得到的规则及参数/顺序。
|
||||
4. renderer各pass执行、visibility/filter、state mutations及最终消费。
|
||||
|
||||
至少识别SY、TX、TE、SOUNDG glyph chain、MP、CA、AP、AC、LS、LC、OP、CS;nested展开保留provenance。必须检测missing/extra primitive、次序变化、参数变化、side effect变化、扁平化损失、初始规则被dict覆盖、多个CS/多个同类opcode被压缩。
|
||||
|
||||
不得先假设OP有priority执行语义;固定parser若忽略OP,就以忽略作为本基线实际行为。面积AC/AP与对象pass独立时,返回串顺序不自动等于跨pass屏幕次序。
|
||||
|
||||
精确反例必须记录输入、完整expected/actual、源码anchor和差异类别。手工推导expected与实际运行OpenCPN oracle应分开标注;Python/Node直接执行当前代码的结果不能包装成OpenCPN执行结果。字符串空白/浮点格式差异不一定是语义差异,必须落到参数或consumer行为。
|
||||
|
||||
## 9. Gate E — RUNTIME_OPCODE_COVERAGE
|
||||
|
||||
release实际出现的每个CSP必须从branch expected sequence逐opcode找到consumer,说明参数来源、执行条件和次序。RUNTIME_OBSTRN/RUNTIME_WRECKS等粗capability只能作目录索引。
|
||||
|
||||
例如`SY + S(V) + Q + TX`必须逐项证明:主symbol、全部sounding glyph、quality symbol、文本/布局均存在,并在正确pass及状态下执行。只画主SY和普通深度text,整个完整branch不可PASS。
|
||||
|
||||
runtime kind范围至少包含CA、DEPARE、DEPCNT、SOUNDG、OBSTRN、WRECKS;新kind须加入usage scanner、capability registry、审计与实际执行证据。unknown kind不得因没有映射就静默忽略。
|
||||
|
||||
每opcode覆盖记录至少包括opcode、branch_id、实现路径/函数、输入字段、参数映射、order/pass、status、证据及缺失处理。marker字符串存在只能证明代码位置存在,不能证明release所有分支完整。
|
||||
|
||||
## 10. Gate F — REAL_DATA_BRANCH_COVERAGE
|
||||
|
||||
完整扫描正式Plan实际release;核对计划jobs、PBF footprint、explicit empty tiles、decode错误及artifact哈希。计数区分source objects、distinct delivery(layer,FID)、presentation与tile occurrences。
|
||||
|
||||
branch signature至少包含:source与delivery geometry、class、VALSOU presence/值域、WATLEV、EXPSOU、CATOBS/CATWRK、QUASOU/QUAPOS、TECSOU/STATUS、关联DRVAL1/2及对象身份/geometry、safety contour/depth、isolated结果、scale/display依赖。静态CSP还应有RESTRN/CATREA、CONDTN/CATSLC、LIGHTS相关属性等。
|
||||
|
||||
每个实际signature必须唯一映射到上游组合路径,或明确保存候选branch_ids+NOT_PROVEN+缺失字段。候选映射不等于full coverage PASS。允许在source unavailable时完成delivery扫描并将完整源级branch count置null;不得把缺失字段当源属性absent、把null当0,或用最终SY猜原始限制属性。
|
||||
|
||||
必须保留未观察到的上游分支。nested procedure不能因没有同名顶层CSP字段就判NOT_OBSERVED。实际出现而没有完整expected/actual覆盖的分支阻止Target Portrayal PASS。
|
||||
|
||||
## 11. Gate G — RESOURCE_DEPENDENCY_EQUIVALENCE
|
||||
|
||||
每个branch逐项列SY/AP/LC等资源名,动态SOUNDG家族须按可生成symbol universe展开。检查:
|
||||
|
||||
- 固定上游引用及定义证据;当前CM95 resource universe。
|
||||
- metadata/sprite/pattern/line key是否构建,是否被style/runtime过滤掉。
|
||||
- resource参数(pivot、mm、颜色表、位图/矢量等)的消费证据。
|
||||
- 缺失时fail-closed或fallback路径是否与实际上游对应。
|
||||
|
||||
DANGER53等代码引用而缺资源应单独记录。禁止补造fallback把审计改PASS;也不能认为所有“问号fallback”在不同opcode中等价。上游SY/LC/AP fallback必须分别核实,不凭历史contract注释推断。
|
||||
|
||||
资源检查的局部PASS与branch总体FAIL/NOT_PROVEN可以同时存在,机器schema必须支持这种分离。
|
||||
|
||||
## 12. Gate H — MARINER_DEPENDENCY_EQUIVALENCE
|
||||
|
||||
至少逐项检查safety contour/depth、shallow/deep contour、two_shades、symbolized boundaries、point/boundary table、display category、priority/SCAMIN、display scale;还应包括depth/height units、文本/测深显示、灯描述/航标文本开关、屏幕毫米/缩放、颜色表与碰撞状态。
|
||||
|
||||
PBF保留原始稳定事实和presence,不固化随设置变化的最终color、safety contour、sounding family、isolated danger或promotion。reference模式允许明确固定profile,必须与runtime交付区分。
|
||||
|
||||
`mariner-dependent`不能仅等于当前六个水深CSP:RESARE的symbolized boundaries、LIGHTS的height unit与render尺度同样需要依赖证明。静态materialization宣称成立,须证明其输出在全部允许runtime settings下不变。
|
||||
|
||||
surrounding max/min scalar若不能保持关联对象geometry、membership与相同选择范围,不足以证明UDWHAZ。有效contour catalog不能仅凭当前viewport已加载线的最小值默认等价于chart catalog。
|
||||
|
||||
## 13. Gate I — RENDER_ORDER_EQUIVALENCE
|
||||
|
||||
分别证明同对象多primitive顺序、fill/pattern/line/symbol/text跨pass、initial/current display category与priority、CSP DisplayBase promotion、SCAMIN变化、静态层与runtime overlay、不同对象与symbol/text碰撞顺序。
|
||||
|
||||
MapLibre按priority/source-layer/opcode分层不是自动等价于OpenCPN rule execution。canvas overlay在全部style层上方必须提供排序证据;无法证明严格等价时为NOT_PROVEN。已证明缺失/多出的priority或primitive仍为FAIL。
|
||||
|
||||
同一设置变更应使用同一snapshot并失效相应cache,不得让DEPARE、DEPCNT、hazard与SOUNDG混用旧/新设置。截图仅作为最后视觉材料,不能替代code/rule/consumer证据。
|
||||
|
||||
## 14. Data Release 与 Target Portrayal 两道独立门槛
|
||||
|
||||
### 14.1 当前生产行为(截至本轮实际代码)
|
||||
|
||||
`src/cm95pbf/release.py`对Builder0.4.11+要求presentation conservation artifact,校验schema、PASS、plan_id和pbf_dir。runtime capability artifact在提供时为硬门槛;未提供时保持NOT_AUDITED,不能称target已审计。
|
||||
|
||||
`tools/cm95_s52_runtime_capability_audit.py`目前检查粗runtime kind、IMPLEMENTED和evidence marker。本标准新增的branch/sequence/opcode/source coverage要求尚不是该工具的已实现功能。
|
||||
|
||||
### 14.2 v2 声明 strict Target Portrayal PASS 的必要条件
|
||||
|
||||
- A–I在明确输入域/target/settings下均有完整PASS证据。
|
||||
- source→presentation→delivery invariants PASS。
|
||||
- 实际所需的全部runtime consumers完整实现,不能用PREVIEW_ONLY替代。
|
||||
- 对应release的resource、branch、sequence、nested、settings、render-order结果绑定同一Plan和PBF;不能复用其他release或缩小AOI的PASS。
|
||||
- 无实际出现的FAIL/NOT_IMPLEMENTED/NOT_PROVEN;未观察分支保留观察状态及未来覆盖责任。
|
||||
|
||||
Data Release可以继续使用它自己的数据验收结论;本轮审计FAIL不擅自改写既有release manifest,也不声称它证明了portrayal。
|
||||
|
||||
## 15. 机器产物与报告最小合同
|
||||
|
||||
JSON至少包含OpenCPN commit/root/hash校验、CM95 HEAD/worktree input hashes、Plan/release绑定、gate statuses、完整branch rows、真实调用图、ordered expected instructions、observed instructions/consumer、opcode coverage、resource dependencies、签名与计数单位、evidence paths/lines、unresolved items、验证方法及限制。
|
||||
|
||||
Markdown中每组CSP至少一张表,列为:branch_id、geometry、condition、mariner_dependency、nested_csp、expected_sequence、cm95_python、pbf_or_runtime_facts、style_or_runtime_consumer、real_data_count、status、evidence。
|
||||
|
||||
同时回答重复Python/JS决策、已确认不等价、同结构风险、是否建立统一Decision/Runtime Rule IR、runtime必须保留的字段、通用executor与专用renderer边界、scalar hint损失这七项架构问题。
|
||||
|
||||
临时分析器只在/tmp等非仓库位置;不新增Jest,不修改产品来制造PASS。本轮正式输出仅v2报告、v2标准和`build/audits/cm95_s52_opencpn_code_first_equivalence_v2.json`。
|
||||
|
||||
## 16. 历史、已关闭事项和后续阶段
|
||||
|
||||
v1 multi-LIGHTS source→PBF修复及正负回归是已记录的历史验收,不能把旧问题继续写成当前必然存在,也不能用旧PASS覆盖本次完整LIGHTS调用/文本/renderer审计。
|
||||
|
||||
本轮当前结论见[流程对照报告v2](报告/CM95_S52_OpenCPN渲染流程对照审计报告_v2.md):Target Portrayal FAIL;F源级branch覆盖、固定上游资源独立定义与全局renderer环境存在NOT_PROVEN。具体branch内部状态以报告和JSON为准。
|
||||
|
||||
统一IR、产品缺陷修复、自动gate实现、全输入域执行回归均为尚未启动的后续阶段。本标准不授权修改已有功能,也不暗示这些后续工作已经完成。
|
||||
578
docs/报告/CM95_S52_OpenCPN渲染流程对照审计报告_v2.md
Normal file
578
docs/报告/CM95_S52_OpenCPN渲染流程对照审计报告_v2.md
Normal file
@@ -0,0 +1,578 @@
|
||||
# CM95 S-52 OpenCPN 渲染流程对照审计报告 v2
|
||||
|
||||
日期:2026-09-20。任务:OpenCPN Code-First S-52 Rendering Equivalence Audit。
|
||||
|
||||
## 1. 结论及证据边界
|
||||
|
||||
**Target Portrayal / 完整流程等价:FAIL。** 本轮只审计,未修改产品代码、测试、能力注册表或 release gate。现有 Data Release manifest 记载 PASS;这不是本轮重新验收,也不代表 Target Portrayal PASS。
|
||||
|
||||
审计单位是“对象视图 → Lookup → 初始 Rule Chain → 可达 CSP 分支与子调用 → 完整有序返回指令 → parser 实际规则 → renderer 分阶段执行及副作用”。不能用主要图标、字符串包含某个 opcode、capability marker 或截图代替这条链。
|
||||
|
||||
本报告有 12 组 CSP 的组合式矩阵:终端叶、参数决策、前后缀分开编号,通过 S/Q/T/U 等明确定义组合,避免把可组合条件只取一组样例。**206 条记录不是 206 个互斥完整输入,也不是 206 个全量运行测试。** 每行保留 Python 局部状态与整个路径状态;局部 PASS 不推出最终 PASS。机器产物保留每行条件、序列、consumer、opcode、资源、证据和未决项。
|
||||
|
||||
本轮扫描全部正式 release PBF,而未用 PBF 外观反推上游规则。源数据库连接失败,部分原始属性、关联对象及视图状态无法重放;对应 branch 命中数为 null,候选映射为 NOT_PROVEN。存在明确缺陷的路径仍为 FAIL,不因缺少完整输入而降格掩盖。
|
||||
|
||||
## 2. 固定输入与工作区隔离
|
||||
|
||||
- 唯一 OpenCPN 源码基线:`docs/外部参考/OpenCPN源码基线_f7211b4e/`,commit `f7211b4e1874c453e37a7f190aa191c55a25c32e`。未访问 `/tmp/opencpn-s52-audit/` 或在线替代源码。
|
||||
- CM95 审计起点 HEAD:`1a07406e6e11fde0425f81b54c7f4a3d2aff6d49`,分支 `main`;当前实际文件为输入,已有修改的 builder/production 只读并单独记 SHA。
|
||||
- `sha256sum --check docs/外部参考/OpenCPN源码基线_f7211b4e/文件校验.sha256`:25/25 PASS,包含 23 个源码文件及两份许可证。源码全文加载并建立哈希/行数索引,共 32,549 行;逐函数审计本任务可达链,GL、字体、shader、几何辅助文件作为 renderer 依赖索引,不宣称全部低层算法均已证明等价。
|
||||
- 任务书及四份 v1 文档已读;v1 是调查线索,本报告优先采用固定源码的实际行为,包括占位函数、死代码和异常。完整输入清单与 SHA 在 JSON `input_files` / `opencpn_snapshot_inventory`。
|
||||
- Plan `57e72826db1d3e3e69f0b3b084bef4fb9469b5edc47dc0030fc2ec3e46adecf9`;Builder `cm95pbf-builder/0.4.12-opencpn-cm93-coverage`;Production `cm95pbf-production/2.3-opencpn-cm93-coverage`。
|
||||
- Plan 文件 `build/production/cm95_s52_kyushu_production_plan_v4_opencpn_coverage.json`;release `cm95-d1-62a85bd40d3a-57e72826db1d`。lookup、resource contract、CSP source SHA 均与 Plan 记载一致。
|
||||
|
||||
起始工作区(以下 13 项保持不动、不 stage、不提交):
|
||||
|
||||
```text
|
||||
## main...origin/main
|
||||
M .gitignore
|
||||
M README.md
|
||||
M src/cm93db/audit.py
|
||||
M src/cm93db/cli.py
|
||||
M src/cm93db/database.py
|
||||
M src/cm93db/importer.py
|
||||
M src/cm95pbf/builder.py
|
||||
M src/cm95pbf/production.py
|
||||
M tools/cm93_mysql_final_geometry_audit.py
|
||||
M tools/cm95_v1_4_6_query_equivalence.py
|
||||
?? .env.linux.example
|
||||
?? scripts/setup_linux.sh
|
||||
?? tools/cm95_linux_full_rebuild_preflight.py
|
||||
```
|
||||
|
||||
固定源码没有 `chartsymbols.xml`、完整 `s57chart::GetAssociatedObjects` 实现及实际运行视图。`build/chartsymbols_opencpn_master.xml` 只作为当前 CM95 的资源输入检查,其 SHA 与 Plan 相同;不能因此将它升级为第二个 OpenCPN 对照基线。上游资源定义独立证明仍为 NOT_PROVEN。
|
||||
|
||||
## 3. 从 OpenCPN 正向还原执行链(Gate A)
|
||||
|
||||
下文 O-C 表示固定 `libs/s52plib/src/s52cnsy.cpp`;O-L 表示同目录 `s52plib.cpp`;O-M 表示固定 `gui/src/cm93.cpp`。所有行号对应未修改快照;JSON 使用完整路径。C 为当前 `src/cm95pbf/csp.py`,S 为 `s52.py`,P 为 `presentation.py`,W 为 `web/kyushu_compare.html`,SC 为 `tools/cm95_s52_style_compiler.py`。
|
||||
|
||||
1. O-M:3148 `CreateS57Obj` 按 `geotype & 0x0f` 建立 primitive;3182–3190 做五类替换,3313–3336 做 COLMAR、QUASOU/CATLIT 类型和 `$SCODE` 适配,3393 起做 ATON INFORM→OBJNAM;不是单纯搬运数据库类名。
|
||||
2. O-M:2302–2379 根据点/边界设置选择 LUP;可加载另一套 LUP。O-L:220 按条件数降序、sequence 升序,811 `FindBestLUP` 匹配,1413 入口。建立 DISC、DPRI 后进入规则链。
|
||||
3. O-L:1167 `_LUP2rules` → 1003 `StringToRules`。O-L:7740 `RenderCS` 调用 `condTable` 中函数;10628 `GetAndAddCSRules` 将返回串重新解析并缓存;CS 内普通 helper 输出是串拼接,不是任意深度递归 CS executor。
|
||||
4. O-C:3906 的调度表中 DEPARE02→DEPARE01;LIGHTS05 在 1034 立即返回 LIGHTS06;UDWHAZ03 公共入口为 NULL 占位,危险物调用的是 `_UDWHAZ03`;SOUNDG02→MP→O-L:6930 RenderMPS→每个点 SOUNDG03→SNDFRM02。
|
||||
5. O-L:7794 `DoRenderObject` 执行 TX/TE/SY/LS/LC/MP/CA;10083、10565 单独的面积 pass 执行 AC/AP。`StringToRules` **没有 OP 识别分支**;`RESARE02` 返回 OP 字符串不等于上游已修改优先级。CS 后原始 LUP 尾部是否继续还需注意 renderer 的 `rules_last` 更新,不能用通用递归解释器的理想模型代替实际代码。
|
||||
6. O-L:10764、11010 在可见范围、display category、SCAMIN、对象隐藏/日期后判断渲染;可执行 CSP 后重查 category。O-L:2372 文本另有 LIGHTS/ATON 开关及同位置去重。全局 chart 调度器未全部在快照中,跨对象最终顺序不得默认证明。
|
||||
|
||||
当前链:S:427 Lookup → S:486 runtime bypass 或 C:904 resolver → P:316 scalar hints、P:140 symbol sequence、P:87 至多三个静态文本槽 → builder 交付字段 → SC 按 priority/source-layer/opcode 分层 → W 手写 depth/hazard/CA consumers。`dict.update` 还可能让 CSP 字段覆盖初始规则字段,例如初始 `SY(MORFAC03);CS(SLCONS03)` 与追加质量 SY 并存的语义不能用一个 symbol scalar 保存。
|
||||
|
||||
| Gate A 项 | 局部状态 | 证据/结论 |
|
||||
|---|---|---|
|
||||
| ITDARE→DEPARE, SPOGRD→DMPGRD, FSHHAV→FSHFAC, OFSPRD→CTNARE | PASS | class substitution only;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/gui/src/cm93.cpp:3182, src/cm95pbf/s52.py:41 |
|
||||
| $AREAS $SCODE II25→BACKGROUND | FAIL | CM95 未保留该属性值替换;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/gui/src/cm93.cpp:3330, src/cm95pbf/s52.py:179 |
|
||||
| POINT/SOUNDING→Paper/Simplified; LINE→Lines; AREA→Plain/Symbolized | PARTIAL | CM95 preselects one table; upstream can load alternatives; original source geometry vs delivery outlines differs;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/gui/src/cm93.cpp:2302, src/cm95pbf/s52.py:427 |
|
||||
| Lookup match: ordering, attributes, fallback | FAIL | ? condition never increments upstream match; float compares additionally exact cast; no unconditional lookup fallback upstream retains first vs Python None; empty numeric suffix atoi("")=0 vs Python conversion fails;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/libs/s52plib/src/s52plib.cpp:220, docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/libs/s52plib/src/s52plib.cpp:811, src/cm95pbf/s52.py:206 |
|
||||
| initial INST/DISC/DPRI | NOT_PROVEN | current lookup hash matches plan, but fixed snapshot has no lookup XML; initial SY can be overwritten by CSP SY via dict.update;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/gui/src/cm93.cpp:2354, build/s52_presentation_ir_v2/lookup_rule_ir.json |
|
||||
| INFORM→OBJNAM ATON substitution; COLMAR/list type conversion | PARTIAL | COLMAR table exists, QUASOU/CATLIT list parsed in helper; exact typed view and INFORM substitution not proved end to end;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/gui/src/cm93.cpp:3313, docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/gui/src/cm93.cpp:3393, src/cm95pbf/s52.py:179 |
|
||||
| SCAMIN/display category/priority | FAIL | upstream U only sets DisplayBase; Python additionally sets Hazards; JS has neither side effect;docs/外部参考/OpenCPN源码基线_f7211b4e/上游源码/libs/s52plib/src/s52plib.cpp:10764, src/cm95pbf/s52.py:32, web/kyushu_compare.html:364 |
|
||||
|
||||
`$AREAS + $SCODE=II25` 的正确变化是**属性值** II25→BACKGROUND,类名仍是 `$AREAS`。当前 normalization 保留 II25;当前 Plan Lookup 输入在 Plain 表可由 BACKGROUND 命中 RCID32347 `AC(NODTA);LS(SOLD,2,CHGRD)`,未转换则落到通用 fallback32373 `AP(QUESMRK1)`。这能证明 CM95 输入处理缺口;固定上游 XML 未提供,所以不把这两个 RCID 当作独立核实的上游资源事实。
|
||||
|
||||
## 4. Gate A–I 总表
|
||||
|
||||
| Gate | 状态 | 结论 |
|
||||
|---|---|---|
|
||||
| A OPENCPN_FLOW_EQUIVALENCE | FAIL | $AREAS II25 translation missing; lookup ?/float/fallback differences; fixed point/boundary table |
|
||||
| B CSP_BRANCH_EQUIVALENCE | FAIL | 206 compositional branch rows; confirmed Python/JS decision/output differences |
|
||||
| C NESTED_CSP_CALL_GRAPH | FAIL | hazard Q/T/S paths truncated; real LIGHTS05→06 and SOUNDG02→MP→03 |
|
||||
| D INSTRUCTION_SEQUENCE_EQUIVALENCE | FAIL | scalar overwrite and per-kind layers; missing glyphs/text/quality/LS |
|
||||
| E RUNTIME_OPCODE_COVERAGE | FAIL | point-only hazard, ordinary soundings text, no general chain executor |
|
||||
| F REAL_DATA_BRANCH_COVERAGE | NOT_PROVEN | 5064 PBF files fully decoded; 1976 delivery signatures; source DB unavailable so complete branch assignment not proven |
|
||||
| G RESOURCE_DEPENDENCY_EQUIVALENCE | NOT_PROVEN | local resources checked one by one; DANGER53/LOWACC03 reported anomaly; fixed upstream XML unavailable |
|
||||
| H MARINER_DEPENDENCY_EQUIVALENCE | FAIL | depth units/height units/boundary/point/category/SCAMIN not fully runtime; static LIGHTS height text |
|
||||
| I RENDER_ORDER_EQUIVALENCE | FAIL | known extra priority effect OP and missing multi-LS; global interleaving still NOT_PROVEN |
|
||||
|
||||
## 5. 组合式 branch matrix 的展开规则
|
||||
|
||||
- V=VALSOU;UNKNOWN=上游 sentinel 1e6,不与 absent、0、空串混用。SC/SD 为当前 safety contour/depth。
|
||||
- `S(V)`=SNDFRM02:先 clamp,按 depth unit 转换,signed 0.01 调整,再选 SOUNDG/SOUNDS;按顺序 B1(swept)、C2(quality)、数字、负深 A1。完整数字分支在 SOUNDG03 表,不能替换成十进制普通 text。
|
||||
- `Q`=CSQUAPNT01:按 QP 表生成零或一条 SY;`T`=OB-T 表,OBJNAM 属性存在时追加指定 TX;`U`=_UDWHAZ03 返回零或一条 SY,category mutation 独立记录。
|
||||
- WK 的一条 LINE prefix 与一条 TAIL 拼成完整链;`V<=20` 尾部是 **U→Q→S**。LI 是 mode+color/radius/description 参数+stateful TEXT suffix。所有 modifier 行明确属于决定父链的条件,不能把它们的命中数相加当 Feature 数。
|
||||
- 每条 CSP 链还应与 `initial_lookup_rows` 的初始普通指令合成;当前 CM95 Lookup 输入与固定上游 XML 的独立对应不足,已单列 Gate A 限制。
|
||||
- 表中 Python PASS 仅是相同 typed input、列明条件下的局部输出检查;最终 status 才是完整路径审计。`null` 表示无法唯一确定源分支命中数;不表示零。详细参数、副作用、每 opcode 和资源检查在同名 JSON branch 中。
|
||||
|
||||
表内消费端简写:Hazard=W:249–391;Sounding=W:218–242;Depth=W:141–216;Static=SC:599–1062;CA=W:428–574。所有 static renderer 的像素/碰撞/缩放严格一致性仍需证据。
|
||||
|
||||
### OBSTRN04
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| OB-D-VAL | ANY | VALSOU != UNKNOWN(1e6) | none | SNDFRM02 | depth=VALSOU; precompute S(VALSOU); execute terminal OB branch | PASS: depth=VALSOU; precompute S(VALSOU); execute terminal OB branch | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1681–1695; C:591–700 |
|
||||
| OB-D-EXPSOU | ANY | VALSOU absent; EXPSOU=1 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=UNKNOWN → _UDWHAZ03(depth) → terminal OB branch | PARTIAL: AREA Python may use min associated DRVAL1 before fallback; upper-level terminal emission follows | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1696–1736; C:591–700 |
|
||||
| OB-D-FOUL | ANY | VALSOU absent; EXPSOU!=1; CATOBS=6 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=0.01 → _UDWHAZ03(depth) → terminal OB branch | FAIL: AREA Python may use min associated DRVAL1 before fallback; upper-level terminal emission follows | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1696–1736; C:591–700 |
|
||||
| OB-D-AWASH | ANY | VALSOU absent; EXPSOU!=1; CATOBS!=6; WATLEV=5 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=0 → _UDWHAZ03(depth) → terminal OB branch | FAIL: AREA Python may use min associated DRVAL1 before fallback; upper-level terminal emission follows | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1696–1736; C:591–700 |
|
||||
| OB-D-SUBMERGED | ANY | VALSOU absent; EXPSOU!=1; CATOBS!=6; WATLEV=3 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=0.01 → _UDWHAZ03(depth) → terminal OB branch | FAIL: AREA Python may use min associated DRVAL1 before fallback; upper-level terminal emission follows | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1696–1736; C:591–700 |
|
||||
| OB-D-DEFAULT | ANY | VALSOU absent; EXPSOU!=1; CATOBS!=6; WATLEV otherwise | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=-15 → _UDWHAZ03(depth) → terminal OB branch | FAIL: AREA Python may use min associated DRVAL1 before fallback; upper-level terminal emission follows | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1696–1736; C:591–700 |
|
||||
| OB-P-ISO | POINT | _UDWHAZ03 returns nonempty | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(ISODGR51) → Q → T | FAIL: SY(ISODGR51) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1741–1752; C:591–700 |
|
||||
| OB-P-ROCK-AWASH | POINT | U empty; UWTROC; V<=20; WATLEV∈{4,5} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(UWTROC04) → Q → T | FAIL: SY(UWTROC04) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-ROCK-OTHER | POINT | U empty; UWTROC; V<=20; WATLEV absent/3/other | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER51) → S(V) → Q → T | FAIL: SY(DANGER51) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-ABSENT | POINT | U empty; OBSTRN; V<=20; WATLEV absent | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER01) → S(V) → Q → T | FAIL: SY(DANGER01) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-DRY | POINT | U empty; OBSTRN; V<=20; WATLEV∈{1,2} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(LNDARE01) → Q → T | FAIL: SY(LNDARE01) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-SUBMERGED | POINT | U empty; OBSTRN; V<=20; WATLEV=3 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER52) → S(V) → Q → T | FAIL: SY(DANGER52) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-AWASH | POINT | U empty; OBSTRN; V<=20; WATLEV∈{4,5} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER53) → S(V) → Q → T | FAIL: SY(DANGER53) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-OTHER | POINT | U empty; OBSTRN; V<=20; WATLEV other | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER51) → S(V) → Q → T | FAIL: SY(DANGER51) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-DEEP | POINT | U empty; VALSOU>20; either class | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER52) → S(V) → Q → T | FAIL: SY(DANGER52) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-ROCK-NOV-DRY | POINT | U empty; V absent; UWTROC; WATLEV=2 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(LNDARE01) → Q → T | FAIL: SY(LNDARE01) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-ROCK-NOV-SUB | POINT | U empty; V absent; UWTROC; WATLEV=3 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(UWTROC03) → Q → T | FAIL: SY(UWTROC03) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-ROCK-NOV-OTHER | POINT | U empty; V absent; UWTROC; WATLEV absent/other | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(UWTROC04) → Q → T | FAIL: SY(UWTROC04) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-NOV-DRY | POINT | U empty; V absent; OBSTRN; WATLEV∈{1,2} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(OBSTRN11) → Q → T | FAIL: SY(OBSTRN11) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-NOV-AWASH | POINT | U empty; V absent; OBSTRN; WATLEV∈{4,5} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(OBSTRN03) → Q → T | FAIL: SY(OBSTRN03) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-P-OBS-NOV-OTHER | POINT | U empty; V absent; OBSTRN; WATLEV absent/3/other | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(OBSTRN01) → Q → T | FAIL: SY(OBSTRN01) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1755–1901; C:591–700 |
|
||||
| OB-L-QLOW | LINE | Q.Len()>1 (QUAPOS 2..9) | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | CSQUAPNT01 | ToLong(Q string) into uninitialized long; conditional LC(LOWACC41/31); then T | NOT_PROVEN: LC(LOWACC41) if U nonempty else LC(LOWACC31) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:1906–1924; C:591–700 |
|
||||
| OB-L-ISO | LINE | Q.Len()<=1; U nonempty | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CHBLK) → T | FAIL: LS(DOTT,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1926–1948; C:591–700 |
|
||||
| OB-L-SHALLOW | LINE | Q.Len()<=1; U empty; V present<=20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CHBLK) → S(V) → T | FAIL: LS(DOTT,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1926–1948; C:591–700 |
|
||||
| OB-L-DEEP | LINE | Q.Len()<=1; U empty; V>20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DASH,2,CHBLK) → T | FAIL: LS(DASH,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1926–1948; C:591–700 |
|
||||
| OB-L-NOV | LINE | Q.Len()<=1; U empty; V absent | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CHBLK) → T | FAIL: LS(DOTT,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1926–1948; C:591–700 |
|
||||
| OB-A-ISO | AREA | U nonempty | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | AC(DEPVS) → AP(FOULAR01) → LS(DOTT,2,CHBLK) → SY(ISODGR51) → Q → T | FAIL: AC(DEPVS) → AP(FOULAR01) → LS(DOTT,2,CHBLK) → SY(ISODGR51) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-A-SHALLOW | AREA | U empty; V<=20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CHBLK) → S(V) → Q → T | FAIL: LS(DOTT,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-A-DEEP | AREA | U empty; V>20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DASH,2,CHBLK) → S(V) → Q → T | FAIL: LS(DASH,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-A-DRY | AREA | U empty; V absent; WATLEV∈{1,2} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | AC(CHBRN) → LS(SOLD,2,CSTLN) → Q → T | FAIL: AC(CHBRN) → LS(SOLD,2,CSTLN) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-A-AWASH | AREA | U empty; V absent; WATLEV=4 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | AC(DEPIT) → LS(DASH,2,CSTLN) → Q → T | FAIL: AC(DEPIT) → LS(DASH,2,CSTLN) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-A-FOUL | AREA | U empty; V absent; WATLEV∈{3,5}; CATOBS=6 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | AC(DEPVS) → AP(FOULAR01) → LS(DOTT,2,CHBLK) → Q → T | FAIL: AC(DEPVS) → AP(FOULAR01) → LS(DOTT,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-A-DEFAULT | AREA | U empty; V absent; remaining WATLEV/CATOBS | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | AC(DEPVS) → LS(DOTT,2,CHBLK) → Q → T | FAIL: AC(DEPVS) → LS(DOTT,2,CHBLK) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:1951–2020; C:591–700 |
|
||||
| OB-T-PRESENT | ANY | OBJNAM attribute exists (including empty string) | none | none | terminal prefix → Q or S as terminal specifies → TX(OBJNAM,1,2,3,'15118',-1,-1,CHBLK,26) | FAIL: terminal without TX | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:2022–2030; C:591–700 |
|
||||
| OB-T-ABSENT | ANY | OBJNAM missing | none | none | terminal prefix → Q or S as terminal specifies | PASS: terminal without TX | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:2022–2030; C:591–700 |
|
||||
|
||||
### WRECKS02
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| WK-D-VAL | ANY | V present | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=V → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-CAT1 | ANY | V absent; CATWRK=1 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=20 → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-CAT2 | ANY | V absent; CATWRK=2 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=0 → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-CAT45 | ANY | V absent; CATWRK∈{4,5} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=-15 → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-CATOTHER | ANY | V absent; CATWRK present not 1/2/4/5 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=UNKNOWN → U unless QUASOU contains 7 → terminal WK branch | FAIL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-WAT3 | ANY | V absent; CATWRK absent; WATLEV=3 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=0.01 → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-WAT5 | ANY | V absent; CATWRK absent; WATLEV=5 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=0 → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-WATDRY | ANY | V absent; CATWRK absent; WATLEV absent/1/2/4/6 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=-15 → U unless QUASOU contains 7 → terminal WK branch | PARTIAL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-D-WATOTHER | ANY | V absent; CATWRK absent; WATLEV other | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _DEPVAL01,_UDWHAZ03 | depth=UNKNOWN → U unless QUASOU contains 7 → terminal WK branch | FAIL: AREA first uses associated min DRVAL1; unsupported CATWRK falls through WATLEV; then terminal | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | NOT_PROVEN | O-C:3252–3370; C:701–781 |
|
||||
| WK-U-SKIP7 | ANY | QUASOU contains 7 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | CSQUAPNT01 | U=empty; quasou=7 → Q → terminal WK branch | PASS: Python skips U; Web does not inspect QUASOU=7 | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3370–3385; C:701–781 |
|
||||
| WK-P-ISO | POINT | U nonempty | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(ISODGR51) → Q | FAIL: SY(ISODGR51) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3387–3393; C:701–781 |
|
||||
| WK-P-V-LT-Q0 | POINT | U empty; V < safety_contour; QUASOU excludes 7 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER51) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → S(V) → U(empty) → Q | FAIL: SY(DANGER51) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3415–3437; C:701–781 |
|
||||
| WK-P-V-LT-Q7 | POINT | U empty; V < safety_contour; QUASOU contains 7 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER51) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → SY(WRECKS07) → S(V) → U(empty) → Q | FAIL: SY(DANGER51) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → SY(WRECKS07) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3415–3437; C:701–781 |
|
||||
| WK-P-V-GE-Q0 | POINT | U empty; V >= safety_contour; QUASOU excludes 7 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER52) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → S(V) → U(empty) → Q | FAIL: SY(DANGER52) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3415–3437; C:701–781 |
|
||||
| WK-P-V-GE-Q7 | POINT | U empty; V >= safety_contour; QUASOU contains 7 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | SY(DANGER52) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → SY(WRECKS07) → S(V) → U(empty) → Q | FAIL: SY(DANGER52) → TX('Wk',3,1,2,'15110',2,0,CHBLK,21) → SY(WRECKS07) → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3415–3437; C:701–781 |
|
||||
| WK-P-NOV-CAT1 | POINT | U empty; V absent; CATWRK=1 and WATLEV=3 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,CSQUAPNT01 | SY(WRECKS04) → Q | FAIL: SY(WRECKS04) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3438–3468; C:701–781 |
|
||||
| WK-P-NOV-CAT2 | POINT | U empty; V absent; CATWRK=2 and WATLEV=3 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,CSQUAPNT01 | SY(WRECKS05) → Q | FAIL: SY(WRECKS05) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3438–3468; C:701–781 |
|
||||
| WK-P-NOV-DRY | POINT | U empty; V absent; both attrs present; (CATWRK∈{4,5} or WATLEV∈{1,2,4,5}) | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,CSQUAPNT01 | SY(WRECKS01) → Q | FAIL: SY(WRECKS01) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3438–3468; C:701–781 |
|
||||
| WK-P-NOV-OTHER | POINT | U empty; V absent; both attrs present; remaining values | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,CSQUAPNT01 | SY(WRECKS05) → Q | FAIL: SY(WRECKS05) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3438–3468; C:701–781 |
|
||||
| WK-P-NOV-MISSING | POINT | U empty; V absent; CATWRK or WATLEV absent | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,CSQUAPNT01 | Q | FAIL: Python invents WRECKS01/05 fallback | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3438–3468; C:701–781 |
|
||||
| WK-LINE-QLOW | NONPOINT | QUAPOS∈[2,9] | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LC(LOWACC41) → WK-TAIL selected by V/WATLEV | PASS: LC(LOWACC41) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-LINE-ISO | NONPOINT | QUAPOS outside [2,9]; U nonempty | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CHBLK) → WK-TAIL selected by V/WATLEV | PASS: LS(DOTT,2,CHBLK) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-LINE-VALSH | NONPOINT | accurate; U empty; V<=20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CHBLK) → WK-TAIL selected by V/WATLEV | PASS: LS(DOTT,2,CHBLK) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-LINE-VALDP | NONPOINT | accurate; U empty; V>20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DASH,2,CHBLK) → WK-TAIL selected by V/WATLEV | PASS: LS(DASH,2,CHBLK) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-LINE-DRY | NONPOINT | accurate; U empty; V absent; WATLEV∈{1,2} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(SOLD,2,CSTLN) → WK-TAIL selected by V/WATLEV | FAIL: LS(DOTT,2,CSTLN) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-LINE-AWASH | NONPOINT | accurate; U empty; V absent; WATLEV=4 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DASH,2,CSTLN) → WK-TAIL selected by V/WATLEV | FAIL: LS(DOTT,2,CSTLN) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-LINE-DEFAULT | NONPOINT | accurate; U empty; V absent; WATLEV other/absent | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | LS(DOTT,2,CSTLN) → WK-TAIL selected by V/WATLEV | PASS: LS(DOTT,2,CSTLN) → WK-TAIL without Q | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3469–3510; C:701–781 |
|
||||
| WK-TAIL-SHALLOW | NONPOINT | V present<=20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | WK-LINE selected above → U → Q → S(V) | FAIL: WK-LINE → U → S(V) | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3509–3530; C:701–781 |
|
||||
| WK-TAIL-DEEP | NONPOINT | V>20 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | WK-LINE selected above → U → Q | FAIL: WK-LINE | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3509–3530; C:701–781 |
|
||||
| WK-TAIL-DRY | NONPOINT | V absent; WATLEV∈{1,2} | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | WK-LINE selected above → AC(CHBRN) → U → Q | FAIL: WK-LINE → AC(CHBRN) → U | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3509–3530; C:701–781 |
|
||||
| WK-TAIL-AWASH | NONPOINT | V absent; WATLEV=4 | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | WK-LINE selected above → AC(DEPIT) → U → Q | FAIL: WK-LINE → AC(DEPIT) → U | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3509–3530; C:701–781 |
|
||||
| WK-TAIL-DEFAULT | NONPOINT | V absent; WATLEV other/absent | safety_contour,safety_depth,depth_unit,display_category,SCAMIN,display_scale | _UDWHAZ03,SNDFRM02,CSQUAPNT01 | WK-LINE selected above → AC(DEPVS) → U → Q | FAIL: WK-LINE → AC(DEPVS) → U | PARTIAL | runtimeHazardSymbol / runtimeHazardDepthText; only Point | null | FAIL | O-C:3509–3530; C:701–781 |
|
||||
|
||||
### UDWHAZ03
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| UD-PUBLIC | ANY | direct CS(UDWHAZ03) | none | none | ∅ | NOT_IMPLEMENTED: no resolve_csp_hints public dispatch | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:3197–3205; C:407–452 |
|
||||
| UD-UNKNOWN-DANGER | ANY | depth=UNKNOWN; EXPSOU!=1 | safety_contour | chart::GetAssociatedObjects | danger=true → UD-OUT according to danger and WATLEV | PASS: danger=true → UD-OUT according to danger and WATLEV | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-UNKNOWN-EXPOSED | ANY | depth=UNKNOWN; EXPSOU=1 | safety_contour | chart::GetAssociatedObjects | association scan; AREA cannot promote; LINE DRVAL2<SC may promote → UD-OUT according to danger and WATLEV | PASS: association scan; AREA cannot promote; LINE DRVAL2<SC may promote → UD-OUT according to danger and WATLEV | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-KNOWN-DEEP | ANY | known depth>SC; EXPSOU attribute ignored | safety_contour | chart::GetAssociatedObjects | danger=false → UD-OUT according to danger and WATLEV | FAIL: Python/JS read EXPSOU even for known depth | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-KNOWN-SHALLOW | ANY | known depth<=SC; local expsou remains 0 | safety_contour | chart::GetAssociatedObjects | association scan → UD-OUT according to danger and WATLEV | FAIL: Python/JS use actual EXPSOU; AREA test suppressed when EXPSOU=1 | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-ASSOC-LINE | ANY | eligible scan; any associated GEO_LINE DRVAL2(default0)<SC | safety_contour | chart::GetAssociatedObjects | danger=true → UD-OUT according to danger and WATLEV | PARTIAL: Python helper supports; builder only provides AREA; JS ignores min DRVAL2 | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-ASSOC-AREA | ANY | eligible scan; any associated nonline DRVAL1(default0)>=SC and local expsou!=1 | safety_contour | chart::GetAssociatedObjects | danger=true → UD-OUT according to danger and WATLEV | NOT_PROVEN: max DRVAL1 summary, source association predicate missing | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-ASSOC-NONE | ANY | eligible scan; no qualifying association or chart absent | safety_contour | chart::GetAssociatedObjects | danger=false → UD-OUT according to danger and WATLEV | NOT_PROVEN: danger=false → UD-OUT according to danger and WATLEV | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:535–594; C:407–452 |
|
||||
| UD-OUT-DRY | ANY | danger=true; WATLEV 1/2 | safety_contour,display_category,SCAMIN | none | ∅ | PASS: Python promotion additionally becomes Hazards priority via s52.py | PARTIAL | runtimeHazardIsolated; no category executor | null | FAIL | O-C:597–612; C:407–452 |
|
||||
| UD-OUT-WET | ANY | danger=true; WATLEV otherwise | safety_contour,display_category,SCAMIN | none | SY(ISODGR51) | PASS: SY(ISODGR51) → Python promotion additionally becomes Hazards priority via s52.py | PARTIAL | runtimeHazardIsolated; no category executor | null | FAIL | O-C:597–612; C:407–452 |
|
||||
| UD-OUT-SAFE | ANY | danger=false | safety_contour,display_category,SCAMIN | none | ∅ | PASS: Python promotion additionally becomes Hazards priority via s52.py | PARTIAL | runtimeHazardIsolated; no category executor | null | NOT_PROVEN | O-C:597–612; C:407–452 |
|
||||
|
||||
### SOUNDG03
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| SG-CLAMP-HIGH | POINT | input>40000 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: d=99999 before unit conversion | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-CLAMP-LOW | POINT | input<-1000 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: d=0 before conversion | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-METRES | POINT | unit neither 0 nor 2 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: d=input/clamped; threshold=SD | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-FEET | POINT | unit=0 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | NOT_IMPLEMENTED: CM95 metre-only | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-FATHOMS | POINT | unit=2 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | NOT_IMPLEMENTED: CM95 metre-only | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-SHALLOW | POINT | d after signed .01 adjustment <= converted SD | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: prefix=SOUNDS | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-DEEP | POINT | adjusted d > converted SD | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: prefix=SOUNDG | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-SWEPT | POINT | TECSOU contains6 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: SY(prefixB1) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-QUALITY | POINT | QUASOU intersects{3,4,5,8,9} or STATUS contains18 else QUAPOS∈[2,9] | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | SNDFRM02 | prelude(SG-CLAMP/UNIT/PREFIX) → B1 if swept → C2 if unreliable → SG-DIGITS selected by adjusted d | PASS: SY(prefixC2) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2680–2758; C:309–393 |
|
||||
| SG-DIGITS-ONE | POINT | abs(d)<10; feet rounding may fall through | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix1a) → SY(prefix5f) if f>0 → SY(prefixA1) if negative | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix1a) → SY(prefix5f) if f>0 → SY(prefixA1) if negative | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
| SG-DIGITS-TWO-FRACTION | POINT | abs(d)<31; fractional remainder !=0 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) if leading>=10 → SY(prefix1b) → SY(prefix5f) if f>0 and !feet → SY(prefixA1) if negative | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) if leading>=10 → SY(prefix1b) → SY(prefix5f) if f>0 and !feet → SY(prefixA1) if negative | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
| SG-DIGITS-TWO-NEG | POINT | previous branches not returned; abs(d)<100; d<0 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) → SY(prefix1b) → SY(prefixA1) | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) → SY(prefix1b) → SY(prefixA1) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
| SG-DIGITS-TWO-POS | POINT | previous branches not returned; abs(d)<100; d>=0 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix1a) → SY(prefix0b) | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix1a) → SY(prefix0b) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
| SG-DIGITS-THREE | POINT | previous branches not returned; d<1000 (signed compare) | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) → SY(prefix1b) → SY(prefix0c) | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) → SY(prefix1b) → SY(prefix0c) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
| SG-DIGITS-FOUR | POINT | previous branches not returned; d<10000 | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) → SY(prefix1b) → SY(prefix0c) → SY(prefix4d) | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix2a) → SY(prefix1b) → SY(prefix0c) → SY(prefix4d) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
| SG-DIGITS-FIVE | POINT | remaining | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | none | SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix3a) → SY(prefix2b) → SY(prefix1c) → SY(prefix0d) → SY(prefix4e) | PASS: SY(prefixB1) if swept → SY(prefixC2) if unreliable → SY(prefix3a) → SY(prefix2b) → SY(prefix1c) → SY(prefix0d) → SY(prefix4e) | PARTIAL | ordinary MapLibre text; no glyph-chain executor | null | FAIL | O-C:2759–2926; C:309–393 |
|
||||
|
||||
### LIGHTS05/LIGHTS06
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| LI-DISPATCH | POINT | CS(LIGHTS05) | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | LIGHTS06 | LIGHTS06(param) immediately | PASS: LIGHTS06(param) immediately | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | 6889 | NOT_PROVEN | O-C:1014–1038; C:148–308 |
|
||||
| LI-FLOOD | POINT | CATLIT contains8 or11 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | SY(LIGHTS82) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-STRIP | POINT | no8/11; CATLIT contains9 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | SY(LIGHTS81) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-DIRECTION | POINT | other; sector value missing/-9; CATLIT1 or14 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | SY(QUESMRK1) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-FLARE | POINT | other; no sector; no CATLIT1/14; VALNMR(default9)<10 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | SY(flareColor,135) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-ROUND | POINT | other; no sector; no CATLIT1/14; VALNMR>=10 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | CA(OUTLW,4,roundColor,2,0,360,radius+colorDelta,0) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-ZERO-SWEEP | POINT | sector values not -9; sweep<1 or =360 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | CA(OUTLW,4,roundColor,2,0,360,radius+colorDelta,0) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-SECTOR | POINT | sector; sweep>=1 !=360; not obscured | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | CA(OUTLW,4,sectorColor,2,start,end,sectorRadius,25) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-OBSCURED | POINT | sector; sweep>=1 !=360; LITVIS3/7/8 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol,_LITDSN01 | CA(CHBLK,4,CHBRN,1,start,end,sectorRadius,25) → LI-TEXT selected by _LITDSN01 + prior lat/lon/description | PARTIAL: CM95 same broad mode but color/radius/text subbranches differ | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1361–1588; C:148–308 |
|
||||
| LI-SEL-RED | POINT | single3 or pair1+3 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with flare LIGHTS11; round LITRD delta1 → LI-TEXT | PASS: LI terminal with flare LIGHTS11; round LITRD delta1 → LI-TEXT | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:409–482; C:148–308 |
|
||||
| LI-SEL-GREEN | POINT | single4 or pair1+4 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with flare LIGHTS12; round LITGN delta0 → LI-TEXT | PASS: LI terminal with flare LIGHTS12; round LITGN delta0 → LI-TEXT | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:409–482; C:148–308 |
|
||||
| LI-SEL-YELLOW | POINT | single1/6/9 (octal011) | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with flare LIGHTS13; round LITYW delta2 → LI-TEXT | FAIL: Python non-sector yellow uses11 instead9; unknown round delta3 not5; sector V<=0 gives15; -9 treated present | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:409–482; C:148–308 |
|
||||
| LI-SEL-MAGENTA | POINT | single12 / absent color default12 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with flare LITDEF11; round CHMGD delta3 → LI-TEXT | PASS: LI terminal with flare LITDEF11; round CHMGD delta3 → LI-TEXT | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:409–482; C:148–308 |
|
||||
| LI-SEL-OTHER | POINT | other single/multi color | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with flare LITDEF11; round CHMGD delta5 → LI-TEXT | FAIL: Python non-sector yellow uses11 instead9; unknown round delta3 not5; sector V<=0 gives15; -9 treated present | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:409–482; C:148–308 |
|
||||
| LI-SECTOR-COLOR | POINT | single3→red;4→green;1/6/11→yellow; pair1+3/red,1+4/green;else magenta | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with sectorColor from this table → LI-TEXT | PASS: LI terminal with sectorColor from this table → LI-TEXT | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:1423–1588; C:148–308 |
|
||||
| LI-ROUND-RADIUS | POINT | V>0: <7→3;<15→10;<30→15;else20; V<=0→3 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with round radius before colorDelta → LI-TEXT | PASS: LI terminal with round radius before colorDelta → LI-TEXT | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:409–482; C:148–308 |
|
||||
| LI-SECTOR-RADIUS | POINT | V>0: <15→10;<30→15;else20; V<=0→20 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with sector radius → LI-TEXT | FAIL: Python non-sector yellow uses11 instead9; unknown round delta3 not5; sector V<=0 gives15; -9 treated present | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1423–1588; C:148–308 |
|
||||
| LI-ANGLE | POINT | sectr2<=sectr1→+360; each >180 subtract180 else add180 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with start,end after seaward conversion → LI-TEXT | PARTIAL: LI terminal with start,end after seaward conversion → LI-TEXT | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:1423–1588; C:148–308 |
|
||||
| LI-SENTINEL | POINT | either SECTR value=-9 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _selSYcol | LI terminal with non-sector branch → LI-TEXT | FAIL: Python non-sector yellow uses11 instead9; unknown round delta3 not5; sector V<=0 gives15; -9 treated present | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1423–1588; C:148–308 |
|
||||
| LI-TEXT-FIRST | POINT | different lastLat/lastLon; description nonempty | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX(desc,3,2,3,'15110',2,0,CHBLK,23) | PASS: CM95 always TX(desc,...,2,0,...) when nonempty | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:1590–1620; C:148–308 |
|
||||
| LI-TEXT-DUPLICATE | POINT | same previous lat/lon; same description | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix | FAIL: CM95 always TX(desc,...,2,0,...) when nonempty | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1590–1620; C:148–308 |
|
||||
| LI-TEXT-CHANGED | POINT | same previous lat/lon; different description | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX(desc,3,2,3,'15110',2,1,CHBLK,23) | FAIL: CM95 always TX(desc,...,2,0,...) when nonempty | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:1590–1620; C:148–308 |
|
||||
| LI-TEXT-EMPTY-FIRST | POINT | different lat/lon; empty description | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix | FAIL: CM95 always TX(desc,...,2,0,...) when nonempty | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:1590–1620; C:148–308 |
|
||||
| LI-DESC-CHAR | POINT | LITCHR1..29 or absent/unknown | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: description abbreviation per _LITDSN01 switch; 21/23 vert;22/24 horz | PASS: LI mode prefix → TX using description rule: description abbreviation per _LITDSN01 switch; 21/23 vert;22/24 horz | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-TWO-GROUP | POINT | LITCHR13/14/15/16/25/26/27/29 | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: insert (?) even without SIGGRP; replace ? with first character of first group; append second if !=1 | FAIL: Python description builder differs for group/sector-presence/height unit as noted | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-SINGLE-GROUP | POINT | other LITCHR; SIGGRP present !=(1) | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: append literal SIGGRP | PASS: LI mode prefix → TX using description rule: append literal SIGGRP | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-SECTOR-PRESENCE | POINT | SECTR1 attribute exists (SECTR2 irrelevant) | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: omit COLOUR and VALNMR text | FAIL: Python description builder differs for group/sector-presence/height unit as noted | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-PERIOD | POINT | SIGPER present | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: 1 decimal iff abs(round-value)>.01 else integer; append s | PARTIAL: Python description builder differs for group/sector-presence/height unit as noted | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-HEIGHT-M | POINT | HEIGHT present; height unit metres | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: rounded HEIGHT + m | PARTIAL: Python description builder differs for group/sector-presence/height unit as noted | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-HEIGHT-FT | POINT | HEIGHT present; height unit feet | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: rounded HEIGHT/0.3048 + ft | NOT_IMPLEMENTED: Python description builder differs for group/sector-presence/height unit as noted | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | FAIL | O-C:3534–3876; C:148–308 |
|
||||
| LI-DESC-RANGE | POINT | VALNMR present and SECTR1 absent | height_unit,text_visibility,SCAMIN,display_scale,pixel_per_mm,display_size_mm,text_collision,render history at same lat/lon | _LITDSN01 | LI mode prefix → TX using description rule: rounded range + Nm | PASS: LI mode prefix → TX using description rule: rounded range + Nm | NOT_PROVEN | static LIGHT_SY/LIGHT_TX; drawLightArcFeature | null | NOT_PROVEN | O-C:3534–3876; C:148–308 |
|
||||
|
||||
### DEPARE01/DEPARE02
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| DA-ALIAS | AREA | CS(DEPARE02) | two_shades,shallow_contour,safety_contour,deep_contour | DEPARE01 | same DEPARE01 branch tree | PASS: same DEPARE01 branch tree | PARTIAL | runtimeDepthColorExpression; fill only | 0 | NOT_PROVEN | O-C:3912–3914; C:44–90 |
|
||||
| DA-INTERTIDAL | AREA | base: d1<0 or d2<=0; no later override | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPIT) → AP(DRGARE01),LS(DASH,1,CHGRF) iff DRGARE | PASS: AC(DEPIT) → DRGARE suffix if class DRGARE | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:631–675; C:44–90 |
|
||||
| DA-VERYSHALLOW | AREA | base: d1>=0 and d2>0; no later override | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPVS) → AP(DRGARE01),LS(DASH,1,CHGRF) iff DRGARE | PASS: AC(DEPVS) → DRGARE suffix if class DRGARE | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:631–675; C:44–90 |
|
||||
| DA-TWO-DEEP | AREA | two_shades=true; d1>=SC and d2>SC | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPDW) → AP(DRGARE01),LS(DASH,1,CHGRF) iff DRGARE | PASS: AC(DEPDW) → DRGARE suffix if class DRGARE | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:631–675; C:44–90 |
|
||||
| DA-FOUR-SHALLOW | AREA | !two_shades; d1>=shallow and d2>shallow; no later override | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPMS) → AP(DRGARE01),LS(DASH,1,CHGRF) iff DRGARE | PASS: AC(DEPMS) → DRGARE suffix if class DRGARE | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:631–675; C:44–90 |
|
||||
| DA-FOUR-SAFE | AREA | !two_shades; d1>=SC and d2>SC; no deep override | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPMD) → AP(DRGARE01),LS(DASH,1,CHGRF) iff DRGARE | PASS: AC(DEPMD) → DRGARE suffix if class DRGARE | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:631–675; C:44–90 |
|
||||
| DA-FOUR-DEEP | AREA | !two_shades; d1>=deep and d2>deep | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPDW) → AP(DRGARE01),LS(DASH,1,CHGRF) iff DRGARE | PASS: AC(DEPDW) → DRGARE suffix if class DRGARE | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:631–675; C:44–90 |
|
||||
| DA-DRG-NOD1 | AREA | DRGARE and DRVAL1 absent | two_shades,shallow_contour,safety_contour,deep_contour | none | AC(DEPMD) → AP(DRGARE01) → LS(DASH,1,CHGRF) | PASS: AC(DEPMD) → AP(DRGARE01) → LS(DASH,1,CHGRF) | PARTIAL | runtimeDepthColorExpression; fill only | null | FAIL | O-C:661–684; C:44–90 |
|
||||
| DA-BAD-RANGE | AREA | DRVAL2<=DRVAL1 | two_shades,shallow_contour,safety_contour,deep_contour | none | DRVAL2=DRVAL1+0.01 → selected AC + DRGARE suffix | PASS: Python clamps; JS does not clamp supplied bad range | PARTIAL | runtimeDepthColorExpression; fill only | null | FAIL | O-C:629–633; C:44–90 |
|
||||
| DA-MISSING-D2 | AREA | DRVAL2 absent | two_shades,shallow_contour,safety_contour,deep_contour | none | NOT_PROVEN: uninitialized drval2 read upstream; do not assign an expected color | NOT_PROVEN: Python defaults d1+0.01; JS defaults d1+0.01 | PARTIAL | runtimeDepthColorExpression; fill only | null | NOT_PROVEN | O-C:623–633; C:44–90 |
|
||||
|
||||
### DEPCNT02
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| DC-DEC-DEP-RANGE | LINE | LINE DEPARE; d1<=SC and d2>=SC | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | safe=true → DC-OUT selected by QUAPOS and safe | PASS: Python uses tolerance for equality and broader next-safe fallback; JS visible loaded catalog | PARTIAL | updateRuntimeSafetyContour + line color/width | null | NOT_PROVEN | O-C:750–823; C:91–122 |
|
||||
| DC-DEC-DEP-LOW | LINE | LINE DEPARE; d1<=SC and d2<SC | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | safe=false → DC-OUT selected by QUAPOS and safe | FAIL: Python uses tolerance for equality and broader next-safe fallback; JS visible loaded catalog | PARTIAL | updateRuntimeSafetyContour + line color/width | null | NOT_PROVEN | O-C:750–823; C:91–122 |
|
||||
| DC-DEC-DEP-NEXT | LINE | LINE DEPARE; d1>SC | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | safe=(abs(d1-chart.next)<1e-4) → DC-OUT selected by QUAPOS and safe | PASS: Python uses tolerance for equality and broader next-safe fallback; JS visible loaded catalog | PARTIAL | updateRuntimeSafetyContour + line color/width | null | NOT_PROVEN | O-C:750–823; C:91–122 |
|
||||
| DC-DEC-CNT-EXACT | LINE | otherwise; VALDCO==SC | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | safe=true → DC-OUT selected by QUAPOS and safe | PARTIAL: Python uses tolerance for equality and broader next-safe fallback; JS visible loaded catalog | PARTIAL | updateRuntimeSafetyContour + line color/width | null | NOT_PROVEN | O-C:750–823; C:91–122 |
|
||||
| DC-DEC-CNT-NEXT | LINE | otherwise; VALDCO!=SC | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | safe=(abs(VALDCO-chart.next)<1e-4) → DC-OUT selected by QUAPOS and safe | PASS: Python uses tolerance for equality and broader next-safe fallback; JS visible loaded catalog | PARTIAL | updateRuntimeSafetyContour + line color/width | null | NOT_PROVEN | O-C:750–823; C:91–122 |
|
||||
| DC-OUT-LOW-SAFE | LINE | QUAPOS∈[2,9] and safe | safety_contour,chart effective safety_contour,display_category,SCAMIN | S52_LUPLookup(SAFECD/SAFECN) | SAFECD Plain lookup INST; fallback LS(DASH,2,DEPSC) | PARTIAL: Python fixed LS; ignores SAFECD/SAFECN lookup → Web only color+width, ignores QUAPOS | PARTIAL | updateRuntimeSafetyContour + line color/width | null | FAIL | O-C:827–856; C:91–122 |
|
||||
| DC-OUT-LOW-NORMAL | LINE | QUAPOS∈[2,9] and !safe | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | LS(DASH,1,DEPCN) | PARTIAL: Python fixed LS; ignores SAFECD/SAFECN lookup → Web only color+width, ignores QUAPOS | PARTIAL | updateRuntimeSafetyContour + line color/width | null | FAIL | O-C:827–856; C:91–122 |
|
||||
| DC-OUT-ZERO-SAFE | LINE | QUAPOS absent/0 and safe | safety_contour,chart effective safety_contour,display_category,SCAMIN | S52_LUPLookup(SAFECD/SAFECN) | SAFECN Plain lookup INST; fallback LS(SOLD,2,DEPSC) | PARTIAL: Python fixed LS; ignores SAFECD/SAFECN lookup → Web only color+width, ignores QUAPOS | PARTIAL | updateRuntimeSafetyContour + line color/width | null | FAIL | O-C:827–856; C:91–122 |
|
||||
| DC-OUT-ZERO-NORMAL | LINE | QUAPOS absent/0 and !safe | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | LS(SOLD,1,DEPCN) | PARTIAL: Python fixed LS; ignores SAFECD/SAFECN lookup → Web only color+width, ignores QUAPOS | PARTIAL | updateRuntimeSafetyContour + line color/width | null | FAIL | O-C:827–856; C:91–122 |
|
||||
| DC-OUT-OTHER | LINE | QUAPOS nonzero outside [2,9] | safety_contour,chart effective safety_contour,display_category,SCAMIN | none | ∅ | FAIL: Python fixed LS; ignores SAFECD/SAFECN lookup → Web only color+width, ignores QUAPOS | PARTIAL | updateRuntimeSafetyContour + line color/width | null | FAIL | O-C:827–856; C:91–122 |
|
||||
|
||||
### SOUNDG02
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| MP-SPLIT | MULTIPOINT | CS(SOUNDG02) reached | safety_depth,depth_unit,show_soundings,sounding_scale,SCAMIN | RenderMPS,SOUNDG03,SNDFRM02 | MP() → RenderMPS: for every point CS(SOUNDG03) → SNDFRM02(z) → ordered SY glyphs | PARTIAL: builder per-sounding feature + runtime facts or Python resolve_soundg03 | PARTIAL | addRuntimeSoundingLayer; ordinary text | 146728 | FAIL | O-C:2632–2661; C:904–971 |
|
||||
|
||||
### QUAPOS01/QUAPNT01/QUALIN01
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| QP-4 | NONLINE / CSQUAPNT01 any caller | QUAPOS=4 | none | CSQUAPNT01 | SY(QUAPOS01) | PASS: SY(QUAPOS01) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2179–2224; C:782–821 |
|
||||
| QP-5 | NONLINE / CSQUAPNT01 any caller | QUAPOS=5 | none | CSQUAPNT01 | SY(QUAPOS02) | PASS: SY(QUAPOS02) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2179–2224; C:782–821 |
|
||||
| QP-78 | NONLINE / CSQUAPNT01 any caller | QUAPOS∈{7,8} | none | CSQUAPNT01 | SY(QUAPOS03) | PASS: SY(QUAPOS03) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2179–2224; C:782–821 |
|
||||
| QP-LOW | NONLINE / CSQUAPNT01 any caller | QUAPOS∈{2,3,6,9} | none | CSQUAPNT01 | SY(LOWACC03) | PASS: SY(LOWACC03) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2179–2224; C:782–821 |
|
||||
| QP-ACCURATE | NONLINE / CSQUAPNT01 any caller | QUAPOS absent or outside [2,9] | none | CSQUAPNT01 | ∅ | PASS: ∅ | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2179–2224; C:782–821 |
|
||||
| QL-LOW | LINE | QUAPOS present in [2,9] | none | CSQUALIN01 | LC(LOWACC21) | PASS: LC(LOWACC21) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2115–2158; C:782–821 |
|
||||
| QL-OTHER | LINE | QUAPOS present outside [2,9] | none | CSQUALIN01 | ∅ | PASS: ∅ | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2115–2158; C:782–821 |
|
||||
| QL-RADAR | LINE | QUAPOS absent; class COALNE; CONRAD=1 | none | CSQUALIN01 | LS(SOLD,3,CHMGF) → LS(SOLD,1,CSTLN) | PASS: LS(SOLD,3,CHMGF) → LS(SOLD,1,CSTLN) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | FAIL | O-C:2115–2158; C:782–821 |
|
||||
| QL-NORMAL | LINE | QUAPOS absent; other class or COALNE CONRAD absent/not1 | none | CSQUALIN01 | LS(SOLD,1,CSTLN) | PASS: LS(SOLD,1,CSTLN) | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2115–2158; C:782–821 |
|
||||
| QP-DISPATCH | ANY | QUAPOS01: GEO_LINE vs else | none | CSQUALIN01,CSQUAPNT01 | CSQUALIN01 for LINE else CSQUAPNT01 | PASS: CSQUALIN01 for LINE else CSQUAPNT01 | NOT_PROVEN | style first SY/LS/LC; no general sequence executor | null | NOT_PROVEN | O-C:2066–2093; C:782–821 |
|
||||
|
||||
### SLCONS03
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| SL-P-LOW | POINT | QUAPOS present∈[2,9] | none | none | SY(LOWACC01) | PASS: SY(LOWACC01) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
| SL-P-OTHER | POINT | QUAPOS absent/outside [2,9] | none | none | ∅ | PASS: ∅ | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
| SL-LOW | LINE/AREA | QUAPOS present∈[2,9] | none | none | AP(CROSSX01) iff AREA → LC(LOWACC01) | FAIL: AP(CROSSX01) iff AREA → LC(LOWACC21) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | FAIL | O-C:2237–2291; C:822–857 |
|
||||
| SL-PRESENT-GOOD | LINE/AREA | QUAPOS present outside [2,9] | none | none | AP(CROSSX01) iff AREA | FAIL: AP(CROSSX01) iff AREA → Python emits normal LS | NOT_PROVEN | static AP/LS/LC/SY style layers | null | FAIL | O-C:2237–2291; C:822–857 |
|
||||
| SL-CONDTN | LINE/AREA | QUAPOS absent; CONDTN∈{1,2} | none | none | AP(CROSSX01) iff AREA → LS(DASH,1,CSTLN) | PASS: AP(CROSSX01) iff AREA → LS(DASH,1,CSTLN) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
| SL-WHARF | LINE/AREA | QUAPOS absent; previous false; CATSLC∈{6,15,16} | none | none | AP(CROSSX01) iff AREA → LS(SOLD,4,CSTLN) | PASS: AP(CROSSX01) iff AREA → LS(SOLD,4,CSTLN) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
| SL-DRY | LINE/AREA | QUAPOS absent; previous false; WATLEV=2 | none | none | AP(CROSSX01) iff AREA → LS(SOLD,2,CSTLN) | PASS: AP(CROSSX01) iff AREA → LS(SOLD,2,CSTLN) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
| SL-WET | LINE/AREA | QUAPOS absent; previous false; WATLEV∈{3,4} | none | none | AP(CROSSX01) iff AREA → LS(DASH,2,CSTLN) | PASS: AP(CROSSX01) iff AREA → LS(DASH,2,CSTLN) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
| SL-OTHER | LINE/AREA | QUAPOS absent; remaining | none | none | AP(CROSSX01) iff AREA → LS(SOLD,2,CSTLN) | PASS: AP(CROSSX01) iff AREA → LS(SOLD,2,CSTLN) | NOT_PROVEN | static AP/LS/LC/SY style layers | null | NOT_PROVEN | O-C:2237–2291; C:822–857 |
|
||||
|
||||
### RESTRN01
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| RE-ABSENT | ANY | RESTRN absent/empty | none | _RESCSP01 | ∅ | PASS: ∅ | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-ENTRY-MIX | ANY | R∩{7,8,14}; R∩{1..6} | none | _RESCSP01 | SY(ENTRES61) | PASS: SY(ENTRES61) | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-ENTRY-INFO | ANY | R∩{7,8,14}; no {1..6}; R∩{9..13} | none | _RESCSP01 | SY(ENTRES71) | PASS: SY(ENTRES71) | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-ENTRY-ONLY | ANY | R∩{7,8,14}; no {1..6,9..13} | none | _RESCSP01 | SY(ENTRES51) | PARTIAL: CM95 info set is 9..15, includes 14/15 incorrectly | NOT_PROVEN | static first SY layer | null | FAIL | O-C:2503–2607; C:858–872 |
|
||||
| RE-ANCHOR-MIX | ANY | no entry; R∩{1,2}; R∩{3..6} | none | _RESCSP01 | SY(ACHRES61) | PASS: SY(ACHRES61) | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-ANCHOR-INFO | ANY | no entry; R∩{1,2}; no {3..6}; R∩{9..13} | none | _RESCSP01 | SY(ACHRES71) | PASS: SY(ACHRES71) | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-ANCHOR-ONLY | ANY | no entry; R∩{1,2}; no {3..6,9..13} | none | _RESCSP01 | SY(ACHRES51) | PARTIAL: CM95 info set is 9..15, includes 14/15 incorrectly | NOT_PROVEN | static first SY layer | null | FAIL | O-C:2503–2607; C:858–872 |
|
||||
| RE-FISH-INFO | ANY | no entry/anchor; R∩{3..6}; R∩{9..13} | none | _RESCSP01 | SY(FSHRES71) | PASS: SY(FSHRES71) | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-FISH-ONLY | ANY | no entry/anchor; R∩{3..6}; no {9..13} | none | _RESCSP01 | SY(FSHRES51) | PARTIAL: CM95 info set is 9..15, includes 14/15 incorrectly | NOT_PROVEN | static first SY layer | null | FAIL | O-C:2503–2607; C:858–872 |
|
||||
| RE-INFO | ANY | no {1..8,14}; R∩{9..13} | none | _RESCSP01 | SY(INFARE51) | PASS: SY(INFARE51) | NOT_PROVEN | static first SY layer | null | NOT_PROVEN | O-C:2503–2607; C:858–872 |
|
||||
| RE-DEFAULT | ANY | nonempty R without prior match | none | _RESCSP01 | SY(RSRDEF51) | PARTIAL: CM95 info set is 9..15, includes 14/15 incorrectly | NOT_PROVEN | static first SY layer | null | FAIL | O-C:2503–2607; C:858–872 |
|
||||
|
||||
### RESARE02
|
||||
|
||||
| branch_id | geometry | condition | mariner_dependency | nested_csp | expected_sequence | cm95_python | pbf_or_runtime_facts | style_or_runtime_consumer | real_data_count | status | evidence |
|
||||
|---|---|---|---|---|---|---|---|---|---:|---|---|
|
||||
| RA-ENTRY-MIX-PLAIN | AREA | R contains entry; R intersects1..6 or CATREA A; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(ENTRES61) | PASS: OP(6---) → LS(DASH,2,CHMGD) → SY(ENTRES61) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ENTRY-MIX-SYMB | AREA | R contains entry; R intersects1..6 or CATREA A; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(RESARE51) → SY(ENTRES61) | PASS: OP(6---) → LC(RESARE51) → SY(ENTRES61) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ENTRY-INFO-PLAIN | AREA | entry; previous false; R intersects9..13 or CATREA B; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(ENTRES71) | PASS: OP(6---) → LS(DASH,2,CHMGD) → SY(ENTRES71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ENTRY-INFO-SYMB | AREA | entry; previous false; R intersects9..13 or CATREA B; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(RESARE51) → SY(ENTRES71) | PASS: OP(6---) → LC(RESARE51) → SY(ENTRES71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ENTRY-ONLY-PLAIN | AREA | entry; previous false; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(ENTRES51) | FAIL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ENTRY-ONLY-SYMB | AREA | entry; previous false; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(RESARE51) → SY(ENTRES51) | FAIL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ANCHOR-MIX-PLAIN | AREA | no entry; anchor; fishing or CATREA A; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(ACHRES61) | PASS: OP(6---) → LS(DASH,2,CHMGD) → SY(ACHRES61) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ANCHOR-MIX-SYMB | AREA | no entry; anchor; fishing or CATREA A; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(RESARE51) → SY(ACHRES61) | PASS: OP(6---) → LC(RESARE51) → SY(ACHRES61) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ANCHOR-INFO-PLAIN | AREA | no entry; anchor; previous false; R info or CATREA B; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(ACHRES71) | PASS: OP(6---) → LS(DASH,2,CHMGD) → SY(ACHRES71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ANCHOR-INFO-SYMB | AREA | no entry; anchor; previous false; R info or CATREA B; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(RESARE51) → SY(ACHRES71) | PASS: OP(6---) → LC(RESARE51) → SY(ACHRES71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ANCHOR-ONLY-PLAIN | AREA | no entry; anchor; previous false; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(RESTRN51) | PARTIAL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-ANCHOR-ONLY-SYMB | AREA | no entry; anchor; previous false; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(RESARE51) → SY(RESTRN51) | PARTIAL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-FISH-A-PLAIN | AREA | no entry/anchor; fishing; CATREA A; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(FSHRES51) | PASS: OP(6---) → LS(DASH,2,CHMGD) → SY(FSHRES51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-FISH-A-SYMB | AREA | no entry/anchor; fishing; CATREA A; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(FSHRES51) → SY(FSHRES51) | PASS: OP(6---) → LC(FSHRES51) → SY(FSHRES51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-FISH-INFO-PLAIN | AREA | no entry/anchor; fishing; no A; R info or CATREA B; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(FSHRES71) | PASS: OP(6---) → LS(DASH,2,CHMGD) → SY(FSHRES71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-FISH-INFO-SYMB | AREA | no entry/anchor; fishing; no A; R info or CATREA B; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(FSHRES51) → SY(FSHRES71) | PASS: OP(6---) → LC(FSHRES51) → SY(FSHRES71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-FISH-ONLY-PLAIN | AREA | no entry/anchor; fishing; previous false; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LS(DASH,2,CHMGD) → SY(FSHRES51) | PARTIAL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-FISH-ONLY-SYMB | AREA | no entry/anchor; fishing; previous false; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | OP(6---) → LC(FSHRES51) → SY(FSHRES51) | PARTIAL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-R-INFO-PLAIN | AREA | R present; no entry/anchor/fishing; R info; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | LS(DASH,2,CHMGD) → SY(INFARE51) | PASS: LS(DASH,2,CHMGD) → SY(INFARE51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-R-INFO-SYMB | AREA | R present; no entry/anchor/fishing; R info; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | LC(CTYARE51) → SY(INFARE51) | PASS: LC(CTYARE51) → SY(INFARE51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-R-DEFAULT-PLAIN | AREA | R present (even empty); no prior match; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | LS(DASH,2,CHMGD) → SY(RSRDEF51) | PARTIAL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-R-DEFAULT-SYMB | AREA | R present (even empty); no prior match; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | LC(CTYARE51) → SY(RSRDEF51) | PARTIAL: same sequence except CM95 info set9..15 and present-empty R treated absent | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | FAIL | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-AB-PLAIN | AREA | R absent; CATREA A and B; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | LS(DASH,2,CHMGD) → SY(CTYARE71) | PASS: LS(DASH,2,CHMGD) → SY(CTYARE71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-AB-SYMB | AREA | R absent; CATREA A and B; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | LC(CTYARE51) → SY(CTYARE71) | PASS: LC(CTYARE51) → SY(CTYARE71) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-A-PLAIN | AREA | R absent; A only; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | LS(DASH,2,CHMGD) → SY(CTYARE51) | PASS: LS(DASH,2,CHMGD) → SY(CTYARE51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-A-SYMB | AREA | R absent; A only; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | LC(CTYARE51) → SY(CTYARE51) | PASS: LC(CTYARE51) → SY(CTYARE51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-B-PLAIN | AREA | R absent; B only; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | LS(DASH,2,CHMGD) → SY(INFARE51) | PASS: LS(DASH,2,CHMGD) → SY(INFARE51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-B-SYMB | AREA | R absent; B only; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | LC(CTYARE51) → SY(INFARE51) | PASS: LC(CTYARE51) → SY(INFARE51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-NONE-PLAIN | AREA | R absent; neither A nor B; symbolized_boundaries=False | symbolized_boundaries,boundary_table,display_priority | none | LS(DASH,2,CHMGD) → SY(RSRDEF51) | PASS: LS(DASH,2,CHMGD) → SY(RSRDEF51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
| RA-NOR-NONE-SYMB | AREA | R absent; neither A nor B; symbolized_boundaries=True | symbolized_boundaries,boundary_table,display_priority | none | LC(CTYARE51) → SY(RSRDEF51) | PASS: LC(CTYARE51) → SY(RSRDEF51) | NOT_PROVEN | static LS/LC/SY layers; Python OP priority mutation | null | NOT_PROVEN | O-C:2351–2490; C:873–903 |
|
||||
|
||||
|
||||
矩阵补充:LIGHTS 的 `_LITDSN01` 对 LITCHR 1–29 依次使用 F、Fl、LFl、Q、VQ、UQ、Iso、Occ、IQ、IVQ、IUQ、Mo、F + Fl、Fl + LFl、Occ + Fl、F + LFl、Al Occ、Al LFl、Al Fl、Al Grp、F、F、F、F、Q + LFl、VQ + LFl、UQ + LFl、Alt、F + Alt。21/23 追加 vert,22/24 追加 horz;13/14/15/16/25/26/27/29 执行 two-group 规则。未知/缺失为空字符串,再继续属性附加。`orientstr` 在可达 LIGHTS06 没有赋值,所以 directional TE 分支不能被当作真实可达要求。
|
||||
|
||||
## 6. Nested CSP call graph 与语义断点(Gate C)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Obj[CM93 Object] --> Norm[CreateS57Obj typed view]
|
||||
Norm --> Lookup[Lookup and initial rules]
|
||||
Lookup --> CS[CS dispatch]
|
||||
CS --> OB[OBSTRN04]
|
||||
CS --> WK[WRECKS02]
|
||||
OB --> DEPVAL[_DEPVAL01 returns UNKNOWN]
|
||||
WK --> DEPVAL
|
||||
OB --> U[_UDWHAZ03 safety contour + associated objects]
|
||||
WK --> U
|
||||
OB --> S[SNDFRM02 safety depth + units]
|
||||
WK --> S
|
||||
OB --> Q[CSQUAPNT01]
|
||||
WK --> Q
|
||||
OB --> T[OBJNAM TX]
|
||||
WK --> WT[Wk TX and WRECKS07]
|
||||
U --> US[optional ISODGR51 + DisplayBase mutation]
|
||||
S --> Glyph[ordered SOUNDG/SOUNDS SY chain]
|
||||
Q --> QS[optional quality SY]
|
||||
CS --> L5[LIGHTS05]
|
||||
L5 --> L6[LIGHTS06]
|
||||
L6 --> Sel[_selSYcol]
|
||||
L6 --> Desc[_LITDSN01 and colocation state]
|
||||
Sel --> Light[SY or CA]
|
||||
Desc --> Text[TX]
|
||||
CS --> MP[SOUNDG02 MP]
|
||||
MP --> MPS[RenderMPS per point]
|
||||
MPS --> S3[SOUNDG03]
|
||||
S3 --> S
|
||||
CS --> DA[DEPARE02 alias DEPARE01]
|
||||
DA --> Fill[AC plus DRGARE AP LS]
|
||||
CS --> DC[DEPCNT02 safety contour]
|
||||
DC --> Safe[SAFECD or SAFECN lookup, category and Scamin]
|
||||
CS --> QP[QUAPOS01]
|
||||
QP --> Q
|
||||
QP --> QL[CSQUALIN01 LC or ordered LS]
|
||||
CS --> SL[SLCONS03 AP plus quality or normal line]
|
||||
CS --> R[RESTRN01]
|
||||
R --> RC[_RESCSP01 SY]
|
||||
CS --> RA[RESARE02 boundary setting]
|
||||
RA --> RS[OP then LC or LS then SY]
|
||||
```
|
||||
|
||||
当前 CM95 的决策层与断点:
|
||||
|
||||
- Python C:591/701 复制 OB/WK 条件;Q 未追加,OB 的 LINE/AREA sounding 与 OBJNAM TX 缺失。C:454 的实际 min DRVAL1 与上游 `_DEPVAL01` 占位行为不同。
|
||||
- runtime 模式在 S:486–501 直接绕过这些 resolver。PBF 保存业务 facts,没有完整 Rule Chain。W:249/261/304 再写一次危险物判断;WK 的 QUASOU=7 skip-U 没有被复制,已用 Node 直接重放确认。
|
||||
- Python SOUNDG03 的 metre glyph chain 存在;SC:813 附近明确排除 `s52_sounding_symbol_sequence`,W 只画普通数字。不是资源名称不存在导致的缺图,而是 executor 没有执行序列。
|
||||
- RESTRN→_RESCSP 与 QUAPOS→QUALIN/QUAPNT 是实际 helper call;RESARE 独立实现,没有虚构成调用 RESTRN。DEPARE 的 restriction 调用只在注释内,不纳入可达图。
|
||||
- LIGHTS 多 presentation 数组由 W 逐项消费 CA;Static LIGHT_SY/LIGHT_TX 仍消费主 scalar,不能把 CA 数组可见等同于所有灯符号和文字完整守恒。
|
||||
|
||||
## 7. 完整指令序列与执行见证(Gate D)
|
||||
|
||||
以下是固定源码手工逐语句推导的 expected,与本轮直接执行当前 Python 得到的 actual。不是 OpenCPN 二进制重放;单个 positive witness 不能证明整个输入域。JSON 保存全部 26 个 Python 及 4 个 JS 见证的输入、输出与限制。
|
||||
|
||||
| 见证 | OpenCPN expected | CM95 Python actual | 差异 |
|
||||
|---|---|---|---|
|
||||
| ob-point-quality-name | SY(DANGER52);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55);SY(QUAPOS01);TX(OBJNAM,1,2,3,'15118',-1,-1,CHBLK,26) | SY(DANGER52);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| ob-line-sounding | LS(DOTT,2,CHBLK);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | LS(DOTT,2,CHBLK) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| ob-area-sounding | LS(DOTT,2,CHBLK);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | LS(DOTT,2,CHBLK) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| ob-isolated-area-quality | AC(DEPVS);AP(FOULAR01);LS(DOTT,2,CHBLK);SY(ISODGR51);SY(QUAPOS01) | AC(DEPVS);AP(FOULAR01);LS(DOTT,2,CHBLK);SY(ISODGR51) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| wreck-point-full-chain | SY(DANGER52);TX('Wk',3,1,2,'15110',2,0,CHBLK,21);SY(WRECKS07);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55);SY(QUAPOS02) | SY(DANGER52);TX('Wk',3,1,2,'15110',2,0,CHBLK,21);SY(WRECKS07);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| wreck-missing-category | | SY(WRECKS05) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| wreck-dry-area | LS(SOLD,2,CSTLN);AC(CHBRN) | LS(DOTT,2,CSTLN);AC(CHBRN) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| wreck-area-q-before-sounding | LC(LOWACC41);SY(QUAPOS01);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | LC(LOWACC41);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| ud-known-expsou | SY(ISODGR51) | | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| slcons-q4 | LC(LOWACC01) | LC(LOWACC21) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| slcons-q1 | | LS(SOLD,2,CSTLN) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| restrn-14 | SY(ENTRES51) | SY(ENTRES71) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| restrn-15 | SY(RSRDEF51) | SY(INFARE51) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| restrn-1,15 | SY(ACHRES51) | SY(ACHRES71) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| restrn-7,9 | SY(ENTRES71) | SY(ENTRES71) | 此输入字符串相同,端到端未证明 |
|
||||
| resare-14 | OP(6---);LS(DASH,2,CHMGD);SY(ENTRES51) | OP(6---);LS(DASH,2,CHMGD);SY(ENTRES71) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| resare-empty-present | LS(DASH,2,CHMGD);SY(RSRDEF51) | LS(DASH,2,CHMGD);SY(CTYARE51) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| depcnt-q1 | | LS(SOLD,1,DEPCN) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| depcnt-depare-invalid-range | LS(SOLD,1,DEPCN) | LS(SOLD,2,DEPSC) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| lights-amber | SY(LIGHTS13,135);TX(' ',3,2,3,'15110',2,0,CHBLK,23) | SY(LITDEF11,135) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| lights-orange | SY(LITDEF11,135);TX(' ',3,2,3,'15110',2,0,CHBLK,23) | SY(LIGHTS13,135) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| lights-unknown-round | CA(OUTLW,4,CHMGD,2,0,360,15,0);TX(' 10Nm',3,2,3,'15110',2,0,CHBLK,23) | CA(OUTLW,4,CHMGD,2,0,360,13.0,0);TX('10Nm',3,2,3,'15110',2,0,CHBLK,23) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| lights-zero-sector | CA(OUTLW,4,CHMGD,2,210,240,20,25) | CA(OUTLW,4,CHMGD,2,210.0,240.0,15.0,25.0) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| lights-group-missing | SY(LITDEF11,135);TX('F(?) + Fl',3,2,3,'15110',2,0,CHBLK,23) | SY(LITDEF11,135);TX('F + Fl',3,2,3,'15110',2,0,CHBLK,23) | 不同;按源码条件/参数评估,非仅空白比较 |
|
||||
| soundg-metre-glyphs | SY(SOUNDGB1);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | SY(SOUNDGB1);SY(SOUNDGC2);SY(SOUNDG21);SY(SOUNDG10);SY(SOUNDG55) | 此输入字符串相同,端到端未证明 |
|
||||
| qualin-double-line | LS(SOLD,3,CHMGF);LS(SOLD,1,CSTLN) | LS(SOLD,3,CHMGF);LS(SOLD,1,CSTLN) | 此输入字符串相同,端到端未证明 |
|
||||
|
||||
JS 直接调用 W 中现有纯函数得到:普通 OBSTRN 10.5、QUAPOS4 只形成 DANGER52+普通 text“10.5”;WRECKS QUASOU7 且关联 DRVAL1=10 时仍返回 ISODGR51;OBSTRN V=25/WATLEV1 返回 DANGER52 却没有 sounding text;DANGER53 分支 symbol=null,后续 refresh 直接跳过 feature,尽管 depth text 函数仍可返回“10.5”。这些执行不涉及浏览器绘制,因此像素结果仍未证明。
|
||||
|
||||
## 8. 每 opcode 消费能力(Gate E)
|
||||
|
||||
每个 branch 的 JSON `opcode_coverage` 引用以下具体 consumer,宏 S/Q 已补入 sounding/quality 项;不能只用 RUNTIME_OBSTRN 等粗 capability。
|
||||
|
||||
| opcode/path | 上游真实执行 | CM95 consumer | 状态 | 缺口 |
|
||||
|---|---|---|---|---|
|
||||
| SY | RenderSY: numeric angle and ORIENT override; raster/vector plus pivots | compiler first s52_symbol_code; Web hazard one runtime_symbol | PARTIAL | generic multi-SY/order/rotation not executed; SOUNDG specially excluded from static SY |
|
||||
| TX | RenderTX→RenderT_All; visibility/collision/units/layout | 3 static text slots; LIGHT_TX literal; no hazard TX consumer | PARTIAL | CSP text does not pass materialize_text_hints; Wk/OBJNAM missing in runtime |
|
||||
| TE | S52_PL_parseTE→RenderTE; LIGHTS06 ORIENT TE branch unreachable because orientstr never populated | materialize_text_hints + 3 static text slots | NOT_PROVEN | format/style semantics not fully proven; do not demand unreachable directional TE |
|
||||
| SOUNDG | SNDFRM02 returns ordered SY SOUNDG/SOUNDS digits+B1/C2/A1 | ordinary MapLibre text for sounding and hazard | FAIL | glyph positioning, flags, units and ordered sequence absent |
|
||||
| QUAPNT01 | CSQUAPNT01 returns optional SY quality mark | standalone Python helper exists; hazard paths never append it; JS none | FAIL | nested output truncated at Python and bypassed in runtime facts |
|
||||
| CA | RenderCARC→GLSL/VBO: display size, mm scaling, SCAMIN-related shrink | drawLightArcFeature canvas at 96/25.4 CSS px/mm above map | PARTIAL | no upstream scale-dependent radius/width reduction; arc_width not read; priority not interleaved |
|
||||
| AC | RenderAreaToDC/GL area pass | static fill / runtimeDepthColorExpression | PARTIAL | runtime DEPARE two_shades/clamp and hazard AREA missing; 0.92 opacity changes composition |
|
||||
| AP | area pattern renderer; resource metric/spacing | fill-pattern sprite, 0.85 default opacity | PARTIAL | hazard/DRGARE runtime pattern absent; scalar first pattern only |
|
||||
| LS | RenderLS/RenderGLLS uses S52 style/width/color and line topology | first scalar line; DASH special case, all other styles [1,0] | FAIL | DOTT rendered like SOLD; multiple LS unconsumed; DEPCNT QUAPOS ignored |
|
||||
| LC | RenderLC incl repeated symbols geometry/spacing | line-pattern at fixed default width5 | NOT_PROVEN | repeated pattern metric/topology equivalence not proven; wrong SLCONS LOWACC code |
|
||||
| OP | RESARE02 emits OP, but StringToRules has no OP recognition; no priority effect there | static_rule_hints then _apply_presentation_side_effects changes priority | FAIL | CM95 adds priority effect not performed by this fixed upstream parser |
|
||||
| CS | condTable→RenderCS→GetAndAddCSRules→StringToRules; helper calls normally concatenate strings, not recursive generic CS execution | resolve_csp_hints or runtime facts + handwritten JS | FAIL | nested hazard suffixes and chain order not conserved |
|
||||
| MP | RenderMPS splits every point and invokes SOUNDG03 | per-sounding facts; runtime text | FAIL | no equivalent glyph executor or proven per-point source cardinality here |
|
||||
|
||||
当前 registry 中 CA=IMPLEMENTED,DEPARE/DEPCNT/SOUNDG/OBSTRN/WRECKS 均为 PREVIEW_ONLY;v1 标准中的 OB/WK NOT_IMPLEMENTED 是历史状态,不能再当作当前注册值。注册状态未被修改;IMPLEMENTED 的 CA 也不能绕过本次参数与顺序审计。
|
||||
|
||||
## 9. 正式 real-data branch coverage(Gate F)
|
||||
|
||||
Plan 共 5,065 jobs;扫描 5,064 个 PBF、476,120 个 tile feature occurrences;0 解码错误。manifest 另记 1 个显式 empty tile。每个 PBF 的 SHA/大小及每个签名的示例 tile、layer、FID、原始交付 properties 都在 JSON。
|
||||
|
||||
| CSP | tile occurrences | distinct (layer,FID) | 说明 |
|
||||
|---|---:|---:|---|
|
||||
| DEPARE01 | 47,516 | 20,891 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| QUAPOS01 | 27,803 | 13,741 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| SLCONS03 | 25,459 | 15,451 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| DEPCNT02 | 46,189 | 23,518 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| OBSTRN04 | 45,633 | 23,459 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| WRECKS02 | 909 | 434 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| LIGHTS05 | 6,889 | 4,139 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| RESARE02 | 386 | 162 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| RESTRN01 | 396 | 222 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
| SOUNDG02 | 146,728 | 89,278 | 这是交付计数,不是 source object count / 确定 branch 命中数 |
|
||||
|
||||
签名共 1,976 种,显式覆盖 lookup geometry/class、delivery geometry、VALSOU 的交付 presence/值域、WATLEV、EXPSOU、CATOBS/CATWRK、QUAPOS/QUASOU/TECSOU/STATUS、周边 DRVAL1/2 值域、safety contour/depth=3 的 Web 固定参考设置、isolated 结果的证明状态、zoom/category/priority/SCAMIN 证据状态。未交付字段用 UNAVAILABLE,不把它当成源属性 absent。
|
||||
|
||||
- runtime 总数与 manifest 的 DEPARE47516、DEPCNT46189、OBSTRN45633、SOUNDG146728、WRECKS909 逐项相等。
|
||||
- OBSTRN 源 Lookup geometry 为 AREA 的交付 occurrence 有 17,764(其中部分是 outline,7 个甚至是 Point delivery),POINT 有 27,869;没有凭 outline geometry 把 AREA CSP 错算成源 LINE 分支。WRECKS AREA=10,POINT=899。runtime 只处理三个点 source-layer 且要求 Point,AREA/LINE 未被完整消费。
|
||||
- SOUNDG02 的 146,728 次调用可明确映射到 MP-SPLIT 大分支,最终普通 text executor 为 FAIL;SNDFRM02 的具体源质量/单位/字形子路径仍需要完整输入。
|
||||
- LIGHTS feature 中有 357 个 occurrence 带多 presentation 数组;本表 6,889 是 feature 级 CSP 数,不冒充 presentation 数。数组内成员另需源记录与调用顺序证据。
|
||||
- 所有 1,976 签名均有候选 branch_id 列表,只有可由交付 CSP 直接确定的大分支给唯一映射;不得用已输出的 symbol 或 line 反向猜 RESTRN/QUAPOS 等输入。完整唯一映射 Gate F 为 NOT_PROVEN。
|
||||
- 本机只读数据库连接失败:OperationalError2003(未输出凭据);无法对正式 Plan 重放 Source→FID→tile buffer/coverage/scale ladder/association membership。需要恢复源数据库或提供绑定该 Plan 的不可变 source/association/contour 快照。
|
||||
- DEPARE02 在本正式交付中未出现,DA-ALIAS 的 observation_status=NOT_OBSERVED_IN_REAL_DATA、count=0;这不删除源码分支,也不使实现等价变 PASS。UDWHAZ/SOUNDG03/QUAPNT 等是 nested path,不能因缺少同名顶层字段就记为未出现。
|
||||
|
||||
## 10. Resource dependency(Gate G)
|
||||
|
||||
机器产物逐项列出本矩阵所有字面 SY/AP/LC 及 SOUNDG/SOUNDS 动态家族,检查 local XML universe、metadata、sprite key、consumer 和缺失处理。局部 existence PASS 只证明 CM95 资源存在,不证明资源尺寸/颜色/使用次序等价。
|
||||
|
||||
`DANGER53`、`LOWACC03` 的代码引用在固定 O-C 可见;当前 CM95 XML/metadata 不定义这两者,已有同 hash resource contract 报 UPSTREAM_RESOURCE_MISSING。由于唯一固定目录没有 chartsymbols.xml,本轮独立上游缺失证明记 NOT_PROVEN,保留 reported_upstream_anomaly,未补造资源、未把异常隐藏成 PASS。
|
||||
|
||||
固定 O-L:1058–1110 的真实 fallback 是 SY→QUESMRK1、LC→QUESMRK1 并调整 line box、AP→QUESMRK1V;当前 compiler 的 AP fallback 为 QUESMRK1 pattern、LC 为间距80的 symbol layer,不能只凭“都有问号”证明等价。Web DANGER53 是明确 fail-closed 丢弃,不等于 OpenCPN 的问号 fallback。LIGHTS unknown round 的 CHMGD delta3 与上游 delta5 是未经这条上游分支支持的近似。
|
||||
|
||||
## 11. Mariner dependency(Gate H)
|
||||
|
||||
| 参数/上下文 | 上游决定点 | 当前 CM95 | 必须保留到 runtime / 未决 |
|
||||
|---|---|---|---|
|
||||
| safety/shallow/deep contour、two_shades | DEPARE逐条件覆盖 | runtime facts保留深度;Web固定默认且不执行two_shades | 所有阈值+有效域;不能烘焙最终色 |
|
||||
| safety contour、effective contour catalog | DEPCNT、UD、WK | builder局部rows,Web当前loaded tiles | chart/scale identity与完整catalog、association membership |
|
||||
| safety depth、depth unit | SNDFRM02 | Python只有metre;Web普通text | metre事实、原始presence、unit、B1/C2/A1和完整数字链 |
|
||||
| symbolized boundaries/boundary table | RESARE+Area Lookup | 构建时选择Plain/Symbolized | 两表及选择参数;RESARE虽不依赖水深仍是mariner-dependent |
|
||||
| point table | Lookup | 构建时Paper | Paper/Simplified可切换映射;不能宣称全部runtime化 |
|
||||
| display category/priority | Lookup、U、DC及过滤 | Python多加Hazards,Web未promotion | initial/current category/priority分开,副作用有来源;OP按固定parser实际行为 |
|
||||
| SCAMIN/display scale | visibility、CA、MPS | tile zoom非等价SCAMIN,overlay没有相同过滤 | 原值、单位、chart尺度、设置及更新条件 |
|
||||
| height unit/text visibility/collision | _LITDSN01 / TextRenderCheck | LIGHTS标签已静态以m生成 | height事实、unit和文本状态;v1“LIGHTS全静态”不足 |
|
||||
| pixel/mm、display mm、rotation、raster/vector | RenderSY/CARC | CSS96dpi、canvas overlay | 屏幕环境、render backend、资源pivot和缩放 |
|
||||
|
||||
## 12. Render order 与 side effect(Gate I)
|
||||
|
||||
完整返回字符串的有序性、parser 的规则顺序、各 render pass 的实际绘制顺序是三个独立层次。上游 AC/AP 在 area pass,而 LS/LC/SY/TX/CA 在 object pass;不能因 WK 返回 LS→AC 就要求屏幕一定先线后面。当前 source-layer 分组与 priority 分组、MapLibre symbol placement、canvas z-index2 的 CA 与静态层混排缺少完整调度证明,跨对象严格顺序为 NOT_PROVEN。
|
||||
|
||||
已确认的不等价不只是“无法证明”:QL-RADAR 的第二 LS 没有 consumer;hazard 的多 primitive 缺失;RESARE OP 被 Python 实际提升到 Area Symbol,而固定上游 parser 忽略 OP;UDWHAZ 上游仅改 DisplayBase,Python reference 又加 Hazards priority;DEPCNT safe 上游同时 Scamin=1e8+1,CM95没有等价执行。这些分别属于缺失、额外副作用和参数/顺序语义损失。
|
||||
|
||||
## 13. v1 已知问题逐条重验
|
||||
|
||||
| 回归点 | 本轮结果与证据 |
|
||||
|---|---|
|
||||
| OB POINT QUAPNT01 | O-C:1745/1901追加Q,C:591–670缺少,FAIL |
|
||||
| OB OBJNAM TX | O-C:2026统一end追加,Python/JS缺少,FAIL;仅属性存在时需要 |
|
||||
| OB LINE sounding | O-C:1944普通浅VALSOU线追加,Python无,FAIL;低QUAPOS的ToLong异常路径另为NOT_PROVEN |
|
||||
| OB AREA sounding/Q、isolated AREA Q | O-C:1955–2019;Python缺少,FAIL |
|
||||
| WK POINT/AREA Q | O-C:3384–3527;Python未拼接,FAIL;AREA浅深尾顺序是U,Q,S |
|
||||
| Wk TX/WRECKS07 | Python特定POINT分支有;runtime bypass后JS没有,FAIL |
|
||||
| hazard depth text vs SOUNDG | 26个Python、4个JS见证确认普通text不是glyph chain,FAIL |
|
||||
| LIGHTS05→06 | O-C:1034立即return确认;旧不可达LIGHTS05不作branch真值 |
|
||||
|
||||
v2 新增或修正:EXPSOU仅在未知depth读取、_DEPVAL01占位、WRECKS缺失CATWRK/WATLEV不应造主符号、SLCONS LOWACC01/属性presence、限制集合的八进制解码、LIGHTS amber/orange及未知圆半径、描述分组和高度单位、DEPCNT SAFECD/SAFECN及非零高质量分支、OP实际被忽略、AC/AP独立pass、Lookup特殊条件差异。
|
||||
|
||||
## 14. 架构结论(逐项回答任务书)
|
||||
|
||||
1. **存在重复手写条件。** C:44/91/407/591/701 与 W:141/168/249/261/304 分别维护水深、safety contour、isolated与hazard条件。LIGHTS还存在S:346 fallback与C:238两条Python路径。
|
||||
2. **已确认不等价**:OBSTRN/WRECKS/SOUNDG runtime,UDWHAZ EXPSOU/关联分支及promotion,DEPARE bad-range/two_shades/DRGARE,DEPCNT质量/lookup/side effect。静态 SLCONS、RESTRN、RESARE、LIGHTS 的Python翻译也有明确差异。
|
||||
3. **同结构风险**:QUAPOS→QUALIN的多LS、任意多个SY/AC/AP/LC/CA、初始普通规则+CS、multiple CS、组合航标多presentation、LIGHTS文本state/units。局部图像没暴露不是PASS证据。
|
||||
4. **建议建立单一 OpenCPN-compatible CSP Decision IR / Runtime Rule IR**,本轮仅提出审计要求,未实现或更改架构。决策与执行分开,不能只是把现有两个不等价resolver都封装进IR。
|
||||
5. **IR必须保留**:source/dataset/cell/record identity,原始与标准化class/geometry,typed attr presence/value/list,Lookup候选/选择/table/初始INST/DISC/DPRI,关联DEPARE/DRGARE身份及geometry/DRVAL1/2和选择范围,contour catalog/scale/SCAMIN,所有mariner设置快照与generation,nested call provenance、branch predicates,ordered opcode/完整参数/资源引用/原sequence,side effects和作用阶段,text/colocation状态及单位,screen-mm/pivot/rotation/backend。未知值不能降为0或空集合后冒充等价。
|
||||
6. **通用executor**可分阶段调度SY、TX/TE、AC、AP、LS、LC、CS及经实际基线证明的state mutation;SOUNDG/MPS glyph组合、CA screen-mm、复杂线/图案、文字布局仍需专用renderer。OP必须先建模“该固定parser忽略”的兼容语义,不可凭规范意图给它新增优先级效果后宣称等价。
|
||||
7. **压缩字段**:s52_symbol_code/area_color/area_pattern_code/line_complex_code/line_style为first scalar;s52_line_sequence、symbol_rule_sequence虽部分保留但compiler不通用执行;s52_rule_opcodes仅名字无参数;text1..3截断数量;s52_text_literal只留首literal;runtime hazard_symbol/depth_text丢失链;surrounding max/min丢对象身份和primitive,无法替代association条件;多CSP的dict.update可能覆盖之前语义。
|
||||
|
||||
## 15. 验证、限制与完成清单
|
||||
|
||||
本轮临时扫描/见证/文档生成器均放 `/tmp`;较大扫描与验证经 build-output-throttle 执行,日志留 `/tmp`。没有运行或新增 Jest,没有修改冻结 importer,也没有理由重跑MySQL导入全库验收。JSON及Markdown结构/证据行号/文件范围/输入哈希以专用只读验证脚本检查。
|
||||
|
||||
| 任务书必做项 | 完成情况 |
|
||||
|---|---|
|
||||
| 固定源码SHA、HEAD、工作区 | 完成;25项PASS,13项既有文件哈希记录 |
|
||||
| 正向Object→Lookup→CSP→Rule→primitive | 完成;Gate A及上游parser实际异常明确 |
|
||||
| 12组branch matrix | 完成组合式206记录;不声称所有笛卡尔输入均实测 |
|
||||
| nested graph、逐branch ordered sequence、opcode consumer | 完成;宏展开定义、断点、26+4见证、JSON引用 |
|
||||
| 正式real-data | 全5064文件完成扫描;源级唯一branch覆盖未完成证明,原因/所需证据见Gate F |
|
||||
| resource/mariner/render order/DisplayBase | 完成检查;独立上游资源定义和全局调度仍NOT_PROVEN |
|
||||
| v1回归点 | 全部重新落到固定源码;已纠正若干过度概括 |
|
||||
| v2报告、v2标准、机器JSON | 本轮仅此三项正式输出 |
|
||||
| 产品/registry/Jest不改,既有修改不动 | 输入哈希复核及Git显式路径隔离 |
|
||||
| 任务书逐项回看 | 1–25各节均有对应;F/G/上游UB与屏幕行为证据不足公开记录 |
|
||||
|
||||
后续需要的证据是:可读的正式源数据与FID对应、绑定Plan的空间关联/contour catalog快照;在固定基线目录之外不可自行补入的新上游资源版本;明确GL/DC和显示环境的规则执行轨迹;逐branch IR输出与consumer参数/次序记录。缺这些证据时继续NOT_PROVEN,不以截图或粗粒度capability替代。
|
||||
|
||||
## 16. Git 交付记录
|
||||
|
||||
审计输入 HEAD:`1a07406e6e11fde0425f81b54c7f4a3d2aff6d49`。交付分支为 `main`,推送目标为 `origin/main`;提交消息为 `docs: complete OpenCPN code-first S-52 equivalence audit`。
|
||||
|
||||
提交范围仅含本报告、v2 审计标准和机器可读 JSON 三个任务输出。审计输入 HEAD 与交付提交 HEAD 分开记录;交付提交自身的 hash 不能写入自身内容,实际 commit hash、commit message 与 push 结果记入本轮最终完成报告(会话最终回复),以 Git 实际结果为准。
|
||||
Reference in New Issue
Block a user