DEV-DRAMA-04-001 Drama Platform公共接入实施计划
在保留重制业务和既有验收数据的前提下接入公共Go客户端、稳定请求恢复与Media项目投影
For agentic workers: 使用测试先行和隔离验证;独立模块按明确文件所有权并行,集成后独立审查。用户已授权实施,不重复索取开始许可。
Goal: 将真实Drama业务调用接到提供方Go SDK,保留原任务与采用事实,补齐身份、媒体预览、原请求恢复、统一资源和可靠项目投影。
Architecture: Drama仍拥有业务ACL、PG任务和采用状态。公共SDK负责Platform传输与凭据协议,Media负责原件及引用;产品持久化稳定Media身份和事务outbox。Redis用于产品级协调,PG仍为业务事实权威。
Tech Stack: React/Vite、Go、PostgreSQL、可选Redis advisory节奏协调。PG保留任务、outbox与最终互斥;Redis失败回退原PG锁。
Spec: 公共指南与收敛计划。本页只定义消费方实施,不复制公共合同。
Global Constraints
- 用户2026-10-29最新授权为接入成功后合并、更新相关文档并部署,并明确包含Platform/Media/SDK上游依赖一并验收发布;Platform允许采用测试入口和测试版本。由主执行者在审查、验收与依赖就绪后统一操作,分别记录测试与正式部署来源。保留原工作区、全部既有验收数据及未相关改动;不新增真实付费生成。
- product固定drama;业务所有权仍由Drama校验。团队付款、团队素材、员工跨产品委托明确拒绝。
- 消费方固定真实模块
github.com/Oceanway-AI/oceanway-platform/platformclient v0.1.0-rc.2,对应SDK源码5b982ad4820dd5f2b657890b1a03e576219d5a6b及Media合同c520f9a4bd4462996e3dc49c8c32e0342d5bb0cc。发布候选使用标准vendor,无本机replace;rc.2修复rc.1的Host路由缺陷,Platform服务运行制品独立记录为f03,Drama实际发布提交4ac5及具名核对见PROC-02-024,下载限制与浏览器证据阶段单列。标签、摘要、已合并源码与部署回滚证据见PROC-02-024,不将合并或回滚后的旧制品写成新接入上线。 - worker不能保存/携带用户Cookie或Origin;session、EXA、mat1分别处理。未知或not_found只恢复,不重派或退款。
- 新上传和新生成原件只保存真实Media身份;既有本地文件继续合法读取,业务ZIP导出可保存产品成品,不伪造Media映射或重建已验收结果。绑定确认后才释放EXA;未来读取优先使用mat1和已确认binding,不把待确认状态当作释放条件。
- 计划在本产品开发目录,进度和验收在07;业务仓只保留运行说明、机械来源和测试材料。
实施、审查、验证和发布状态只记录在 PROC-02-024 消费方验收。下列复选项是实施/验收清单,不以源码完成替代具名通过证据。公共指南中的本地replace仍不代表真实发布版本。AI剧本规划/自动分镜领域流程、参考素材生成和多镜单MP4不属于本批已支持能力。
Review Focus
- 原POST已受理但响应丢失,重启后仅GET恢复,供应调用和收费计数都为一(任务2)。
- 账号切换和迟到bootstrap不能把旧命令带到新主体;实际Host/Origin与全部Set-Cookie保持(任务1、4)。
- 子资源改变而project实体revision不变时,独立快照序列仍前进;历史候选与交付引用仍保留(任务3)。
- binding确认、项目PUT或EXA释放响应丢失时重放收尾,不能重复生成或回滚采用(任务2、3)。
- 非规则profile/价格版本变化、预览拒绝、非个人payer和资源越权均有明确结果(任务1、3、4)。
- 图片/视频的原生计费必须执行用户确认的价格版本、消费方式和每项钱包上限;上限冻结为预览的精确
walletPoints字符串(包括"0"),不能用更高余额上限替代或在派发前静默抬高。预览与原生资金执行一致性属于提供方发布前置(任务1、2、4)。
Task 1: SDK来源、身份与服务接线
Files: server/go.mod/go.sum;tools/prepare-platformclient.sh;server/internal/platform/;server/internal/server/;server/cmd/drama/;server/internal/storage/redis/;README与.env.example。
Interfaces: platform.Client.SDK() (*platformclient.Client,error);platform.WithSession(context.Context, platformclient.SessionContext) context.Context;platform.Session(context.Context) (platformclient.SessionContext,error)。现有Catalog(ctx,session)保留调用形状,但实际Host/Origin来自请求上下文;worker直接使用SDK的ExecutionContext。
- 写Host、Cookie、退出/SSO、目录原JSON保留、媒体preview和团队拒绝测试,先看到失败。
- 固定实际发布SDK版本并保存标准vendor;relative replace仅本地开发,记录来源及契约manifest摘要。
- 用SDK替换身份/目录传输,加入真实请求上下文、Set-Cookie透传和安全错误;未覆盖钱包具名调用单独保留窄适配,不扩张通用headers。
- POST /api/tasks/estimate改为个人媒体consumption-preview;文本不预估;预览带价格版本/规格,透传权益钱包和allowed。
- 接入身份路由、资源worker、持久清理及Redis命名空间协调。运行专项、Go vet及全量隔离PG检查。
- 独立提交代码与机械来源,保留未发布依赖边界。
Task 2: 冻结请求、原身份恢复与持久收尾
Files: server/internal/modules/execution/*,其测试;不得编辑Task1的平台包或Task3媒体Store。
Interfaces: 使用Task1的Client.SDK及Session上下文;Artifact新增Original *platformclient.OriginalManifest。Store.RegisterRemote(ctx, media.RemoteInput)返回本地file引用;RemoteInput包含ID、OwnerID、SpaceID、ProjectID、Name、TaskID、Authorization string与Original platformclient.OriginalManifest,由Task3实现。
- 写受控HTTP+PG失败测试:稳定ID/冻结字节先保存、丢响应重启恢复、UNKNOWN/not_found不重发、终态释放失败可重试、取消不假称退款。
- SubmitMedia/RecoverMedia、SubmitText/RecoverText经SDK;冻结Route、ContentType及精确Body在attempt,原EXA不可替换。流式另路由,不套非流式恢复。
- 新原件读Original并调用RegisterRemote,不下载新生成原件落本地。旧任务缺稳定ID时保留未知事实或已有taskId查询,不伪造新身份。
- EXA释放改持久待办且网络在事务外,绑定/结果保存成功后才释放;取消后仍收敛原任务并保留迟到结果规则。
- 专项RED→GREEN及全量隔离Go测试,提交仅拥有路径。
Task 3: Media ID、材料和项目快照outbox
Files: server/internal/modules/resources/;server/internal/storage/media/;server/internal/core/entity.go(新增资源kind);server/internal/modules/delivery/*及必要测试。Task2所有execution文件不编辑。
Interfaces: media.Store.RegisterRemote(ctx, RemoteInput);resources.Wrap(core.Repository) core.Repository捕获业务写入并同事务更新独立快照/outbox;resources.Service持有Repository、Platform、Store并提供Register(router)、Tick(ctx)。实现后向主执行者提供精确构造及后台接线方法。
- 写PG/HTTP失败测试:真正Media ID映射、越权、完整历史成员、独立revision、项目删除/恢复、同版本冲突、网络失败重放。
- 新file行只存稳定Media引用和自身ACL;授权放私有记录;Bind/Confirm/Release及项目PUT采用可重放outbox,不能把业务ID冒充Media ID。
- 投影覆盖项目标题/删除、分集/分镜历史视频、资产历史和引用;path精确编码,tombstone空members,不只采用项。
- 材料上传、读取、绑定/确认/释放与合法导出走SDK代理;保存原件副本仅限业务导出成品与已有本地历史,远端短URL不持久。
- 导出在命令事务中冻结选择、项目和分集快照,提交后读远端内容;稳定回执、归档ID与确定字节支持命令重放和重启恢复,不在数据库事务内等网络。
- PG及权限/快照重放专项通过,提交仅拥有路径。
Task 4: 构建、前端预估与会话隔离
Files: package.json/package-lock.json、packages/canvas/package.json及必要画布host/profile源码与测试、apps/web/**/*(不含AGENTS),前端测试及必要测试配置。
Interfaces: /api/tasks/estimate保留现有入口,响应新增allowed、priceVersion、standardPoints、walletPoints、allocations、specifications及raw完整预览;请求type=image/video、modelId、input.parameters、expectedPriceVersion、billingPreference、walletMaxPoints、payer。用户确认后将完整约束和同一规格对象冻结到提交;消费方式默认wallet-fallback,每项上限取已确认walletPoints。/api/auth/logout(POST)和SSO路由由Task1提供。
- 先复现Lightning CSS原生依赖丢失,依据锁文件修正可选平台依赖;干净npm ci后类型/测试/生产构建通过。
- 先写用例固定主体/会话命令隔离、旧bootstrap不能覆盖新身份、参数变化预览失效、价格409、预览拒绝、图片视频权益展示。
- 图片视频消费权威预览,文本入口移除预估调用/展示;保留全部适用模型和原profile,不用mock静态模型或演示费用。
- 身份失效清理缓存,退出调用服务端撤销;新API按实际返回接线,补组件/浏览器受控验证。
- 多规格批量先逐项预览并确认每项上限,再沿各自稳定命令提交;已完成项不重发,失联保留原body和请求ID,不自动重新报价。切换镜头或重开任务抽屉时清除旧采用反馈,用户确认与记录使用分镜序号、规格及中文消费方式。
- 提交仅拥有路径;不部署或访问生产秘密。
最终集成验收
- 真实Go API+受控Platform/Media HTTP和自有PG、Redis跑完整个人流程及失败恢复;无生产DSN和真实生成。
- 全量类型、前端单测、Go集成/race、vet及生产构建;按变更结果记录未覆盖范围。
- 各任务及全分支独立审查,重要发现补失败回归再修复;报告固定SDK来源、发布依赖和保留的真实六镜验收范围。