From 3f59ff90793c6e31e0caea9d9c06919785d6cb67 Mon Sep 17 00:00:00 2001 From: lili Date: Thu, 25 Jun 2026 02:36:58 -0700 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=AE=A2=E6=AD=A3=20market=20authz=20t?= =?UTF-8?q?ype:integer=20=E8=A1=A8=E8=BF=B0=E2=80=94=E2=80=94=E7=BB=8F?= =?UTF-8?q?=E6=A0=B8=E6=98=AF=E4=B8=BB=E9=94=AE=20ID=20=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E9=9D=9E=20ADR-020=20=E4=B8=9A=E5=8A=A1=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 深入调研发现 market openapi authorizationSnapshotId(integer)是 muse_market_authorization_snapshot/summary 表主键 ID 引用(physical PK int64)、非 ADR-020 管的业务标识(market 业务标识字段 authorizationSnapshot 已 string、合规);符合 ADR-020"物理主键 Long"故不需对齐,盲目改 integer→string 反违"拒字符串主键"。订正 ADR-020 后果段(架构-03 v12)+ 进度总账 2026-06-25 此前"market type:integer 待对齐(同源 ADR-020)"的不准确表述。market 对外暴露主键 ID 是否违后端-04 属独立契约议题、与 ADR-020 不同源、本轮不改。 Co-Authored-By: Claude Opus 4.8 (1M context) --- design-docs/架构-03-关键决策与原则(ADR).md | 6 +++--- docs/mvp/进度总账.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/design-docs/架构-03-关键决策与原则(ADR).md b/design-docs/架构-03-关键决策与原则(ADR).md index c58f9196..24f40676 100644 --- a/design-docs/架构-03-关键决策与原则(ADR).md +++ b/design-docs/架构-03-关键决策与原则(ADR).md @@ -1,7 +1,7 @@ # 架构-03:关键决策与原则(架构决策记录(ADR)) -- 版本:v11 -- 更新日期:2026-06-24 +- 版本:v12 +- 更新日期:2026-06-25 - 目标读者:架构/前端/后端/产品 - 阅读时间:30-45 分钟 - 边界说明:这里只收敛架构原则和 ADR;工程结构、表结构、接口、状态机分别归属 `后端-02`、`后端-04`、`后端-05` 和 `架构-04`。本文件描述目标架构决策,不代表当前代码都已实现。 @@ -193,7 +193,7 @@ - 上下文(Context):ADR-018 确定候选表直接记录创建时的 authorization snapshot、接受时实时对比,但没有就该快照 id 的物理承载类型拍板。实现中两阶段发生漂移:AI 候选表(`muse_ai_suggestion`)与内容归因表(`muse_content_block_source_attribution`)的 `authorization_snapshot_id` 列早期建为 BIGINT;而 Agent Runtime Permission Envelope(ADR-016 保留的概念,区别于 ADR-018 去掉的 Candidate Decision Envelope)自本地安全投影(LocalSecurity)起,其标识即为字符串形态(`rpe-local-`)。BIGINT 列承载不了字符串 envelope,导致真实生成的候选该列恒空、接受门禁恒拒,AI 生成→采纳链路在采纳段断裂。后端-04 已明确"业务 ID 对外按 string、不得把数据库主键当产品合同、需跨系统稳定暴露则补 public_id/biz_no",但对外契约一度出现 string 与 integer 并存的分歧。 - 决策(Decision):授权快照 id(及同源 source snapshot id)的业务标识语义统一为**跨系统稳定字符串标识**(biz_no 形态),物理列类型 VARCHAR(128),承载 runtime permission envelope 等字符串授权快照标识。这不与"物理主键用 Long/雪花"冲突:物理自增主键仍是 Long,授权快照 id 是被业务表引用的业务标识/外键语义,本就应对外按 string——VARCHAR 是对该约定的落地而非违背。各业务表(AI 候选、内容归因、知识草稿/绑定等)的 authz/source 快照列统一收敛到 VARCHAR。 - 替代方案(Alternatives):① 为 envelope 建独立授权快照表换取数值 id,最贴一级表概念建模,但实现仓至今未建出该表、envelope 已是字符串、仓内 authz 业务键已普遍字符串化,新建带传播/重验的重表工程量与回归面最大;② 把字符串 envelope 哈希/映射成数值落 BIGINT,违背稳定标识约定、引入碰撞风险、丢失可审计追溯。相比之下统一为字符串标识与既有迁移趋势(知识库相关表已先行改 VARCHAR)、对外契约 string 口径、后端-04 业务 ID 约定三者自洽,是最小且正确的收口。 -- 后果(Consequences):真实生成的 AI 候选可被正常采纳,AI 生成→采纳→正文写入全链打通。接受路径对授权快照只做"存在且非空"校验,移除"必须为数值"的降级门禁。对外契约中授权/来源快照 id 一律按 string 暴露,Market 契约残留的 integer 标注列为后续对齐项。历史数据通过迁移以 `::text` 就地转换。详情读侧本已按字符串透出 envelope,类型统一后模块内自洽。未来以外部 Security 替换本地安全投影时,envelope 标识仍按字符串承载,无需再改列类型。 +- 后果(Consequences):真实生成的 AI 候选可被正常采纳,AI 生成→采纳→正文写入全链打通。接受路径对授权快照只做"存在且非空"校验,移除"必须为数值"的降级门禁。对外契约中授权快照**业务标识**一律按 string 暴露(envelope/biz_no 形态)。Market 的 `authorizationSnapshotId`(integer) 经核是 snapshot/summary 表主键 ID 引用、非业务标识(其业务标识字段 `authorizationSnapshot` 已是 string),符合本 ADR"物理主键 Long"故不在本次对齐范围;market 对外 openapi 暴露主键 ID 是否违后端-04"不得把主键当合同"属独立契约议题、与本 ADR 不同源。历史数据通过迁移以 `::text` 就地转换。详情读侧本已按字符串透出 envelope,类型统一后模块内自洽。未来以外部 Security 替换本地安全投影时,envelope 标识仍按字符串承载,无需再改列类型。 - 参考落地:`后端-04-数据库设计.md`(业务 ID 对外 string 约定)、迁移 `sql/muse/V30`、`架构-02-核心数据结构与双轨模型.md`(Runtime Permission Envelope) ## 3. 本次是否需要新增 ADR 的结论 diff --git a/docs/mvp/进度总账.md b/docs/mvp/进度总账.md index 52775d31..19748786 100644 --- a/docs/mvp/进度总账.md +++ b/docs/mvp/进度总账.md @@ -181,7 +181,7 @@ - ✅ **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 必失败);**槽位绑定 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 AI 生成 UI e2e 已补**(2026-06-24:`ai-generation.spec` 真后端不 stub→真 New-API LLM→suggestion 落库,四断言反假绿 POST2xx/suggestion 真文本/CandidatePanel/DB 新行,连跑 4 次绿 suggestionId 各异);**连带反假绿暴露并修真 bug**:`connectAIStream`(src/lib/sse.ts)漏带 Authorization+tenant-id 头→活体 SSE 必 401/400→done 永收不到→候选永不渲染,被 accept-suggestion 的 stub 长期掩盖(commit 494c9e9);另修 AIPanel onDone 渲染期跨组件 setState 反模式(改 ref,commit 410322c)。**line176② AI 生成 stub 假绿缺口闭合**(accept-suggestion 的 /ai/tasks stub 由真生成 e2e 取代;"AI 本机不可用"旧判断已过时、New-API 在线真生成)。02D 综合完整度:首次创建入口+前端绑定 UI+替换 UI e2e+AI 生成 UI e2e 已通,但 **Override Slot Contract 主数据/方案 B**(首次创建 UI 槽位骨架/合法 slot 校验/系统默认 agent 来源)属人类架构决策域未做、槽位 e2e 只覆盖替换路径。 -- ✅ **2026-06-25:AI 生成命脉「采纳段」断层修复(ADR-020 方案 A,反假绿揭真 bug+IT 假绿,commit a16c596/2ede7cb/af4ad4d)**。承 line183 AI 生成→suggestion 已通,但 accept-suggestion 改真生成调研揭**采纳段断层**:真生成候选 `authorization_snapshot_id=null` 恒不可采纳(merge `1041001001`「外部 owner 暂不可用」),根因=runtime permission envelope 是字符串 `rpe-local-uuid` 但 authz 列从 V4 起 BIGINT 存不下(正是 line86"非数值 envelope 暂无法落 BIGINT 授权快照列、待授权快照建模收口"的遗留兑现),`numericEnvelopeId`/`requireNumericAuthorizationSnapshot`/`parseLongQuietly` 三处同源降级门禁致恒拒。git 时间线坐实历史类型错配(BIGINT 列 05-24 先于字符串 envelope 06-01,numericEnvelopeId 06-14 降级补丁自承遗留),"New-API 数值 envelope"无证据。**反假绿揭 IT 假绿**:`P1rContentMergeGeneratedSuggestionIT` 注入数值 envelope `9001` 故绿,真 New-API runtime 只产字符串 envelope→IT 绿≠活体可采纳。**方案 A(人类拍板,ADR-020;三选一里 B 建独立授权快照表最贴 SSOT 概念但表从未建+工程最大、C envelope hash 映射数值违 SSOT 排除、A 与 V14 既有迁移/ai-knowledge 契约 string/后端-04"对外 string"自洽最小正确)**:V30 迁移 `muse_ai_suggestion`+`muse_content_block_source_attribution` 的 authorization_snapshot_id BIGINT→VARCHAR(128)(仿 V14 Knowledge ALTER);AI 直落字符串 envelope(删 numericEnvelopeId);Content 放开两道数值门(删 requireNumericAuthorizationSnapshot/parseAuthorizationSnapshotId/parseLongQuietly,外部 owner 字符串编号不再被丢);DO authz Long→String 全调用方适配(未误伤 `muse_agent_slot_binding`,不在 V30 范围);ADR-020 把"授权快照 id=跨系统稳定字符串标识(biz_no 形态)"正式化(不违物理 Long 主键——authz id 是业务标识/外键非主键)。**活体真验(muse_slice_live,V30 applied:flyway 30 success + 列 information_schema 查实 character varying)**:真生成 suggestion authz 现存 rpe-local 字符串(len46、非 null)→采纳 merge code=0+block revision 69→70 自增(修复前恒 1041001001)→归因新行 authz 字符串,AI 生成→采纳→Canonical 全链打通。**真 PG IT 转真绿**:P1rContentMergeGeneratedSuggestionIT 改注入真字符串 envelope 仍 PASS(=真绿)、MergeSuggestionIT 5/5 不回归;真跑另暴露 `cd85d9d`(D1-2 work→schema)遗留——P1rContentCore/WorkLifecycleCompletedApprovalIT 的 CompletedApprovalConfiguration 漏供 MetaSchemaQueryApi bean(IT 此前没真跑、靠未执行假绿),补 @Bean 匿名实现修复 13/13 绿(af4ad4d,与断层解耦)。**accept-suggestion 改真生成(2ede7cb)**:删 /ai/tasks+/stream 最后一处 stub,正路真链路(WorkspacePage→AIPanel→真 AI task→SSE done→CandidatePanel 采纳→真 merge),反假绿=authz 真 rpe-local 字符串(非种子数值)/sourceAttribution.parentSuggestionId==真生成 id/revision 实读动态比对(漂移不影响重复),连跑 2 次 2/2 绿。**line176② AI stub 假绿彻底清除**(line183 写"由真生成 e2e 取代"实为 accept-suggestion 仍 stub 生成段、本轮删尽)。编译+test-compile SUCCESS、112 单测绿、核心 IT 真绿。⚠️ 仍缺:Market openapi authz `type:integer` 待对齐 string(独立后续、同源 ADR-020);Override Slot Contract 方案 B 仍属人类架构决策域。环境踩坑入 memory:macOS python urllib 读系统代理须 ProxyHandler({}) 禁(否则连 localhost:48080 也被 7897 污染成 502)。 +- ✅ **2026-06-25:AI 生成命脉「采纳段」断层修复(ADR-020 方案 A,反假绿揭真 bug+IT 假绿,commit a16c596/2ede7cb/af4ad4d)**。承 line183 AI 生成→suggestion 已通,但 accept-suggestion 改真生成调研揭**采纳段断层**:真生成候选 `authorization_snapshot_id=null` 恒不可采纳(merge `1041001001`「外部 owner 暂不可用」),根因=runtime permission envelope 是字符串 `rpe-local-uuid` 但 authz 列从 V4 起 BIGINT 存不下(正是 line86"非数值 envelope 暂无法落 BIGINT 授权快照列、待授权快照建模收口"的遗留兑现),`numericEnvelopeId`/`requireNumericAuthorizationSnapshot`/`parseLongQuietly` 三处同源降级门禁致恒拒。git 时间线坐实历史类型错配(BIGINT 列 05-24 先于字符串 envelope 06-01,numericEnvelopeId 06-14 降级补丁自承遗留),"New-API 数值 envelope"无证据。**反假绿揭 IT 假绿**:`P1rContentMergeGeneratedSuggestionIT` 注入数值 envelope `9001` 故绿,真 New-API runtime 只产字符串 envelope→IT 绿≠活体可采纳。**方案 A(人类拍板,ADR-020;三选一里 B 建独立授权快照表最贴 SSOT 概念但表从未建+工程最大、C envelope hash 映射数值违 SSOT 排除、A 与 V14 既有迁移/ai-knowledge 契约 string/后端-04"对外 string"自洽最小正确)**:V30 迁移 `muse_ai_suggestion`+`muse_content_block_source_attribution` 的 authorization_snapshot_id BIGINT→VARCHAR(128)(仿 V14 Knowledge ALTER);AI 直落字符串 envelope(删 numericEnvelopeId);Content 放开两道数值门(删 requireNumericAuthorizationSnapshot/parseAuthorizationSnapshotId/parseLongQuietly,外部 owner 字符串编号不再被丢);DO authz Long→String 全调用方适配(未误伤 `muse_agent_slot_binding`,不在 V30 范围);ADR-020 把"授权快照 id=跨系统稳定字符串标识(biz_no 形态)"正式化(不违物理 Long 主键——authz id 是业务标识/外键非主键)。**活体真验(muse_slice_live,V30 applied:flyway 30 success + 列 information_schema 查实 character varying)**:真生成 suggestion authz 现存 rpe-local 字符串(len46、非 null)→采纳 merge code=0+block revision 69→70 自增(修复前恒 1041001001)→归因新行 authz 字符串,AI 生成→采纳→Canonical 全链打通。**真 PG IT 转真绿**:P1rContentMergeGeneratedSuggestionIT 改注入真字符串 envelope 仍 PASS(=真绿)、MergeSuggestionIT 5/5 不回归;真跑另暴露 `cd85d9d`(D1-2 work→schema)遗留——P1rContentCore/WorkLifecycleCompletedApprovalIT 的 CompletedApprovalConfiguration 漏供 MetaSchemaQueryApi bean(IT 此前没真跑、靠未执行假绿),补 @Bean 匿名实现修复 13/13 绿(af4ad4d,与断层解耦)。**accept-suggestion 改真生成(2ede7cb)**:删 /ai/tasks+/stream 最后一处 stub,正路真链路(WorkspacePage→AIPanel→真 AI task→SSE done→CandidatePanel 采纳→真 merge),反假绿=authz 真 rpe-local 字符串(非种子数值)/sourceAttribution.parentSuggestionId==真生成 id/revision 实读动态比对(漂移不影响重复),连跑 2 次 2/2 绿。**line176② AI stub 假绿彻底清除**(line183 写"由真生成 e2e 取代"实为 accept-suggestion 仍 stub 生成段、本轮删尽)。编译+test-compile SUCCESS、112 单测绿、核心 IT 真绿。⚠️ 仍缺:Override Slot Contract 方案 B 仍属人类架构决策域。(订正:此前疑虑的 Market openapi authz `type:integer` 经调研**非** ADR-020 残留——它是 `muse_market_authorization_snapshot/summary` 表主键 ID 引用、合规 ADR-020"物理主键 Long",market 业务标识字段 `authorizationSnapshot` 已是 string;market 对外暴露主键 ID 属独立后端-04"不得把主键当合同"契约议题、与 ADR-020 不同源,本轮不改。)环境踩坑入 memory:macOS python urllib 读系统代理须 ProxyHandler({}) 禁(否则连 localhost:48080 也被 7897 污染成 502)。 ### 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 绿**。