Files
DCU_DesktopController/docs/compose/spec/revisions/host-code-quality_REV_2026-10-19.html
T

26 lines
9.9 KiB
HTML
Raw Normal View History

2026-10-20 21:27:39 +08:00
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>host-code-quality.md 修订附录 2026-10-19</title><style>
body{font-family:-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;margin:0;background:#f5f6f8;color:#1d2330;line-height:1.6}
.wrap{max-width:1180px;margin:0 auto;padding:28px 24px 60px}
h1{font-size:26px;margin:0 0 6px}h2{font-size:20px;margin:36px 0 12px;padding-bottom:6px;border-bottom:2px solid #d9dee8}
h3{font-size:16px;margin:22px 0 8px}
.meta{color:#5b6476;font-size:13px}
.card{background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:16px 18px;margin:12px 0}
table{border-collapse:collapse;width:100%;background:#fff;font-size:13px;margin:8px 0}
th,td{border:1px solid #e1e5ec;padding:6px 8px;vertical-align:top;text-align:left}
th{background:#eef1f6;font-weight:600}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:#f0f2f6;padding:1px 4px;border-radius:3px;word-break:break-all}
.sev{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff;white-space:nowrap}
.s0{background:#b3261e}.s1{background:#e8710a}.s2{background:#3367d6}.s3{background:#5f6b7a}
.kpis{display:flex;gap:12px;flex-wrap:wrap}.kpi{flex:1;min-width:130px;background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:26px}
.issue{background:#fff;border:1px solid #e1e5ec;border-left:5px solid #ccc;border-radius:8px;padding:12px 16px;margin:10px 0}
.issue.s0b{border-left-color:#b3261e}.issue.s1b{border-left-color:#e8710a}.issue.s2b{border-left-color:#3367d6}.issue.s3b{border-left-color:#5f6b7a}
.issue h4{margin:0 0 6px;font-size:15px}.issue dl{margin:0;display:grid;grid-template-columns:72px 1fr;gap:3px 10px;font-size:13px}
.issue dt{color:#5b6476}.issue dd{margin:0}
.st{white-space:nowrap;font-weight:600}.st-ok{color:#1e7e34}.st-part{color:#b26a00}.st-open{color:#b3261e}.st-na{color:#5f6b7a}.st-old{color:#6b4fbb}
pre.arch{background:#1f2430;color:#e6e9ef;padding:14px;border-radius:8px;overflow:auto;font-size:12.5px;line-height:1.45}
a{color:#2457c5}
.note{font-size:12.5px;color:#5b6476}
</style></head><body><div class="wrap"><h1>《host-code-quality.md》修订附录 2026-10-19</h1><div class="meta"><a href="../host-code-quality.md">原报告</a> · 核对基线 commit <code>eac3717</code> · 总评审:<a href="../../../review/DCU_DesktopController_专家评审_2026-10-19.html">DCU_DesktopController_专家评审_2026-10-19.html</a></div><div class="card"><b>原报告:</b>上位机代码质量评估(冗余 / 复杂度 / 屎山风险)<br><b>时间线:</b>status: delivered,2026-09-23(27a8fc1 → 83a035c)<br><b>原结论概要:</b>综合约 3.5/5;P0 服务端风险已落地,电机前端回滚后只外提 scope/seq/ota;R4~R7 部分/未实施。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>HQ-R1</td><td>非幂等不自动重发</td><td class="st st-part">部分修复</td><td><code>ecat_client.py:58-62, 290-299, 418-436</code></td><td>HTTP 代理已遵守;ESF1 快发重试违反同一原则(P-2)</td></tr><tr><td>HQ-R2</td><td>网卡默认 I210</td><td class="st st-ok">已修复</td><td><code>ecat_proc.py:28</code></td><td></td></tr><tr><td>HQ-R3</td><td>跨进程互斥/复用</td><td class="st st-part">部分修复</td><td><code>ecat_proc.py:67-94, 125-140</code></td><td>锁超时/CreateMutexW 失败仍继续执行(P-4)</td></tr><tr><td>HQ-R4</td><td>拆 main.js</td><td class="st st-part">部分修复</td><td><code>js/motor/main.js(3254 行)</code></td><td>仍为上帝文件(M-18)</td></tr><tr><td>HQ-R5</td><td>版本/参数下沉</td><td class="st st-open">仍未实施</td><td><code>—</code></td><td></td></tr><tr><td>HQ-R6</td><td>ECAT bootstrap 单点</td><td class="st st-part">部分修复</td><td><code>js/motor/transport-ecat.js:418-441; js/common/ecat-bus.js:65-75</code></td><td>电机侧仍自算周期并绕过预算(M-6)</td></tr><tr><td>HQ-R7</td><td>toast/quiet 去重</td><td class="st st-open">仍未实施</td><td><code>js/can/send.js:17</code></td><td>CAN 侧还出现 toast 双实例(C-9)</td></tr><tr><td>HQ-R8~R14</td><td>服务端拆分与卫生</td><td class="st st-ok">已修复(大部分)</td><td><code>ecat_client.py; ecat_proc.py; docs/reports/</code></td><td>但 .qoder/.zcode 入库(H-1)</td></tr><tr><td>HQ-R15</td><td>README</td><td class="st st-part">部分修复</td><td><code>README.md:3, 190, 449</code></td><td>个人路径与默认周期描述过时(H-2、H-4)</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s0b" id="P-2"><h4><span class="sev s0">致命</span> [P-2] ESF1 快发在 sendall 成功后出错仍整包重发</h4><dl><dt>模块</dt><dd>主机服务/安全</dd><dt>位置</dt><dd><code>ecat_client.py:247-279</code></dd><dt>现象</dt><dd>_tcp_once 持锁 sendall(body) 后读 8 字节 FSOK;recv 超时/断连抛异常时 attempt 0 会 continue,attempt 1 再发同一 body。与同文件非幂等不重发原则(_ECAT_IDEMPOTENT_TAILS)矛盾。</dd><dt>风险</dt><dd>同一帧运动指令被 native 入队两次,电机执行两次增量/相对命令。</dd><dt>修改建议</dt><dd>仅当 connect 阶段失败时重试;sendall 之后的任何异常直接返回 ok:false(可附 maybe_sent 标记)。</dd></dl></div><div class="issue s1b" id="H-1"><h4><span class="sev s1">严重</span> [H-1] AI 工具目录被提交</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>.qoder/repowiki/(约 75 个文件); .zcode/plans/plan-sess_*.md; .gitignore</code></dd><dt>现象</dt><dd>.qoder 自动生成的知识库与 .zcode 个人调试计划(含 G:\ 路径与固件计划)入库,且未列入 .gitignore。</dd><dt>风险</dt><dd>仓库噪声、信息泄露、与真实代码不同步误导读者。</dd><dt>修改建议</dt><dd>移出仓库(需用户决定,本次评审不删除任何文件)并加入 .gitignore。</dd></dl></div><div cl