问题位置:lib/services/log_reporter_service.dart:264(位于 _upload 方法的 try { ... } 块内)
问题:本次重构把日志上报的鉴权从用户静态 X-API-TOKEN 改为 DeviceAuthService.instance.authedHeaders()。但 authedHeaders() → ensureRegistered() → register() 在 kHasBundledBackend == false(自部署模式 / 自定义后端)时直接抛 DeviceAuthException('NO_BACKEND', '...')。
该异常抛出后被 _upload 末尾的 catch (e)(line 305-308)兜住,路由到 _onUploadFailure('未知错误: DeviceAuthException(NO_BACKEND)...'),从而:
- 每次上报都
_consecutiveFailures++
- 连续 3 次后进入指数退避(
backoffMaxSeconds=300s,最多 5 分钟一次)
- 上报功能对自部署用户永久失效
文件 line 263 注释承诺"凭证不可用(未配置后端/未注册成功)时静默放弃本轮上报",但实际行为相反——它把可恢复的"凭证未就绪"当成真实网络失败计入退避计数。
影响:
- 回归:本次提交前,自部署用户即使没填 token,方法也走
if (token.isEmpty) return false(line 261 同位置),不计入失败计数;现在计入。
- 自部署用户在缓冲到 20 条后第一次
flush() 就失败,3 次后进入 5 分钟一次退避;日志被本地堆积但永远无法上报。
- 与本次同步上线的"APP 侧移除静态 API token"叠加,迫使所有托管之外的部署形态在日志侧彻底退化。
修复建议(任选其一):
- 在
authedHeaders() 调用前先 if (!kHasBundledBackend) return false;——自部署模式无设备服务,本来也不该走这条鉴权。
- 把
authedHeaders() 调用从 try 块内提到 if (host.isEmpty) return false; 之后、try 之前(用单独的 try/catch (DeviceAuthException) { return false; }),确保不计入 _consecutiveFailures。
- 在
_onUploadFailure 处区分"凭证未就绪"与"真网络错误",前者直接 return false 不计数。
backend_settings_screen.dart 文案写"AI 托管模式已使用内置服务器地址…此项仅本地开发调试自定义后端时有效",意味着自部署路径仍被支持;这条 bug 等于让自部署路径的日志上报失效,与产品定位冲突。
忽略指南:在 lib/services/log_reporter_service.dart:264 添加注释 // cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。
问题位置:
lib/services/log_reporter_service.dart:264(位于_upload方法的try { ... }块内)问题:本次重构把日志上报的鉴权从用户静态
X-API-TOKEN改为DeviceAuthService.instance.authedHeaders()。但authedHeaders()→ensureRegistered()→register()在kHasBundledBackend == false(自部署模式 / 自定义后端)时直接抛DeviceAuthException('NO_BACKEND', '...')。该异常抛出后被
_upload末尾的catch (e)(line 305-308)兜住,路由到_onUploadFailure('未知错误: DeviceAuthException(NO_BACKEND)...'),从而:_consecutiveFailures++backoffMaxSeconds=300s,最多 5 分钟一次)文件 line 263 注释承诺"凭证不可用(未配置后端/未注册成功)时静默放弃本轮上报",但实际行为相反——它把可恢复的"凭证未就绪"当成真实网络失败计入退避计数。
影响:
if (token.isEmpty) return false(line 261 同位置),不计入失败计数;现在计入。flush()就失败,3 次后进入 5 分钟一次退避;日志被本地堆积但永远无法上报。修复建议(任选其一):
authedHeaders()调用前先if (!kHasBundledBackend) return false;——自部署模式无设备服务,本来也不该走这条鉴权。authedHeaders()调用从try块内提到if (host.isEmpty) return false;之后、try之前(用单独的try/catch (DeviceAuthException) { return false; }),确保不计入_consecutiveFailures。_onUploadFailure处区分"凭证未就绪"与"真网络错误",前者直接return false不计数。backend_settings_screen.dart文案写"AI 托管模式已使用内置服务器地址…此项仅本地开发调试自定义后端时有效",意味着自部署路径仍被支持;这条 bug 等于让自部署路径的日志上报失效,与产品定位冲突。忽略指南:在
lib/services/log_reporter_service.dart:264添加注释// cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。