雨课堂查询与微信回复恢复(2026-10-26)¶
故障与修补¶
雨课堂的假会话失效¶
桌面心跳和内容目录均能读取,而 SDK 的 yuketang.* 连续 HTTP401。SDK 学校传输层会丢弃显式 Cookie 头、从自己管理的 jar 重建 Cookie。新增查询桥把雨课堂 Cookie 放在请求头,却没有交给传输层的 Cookie 仓,因此有效配置也会被报为失效。
新查询使用一次操作专属的服务传输:继承调用方的测试/网络注入、超时与账号 epoch 门禁;在精确的 https://pro.yuketang.cn origin 将客户端头部凭据放入隔离 Cookie jar。结束时关闭并释放;账号轮换或关闭 Node runtime 时取消所有未结束的服务传输。雨课堂 Cookie 不进入学校主 jar,也不会被导出进桌面学校会话交接。
新增真实 Node Cookie 重建回归,模拟服务端要求携带 sessionid 和 uv_id,同时确认学校 jar 没有变化。
作业查询还修复:deadline=0 显示为空,避免出现 1970-01-01;提交状态读取失败时,查询返回 incomplete/issue,而不是把不确定结果伪装成确认未交。学校明确返回会话失效时继续抛出会话错误。
微信通道凭据被覆盖¶
ImStorage.fileName() 固定返回 im.cfg。原通道配置与新增的微信任务回复上下文各使用一个 ImStorage,但实际写入同一文件;二者使用不同的派生口令,收到消息保存上下文后覆盖通道凭据,重启便无法解密配置。
实证:现场 im.cfg 只能用任务上下文派生口令解密,内容只有 owner/recipient/contextToken/botId。独立 CLI 的通知配置也已没有微信凭据,不能凭上下文重建 botToken。该错误来自本地新增的上下文持久化实现。
修补:保留主配置的历史文件 im.cfg;其余存储按自己的 key 分配独立文件。读取失败保留原文件,记录 unreadable 状态;后台绑定同步遇到 unreadable 立即停止,避免把解密失败当作用户主动断开并删除后台配置。显式重新扫码保存后解除 unreadable。关键文件读写启用 strict,真实磁盘失败返回错误。
已将本机原密文备份到用户缓存目录,并把可恢复的加密上下文放到独立文件。用户重新扫码后,已确认通道配置可正确解密、微信启用且主人绑定存在;重启原 dev 后微信自动连接。
“已有对话在运行”¶
该提示来自 Harness 的全局运行票。页面重载丢失了前端请求与停止入口时,旧工作线程仍可持票;此前前端 RPC 超时也没有向宿主发送本次请求的取消。
修补:已派发的 chat 按 runId 登记本窗口的停止回调;pagehide 发送定向取消。原生 invoke 在首次调用后缓存,窗口退出时可以立即入队 IPC。RPC 失败/超时也取消本次运行票,然后保留原始错误。完成后清理登记。继续保留真正互斥:取消标记不强行解锁;其他窗口的任务不会被新请求抢占。
OH 错误声称雨课堂没有接入¶
微信恢复能回复之后,用户再次转述 OH 声称「已安装插件和技能没有雨课堂,所以不能查询」。实查当前运行的 Harness 二进制已包含 query_yuketang,两个内置清单也有 exthw:read。故障会话的轨迹却只有 list_plugin_cmds/open_page,以及随后重试的 skills_search/ext_plugin_installed,从未调用雨课堂查询。模型沿用了自己早前「未接入」的错误回答,把扩展目录误当作完整能力表。
补充系统能力纪律:内建雨课堂无需另装技能/插件,直接用 query_yuketang;当前工具及真实结果优先于历史能力判断。插件、技能、页面目录各自的搜索结果不能证明内建能力缺失,接口失败须按真实错误说明。
为明确的雨课堂读请求增加一次真实工具预读,先通过同一 tools::execute → yuketang facade 权限与账号门禁取得数据,再进入模型循环。作业请求读取既往及最大支持未来窗口(3660 天),结果保留 windowDays/complete/issues;泛化的再次查询只从人类消息追溯最近的具体任务。当前消息没有明确雨课堂读取意图时不触发,显式拒绝读取或文件问答边界也不触发。预读不安装插件、不改变权限、不提交作业。结果以完整的工具调用/回执配对进入上下文,真实失败原样保留;取消和模型失败恢复完整的历史与轨迹快照。
新增回归覆盖历史错误说法、重复重试、中文与英文作业请求、无关问候、拒绝读取、文件问答边界、真实宿主读取、权限拒绝及工具消息配对。
真实验收¶
- 已更新原 dev 使用的 CLI bundle;常驻 runtimeId:ffa091d0597286721de731c053dc65064cf39195d4ece75abbe7549e3c7e366c。
- 学校会话 ready,配置仍保持 enabled=true/automatic=false。
- 常驻 CLI 的
yuketang.homework ["",3660]成功,complete=true、issues=[]。返回一项未完成:2025春-清华大学 / 自测,7题,无有效截止时间。未发现其他未完成项;这是当前账户可访问课堂的接口结果。 - 微信重新扫码后配置与上下文文件独立;原 dev 重启后日志确认 wechat 已连接,用户随后确认「回复了」。这只代表微信通信恢复,当时尚未验证 OH 的雨课堂能力。
- 本轮重新构建 Harness,原 dev 的资源与实际安装 sidecar SHA256 均为
0801cb4255f48e9162a7322c5b9cda19f7dc0021442c632fa9f8e3534ff867a9。恢复原 127.0.0.1:5180 服务,在同一个 dev App 加载;未启动另一个安装版 App。 - 保留原会话里的错误回答,用 IM 共用的
askOh("现在应该能看雨课堂了")真实执行。轨迹先出现query_yuketang作业预读(567B、complete=true、issues=[]、1 项),模型继续实际调用雨课堂课程及内容工具;最终回答识别出「自测(7 小题)/未提交/无截止时间」。未再声称需要安装雨课堂插件。 - 该验收没有发送微信消息;执行的是 IM 入站使用的同一个队列、预检、chat、权限门面与模型调用路径。临时 DEV 验收模块及入口已移除。用户实际从微信发出的下一条新查询尚待其自行验证,不把本地同路径测试写成微信端到端成功。
检查¶
SDK 全量 197 项;存储隔离与损坏恢复 2 项;雨课堂配置同步 5 项;共享运行时 21 项;OH 生命周期 29 项;窗口归属与退出定向取消 7 组;桌面类型检查和生产构建均通过。
本轮 Harness core 70 项通过,sidecar release 构建通过(已有 17 条 warning),主仓库与 Harness 子模块 git diff --check 通过。未发布新安装包,原有 CLI/SDK/附件/PR58 本地改动保留。
交接备注:本轮结束时 aimemory 的检索曾成功,写入连续两次遇到 ai-memory.cc.cd 传输错误;本报告已保存完整结论。记忆服务器恢复后需补写本轮「OH 旧对话误报未接入」的修补与验收,避免再次把微信通信恢复误当雨课堂查询验通。
后续:记忆服务器已恢复,交接背景及新增统一能力层写入「OH应用能力统一接入:好友组织清小搭暂存箱 2026-10-26」。后续范围、真实接口验收及模型 HTTP502 限制见 docs/reviews/2026-10-26-oh-app-capabilities.md。