# 注册归因与奖励入账独立复审

2026-10-03。只读复审；未修改业务代码或生产数据库，未部署或发放真实奖励。

结论：本轮限定范围未发现可复现的 P1/P2 问题。注册归因失败不会使邮箱登录失败；奖励入账按稳定操作 ID 去重，重试不会延长原有效期。

复审范围：官方 Better Auth 1.7.7 的 `user.create.after` 回调、Node 可信设备/IP 清洗与内部桥接、Go 签名 Cookie 与请求头替换，以及 `creditReward` 新增的 `ttlDays` 有效期模式。未审查仍在实施的 I00 邀请领域代码。

实际验证：

- 原目标测试独立重跑：注册归因 5 项、权益领域 19 项，共 24/24 通过；Go 原有两项代理/签名设备测试通过。
- 独立真实 HTTP 与 PostgreSQL 18 测试：缺少或伪造桥接凭据时返回 403，验证码派发和归因回调均为零；未验证的 OTP 请求不能创建归因。
- 两个并发验证码登录请求只创建一个账号、触发一次注册回调。之后使用其他邀请信息登录已有邮箱，不会再次触发或改绑。客户端提交的用户 ID、设备字段不能替代可信上下文。
- 注册归因回调和失败通知同时抛错，官方邮箱登录仍返回成功；随后通过框架会话接口确认账号可用。归因失败通知仅包含 `userId` 和固定错误码，本轮捕获输出没有邮箱或验证码。
- Go 独立临时测试覆盖无 Cookie、未签名伪造 Cookie、被改动的签名、已过期签名和合法签名五种情况。前四种不注入可信设备，合法签名才注入；客户端伪造的设备、IP、内部凭据及转发 IP 请求头均被替换或删除。
- 奖励测试实际阻塞账号行锁后再放行：入账时间不早于锁释放，1 天有效期严格按该入账时间加 24 小时。20 次并发同操作重试、原奖励到期后的重试，均返回原奖励及原到期时间；数据库仍只有一条奖励、一条入账账本和一条 Outbox 事件。
- 改变同一操作的数量、用其他操作重复同一事件、无可信权限、无效天数，以及同时提交 `ttlDays` 和 `expiresAt`，均被拒绝。`ttlDays` 只接受 1–30 的整数。

适用边界：签名 Cookie 证明的是服务端签发的浏览器标识，并不证明唯一物理设备或唯一自然人；邮箱验证也不证明有效观看或可信 App 安装。本轮尚未接入供应方可验证的播放事件及媒体授权能力，因此不能据此声称真实视频次数拦截、邀请有效观看或自动发奖已完整上线。`creditReward` 仍是可信管理/任务命令，当前公共 HTTP 接口没有直接充值入口。

独立验证使用真实框架、HTTP 和隔离的 PostgreSQL 18 内存数据库；未访问真实视频来源或 SMTP。签名 Cookie 验证采用 Go 临时编译覆盖，未向仓库增加测试文件。初建测试库在显式迁移前出现框架缺表提示；缺少可信 IP 的内部测试请求出现共享限流桶提示。迁移后验证全部通过，Go 入口提供的实际 socket IP 已单独验证。
