# Web 邀请页独立复审

复审日期：2026-10-03。本复审员不是本轮 Web 邀请接入作者，只读业务代码，以实际模块和隔离浏览器故障替身复验；业务修复由主 Agent 完成。

结论：本轮发现的 **2 项 P2、2 项 P3 均已修复并完成限定范围复验**，没有发现尚未关闭的 P1/P2。邀请页能区分请求失败与真实已绑定/申诉记录，旧活动关闭后仍保留原承诺规则。此结论限于 Web 接入，不表示真实视频观看自动发奖、生产审核与 worker 已完成。

## 验证范围

阅读 `internal/webui/consumer-referral-api.js`、`consumer-referrals.js`、邀请 API 测试、`consumer-auth-api.js`、`consumer-auth.js`、`consumer-shell.js`、`index.html` 与邀请页样式，交叉核对实际邀请领域 DTO。

- 独立重跑 Node **9/9**：邀请 API 4 项，既有邮箱认证 API 5 项。没有把主 Agent 的全量测试或真实联合测试计入本轮独立数量。
- 独立 VM 使用实际邀请 API 源码复现异常 DTO；原两个错误接受结果均由 `true` 变为 `false`。
- Playwright 在独立 Chrome 会话与随机本机端口加载实际 Web 邀请模块/API 模块，检查绑定响应丢失、申诉响应丢失、语言事件与迟到响应、关闭活动旧快照、新旧规则差异、短集比例及最新 401 登录入口。替身身份和 HTTP 返回按真实 DTO 形状提供，没有连接生产账号或发奖。
- 本次浏览器替身不包含完整生产导航、Better Auth/Go/PG 链路。账号生命周期主要按实际代码读审，完整链路由主 Agent另行验证。本报告不将主 Agent 的 21 项联合测试声称为本复审员的独立测试。

复现与日志保存在 `work/existing-project/web-referral-*`；本轮未修改业务源码、未发送外部邮件、未访问真实上游媒体。

## P2-01：畸形成功数据可显示虚假已到账（已关闭）

修复前，实际 `validReferralSummary` 接受 `state=rewarded`、`qualifiedEpisodes=0`、奖励 `999999` 的关系，同时缺少活动 ID、规则版本、绑定时间、奖励 TTL 与审核超时字段。关系宣称门槛 1 集、奖励 999999 集，但快照实际为门槛 2 集、奖励 3 集。规则校验也接受日上限 100000、月上限 1、余额上限 1 的不可达组合。

影响是客户端把损坏或不匹配的 200 DTO 当成真实到账信息；这不代表客户端能够改变服务端账本或自行发奖。

主 Agent 修复后，对关系身份、活动版本、时间/申诉字段、快照一致性、达标状态最低证据数量和成熟领域数值边界逐项校验。仍允许合格集数超过门槛、拒绝关系保有已产生证据，以及统计总数大于截断列表长度，避免误拒真实后台记录。

独立复验：原畸形关系与不可能规则均拒绝；新增实际形状、超过门槛、截断列表正例通过。HTTP 200 不再单凭 `status=bound` 或 `qualified=true` 成为成功。

## P2-02：新规则覆盖旧承诺的页面说明（已关闭）

原页面只说明当前活动规则，关系记录仅列合格数量和奖励。用户已按旧活动绑定后，后台调整规则会让页面说明变成新门槛；关闭活动则完全隐藏规则说明。用户无法从自己的记录确认原有效观看时限、每集时长、倍速、奖励有效期与截止时间。这属于实际可达的产品规则误导，不是服务端奖励快照被修改。

主 Agent 为每条关系增加原生折叠“规则详情”，直接使用该关系的 `rules` 与 `windowEndsAt`，当前活动有旧绑定时标为“新邀请规则”。关闭活动也保留已有关系详情。

独立 Chrome 验证：当前活动为 48 小时、2 集、奖励 3 集、7 天有效；旧关系仍显示原 1 小时、1 集、奖励 4 集、5 天有效、每集 3 秒、最高 1 倍及原截止时间。关闭活动后同一旧详情仍可展开，网络记录仅读取 summary，没有请求新邀请码。原因 `qualification_not_met` 也有简短对应文案。

## P3-01：语言事件与迟到响应使新按钮保持禁用（已关闭）

原实现对旧按钮设置 busy；语言重渲染替换 DOM 后，迟到的绑定响应只启用已脱离页面的旧按钮。独立 Chrome 延迟响应复现：页面已显示同设备不可获奖，但新复制、确认和刷新按钮均保持 disabled。

**可达性限制：**本次通过宿主语言事件注入复现。当前原生邀请 dialog 打开时，外部语言工具栏处于 inert，普通用户不能直接点击该工具栏触发此时序。因此按 P3 记录语言事件契约问题，不宣称当前常规用户路径存在 P2 阻塞。

主 Agent 改为 busy 状态更新当前内容内按钮；迟到响应须同时匹配 owner、generation 与仍打开的 dialog。独立重跑相同时序，迟到的 `same_device` 响应到达后，新按钮均恢复可用。剪贴板回调同样检查当前身份、代际及节点连接，读审确认不会向已关闭或更换账号的页面写入旧提示。

## P3-02：短集条件与比例文案不精确（已关闭）

原简化文案未说明短集判定及前台时长取整；百分比直接整数取整会把后台 0.904 显示成 90%。

修复后的详情明确：普通集达到最小有效前台时长；若集长除以规则最高倍速小于该时长，则覆盖规则比例内容，并达到对应部分时长除以最高倍速、向上取整到秒的前台时长；离线观看不计。最高允许倍速仍按该关系规则显示。

独立 Chrome 验证旧快照比例 0.904 显示 **90.4%**，而不是 90%；当前实现保留到六位小数。本轮验证特定规则输入和文案，不扩展为媒体可信证明算法验收。

## 其他接入边界

| 检查 | 限定范围证据 |
| --- | --- |
| 绑定未知结果 | HTTP 替身先持久化 observed 关系再断开响应。页面提示暂不可用，不宣称已绑定；手动刷新成功 GET summary 后显示真实记录。一次 bind POST，没有自动换码或自造 pending 归属协议。 |
| 申诉未知结果 | 替身先保存 open 申诉再断开响应。页面不凭失败响应显示提交成功；刷新 summary 后显示“申诉处理中”，不再提供重复提交按钮。 |
| 规则与状态 | 七个展示状态取自实际领域状态：待有效观看、核对中、待审核、复核中、待到账、已到账、未通过。数字和规则取后端 DTO；没有客户端 qualified 或 credit 操作。 |
| 活动切换 | enabled 活动的 code 与 summary 必须相同 campaignId/版本；不匹配按失败处理。关闭活动继续读取旧关系，不能新建邀请码。 |
| 账号切换及关闭 | 读审确认所有绑定、申诉和加载响应检查 owner/generation/dialog；关闭或身份变化递增代际并 abort，身份变化关闭邀请 dialog。未把这一源码检查描述为真实多账号浏览器联合验证。 |
| 登录失效 | 主 Agent 最新统一失败处理增加 401/login_required 登录入口。独立 Chrome 先显示旧私人邀请记录，再让刷新返回 401：旧记录、邀请码和可写输入被清除；点击登录按钮关闭邀请 dialog，并调用既有 auth.open 恰好一次。绑定/申诉使用同一处理函数由源码核对；account_terminal 有既有停用文案。 |
| 注册 URL | 实际邮箱 OTP 提交只增加当前 URL 中合法的 24 字符随机邀请码。客户端不传邀请人/用户身份、资格或奖励；注册归因与重登录不重新归因由成熟认证 hook 和领域校验负责。 |
| 下载引导 | 邀请页只使用 consumer shell 已配置的发布 URL；空配置本次 Chrome 没有下载链接。shell 过滤无效/含凭据/本机/非 HTTPS 等 URL；不生成占位下载地址。并未实际访问应用商店或验证外部链接已发布。 |
| 导航与资源 | 只读确认新 dialog 位于既有 navigation 脚本之前，供原扫描器登记。主 Agent 另修 logo PNG embedding 和资产测试；本复审替身没有 logo，故未将其作为独立视觉验证结果。 |

## 上线界限

本轮接通的是消费者查看邀请、取码、绑定与申诉入口。真实源签名/交付证明、收件水位适配器、生产 worker、管理员审核/结案流程仍应按领域报告中的后续阶段验收。活动默认关闭，页面不能以可见邀请记录代替实际观看自动发奖能力。未进行生产吞吐、真实邮件投递或应用下载验收。
