# Dramivio AI短剧聚合 PRD

**版本：v3.3 已确认产品需求·后台复用增补稿｜2026-10-02｜仅开源选型、不限地区｜React Native App + Web**

PRD v3.1已经确认并完成双语高保真设计。本版补充原生播放器、Web适配与分阶段开发路线；尚未建设真实系统。旧名称Reelio废弃。

## 0. 决策摘要与确认项

### 确认的需求

1. 首页搜索框，下方10个后台配置的横向滑动热门标签，右侧固定筛选按钮；第二内容区域推荐；底部主页、追剧、缓存、我的。
2. 推荐和查询列表2列，每页10部；二级页有可编辑搜索框和筛选；首页“查看更多”复用查询页，封面右下角快速追剧。
3. 多渠道汇聚，同剧去重，用户界面不显示渠道营销名字。
4. 邮箱验证登录，无手机验证码；追剧需要登录，缓存需要已登录App。
5. Web每日10集、App每日50集；同一集当天重播不重复扣；同账号跨端共享观看消耗。
6. 免费版本先上线，预留收费和广告；邀请所需观看集数/时长与发奖参数由后台控制。
7. 记录用户逐集播放历史和位置，支持跨端续播；产品页面尽量简洁。
8. 不限定国内外，仅考虑开源第三方组件；PRD先完成并对抗复审，确认后出高保真图。

### 本稿的具体建议

| 决策 | 建议 | 状态 |
|---|---|---|
| 英文品牌 | Dramivio，中文候选“映寻” | 仅工作名，需核验 |
| 登录 | 自托管Better Auth + 官方Email OTP插件；RN用官方Expo集成 | 推荐，兼容性PoC后锁版本 |
| 邀请 | 独立ReferralService；开源better-auth-referral作为待审计的归因候选，奖励自己记账 | 推荐边界，插件不作为已成熟承诺 |
| RN播放 | react-native-video稳定非预发布版本优先；先评估v6与项目RN兼容 | 推荐，不追Beta |
| Web播放 | HTML video + hls.js；Safari优先原生HLS | 推荐 |
| 离线 | Android Media3、iOS AVFoundation官方能力 + 自有薄RN桥接 | 推荐；不是现成零开发方案 |
| 基础后台 | 单体TypeScript业务服务、PostgreSQL、Valkey、异步任务/Outbox | 推荐，不先拆微服务 |
| 游客App | 先提供10集体验；登录后升级到50集，合并游客已用额度 | 新建议，待确认 |
| 邀请奖励 | 有效好友+10集，仅App，7天有效，日3/月20有效邀请 | 新建议，待确认 |
| 缓存有效期 | 最长7天，以内容/权益期限为准；有效许可内离线重播不限次数 | 新建议，待确认内容授权 |

需确认：A工作名是否采用；B接受邀请插件候选、OTP兼容不通过则用独立小模块；C是否接受原生离线桥接投入，缓存不能悄悄删出首发；D游客App10集/登录50集；E后台邀请参数初始值与7天许可。品牌检索、内容授权、离线PoC与邮件投递测试是上线前置，不要求用户现在提供全部资料。

## 1. 品牌命名边界

**Dramivio** 由Drama与Video的读音联想组成，定位“AI帮你找到下一部短剧”。中文候选“映寻”，不使用品牌标语。

2026-10-02做了英文精确词的普通网页初筛，未据此建立品牌可用结论。搜索引擎覆盖不完整，也不能判断近似商标。正式使用需查目标地区商标、应用商店、中文近似名、域名和社交账号；中文名同样待核验。域名不宣称空闲，不做注册或购买。未通过时改工作名，产品模块使用中性内部代号，不让品牌变更影响接口/库名。

## 2. 产品目标、范围与指标

目标：一处找剧、减少重复结果、少操作进入播放，通过Web体验引导App，保持免费额度规则透明。

v1必须具备：目录导入与授权标识、去重和版本映射、关键词与AI情节搜索、双列推荐/筛选、邮箱登录、追剧、竖屏播放器、跨端额度账本、邀请审核、App按集缓存、账号安全/注销、基础运营后台。

v1不做：社交评论、创作者投稿、直播、多币种充值、广告正式投放、收费正式售卖、无法验证的全网抓取、无授权媒体代理。AI用于理解查询/候选排序，不能生成并假称不存在的短剧可播放。

衡量：搜索成功找到可播放剧的比例、去重误合并率、选剧到有效开播耗时、Web下载点击/真实安装转化、邮箱到达/验证成功率、次日App回访、奖励支出与误判申诉率。转化目标待小流量建立基线，不能凭空承诺固定增长。

## 3. 功能与交互需求

### 3.1 首页与查询

首页仅保留品牌/额度、搜索框、热门标签与筛选、推荐。去掉宣传标语、AI介绍卡、去重解释和重复下载介绍。标签行布局：**左侧横向滚动热门标签，右侧固定44pt筛选按钮**；“筛选”不随标签滚走。标签可左右滑动，恰好10个有效标签由后台管理；不额外生成第11个“全部”标签。点击已选标签再次取消，标签选择不应自动登录。

每个标签保存id、双语名称、稳定查询条件、排序、启用状态、配置版本；标签可以是题材或热门情节，不能让后台直接配置SQL/脚本。发布前验证恰好10个、id唯一、文案与双语完整；草稿可不足10个，线上不可发布不足/超出10个的配置。首访接口失败用App内置的10个默认标签，之后使用最近有效版本；离线标签不标实时热榜，不放不可兑现宣传；标签暂时无授权结果时可显示空结果，不解除源权限；服务端权限/内容状态仍优先于缓存标签。后台支持拖动排序、预览、发布、回滚。默认10个：甜宠/Romance、逆袭/Comeback、悬疑/Mystery、古装/Period、都市/Urban、重生/Rebirth、穿越/Time travel、家庭/Family、职场/Workplace、奇幻/Fantasy，最终内容由后台改。长标签不截断核心意思，允许横向滑动，右侧筛选保持可触达。

推荐标题右侧查看更多，2列、每批10部。封面右下角独立44pt追剧按钮；已追剧勾选，取消可撤销。

统一查询页：第一行返回箭头+标题；第二行**可编辑搜索输入框+搜索按钮**；第三行综合筛选栏；下方双列内容。首页关键词、标签、结构化筛选完整带入，并显示当前条件，用户能直接改词、删词、清除条件、重新搜索。输入草稿与已提交查询分开：输入不立即请求，搜索按钮/键盘提交后重置cursor；保留筛选，取消标签条件不清空关键词。清除全部同时清关键词/标签/筛选，回默认推荐。修改查询后请求取消/版本校验，旧响应不能覆盖新结果。

每批10部去重后的剧，cursor分页；下拉刷新、上滑触底加载。广告不占剧数量。加载失败保留当前列表；空结果仅给“暂无结果”和“清除筛选”。后退恢复已提交查询、筛选、滚动和页数；输入未提交时返回按原页状态，不暗中把草稿当结果。

关键词/自然语言搜索、单个非默认条件游客可用。两个及以上非默认结构化条件需主动登录，标签映射多个内部字段时整体只算**一个标签条件**；用户新增独立筛选再计数。排序非默认算一个；默认值和搜索词不算。登录后恢复全部待提交条件，取消登录回原结果，后端执行相同计数规则。

AI最多200字符，建议游客5次/日、已登录30次/日，后台可调且不扣观看额度；超时约3秒降级关键词检索。AI结果只来自授权可用目录，不能编造剧名/调用发奖或管理动作。用户界面不放技术解释，只在降级影响结果时简短提示。

### 3.2 追剧、我的

追剧Web/App都可用，均需登录。统一drama_id保存，不按渠道收藏。登录后恢复一次原追剧操作；服务端幂等，失败不显示永久成功。支持最近更新、继续观看、下架占位与删除。

我的包括基础/邀请额度、每日重置时区、邀请记录、历史、语言、缓存管理、登录设备、邮箱更换、退出、注销、反馈与内容投诉。邮箱无密码则不出现忘记密码。首次账号创建需明确条款同意，营销同意独立且不默认勾选。

### 3.3 双语

简体中文默认，可手动切English并记住。所有页面、错误码、邮件、分享内容、无障碍标签具备i18n key。英文使用复数与本地数字格式。界面语言、内容音轨/字幕、搜索语言分开；没有英文剧名则保留原名，不虚构已有配音。中文/英文切换不能清登录态或播放进度。

### 3.4 播放器

9:16优先；选集弹层、0.75/1/1.25/1.5/2倍速、进度拖动、暂停/继续、同剧下一集、追剧、缓存、分享、自动画质及源实际支持的清晰度。参考红果的选集、倍速、一键追剧习惯，采用自有布局。首页不自动播，Web点击启动以兼容自动播放策略。

默认仅同剧自动连播，每集授权后才启动；最后一集停在完结页，不偷偷跨剧。App滑动切集只作用于画面，不能抢进度条/选集手势。App画面空白区长按约350ms临时2倍速，松手或取消恢复基础倍速；控制区、暂停和广告期间不触发。Web用选集与倍速菜单，不启用长按倍速或App滑动切集手势。离开页面/后台默认暂停，系统来电/音频焦点正确处理。首版不承诺后台播、投屏、小窗、全浏览器DRM，能力由实际平台返回。

错误恢复：网络失败保留集数/进度；同版源自动换线不重复记账；不同剪辑版不能按相同序号换线。重试默认同一授权。下架/地域/版权/源不可用显示具体可读状态，不能全部变成“请登录”。

### 3.5 逐集播放记录与续播

必须记录“用户看过哪些集”和“每集停在哪里”，不只记录最后一次点开的剧。

| 数据 | 必须字段/用途 |
|---|---|
| 每集记录episode_progress | user_id/guest_id、drama_id、edition_id、canonical_episode_id、position_ms、duration_ms、actual_watch_ms、completed、last_watched_at、revision |
| 观看会话playback_session | session_id、device/install_id、episode_id、server_started_at、last_sequence、授权id、端类型；用于同步和去重 |
| 最近续播drama_resume | user_id+drama_id、最新有效episode_id、position_ms、last_watched_at；首页/追剧续播入口 |
| 有效观看事件watch_event | session_id、sequence、实际观看区间、前台状态、服务端接收时间、媒体交付关联；邀请资格用，不能拿进度位置代替 |
| 解锁记录episode_unlock | user/guest+episode_id+服务端日期、扣减来源、授权状态；历史不是解锁凭证 |

开始播放后约每10秒上报一次，暂停、切集、退出、后台前立即尝试保存；断网/强杀无法保证最后一次发送，允许最多约10秒普通误差，离线先本地持久保存、联网重试。游客只本地/签名身份记录，登录按已授权身份迁移，合并不能刷新额度。提交必须验证播放会话和用户，客户端不能指定他人user_id。

位置从播放器读取，校验0≤position≤可信duration；duration取媒体目录/服务端确认，不能信任客户端任意时长。拖动允许位置变小，因此不能用max(position)合并。actual_watch_ms为实际前台观看时间，重复片段不人为增加完成覆盖；完成状态按内容结束事件与去重观看比例判定，默认≥90%覆盖且到结束附近，后台可调。seek到最后不等于看完整，也不能据此完成邀请。

每个会话事件有递增sequence，重复/乱序事件不重复累计。跨设备同一集采用服务端revision/CAS：新设备续播先读最新revision；并发设备提交冲突，保留各自会话位置，但共享续播只接纳当前有效播放会话的新revision，不能让延迟上传的旧设备回退另一端进度。切入新播放会话时可明确取代活动写入会话；旧会话收到冲突停止覆盖，不单凭client timestamp判新旧。离线旧进度回网默认保留本地分支，若已有更新共享进度不覆盖，可让用户选择“从本机位置继续”。

播放完成当前集后，续播优先下一未完成集0秒；如果下一集不可授权/下架，则停留当前集完成状态，不自动扣下一集额度。同一剧存在不同剪辑版只在可验证时间映射时迁移位置，否则显示“当前为不同版本，从本集开始”，不强行套用秒数。

UI只显示“继续看 · 第{n}集”和必要小进度条；观看历史按剧聚合，进入可看逐集记录。用户可清除历史/指定剧记录，清除操作递增账号/剧history_epoch，同步事件携带epoch，旧设备队列/备份的过期epoch不得恢复已删历史；其他设备重连先同步删除状态再上传。epoch/最小墓碑用于拒绝旧事件，不保留完整被删历史。清除进度不删除已用额度和最小风控审计，不允许通过清历史刷额度。注销进入terminal状态并撤销会话/许可/待处理奖励，回调不能重建账号；新注册是独立身份，不从删除队列恢复profile。必要账本按披露期限保存。灾备恢复先重放独立保存的删除/撤销日志再开放流量，旧备份最长保留建议30天，恢复后再次执行擦除；失去删除日志的备份不可直接上线。

## 4. 选型、复用范围与修改路径

以下为官方资料可确认的能力与本产品建议的分界；本轮未安装依赖、未审计插件源代码、未执行真实媒体PoC。仅接受可核验开源许可证的第三方依赖与自有代码；OS内置API单列，不把它们误称第三方开源库。

### 4.1 登录：首选Better Auth自托管

[Better Auth官方仓库](https://github.com/better-auth/better-auth)声明MIT；官方[Email OTP](https://better-auth.com/docs/plugins/email-otp)支持邮箱代码登录及新用户注册；[Expo集成](https://better-auth.com/docs/integrations/expo)提供RN会话集成。适合自行部署、控制邮件、数据与风控入口。

复用：OTP校验、账号/会话、会话撤销、邮箱验证；保留框架的安全路径。修改：中文/英文表单、邮件模板、业务协议记录、挂起动作恢复、可替换SMTP、分功能限流及风控钩子、业务profile/权限。

建议显式配置而非照搬默认：6位、10分钟、5次错误、60秒重发、重发轮换旧码；OTP摘要存储，实际字段按锁定版本核验。更换邮箱需要近期原邮箱验证+新邮箱验证，不能只信任已有长期会话。有效账号才创建业务权益，框架提前创建的未验证记录不算已注册奖励用户。

分布式限流使用Valkey/框架可支持的共享存储；框架[rate-limit](https://better-auth.com/docs/concepts/rate-limit)能力需配置。不默认启用需要闭源第三方服务的Captcha集成；开源挑战可在统一入口挂自托管适配，先验证RN可用性。所有OTP路由都应用同一策略，挑战只能提高自动化成本，不能证明一人一号。候选采用[ALTCHA开源核心](https://altcha.org/docs/open-source-vs-paid/)与自托管校验库，排除其Cloud/Sentinel商业产品。Web用开源widget，RN需验证WebView或原生挑战adapter、超时/低端机耗电；challenge绑定用途/nonce/过期时间，解答服务端校验且一次性消费。

官方Expo示例适用Expo模块；裸RN若现工程不带Expo，先验证引入expo-modules/SecureStore的兼容成本，不假设可直接复制。可用平台安全存储适配会话，禁止把生产会话写普通AsyncStorage。Web采用安全Cookie与CSRF防护；RN按官方集成传递会话，服务端每次敏感动作核验会话与撤销状态。

不用：魔改OTP随机数/加密核心、自写密码系统、客户端校验OTP、默认启用无关密码/OAuth/组织功能、把CORS当防刷。所有框架公开路由和内部别名都要经过限流/策略，管理服务不暴露原端口。用户通过API直接调用也必须得到同样结果。

开源备选为自托管Supabase Auth；当前不引入第二套身份系统。仅在Better Auth兼容PoC失败时重新选型。托管商业版不纳入本稿。

### 4.2 邀请：不能把小插件当成熟反作弊系统

候选[@marinedotsh/better-auth-referral](https://github.com/marinedotsh/better-auth-referral)为MIT社区插件，提供邀请码、归因和步骤完成能力；Better Auth[社区插件页](https://better-auth.com/docs/plugins/community-plugins)明确社区插件非官方认证。

**关键缺口：**已读README重点描述密码邮箱/OAuth注册归因，未据此确认Email OTP自动注册路径兼容。不能因为“同是Better Auth”就认为无密码流程一定被插件拦截。PoC必须验证OTP新建用户、已有邮箱不绑定、并发验证、无效邀请码不能阻止正常邮箱登录。

接入方式：ReferralService适配层把插件能力限制在邀请码和关系；业务邀请关系以自己的数据库约束为准，插件事件可重复但不能直接发钱/额度。PoC兼容且源代码审计通过才采用；若不通过，用自有小型归因模块实现随机邀请码、一次绑定、必要列表，复用认证后的user_created事件。这个替代模块是新增开发，不宣称有“成熟开源框架”背书。

只有服务端可以记录email_verified、qualified_watch、risk_approved三个业务步骤，最终自己的credit_ledger记奖。禁止把插件“注册成功即完成”默认值直接上线；回调仅写Outbox，不能直接加余额。邀请人不可获得被邀请人的邮箱/实名，返回计数和脱敏状态。

不使用GrowSurf等商业邀请框架。未通过OTP适配与源代码审核的社区插件不进入生产，不能以“开源”代替质量验收。

### 4.3 播放：RN与Web分别复用成熟引擎

[react-native-video v6](https://docs.thewidlarzgroup.com/react-native-video/docs/v6/intro/)提供原生视频组件。首选项目兼容的稳定正式版本，工程调研后记录RN、iOS、Android、播放器版本组合；[v7文档](https://docs.thewidlarzgroup.com/react-native-video/docs/v7/player/drm/)当前标注Beta且DRM为独立插件，因此不把v7默认列为稳定首发基线。

修改的是业务控制层：选集、倍速、追剧、UI、进度同步、授权会话、错误换线、缓存入口。播放器核心先不fork；必须改native时用可追踪小补丁或独立adapter，并写回归用例。重放、seek、画质和源切换都保留canonical_episode_id和授权。

Web采用原生HTML video配合[hls.js](https://github.com/video-dev/hls.js)：MSE环境用hls.js，Safari测试原生HLS路径；不能承诺hls.js支持所有编解码器/DRM。默认HLS+H.264/AAC主兼容路径，不给首版强制HEVC。

### 4.4 缓存：成熟平台能力，需要原生桥接

[react-native-video缓存文档](https://docs.thewidlarzgroup.com/react-native-video/docs/v6/other/caching/)描述播放缓存，平台格式限制不同，不能替代选集离线队列、权限或许可证。[Offline Video SDK](https://docs.thewidlarzgroup.com/react-native-video/docs/v6/other/downloading/)是商业附加组件，本轮不采用。

Android复用[Media3 DownloadService / DownloadManager](https://developer.android.com/media/media3/exoplayer/downloading-media)，iOS复用[AVAssetDownloadURLSession](https://developer.apple.com/documentation/avfoundation/offline-playback-and-storage)。Android Media3为开源组件；iOS AVFoundation是系统内置API，不是采购的闭源第三方SDK；Apple系统本身不开源。仅开源原则适用于项目引入的第三方库，不虚称iOS原生API开源。RN桥接需要自己补下载状态、读离线asset、账号绑定、存储和许可证；不等于装一个JS包就完成。

PoC必须实际证明：锁定react-native-video Android底层与Media3版本是否一致，下载CacheDataSource能被播放adapter读取；iOS下载的asset定位能正确传给AVPlayer；后台受系统调度、kill与重启状态恢复可行。不能将Media3下载的分片目录误当普通mp4路径传给JS播放器。若引擎版本冲突无法以薄adapter处理，再评估统一开源native底层，需重新评估成本，不默默fork整个播放器。

缓存格式v1优先已授权HLS，画质720p、可选实际有的1080p，首版只下载默认音轨+所选字幕。MP4可作为在线兼容，不自动承诺其离线授权能力。DRM持久许可仍需要内容方/许可服务，不因SDK开源而免版权或DRM服务成本。

无DRM内容可按内容方许可使用App私有目录+本地访问策略，7天是普通客户端策略，**无法保证抵抗root/越狱/修改时间后提取和播放**。仅当内容合同接受这个保护等级才启用；要求强制不可越期的内容，必须持久DRM验证通过才允许缓存。没有下载许可或无法落实保护要求的内容只可在线，UI明确说明。

### 4.5 AI检索

v1建议自托管[Qwen3-Embedding-0.6B](https://huggingface.co/Qwen/Qwen3-Embedding-0.6B)，模型卡标Apache-2.0，用于中英文剧情语义检索，不接闭源模型API。关键词命中+向量召回+授权筛选+排序即可，不先做生成式聊天。推理运行库、向量索引依赖逐个核验开源许可并锁版本，训练数据全量是否公开不作承诺。目录有更新/下架时更新索引与实时权限过滤；模型失败降级普通搜索，PoC报告查询相关性和实际算力延迟。

## 5. 能力授权矩阵与接口管控

| 能力 | 游客Web | 登录Web | 游客App | 登录App | 服务端管控 |
|---|---|---|---|---|---|
| 搜索/单筛 | 是 | 是 | 是 | 是 | 查询限流/目录权限 |
| 多条件筛选 | 引导登录 | 是 | 引导登录 | 是 | 条件计数与权限 |
| 新集体验 | 10 | 10 | 建议10 | 50 | 跨端账本+设备资格 |
| 当天已解锁重播 | 是 | 是 | 是 | 是 | 验证已授权记录 |
| 追剧同步 | 否 | 是 | 否 | 是 | 按user_id授权 |
| 创建邀请链接 | 否 | 是 | 否 | 是 | 已验证账户/活动资格 |
| 奖励使用 | 否 | 否 | 否 | 是 | 奖励账本/到期 |
| 缓存 | 下载引导 | 下载引导 | 登录引导 | 支持获许可内容 | 端资格+版权+空间+额度 |
| 发奖/改额度 | 否 | 否 | 否 | 否 | 后端事务，仅内部服务 |

App权益不能只看客户端platform=app、User-Agent、包名或自报版本号。服务端建立与账户/安装密钥绑定的App会话：支持平台的完整性证明、挑战、重放防护、应用签名与分发渠道策略。iOS用系统能力评估[App Attest](https://developer.apple.com/documentation/DeviceCheck)，Google Play分发可评估[Play Integrity](https://developer.android.com/google/play/integrity/standard)；无Google服务设备不能一律依赖Play Integrity，否则误伤合法设备。非Google渠道需定义可验证包签名与设备密钥等替代证据、供应商可用性和风险阈值。

合法登录App维持每日50集。仅platform字段/自报包签名不能直接授予App会话；普通安装密钥只证明同一安装持有密钥，不证明正版。P1按分发渠道记录信任根、可验证证据、覆盖率；无法做强证明的平台走安装会话+服务端风险审批、限流和共享预算，低风险仍给50，异常单独审核，不因无Google服务默认降到10。完整模拟安装握手仍可能获得50，是明确残余风险，不能宣称硬防App仿真。允许使用OS内置证明服务，不采购闭源第三方反作弊SDK。硬防仿真与所有平台通用50不能同时无条件保证；本稿优先合法用户50与成本控制。

账号默认仅1个活跃在线播放会话，新设备开始时提示并替换旧会话；下载队列独立，不占在线会话槽。段授权/会话续期在约30秒内收敛旧会话，已经缓冲的片段不能瞬间收回。跨设备同时观看不用于快速累积邀请时长；服务端累计真实墙钟时间且去重。此规则为可配置提案，必须明示给用户。

服务端返回allowed/reason/retry_at/requirements/policy_version，前端据此显示按钮；拒绝码区分LOGIN_REQUIRED、APP_REQUIRED、QUOTA_EXHAUSTED、RIGHTS_UNAVAILABLE、RISK_REVIEW、RATE_LIMITED、CONTENT_REMOVED。远程配置只控制表现和允许能力，不能覆盖内容版权或账本不变量。敏感路由不可因“旧客户端不识别错误”默认放行。

## 6. 额度、并发和记账语义

### 6.1 不变量

- 同用户+canonical_episode_id+北京时间日期仅一个当日解锁；不是URL、渠道集号、点击次数。
- Web/App不叠加60。例：Web10后App基础40；App20后Web不可解锁新集，但当日已解锁可重播。
- 基础与奖励分账。基础先用，App基础50用尽才用到期最近的奖励。奖励只增App可解锁数，Web仍不能新增超过其基础门槛。
- 已有效离线许可可在7天内离线重播，包括跨天，不重复扣；这是明确的缓存权益，不把离线播放强行算成当日在线消费。
- 禁止负额度、超额预留、同集多源双扣；管理员补偿也是独立审计事件。

### 6.2 在线授权

请求→校验内容/账号/设备/端→数据库事务预留→源预检→在发出可播放媒体授权前事务提交解锁→下发短期媒体会话。会话绑定用户、端、剧集、版本、到期；未提交不能发清晰媒体或密钥。核心记账点是**首次取得有效播放授权**（不是用户点下按钮就必然扣次）；点击后源预检失败不扣。用户已经收到媒体授权，即使退出也不能靠无心跳自动退额度。

若提交成功但响应丢失，重试凭幂等键取得相同解锁。服务端确证“零可播放分片且零可用密钥/许可交付”的基础设施故障可走审计补偿，撤销旧会话再退款；单凭客户端说失败不自动退款。旧方案“先免费播5秒，再靠客户端报告扣次”废弃，避免不断重试白看。

媒体首请求应换取/验证授权，源短期地址不能跳过业务服务永远复用。自有授权CDN/代理能检查每段签名；只有不可控上游长效裸链时无法硬执行播放限制，必须标为不上线该资源的能力缺口，而不是仅UI显示10/50。

数据库唯一解锁键+按账号/日期锁保护不同集并发。Valkey仅用于限流/缓存，不作为最终额度真相。Valkey故障不能导致放行发奖，数据库故障禁止新解锁；已有有效短期会话继续到期。

午夜按服务端预留日归属，预留只用于短时在线请求约120秒；超时作废，次日重新申请。客户端改日期无效。回滚重试只能确认已有提交，不可换日多扣。自动预取下一集不得取未解锁媒体，最多取公开metadata/不含密钥的必要信息。

### 6.3 缓存记账

确认多选后预留额度，显示数量/空间；不是下载完成才第一次检查权益。已有有效离线许可或当天已解锁的同集不再重复扣。长期排队不长期占用昨日预留：实际启动前重校验当日额度，剩余额度不足停该任务并提示。

DRM路径：先下载不可播放的加密资产，完成校验后先在DB事务提交解锁，进入committed_pending_license，再用稳定业务订单幂等发证；成功进入active。外部许可证服务与DB不是原子事务，Outbox只负责可靠重试，不保证端到端恰好一次。响应丢失先按订单查结果，pending重试不再扣次；确证未签发、无可用许可且旧订单已关闭时进入failed_compensated并补偿。签发结果未知保持pending/对账，不能直接退款后重开许可。发证路径必须支持订单幂等、结果查询和必要撤销，否则该内容不开放DRM离线；15分钟未恢复告警并显示“准备中”，24小时内对账/人工处理，不把有结果不明任务当失败自动放行。

非DRM路径：明文媒体可用时已经交付观看能力，必须在交付前提交，不得等全部下载完后再扣。删除文件、取消到一半不会自动恢复已解锁次数；首次交付完全失败的补偿与在线同规则。UI在确认前说明此差别。

episode_unlock是当日在线权，offline_license是另行审批的App离线权；在线权不自动延长7天。当天在线解锁转缓存可免再次扣，但必须再次通过App/版权/存储检查。离线到期=min(首次签发+7天，内容方允许的离线到期，适用权益允许的许可上限)，签发时固定，下载确认读取服务端permit preview，缓存详情显示许可实际到期时间，不靠客户端推算，不能统一写成必定7天；未来普通配置不追溯缩短已签发许可。删除、换画质、重下载、换设备不延长。有效许可期间App本地播放及同集重新获取不再扣；Web不能借此获取跨日免费新解锁。到期续期需要联网并按当日解锁规则重新获得一次授权，当天已经解锁则不重复扣。许可绑定账号+设备，换设备重新验证并签发受原到期约束的设备许可，不复制私钥；有效账户许可迁移不占新增设备当日“新集”预算；每账号同时可持有效离线许可最多2台设备，新增设备需解除或等待旧许可到期，后台可配但不得无限增加。离线旧设备不能即时撤权，停止续签不等于已离线许可立刻消失，迁移必须告知该期限边界。重下载仍占带宽限流。空间上限建议100集或2GB先到者，下载并发2个、单次最多20集；可配置，不把这些当平台强制值。首次免费和重下载都受带宽预算/频率限制。

下载状态跨重启持久保存，不依赖JS后台定时器。系统拒绝后台任务/强退不能承诺一直下载；恢复App后重建任务。退出锁定下载，换账号不能复用许可，注销清本地文件/钥匙。离线无法实时撤权，强保护以持久DRM自身期限为准；无DRM只保证普通客户端行为。

### 6.4 游客与刷每日额度

游客用签名访客标识+安装/设备证据+IP风险信号；登录把游客已解锁集合并入当天账号，不重送10集。匿名身份易重置，不能保证访客身份一人唯一。

只限制邀请奖励不够：多邮箱账号还可能不断获得每日50集。新增可配置“新账号/可疑设备共享免费解锁预算”：同一可信安装/风险设备当日新增免费剧集基础上限50，Web10；换账号仍共享。一次授权事务同时检查账号基础账本与适用设备预算，按固定锁顺序（设备预算键→账号预算键，各自排序）处理；设备预算按episode_id集合去重，不因不同账号重看同集重复增加。以上10/50和共享设备预算只适用于免费权益。授权统一读取当前端entitlement的基础上限L，检查账号全端当日基础消耗<L；免费来源同时占用适用设备免费预算。已验证付费来源使用订单权益及付费风控/带宽限流，不占免费设备预算、不被免费50门槛截断；不得将付费消耗改写为免费来源。升级保留已用基础数，按新L计算余额。已验证长期用户与共享设备可审核放宽，不能仅用IP做总预算。该规则必须公开到额度说明，以免同设备多用户被无提示降额。奖励消耗不计入免费设备50上限，只在账号当前计划基础上限L耗尽后可用，且须已批准的奖励、App会话与账号风控；免费设备预算先耗尽但免费账号未满当前L时不能自动跳到奖励，提示免费资格受限/审核。游客迁移按原解锁事实做union，不复制余额，不回滚设备消耗来源。合并合法基础解锁数超过当前L时保留全部既有当日授权，新基础余额=max(0,L-合并基础消耗)，不裁剪/退款；基础/奖励来源和原设备预算保留，不能把奖励记录误转成基础。无法可靠关联的新设备、重装和真机农场仍有残余风险；配合总成本预算和异常检测，不承诺一人一号。

## 7. 注册、邀请与风险控制

### 7.1 注册边界

登录首屏从上到下仅Logo、剧库名、“欢迎登录”、邮箱输入、发送验证码、协议勾选与必要错误提示；验证页只显示邮箱、验证码、确认、重发和修改邮箱。新老用户共用入口，必要小提示为“未注册邮箱验证后将创建账号”。没有AI/聚合介绍、品牌英文口号、装饰说明卡。

无密码流程：输入邮箱→明确同意→发送码→验证→首次创建/已有登录→建立业务用户→恢复动作。邮件/页面统一提示，状态码与响应时序也避免区分账号是否存在；挑战绑定规范化邮箱、用途、挑战版本，不跨用途复用。缺邀请码、无效/过期邀请不阻止正常登录，只提示邀请未绑定。Email OTP机制与Referral适配分开测试。

建议限流：邮箱5封/小时、10封/日，设备10次发送/小时、IP30次发送/小时，验证错误5次/挑战，同时按邮箱/设备/窗口累加错误防止重发重置计数；收紧或共享网络例外通过策略管理。重发旧码失效，滥用总发送量达到预算暂停新挑战并给稍后提示，不能停已有用户正常会话。新用户等待验证不授予邀请资格、下载许可和50集。

邮箱仅规范空白和域名等安全部分，不把所有域名的点/+规则强行合并；供应商别名和临时邮箱只作为风险信号。验证码/邮箱/令牌不进日志，记录脱敏ID与错误码。登录设备列表、撤销所有会话、换邮箱、注销要覆盖客户端缓存和服务端会话。换邮箱用唯一约束与事务处理并发占用；原邮箱丢失走人工核验，不以客户端声明免验证。

同IP注册初始规则：≤3新验证账号/24h正常观察；4–10提高验证/审查新奖励资格；>10暂停该来源新奖励发放并复核。已有用户不因共享IP被集体踢出，IP不是身份证。家庭/学校/运营商NAT、IPv6、VPN都是风险分析边界，拒绝有申诉入口。

注销后清个人资料/片单/历史，保留最小必要、事先披露的安全和权益审计记录有保留期限；不能永久保存完整个人数据来防刷。合法删除流程不承诺能做到永久防重注册，记录到期后存在复领残余风险。规则/标签发布、发奖/撤奖、内容合并分别设后台权限和审计，公开客户端不可访问编辑接口。目标地区的合规及短剧分发资格由正式上线专项核验，本稿不自行认定某具体资质一定满足。

### 7.2 邀请资格与发奖

邀请链接为签名随机token，不含邮箱。v1采用确定性归因：安装并登录后输入/确认邀请码；若系统深链已带token则确认一次。**不把安装后参数必然恢复作为首发承诺**，首次启动可手输码。登录/注册后24小时内且完成有效观看前可绑定一次，已有历史合格用户不算新人；禁止后换邀请人。

有效好友：合格新用户、App邮箱验证、在后台设定窗口内有效观看指定数量不同集、通过风险审批。邀请规则兼容倍速：设后台允许的最高资格倍速max_qualification_speed（建议2），可信集长为D秒。若D/max_qualification_speed小于min_watch_seconds，则归为短集：唯一内容覆盖≥short_episode_ratio，实际前台时长≥ceil(D/max_qualification_speed×short_episode_ratio)；其余集实际前台时长≥min_watch_seconds。允许资格倍速范围内的完整观看均可达，不要求靠重播补墙钟。每集资格计时只累计未重复的内容区间，重复片段不刷时长；seek不算，超过最高资格倍速不计资格且规则详情提示。参数按活动快照，旧邀请不改。媒体网关交付证据与签名会话心跳联合判断；按invitee+canonical_episode_id+campaign聚合去重，一集最多贡献一次，新人也不能跨campaign反复算首次资格。只接纳当前前台资格会话在租约内的墙钟时长，旧会话收敛期间不继续累加，跨设备/重建session不能将重叠墙钟时间相加。遥测不能证明眼睛在观看，自动播放真机农场仍需成本预算/审核。离线下载不算有效邀请观看，批量后台下载不能触发奖。没有媒体交付日志控制的源不支持以观看发奖。

**后台控制所有邀请参数**：所需不同集数required_distinct_episodes、每集有效前台时长min_watch_seconds、短集最低完整比例short_episode_ratio、最高资格倍速max_qualification_speed、完成窗口qualification_window_hours、奖励集数reward_episodes、奖励有效期reward_ttl_days、日/月有效邀请上限、奖励余额上限、风险审批模式（自动低风险通过/人工复核）。核心自邀/幂等/额度不变量不能通过后台开关关闭。起始建议为3集/30秒/90%/24小时/+10集/7天/日3人/月20人/持有100集，不作为硬编码规则。后台发布采用类型/范围校验：所需集数1–50、最低秒数1–300、短集比例0.5–1、最高资格倍速限播放器支持的1/1.25/1.5/2、窗口1–168小时、奖励1–50集、有效期1–30天；范围为初始保护配置，扩大需评审，不接受负数/任意脚本。检查观看窗口与基础可观看数是否可达。参数只服务端读写，UI从活动配置显示“好友有效看满{n}集，得{bonus}次”，不写死3和10。

绑定时在同一事务预留奖励名额与金额，持有上限按“未到期余额+待审预留金额”检查；日/月名额按北京时间绑定日/月归属，不能到发奖日才抢前三。无法预留时仍允许正常注册，但必须在绑定前提示本次无奖励资格。预留覆盖观看窗口，按时达标延长至审核完结；到期先进入待核对，允许5分钟遥测上传宽限，但有效观看必须发生在窗口内且有可信服务端会话/交付时间；宽限不增加观看窗口。后台任务延迟按事件实际服务端记录时间核对，不能只凭worker执行时间判迟到。确定未达标/拒绝后才释放名额，达标与释放竞态用事务锁处理。发奖把预留转实账，不能再受后来新规则截断；审核超过72小时告警，不无故释放按时达标的承诺。条件与活动policy_version绑定，在首次绑定邀请时冻结规则快照，达标/审批/发奖与有效期都用该快照。后台新规则只影响新绑定；冻结活动可暂停新绑定，但既有承诺不能无提示改成更高观看门槛。奖励有效期从实际入账起算，按时达标的资格不能因审批延迟过了窗口失效。

禁止自邀、同设备关联小号、循环关系和重复领；同IP独立设备家庭好友可复核通过。风险状态是observed→qualified_pending→risk_review→approved→rewarded或rejected，拒绝有原因/申诉。不能在客户端调用mark step、改邀请人、改奖励数或申请人工通过。

事务唯一键(inviter,invitee,campaign)+invitee唯一归属，奖励写Outbox与credit_ledger。回调丢失可重放，先完成条件后注册事件乱序也可对账；只达成步骤不等于成功到账，审批和账本不同状态。插件回调没有可靠幂等也不能穿透自有约束。

支持管理员审批、撤奖、补偿、封停活动，RBAC最小权限和审计；批量/大额操作二次审核。已消费的欺诈奖励保留审计、限制后续奖励，不产生负额度要求补款。管理员也不可直接改余额数据库字段。

## 8. 去重、渠道与内容能力边界

实体Drama→Edition→Episode→SourceEpisode。相同版权/发行ID优先；标题、演员、年份、简介、集数、指纹形成候选，低置信不自动合并。相同名字不代表同剧；60/80集不同剪辑不能同序号替换。人工合并必须可回滚，历史/片单引用迁移有审计。保存稳定episode别名/身份映射，历史账本不改写；当日合并后的解锁解析到统一身份，不能再次收费。拆分只对能证明原内容相同的目标保留权限，歧义转人工处理，不把一条权限复制到所有同名版本。

查询分页基于去重实体和稳定游标；导入期间版本快照避免跨页漏项，已失效项过滤后补足10部，末页不足允许。去重记录变化会导致旧游标需要重建时明确返回可恢复状态，不重复展示也不静默吞页。

用户返回字段不含渠道营销名、管理链接和源凭据，播放器自动择优。不隐藏必须的版权署名、水印或来源许可说明；聚合展示未必具有代理/缓存授权。要求完全自有域名意味着内容授权+代理/CDN成本，不能仅替换UI保证网络中看不到上游。

source capability包含 online_allowed / download_allowed / region / expiry / edition_mapping_verified / signed_delivery / drm_type / offline_protection / max_quality / attribution_required。授权到期主动停止新会话和许可，历史可保留下架占位。AI、推荐和管理员普通运营角色都不能把禁用源重新开成可播放。

## 9. 开源部署与扩展

首选自托管Node服务+PostgreSQL+[Valkey](https://github.com/valkey-io/valkey)（BSD-3-Clause）；数据库与客户端协议兼容通过PoC锁版本，异步任务先用PostgreSQL Outbox worker，避免额外引入一整套消息平台。前端静态资产、媒体存储/CDN按目标运营商测试。SMTP使用标准SMTP及可替换邮件服务，SPF/DKIM/DMARC配置、退信/投诉监控；代码开源不等于邮件、带宽、AI和内容授权免费。依赖许可证清单与锁文件记录，不使用latest自动升级。

发邮件、邀请结算和许可证重试走后台任务；Outbox与业务事务一致，死信报警/重放有操作手册。日志按req_id关联，隐私字段脱敏。备份和恢复演练包含用户、权限、账本、邀请关系与策略版本，不能仅备份目录内容。

免费权益以plan与策略配置，UI不硬写50。付费未来需新增购买/续费/退款/恢复购买/服务端凭证和账户绑定，具体投放平台与商店规则在启用时再核验；不能只开价格按钮就上线。收费、广告开关默认关闭。

广告预留：列表第6部后整行1条/页（不占10部剧）、我的功能区后、App额度不足自愿激励广告+2集每日最多5次；集间每5集一次仅候选，v1关闭；不投开屏。奖励看广告需广告方可验证完成事件+自己的幂等账本，客户端关闭/失败/无填充不发奖。只允许开源组件和自有广告服务；供应商要求闭源SDK或传递依赖时不接入。广告位置、配置、购买与异常状态见第14节。

## 10. 开发路径、交付物与闸门

估算假设：1名RN、1名后端/全栈、1名可处理Swift/Kotlin的开发者（可兼职）、共享QA；已有可用授权测试源，不能由纯JS人员无验证承诺全部离线。预计8–12周是规划量级，不是已承诺排期；缺版权/媒体控制/原生能力会延期。阶段可部分并行但不得绕过前置闸门。

| 阶段 | 预计 | 开发与可评审交付 | 通过标准 |
|---|---|---|---|
| P0需求/供应验证 | 3–5天 | 品牌核验计划、源权限表、部署/SMTP网络报告、版本矩阵 | 至少1个可控签名测试源，有缓存授权路径 |
| P1技术PoC | 1–2周 | RN双平台OTP、Web登录；邀请OTP归因；在线HLS；双平台下载→断网播 | 真机跨端/生命周期可复现；失败成本与替代明确 |
| P2后端闭环 | 2周 | 标准目录、权限gate、额度事务、Outbox、邀请审核、小型运营后台 | 并发不超扣，直接API不能越权 |
| P3产品核心 | 2–3周 | 双语搜索/筛选、推荐/列表、播放器、追剧、我的与登录恢复 | 主流程与异常行为符合本稿 |
| P4离线完整化 | 2–3周，可与P3并行 | 下载桥接、持久任务、空间/网络规则、许可与账户隔离 | 不使用播放器缓存假装离线；真机掉网/重启可用 |
| P5集成/灰度 | 1–2周 | 全覆盖报告、成本监控、备份恢复、回滚/撤权演练 | 见测试闸门，未通过不能全量 |

正式排期在P1验证后锁定，媒体网关/原生能力不是最后阶段才补。P1必须输出四个明确结论：Email OTP与邀请插件是否兼容；react-native-video与Media3是否可共用离线asset；iOS后台下载/许可是否按授权可用；各分发渠道端资格证明是否存在可行不误伤方案。失败时修改方案再确认，不等P4才承认不支持缓存。

版本升级：先固定兼容基线，再在分支更新依赖，运行合同/媒体/生命周期回归。数据库迁移走扩展→兼容运行→收缩，rollback不能回到会重复发奖或丢解锁的旧逻辑。接口至少兼容当前及上一客户端版本，最老端缺必需安全能力可提示升级、仍可浏览公开目录。

## 11. 测试覆盖范围与发布标准

这是测试计划，**本轮没有真实系统，不宣称这些测试已执行**。测试报告必须关联需求ID、用例ID、版本、真机/网络与证据。

### 11.1 单元/属性测试

- QUO：Web10/App50/跨端共享；按不同drama同集号隔离；同集换源重播不扣；基础/奖励顺序与到期；午夜；负值禁止；随机请求序列始终满足账本不变量。
- AUTH：邮箱规范化/别名不误合并、协议状态、挂起动作白名单、错误映射；无效/缺邀请不阻断邮箱。
- REF：新人资格、绑定时窗、唯一归属、自邀/循环、短集/倍速/seek/离线排除、上限、规则版本。
- CAT：同剧不同名、同名不同剧、Edition差异、合并回滚、跨页去重/过滤补足。
- DL：网络/空间/许可/账号状态机，授权耗尽和部分成功；无DRM保护等级不得被标成强DRM。
- PROGRESS：逐集/逐剧隔离、向后seek、暂停保存、10秒周期、乱序重放、强杀、跨设备revision冲突、离线旧进度、清历史不退额度。
- TAG：恰好10个、双语齐全、横滑/右固定筛选、版本回滚/接口失败、二级搜索改词与保留筛选。
- CONFIG：邀请观看集数从3改为5、时长从30改为60；既有邀请固定旧policy_version，新绑定用新规则，页面与服务端一致。

### 11.2 集成、合同与安全回归

| ID | 必测场景 | 验收断言 |
|---|---|---|
| I01 | 100个同集并发授权 | 唯一解锁、扣1，重试同会话语义 |
| I02 | 剩1次，100个不同集并发 | 只有1个新集成功，其余明确额度不足 |
| I03 | 播放与缓存同集并发 | 共用解锁约束，不双扣、不发无账本许可 |
| I04 | DB已提交但客户端响应丢失 | 重试可恢复授权；不能扣2 |
| I05 | 午夜/预留过期/乱序完成 | 归属明确；没有跨天白领或重复扣 |
| I06 | 伪造App字段、过期/重放端证明 | 裸platform/自报签名被拒；完整模拟弱证明路径的残余风险与预算受控 |
| I07 | 直接访问OTP/邀请内部路由 | 同样限流；客户端无法标资格、审批或写余额 |
| I08 | 同码并发/重发旧码/过期/爆破 | 仅有效挑战成功；框架额外路由不漏策略 |
| I09 | 已存在邮箱OTP、首次OTP与邀请码 | 老用户不重新绑，首次只绑一次，无邀请码仍可登录 |
| I10 | 奖励事件重复100次、乱序/丢失重放 | 唯一奖励；有对账可恢复 |
| I11 | user_id/episode_id/下载task_id替换 | 不读写他人片单、许可、邀请、会话 |
| I12 | Valkey/邮件/AI/源/worker部分故障 | 受控降级，不将故障解释成授权通过 |
| I13 | 变更邮箱/撤会话/注销/重注册 | 撤销生效、没有新客奖励绕过、隐私清理可核验 |
| I14 | 私有媒体路径/长效裸链/源签名到期 | 不能绕过服务端额度；无控制源从上线范围排除 |
| I15 | 数据库备份恢复、账本/Outbox重放 | 记录完整、奖励不重复、活跃签名按恢复策略失效 |
| I16 | 两设备并播，旧设备断网后迟到上传 | 共享续播不回退；旧数据不重复累计邀请观看 |
| I17 | 清历史、拖到结尾、同一心跳重发100次 | 不重置额度、不误判完成、不重复发奖 |
| I18 | 改搜索词/条件时旧响应晚到 | 只展示最新提交结果，分页从首批重新开始 |
| I19 | 后台发布9/11个标签或邀请参数非法值 | 发布被拒；线上保留最近有效版本 |
| I20 | 同设备不同账号并发、游客登录并发迁移 | 同一事务保护账号与设备预算，不重送资格 |
| I21 | 多个邀请并发绑定/审批、跨月/余额满、预留到期 | 名额金额不超、已承诺奖不丢、快照规则不变 |
| I22 | 许可已发响应丢失、许可状态未知 | 查询恢复；不重复扣/重发，不盲目退款 |
| I23 | 清历史后旧设备上传、注销中回调、旧备份恢复 | 墓碑/epoch拒绝复活，terminal账号不重建 |
| I24 | 在线转离线、改画质、移设备、到期续期 | 不重复扣、不延长旧许可、重新签发有边界 |

### 11.3 RN真机与Web端到端

RN：至少最低支持与最新可用的iOS各1台；Android低端/中端与较新设备，至少覆盖无Google服务设备；华为/小米等目标渠道按首发清单加入。最低系统版本按P1可兼容的框架与媒体能力确定，不能沿用商业SDK要求推导本方案。

Web：当前及前一主版本Chrome/Edge、Android Chrome、Safari/macOS+iOS、首发支持的微信内置浏览器；明确不能播放/不能全屏的环境给系统浏览器引导，不能空白。Web无缓存功能验证到接口，不仅看按钮。

流程：查剧→多筛登录→恢复全部条件→追剧→播放→选集/seek/倍速→额度满→App引导；App邮箱注册→邀请绑定→满足后台观看条件→审核发奖→缓存多集→断网→退出/重登/换号→许可到期。

生命周期：前后台、锁屏、电话/音频中断、强杀、重启、低电量、空间不足、Wi-Fi/蜂窝切换、下载签名中途过期、系统回收下载文件、断网启动。拒绝通知/后台权限不应阻止正常在线。

媒体样本：HLS主路径、字幕、横竖屏、不同码率、断点/seek、失效分片、授权地区、相同剧不同剪辑、持久DRM（如支持），以及被允许的非DRM弱保护路径；模拟器不能代替真机DRM验证。

体验：中英文长标题、200%字号、横屏安全区、44pt按钮、VoiceOver/TalkBack、Android返回与手势；列表分页重入/空态/失败状态。剧集内容与版权说明不因语言切换缺失。

### 11.4 负载、成本与灰度

初始实验负载建议100并发业务请求、连续60分钟混合搜索/授权/重播/邀请；媒体吞吐和CDN带宽独立测量，不拿API测试当播放器吞吐。目标p95非媒体授权≤800ms、首屏可交互≤2秒、受控4G首帧p95≤3秒为验收提案，P1根据源与设备校准并记录条件；不是官方库性能保证。

账本不变量必须全通过，关键用户主流程100%覆盖；核心领域分支覆盖目标≥85%作为辅助，不能替代并发/真机证据。无未解决P0/P1；P2须有负责人、影响与缓解。安全路由、端资格、无授权媒体、重复发奖问题不得带缺口全量上线。

灰度内部→1%→5%→20%→全量，每阶段观察至少一个完整日重置与奖励周期关键事件，按用户数不足时延长。Crash-free sessions目标≥99.5%，误扣/重复发奖已确认事件为0；异常预算、邮件投诉、下载失败/风险误判超过阈值可独立关闭邀请/AI/下载，保留合法已解锁使用。服务关闭不能让客户端自动忽略校验。

## 12. 简洁文案与视觉阶段

页面只保留操作必需文案：搜索、筛选、为你推荐、查看更多、追剧、缓存、选集、倍速、今日剩余、邀请好友、邮箱登录。去掉“多源合一”“让AI帮你找”等重复介绍卡/大段产品说明；规则详情放可点击入口，不常驻占满屏幕。不要删除影响决定的额度消耗、缓存权限、错误原因或协议同意。

邀请主文案模板：“好友有效看满{n}集，得{bonus}次”，奖励有效期和资格用一行摘要，其他进详情。播放器可用提示“剩余{n}次”，不堆功能说明。Web下载条只写“App每日50次 · 下载”，次数使用服务端参数，不硬编码。

确认本稿后再出高保真图：新Logo；中文/英文首页（10个滑动标签+右固定筛选）、二级搜索（可改词）、推荐列表、播放器/选集/倍速、邮箱验证、追剧续播、缓存多选/任务、我的额度、动态邀请规则、Web下载引导。先不生成图片。

## 13. 对抗复审记录

上一版两轮独立文档复审结论为条件通过；本轮另外由业务边界与扩展两名子agent复审，最终结果见本节末尾。首轮7项P1、6项P2及二轮3项细节已补入本稿；条件是开发前完成选型PoC，发布前完成真实测试。没有真实系统，不宣称修复了已发生漏洞或完成安全测试。

| 复审项 | 修订 | 对应测试 |
|---|---|---|
| R01跨账号设备额度竞态 | 账号/设备同事务、固定锁序、奖励分账、游客来源合并 | I01–03/I20 |
| R02奖励承诺与上限冲突 | 绑定时预留名额/金额，绑定日月归属，按时达标保留 | I10/I21 |
| R03跨服务发证“原子”误述 | committed_pending_license状态、订单幂等/查询/对账 | I04/I22 |
| R04清历史/注销被同步或备份复活 | history_epoch、terminal、恢复前重放删除日志 | I13/I15/I23 |
| R05跨会话刷观看 | 活跃资格租约、按活动/集聚合、墙钟重叠不相加 | I16/I17 |
| R06端证明信任缺口 | 自报签名不可信；合法App50优先，弱证明风险显式 | I06/P1渠道矩阵 |
| R07在线权与离线权混淆 | 分开权限、首次签发到期不延长、迁移/续期明确 | I03/I24 |
| R08–13其余细节 | OTP跨重发限流、奖励到账起算、零交付补偿、集身份别名、标签降级、PoC后锁排期 | I05/I08/I18/I19及阶段闸门 |
| 二次复审3项P2 | 资格到期待核对/短宽限、2台离线设备、游客超额union保留旧权 | I20/I21/I24 |

仍需真实开发验证：Email OTP+邀请插件兼容；RN播放/原生离线asset桥接；媒体授权网关；各种渠道端资格；持久DRM幂等签发。仍需用户确认：工作名、游客App10/登录50、邀请默认参数、非DRM弱保护是否允许、离线桥接投入。开源不是零维护，邮箱/遥测不能证明真人；真机农场、重装访客、无DRM提取、离线即时撤权属于已列出的残余风险。

本轮最终结论：业务边界与扩展两名子agent独立复审、修订后定向复核均通过；本轮审阅范围内无未关闭P0/P1/P2。免费固定50拦住高额度会员、短集倍速资格、广告未知结果对账等已修订。此为文档条件通过，不代表实现、安全测试或上线通过；框架/媒体/离线/支付/广告证明仍需PoC与真实验收。详见《Dramivio PRD 对抗复审记录》。

## 14. 扩展页面与状态

本节是设计范围，广告、收费、通知扩展默认关闭。表中建议数值均需后台配置与发布校验；价格尚未确定，不做虚假标价。扩展关闭时对应入口、占位和请求一起关闭，免费页面不出现空会员按钮。

### 14.1 页面清单

| 页面/弹层 | 主要内容 | 必须设计的状态 |
|---|---|---|
| 登录 | Logo、剧库名、欢迎登录、邮箱、发送验证码、协议 | 发送中、失败、限流、必要安全验证、取消返回 |
| 邮箱验证 | 邮箱、验证码、确认、重发、修改邮箱 | 错码、过期、重发倒计时、验证中、网络失败 |
| 首页 | 搜索、10个横滑标签、右固定筛选、推荐、查看更多 | 加载、标签缓存、推荐为空、继续观看、可选广告 |
| 查询页 | 返回+标题、可编辑搜索框、筛选、双列剧卡 | 改词/取消条件、空结果、刷新/分页失败、无更多、广告关闭 |
| 播放器 | 剧名/集数、进度、追剧、选集、倍速、缓存 | 加载、播放/暂停、换线、无权限、下架、完成、跨设备接管 |
| 选集/倍速 | 集数状态、速度 | 已解锁/未解锁/已缓存/当前集，不支持的速度不出现 |
| 追剧/历史 | 剧卡、继续看、进度 | 未登录、空、更新、下架、剪辑不同、清除历史、冲突续播 |
| 缓存选集/队列 | 多选、画质、所需额度/空间、Wi-Fi开关、任务 | Web下载引导、登录恢复、额度不足、无许可、低空间、等待/下载/暂停/失败/完成/到期/文件丢失 |
| 我的/额度明细 | 基础余额、奖励来源和到期、账号与设置 | 游客、免费、会员状态、奖励到期、审核、读取失败 |
| 邀请/记录/规则 | 邀请码、复制、达标进度、短规则 | 无名额、待观看、审核、到账、失败/申诉、资格到期、活动关闭 |
| 额度用完 | 重置时间、邀请、Web下载、可选计划/激励入口 | 旧集可重播；无广告供给不留灰色广告按钮 |
| 广告详情/激励 | 广告标识、播放/跳过或关闭、承诺摘要 | 加载、无填充、完成待确认、到账、未完成、确认失败/申诉 |
| 计划/购买 | 价格、周期、具体权益、购买、恢复、取消说明 | 开关关闭、商品失效、价变重确认、已有计划、支付取消/失败/待处理 |
| 订单详情/恢复 | 订单状态、平台入口、刷新、反馈 | 成功待验证、权益生效、恢复无记录/成功/另账号、退款申请/通过/拒绝、撤销 |
| 消息/通知设置 | 剧更新、下载完成、奖励/权益变化、各类开关 | 权限未询问/允许/拒绝、已读、空、通知过期、深链失效 |
| 账号/设备/帮助 | 改邮箱、撤会话、注销、申诉 | 重验、邮箱冲突、丢失邮箱、注销处理中、反馈提交/失败 |

每页都做中英文。技术说明不放用户界面，规则详情可展开。邮箱输入/验证、账号安全和付款处理页不插广告。

### 14.2 广告位置与样式

只显示自有服务审核通过的图片/视频素材与目标地址，不执行广告方脚本，不加载闭源SDK。直投图片广告可以用现有RN/Web组件；广告素材权利、投放时段和链接安全单独审核。未锁定开源且可验证完成事件的激励供给前，激励开关不能上线。

| slot_id | 位置 | 样式及关闭 | 默认限制 |
|---|---|---|---|
| home_feed | 首页推荐第6部后，整行 | 1张横卡，“广告”+关闭；关闭后折叠 | 每10部最多1条 |
| query_feed | 查询第6部后，整行 | 同上，独立于剧卡，不带追剧按钮 | 每10部最多1条 |
| me_card | 我的功能列表下方 | 小横卡，可关闭；不遮注销/反馈 | 页面最多1条 |
| episode_gap | 同剧集结束后、下一集开始前 | 全屏视频，始终可关闭，不盖字幕 | 建议每5个首次有效观看集一次；默认关闭 |
| quota_reward | App额度用完弹层的可选次入口 | “看广告得{n}次”，主动点后进入 | 日5次、每次建议+2；默认关闭 |

禁区：开屏、登录/验证码、选集/倍速弹层、缓存队列、通知权限弹窗、支付/恢复、正片播放中。Web仅可开启列表/我的直投位，不开启集间或激励。已下载的离线内容不插广告。广告播放时间不计正片位置、邀请观看或每日剧集额度。

直投展示频控由服务端按账户跨设备共享，游客按签名访客+设备风险预算：建议全局60秒冷却，所有直投位合计最多20次/日，集间最多3次/日。同一页快照的同一slot关闭后，返回/刷新不立即换一条再弹；跨端同素材10分钟内不重复曝光。可见面积≥50%且前台连续≥1秒记曝光，重复事件幂等；客户端可见性用于分析，不能当广告奖励或结算唯一证据。

广告请求失败/无填充/素材失败直接折叠，保持滚动锚点，不能改变10部剧分页、挡住下一集或扣额度。慢请求过期后丢弃，避免突然插卡把用户正在点的封面移位。集间先保存正片进度；关闭、失败或无填充后继续原流程，下一集仍要正常查额度。已解锁重播、seek、暂停/重试不增加“已看5集”计数。

广告素材仅允许HTTPS目标地址和后台白名单协议；外链通过系统浏览器打开，返回保留原页。不给广告系统邮箱、原始观看历史、媒体凭证或可播放私有地址。对已知未成年账户不投激励/行为定向；拒绝个性化时只能上下文直投或无广告，不强制同意才能看免费剧。未选用户年龄时不默认生成年龄画像。

### 14.3 激励广告流程

首期不接入。启用条件：符合开源依赖限制的供给与后端完成证明通过验证，广告方回调鉴权/查询协议明确；自有直投视频只有播放器ended事件不满足发奖要求。没有完成证明就只展示直投，不自动加次数。

已登录App主动点入口→读取reward_offer快照（广告、奖量、到期、完成条件）→服务端预留日名额/奖励金额→创建opportunity_id→展示→完成证据审核→奖励账本提交。每账号只允许1个未完结机会，多个设备不能同时预留。曝光、点击不发奖；重复/迟到事件用opportunity_id+供应事件ID去重。

机会15分钟有效，完成必须发生在该窗口内；服务端收到的可信完成事件可在24小时对账宽限内处理。超过窗口不是自动发奖；结果未知显示“确认中”，不能诱导用户重新看。24小时后仍未知转review_required并告警，保留预留和机会锁，暂停该账号新的激励机会；人工核对后才提交或释放，不能为解除锁而丢弃已完成承诺。人工队列可反馈进度；迟到证据仍走同一机会幂等核对，不创建第二份奖励。供给具备更严格时限则以已接受的offer为准。奖励建议入账后24小时有效，仅App，单列广告奖励来源。广告奖励与邀请奖励共用总奖励余额保护上限，基础先用，奖励按最早到期消耗。

取消/未完成/确定失败释放预留；完成待核对不释放；伪造证据拒绝并留最少审计信息。已达条件但关闭页面的迟到有效结果仍到账，不因离开页面丢承诺。异常风控允许审核/申诉，不默认重复加奖。活动停用或用户此时升级会员，已合法完成的旧offer仍按快照结算；用户注销则按终态规则取消未结算机会，不重建账户。

页面提示限三种：“确认中”“已到账”“未完成”。失败提供一次重试查询/反馈，不能把广告加载失败写成“播放次数不足”。

### 14.4 付费页面与订单

首期免费，计划页面隐藏。后续计划包含名称、App/Web每日新解锁上限、去广告范围、缓存集数/设备数/有效期，所有权益用明确数值，不写“无限”。价格/币种/周期从平台商品获取，展示自动续费、取消路径；未配置可售商品不开购买按钮。先不设一次性次数包，避免把新收费类型混入首版。

开源接入候选为[OpenIAP维护的react-native-iap](https://github.com/hyodotdev/openiap/tree/main/libraries/react-native-iap)，必须审查锁定版本、LICENSE和native传递依赖；官方旧仓库已迁移，不使用已归档入口作为维护依据。只包装StoreKit/Play Billing等平台API，不接闭源第三方支付SDK。不同分发渠道如果没有合规可用的开源接入路径，就不在该渠道开购买，不默认外跳Web结账。平台商品/验签/购买规则按启用时的[Apple规则](https://developer.apple.com/app-store/review/guidelines/)与[Android订阅状态](https://developer.android.com/google/play/billing/lifecycle/subscriptions)核验。

购买前先登录并确认当前账号；订单绑定user_id、平台交易ID、商品版本、价格币种和周期快照。状态：created→pending_payment→paid_pending_verification→verified；取消/失败独立状态。权益active/grace/paused/expired/refunded/revoked与订单分开，前端“支付成功”不直接授予权益；只有服务端可信交易验证/通知可推进。

支付取消回计划页不弹失败惩罚；已扣款但未验证显示“处理中”，可以刷新/恢复，不再创建同笔购买。重复通知幂等，乱序通知按可信平台当前状态与有效期核对；退款先到时旧购买通知不能把会员复活。跨设备恢复不重复赠送额度；交易已绑定另一个产品账号时提示切回原账号/联系支持，不直接转移。

会员详情显示到期日、续费开关真实状态、管理订阅、恢复购买、订单和反馈。关闭自动续费不立即失去已付周期；grace只根据可信平台状态提供，paused/expired不自设续费宽限。退款申请入口指向实际平台流程，不承诺必定批准；成功退款撤未来权益，不制造负余额。注销页面明确“注销账号不会自动取消平台订阅”，给管理入口，不能强迫保留账号；待退/续费回调只进审计，不重建已注销资料。

### 14.5 共同权益规则

客户端每次动作使用同一服务端entitlement结果：当前计划、基础上限与已用、各类奖励余额、免广告、缓存能力、到期及policy_version。请求失败不凭本地开关升级计划；展示可保留最近可信状态，新的购买授予/新集解锁必须取得服务端确认。

| 情况 | 新集与奖励 | 广告 | 缓存/已有内容 |
|---|---|---|---|
| 免费 | Web10/App50；基础先用，App奖励到期先用 | 仅开启且符合频控的广告 | 按内容/App许可，已有有效许可可播 |
| 有效会员/平台确认宽限 | 计划上限；已用基础不归零；邀请奖励保留 | 建议全部广告免除，包括不请求激励 | 上限按计划，新许可仍受版权/期限限制 |
| 关闭续费但周期有效 | 维持原计划到真实到期 | 保持免广告 | 不提前撤许可 |
| 到期/暂停/退款/撤销 | 回免费；剩余=max(0,免费上限−当日基础已用)；不倒扣已正常消费 | 仅在下一次查询/集结束边界恢复，不能中断正片塞广告 | 公共免费内容已授许可遵守原到期；会员专属资源停止新授权 |
| 会员中合法旧激励回调迟到 | 按旧offer结奖，仍仅App | 不为到账重新播放广告 | 与缓存无关 |
| 风控审核/系统故障 | 可疑奖冻结，合法基础权限按已有策略；不得默认放行 | 失败不挡合法观看 | 不签发未知版权/未确认许可 |

升级当天采用更高计划上限减已用基础，不重送已用额度；降级当天不退款或抹掉账本。已消费奖励不重新改成基础，奖励过期与消耗并发由事务保证不能超扣。

正在播放的公共免费内容保留本次有效会话，到下集再按新权益查；会员专属内容在短期授权到期停止（预案≤60秒收敛，已缓冲部分不能瞬间撤回）。付费专属内容不开放无DRM弱保护下载；其离线许可到期必须≤内容许可上限及已付有效期/较短撤销窗口，不承诺离线即时退款撤权。免费内容的旧合法缓存不因退会员就被误删。

### 14.6 邀请、通知与后台扩展

邀请页不放宣传段落。显示“邀请好友”、邀请码、复制、以及“好友有效看满{n}集，得{bonus}次”；详情说明当前规则、短集/倍速、时窗、审核、名额和奖励到期。奖励明细显示来源、到账、到期、已用/剩余；到期只扣未用余额，不回收已正常观看的剧集，也不负债。邀请关闭时隐藏新增入口，已绑定者仍能查看进度/结算。

通知默认关闭，设置页由用户主动开启后再请求系统权限。类别：剧更新、下载完成、奖励到账/到期、计划变化；营销独立关闭。用户已拒绝系统权限则给“前往设置”，不反复弹。推送只带事件ID/安全页面定位，打开后重新查账号与权限；深链过期回原列表，不能含媒体私钥/长期授权链接。账号退出撤销该账户设备绑定，避免把前一账户消息推给新账户。公开锁屏文案不显示邮箱或敏感奖励审核原因。

首期消息中心即可；推送第三方仅选开源库，APNs/平台通知等系统服务单列，禁止经开源wrapper悄悄带入闭源推送SDK。每账户同类别默认最多1次/小时、5次/日，安全和付费状态通知按必要事务事件单独规则，不用营销通知频控隐藏购买结果。

后台菜单：标签、推荐/内容、邀请、额度、广告、计划/商品、订单/权益、通知、反馈/申诉、角色/审计。标签仍恰好10个；邀请码/短剧源不能由自由脚本生成。

广告配置：slot、端、位置、素材/有效期、关闭、全局/独立频控、奖励offer；计划配置：商品映射、权益、可售端与生效版本；邀请配置：观看与奖励参数；通知配置：双语模板/类别/频率。草稿→预览→校验→审核→灰度发布→回滚。素材/套餐运营无权写用户余额、平台订单状态或内容授权。

紧急停投不撤销已验证完成的旧offer；回滚仅影响未来展示/新绑定/新订单，不抹掉既有奖励与订单快照。收费关闭时仍保留订单/恢复/取消管理入口给已有购买者，不能让用户无处恢复或取消。广告、付费、邀请、下载可以分别停用，不改账本和已确认承诺。

### 14.7 最小中英文文案

| 场景 | 中文 | English |
|---|---|---|
| 登录标题 | 欢迎登录 | Welcome |
| 登录字段/按钮 | 邮箱 / 发送验证码 | Email / Send code |
| 新账号提示 | 未注册邮箱验证后将创建账号 | New emails create an account after verification. |
| 验证 | 验证码 / 确认 / 重新发送 | Code / Confirm / Resend |
| 找剧 | 搜索短剧 / 筛选 | Search dramas / Filters |
| 续播 | 继续看 · 第{n}集 | Continue · Episode {n} |
| 额度 | 今日剩余{n}次 | {n} left today |
| 邀请 | 好友有效看满{n}集，得{bonus}次 | Get {bonus} credits when a friend qualifies after {n} episodes. |
| 广告 | 广告 / 关闭 | Ad / Close |
| 激励 | 看广告得{n}次 | Watch an ad for {n} credits |
| 确认/到账 | 确认中 / 已到账 | Confirming / Credits added |
| 权益 | 查看计划 / 恢复购买 | View plans / Restore purchases |
| 支付待确认 | 处理中 / 刷新状态 | Processing / Refresh status |
| 缓存无许可 | 此剧不支持缓存 | Downloads unavailable for this title |

### 14.8 扩展验收

| ID | 场景 | 断言 |
|---|---|---|
| E01 | 广告关闭/无填充/超时/素材失败 | 折叠、不影响10部剧和播放，滚动位置不跳 |
| E02 | 翻页/刷新/往返/两设备并发曝光 | 共用频控，关闭不马上重弹，重复事件不多算 |
| E03 | 正片切广告与返回 | 正片进度保存；广告不进入邀请或逐集计时 |
| E04 | 激励回调伪造/重复/乱序/晚到/断网/超过24小时未知 | 仅可信完成结一次奖，等待期不诱导重看；超时转人工保留预留/机会锁 |
| E05 | 日名额/余额满、奖励过期并发 | offer预留一致，无负数/超发；已完成承诺保留 |
| E06 | 会员升级/到期时广告正在加载 | 重新查权益，免广告不展示；正片不被中插 |
| E07 | 购买取消/价变/断网/支付成但响应丢失 | 不擅自开权益、不重复支付，可恢复状态 |
| E08 | 通知乱序/重复、退款先于成功 | 撤销状态不复活，交易唯一归属 |
| E09 | 恢复购买到另一账号/换设备 | 不转移他人订单、不重复发额度 |
| E10 | 升/降级当天、退款、宽限/暂停 | 基础已用不清零，奖励分账，许可按来源处理 |
| E11 | 账号注销但平台续费仍开 | 可管理取消；后续回调不重建账号 |
| E12 | 后台紧急停用/旧配置回滚 | 不撤销旧承诺，保留已有订单管理 |
| E13 | 拒绝通知/外链回退/深链失效 | 不阻核心操作，无凭证泄露、页面恢复正确 |
| E14 | 短集20/40/60秒、2倍速/seek/重复 | 完整观看正常可达，拖动/重复不刷资格 |
| E15 | 注销后系统备份恢复/重装/重注册 | 不恢复旧账户钥匙/删除历史，不重建奖励 |
| E16 | 新依赖为开源wrapper但native库闭源 | 许可证闸门拒绝，功能保持关闭 |

高保真阶段按14.1逐页覆盖免费、扩展启用、关键异常；同页弹层/状态不必另造主页面。图片待用户确认后制作。

补充验收E17：会员计划100集时第51集可正常解锁；升级前已用40集则剩余60；同设备不同账号混合免费/付费不挤占彼此付费权益，免费来源仍受共享免费预算；账本来源在升级、降级、恢复中保持不变。


## 15. 工程增补与逐项开发

正式App通过react-native-video调用AVPlayer/ExoPlayer；Web用浏览器video与按需hls.js。认证复用Better Auth邮箱OTP及官方Expo集成。具体兼容版本、缓冲策略、生命周期、长按取消、性能统计与测试关口见[工程路线](dramivio-engineering-plan.md)；按[开发任务卡](dramivio-model-task-cards.md)一次执行一项。高保真预览不是已实现的原生播放器，性能目标必须实测验证。


## 16. 管理后台复用

采用Payload开源核心，不自建后台CRUD/管理员认证/草稿版本。保留Better Auth用户登录与Hono业务API；专属额度、邀请、续播与离线规则由业务命令实现。详见[后端复用方案及B00关口](dramivio-backend-reuse.md)。新增选型仍需兼容PoC，之前文档复审结论不替代本次接入测试。
