Commit Graph
100 Commits
Author SHA1 Message Date
cbb cad8bb44f0 exp: 轮次38(补)——steps=8 时限0.324/行程比1.87继续变好但到达仍0.41;顶部摘要刷新到当前口径并加候选清单 2026-10-20 21:59:19 +08:00
cbb f42d3d756f exp: 轮次38(补)——steps=4 末态误差0.135mm最优但仍被拒80次/题;失败分类证明缺口是走一半被冻住(63/109) 2026-10-20 21:57:02 +08:00
cbb b9548d6cb1 docs: 探索日志改为倒序——最新一轮在最上面(内容守恒断言:除说明行外一行不许多或丢) 2026-10-20 21:55:15 +08:00
cbb 2079164cac docs: 轮次38——改正我自己写的(B)假设:线上安全层只做点检不含位移界;并记下 DAgger 采集同样是一步口径 2026-10-20 21:52:46 +08:00
cbb e7d1a39519 exp: 轮次38——两段推理开环更贴老师、行程比更近1,但闭环到达降14.8pp:瓶颈移到安全层拒绝率 2026-10-20 21:51:54 +08:00
cbb 3b8682a345 feat: 目标写法开关 mf_target(mf/lin/sq/mid),默认 mf 且原地路径逐位不变;float32 接线用解析高斯场自证 2026-10-20 21:48:28 +08:00
cbb 78786881e7 test: 轮次37(补)——解析高斯场给目标写法做不动点判决:sq 权重只线性收敛(结构性少修一半),lin/mid 二次收敛 2026-10-20 21:44:50 +08:00
cbb a4cac354ea exp: 轮次37——K-MF 方案核查:Eq.7 抄法不动点不自洽(1.87×),一步输出比自身2段采样离老师远10倍 2026-10-20 21:38:40 +08:00
cbb 349814db7e exp+feat: 轮次36(续)——时间账证明限幅后的损失是"站住"不是巡航;全拒缩步顶上(backoff,默认关) 2026-10-20 21:25:47 +08:00
cbb f23f6fc93f exp: 轮次36——规划起点 r 分布实测,循环内共享 FK(#19) 在部署 r3 口径只值 0.03 ms/次,判掉 2026-10-20 21:16:27 +08:00
cbb ee7fe829ac fix+exp: 轮次35(补)——gaps/gm_groups 拒绝行数不符的 xf;撤回两次不存在的"合并调用"收益
- 探测脚本把认证点当成与特征无关的已知量,据此测出的 共享cum_xf −4.3ms / 合并一次调用 −8.1ms
  都不成立:真实顺序是 特征(q)→推理→候选→认证点,同一次规划内既不能共享 xf 也不能合并 gaps
  只有轮次34 已落地的 gm_groups 复用同姿态 xf(−3.4ms,22项指标逐位不变)是真的
- 守卫:xf 行数与 q 不符时抛错(之前会静默按别的行做宽相位,实测触发 CUDA device-side assert)
- 测试 34→35 项;check_parity 仍 PASS(2000样本,间隙差 2.52e-13 mm、碰撞布尔差 0、特征差 5.96e-08)
2026-10-20 21:06:35 +08:00
cbb 296cd17f98 exp: 轮次35——FP16/BF16与流水线复用都被实测否掉,f32认证需先抬eps到2e-4
- 显卡精度档(B=1,K=8,steps=1):推理 FP32 7.68 / FP16 8.31 / BF16 8.58 ms,整周期不变而FP16 P99 46.6→55.6;
  动作偏差 FP16 0.0050°、BF16 0.0377° ⇒ 该批量下不是算力受限,保持 FP32
- float32 认证:48段×9点×15组对的间隙差 max 1.32e-4 mm(有1例高估)→ 现 eps=1e-4 已被越界,要用需 ≥2e-4;
  判据结果两边一致(各24接受、0 仅f32安全、0 符号翻转),暂不放宽 dtype 守卫
- 流水线复用特征间隙:第一版42.1→31.8ms 但等价性检查不过(我取缓存行索引取错,差3.19mm);
  修正后只剩 −3.1ms 且缓存行与新算差 6.3e-5mm(不同 batch 的结合序)⇒ 放弃
- 顺带修掉轮次34日志里重复的章节标题
2026-10-20 21:01:04 +08:00
cbb 34019c1a34 perf+exp: 轮次34——复用cum_xf进库(22项指标逐位不变)、批量认证压最坏尾部(80→37ms)、FP16/BF16实测无收益
- 撤回一条自己的假收益:先前"合并几何查询→24.5ms"不成立。①第一版把 xf= 传给含5行的 gaps,
  只有第0行走完宽相位,认证点全部退回截顶40.0(少干活);②真实顺序 特征→推理→候选→认证,
  认证点依赖网络输出,故"特征间隙与认证点合并一次调用"实现上做不到
- 可实现并已落地:gm_groups(..., xf=) 复用 features 已算的 cum_xf,B=1 交错实测 P50 −3.4ms;
  256题重跑 22 项指标与轮次33 base 逐项相同
- 新增 --cert_batch(默认0不变):K条候选并成1次 gaps 调用。合成夹具(B=2)断言选择/轨迹/证书逐位一致,
  变异检查(换回错误索引)2项测试立即失败;256题重跑同样 22 项指标逐位相同
  实测交换:典型 33.5→37.6ms,最坏(前面候选被拒)80.2→37.1ms,P99 64.7→48.3ms
- FP16/BF16 实测不比 FP32 快(推理 7.68→8.31→8.58ms),整周期不变而 P99 更差,动作偏差 0.005°/0.038°
  → 小批量下不是算力受限,半精度不划算,推理保持 FP32
- 仍不达 20ms:下一刀是流水线复用(下次规划的特征间隙=本次已认证的末点),可整块省掉特征 ~13ms
- 测试 32→34 项
2026-10-20 20:53:43 +08:00
cbb 48cc566c3f exp: 轮次33——限幅实测要付5.1pp到达(57.4→52.3%);GPU真实周期36.7ms≈27Hz,瓶颈是重复几何而非推理
- 四组单变量对照(同256题同seed):base / inc_cap / gap_margin 0.5 / 两者同开
  限幅后 到达 0.5742→0.5234、time_ok 0.3906→0.2656、2s误差比 0.210→0.279、超VMAX 1.0→0.0、刹停几乎不变
  → 之前那部分到达率是超速换来的;损失在逼近末段,不在刹停
- 0.5mm 余量门只付 3 题(0.5742→0.5625);但 plans['gaps'] 在 0.5mm 截顶,5mm 护栏可达性需抬 cap 重算
- 前提更正:eval_cl 不传 steps、rollout 默认 steps=1(policy.py:156 一步生成),先前按 steps=16 得到的
  "当前配方 116ms≈8.6Hz" 作废;真实配方 36.68ms P50 / 49.17ms P99 ≈ 27.3Hz
- 归因更正:空算子 0.028ms、空 sync 0.005ms、encode 2.27ms → 不是启动/同步地板;
  单步推理仅 7.2ms 且 K=1→8 免费,周期里 ~27ms 是 cum_xf+宽相位的重复计算
- certify_uniform 挂上后 36.7→45.3ms(n=8)/49.6ms(n=16)
- kin_torch 补 a/b 形状守卫(脚本里广播不一致会算错 view),测试 30→31 项
2026-10-20 20:32:19 +08:00
cbb 6ecd33db0c exp: 轮次33(上)——实际执行速度做成一等指标并自证;默认路径逐位复现第30轮,256题全部超VMAX
- rollout 逐题记录 max|Δq|/STEP(1.0=VMAX)与每步速度变化比;eval_cl 汇总 p50/p95/max、over_vmax_rate
- 自证:用 round30_after trace 独立重算得 1.660004×VMAX、超速度占比 1.0,与新指标逐位一致
- 默认参数下 base 复现第30轮 after 的每个旧指标(0.57421875/0.390625/19.25/2.444952726/0.209975064 等)
- 新开关 inc_cap(反馈叠加后再按每轴 VMAX·DT 限幅)、gap_margin(余量门限+自动抬宽相位 cap,
  否则现 cap=0.5 会让 >0.5 的余量恒假);col 仍按 gap<=0 判真实碰撞,不与余量混用
- 只读核查:ik-policy.js:355 同样在 ±1·STEP 之后叠加反馈;JS 的 5 mm 余量是投影式护栏,非同机制
- 口径提醒:round30 plans['gaps'] 在 cap=0.5 截顶,不能据此算"≥1mm 占比";中位最小间隙 0.046 mm 可用
- 测试 26→30 项(限幅灵敏度、余量拒/受、cap 抬升生效)
2026-10-20 19:48:23 +08:00
cbb c6b46b8bb1 exp: 轮次32——均匀细分认证一次调用可证段内碰撞,界经720项检验未证伪,但P50≤20ms的档只能证出54~63%
- certify_uniform:固定 n 个子段一次 gaps 调用,判据与二分同源(子段界=整段界/n),证不出即拒
- 确定界反证:48段×121点×15组对=720项检验 0 违例;有信息量仅 61 项,最紧仍高出 0.035 mm
  (是"未能在真实运动上证伪",不是证明;浮点误差仍未形式化)
- 第180题 1.08-1.10s 漏检段在每个 n>=8 均判碰撞;二次加密(2n+1)反证 0 误放行
- 更正轮次31的"自适应cap无收益":旧公式 bound/2+eps 会把本可通过的子段钳成不可证;
  改为 bound+2eps 后交错实测决策不变、快 1.36~1.65x(n=8 13.13→9.68,n=128 98.46→59.76 ms)
- 负结论:只有 n<=16 能把认证压进 20 ms,但该档仅证出 26-30/48 根,其余必须刹停;
  成本=log(bound/间隙) 决定,故下一步要在反馈后限幅并让安全层要求正余量(现 cap=0.5 会截掉余量)
- 测试 23→26 项:n=5拒/n=6受的解析对照、cap_required 公式、n 张量类型门
2026-10-20 19:30:02 +08:00
cbb 6de085fd37 exp+fix: 轮次31——确定界连续认证抓到段内碰撞,但单段P50 22.9ms进不了20ms;自适应cap收益经交错复测撤回
- Kin.cert_lever 用三角不等式给全姿态位移界(替代 JS 随机采样×1.05),界量级 5.93–48.86 mm/整步
- Kin.certify_segments 批量前沿二分+每根查询预算:48 固定段中预算32判安全37/碰撞1/未知拒10,
  第180题1.08–1.10s漏检段以5次查询判碰撞;未知只拒不放
- 修 seg_seg_dist 第二条退化成点不投影(模型内退化胶囊686受影响);但7586个加密点的组最小间隙
  逐位不变、2000样本JS对拍仍 PASS → 不解释轮次30漏检、不改既有成绩
- 负结论:B=1 单段认证 P50 22.93/P90 58.43/P99 101.57 ms,432次中225次>20ms;
  自适应宽相位 cap 交错复测耗时无收益,先前1.6×为GPU顺序漂移,已在日志撤回
- 成本模型 L=ceil(log2(bound/(ga+gb)))、查询=2^L+1 与实测对齐(安全段2–17次,未知段33–65次)
- 新增8项段认证测试+1项回放测试(14→23项通过);变异实测证明张量 max_depth 回绕会误放行
2026-10-20 19:13:40 +08:00
cbb 95da49193f fix+exp: 轮次30——统一认证与执行限位,到达57.4%不变;加密回放仍检出段内碰撞 2026-10-20 17:26:20 +08:00
cbb 9eaff7341f exp: 轮次29——全拒后减半反馈到达55.1%,补齐无碰撞指标与首撞回放
512题无碰撞到达54.7%、碰撞1.8%;9次首撞均在J5限位且双精度复现。保留小样本消融,撤回未经实际调度验证的50Hz达标结论,附六项回归测试及完整配置结果。
2026-10-20 17:06:53 +08:00
cbb ce9edd7934 exp: 端点进度选择——commit2 到达 52.1%/time_ok 35.2%(n=512),ratio2s 0.343→0.285;附带 50Hz 饥饿实测
- select='endpoint'(候选块末态离目标最近)优于 consist:n=512 到达 +1.3pp、time_ok +6.3pp、ratio −0.058
- 负结论:safety_try 1/2(41.4/44.9%)、K=4(47.3%)、DLS 兜底(52.3%/碰撞+1.1pp)、增益调度(47.3%)
- JS Runner:endpoint 选择落地、冷启动跳前瞻;starveTicks 指标;commit2 平均空转 0.8–1.3 tick,commit3 可覆盖
- route40 endpoint:12/20 ok、13/20 到达、刹车 40.4%
2026-10-20 15:48:31 +08:00
cbb d977be321b exp+fix: commit2 增益重扫(gain2.2 到达 50.8%,n=512)+ 浏览器安全层三点修复(限位夹紧/部分前缀/离散认证)
- gain 1.8/2.2/2.5/2.8 = 50.4/52.0/49.6/47.7%(n=256),2.2 最佳;n=512 复核 50.8%/1.4% 碰撞
- 积分反馈与反馈隔次复用均为负结论(−4.0/−5.1 pp)
- JS:tick/候选投影夹 LIM(原越限后 inBox 永久拒绝→刹停);safety_partial 移植;segCert 开关(默认严格)
- bench nc10 --seg 0:刹车率 79.5→48.1%、planP50 56.1→33.5ms、ok 0→5/10
2026-10-20 14:23:59 +08:00
cbb 46fe24365b perf+exp(closed_loop): 解析雅可比 DLS(消除 float32 差分数值噪声)——commit3 到达 36.3→46.5%,commit2 49.2%(n=512),DLS n1 9.3→7.1ms
- Kin.jac 几何雅可比,与 autograd 逐项一致(FD 自身 rel 误差 3.58%)
- dls_steps(analytic=True) 默认;每步少 6 次批量 FK
- 新增 ml/eval/eval_cl.py(部署口径小规模评估)与 check_dls.py(对拍+延迟)
- 积分反馈 fb_ki 脚手架(默认 0,未启用)
2026-10-20 13:33:23 +08:00
cbb 7e99b333ea exp: 轮次25——实时节奏(commit3)准确率:候选平均29.7%/冻结编码器34.4%/commit4 28.9%,均低于基线36.3%;效率:ORT CPU推理3.9ms+gm_groups,单次规划~32ms,50Hz异步可行 2026-10-20 12:49:37 +08:00
cbb 79519b042c perf+exp: gm_groups 只算特征 8 组(数值一致,features 10.4→7.1ms);混合节奏负结论(执行反馈无提升);浏览器部署 dag2 ONNX + fbGain/commit 参数(bench 刹车 47% 待调);实时口径改为异步规划+tick 2026-10-20 12:38:56 +08:00
cbb 3b748c811c perf(closed_loop): DLS 批量雅可比(25→10-17ms,数值差≤0.013°)+ 单题安全层早停;实时评估:单次规划 40-80ms 超 50Hz 预算 2-4 倍;实时节奏下每3步 36.3%、每6步 14.8%(每步 42.2% 不可实时) 2026-10-20 12:20:31 +08:00
cbb 26eb0815c2 exp(dagger-deploy): 轮次22——冻结编码器微调(开环保住15.8mm vs 19.5)但部署到达41.8%仍低于dag2 43.8%;训练侧四种方法均未超基线,训练探索到此平台 2026-10-20 10:10:25 +08:00
cbb 7a8e5aab63 exp(dagger-deploy): 轮次21——DAgger-3(部署配置采集500题+15000步微调)负结论:部署口径 39.5% vs dag2 43.8%,开环退化到19.5mm;下一步试冻结编码器只调解码器 2026-10-20 09:41:44 +08:00
cbb bb919d33c9 exp(dagger-deploy): 轮次20——反馈蒸馏(17.7万样本+3000步微调)负结论:gain=0 时到达仅0.8%(反馈未内化),gain1.8 与基线持平(43.4 vs 43.8) 2026-10-20 08:42:29 +08:00
cbb ff160f576e exp(dagger-deploy): 轮次19——APG 修复两个既有 bug(_cat_gaps in-place、段边界 queue.detach 无梯度)后可跑,但碰撞铰链尺度失控(40万)且与部署形态不一致,暂不采用;转反馈蒸馏 2026-10-20 07:56:58 +08:00
cbb 5675159987 docs(探索日志): 分支清理记录——fb-mix 已并入 exp/dagger-deploy 后删除;abs-target 打 archive tag 后删远端分支 2026-10-20 07:40:16 +08:00
cbb 39c870c1cf exp(dagger-deploy): 轮次18收尾——n=512 gain1.8 到达42.2%/碰撞2.9%/ratio0.270/time_ok29.1%/870ms(历史最佳);保守版 gain1.5 40.8%/2.1%;探索日志统计更新 2026-10-20 07:23:16 +08:00
cbb 7be41cb1ad exp(dagger-deploy): 轮次17——每步规划下 gain1.8 到达 43.8%/碰撞1.6%/ratio0.216/time_ok28.9%(新最佳);gain2.2/3.0 时间效率更高但到达降、刹停暴涨(3.0:123次/题过冲) 2026-10-20 07:12:59 +08:00
cbb 6c2af53d18 exp(dagger-deploy): 轮次16——n=512 稳定:每步规划+部分前缀 到达40.8%/碰撞2.1%/ratio0.309/time_ok25.0%/852ms(历史最佳,较基线 0% +40.8pp) 2026-10-20 06:57:25 +08:00
cbb f5f394a4bf exp(dagger-deploy): 轮次15——每步规划(commit_n=1):到达 41.8%、time_ok 21.5%(+57%)、ratio 0.259、碰撞 2.3%、967ms(新历史最佳);修复 ok6 视图硬编码 2026-10-20 06:47:00 +08:00
cbb 76ac563d21 exp(dagger-deploy): 部分安全前缀(执行到首个不安全步)——刹停 27.4→8.6、到达 38.3%、碰撞 1.6%;新增 commit_n 参数(每步规划实验);更正 replan=empty 实为 r=0 规划非每步 2026-10-20 06:26:31 +08:00
cbb de009bd516 exp(dagger-deploy): 轮次12——n=512 稳定:gain1.5+每步重规划 到达33.4%/碰撞1.0%/ratio0.399/刹停28.1/738ms(历史最佳);gain1.2 保守版 32.6%/1.0%/18.6 刹停;监控页回写已验证 2026-10-20 05:51:11 +08:00
cbb 29f3887be1 feat(monitor): 控制台新增「闭环探索日志」卡片——/api/explore 读取 docs/探索日志.md,Edge headless 截图验证渲染正常(http://127.0.0.1:8100) 2026-10-20 05:35:42 +08:00
cbb fe48b4e777 exp(dagger-deploy): 轮次11——n=256 复核(前128题偏难):gain1.5+每步重规划 到达36.7%/碰撞1.6%/ratio0.323/刹停27.4/760ms(新最佳);gain1.0 更保守 31.6%/0.8% 2026-10-20 05:34:40 +08:00
cbb 4de5e03a0b exp(dagger-deploy): 轮次10——每步重规划下 gain1.5 达 28.9%/0.8%/0.411/刹停28.5/844ms(新最佳);gain1.0 碰撞 0.0% 但到达 22.7%;待 n=256 复核 2026-10-20 05:24:20 +08:00
cbb 5f2cbd5179 exp(dagger-deploy): 轮次9新历史最佳——每步重规划+gain1.2:到达 26.6%、碰撞 0.8%、ratio 0.453、刹停 20.6、845ms(K=16 无益淘汰) 2026-10-20 05:15:01 +08:00
cbb 2ff02eb9a8 exp(dagger-deploy): 轮次8——部署分布 DAgger 把刹停降 18-40%、时延 953→922ms,到达 22.7%(未破 23% 平台);历史最佳到达仍 dag1+gain1.2 23.4% 2026-10-20 05:05:47 +08:00
cbb dc27781a72 exp(dagger-deploy): 采集支持 fb_gain+safety(训练分布=部署分布);新增 base_dag2 配置(同 base) 2026-10-20 03:40:15 +08:00
cbb 8e5431c460 exp(fb-mix): 轮次7负结论——衰减增益到达 23.4→9.4%、刹停兜底碰撞 1.6→57.8%(绕过安全层);参数默认关闭,历史最佳仍为 gain1.2 无衰减无兜底(23.4%/1.6%/0.454/973ms) 2026-10-20 03:09:21 +08:00
cbb b06662c152 exp(fb-mix): 目标反馈混合(inc += gain·DLS 朝目标)——DAgger 模型 + gain 1.0 + 安全层 reach 20.3%/碰撞 2.3%(历史最佳,此前 0%);建立 docs/探索日志.md 2026-10-20 02:40:12 +08:00
cbb 70654e45f7 docs(本机执行清单): 方案 B 初版实测(feat/abs-target 分支)——绝对目标标签 + 训练/执行适配完成并修复前缀增广污染;实测一步生成误差 31°(4/8 段 2.3°/2.8°)、闭环 0%/100%,过预热 5000 步无下降趋势——此配方不成立,B 若继续需改 p_edge/FK 权重/加权或换输出头 2026-10-20 01:03:45 +08:00
cbb fc17ae10d0 docs(本机执行清单): 方案 B 判别——偏移 3.19° 下模型预测的 16 步累计目标偏离原轨迹 4.86°(ρ=1.54;未扰动开环仅 0.46°),扰动微调后 ρ 更差(1.9-2.0);结论:模型是从当前状态外推增量而非指向参考位置,B 必须改训练标签(绝对目标)重训,改执行层无效 2026-10-19 23:14:30 +08:00
cbb 2f5a72a6ab docs(本机执行清单): 方案 A 实测(两轮)——合成 1.5° 扰动状态样本 36k + 微调 3000 步:碰撞率 99.6%→48%/60%,但 success 仍 0、开环精度 6→15/16mm 退化 2.5×;小步微调在两种分布间折中带偏主分布,此配方不成立 2026-10-19 23:11:06 +08:00
cbb 7a194dd4a7 docs(本机执行清单): 回答「加大数据能否救闭环」——闭环状态到训练集最近邻中位 21.5°(起点 13.2° 的 1.6×,p90 32.5°);训练集本身稀疏(老师起点最近邻 13.2°);6 维密度缩放数据翻 4 倍只降 ~21%,与 0.02° 误差尺度差三个量级——扩大同类数据救不了,需 DAgger 覆盖分布外状态 2026-10-19 22:45:39 +08:00
cbb a41a5440c6 docs(本机执行清单): DAgger 小样本试跑通过——collect 16 题 12.7s/29 起点,64 题显存峰值 7.98GB 无 OOM;老师重规划 15 起点 7.6s、打包 2.3s(453 样本);提醒 build_dataset 默认 act_scale=1.25 与旧主数据 1.0 不一致,全量前须显式 ACT_SCALE=1.0 或先重打主数据 2026-10-19 22:19:24 +08:00
cbb 864b21f894 docs(本机执行清单): 发散题分组——三组(r2>1 / 0.7-1 / ≤0.7)碰撞率均 79-83%、到达全 0,无「一小撮坏题」可筛;r2 与起点误差秩相关 -0.384 是分母效应(短任务比值波动大),与老师时长/行程无关;误差放大是全体普遍行为 2026-10-19 22:16:39 +08:00
cbb b396298819 docs(本机执行清单): 补充实验——开环误差无轴向偏置(|mean|/std≤0.17)但 lag-1 自相关 0.93-0.97(慢变误差,非白噪声);闭环 p50 2s 缩 41%、p90 发散到 1.318(≥10% 题误差复利);结论:慢变误差 × 闭环低容忍,训练侧需闭环状态训练 2026-10-19 20:31:48 +08:00
cbb 53a50ecab9 docs(本机执行清单): 本地自主排查——闭环噪声容忍上限 0.01-0.02×STEP(σ 扫描 0→0.05 时 reach 1.0→0.218);8 段采样 reach 仍 0(flip 已=老师、无抖)→ 策略误差是系统偏差非白噪声,降噪已到天花板;need 头恒 <0.5(>0.5 占比 0、召回 0/43)=闭环子目标通道从不激活(H3 三变体逐位相同的直接原因),训练 80% sf=1 vs 闭环 100% sf=0 2026-10-19 20:21:02 +08:00
cbb 425229f412 docs(本机执行清单): 第六轮执行回传——H1_oracle 全正常(仿真无误,闭环结果可信);σ=0.05 噪声 reach 1.0→0.218(对残差噪声极敏感);前缀照抄、子目标规则均排除;H3 三变体逐位相同=子目标通道零响应(新异常);4 段采样消抖后仍 0% 到达 2026-10-19 19:18:07 +08:00
cbb 7e063eb3d5 本机改动:归档早期闭环碰撞定位脚本 diag_collision.py(已被 diag_cl 取代) 2026-10-19 18:46:39 +08:00
cbb 86323f1691 docs(本机执行清单): 第五轮执行回传——一致性错位修复未改变闭环结果(C 段仍 0%/99.6%,2s 误差比 0.755);G 段:consist/value/first 三选择器几乎一样(0%/94-96%)——问题在候选本身不在选择;1step 速度比 2.31×、4step+safety 碰撞降到 0.78% 但到达仍 0% 2026-10-19 12:40:16 +08:00
cbb 0a19b29fd3 docs(本机执行清单): 第四轮执行回传——F 段证实一步采样残留噪声(抖动 41.9×、残差-噪声相关 −0.861),2/4/8 段分别把 16 步误差降到 0.92/0.86/0.56°;但闭环 4 段仍 0% 到达(碰撞 93.0%、2s 误差比 0.610)、零噪声 0%/100%/0.724——残留噪声真实存在但非主因 2026-10-19 03:37:00 +08:00
cbb cafa038110 docs(本机执行清单): 第三轮执行回传——gaps 三行全 1.05 GiB 通过(默认不拼胶囊对生效,峰值=单粗块水平);E0 排除抄速度(抹 dq 幅度仅降 2.7%,且开环/起点幅度系统性 1.44-1.52×);E1 中段带老师速度与静止起步都 0% 到达/96-98% 碰撞(误差比 0.627 vs 0.829)——非起步问题;新观察:幅度系统性偏大 1.4-1.6× 2026-10-19 03:07:49 +08:00
cbb 9a7404856e docs(本机执行清单): 第二轮执行回传——gaps 1.05/1.40/4.46 GiB(前两条过线;4096x40 峰值全在顶层 _cat_gaps 拼接,parts 与输出 8.63e7 对同时存活 2.25+2.25 GiB);diag_cl 含 D 段:D1 no_sub 与 D2 oracle_sub 都是 0% 到达/99.6% 碰撞,与基线一致——子目标不是元凶;C.goal_err_ratio 2s 仅靠近 18.5% 2026-10-19 02:43:26 +08:00
cbb 1f2f2a2bb1 monitor: 开环指标两张图;pstate: train 归档加 review_* 2026-10-19 02:33:46 +08:00
cbb 95ba43a1c7 docs(本机执行清单): 执行回传——第1步 gaps 显存三条 1.20/9.30/9.30 GiB 未过(峰值全在粗筛段,精算分块有效但救不了粗筛;旧版同测 4.59/16.98/36.89);第2步闭环定位 A/B 全过(特征口径差≤3.6e-6)、C 段 0% 到达/99.6% 碰撞、主碰撞对 J3-J5 90次、开安全层碰撞压至 5.5% 但到达仍 0.4% 2026-10-19 02:29:51 +08:00
cbb 5365add657 Merge commit '573082d' 2026-10-19 02:02:55 +08:00
cbb 0b47905a1c feat(prep/monitor): 打包每 10% 打一行进度 + 监控按实测算进度/ETA;prep 估时 0.5→2.0 h
- build_dataset.cjs:每 10% 打 `[prep] shard_xxxx a/b`(只加日志,不改计算)。新增广
  (40%/3°/12,每个增广样本 6 次碰撞检查)让这批打包从上次的 25 分钟涨到约 1 小时,
  而原来整片完成前一行输出都没有,看起来像卡死。
- monitor.py prep 分支:解析这些行,按 (已完成分片 + 进行中分片的任务比例)/总分片 算 frac,
  按实测速率外推 eta;首批完成前显示"首波处理中,第一批完成后显示预估"。
- pstate/monitor.html:prep 估时 0.5 h → 2.0 h(超时 1.5 h → 6 h),与实际耗时一致。
2026-10-19 00:33:11 +08:00
cbb 0d522dd782 feat(monitor): 开始训练弹窗视觉重做 + 进度卡片「重新训练」按钮 + 记住上次设置
- 弹窗:头部图标/标题/说明、分区标题(运行方式 / 模型与数据)、下拉统一自绘箭头与焦点环、
  每个控件加提示行、警告条改成左侧色条的信息块、取消改 ghost 按钮;宽度 560→780。
- 进度卡片加「⟳ 重新训练」(运行中禁用并提示先停止),点开即预设"从 train 重训"。
- 记住上次设置(localStorage mlmon.pref.v1):起始阶段/CFG/共识/N_TASKS/NPROC/TARGET_SAMPLES/
  ROUNDS/MIN_GAP_MM/平滑/对数轴。运行方式不记忆——记成"全部重跑"会把数据一起归档,风险不对等。
- ?start=<阶段> 直接打开重训弹窗(便于收藏与脚本化验证)。
- 端到端验证(CDP 驱动无头 Edge):改 fT/fFrom/smooth → 刷新 → 三个值都保留,fMode 复位 resume。
2026-10-19 00:11:13 +08:00
cbb c2732fb3cd feat(train/monitor): 评估峰值不再撑爆整卡 + 从指定阶段重训 + 闭环误差诊断
- train.py:evaluate 改 bs=64,结束后 empty_cache()。WDDM 下 15.9 GiB 的评估峰值用完不退,
  整卡顶到 96% 后驱动把训练张量换出(实测 Local 18.8 GB / Shared 1.9 GB),吞吐从 5.5k
  掉到 444 samples/s、8000 步 eval 卡死 68 分钟;改后峰值 5.32 GiB、eval 106 s、吞吐 6.4–7.0k。
- pstate/pipeline:新增 --fresh-from=<阶段>:只把该阶段及之后的产物移进 ml/archive/(不删),
  与参数失效取并集;配合 FROM 实现"只重训某一阶段,之后全部重做"(沙盒实测选 train 只归档 ml/runs/base)。
- monitor:运行方式加「从指定阶段重训」+ 起始阶段下拉;TARGET_SAMPLES 默认改 200 万;
  「最好 X%」改标最好那次 eval 的步数(原来错标当前步,18,000 步显示成 0.2% 的出处)。
  连同工作区已有的停止补扫 sweep_nt(按命令行补杀 git-bash 下逃逸的孙进程)一并提交。
- eval/diag_tail.py:闭环末位误差 / 是否进过 5 mm 窗口的逐题诊断(手动运行,不进流水线)。
2026-10-18 23:15:53 +08:00
cbb 7fe1e5e0b3 feat(monitor): 失败提示做醒目——顶部红色横幅(阶段名 + 返回码 + 终端里最后一行真实报错,如 OutOfMemory 那条)+ 右上角胶囊变红「失败 · 停在「预训练」返回码 1」+ 步骤条那一格红字加粗;并补三层"永不空白"保险:正文脚本前装看门狗(3 秒没跑完就显示"卡片空白不是训练出问题")、window.onerror 显示出错文件与行号、渲染调用 try/catch 让单个面板出错不拖垮整页;同时修掉我上一轮写坏的 JS 字符串(Python 转义把 \n 写成真实换行 → 整个脚本不执行 → 页面全空,就是用户看到的"失败时什么都不显示") 2026-10-18 19:43:24 +08:00
cbb 3c4bc6c8ab fix(vram): 上限不再从 nvidia-smi 的"已用"里扣——WDDM 下那部分驱动可换出,按它扣会把本进程上限压到 14.45 GiB,预训练第一次 evaluate 峰值 ~15 GiB 就自己 OOM(实测当时卡上还有 9.98 GiB 空闲);改成上限 = CUDA 可用 − 1 GiB(实测 21.8 GiB),别人占多少只打印不扣;实测分配 15.5 GiB 通过;顺带删掉 monitor.html 里被塞进模板字符串、当成文字渲染出来的 JS 注释(剩余时间那格) 2026-10-18 19:18:41 +08:00
cbb 4a59ca84f6 feat(monitor): 每个阶段都按实时数据算剩余时间,用时精确到秒——打包按已打包分片数、预训练用脚本自报 eta_h、APG 用 it/min、挖错用本轮 APG + 已完成轮次平均时长、头门禁用已完成那次评估、一致性门禁读日志里的 k/300 行(只读日志尾部,不占 CPU);修 mine 的当前轮判断(原来 len(cur)>k 在第二轮起永远判不到在跑)与 APG 漏加的 eta;总用时/本步用时/步骤条用时改为带秒,预估仍只到分钟 2026-10-18 17:59:46 +08:00
cbb faf6dd2748 feat(monitor): CPU 卡加温度和功耗——走 MSI Afterburner 的共享内存(MAHMSharedMemory):Windows 上免驱动的唯一口子(psutil 不支持、ACPI 热区只有板温、Power Meter 无实例);实测 CPU 98-100 °C / 222-227 W,用 GPU1 power 对 nvidia-smi 校准过(125.29 vs 124.57);数据比 10 秒旧就当读不到、Afterburner 没开就自动隐藏这两行;28 核条悬停可看每核温度 2026-10-18 17:31:05 +08:00
cbb b1cf4126fd feat(vram): 显存上限改为浮动——本进程上限 = min(整卡 − nvidia-smi 已用 − 1 GB 余量, CUDA 空闲 − 余量),别人占多少自动扣掉,不再写死 0.78(实测当前口径 14.1 GiB;VRAM_FRAC 仍可显式对拍旧口径);网页显存行改成"8.7 / 23 GB · 空 14.3"并把解释放悬停(长文本不再把行挤成两行,.gr 行加了省略号保护);README/审查文档同步口径 2026-10-18 17:23:57 +08:00
cbb e431862793 feat(gen): 补量轮次上限 4 → 5(应用户要求:共识 + 间隙两道过滤叠加时 4 轮余量偏紧);顺带把末尾那句"补 4 次后仍不足"的提示同步成 5 次 2026-10-18 17:16:55 +08:00
cbb c65b9986ca feat(monitor): 当前阶段进度放大——「当前步骤 · X」的百分比 20px 加粗、阶段进度条 14px 高(原来 12.5px/8px 太小);顶部步骤条当前格的百分比也放大加色;顺带把已完成格子的「用时」改用累计值(续跑的阶段不再只显示最后一段) 2026-10-18 17:13:35 +08:00
cbb db0bbbc15d feat(monitor): 用时改为按阶段累计——"总用时"=各阶段之和、"本步用时"=该阶段累计,停止后再"继续训练"不再归零(训练跑 5 万步停一次,之前那段的时间会保留);只有产物被归档、要从头重做的阶段才清零;本次改动前完成的老记录用 start/end 兜底;停止与流水线退出两处记账幂等(实测 180 s 不翻倍) 2026-10-18 16:59:21 +08:00
cbb 21ad209747 feat(monitor): CPU 卡显示型号(psutil 只给核数,型号走注册表 ProcessorNameString / Linux /proc/cpuinfo),加在卡底与 GPU 同名同位置 2026-10-18 16:15:44 +08:00
cbb c143b56232 fix(gen): 被停止的种子不再报"失败"——按日志尾部有无报错分类,中断走 143(网页显示"已停止"),只有 node 真报错才 exit 6;顺便修补量分母累加:target_tasks 改用 stats.json 的已写完条数 + 本轮补量,此前每次点停止再"继续训练"分母都再加一截(实测 67368→84728),进度条越续越少 2026-10-18 15:24:43 +08:00
cbb 83dcc1c3ee fix(monitor): CPU 占用读数改为后台每秒独立采样(此前在请求里算差值,网页 1 秒轮询会把窗口压成几毫秒 → 恒为 0);CPU 并进 GPU 同一个卡(上 GPU 环+显存/温度/功耗,下 CPU 环+28 核逐核条)
实测:空闲 16.8% → 14 个满载循环 71.7% → 结束 19.1%,随负载单调;截图复核合并卡排版正常。
2026-10-18 15:13:37 +08:00
cbb 9ed213417b feat(monitor): 网页加 CPU 占用卡(总占用环 + 28 核逐核条),psutil 采样缓存 1 秒;顺便重启控制台让之前的补量进度口径与停止补杀生效 2026-10-18 13:57:48 +08:00
cbb e6418da084 fix(monitor): 补量时进度条显示全量而不是从 0 开始;停止时补杀 Git Bash 逃掉的 node 孙进程
- gen 进度:分子改为统计全部分片(含之前轮次),分母仍是累计 target_tasks,补量时显示 50,008/79,688 并标注「本轮补 N 条」。此前只统计本轮开始后改过的文件,看起来像从零重跑。
- 停止:taskkill /T 在 Git Bash 下只杀到 bash,node 孙进程会逃(实测点了停止还有 28 个 gen_dataset 在跑)。按命令行补扫 gen_dataset.cjs / run_parallel.sh / teacher.cjs / policy_bench.cjs 并 Stop-Process;正则已验证命中 gen、不误伤普通 node。
2026-10-18 13:54:16 +08:00
cbb 241333c213 fix(pstate): 改 TARGET_SAMPLES 不再作废 gen 的已有分片——只重跑 gen 补量(run_parallel 跳过写完的 shard、按差额补量),prep 及之后仍作废;此前把它当"从 gen 作废"会让 5 小时生成的 5 万条分片被整体移进 archive,用户改目标样本量就得从头跑 2026-10-18 13:50:12 +08:00
cbb c128288c1b fix: gen 判定改按产物而不是 wait 退出码——实测 28 个种子跑 5 小时后全部 wait 报失败,但每个 .part 都是完整的 1786 行(node 打了 done、mv 没执行),Git Bash 长跑后 wait 返回码不可靠;现在只要 .part 行数达标就补改名并记成功,只有产物缺失/不全才算失败。另:监控页 1 秒轮询(并行取 status/job/runs + nvidia-smi 缓存),GPU 数字 2 秒缓存。 2026-10-18 13:48:30 +08:00
cbb b25a7a8bfa fix: pipeline.sh run() 回显改走 stderr——gate1 用 tee 把 stdout 存成 consistency.json,回显混入让 gen 读 CONSENSUS 时 JSONDecodeError 停在 gen(第一次真跑实测:kin/r4/gate1 rc=0、gen rc=1);文档记门 1 实测 0.838<0.9 → 自动走共识分支 2026-10-18 07:23:29 +08:00
cbb c175357b72 docs: 训练定名「Transformer 多峰策略端到端训练与浏览器部署」——写入 ml/README 标题与控制台顶栏(含浏览器标签),长跑时打开网页即见;截图复核排版未挤坏控件 2026-10-18 06:40:26 +08:00
cbb 8ad6b58fca ml: 显存预算按 19–20 GB 落地 + ort 本地副本入库 + R4 复跑(feat_dyn)通过
- 显存:APG batch 128→48(实测 d=192 下 128 无论 plans 60/150 都 OOM,崩前已分配 17.85 GiB;48/plans150=13.08、48/60=7.67);新增 ml/common/vram.py 每进程硬帽 VRAM_FRAC=0.78 并把 vram 峰值写进 train/APG 日志、监控页加「显存峰值」卡与按 20 GB 预算的显存条;smoke.json 补 apg 段并让自检带 --config。
- 自检修复:find_bash 兼容便携版 git 的 mingw64 布局(本机原返回 None → 网页「开始训练」起不动);selftest_proc.alive 读中文 tasklist 的 GBK 崩溃;rec 值非法 JSON 时静默丢项;gen_resume 判据剔除 plan_ms/cert.ms 两个墙钟字段(旧判据恒 false)。整轮重跑 7/8 通过、3.5 分钟,仅 train_term 为 Windows 真实限制(TERM 送不到原生 python)。
- vendor: onnxruntime-web 1.20.1 本地副本入库(约 33 MB),查看器与 R4/R9 探针不再依赖 npm/CDN;.gitignore 同步移除该目录。
- docs: 第八节 R4 复跑(feat_dyn 新模型):部署口径 P99 12.67 通过;WebGPU 首次实测 27.09(有界面窗口,adapter nvidia ampere);viewer_ref 随机模型 planP99 131 / starve 32.7% / lookaheadP99 170 / certFailWhy time 948 / tickGapMax 736,三条判读留给实现方。
2026-10-18 06:40:25 +08:00
cbb b6141d237c fix: R4 探针页 tensor 复用(proxy 下 buffer 被 detach)+ pipeline.sh 7 处 GBK 读取 + r4 分支返回码;r4 端到端 rc=0
- webapp/r4_probe.html:feat 移进 run() 每次新建。proxy=1 时 ORT 把输入 transfer 给 Worker,旧写法第二次 run 报 Tensor size(83) vs data length(0),两种 proxy 配置全挂、r4.json pass=null。
- ml/pipeline.sh:7 处 json.load(open(...)) 补 encoding='utf-8'(:90 :110 :118 :127 :136 :138 :144)。r4.json 以 ensure_ascii=False 写出,Windows GBK 下 :110 实测 UnicodeDecodeError,命令替换为空会让上层分支走错。
- ml/pipeline.sh r4:末行 `[ "$r" = null ] && echo` 在 r=pass 时整体返回 1,set -e + EXIT trap 把通过的 r4 记成 rc=1(all 会因此停)→ 改 if/fi。
- 实测复跑两次:pass=true,部署口径(16 线程+proxy+enc_once)P99 10.22 / 11.25 ms,4 线程 13.58/13.64,无 proxy 9.28/10.92,webgpu 仍 backend not found。
- 文档同步:A 组两处标记已修,仅留 A-3(ortLocal+proxy 离线路径)交实现方。
2026-10-18 06:40:25 +08:00
cbb a1ee7d1a4d docs: ml 审查精简版(763→85 行)——删去前五轮已解决条目,只留:R4 实测基线(部署口径 P99 11.07 通过、查看器 infer/safety 30.4/61.6+63.5/248.8)、A 组三处会断流程(r4_probe.html 复用 detached tensor、pipeline.sh 7 处 GBK json.load、ortLocal+proxy 离线路径失效)、B 组三项待判(R4 双口径、safetyMs Node vs 浏览器两把尺/R9 无数据、WebGPU 零数据)、C 组六项未实测(6–13 步、gapDrop、R2 池无关性、R8 出题耗时、Windows 生命周期、续跑本机复核)、D 组 webapp/models/README 过时 2026-10-18 06:40:25 +08:00
cbb 3675fbbd9b docs: ml 审查第四轮(对 14d72a9 与训练控制台)+ R4 实测——控制台 N-7 并发无锁(守卫只看 log.jsonl,gen/prep/m5/bench 阶段失灵,二次生成用同名 shard 互相截断)、N-8 开始/停止无 Origin 校验(本机网页即可停掉长跑)、N-9 每次刷新全量重读 shard、N-5 r4 与真模型同名同路径、N-10 console.bat 用 where python 判存在且不带 conda 环境、N-16 gen 节拍被重定向吞掉且 C 类采样 for(;;) 无上限;修法按完整流程分层(状态机可续跑/入口互斥且脱离控制台/门槛改自动分支/阶段超时心跳);R4 随机模型实测 batch=8:4 线程 P50 33.2 P99 37.0(要求 <15,差 2.4×),16 线程 13.7/19.5,24 线程反而劣化,闭环倍率未采到(主线程已挤到 CDP 取不到槽),故 K 与重复 encoder 是必改项;附 .gitignore 忽略 20 MB 级模型产物 2026-10-18 06:40:24 +08:00
cbb 5348bc6f6f docs: ml 运行手册审查追加第二轮(对修订版 d3b7c7b 的可行性评估,只读代码未跑):13 条处置表(R10 阈值/共识补量/头分目录/$PYTHON/三口径/exec_s 置 None/池只用本轮/fp32/验收汇总 已落地);新引入问题 B1~B8——3 mm 是靠放松运行时投影迁就数据分布(正解在认证侧过滤老师样本,属需拍板的安全决定)、APG 端点+中点 hinge 使碰撞项约 ×2 而 w_col 未重标且 plans 60→150 单步代价上界 ~4× 而 §8 估时未改、check_r2 空匹配取 quantile 会抛且默认 20万×2万 池峰值 2–3 GB 显存、gate R7 左右比例以到达为条件会漏报多模态被压缩、r8 集合起点未查贴柱「两侧都要绕远」名不副实、§2「实测 7.6 s」是 300 条口径而流程跑 2000 条、R4 wasm batch=8 P99 至今没测;结论:1–6 步可执行、7–13 步零证据,第 7 步前先结 R4 并单独拍板 margin 2026-10-18 06:40:24 +08:00
cbb 8800a68cad docs: ml 运行手册审查(本机 3090 实测):训练吞吐 6208 样本/s 与方案 R10「≥2万/s」冲突;共识过滤分支缺期望数字、WTA 回退覆盖 ml/runs/base 丢对比物、run_prep 用 python3 在 Windows 第5步末失败;仿真安全层≠ik-policy 运行时(M5 穿柱率与 bench collisionFrames 两把尺)、挖错题 exec_s 写死 3.0 致到达率不可比、APG 仅 3.6 s 定长且只查端点、老师 minGap p50 4.4 mm 压在 5 mm 训练余量下;含复现命令与按优先级改动清单 2026-10-18 06:40:23 +08:00
cbb 67964496be fix(ik): 贴立柱目标不再误判为立柱区内:候选表分层保留 + 姿态放宽兜底 + 实时管线跨帧坏边/目标解优先/预算递增/半格复验;新增贴立柱基准 tests/near_column_bench.cjs 2026-10-18 06:40:22 +08:00
cbb 1dfdd48792 refactor(viewer): 截图视图 107 砍到 31,docs/shots 改为纯生成落点并取消跟踪
根因:以前只删图没用,一次性机位还挂在 arm/viewer/shot.py 的 VIEWS 里,
关卡一跑就在 docs/ 里原地复活 104 张。

- 删 76 条历史排查视图:user_*(17)、boss_p04..p07、hollow_p0x、p03_light_*、
  p03_mount_*、bay_p0x_inside(含重复键)、tie_probe/after_*、j3_前端压盖_*、
  view_yz_*、svg_*、p04/p05/p06/p07_*_side、zoom_user、shot_p08_user 等
- 保留 31 条真正在验查看器本身的:13 个机位/爆炸/姿态 + 9 个工程图·向导·运动模式
  + 9 个线束(含 3 个 x-ray)
- docs/shots 从跟踪里摘掉并写进 .gitignore;docs/ 现在只剩 json/svg/md/html,没有位图
- 基线同步为 20 张逐字节 + 11 张容差,与视图集合一一对应(无孤立基线、无缺基线的视图)
- 修我自己在上一步改 shot.py 时误删的 os.makedirs(SHOTS, exist_ok=True)
  —— 目录不存在时 Edge 写不出 PNG,31 个视图全报 FAIL 0 字节

未做:完整关卡复核(截图两遍 + IK + 数据 md5)尚未跑,这次提交只保证名单自洽。
2026-10-15 12:26:08 +08:00
cbb 11205f81c7 chore: 编辑器残留与脚本自动备份取消跟踪,文件全部留在磁盘
- .bak/ 12 个 *bak20261005*/20261007 旧备份:.gitignore 第15行早就写了 .bak/,
  但跟踪优先于忽略,所以一直没生效——这次用 git rm --cached 摘掉才真正排除
- .trae/documents(2) / .workbuddy/memory(3) / .zcode/config.json / .zcodeignore:
  别的编辑器与助手的本地配置、会话记录,不是工程产物
- 定位图/ 整目录改为忽略:它只是"给用户看的核验图落点",一次性且会被反复清空,
  关卡比对的权威物在 tests/baselines/(md5 名单 + flaky 参考像素),不依赖这里
- .gitignore 里 "可用 src/ 下的脚本重新生成" 的注释同步改成 python -m arm.*

只动索引不动工作区:19 个文件仍在磁盘上(唯一不在的是已被外部删掉的屏幕录制 mp4,
现在取消跟踪后不再脏 status,历史里仍可取回)。
2026-10-15 12:10:27 +08:00
cbb 8cf830493e chore(docs): 清掉过期核验图与一次性排查图,两份手写 HTML 移入 docs/
判据=既不是 arm/viewer/shot.py 当前视图、也不在 tests/baselines/ 关卡比对里、
且不被 README/docs/webapp/arm/tests 任何文本引用。

- docs/shots 删 133 张 + docs/section_p01_seam.svg,共 16.47 MB;剩 105 张
  正好等于关卡覆盖面(92 稳定 + 13 容差),基线文件零缺失
- 定位图 删 63 张历史落点,共 9.12 MB;只保留用户录屏 mp4
- 线束走线与总线拓扑设计方案.html / 螺丝采购清单.html 从仓根移入 docs/(逐字节相同,按 rename 记录)

关卡:数据 10 项 md5 一致、IK exact 逐字节一致、92/92 逐字节 + 13/13 容差全过。
2026-10-15 12:07:50 +08:00
cbb e79cfd8e8f chore: 清掉本轮排查用的临时截图(关卡证据已在 tests/baselines/ 与 docs/shots/) 2026-10-15 05:21:21 +08:00
cbb f713355351 refactor(viewer): app.js 按职责切成 8 个普通脚本(纯切片,零语义改动)
state / harness / camera / pick / ui / sheets / render / urlparams。
经典脚本的顶层 const/let 落在同一个全局词法作用域,所以切片本身不改变任何行为——
这一步先让"文件边界"与"模块语义"两件事分离:翻 ESM 时若出问题,责任清楚在
import/export,而不是切片切错了行。

切片踩到并修掉的:urlparams.js 被切掉了 IIFE 的收尾 })();(我按 len-2 收边界),
node --check 当场报 Unexpected end of input。

截图基线分级也在这一步收敛:工程图/装配向导视图带 feGaussianBlur 发光滤镜,
同一构建两轮就有 ±1 抖动(先前扫描那两轮碰巧逐字节相同,才漏进"稳定"清单,
于是随机假 FAIL)。把 8 张工程图/向导视图连同 3 张线束 x-ray、boss_p07、
p03_mount_loose 一起转像素容差(存参考像素,阈值 mean<=0.02、单像素<=32,
约实测 20x 余量),其余 92 张仍要求逐字节相同。

关卡:92 张逐字节一致 + 13 张在噪声阈内;数据哈希与 IK exact 段一致。
2026-10-15 04:45:56 +08:00
cbb 531a293688 refactor(viewer): 单文件查看器拆成 webapp/ 多文件,走本地 http;Worker 换成真文件
前端不再是"一个 16MB HTML + 一个 2955 行模板"。现在:
  webapp/index.html      343 行 DOM 骨架,零内联数据
  webapp/styles/*.css    811 行 CSS 按段切成 8 个文件
  webapp/js/app.js       原内联主脚本逐字搬出(仍是普通脚本,S5 才改 ESM)
  webapp/js/ik-solver.js / ik-glue.js / vendor/three.min.js(原 web/ 三个文件)
  webapp/workers/ik.worker.js  真 Worker 文件
  webapp/generated/00_data.js  生成物(网格/工程图/行程/碰撞/螺钉)
  dist/机器人手臂3D查看器.html  分发用单文件,由 build_viewer 内联上面这些文件产出

入口:python -m arm.viewer.serve 后开 http://127.0.0.1:8123/
(serve 带 no-store,改完刷新即新构建,不再需要 Ctrl+F5;显式 MIME,
 .js 被 Windows 注册表判成 text/plain 会让模块静默不执行)

删掉 src/viewer_tpl.html 与 web/ 目录(旧产物移入 backups/pre_split_20261015/)。
工程图不再维护第二份 sheets.jsdata —— 直接读 draw_sheet 写出的 4 个真 SVG。

实测中修掉的问题:
- serve 的 / 原先"内部映射"到 webapp/index.html,导致文档基址是 /、相对路径的
  8 个 CSS 与 4 个 JS 全部 404(整页无样式无脚本)。改成 302 跳转。
- file:// 下 new Worker('workers/…') 构造阶段不抛错、错误以异步 onerror 到达,
  所以"构造失败才试 Blob 兜底"永远不会触发;改为按协议选路。两条路径都已实测
  backend=worker(http 走文件、file:// 走 Blob)。
- Worker 握手 3s 在 headless 并发下会误判"没起来"(截图里红徽标即此),放宽到 10s,
  并把后端状态暴露成 window.__IK_BACKEND / __IK_BACKEND_LOG 供测试直读。
- 截图竞态:4 并发 × 每页 14MB 数据时,虚拟时间预算会在页面加载完成前到期,
  拍到半初始化画面(且能"稳定地坏",旧基线里 m9_motion 就是这么混进来的)。
  并发降到 2、预算 40s、serve 加 HTTP/1.1+大缓冲+字节缓存,并用"同一构建两轮"
  重新界定稳定性:99 张逐字节一致、6 张属噪声改走像素容差(mean<=0.02、单像素<=32)。
- 关卡自身两处假通过已修:node 输出被 GBK 解码炸掉时不再算 PASS;
  线束干涉测试读不到通道源码时会 exit 2,而不是"零通道=零穿透=通过"。

关卡结果:python -m arm.build_model 退出码 0;10 项数据哈希与基线一致;
IK exact 段逐字节一致;99 张截图逐字节一致 + 6 张在噪声阈内;线束干涉测试 1800 点 0 穿透。
2026-10-15 04:31:31 +08:00
cbb 649bd69810 refactor(layout): src/ 收成顶层包 arm/,入口统一 python -m;提升承担构建的 scratch 脚本
单文件约束取消后,Python 侧没必要再靠 16 处 sys.path.insert 维持扁平模块互认。
现在按职责分包:
  arm/paths.py 路径唯一来源(含新增 CACHE、TPL)
  arm/constants.py 实测接口数值(原 armcore 的 M/C/CLR/FIT/MOTOR_TOL 段)
  arm/cad/{helpers,arm_build,part_tools,parts/} 几何与装配
  arm/kinematics.py(原 human_layout.py,唯一运动学事实源)
  arm/analysis/{sweep_v2,strength_check,torque_balance,finalize_travel,ws_sweep,gen_env_mesh}
  arm/dataio/{screw_mesh,draw_sheet}   arm/viewer/{build_viewer,shot}
  arm/build_model.py(原 arm_model.py)

顺带修掉的既有缺陷(都是实测撞出来的,不是预防性改动):
- arm_model 第二次 sys.path 跳到 gitignore 的 scratch/ 去 import 构建必需的包络脚本:
  ws_sweep/gen_env_mesh 提升进 arm/analysis/,缓存挪到 data/cache/(gitignore,可重生成)。
- finalize_travel / draw_sheet 顶层就是"算完写文件",一次 importlib 冒烟测试就把
  docs/travel.json 重写了一遍;现在被 import 直接抛错。
- strength_check 用 OUT.replace("/out","/web") 靠字符串形状推路径,改成直接用 WEB。
- build_viewer 里 WORKSPACE 使用点漏改导致 NameError —— 已由构建关卡抓到并修掉。

os._exit 的处置与计划里的假设相反:实测光是 `python -c "import arm.cad.helpers"`
就会在解释器退出时段错误(exit 139,OCC 静态析构),全流程跑完也一样。所以入口
脚本尾部保留 flush + os._exit,并把原因写进注释;被 import 时不生效。

关卡(tests/):
- verify.py 一条命令跑三层:产物 md5、IK 数值 exact 段、截图。
- 截图基线重做并分级:同一构建连跑两轮实测 102 张逐字节可复现(要求 md5 相同),
  3 张线束 x-ray 不可复现(mean<=0.0017、无像素差>8)改为与参考像素比容差;
  这 3 张不再入库,免得每次跑关卡都脏 git。
- 新增 ?view=sheet / ?sheet=N / ?theme / ?guide=N 四个 URL 参数:工程图与装配向导
  占了约一半 CSS 和 700 行 JS,原先没有任何截图覆盖,拆它们等于没有关卡。
- 关卡灵敏度已验:改坏 IK 基线一个数 -> FAIL;换旧版求解器 -> 5 处 exact 差异。

实测:python -m arm.build_model 退出码 0,全部产物 md5 与基线一致,
105 视图截图全过,IK exact 段逐字节一致。
2026-10-15 03:31:20 +08:00
cbb b32d44efe0 test: 加 IK/数据/截图三重基线关卡,并刷新过期的截图基线
重构 2955 行的单文件查看器必须有"行为没变"的可判据,否则改到什么程度全靠感觉。
tests/ik_baseline.mjs 在 Node 里直接跑求解器(它本就是 UMD,带 module.exports 分支,
不需要浏览器),输出分两段:
  exact  —— 件数/顶点/三角、TCP 推断、限位、固定 FK/fkChain/orient、固定目标的
            solveDyn 解向量、selfTest/poseSelfTest 的误差与命中数。selfTest 内部走
            Math.random,这里锁成定 LCG,所以 exact 跨进程逐字节可复现。
  timing —— solveDyn 中位耗时(9 次去头 3 次预热)。本机进程间抖动实测约 ±28%,
            因此只按 ±10% 报 WARN,不当硬门。
关卡灵敏度已验:指向 scratch/arm-ik-solver_before.js 时报 5 处 exact 差异并 FAIL。

docs/shots/ 里 92 张是 10-09 生成的,早于 10-14 的重建,属过期基线;重跑 96 视图
全部 OK、0 FAIL。另发现既有非幂等问题:committed 的 mesh 是"端到端构建后再单跑一次
screw_mesh.py"的产物(螺钉 idx 118..214、ENV 件排在第 19 位),端到端构建则为
20..116、ENV 排在末尾,两者零件集合相同但顺序不同,导致 2 张线束透视图的透明排序
像素级不同。本提交以端到端构建为准。
2026-10-15 02:24:38 +08:00
cbb 7e040fc766 refactor(paths): 路径改由 __file__ 推导,不再写死 G:/Robot_v2
armcore.py 里 ROOT/WORKSPACE/OUT/WEB/DOCS 与三个外部 STEP 输入原本是硬编码
绝对路径,仓库换个盘符就全断。改成由本文件位置推出(REPO.parent 即原
G:/Robot_v2,行为逐字不变),并留 ARM_WORKSPACE / ARM_ROOT / ARM_MODEL_ROOT
三个覆盖入口。保持正斜杠输出,因为 strength_check.py:162 的
OUT.replace("/out", "/web") 依赖这个形状(该写法本身也在这次重构中清掉)。

实测关卡:连续两次 python src/arm_model.py 产物逐字节相同;
travel/collide/screws 三个 JSON 与基线 md5 一致。

同时加 pyproject.toml 声明元数据与运行依赖(不装包,入口用 python -m)。
2026-10-15 02:23:55 +08:00
cbb b67d3ce56e chore(repo): 停止跟踪 47MB 构建产物
单文件查看器不再是交付约束,就不必再把 14MB 网格与 3 份 16MB HTML
背在 git 里。取消跟踪(磁盘文件保留),重建产物不再脏 git status,
后续每步重构的关卡才能靠哈希比对而不是"看哪些文件又变了"。
2026-10-15 02:23:41 +08:00
cbb b0efb44368 feat(arm): 建模代码拆成每件一模块,查看器新增工程图与装配步骤页
- src/parts/p01~p09 + src/part_tools.py:几何、件号/配色/说明与装配帧归属随各自件文件走,arm_model.py 只留装配流水线并对件级符号做只读转发;P04_CH / P07_CH / P06_WIN_XZ / FENCE_OPEN_CUT 这类开关必须写所在件文件,写 arm_model.X 不生效,A/B 判据为翻转后体积变化
- docs/sheet_{exploded,front,side,joint}.svg + draw_sheet.py:四张工程图进查看器页签,支持图层开关、件号高亮与 BOM/3D 联动跳转
- travel/travel_detail/collide/bom/screws 随最新几何重生成;补线束走线、拆卸定位点与 P04 承压面剖切验证图
- .gitignore 排除 .bak/ 与 *.bak_* 源码快照(旧版本 git 历史里已有)
2026-10-14 22:03:18 +08:00
cbb c754521bde feat(arm): 线束走线可视化落地,并修复承压面盒切误伤底壁
- 查看器新增线束/走线指示系统(4芯主干、电机出线分支、过关节缓冲环、T接小板),
  配套《线束走线与总线拓扑设计方案》文档与 src/test_harness_collision.py 干涉校验
- 取消 P04/P06/P07/P08 的敞口侧定位环盒切(俯仰关节局部坐标使切刀上侵底壁 3mm,
  平白造出 3x6.1mm 缺角),底壁补齐;盒切仅保留原本专用的 P05(M3),开关改名 M3_FENCE_OPEN_CUT
- 3MF 基准 profile(537 键)从手作原件抽出固化到 docs/bambu_profile_reference.json,
  导出链路不再依赖 out/ 二进制;P01_A 也改由当前模型生成,原件备份进 .bak/
- strength.json、BOM、screws、截图与三份查看器 HTML 同步重生成
2026-10-07 19:08:47 +08:00