feat(icon): 轨迹时序指纹修复 —— 1ms 图标 4/8→7/8=0,errorCode 语义与轨迹对拍收口

- 真因:dt 分布与真机严重不符(旧 50% 落 0~16ms,真机 79% 落 13~20ms)+ 点数
  随机 57~65(真机 6/6 恒 61)。按 6 条真机轨迹重拟合 _sample_dt,新增 _fit_points
  钉死 61 点(补齐用 [0,0,dt] 驻留点,不能复制位移点——净位移会被放大)。
- A/B:1ms 图标 0×4→0×7(前 7 连 0);残余偶发 12 为连发频控形态,低频使用即可。
- errorCode 语义标定:50=答案被否(容差实测 25~40px,我们点偏仅 2~3px),
  12=包级拒答;判点位只看 50/0。
- 顺带修 build_plain:轨迹落末槽(k=37)时 chunk2 恒补前导逗号 → 非法 JSON。
- 新增 scripts/verify/send_campaign.py(批量真发+落图+统计)与 judge_icons.py
  (提示目标 vs 点击点并排判读);账本 #64~#74 + 专文 ICON2408.md。

复验:selftest 全绿;判读图 24/24 点位全对;mliev 图标 9/10=0。
This commit is contained in:
yml2213
2026-10-12 14:32:14 +08:00
parent 6a8b3b3ce4
commit 74a863c8b3
9 changed files with 752 additions and 35 deletions
+12 -3
View File
@@ -12,7 +12,11 @@
用法:
.venv/bin/python scripts/verify/send_test.py
.venv/bin/python scripts/verify/send_test.py --mode python_keyed # 对照组:旧模板回填
.venv/bin/python scripts/verify/send_test.py --kind icon # 2408 图标点选
.venv/bin/python scripts/verify/send_test.py --kind slider # 2401/2402 滑块
注: `--mode` 只剩 `python_values` 一种 —— 模板回填 / Node 兜底两条老路已整体删除
(它们产生的 collect 与本次会话构建不同源,在真实 aid 上必然 errorCode=12)。
"""
import argparse
import json
@@ -42,8 +46,8 @@ KIND_MAP = {
def main() -> int:
ap = argparse.ArgumentParser(description="1ms 签到页文字点选 · 真实发送测试")
ap.add_argument("--mode", default="python_values",
choices=["python_values", "python_keyed", "python"])
ap.add_argument("--mode", default="python_values", choices=["python_values"],
help="遥测生成方式(只有 python_values:纯离线按本次会话构建生成)")
ap.add_argument("--kind", default="text", choices=list(KIND_MAP),
help="只解哪种题(默认 text=文字点选)")
ap.add_argument("--max-refreshes", type=int, default=12)
@@ -76,6 +80,11 @@ def main() -> int:
seen["traj_tail"] = json.loads(traj)[-1]
except Exception as e: # noqa: BLE001
seen["segments_err"] = str(e)[:120]
try: # 失败时落盘,便于事后解剖
open("/tmp/send_test_fail.b64", "w").write(out["collect"])
open("/tmp/send_test_fail.txt", "w", encoding="latin1").write(plain)
except Exception: # noqa: BLE001
pass
print("[hook] %s" % json.dumps(seen, ensure_ascii=False))
return out