进度总账加 P3 条 + 总览 handoff 行(knowledge P1/agent P2/content P3 三 owner 全覆盖)+ P3 review spec §九实施状态。诚实范围:asset_use=使用授权事实记录非物化、AI 上下文消费另立、 剩 market→kb/agent 资产物化独立主线。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
12 KiB
跨空间 Handoff —— P3(content owner)asset_use 从零建评审版
版本:v0.1(P3 单阶段评审) · 日期:2026-06-22 · 目标读者:架构/产品拍板人 + 实现 agent · 类型:评审版(结论+拍板点+blast radius+验收,不预写代码细节) 上游:handoff 顶层评审 · 执行版 §4.2/§五 P3 · 承 P2 agent 评审(已实施) 依据:本评审现状基于 2 路只读调研(content 后端代码 + design-docs SSOT,file:line 锚点见正文),非 summary 推断。
〇、本版定位
handoff 最后一 owner(content)。把 SSOT 已定义表名/职责/索引(后端-04 muse_content_work_asset_use_precheck)、但建表 SQL 未写 + 代码完全缺失 + 产品-02F 标注 feature gate 关闭的 content asset_use,从零建为真实两段式闭环:token 红线兑现(verify+consume)+ 落"作品使用市场资产作参考/AI 上下文"的授权凭证。
P3 与 P1/P2 的关键差异(降风险):
- asset_use 语义=使用凭证记录,非物化(后端-04 L135"作品资产用于参考、模板或 AI 上下文";产品-02F L456:不写入正文/参考来源/规划项/局域 kb)→ 不涉及 P1/P2 共缺的"market 资产物化"维度,P3 范围天然干净、无"最小验证 vs 完整物化"分裂。
- 无独立绑定事实表(后端-04 只定义 precheck 表 + precheck_id 唯一索引 L1081;asset_use 的"真实使用"经
muse_ai_candidate_decision_archive.work_asset_use_precheck_id引用 precheckId 体现 L849)→ asset_use 兑现落点与 knowledge(独立 binding 表)/agent(slot binding)不同,见拍板点 Q1。 - sourceAssetId 直接是真实 market asset id(已存在)→ e2e 不需 seed 目标实体 fixture(不像 P2 seed market agent),可做完整闭环(来源侧发起 + 落地兑现 + 真实 asset 落库断言)。
一、现状(2 路调研实证)
content 侧完全缺失(file:line)
- content 模块零 asset_use/handoffToken/asset-use-precheck 代码(grep 全量零命中,muse-module-content -server/-api)。无 DO/Mapper/Service/Controller/ReqVO。
content-server/pom.xml缺muse-module-market-api(现仅 meta-api/infra-api)。- content 错误码已用至
1_041_001_003,下一可用段1_041_002_xxx。
SSOT 已定义(权威,但未建表)
- 后端-04 L135:表
muse_content_work_asset_use_precheck(content target owner service 写,"参考/模板/AI 上下文目标预检;阶段 7 默认 feature disabled")。 - 后端-04 L1081:唯一索引
muse_content_work_asset_use_precheck(precheck_id)。 - 后端-04 L849:
muse_ai_candidate_decision_archive字段含work_asset_use_precheck_id(AI 接受候选时引用此预检 = asset_use 的真实"被使用"载体)。 - 后端-04a 完整建表 SQL(13 表,含 work/chapter/block/narrative_state)未含 asset_use→ P3 须建表(V28?)。
- 产品-02F L183-185:
workAssetUsePrecheckId+ feature gate 关闭;L456:asset_use 约束(不写入正文/参考来源/规划项/局域 kb)。 - 专题-03 L181-182:
allowedPurpose(上下文检索/生成参考/绑定/导出/确认知识)、forbiddenPurpose(市场作品资产模板化/受限导出/二次分发);L188:授权必须按用途校验。
可照搬参照(完备)
- 两段式蓝本=knowledge(MuseKnowledgeBindingService:precheck 72-127 + binding 130-177 + consumeMarketHandoff 273-284 + requireUsablePrecheck 300-318;MuseKnowledgeBindPrecheckDO 17 字段)——P2 agent 已第二次照搬,P3 第三次复用同形态(收益:三 owner 兑现侧形态统一)。
- content 写命令约定:commandId 幂等(ContentCommandServiceImpl.reserveCommand + insertIgnore)+ expectedRevision 乐观锁(ContentRevisionGuard.requireRevision,ContentAppServiceImpl.updateWork 133-167)。
- market 端口:MarketHandoffTokenApi.verify/consume(P1/P2 已用,进程内 Bean)。
二、设计骨架(实现期对齐真实 RespVO,不预写代码)
两段式(token 红线,照 knowledge/P2 同款)
- precheck:
POST /muse/works/{workId}/asset-use-prechecks,ReqVO:commandId/handoffToken/sourceAssetId/sourceVersion/authorizationSummaryId/purposes。逻辑:commandId 幂等→market 来源调verify(targetOwner=content,action=asset_use)+consume(token 明文仅此阶段持有、核销)→落muse_content_work_asset_use_precheck(status active)。 - create:
POST /muse/works/{workId}/asset-uses,ReqVO:commandId/assetUsePrecheckId/expectedWorkRevision。逻辑:requireUsablePrecheck→expectedWorkRevision 乐观锁→落"使用事实"(形态见 Q1)→标 precheck consumed;token 已在 precheck 核销,本段凭 precheckId(同 P1/P2 自审修正:token 明文不进 create 段)。
前端 + e2e
- ContentHandoffLanding 落地组件 + useContentHandoff hooks(useAssetUsePrecheck/useCreateAssetUse)+ HandoffLandingPage 加 content dispatch。
- 02F MarketAssetDetailPage 加 targetOwner=content/action=asset_use 发起(asset_use 不依赖物化、sourceAssetId=真实 asset id,可做完整发起入口)。
- handoff-content.spec 真后端:正路 bind-precheck(content)→createHandoff→assetUsePrecheck verify+consume→createAssetUse 落库;负路伪造 token 被 verify 拒、0 写。
三、blast radius
- 纯新增:content asset_use 两段式(DO/Mapper/Service/Controller/ReqVO/错误码 + 表迁移),不改 content 现有写路径(work/block/planning/merge)。
- content-server 加 market-api 依赖(同 knowledge/ai,BcBoundaryArchTest 通用规则已覆盖、0 新 @Test;后端-04 L908/L1030 明确"目标 owner 自校验落 precheck")。
- 前端:复用 P0 基座(HandoffLandingPage + HandoffStore + 02F createHandoff),加 content 分支。
- DDL:新建
muse_content_work_asset_use_precheck(+ 使用事实表若 Q1 选独立表)迁移 V28,全新表向后兼容。⚠️ 应用共享 muse_slice_live = 人类 gate(同 V27)。
四、风险/失败路径
- 原子性(load-bearing,同 P1/P2):precheck 落库 + consume token 同事务(content-server @Transactional + market-api consume REQUIRED 传播)。
- token 红线:伪造/过期/跨属主 token 在 content 服务端被 verify 拒(fail-closed),0 写。
- asset_use 不越界(产品-02F L456 硬约束):只落"使用授权凭证",不写入正文/参考来源/规划项/局域 kb——实现须守边界(不触 content/knowledge 写路径)。
- purposes 授权校验 + 禁模板化:按 purposes 校验授权;market 作品资产模板化属 forbiddenPurpose(专题-03 L182),purpose 白名单须排除 template。
五、拍板点(请你定)
| # | 拍板点 | 选项 | 评审建议 |
|---|---|---|---|
| Q1 | asset_use "使用事实"落库形态 | (A) 单表:precheck 表即事实载体(active→consumed 即"作品可用此资产"凭证,AI archive 引用 precheckId)/ (B) 独立使用事实表 muse_content_work_asset_use(与 knowledge binding 对称,便于按 work 聚合已用资产) |
倾向 A(SSOT 只定义 precheck 表 + AI archive 引用的是 work_asset_use_precheck_id=precheckId,非独立 asset_use_id;A 最贴 SSOT、最小)。若产品要"作品已用资产清单"读模型,可在 A 上加投影,不必独立事实表 |
| Q2 | asset_use 兑现的用户价值锚点(产品) | asset_use 落库后不拉内容/不写正文,用户怎么感知"用了这个资产"? (A) 仅记录"作品已授权使用市场资产 X 作参考/AI 上下文",后续 AI 生成时作上下文来源(价值在 AI 链)/ (B) 加可见的"作品已关联资产"展示区 | 待你定(关系 P3 是否有即时可见价值,还是"记录就绪、价值在后续 AI 上下文消费";若选 A,P3 验收=记录+红线,AI 消费另立) |
| Q3 | purposes 白名单 | reference(参考)/ai_context(上下文检索)/generate_reference(生成参考);排除 template/模板化(forbiddenPurpose) | 确认即可(SSOT 专题-03 L182 + 产品-02F L456 已定模板化禁止) |
| Q4 | P3 范围 | (A) 完整闭环(来源侧发起 02F + 落地兑现 + 真实 asset e2e,因不依赖物化)/ (B) 仅兑现侧(同 P2 最小) | 倾向 A(asset_use 不物化、sourceAssetId 真实,P3 可比 P1/P2 更完整、无 fixture 替身) |
| Q5 | revision 挂级 | work 级(expectedWorkRevision) | 确认即可(SSOT 后端-01 L60 + knowledge binding targetVersion 一致) |
六、验收
- handoff-content.spec 真后端:正路完整闭环(发起→落地→asset_use 落库)+ 负路伪造 token 拒,2 passed + 幂等。
- content asset_use Service 单测(verify 接入 + consume 核销 + 同事务回滚 + 伪造/缺 token/禁用 purpose 拒)。
- BcBoundaryArchTest 0 违例(content→market-api)。
- 前端 tsc/eslint+vitest + 全量 e2e 不回归;V28 应用共享库(人类 gate)。
- 总账回写。
七、回滚
- content asset_use 纯新增,可整段移除(DO/Mapper/Service/Controller/错误码 + 前端组件 + V28 表)。
- 02F content 发起入口 feature-gate。
- 不影响 content 现有写路径 + P0/P1/P2。
下一步:确认 Q1-Q5(尤 Q1 落库形态 + Q2 用户价值锚点 = 真正需拍板)后,按 P2 同款流程实现(后端→前端→e2e→回写)。
八、拍板结论(2026-06-22)
- Q1 落库形态 = 单表(SSOT 对齐):
muse_content_work_asset_use_precheck表即事实载体(active→consumed = 作品可用此资产凭证),AI archive 引用 precheckId(L849)。不建独立使用事实表;若后续需"作品已用资产清单"读模型可加投影。 - Q2 用户价值锚点 = 记录 + AI 上下文消费:asset_use 落"作品已授权用市场资产作参考/AI 上下文",价值在后续 AI 生成链(作上下文来源)。P3 验收 = 记录 + token 红线,AI 消费链另立(不在 P3)。
- Q3 purposes = reference/ai_context/generate_reference(禁 template/模板化,forbiddenPurpose,专题-03 L182 + 产品-02F L456)。
- Q4 范围 = 完整闭环:来源侧发起(02F MarketAssetDetailPage targetOwner=content)+ 落地兑现 + 真实 asset e2e(不依赖物化、sourceAssetId 真实,比 P1/P2 更完整、无 fixture 替身)。
- Q5 revision = work 级(expectedWorkRevision,SSOT 后端-01 L60 + knowledge binding targetVersion 一致)。
实现顺序(P2 同款):后端(pom + V28 建表 + DO/Mapper/Service/Controller/ReqVO + 1_041_002_xxx 错误码 + verify/consume + 单测)→ 前端(ContentHandoffLanding + useContentHandoff hooks + HandoffLandingPage content dispatch + 02F 发起 + vitest)→ V28 DDL 人类 gate + handoff-content.spec 完整闭环 e2e + 全量回归 → 总账/总览/review 回写。
九、实施状态(2026-06-22 ✅ 已交付)
Q1-Q5 拍板全落地。后端:V28 建表 muse_content_work_asset_use_precheck(单表)+ 两段式 MuseContentAssetUseService(verify/consume + purposes 白名单 + work 级乐观锁)+ 1_041_002_xxx 错误码;MuseContentAssetUseServiceTest 8/0 + BcBoundaryArchTest 0 违例(content→market-api 经端口)。前端:ContentHandoffLanding + useContentHandoff hooks + HandoffLandingPage content dispatch + 02F MarketAssetDetailPage 来源侧发起入口;tsc/eslint 绿 + vitest 97→101(ContentHandoffLanding 4)。e2e:V28 已应用共享 muse_slice_live(flyway now at v28、用户拍板、rebuild jar + 重启 48080)+ handoff-content.spec 2 passed(正路真后端全链兑现 + 负路伪造 token 拒)+ 全量 e2e 50→52(1 flaky 单跑绿、非回归)。
诚实范围:asset_use = 「使用授权事实记录」非资产物化(sourceAssetId 直引真实 asset、无物化步骤),故来源侧发起天然完整、无 fixture 替身;Q2 锚点「AI 上下文消费」(经 muse_ai_candidate_decision_archive.work_asset_use_precheck_id)另立、不在 P3。至此 handoff token 红线三 owner(knowledge P1 / agent P2 / content P3)全覆盖;剩 market→knowledge/agent 资产物化独立主线。详见 docs/mvp/进度总账.md 2026-06-22 P3 条。