Mac 微信「清小搭 / 行在清华」校园会话接入:REA 条件性交接报告¶
日期:2026-10-31,Asia/Shanghai。本文供有相应执行权限的接手者使用。
1. 委托范围与当前停点¶
用户的长期目标是让 OneTHU 为同一设备上的校园访问提供统一学校会话,覆盖普通浏览器,以及微信里的校园服务。用户希望使用现有 OneTHU dev,无需浏览器扩展,也不希望另外启动一份未登录的 OneTHU。
本次已经明确的目标只有:
| 项目 | 用户确认的范围 |
|---|---|
| 设备 | 当前 Mac |
| 宿主 | Mac 微信 |
| 目标一 | 清小搭小程序 |
| 目标二 | 行在清华小程序 |
| 当前表现 | 用户已打开两个小程序,并明确说“两个都没登录呢” |
随后用户明确要求停止 REA:“不需要 rea,你等一下,rea 不被允许”。最新要求为:“假如要 rea,请你整理一份完整的交接报告,你自己别干”。
因此,当前 agent 的授权范围是撰写这份报告。REA、程序包分析、运行时附加、网络试验和适配开发均已暂停。本文中的后续方案是供接手者评估的计划,不代表已执行,也不代替执行方环境的权限规则。
当前没有为微信小程序新增业务适配代码、放宽网关策略、修改微信文件或发布安装包。
2. 接手者应首先知道的结论¶
- Mac 浏览器的校园代理已有可工作的实现,Info、选课等已经真实验收。应继承这份实现,保留现有登录与代理设置。
- 微信这两个小程序尚未完成接入验收。当前没有证据证明它们的请求已经进入借用校园身份的 HTTP 处理层。
- OneTHU 已有清小搭网页 API 客户端,以及行在清华中“临时来访报备”网页服务的客户端。这些源码有参考价值,但不能由此推定整个微信小程序使用相同认证协议。
- 用户打开小程序后,代理快照新增两条
CONNECT阶段的GATEWAY_TARGET_REJECTED。记录中的目标 host 为 null,缺少进程和时间关联。这两条拒绝尚不能归因到清小搭或行在清华。 - 当前 GUI 自动化无法读取微信及小程序窗口。它是本次取证的实际限制,不能用“窗口不存在”或“小程序崩溃”解释。
- 本次没有形成任何 REA 程序分析 Evidence。只有一次已经结束的 REA 环境诊断,不能作为协议分析证据。
3. 仓库、分支与运行环境¶
3.1 开发位置¶
真实开发仓库:
/Volumes/PortableSSD/Projects/thuapp/OneTHU
分支为 web,撰写报告前 HEAD 为:
c5e6b58e fix(gateway): preserve live GUI sessions and selection access
18ad53ea fix(gateway): retain legacy callback routes and identify missing SSO sessions
04f08be3 fix(gateway): preserve shared campus SSO across services and restarts
19d4e866 fix(gateway): integrate Mac system browsers and preserve existing proxies
53ac1d6a feat(gateway): share campus sessions with local browser proxy
4353855b feat(gateway): add isolated campus proxy protocol prototype
本聊天默认 cwd /Users/st/.codex/worktrees/pr58-integration/OneTHU 是旧位置。运行仓库命令时应显式指定上面的真实开发位置,避免修改和运行落在两份源码。
撰写报告前 git status --short 为空。本次只新增交接文档,没有提交或推送新的业务实现;接手时重新检查工作区,保留用户之后的修改。当前任务也没有授权更新 main、dev3 或发布渠道。
3.2 现有 OneTHU 与 resident 后台¶
以下是上一次观察的本机信息,PID 和端口均会变化,不应据此结束进程或写死配置:
| 项目 | 记录 |
|---|---|
| 原 OneTHU dev | /Users/st/Library/Caches/onethu/OneTHU.app |
| GUI bundle ID | app.onethu.desktop |
| 最近确认的 GUI PID | 67363,前一轮更新后台时没有重启该 GUI |
| 前端地址 | http://127.0.0.1:5180/ |
| 前端源码 | 真实仓库的 apps/desktop |
| 共享后台 profile | /Users/st/Library/Application Support/OneTHU CLI |
| 已安装后台代码 | /Users/st/.local/share/onethu-cli |
| 最后安装的 runtime ID | 12622c83ffebd6964257b8a3ef18cb2fd884ed8f867b17eb36b4b3c0b16b9e6b |
| 最近后台状态 | authenticated / ready;系统代理 enabled;recoveryRequired=false |
| 最近普通代理端口 | 127.0.0.1:61788 |
| 最近系统接入端口 | 127.0.0.1:61792;按原网络设置分组时可能有多个监听 |
证书已在前一轮完成当前 Mac 的系统信任;本次微信排查没有替换证书。原有 Clash 手动代理回退包含 127.0.0.1:7897,各网络服务的回退设置分别保存。不能用一个全局 DIRECT 规则覆盖这些设置。
3.3 微信目标身份¶
已经从运行进程和安装包元数据观察到:
/Applications/WeChat.app
com.tencent.xinWeChat
/Applications/WeChat.app/Contents/MacOS/WeChatAppEx.app
com.tencent.flue.WeChatAppEx
/Applications/WeChat.app/Contents/MacOS/WeChatAppEx.app/Contents/Frameworks/
WeChatAppEx Framework.framework/Versions/C/Helpers/WeApp.app
com.tencent.flue.WeApp
WeChatAppEx / WeApp 组件的 CFBundleShortVersionString 读到 4.1.15;这不是对主微信版本的独立核实。
观察到这些进程以当前用户 UID 501 运行。UID、路径和进程名本身均不足以证明某一次请求属于某个具体小程序,更不能把所有微信进程视为已获同一服务的会话权限。
4. 现有代理的工作方式¶
flowchart LR
Browser[普通 Mac 浏览器] --> PAC[按网络服务生成的 PAC]
WX[Mac 微信 / 两个小程序] -. 请求是否使用此入口尚待证明 .-> PAC
PAC --> Peer[本机系统代理监听\n同 UID / 精确 TCP 连接检查]
Peer --> Route{校园目标与路由状态}
Route -->|已登记业务| TLS[逐主机 TLS 证书\n内部 HTTP 来源校验]
TLS --> SDK[共享账号运行时\nCookie / epoch / 服务路由]
SDK --> School[学校业务或 WebVPN]
Route -->|可透明转发的未登记校园 HTTPS| Pass[原站 TLS 透明 CONNECT\n原有网络出口]
PAC --> Other[非校园目标沿原代理 / 绕过规则]
4.1 连接与请求是两层校验¶
- macOS 系统监听首先通过本机 TCP 连接与 UID 鉴权。
CONNECT当前接受严格的 DNS authority 与 443 端口,并校验 Host 一致性。具体拒绝应定位到实际分支,不以错误名称猜测输入。- 已登记业务的 TLS 隧道内,还会校验每条 HTTP 请求的来源、目标、账号 epoch 等。
validateFetchMetadata按浏览器设计。缺少 Origin 和 Fetch Metadata 会拒绝;跨站及未知同站 Referer 也有约束。- 因此,同 UID 连接通过,并不代表小程序 HTTP 请求就能通过来源检查。
- 当前日志没有证明这两个小程序的具体 Referer、Origin、Fetch Metadata 或业务令牌形式。
servicewechat.com等只能列为待观察项。
4.2 身份服务与业务服务分流¶
id.tsinghua.edu.cn、oauth.tsinghua.edu.cn、webvpn.tsinghua.edu.cn 的普通浏览器访问保留原网络路径。它们没有被一概纳入借用身份的代理入口。
业务 SSO 的主要通路是:浏览器给出官方 Info 应用选择器,后台向固定的官方接口获取真实目标,在有界流程中使用共享学校会话,再把业务回跳交给对应原站。
这解释了为什么“浏览器 Info 能漫游”不能直接证明“微信登录按钮也能自动完成”:微信入口是否经过 Info、是否使用另一种服务票据,仍需取证。
4.3 业务令牌与身份一致性¶
campusProxy.ts 当前仅对标准 Authorization 使用服务令牌见证策略,按账号 epoch / origin 保存令牌摘要。应用自定义的 token 等头目前透明转发,由目标服务校验。
这不是将 GUI 的清小搭令牌自动注入微信的机制。现有服务 Cookie 合并协议,也不等于完成了所有独立 JWT、微信身份或业务账号的同步。
为小程序适配时,需要保证业务令牌与当前 OneTHU 账号属于同一身份;仅看到同一个设备或同一个名为 token 的字段不够。
5. 已有源码可以提供什么¶
5.1 清小搭:已接入的网页客户端¶
文件:packages/core/src/xiaoda/client.ts。
源码当前记录的网页认证方式:
| 项目 | 网页客户端中的实现 |
|---|---|
| 业务站点 | https://www.xiaoda.tsinghua.edu.cn |
| ITS 服务标识 | d982b795884e882abfa8ff3167aeb03e |
| ITS 入口 | /do/off/ui/auth/login/form/<服务标识>/0?/login.html |
| 网页票据交换 | GET /api/token/login?ticket=... |
| 业务鉴权 | 自定义 token 请求头 |
| 用户信息读取 | GET /api/token/getUserInfo |
| 其他只读接口 | 内置智能体、模型、余额、技能广场等已有方法 |
桌面装配在 apps/desktop/src/lib/xiaoda.ts,包含本机服务令牌生命周期;源码中的 localStorage 键为 onethu.xiaodaToken。这里仅记录键名,不需要把实际值复制进报告或聊天。
待确定:微信清小搭是否直接复用这个网页应用、是否使用相同票据交换、是否先通过微信身份完成账号绑定、是否有另一个业务域名。清小搭小程序的 appId 本次尚未核实,不应猜填。
5.2 行在清华:已接入的是一个子业务¶
文件:packages/core/src/visit/client.ts。
当前客户端针对“临时来访人员报备”网页服务:
| 项目 | 当前实现 |
|---|---|
| 业务站点 | https://visit.tsinghua.edu.cn |
| 网页入口 | /visitor/mobile/login |
| API 基址 | /visitor/mbpm |
| ITS 服务标识 | 04655f71b042b9d2d8d10cd566bd9c39 |
| 票据交换 | POST /visitor/mbpm/identity/ssoLogin;clientId 与 code 在 query |
| 业务鉴权 | 业务 token 与登录时对应的 Cookie 配对 |
| 只读能力 | 菜单、表单模型、目录选项、我的报备等 |
| 写入能力 | submitReport 等会创建真实报备,本任务不测试 |
桌面装配在 apps/desktop/src/lib/visit.ts,保存服务 token / Cookie 会话,localStorage 键为 onethu.visitSession。SDK 对应 packages/sdk/src/services/visit.ts;其中 visit.connect 是显式建立服务会话的操作,不能把普通查询与建立会话混为一类。
scripts/visit-probe.mts 的历史注释记录过行在清华 appId:wx3cfa534a23db4039,并称来访报备是首页里的一个网页卡片。这是仓库历史线索,不是本次运行中的小程序身份核实。
整份行在清华小程序可能包含其他域名、页面和认证体系,应先确定用户所在的实际入口。不要把报备子功能的令牌当作全小程序的登录证明。
5.3 历史探针的使用注意¶
scripts/xiaoda-probe.mts、scripts/visit-probe.mts 等适合阅读协议线索,执行行为需要单独审查。
已读到的历史来访探针包含读取本机保存凭据并登录的逻辑,且注释中的旧 API 路径与当前客户端有差异。接手时以当前源码和实际证据为准,不直接运行旧探针、不导出其凭据、不用它们自动重建账号会话。
6. 已做过的微信排查与证据强度¶
| 观察 | 可得结论 | 仍无法回答 |
|---|---|---|
| 用户确认平台为 Mac | 本轮先做 Mac | Windows、安卓、iPhone 的兼容性 |
| 用户指定清小搭、行在清华 | 有明确目标 | 当前运行的 appId / 包版本 / 实际页面 |
| 用户说两个都已打开、都未登录 | 当前显示为未登录 | 点击认证后的具体链路与失败原因 |
| 微信、WeApp、AppEx 进程存在 | 宿主及容器运行过 | 每条请求对应哪个小程序 |
| GUI 捕捉失败或超时 | 自动化暂时无法检查界面 | 真实页面控件、提示和跳转 |
| 打开后多了两条 CONNECT 目标拒绝 | 系统监听有新拒绝记录 | 是否由这两个小程序发起、目标是谁 |
| 浏览器代理继续工作 | 现有浏览器基线可保留 | 小程序登录复用 |
有限路径与打开文件检查没有找到候选 .wxapkg |
当时没有找到可用分析输入 | 包不存在、被删除、加密或缓存位置不同等均未确定 |
最近系统统计曾为 385 个已处理请求,计数中的主机是 zhjwxk.cic.tsinghua.edu.cn、info.tsinghua.edu.cn、zhjw.cic.tsinghua.edu.cn。该数字是时间点快照,不能代表微信请求数量。
同一组近期拒绝里还曾出现 GATEWAY_PEER_SOCKET_INVALID。不要将它与之后的目标拒绝合并成同一个根因。
当前 recordRejection 仅保留有界、脱敏的 host / 错误码 / 来源枚举;某些解析失败发生在 target 建立之前,host 因而为 null。这限制了现有诊断的归因能力。新日志应继续避免保存原 URL、ticket、Cookie、Authorization、正文和身份信息。
REA 实际执行记录¶
本 agent 在用户叫停前运行过一次:
npx -y rea-agents@6.5.0 doctor --client codex --json
该进程已结束,退出码为 1;已存结果中 healthy=false、environment_healthy=false。没有进一步确定各项诊断的根因。它只检查环境,不能说明这两个小程序的协议或实现。
本地临时结果:
/tmp/onethu-wechat-rea-doctor.json
/tmp/onethu-wechat-rea-doctor.err
这两份文件没有作为业务分析证据入仓库。若需要阅读,接手者应先按私有环境资料处理。该次 npx 调用可能写入 npm 缓存;没有执行 REA setup、写 MCP 配置、安装分析引擎、解包目标、附加微信进程或修改微信二进制。
7. 条件性后续调查计划¶
以下阶段供具有相应权限的接手者使用。本 agent 不执行这些步骤。
阶段 A:确定最小目标与复现入口¶
分别为两个小程序建立记录:名称、appId、版本、登录前页面、用户点击的具体入口、涉及的业务域名、预期登录账号。记录标识可用摘要,公开文档中保持身份脱敏。
确认入口属于原生小程序请求还是内嵌 H5;行在清华还需记录子功能名称。先保留正常浏览器基线,再单独复现一个目标,避免并发活动让网关计数无法归因。
阶段 B:仅在允许 REA 时分析目标程序包¶
选择确认属于目标小程序的程序包或代码树,记录来源、版本和 SHA-256。分析输入应限于程序资源,不扩大到聊天记录、通讯录数据库、账号凭据仓或其他小程序。
静态分析优先回答:
- 登录按钮调用什么入口,如何选择学校认证与微信认证?
- 网络调用由小程序 API、内嵌 H5 还是其他容器发起?
- 请求的完整 origin 集合是什么,是否包含学校域名之外的服务?
- 凭据放在哪里、字段和生命周期是什么?记录结构与键名,保留实际值在私有运行环境。
- 学校票据交换、业务会话恢复和账号绑定各由哪个模块负责?
- 是否存在特定客户端参数、回调 origin、Cookie 配对、设备绑定或微信侧用户标识?
- 哪个只读页面或接口可以证明最终业务身份?
静态分析只能证明代码结构。不能把代码中存在某个域名、API 或登录分支写成“当前运行已经使用”。
如果 REA 工具在接手环境不可用,应明确记录缺失能力;环境检查、工具连接、分析引擎可用性和目标 Evidence 是四件事。不要通过自动修改 MCP 配置或安装无关组件掩盖工具不可用。当前交接没有授予这些额外操作权限。
阶段 C:最小化运行证据¶
把一次用户触发的目标登录,与代理、TCP 连接和应用界面按时间关联。优先收集域名、方法、状态、跳转类型、响应种类及进程归属,不保存完整业务正文或认证值。
关键检查矩阵:
| 问题 | 最小证据 | 对下一步的意义 |
|---|---|---|
| 请求经过哪个出口? | 目标进程的连接与对应监听的增量记录 | 区分未走 PAC 与已到网关 |
| CONNECT 怎样失败? | 合法目标主机、端口类别、Host 是否一致、具体拒绝分支 | 定位 authority、路由或进程鉴权问题 |
| TLS 是否建立? | 握手结果、SNI / ALPN 类别、证书错误分类 | 区分网络路由、信任与后续 HTTP 问题 |
| HTTP 来源是什么? | Origin / Referer / Fetch Metadata 的结构与匹配布尔值 | 判断当前浏览器来源规则是否适用 |
| 学校认证怎样完成? | 经脱敏的 host/path 跳转序列与页面类型 | 判断是否复用当前学校会话 |
| 业务凭据怎样生效? | 字段名称、token/Cookie 配对规则、账号验证结果 | 避免错用别的运行时或账号的令牌 |
| 微信身份是否另有要求? | 已核实的官方交换或账号绑定流程 | 明确可自动复用与需用户操作的部分 |
| 最终是否成功? | 目标小程序内真实的只读业务内容和同账号验证 | 完成端到端验收 |
若增加网关诊断,优先增加有限枚举和经过严格验证的校园 hostname,不扩大日志到任意请求头或 URL。仅用于诊断的值不得影响授权决策。
阶段 D:根据证据选择适配位置¶
| 观察到的结构 | 优先评估的实现方向 |
|---|---|
| 内嵌 H5 使用学校业务 Cookie | 复用现有官方服务发现、业务 origin、SSO 与共享 Cookie 生命周期 |
| 原生请求已到网关,但缺少浏览器来源信息 | 设计受限的本机客户端与目标服务授权;需要能关联真实宿主和小程序身份的证据 |
| 原生请求没有采用系统 PAC | 评估该 Mac 宿主支持的网络接入方式,保留现有代理与其他应用出口 |
| 使用独立的微信业务登录或账号绑定 | 使用实际存在的官方交换/绑定机制,明确保留用户需要完成的首次操作 |
| 已有业务 token,与 Cookie 必须配对 | 在当前账号的权威运行时维护成对会话,并验证目标业务身份 |
| 学校返回真实二次验证 | 保留官方挑战与用户交互,停止重复登录和自动发送验证码 |
来源适配不能只凭 User-Agent 包含 WeChat、一个可伪造的请求头或裸放行 servicewechat.com。当前同 UID 验证也不是每个应用/每个小程序的独立身份授权。若需要新的身份共享边界,应先说明凭什么确定接收者与目标账号,再实现。
若最终业务协议依赖微信专属身份且没有学校会话交换能力,应直接报告这部分限制,并提供可以验证的替代入口;不伪造成功响应、JWT、微信 code 或用户绑定状态。
8. 必须保留的现有行为¶
- 原 OneTHU dev 和共享 profile;不要另开一个未登录 App,也不要清空用户会话来建立测试环境。
- Info、选课等已验收的普通浏览器通路。
- 现有 CA 和逐服务代理恢复记录;保留用户的 Clash 回退、旁路规则与后来手动修改的设置。
- 账号 / 指纹 / epoch / 显式退出 / 待完成登录检查;不同账号的服务 Cookie 和业务 token 保持隔离。
- Cookie 的路径、Secure、HttpOnly、过期语义;服务交接仅更新其声明的范围。
- 明确的真实二次验证边界;首次学校挑战需要用户完成时如实提示。
- 非目标微信流量、聊天数据与其他程序不进入本次分析或校园身份共享范围。
前一轮曾把磁盘 native-jar.tsv 快照当成运行中 GUI 的会话状态,误要求用户重登,后来已纠正。接手者应通过原 GUI 的 live IPC 与真实业务证明判断;不要再次依据磁盘 Cookie 文件或 cached ready 单独得出失登结论。
9. 源码与报告索引¶
下列均是相对真实仓库根目录的路径。行号会随修改变化,优先按符号检索。
| 位置 | 重点 |
|---|---|
packages/gateway/src/index.mjs |
recordRejection、authenticate、CONNECT、隧道内 HTTP、脱敏统计 |
packages/gateway/src/policy.mjs |
parseConnectAuthority、validateFetchMetadata、请求/响应头清洗 |
packages/gateway/src/macPeer.mjs |
精确本机 TCP 连接与 UID 验证、排队/超时 |
packages/gateway/src/manager.mjs |
按网络服务分组监听、控制动作、生命周期与恢复 |
packages/gateway/src/pac.mjs |
校园分流、身份域排除、原代理/绕过规则 |
packages/gateway/src/platform.mjs |
macOS / Windows 系统设置与写前恢复记录 |
packages/gateway/src/passthrough.mjs |
未登记校园 HTTPS 的透明转发 |
packages/sdk/src/node/campusProxy.ts |
动态服务、共享请求、Info 应用查询、令牌和正文处理 |
packages/sdk/src/node/campusServiceTokens.ts |
令牌摘要见证;实际启用范围还需结合调用点 |
packages/core/src/info/campusPortal.ts |
官方服务发现、有界学校 SSO、回跳约束 |
packages/sdk/src/node/session.ts |
当前账号、epoch、服务会话合并、Info 身份验证 |
packages/core/src/auth/serviceCookies.ts |
mergeSelectionCookies / mergeUniversityCookies |
packages/sdk/src/desktop.ts |
私有 service-session-merge-v1 能力声明与交接 |
apps/desktop/src/lib/clients.ts |
live 原生导出与 resident 交接、旧快照覆盖防护 |
apps/desktop/src/lib/sharedRuntime.ts |
桌面私有桥接、原生 Cookie IPC |
apps/desktop/src-tauri/src/cli_session.rs |
cli_session_cookies_export / import |
packages/core/src/xiaoda/client.ts |
已有清小搭网页协议 |
apps/desktop/src/lib/xiaoda.ts |
桌面清小搭令牌生命周期 |
packages/core/src/visit/client.ts |
来访报备网页协议及真实提交边界 |
apps/desktop/src/lib/visit.ts |
桌面来访会话装配 |
packages/sdk/src/services/visit.ts |
SDK 来访服务及显式 connect |
packages/cli/src/daemon.mjs |
已运行后台的私有 RPC 连接与方法分发 |
相关记录,后续文档优先于早期阶段的状态:
10. 可复用的状态检查与验证方法¶
以下命令仅供接手者按权限使用,撰写本报告时没有执行新的网络检查。
10.1 只读取当前后台摘要¶
在真实仓库根目录运行。它只连接已经存在的 daemon,未连接成功就结束;不自动启动、重登或更改代理。
node --input-type=module - <<'JS'
import { connectDaemon } from './packages/cli/src/daemon.mjs';
const profile = '/Users/st/Library/Application Support/OneTHU CLI';
const client = await connectDaemon(profile, 10000);
if (!client) {
console.log('No existing daemon; leave the current app untouched.');
process.exit(0);
}
const daemon = await client.call('daemon.status');
const gateway = await client.call('gateway.control', { action: 'status' });
console.log(JSON.stringify({
runtimeId: daemon.runtimeId,
authenticated: daemon.session?.authenticated,
state: daemon.session?.state,
proxyEnabled: gateway.systemProxy?.enabled,
recoveryRequired: gateway.systemProxy?.recoveryRequired,
requests: gateway.systemTraffic?.requests,
hosts: gateway.systemTraffic?.hosts,
rejections: gateway.systemTraffic?.recentRejections?.map(entry => ({
code: entry.code,
host: entry.host,
destinationHost: entry.destinationHost,
method: entry.method,
fetchSite: entry.fetchSite,
fetchMode: entry.fetchMode,
fetchDest: entry.fetchDest,
hasOrigin: entry.hasOrigin,
referrerAllowed: entry.referrerAllowed,
})),
}, null, 2));
JS
不直接打印 desktop.exportSession 的完整结果;它包含私有会话快照。报告、Issue、PR 与聊天里不附原始凭据或业务内容。
10.2 已通过的基线与可选回归命令¶
前一轮在 c5e6b58e 对应实现上,SDK 295 项、gateway 135 项、选课响应回归 10 项、学校语言解析 48 项通过,core / SDK / desktop 类型检查通过。这些数量是前一轮运行结果,不是本报告重新执行的结果。
后续有对应源码修改时,按影响选择执行:
pnpm --filter @onethu/gateway test
pnpm --filter @onethu/sdk test
node --import tsx tools/xk-session-response-test.mjs
node --import tsx tools/school-language-parser-test.mjs
pnpm --filter @onethu/core typecheck
pnpm --filter @onethu/sdk typecheck
pnpm --filter @onethu/desktop exec tsc --noEmit
fixture 测试不能替代微信真机验收。没有源码修改时,无需为了交接重跑全套、重建后台或安装三端包。
10.3 原生日志与证据位置¶
当前原生 App 日志位置:
/Users/st/Library/Application Support/app.onethu.desktop/logs/onethu-debug.log
/tmp/onethu-debug.log 是旧线索,不能默认当成当前 GUI 日志。旧日志可能含历史 HTML、课程内容或回跳地址;只提取所需的安全错误分类和计数,不整份复制。
前一轮选课通过的本地截图:
/Users/st/.codex/visualizations/2026/10/17/01a14792-83cf-7cf3-9a17-b311f5d40ee3/campus-selection-verified.jpg
它证明的是浏览器选课基线,不是微信证据。本次没有取得可用的微信验收截图。
11. 完成标准与接手输出¶
每个小程序独立给出结果,不合并成一个“微信已支持”:
- 已确认运行目标身份、版本和入口。
- 已证明请求的实际网络路径及关键认证序列。
- 已验证最终业务账号与当前 OneTHU 账号相符。
- 在小程序原界面显示真实只读业务内容,刷新/重开仍符合预期。
- 账号切换、退出、后台暂时不可达时,没有旧账号内容泄漏或重复认证风暴。
- Info / 选课等原浏览器路径继续可用,Clash 和非校园访问保持原设置语义。
- 实际二次验证、独立微信绑定或其他外部限制有明确分类,未把它们伪装为已自动完成。
接手者应交付:目标身份表、脱敏链路图、静态 Evidence 与运行证据的对应关系、功能覆盖表、必要的实现与回归、真实微信验收记录、未解决边界,以及恢复到接入前网络状态的办法。
当前聊天没有授权发送清小搭提问、消耗模型额度、提交来访报备、预约、修改学校记录、修改微信程序或跳过微信/浏览器安全检查。这些均不属于证明“会话已接通”所必需的步骤。
12. 可直接转交的任务摘要¶
请在允许 REA 的独立执行环境中,调查当前 Mac 微信的“清小搭”和“行在清华”能否复用 OneTHU 的学校会话。用户确认两个小程序已打开,但当前均未登录。OneTHU 仓库为
/Volumes/PortableSSD/Projects/thuapp/OneTHU,分支web,当前实现基线c5e6b58e。原 GUI 与 resident 共享后台保持运行,Mac Chrome 的 Info / 选课链路已真实验收。微信请求路径、appId/版本、认证协议和 Cookie/JWT/微信身份的关系仍需证明;现有两条 CONNECT 拒绝尚未归因。请先确认目标、分析最小程序资源和脱敏网络链路,再决定适配位置。继承现有账号/epoch/设备信任和代理共存设计,保留浏览器基线。只做必要的只读验收,不读取聊天或保存凭据,不把已有网页客户端等同于整个小程序。当前 agent 已依用户要求停止 REA,仅提供此报告;请遵守接手环境的真实权限,不把报告当成绕过权限或自动扩大采集范围的授权。完整背景、源码索引、状态检查与完成标准均在本文。