- 只翻注释/文档字符串:剥掉行尾注释后,每条「-」都有逐字节相同的「+」对应行(8 组,代码零改动) - 保留协议/线上标识符原文:errcode、bot_token、context_token、getupdates、binded_redirect、PKCS#7、ECB 等 - 术语对齐既有译法:owner→主人、peer→对端、long poll→长轮询、backoff→退避、sentinel error→哨兵错误 - 已知既有欠债(未顺手修):login_reuse_test.go 在 HEAD 上就未 gofmt 干净;login_test.go 的 TestStartLogin_ScanStatusTransition 91 行 >80(HEAD 同为 91 行)
StartLogin 换码保护: 当 runLogin 观测到 wire 状态已进入 scaned/scaned_but_redirect/need_verifycode(confirmingPhase)时, 复用当前 loginSession 的 QR 而不重新 fetchQRCode/cancel 旧 poll, 避免 45s 自动刷新/恢复前台把已扫未确认的会话砍掉导致微信 confirm 丢失。 仍保留 qrReuseWindow: 未扫描(等待中)且超窗口才重取, 保留显式刷新二维码要新码。 runLogin 补 case scaned: setLoginState(LoginStatusWaiting, loginScannedDetail), 沿用 Waiting 不新增破坏性状态; 顺带在会话上记录 wire phase 供 StartLogin 判别。 可观测性: fetchQRCode 取码成功记 get_bot_qrcode ok(url 脱敏, 不含 qrcode), pollQRStatus 状态变化才记 get_qrcode_status(status), completeLogin/failLogin/ completeBindedRedirect 记结果; 均不落 qrcode/bot_token/user_id。 failLogin 修正: 被 re-mint superseded 的旧会话不再 clobber 新会话状态(不置 failed)。 新增测试: scaned 暴露到 LoginStatus; scaned 超窗口复用 QR 不重取; 等待中超窗口 重取; 日志脱敏断言。