PROC-04-002 Drama架构审计(2026-10-28)
2026-10-28跨项目架构复盘的只读审计附件,事实与建议分列,不构成批准决策。
本页是跨项目架构深度复盘的过程附件。观察事实、静态推断和建议分别阅读;建议不构成已批准决策,不修改既有ADR/PRD。版本、线上取证与未验证范围统一见审计证据。
源码链接固定到审计记录的完整提交;未提交工作副本、无法固定的本地材料明确标注,不以相近提交替代。固定链接只证明所引源码,不证明部署、性能或真实付费验收。
审计对象:oceanway-drama 当前工作树。读取时 HEAD 为 4165661(docs: record six-shot production acceptance),存在大量已暂存/未暂存的历史合同、AGENTS 和文档变更;本报告按读到的工作树说明,不能把它等同于远端 main 或当前生产二进制。本轮只读取源码和既有证据,没有发起模型调用、线上登录/部署、数据库读取或重新执行测试,没有改变代码。报告中“已实现”是静态代码事实,“既有验收”是文档记录,“建议”不代表已落地。
最新执行基线:根 AGENTS.md:1(审计工作副本含未提交差异,未固定源码链接) 明确 React + Vite、Go API/worker、PostgreSQL,直接消费 Platform,禁止恢复旧 Next 后端/Runtime/mock。应用 README.md:1 与 Web AGENTS.md:1(审计工作副本含未提交差异,未固定源码链接) 一致。旧 Runtime/文件引用文档只能作架构历史对照,不能当当前运行依赖。
核心判断
Drama 已从原来“产品 + Runtime + Platform + File Owner”的接入模式,收缩为“产品自己实现任务可靠性和本地媒体存储,直接调用 Platform 内部 relay”。它不是只换了一套前后端框架,而是把执行适配、恢复、文件生命周期的一部分重新收回产品内部。纯文本视频的六镜链路有既有正式验收记录;参考输入、文本执行、团队/画布等完整链路仍未接通。这解释了为何源码看起来更简单,但公共机制再次重复、不同产品逐渐分叉。
建议复用的是三类能力:规范一致的轻 SDK(身份、传输、原生规格、授权和恢复协议)、Platform 中央服务(身份/准入/执行/账务)、统一文件权威服务(原件及生命周期)。不要以“抽公共模块”为名重新复制一个包含 Drama 项目、分镜、候选、采用逻辑的庞大 Runtime。
1. 当前拓扑与请求边界
浏览器 React/Vite
├─ /api/login → Go 生成 Platform 登录地址 → Platform 登录 → /platform/login/complete
├─ 同源 /api/*(Cookie,X-Drama-Subject,X-Command-Id,X-Request-ID)
│ → Go Server → Platform /identity(Cookie + Product Key)
│ → ownerId 对象校验 → PostgreSQL 产品领域数据
│ → 模型目录/钱包等 Platform 只读接口
└─ 同源 /media/:id → Go → Platform /identity → 本地 file.ownerId → 本地磁盘字节
提交生成
Go 领域事务:task + attempt + command receipt
→ 提交后 Catalog + 参数转换 → POST execution-authorizations(会话 + 产品 key)
→ attempt 持久化 exa_ 授权
→ Go 内置 worker(无用户 Cookie)
→ POST /internal/relay/videos 或 images/generations(产品 key + exa + idempotency-key)
→ GET /internal/relay/tasks/:id → artifacts → artifacts/:key/content
→ 下载全部产物字节 → Drama 本地媒体文件 + PostgreSQL file
→ 分镜/形象候选 → 用户显式采用 → ZIP 交付应用 API、后台 worker 与生产静态页面由同一个 Go 进程提供;注册链路见 main.go:80、main.go:104、main.go:320。开发时 Vite 代理 /api 与 /media 至 Go:vite.config.ts:12。没有当前运行时 Runtime 包调用、Redis 或外部队列的接入证据。
配置:DRAMA_PLATFORM_API_ORIGIN、DRAMA_PLATFORM_LOGIN_ORIGIN、DRAMA_PUBLIC_ORIGIN、产品 key、PG URL、媒体目录均启动必需;Cookie 默认 oceanway_session,文档中的正式配置是 oceanway_platform_session。见 config.go:93、deployment-20261028.md:6(审计工作副本含未提交差异,未固定源码链接)。读取配置文件值不属于本次审计;没有输出凭据。
内部 HTTP 的三种身份
| 请求类别 | 身份凭据 | 授权边界 | 代码 |
|---|---|---|---|
| 浏览器 → Drama | 平台 Cookie + X-Drama-Subject | Cookie 得到真实主体,subject header 只用于防止账号切换后的旧意图写入 | server.go:81 |
| Drama 代表用户 → Platform 身份/目录/钱包/签发 | Cookie + X-Platform-Product-Key,带会话的写请求增加 Origin 和 X-User-Origin | Platform 用户会话及 Drama 产品凭据 | client.go:134 |
| Drama worker → Platform relay | 产品 key + X-Platform-Execution-Authorization: exa_… + 派发幂等 key | 某次用户授权的持久任务;worker 没有用户 Cookie | execution/platform.go:104、worker.go:232 |
exa_ 在这里是 execution authorization 标识格式,不是 Exa 搜索服务。用户已澄清 Exa 是笔误;对当前服务/前端执行路径的检索也没有发现 Exa 搜索调用。
2. 登录、会话与权限
已实现
- 登录是 Platform 托管。Drama
/api/login验证 returnTo 属于自身 origin 后,固定跳至 Platform/login?return=<DramaOrigin>/platform/login/complete;产品内原目的页存于 sessionStorage,由 callback 页面取回。不是产品自己签发登录令牌,也没有共享 Studio 会话表。catalog.go:134、main.tsx:59。 - 每个受保护请求(包括媒体读取)提取唯一且格式合法的 Cookie,转调 Platform
/api/platform/v1/identity,校验user.id > 0与session.sid存在。真实 Cookie 与 sid 分开,避免误把 sid 当凭据。identity.go:52、identity.go:78。 - 产品主体为
platform:N。每次写入必须提交相同X-Drama-Subject;不匹配/缺失拒绝。写请求若带 Origin,必须等于DRAMA_PUBLIC_ORIGIN;Origin 为空目前允许。identity.go:137、config.go:157。 - 业务对象最终由 Drama 数据的
ownerId决定访问:外部对象与不存在都返回 404。scope.go:15。这与公共身份服务职责应分开保留。
明确边界与缺口
product_roles被读取并可返回浏览器,但 Server 当前直接将所有已认证主体映射为RoleOwner,没有本地product_roles判定;核心对象边界是“仅本人所有”。identity.go:116、server.go:99。因此不能宣称本产品已接通共享团队/成员角色。Platform 并行审计已确认/identity仅校验会话并返回全部 scope 的角色,不替消费者检查某产品 role:platform_identity.go:41。但此处RoleOwner与实际对象ownerId校验共同构成当前个人空间模型,不能直接等同横向越权或运营权限泄漏。若个人空间默认向所有有效平台账号开放,这可以是合法策略;若计划限制产品准入,则尚需明确并接入对应规则。管理操作必须另查当前 action/role,不能沿用个人空间 owner 映射。- Bootstrap 明确返回空 teams、productions、providers 与 ledger;团队类型/前端存在不等于团队服务可用。main.go:246。
- 当前 Go 路由没有找到正式 logout 路由,前端登录会话重用 Platform Cookie;如果需要完整跨产品退出/禁用行为,应由身份 SDK 提供统一契约并明确当前页状态失效规则。
- 浏览器 pending command 持久化 key 固定,不包含 subject/session;command fingerprint 仅 path+method+body,
setSubjectRef只更新全局变量,不清/切 pending map。api.ts:19、api.ts:34。服务器 subject 约束能阻挡旧主体 header,但 bootstrap 更新成新主体后,同一未确认请求 body/command 仍可能被带入另一账号。静态风险,不冒充已实测;应改为主体+会话世代命名空间及身份切换后的显式废弃/隔离。 bootstrap()在返回组件前直接改subjectRef,WorkspaceProvider 的 sequence guard 只防 data setState,不防该副作用;并发 bootstrap 的旧响应仍可晚到并改写 header 身份。api.ts:72、workspace-provider.tsx:17。这通常造成误拒绝,说明身份世代管理应统一。
3. 生成、exa 授权与恢复
当前真实流程
POST /api/tasks或 batch 在领域事务创建 task(目标、owner、input、fingerprint、状态)和 attempt(独立 idempotencyKey、taskReference、grant=null)。去重采用当前用户所有 open task 的输入 fingerprint,其中已包含 targetId。service.go:198、service.go:238。- 如果有
X-Command-Id,命令 claim 与领域写入、回执在同一 SERIALIZABLE 事务;同 command 不同 body 会冲突。同命令重放可以继续授权步骤。server.go:125、routes.go:51。 - 事务提交后重新读模型目录、用 published variant 构建 nativeBody、拒绝参考素材,然后用用户 Cookie 创建执行授权。返回必须匹配
^exa_[a-f0-9]{48}$、product=drama、原 taskReference、有效 expiresAt;存于 attempt 的 JSON 数据,不存用户 Cookie。worker.go:39、execution/platform.go:35。 - 后台 worker 无会话,仅推进已持久化 grant 的任务。派发前事务将 attempt 改成 dispatching,task 改 running,再出事务 POST 内部 relay;一旦离开 prepared,不允许再次派发。worker.go:180、service.go:330。
- 即使响应失败,只要有
x-task-id即视为 accepted;无 task ID 的网络失败、2xx、429、5xx 为 unknown;其他 4xx 为 rejected。execution/platform.go:126。 - 原任务成功后读取 artifacts,再拉 content。文件落盘及结果记录后,分镜/形象版本作为候选登记,用户显式采用。service.go:624、service.go:822。
save_failed只恢复原结果;显式 retry 只允许 failed/cancelled,并建立新的 attempt、idempotencyKey 与 taskReference。service.go:869、service.go:904。
可靠性偏移
A. 安全地不重发,尚不等于能恢复。 x-task-id 丢失时数据库虽有 idempotencyKey/taskReference/grant,但当前 Port 只有 Read(platformTaskID),无 locate by original intent;worker 留在 unknown,不会按原请求身份补查。即使 crash 在“dispatching 已提交、HTTP 尚未发送”的窄窗口,也没有当前代码内的自动定位出口;人工核对或未来原请求 locate 能力仍可能解决,因此不能写成结果绝对不可恢复。worker.go:191、service.go:897。正确公共能力应是提交前持久化原请求身份,以及可凭该身份只读定位/查询的协议;不是给 SDK 加自动 POST 重试。
B. 派发与恢复共用固定 4 个工作槽。 Tick 拉全部 open task,用 4 个 goroutine 槽,WaitGroup 等整批结束后下一轮扫描。慢派发与原任务查询/保存共用槽;这与历史默认并发 100 和“恢复互不阻塞”的要求有差异。worker.go:130。应明确当前产品并发策略,而不是直接把 4 改 100;通过持久 due_at/lease、公平调度和派发/恢复独立预算落实。
C. 网络已进入可重试事务。 rejected 分支在 repo.Atomic 内调用 port.Release,与“网络不进事务”文档矛盾;SERIALIZABLE 自动重试可重复该副作用并长期占连接。service.go:434、service.go:463、repository.go:283。应写 release outbox,由事务外执行并记录结果。
D. Release 缺可靠 outbox。 终态 release 忽略错误;worker 下轮跳过终态,不会重试;取消任务则直接停止 polling,既不查询原结果也不释放当前 grant。worker.go:177、worker.go:209、service.go:956。Platform 是否让过期/释放授权继续查询存量、是否影响长任务结果保存,需要与 Platform 生命周期合同统一,不能从字段 expiresAt 自行推断。
E. 取消只是取消本地等待。 当前不会取消上游收费任务,这是已注明能力边界;但取消后允许 retry,同时原请求不再后台收敛,意味着产品可能永远不收件已完成结果。应拆分 user_attention/cancel_requested 与原执行终态,运营后台能看到两者,不能把 cancelled 当上游 canceled。
F. 请求追踪尚未贯通。 前端设置 X-Request-ID,Go 错误回显,但 Platform Client/relay 不继续传递该 trace,也未发现统一 spans/trace envelope。api.ts:56、server.go:245、client.go:130。运营应聚合 businessTaskId、attemptId、taskReference、authorizationId 的脱敏引用、platformTaskId、commandId、traceId,而不是只靠日志字符串。
4. 桶/原件/文件所有权
当前实际:本地磁盘,不是桶 SDK
- 生成读取使用 Platform 返回的 content_url 路径,限制到
/internal/relay/tasks/.../artifacts/.../content,忽略 URL 外部 origin,始终用配置中的 Platform origin 和执行授权。execution/platform.go:238。 - 完整读取产物至内存(上限 200MiB),再
Store.Save保存 Drama 本地磁盘。fileId 基于 attempt+index 稳定生成,重复 ID 同 SHA 则复用,不同 SHA 冲突。execution/platform.go:273、service.go:690。 - 本地路径为
<DRAMA_MEDIA_ROOT>/media/<fileId>。file 元数据为 id/url/name/mimeType/size/sha256 + ownerId/spaceId/projectId;临时文件写入后 rename,之后才写 PostgreSQL metadata。store.go:68、store.go:98。 - 用户上传也调用同一本地 Store;
/media/:id每次鉴权并按 file.ownerId 校验,支持 Range、private cache、ETag、nosniff;但 LoadOwned 先读整个磁盘文件,再比较 ownerId。asset/routes.go:72、asset/routes.go:75、store.go:159。 - ZIP 先把每个源文件全部读入 map,再构建压缩包,结果仍写 Store(同样受 200MiB 限制),HTTP 下载也持有整块内存。delivery/service.go:287、delivery/service.go:432。这对六镜适用的证据不能外推长剧交付容量。
与 10/19 的架构决策相冲突,而非偶然漏一段代码
历史文件引用契约明确:new-api/File Owner 在现有 TOS 保存唯一生成图片原件,Platform/Runtime/Drama 只保存身份、claim、引用、解绑墓碑;不下载为产品第二原件。file-references-20261019.md:5(未进入所记录提交,未固定源码链接)、file-references-20261019.md:35(未进入所记录提交,未固定源码链接)。
但 rebuild 规划主动要求脱离 Runtime 后改为 content_url + 授权下载、原件落 Drama 本地;并把 file-ref 简化成 inline reference_images。02-platform-contract-map.md:131。当前实现符合这份新规划;所以不能按旧 AGENTS 指控“违反当前指令”,但应指出:当前新规划在去掉 Runtime 技术耦合的同时,选择了用本地文件保存替换此前文件权威、单原件、保留/释放链路;这是一项需要与全平台统一素材方向重新对齐的职责调整。 “不依赖 Runtime”和“各产品都再持有一份原件”不是必然关系。
历史单原件范围只覆盖 native async/Gemini 图片,不覆盖所有视频和上传:file-references-20261019.md:56(未进入所记录提交,未固定源码链接)。当前正式六镜验证是视频,不能说这六条视频一定是旧图片单原件合同的回归;准确表述是“新存储模式与目标统一原件模型分叉,图片未来开放会继续沿本地下载路径”。上游是否另存相同字节、当前桶名/地域/IAM/生命周期未在本次单产品代码审计核验。
应抽出的边界
按跨仓审计的当前目标,应优先复用 Media 的统一 assets 服务,经 Platform materials 受权门面访问,不为 Drama 新建另一文件中心,也不把重接历史 File Owner 当新产品目标。主审后续确认 pic-vps 已有 label 9220708 的统一 assets 实例,配置桶 oceanway-media-assets-cn,另有旧 7099bc2 FileOwner 并存;Platform 配置指向 media.oceanway.tech,但域名的精确反代上游尚未独立核验。应按实际消费者和实例逐条联动验收;旧任务保留原 Writer 与恢复链。中央文件服务拥有 file_ref/revision/hash/size/mime/storage_class、原件落桶、服务身份、签名授权、保留/释放、隔离与生命周期。产品拥有“此分镜/形象/候选/交付仍引用哪些文件”以及当前对象 ACL。SDK 负责严格协议校验、授权读取、outbox 重放,不暴露桶 key,不把业务 claim 生命周期绑死在一个庞大 Runtime 上。二次产生的 ZIP/转码是明确派生物,允许新文件,但应有 derived_from 与独立生命周期;不以原片复制冒充新原件。
5. PostgreSQL、加载与数据权威
| 数据 | 当前权威 | 建议保持 |
|---|---|---|
| user/session/product role、执行准入 | Platform | 中央权威,产品缓存只作投影 |
| 钱包/冻结/结算 | Platform | Drama 只读,禁止产品自造余额和退款 |
| project/episode/shot/asset/appearance/candidate/adoption/delivery | Drama PostgreSQL | 留在 Drama,运营通过产品 API/事件读写 |
| task/attempt、冻结输入、命令回执 | Drama PostgreSQL | 领域意图留产品;公共执行协议抽薄 SDK |
| 原始执行及供应商状态 | Platform/上游 | 统一原单恢复,产品不重实现供应商轮询 |
| 媒体 bytes/file metadata | 当前 Drama 本地磁盘 + PG | 建议回归中央文件权威和产品引用 |
钱包路径为 /api/platform/v1/wallet,Drama /api/quota 只映射 available/frozen/points,ledger 空;estimate 固定 null 并说明提交时 Platform 决定。wallet/routes.go:26、execution/routes.go:29。没有本地记账是正确边界,但运营若要明细,应调用正式账务读模型,不把空数组误当“无消费”。
当前 DB 是通用 drama_entities(kind,id,revision,data jsonb) 加 drama_receipts。外键/每类字段约束不在数据库;只有 kind+created、projectId、spaceId 索引,没有当前热点 ownerId/status/taskId 索引。schema.go:20。统一 repository 不是多产品共享数据库的理由;把这个 JSONB 表抽成“公共所有业务实体表”只会进一步弱化边界。
当前 /api/bootstrap 依次加载本用户全部 project/script/episode/shot/asset/task/delivery,再调用目录;query view 仅回显,不改变读取集合。main.go:174、main.go:271。ListWhere 无 LIMIT,虽有 Page API,但 bootstrap 未采用。repository.go:114。有任务时前端每 2 秒重拉 bootstrap,workspace-provider.tsx:21。规模增长时会反复搬运整个内容库和模型目录;应按页面取数据、任务增量订阅/分片轮询、目录单独缓存与版本失效。
6. 可共用 SDK / 中央服务 / 产品领域的准确划分
| 能力 | 推荐位置 | Drama 对应可提取点 | 不应提取的部分 |
|---|---|---|---|
| 登录 URL、Cookie 严格解析、identity DTO、subject/session 世代 | Go / TypeScript / Python 的 Platform SDK,统一合同/测试向量 | platform/identity.go、catalog.go 登录部分、前端 pending subject scope | Drama 对象 owner/member ACL |
| 固定 origin、产品 key、execution grant header、错误信封、超时/重定向/trace | SDK transport | platform/client.go 与 execution/platform.go 中重复手工 HTTP | 产品业务异常/提示措辞 |
| 发布模型、native profile/schema/parameter binding | Platform 服务权威 + SDK 纯转换/校验 | platform/catalog.go、media.go | 分镜是否已准备好、模型选择 UI |
| exa 签发/撤销/释放、原请求 locate/read、状态标准化 | Platform 服务 + SDK | execution/platform.go、port.go | Drama task/attempt 状态与用户意图 |
| 原件、引用保留、上传、签名读取、垃圾回收 | 已规划 Media assets + Platform materials + SDK,按实际消费者与部署实例逐条确认 | 替换 storage/media 字节写点/FetchArtifact | 采用哪一镜、哪一形象与哪一版本 |
| 钱包、结算、账单、额度策略 | Platform 服务 | wallet/routes.go 薄投影 | Drama 交付/成本展示的上下文 |
| 命令幂等、CAS/outbox/worker lease 工具 | 小型可靠性库/共享设计规范,先两个产品验证再固化 | server serveCommand、repository CAS/Atomic | 不共用同一任务表,不写平台化工作流 DSL |
| trace/审计事件/运行状态查询 | 公共协议 + 运营读模型 | 业务 task 与上游 ID 关联 | 运营后台不直接写 Drama JSONB/媒体文件 |
关键建议:以一份版本化 API schema 生成 Go/TS/Python 类型和基础 client,共享 conformance fixtures,减少逐产品手抄头名、响应 envelope、规格判断、错误语义。当前已出现裸 JSON 授权/204 释放/x-task-id 等特殊协议由 Drama 逐条补齐的证据,acceptance-20261028.md:12。不要把整个现有 server/internal/modules/execution 抽走;其中混有分镜、形象、候选、版本、采用约束,是 Drama 产品域。
7. 建议优先级与可验证交付
- 先决定统一文件与执行权威边界。 形成 ADR:保留 no-runtime;重新定义 Runtime 去除后公共 File/Execution SDK;是否接受本地副本、哪些是临时缓存/派生物;逐类声明 image/video/upload/export 现状,不能笼统宣布统一桶已完成。
- 先封装并对齐 Platform 契约,随后迁移两个消费者。 首批为 identity、transport、catalog/native schema、exa、task/read/artifacts、trace;合同测试必须覆盖 Cookie/sid 区别、裸 JSON、204、丢 x-task-id、429/5xx、错误信封、授权过期/撤销、身份漂移。SDK 不内置付费自动重试。
- 补原请求定位与生命周期收敛。 对所有 unknown、cancelled-but-upstream-active、save_failed、release_failed 建可查询的原任务状态/持久 outbox;产品任务意图不重建;运营只能恢复原任务或发起有明确授权的新意图。
- 消除加载与资源放大。 去全量 bootstrap 轮询;加 owner/status/taskId 热点索引;dispatch/recovery 独立容量和租约调度;文件 Range 流式读取、ZIP 流式/后台任务与独立上限。
- 再接统一运营后台。 后台读取产品状态投影和统一执行/账务事实,操作走产品受权 API;定义 action、scope、reason、expectedRevision、commandId、traceId 和审计事件,不直接改产品 ownerId/task status/文件 key。
8. 验收证据与文档漂移
- 当前 acceptance 文档描述隔离 PG/HTTP、六镜 fixture、协议/下载验收,还说正式生成未做:acceptance-20261028.md:18、acceptance-20261028.md:27。
- 同日 deployment 文档后追加正式六镜验收:6 个任务/7 个 attempts(1 次失败后显式 retry)、全部显式采用、完整 ZIP 与 SHA/CRC/视频解码核对:
deployment-20261028.md:53(审计工作副本含未提交差异,未固定源码链接)。因此准确结论是“既有文档记录已完成六镜正式链路,早先 acceptance 状态未汇总更新”;本轮没有在线复验。 - 参考图/视频仍在授权前被 NativeBody 拒绝,文本模型虽出现在目录但 View.enabled=false,API Create 只接受 image/video:media.go:46、catalog.go:196、service.go:211。
- 规划仍出现 Next 路由、TypeScript DomainRepository、目标 90–100 kinds,与最终 Go/通用 JSONB 模型不一致:03-data-and-task-model.md:150。运行入口应只指向最终现状清单;旧设计保留但清晰标明被何决策取代。
- 生产部署文档描述独立 PG 容器、本地媒体根、旧实例保留及回滚;不证明本轮已核验远端运行版本、桶配置或备份健康:
deployment-20261028.md:3(审计工作副本含未提交差异,未固定源码链接)。
9. 本次主审补充的生产只读取证与源码差异核对
主审代理随后通过只读 SSH 提供:oceanway-drama-rebuild systemd 为 active/running,current 指向 releases/db860424e961;release.json 记录 API revision 为 db860424e961196abd2c063481cb7ce193a617e9,webRevision 为 b5b9c539e43183796075449d1a63c034751081a2。这些是主审此次取证,不是本子审独立登录服务器所得;它们不单独证明所有线上业务行为。
本子审据此核对 Git:db860424..4165661 仅 deployment 文档新增 24 行验收记录,当前工作树 server/ 相对已部署 API revision 没有差异。apps/web/ 相对已部署 API/web revision 仅 AGENTS 文档不同;packages/canvas/package.json 相对 webRevision 有格式化以及 Next peer 版本从 >=16 收紧至 ^16.4.3,不含前端源文件变化。因此本报告提到的 Go 执行、存储、鉴权、加载逻辑并非“只存在未发布重制分支”的新代码差异;生产进程/制品完整性最终以主审保存证据为准。
10. 跨报告反证复核的措辞限制
- 架构抽离建议采用“先合同与 fixtures,再窄 SDK,再逐个消费者迁移”。不要求再造执行/文件/身份微服务,不统一产品数据库或全部 Task 状态机;Platform 与 Media 已是对应权威。CAS、outbox、租约先共享设计与测试场景,只有两个以上消费者能证明相同语义再抽库。
- Creative 仍为固定上游底座,HANDOFF 明列未接 Platform/Media;本地密码、钱包、供应通道属于迁移待替换分支,不是已确认生产存在双重收费。Drama 参考输入/文本/团队的关闭入口属于承认的未完成范围,不是线上静默降级。
- Studio 线上 image label 90eba1a 且 chunk 含 text-request.v1,证明部署包含该消费者合同;主审进一步确认 Platform 虽 label 为 ecac00e,实际二进制已有 text-request.v1/text-requests 字符串,无凭据 GET 也返回产品鉴权错误而非对照 SPA。因此不能继续声称运行缺生产者端点,应结论为制品来源元数据不一致。无凭据路由存在仍不等于授权后原单恢复通过,也不能无付费记录断言发生损失。
- 四槽调度、全量 bootstrap、整文件缓冲和索引缺口是静态容量风险;本次未压测、未读取线上时延/内存,不能写成已发生宕机或普遍卡死。
exa_不是登录 token、不是材料 mat1,也不是通用幂等标识。相同授权/幂等头不自动证明供应商端幂等或原请求可定位;主报告应按协议语义分别描述。
后续主审证据补充:Media 统一 assets 的部署 label 9220708 对应约 24 小时 Media 授权引用 URL,由 Media GET/HEAD/Range 代理桶字节。它与旧 File Owner 7099bc2 并存,不能以旧实例代称当前统一素材部署,也不能沿用“十分钟 TOS 直签”作为当前数据面结论。本子审未独立执行该主机检查,以主报告 线上只读取证 为来源。