Skip to content

feat: 易用性圆桌评审 8 条 backlog 落地 + 2 个真机 bug 修复 - #54

Merged
currycan merged 2 commits into
masterfrom
feat/usability-roundtable-backlog
Jul 11, 2026
Merged

feat: 易用性圆桌评审 8 条 backlog 落地 + 2 个真机 bug 修复#54
currycan merged 2 commits into
masterfrom
feat/usability-roundtable-backlog

Conversation

@currycan

Copy link
Copy Markdown
Owner

背景

对项目做了一轮多角色易用性/可用性评审:5 个用户画像(抢票小白/技术资深/高频抢票党/多设备运维/风控安全敏感)圆桌发散 43 条痛点(每条落到文件级证据)→ 产品经理聚类为 7 大主题、16 条 backlog → 技术经理 triage 出 8 条 implement-now(本 PR)、7 条 plan-only(待真机验证窗口)、1 条 defer。

本 PR 落地的 8 条

🔒 资金误操作防护链(P0)

ID 内容
U-01 真下单唯一授权改为 --commit 旗标;--yes 直接 exit 1 + 可复制迁移命令;确认词闸门(输入 GO 或 keyword 原文)不可被 --yes 跳过;下单摘要 + 3 秒倒数;--probe --yes 老命令行为零变化
U-02 入口脚本未知参数 fail-fast:--porbe 等 typo 一律 exit 1,不再静默吞掉直达真下单;prompt_runner 关闭 argparse 前缀缩写
U-03 运行模式判定与执行同源:config.py read_runtime_mode 四态判定,废弃 shell grep 解析 JSONC;横幅/改写/执行三者同一真相源
U-04 README/quick-start 配置示例与 config.example.jsonc 单源对齐(CONFIG_EXAMPLE 标记块两文档逐字节相同);清除 udid/item_url/app_package 等幽灵字段(udid 代码中标注 deprecated-ignored、item_url 全仓库无消费方);30+ 守卫测试防漂移

🛠 正确性与健壮性(P1)

ID 内容
U-05 启动期防护:占位符黑名单中文报错、废弃字段迁移警告、未知字段拼写提示、serial 精确预检、ANDROID_HOME 软化(有 adb 即放行,不再强制装 Android Studio);新增 scripts/lib/preflight.sh
U-06 配置写回:注释保留 + 文件锁(fcntl/msvcrt/no-op 三级降级) + .bak 备份 + 原子替换——模式切换不再剥掉配置里的全部护栏注释
U-10 快速重试提交路径强制复用 verify_order_result 同源验证,禁止仅凭点击就记「快速重试成功」;未知结果 fail-closed(submit_unverified 终止)防重复下单
U-12 可编排性:语义化退出码(0 成功 / 10 重试耗尽 / 11 终态失败 / 12 环境错误 / 130 中断)、run_summary.json 原子写、--serial/--result-json 旗标、systemd/cron 集成示例

📱 真机测试(设备 c6c4eb67,全程 --probe 安全模式,零真实下单)

试验 结果
无效 --serial 预检 ✅ exit 12 + 在线设备清单
端到端安全探测 ✅ 56s 自动导航到目标演出,停在购票点击前,exit 0
run_summary.json retries_exhausted/10 与 probe_ready/0 两种 outcome 均正确
注释保留写回(真实 config) ✅ 29 行注释全保留 + .bak 备份

真机当场捕获并修复的 2 个 bug

① macOS bash 3.2 全角字符吞变量:$SERIAL_OVERRIDE(adb... 展开时变量值与 首字节一起消失(hexdump 逐字节确认:bash 3.2 把 0xef 并入变量名)。修 3 处 $VAR全角${VAR}全角。Linux CI(bash 4/5)无法暴露,只有 macOS 真机能抓到。

② 详情页标题读空死循环:该机型上标题控件持续不可读 → similarity=0 误判「标题不一致」→ 正确演出反被拉入黑名单 → 27 次尝试全灭。修为三层兜底:延长轮询 → 场馆包含匹配(真机命中 虹口足球场上海市虹口足球场)→ 锚定 WARNING 放行(下游场次/票档匹配兜底)。复跑 detail_title_verified match=venue_fallback → exit 0。

⚠️ BREAKING CHANGE

--yes(无 --probe)从「静默改写配置并真实下单」改为 exit 1 + 迁移指引。依赖旧行为的外部脚本请迁移到 --commit --yes。这是本次评审 P0 的核心目标:安全探测和真实付款之间不能只差一个单词。

测试

  • 全量 pytest:1374 passed / 1 xfailed(既有),覆盖率 84.08%(闸门 80%),较基线 +212 条
  • 新增测试:参数 fail-fast 13 条、闸门 pty 深路径 18 条、docs 守卫 33 条、read_runtime_mode 18 条、run_report/main 35+ 条、U-10 语义一致性 12 条、真机修复回归 3 条
  • 真机:两轮探测(bug 复现 exit 10 → 修复后 exit 0)

遗留(不在本 PR)

plan-only 7 条已有设计方案(验证码人工接管、排队墙状态机、时钟校准、断线自愈、PII 脱敏、风控包、CTA 蹲守实现),待集中真机验证窗口;U-13 webhook 等 U-12 事件模型定型后做。

🤖 Generated with Claude Code

currycan and others added 2 commits July 11, 2026 15:09
多角色评审(5 用户画像圆桌 → PM → 技术经理 → 资深研发/测试)产出 43 条
痛点、16 条 backlog;本次落地全部 8 条 implement-now 并经真机验证。

资金误操作防护链(P0):
- U-01 真下单唯一授权改为 --commit 旗标;裸 --yes 直接 exit 1 并给出
  可复制迁移命令(BREAKING);确认词闸门(GO/keyword)不可被 --yes 跳过,
  下单摘要 + 3 秒倒数;--probe --yes 老命令行为零变化
- U-02 入口脚本未知参数 fail-fast(--porbe 等 typo 不再静默吞掉直达真下单);
  prompt_runner 关闭 argparse 前缀缩写
- U-03 运行模式判定与执行同源:config.py read_runtime_mode 四态判定,
  废弃 shell grep 解析 JSONC;横幅/改写判定/实际执行三者同源
- U-04 README/quick-start 配置示例与 config.example.jsonc 单源对齐
  (CONFIG_EXAMPLE 标记块,两文档逐字节相同);清除 udid/item_url 等
  幽灵字段;30+ 守卫测试防漂移

正确性与健壮性(P1):
- U-05 启动期防护:占位符黑名单中文报错、废弃字段迁移警告、未知字段
  拼写提示、serial 精确预检、ANDROID_HOME 软化(有 adb 即放行);
  新增 scripts/lib/preflight.sh 共享预检
- U-06 配置写回:注释保留 + fcntl/msvcrt 文件锁 + .bak 备份 + 原子替换
  (真机验证 29 行注释全保留)
- U-10 快速重试提交路径强制复用 verify_order_result 同源验证,禁止仅凭
  点击虚报成功;未知结果 fail-closed(submit_unverified)防重复下单
- U-12 可编排性:语义化退出码(0/10/11/12/130,13 预留)、run_summary.json
  原子写、--serial/--result-json 旗标、systemd/cron 集成文档

真机测试捕获并修复(设备 c6c4eb67,全程 --probe 零下单):
- fix: macOS bash 3.2 变量展开吞全角字符——$VAR 紧跟全角括号时变量值
  与半个多字节字符一起消失(hexdump 确认),3 处改 ${VAR};Linux CI
  无法暴露此问题
- fix: 详情页标题读空死循环——标题控件不可读时 similarity=0 被误判
  mismatch,正确演出反被拉入 rejected_titles 黑名单;改为三层兜底:
  延长轮询 6x0.35s → 场馆包含匹配(真机命中 venue_fallback)→ 锚定
  WARNING 放行,错误页风险由下游场次/票档匹配兜底

测试:全量 1374 passed / 1 xfailed(既有),覆盖率 84.08%(闸门 80%),
较基线 +212 条;真机端到端探测 exit 0 / run_summary probe_ready。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tate

CI(Linux)六版本全红、本地(macOS)全绿的根因是一对互相掩盖的缺陷:

1) _preflight_extract_string_field 的 sed `s/...//;t;s/.*//` 分支写法在
   BSD sed 上报 undefined label(分号后内容被当作 label),提取静默输出
   空 → macOS 上 serial 精确预检从未真正执行,走泛化分支恰好通过;
   GNU sed 上提取成功 → 走 get-state 分支;
2) gate 测试的假 adb 不响应 get-state(恒输出设备清单)→ CI 上精确预检
   必然失败,深路径测试全部止步于 exit 12。

修复:提取改为 `sed -E -n 's/...//p'`(仅替换成功才打印,GNU/BSD 行为
一致);假 adb 补 get-state → device 响应。真机复核:macOS 现在正确输出
「✅ 目标设备在线: c6c4eb67」(精确分支首次生效)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@currycan
currycan merged commit 48a53f8 into master Jul 11, 2026
5 checks passed
@currycan
currycan deleted the feat/usability-roundtable-backlog branch July 11, 2026 07:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant