docs(ai): 回写槽位绑定 UI e2e 已补(02D 替换路径端到端真验)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1fbe7ae73c
commit
e8ca37c9b9
@ -180,7 +180,7 @@
|
||||
- ✅ **2026-06-22:handoff 跨空间统一接入 P0 基座 + P1 knowledge 端到端闭环(真后端 e2e 反假绿,4 commit)**。盘点①横切共性缺口"handoff 跨空间安全交接=架构级缺失"(五域仅来源侧只读预检、前端 0 消费 token、红线"不信任客户端 URL 参数"零落地)→按执行版分阶段。**P0 基座**:后端 market-api `MarketHandoffTokenApi`(verify 只读核验 + consume CAS 核销,进程内 Bean、复用 selectByTokenHash/effectiveStatus/updateLifecycleByExpectedStatus + cancel 同款 envelope 幂等;completed 此前无生产写入路径=绿地、出参脱敏不回 token)+ 前端 HandoffStore(Zustand,token 用完即弃)/通用 hooks/落地路由 `/handoff/land/:targetOwner`(红线:解析 ?token→replaceState 清 URL→存 store)。**P1 knowledge**:knowledge-server 依赖 market-api,createKnowledgeBindingPrecheck 的 market_kb 来源在 **precheck 阶段**(token 明文仅此持有、createBinding 的 BindReqVO 无 token——自审修正执行版原"createBinding 调 consume")调 verify+consume,替代"只存 hash 不验真"假安全;前端发起(MarketAssetDetailPage bind-precheck 就绪→createHandoff→跳)+ 落地组件(KnowledgeHandoffLanding 3 步:bind-precheck 拿后端可信 source→kbBindPrecheck 核销 token→createBinding 落库,source 全用后端返回不信客户端)。**真后端 e2e**(handoff-knowledge.spec,48080+真 PG):正路完整兑现闭环 + 负路伪造 token 被 verify 拒,2 passed + 二次幂等(用 work4 避 work1+kb1 installed binding 占 uk;global-setup #12 每轮清)。验证:market 编译+install+BcBoundaryArchTest、knowledge -am 编译+边界、前端 tsc/eslint+vitest 82→93、全量 e2e 47→48(handoff +2;knowledge-disable-restore 全量时序 flaky、单跑 2 passed、预存在共享 fixture 时序与本改动无关:handoff 不碰 KB id=1)。连带 drift 收口:MarketBindPrecheckResult.sourceVersion、CreateHandoffInput.authorizationSummaryId 对齐后端 Long。**剩 P2 agent(最高风险:放宽 agentType 校验单点)+ P3 content(asset_use 从零)。** ⚠️ **范围订正(2026-06-22 P2 调研连带发现,反假绿)**:本条"端到端闭环"准确表述 = **token 安全红线端到端 + 绑定落库**;handoff 另一维度"**market 资产物化**"(asset→目标 owner 可用实体、带 source_market_asset_id 溯源)**P1–P3 全缺**——knowledge `MuseKnowledgeBaseDO.sourceMarketAssetId` 字段在却**无人写入**、binding `kb_id=parseLong(sourceId)` 直用预存 kb id(`MuseKnowledgeBindingService:110`)、market install 不建 kb 只落 license 投影(`MarketInstallServiceImpl:63` 注释明示);agent 连该字段都无 + 0 物化代码。**P1 e2e 绿靠 fixture 巧合**(asset1→`kb_id=1` 恰命中预存 kb1)。红线真生效属实,但"market 资产真正变成作品可用 kb/agent"未接,列**独立后续主线**。P2 按用户决策取**最小验证口径(方案 A)**:加字段 + 支持 `agent_type='market'` + seed market agent fixture + 放宽 + verify/consume + e2e,验证放宽红线真生效;install 自动物化后续。
|
||||
- ✅ **2026-06-22:handoff 跨空间统一接入 P2 agent 兑现侧(最小验证放宽红线,真后端 e2e 反假绿,4 commit)**。承 P0 基座 + P1 knowledge,按用户决策三连(先出 P2 评审版 → market→agent 物化取"独立 market 类型" → P2 范围取方案 A 最小验证)。**后端**:ai-server 依赖 market-api;`AgentSlotPrecheckReqVO` 加 sourceType/handoffToken/sourceId/sourceVersion/authorizationSummaryId、precheck DO 加 sourceOwner/handoffHash、muse_agent 加 source_market_asset_id(V27 迁移,全 nullable 向后兼容);precheck market_agent 来源调 verify(targetOwner=agent)+consume(token 明文仅 precheck 阶段持有、bind 凭 precheckId 不再持 token)、**放宽 requireVisibleActiveSourceAgent 仅对已 verify 的 market handoff 跳过 agentType∈{system,user} 校验**(active + version active 仍校验、保护节点/AI 授权隔离不破),bind 凭 precheck.source_owner 标记同款放宽(bind 无 token、不能重验)。**前端**:AgentHandoffLanding 兑现侧落地组件(agentSlotPrecheck market_agent+token→setPrecheck token 用完即弃→bindAgentSlot 凭 precheckId)+ useAgentHandoff hooks + HandoffLandingPage owner dispatch +agent。**真后端 e2e**(handoff-agent.spec,48080+真 PG+V27 真列):正路 bind-precheck(targetOwner=agent)→createHandoff 签 token→agent precheck 后端 verify+consume+放宽接纳 market 类型 agent→bind 落槽位(slotRevision=2)、负路伪造 token 被 verify 拒(0 写),2 passed。验证:MuseAgentSlotServiceTest 25/0(5 放宽红线单测:接纳已验/拒伪造/拒缺 token/拒非 handoff 的 market 型 agent/bind 凭 source_owner 放宽)+ Bc/AiGrant ArchUnit 3/0、前端 tsc/eslint+vitest 93→97(AgentHandoffLanding 4)、V27 已应用共享 muse_slice_live(flyway "now at version v27",用户拍板应用)、全量 e2e 48→50(handoff-agent +2;唯一 flaky=knowledge-disable-restore 全量时序、单跑 2/2 绿、用 KB id=1 与 handoff 用 work4 无关、非 P2 回归)。⚠️ **诚实范围**(承 P1 物化订正):P2 取最小验证口径——**market→agent 资产物化(install 自动建 agent_type=market 实体 + source_market_asset_id 溯源)未接**,e2e 用 seed market agent fixture(global-setup #13:固定 agent_key + active version + work4 槽位)替代;来源侧发起入口(MarketAssetDetailPage agent 按钮)因 sourceAgentId 依赖物化故暂不做(物化后接入)。放宽红线(只接纳 verify 通过的 market token、伪造/缺 token/非 handoff 的 market 型 agent 全拒)真生效属实。**剩 P3 content(asset_use 从零)+ 资产物化(install 自动物化 kb/agent)独立主线。**
|
||||
- ✅ **2026-06-22:handoff 跨空间统一接入 P3 content 兑现侧(asset_use 从零、完整闭环,真后端 e2e 反假绿,2 commit)**。承 P0 基座 + P1 knowledge + P2 agent,按用户拍板(Q1 单表/Q2 记录+AI 上下文/Q3 purposes 禁 template/Q4 完整闭环/Q5 work 级 revision)。**后端**:content-server 依赖 market-api;V28 建表 `muse_content_work_asset_use_precheck`(单表即事实载体 active→consumed,照 knowledge bind_precheck,全 nullable 向后兼容);两段式 `MuseContentAssetUseService`——precheck 段 market_asset 来源调 verify(targetOwner=content/targetAction=asset_use)+consume(token 明文仅此段、create 凭 precheckId 不再持 token)、purposes 白名单 reference/ai_context/generate_reference(禁 template=`CONTENT_ASSET_USE_PURPOSE_INVALID`)、create 段 work 级乐观锁(expectedWorkRevision)落使用事实;错误码 `1_041_002_xxx`。**前端**:ContentHandoffLanding 兑现侧(bind-precheck targetOwner=content 拿可信 source→assetUsePrecheck 核销 token→读 work revision→createAssetUse 凭 precheckId)+ useContentHandoff hooks + HandoffLandingPage content dispatch + **02F MarketAssetDetailPage「用于作品(进入作品空间)」来源侧发起入口(asset_use 不依赖物化、sourceAssetId 真实,故比 P1/P2 更完整、无 fixture 替身)**。**真后端 e2e**(handoff-content.spec,48080+真 PG+V28 真表):正路 bind-precheck(content)→createHandoff(content/asset_use)签 token→asset-use-precheck 后端 verify+consume→asset-uses 落使用事实(单表转 consumed、assetUseId=precheckId)、负路伪造 token 被 verify 拒(0 写),2 passed(global-setup #14 每轮清 work4 asset_use precheck)。验证:`MuseContentAssetUseServiceTest` 8/0(正路 verify+consume/伪造拒/缺 token 拒/禁用 purpose 拒/越权拒/create 闭环/work revision 冲突/precheck 过期)+ BcBoundaryArchTest 0 违例(content→market-api 经端口、不碰 market.dal)、前端 tsc/eslint+vitest 97→101(ContentHandoffLanding 4:就绪/闭环/核验拒绝/会话失效)、**V28 已应用共享 muse_slice_live(flyway "now at version v28",用户拍板应用、rebuild jar + 重启 48080)**、全量 e2e 50→52(handoff-content +2;唯一 flaky=knowledge-disable-restore 全量时序、单跑 2/2 绿、用 KB id=1 与 content 用 work4 无关、非 P3 回归)。**至此 handoff token 红线三 owner(knowledge P1 / agent P2 / content P3)端到端全覆盖。** ⚠️ **诚实范围**(承 P1/P2 物化订正):content asset_use **本质=「使用授权事实记录」非资产物化**(落 precheck 表凭证、sourceAssetId 直引真实 asset id,无「market 资产变 content 实体」步骤),故 P3 无 A/B 物化拆分、来源侧发起入口天然完整;Q2 锚点「AI 上下文消费」(asset_use 作 AI 生成链上下文来源、经 `muse_ai_candidate_decision_archive.work_asset_use_precheck_id` 引用)**另立、不在 P3**。**剩 market→knowledge/agent 资产物化(install 自动建 kb/agent 实体 + source_market_asset_id 溯源)独立主线。**
|
||||
- ✅ **2026-06-24:AI 生成命脉真后端端到端打通(逐条破除 line176 四重阻塞,反假绿,commit 86c6dba/df063cb/9115d4f)**。承 line176"AI 生成 ⚠️ 四重阻塞"逐条解除:① **AIPanel 补全上下文引用**(df063cb 前端 MVP:AIPanel 传 workId/blockId/chapterId/agentSlotKey + WorkspacePage 透传真实上下文 + mock 收紧 workId 必填 + contract 断言反向验证,前端单测 101/101);② **02D 槽位绑定首次创建死锁已修**(9115d4f:precheck/bind 都 `requireSlotBinding` 缺行抛 forbidden、而"替换"是设计中唯一创建入口("替换"=首次写入、无独立创建端点是有意,后端-04 line748/产品-02D line507)→死锁,普通用户首次绑定永不可达(work4 seed binding 实为 E2E 绕 bug 手插);修=precheck 缺行放行 + bind 抽 `persistBinding` upsert(无行 insert revision1 避免首次 expectedSlotRevision null NPE/有行 updateById 沿用乐观锁)+ V29 `uk_muse_agent_slot_binding_active` partial unique index + 前端 mock protected 口径对齐 `protected:` 前缀;`MuseAgentSlotServiceTest` 26/26+Controller 4/4);③ dispatcher 本轮重启正常调度(initial-delay 8s,非 line176 的 24h 禁用);④ New-API 在线真验(MiniMax-M2.5,"本机不可用"已过时);外加 **P-A 检索 miss 根因修复**(86c6dba:`HttpRagFlowKnowledgeRuntimeClient` 把 `document_ids` 以 null 入 retrieval body→RAGFlow code102"documents should be a list"拒→检索 fail-closed→chunkCount=0(task3/4/5/6 全 0 即此);修=null 不入 body)。**真后端 happy-path 真验(muse_slice_live,真 API 非 mock/stub)**:work1 `writing.continuation` precheck(不再 forbidden)→bind 首次建 binding(slotRevision=1 active)→GET 槽位显示 agent1→AI task POST `/app-api/muse/ai/tasks` 用 `agentSlotKey`(非 agentOverrideRef)→agent1 解析 + runtime 授权 envelope → completed + suggestion7(GET `/app-api/muse/suggestions/7` 真 LLM"星环大陆魔法体系与元素对抗禁咒"续写、finishReason stop)。**专题-03 P-A/P-B/P-C 完整 e2e + 前端 MVP agentSlotKey 路径真后端端到端走通**,line176"AI 生成链 e2e 一律 stub /ai/tasks、最关键创作命脉绿在 mock 上"的最大假绿点消除。V29 由 Flyway 启动日志证 applied v29(用户拍板应用 muse_slice_live)。⚠️ **诚实范围/仍缺**:Override Slot Contract 主数据(方案 B:合法 slot 校验/系统默认 agent 来源/`listWorkAgentSlots` 预设骨架未做,slotKey 暂自由字符串、listSlots 缺行仅返回已绑定 slot)未做、属人类架构决策域;SlotBindingPanel 绑定流(precheck→bind)本就完整、**workId 硬编码已解**(2026-06-24:AgentPage 接 useWorkList 作品选择器替代硬编码 WORK_ID_FOR_SLOT_PREVIEW='1'、AgentPage.contract test 验作品选择→正确 workId 下传、vitest 101→102;盘点"无真正绑定流"过时=实为后端死锁挡着 bind 必失败);剩 AIPanel/槽位→真后端 playwright e2e 未补(本轮真验经 curl 链路 + 组件单测);02D 综合完整度仍偏低(首次创建入口+前端绑定 UI 已通,但 Override Slot Contract 主数据/方案 B 属人类架构决策域未做)。
|
||||
- ✅ **2026-06-24:AI 生成命脉真后端端到端打通(逐条破除 line176 四重阻塞,反假绿,commit 86c6dba/df063cb/9115d4f)**。承 line176"AI 生成 ⚠️ 四重阻塞"逐条解除:① **AIPanel 补全上下文引用**(df063cb 前端 MVP:AIPanel 传 workId/blockId/chapterId/agentSlotKey + WorkspacePage 透传真实上下文 + mock 收紧 workId 必填 + contract 断言反向验证,前端单测 101/101);② **02D 槽位绑定首次创建死锁已修**(9115d4f:precheck/bind 都 `requireSlotBinding` 缺行抛 forbidden、而"替换"是设计中唯一创建入口("替换"=首次写入、无独立创建端点是有意,后端-04 line748/产品-02D line507)→死锁,普通用户首次绑定永不可达(work4 seed binding 实为 E2E 绕 bug 手插);修=precheck 缺行放行 + bind 抽 `persistBinding` upsert(无行 insert revision1 避免首次 expectedSlotRevision null NPE/有行 updateById 沿用乐观锁)+ V29 `uk_muse_agent_slot_binding_active` partial unique index + 前端 mock protected 口径对齐 `protected:` 前缀;`MuseAgentSlotServiceTest` 26/26+Controller 4/4);③ dispatcher 本轮重启正常调度(initial-delay 8s,非 line176 的 24h 禁用);④ New-API 在线真验(MiniMax-M2.5,"本机不可用"已过时);外加 **P-A 检索 miss 根因修复**(86c6dba:`HttpRagFlowKnowledgeRuntimeClient` 把 `document_ids` 以 null 入 retrieval body→RAGFlow code102"documents should be a list"拒→检索 fail-closed→chunkCount=0(task3/4/5/6 全 0 即此);修=null 不入 body)。**真后端 happy-path 真验(muse_slice_live,真 API 非 mock/stub)**:work1 `writing.continuation` precheck(不再 forbidden)→bind 首次建 binding(slotRevision=1 active)→GET 槽位显示 agent1→AI task POST `/app-api/muse/ai/tasks` 用 `agentSlotKey`(非 agentOverrideRef)→agent1 解析 + runtime 授权 envelope → completed + suggestion7(GET `/app-api/muse/suggestions/7` 真 LLM"星环大陆魔法体系与元素对抗禁咒"续写、finishReason stop)。**专题-03 P-A/P-B/P-C 完整 e2e + 前端 MVP agentSlotKey 路径真后端端到端走通**,line176"AI 生成链 e2e 一律 stub /ai/tasks、最关键创作命脉绿在 mock 上"的最大假绿点消除。V29 由 Flyway 启动日志证 applied v29(用户拍板应用 muse_slice_live)。⚠️ **诚实范围/仍缺**:Override Slot Contract 主数据(方案 B:合法 slot 校验/系统默认 agent 来源/`listWorkAgentSlots` 预设骨架未做,slotKey 暂自由字符串、listSlots 缺行仅返回已绑定 slot)未做、属人类架构决策域;SlotBindingPanel 绑定流(precheck→bind)本就完整、**workId 硬编码已解**(2026-06-24:AgentPage 接 useWorkList 作品选择器替代硬编码 WORK_ID_FOR_SLOT_PREVIEW='1'、AgentPage.contract test 验作品选择→正确 workId 下传、vitest 101→102;盘点"无真正绑定流"过时=实为后端死锁挡着 bind 必失败);**槽位绑定 UI e2e 已补**(2026-06-24:`agent-slot-bind.spec` 真浏览器 AgentPage→selectOption work1→选 agent1→点绑定→真后端 precheck→bind 替换槽位;三重反假绿=DB 起点 revision1 + bind 响应 code0/slotRevision2 + UI"绑定已更新" + DB 终态 revision1→2;global-setup §15 每轮复位 work1 槽位保证可重复;自验+子代理各跑 passed);剩 AIPanel→真后端 playwright e2e 未补(本轮真验经 curl 链路+组件单测);02D 综合完整度:首次创建入口+前端绑定 UI+替换 UI e2e 已通,但 **Override Slot Contract 主数据/方案 B**(首次创建 UI 槽位骨架/合法 slot 校验/系统默认 agent 来源)属人类架构决策域未做、e2e 只覆盖替换路径。
|
||||
|
||||
### D. gateway 接线(B4,**配置层已收口;运行态后置**)
|
||||
- ✅ **配置层收口(2026-06-19)**:`muse-gateway` 已新增 `/admin-api/muse/**`、`/app-api/muse/** → grayLb://muse-server`,删除当前聚合入口未启用的 bpm/pay/report/mp 死路由,Knife4j 聚合入口改为 `muse-server`。新增 `GatewayRouteConfigurationTest` 机械门禁,断言 Muse 路由存在、停用模块路由不回潮、Knife4j 不展示停用服务;本轮 `mvn -pl muse-gateway test -Dtest=GatewayRouteConfigurationTest` **3/3 绿**。
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user