oh-my-muse/docs/mvp/进度总账.md
2026-06-21 13:56:21 -07:00

98 KiB
Raw Blame History

Muse 进度总账(单一进度源)

本文件是项目进度的唯一 SSOT。进度更新只进本文件 + 各模块 .agent;不再新增“状态推进 / 收口 / completedApproval”过程文档(过程文档 churn 是失控根因之一,见 对抗复盘)。 接口覆盖门机械唯一源 = 覆盖 JSON p1r-api-coverage.json(经 P1rApiCoverageReportTest 校验 summary 自算 + testFiles 证据),当前 233/233 completed / 0 needs_verification;⚠️ 该口径 = 接口门,≠ 端到端可用(整体 ~76%,见 §二)。 模块现状细节见 现状基线 spec(2026-06-13 历史快照,文内 147/86 为当时值,以本文件 + 覆盖 JSON 为准);人读全局见 项目功能与进度总览


一、Agent 开发基建(本轮交付,机械门禁优先)

内容 状态 机械证据 / 落点
P0 CI 真跑测试(JDK21、去 -Dmaven.test.skip)+ 覆盖台账去硬编码 + P0 冻结令 muse-cloud/.github/workflows/maven.ymlP1rApiCoverageReportTest脊柱规则
BC 边界 ArchUnit 门——通用覆盖全业务 BC 间方向 全绿(AI/knowledge/market 三处直连他域 DAL 违例均已整改,豁免清单清空) BcBoundaryArchTest(1/0F,0 Architecture Violation,KNOWN_VIOLATION_EXEMPTIONS=空);bc-boundaries §三
①b AI grant/runtime 最小 ArchUnit 门 绿;完整物理包拆分仍后置 AiGrantRuntimeBoundaryArchTest(1/0F):runtime/任务执行侧不得直连 ToolGrant 写模型
契约先行门(Flyway 迁移卫生 + OpenAPI 存在性/结构) 绿;语义破坏由 openapi-diff 补强——检测逻辑已本地实证(2026-06-17,oasdiff v1.19.1,7 域真实契约 5/5),root workflow 已接线,远端 Gitea Actions 首跑待确认 ContractFirstGateTest(2/0F);openapi-diff.yml+verify 脚本;contract-first §四
loop 机械牙 + CI 接电(round-2) 绿 AgentsInfraIntegrityTest(3/0F);maven.yml 触发分支修为 main
knowledge 蒸馏(定位架构 / 现状基线指针 / 决策) .agents/knowledge/
skills(黄金旅程“完成”定义 / 新增 BC 模块) .agents/skills/
workflow(AI 开发协议元流程) .agents/workflows/ai-development-protocol.md
进度总账(本文件)+ per-module .agent 本文件 + muse-cloud/muse-module-*/.agent

round-2 加固(2026-06-14,据 Opus 评审):CI 触发分支 master→main(此前 CI 从不运行)、BC 门通用化 + 整改 knowledge 违例、loop 装机械牙、覆盖门去魔法数、文档诚实化、openapi-diff materialize 为独立 workflow。

market 写路径整改(2026-06-14,ultracode):member 暴露写端口 MuseAccountRecordProjectionApi + DTO(member-server 实现读写自有 DAL、tenantId 由实现侧从上下文注入防伪造、事务沿用调用方),market 5 类改消费端口、移除 member.dal 依赖 → KNOWN_VIOLATION_EXEMPTIONS 清空、BC 门全绿。附带修复:round-2 重构 ContentKnowledgeWorkOwnerFacade 时遗留的旧测试 KnowledgeWorkOwnerFacadeTest(仍断言旧 WorkMapper 行为)已删除,其装配守卫/兜底两用例并入 ContentKnowledgeWorkOwnerFacadeTest(5/0F)——此为 round-2 一处假绿(当时构建在平台时区用例处中止、未真正跑到 knowledge),现已补正。

后续基建 TODO:openapi-diff 远端 CI 首跑验证(🔧 检测逻辑+循环聚合已本地实证 2026-06-17:oasdiff v1.19.1 对 7 域真实契约 5/5 拦真破坏/放行安全演化,镜像钉版本+复现脚本已落地;2026-06-19 已把 workflow 从 muse-cloud/.github/workflows/ 移到仓库根 .github/workflows/,修正自建 Gitea Actions 只扫描根 workflow 的接线问题;仅余远端真实 PR 首跑确认:pull_request paths 触发、base.sha worktree、docker 镜像拉取、Gitea Actions 是否已启。mvn -B package[CI 确切命令]已本地实证全绿(2026-06-17,全 reactor 单测 + 打包步骤),接线后即应绿——属远端基建首跑,留人类)。 已完成项:connectAIStream SSE 契约漂移收口(2026-06-19 targeted Vitest:sse.test.ts + AIPanel.contract.test.tsx 17/17,按真实后端 event: 行解析且 Long suggestionId→string)、muse-module-ai-contract-server 空壳孤儿清理(2026-06-19:从 AI reactor 移除、删除唯一 pom、P1rAiRouteOwnershipTest 加回潮门禁)、dev-baseline 收敛进 rules(2026-06-19:新增 engineering-conventions + security-and-reliability,旧 docs/dev-baseline/** 降级历史归档并由 AgentsInfraIntegrityTest 索引门兜底)、completed=测试证据兜底(2026-06-19:coverage JSON 增 testFiles;生成器 --check + P1rApiCoverageReportTest 校验 completed 必须引用真实 src/test/java 证据文件且不得引用 coverage/gate 自身)、跨域 .application 边界门(2026-06-17:BcBoundaryArchTest 0 违例 + 反向证 238 例非空转)、market-server→member-server pom 坐标收口(2026-06-17:market-server 收窄至 member-api + tenant starter 直接声明)、ai/平台预存红测试整改(2026-06-15~17:三项全清)。

🎯 全 reactor mvn test 史上首次全绿(2026-06-17):本特性分支 30+ commit 从未 push、maven.yml 只在 push/PR-to-main 触发故 CI 从未在本分支真跑过,积累若干潜伏红。以 mvn -pl muse-server -am test -fae 全 reactor 排查,逐模块解锁(上游失败 fail-fast 会 SKIP 下游),共清 6 处:① market AppMuseMarketPublishControllerTest 9 参 PublishRecordItem 构造(record 自 a00c758 加 marketAssetId/appealStatus 变 10 参)② coverage 台账 33 op serviceFiles 陈旧引用(本会话 facade 移 member-api 所致)③④ knowledge/ai 的 Content*WorkOwnerFacadeTest 仍断言 @ConditionalOnBean(2026-06-14 单体修复已去除、改 @Primary)⑤ ai MuseAiEventPublishOutboxMapperTest 真 PG 用例无 PG 时硬 fail→改 assumeTrue skip(与 P1r external-acceptance env 缺失即 skip 约定一致、honest 非假绿)⑥ muse-server P1rKnowledgeMigrationSqlTest 元测试钉死 TARGET_VERSION="14"(IT 已按 4d46d7a 动态自适应)→版本无关化。全 reactor BUILD SUCCESS、0 失败(真 PG 类无 PG 时 skip)。教训:跨模块重构后须跑 -fae 全量,勿只跑改动模块。前端 muse-studio 同步复验绿(2026-06-17:tsc -b 0 错误 + vitest run 12 文件/47 用例全过;本分支前端改动 35 文件全在 studio、admin 未动)——故整分支(后端 mvn -B package + 前端 tsc/vitest)deterministic CI 检查全绿,均本会话实证(e2e/playwright 需活体后端+浏览器,未在本轮跑;真 PG IT 多数 2026-06-17 已人工批准且本会话变更为 import-only+单测已覆盖,未重跑)。


二、产品 / 模块进度(指针,勿在此重复细节)

  • 各模块目标 / 边界 / out-of-scope / 现状 / TODO → 见对应 muse-cloud/muse-module-*/.agent
  • 真实完成度与逐项证据 → 见 现状基线 spec §四/§五
  • 接口完成台账(门禁批准口径,≠端到端可用)→ P1rApiCoverageReportTest + docs/superpowers/reports/p1r-api-coverage.json;completed operation 现在必须带 testFiles 证据锚点。
BC 模块 只读评估 .agent
AI 编排 (ai) 72% .agent
作品/编辑器 (content) 82% .agent
知识库 (knowledge) 72% .agent
市场 (market) 82% .agent
元治理/MetaSchema (meta) 82% .agent
事件/SSE (events) 88% .agent
账户/个人中心 (account→member) 68% .agent

整体只读评估 ≈ 76%:后端实现高、接口覆盖门已满(233/233)但 ≠ 端到端可用、前端用户端低、跨 BC 集成低(机械门禁本轮已补 BC + 契约门)。

2026-06-14 更新 —— P1 后端"环境阻塞"已解除:此前"86 个 needs_verification 须真实 PG、本地不可验"的判断已被实测推翻。接通共享远端 PG(详见 §四 时间线 + .agents/knowledge §四)真跑 20 个 P1r*IT,19/20 类零功能失败——completed-approval / Flyway 迁移 / events-publish outbox 等后端路径在真实 PG 上获机械绿证据(非假绿)。仍未验证/未达:前端 muse-studio(无 FE 运行栈);唯一红 P1rKnowledgeFlywayMigrationIT(陈旧硬编码 V14,待改为动态版本);live-acceptance 中需 MUSE_P1R_EXTERNAL_ACCEPTANCE=true 才真跑的用例;以及覆盖台账 completed≠端到端可用(FE 断链仍在)。

2026-06-14 更新 —— MVP #1「前端 AI 候选闭环」代码已闭合 + 后端实证:现状基线 §6.3 列首位的高危缺口(studio 未接 suggestion-merges、仅本地 setContent)已整改:前端真实编辑器接入唯一合法入口、后端 merge 主链路在真实 PG 上 5/5 绿(P1rContentMergeSuggestionIT)。剩余到「用户在跑起来的 app 里真能用」的范围外阻塞:仅 1 个——远端 dev 库缺 yudao 基座 schema(全栈 app 起不来,需 provision)。connectAIStream 的 SSE parser 漂移、AI 运行时未写「审」字段均已修复(后者:AI 生成链路现真实产出审结果 + active + 数值授权快照 + content,生成候选可被 mergeBlockSuggestion 采纳,见 §四 时间线 + .agents/knowledge §五)。


三、最大共性风险(跨模块,来自基线)

  1. 前端 muse-studio 严重滞后:AI 候选闭环断链、知识库/市场生产侧 UI 缺失、个人中心约 21% 面跑 MSW——“先审后入”在用户可见层当前不可用。
  2. 跨 BC facade 多为 Unavailable 占位 → 运行期 *_UNAVAILABLE
  3. gateway 运行态转发未首跑:配置层已接 /admin-api/muse/**/app-api/muse/**muse-server 并清理停用模块死路由;但 muse-server 默认禁用 Nacos 注册,网关真实转发仍需部署/注册发现首跑验证。

四、历史交付时间线(过程文档已清理,留此精简记录)

2026-06-14 共清理约 97 份过程 churn(docs/memorys 34、agent-specs 审阅/执行版+迁移review 34、design-docs/临时 2、design-docs/memorys 2、superpowers/plans 14 + specs 11;保留 superpowers/reports/coverage——被门禁引用)。唯一操作干货蒸馏入 .agents/knowledge/external-deps-and-gotchas.md;均 git 可恢复,完整历史在 git。

2026-05-24  muse-studio 脚手架+基础设施(Vite/React/TS6.0/MSW/IndexedDB)
2026-05-24  muse-studio 写作台+AI 协作(Tiptap + Coarse-to-Fine Diff + SSE 采纳)
2026-05-25  muse-cloud 后端 P1(yudao-cloud fork + 业务模块骨架)
2026-05-25  muse-admin 管理端(Vben fork:MetaSchema/治理/审计)
2026-05-26  P1R-0 基线门禁(OpenAPI 233 operation 覆盖矩阵)
2026-05-27→28  P1R-1/2 Content / Meta 真实 API
2026-05-31  P1R-4 AI 真实 API + task SSE 退占位(V12/V13)
2026-06-02  P1R-4/5 外部验收:New-API(MiniMax-M2.5)+ RAGFlow live 跑通
2026-06-05  P1R-6 Market 真实 API;P1R-7a Events SSE
2026-06-06→08  P1R-7b~7f Source Owner Propagation 五切片(V17V21 outbox)
2026-06-09→13  Events/Meta/Account/Market/Content 分批 completed approval(coverage→147/233)
2026-06-13  现状基线 + 对抗复盘(诊断"假绿")+ P0 止血(CI 真跑测试/JDK21/去硬编码)
2026-06-14  Agent 开发基建六砖(BC 门 + 契约门 + .agents 中枢 + 单一总账)+ 历史文档清理
2026-06-14  P1 harness 验证:消除 BC 违例 ContentMuseWorkOwnerFacade(content-api 端口 + AI 改消费)→ ArchUnit 豁免删除、门禁收紧(反向红 31 例 / 正向绿;13+7 单测)
2026-06-14  P1 market 写路径整改(ultracode):member 暴露 MuseAccountRecordProjectionApi 写端口 + DTO,market 5 类去 member.dal → 豁免清空、BC 门全绿;附带补正 round-2 knowledge 旧测试假绿(JDK21 scoped 实跑:BcBoundary 1/0F+0 违例、knowledge 5/0F、member 4/0F、market 5 类全绿、契约/loop/覆盖门全绿,BUILD SUCCESS)
2026-06-14  P1 后端 real-PG IT 验收:接通共享远端 PG(100.64.0.8:5433,PG17.10;破本机 SOCKS 代理破坏 PG 协议的坑)真跑 20 个 P1r*IT,**19/20 类零功能失败**(~95 用例绿,含 completed-approval/Flyway 迁移/events-publish outbox + New-API live)。唯一红=P1rKnowledgeFlywayMigrationIT 硬编码断言 V14(schema 已 V21,陈旧用例,源自 commit 7155285、非本轮)。配方+代理坑入 [.agents/knowledge §四](../../.agents/knowledge/external-deps-and-gotchas.md)。
2026-06-14  MVP #1 纵切(AI候选→采纳入正文,据现状基线 §6.3 #1):前端真实编辑器(WorkspacePage)接入唯一合法入口 suggestion-merges——新增 useAcceptSuggestion + client 注入 Bearer + AIPanel 透传 suggestionId + CandidatePanel 异步防双写,**去除本地 setContent 绕过双轨主权**、connectAIStream 复用 createEventStreamParser 对齐真后端 SSE `event:` 线(修掉旧 `data.type` 漂移)(studio tsc/**47 单测**/build 全绿)。后端新增机械门禁 `P1rContentMergeSuggestionIT`:真实 PG + 真实 `AiSuggestionMergeProjectionFacade` 读真种 muse_ai_suggestion,**5/5 绿**(正向写 Canonical revision1→2/revision 冲突/幂等回放/非 pending/审缺失)。**未达(诚实)**:活体 UI e2e 未跑——阻塞于①远端 dev 库缺 yudao 基座 schema(system_tenant,全栈 app 起不来,需 provision)②AI 运行时未写「审」字段(生成流候选不可合并,chip task_092cfc32);均范围外。connectAIStream 的 SSE parser 漂移**已在本提交修复**。`e2e/accept-suggestion.spec.ts` 已写(只写不跑)。
2026-06-14  AI「审」字段补齐(消除「生成候选永不可采纳」缺口,chip task_092cfc32):新增 `MuseAiCandidateReviewService`(真实轻量审——输出合规扫描/静态检查/许可快照,通过才给可追溯审结果 ID,否则不给→门禁如实拒绝);`MuseAiRuntimeProjectionService.createRuntimeSuggestion` 现写顶层 content(脱敏 summary)+ 三审字段 + `source_status`='active'(修 'verified')+ 数值授权快照(沿用 runtime permission envelope=authz 既有约定)。机械门禁 `P1rContentMergeGeneratedSuggestionIT`(真实 PG):经真实 `createShadowSuggestionCandidate` 产候选→断言 active/审/authz/content 由真实代码产出→`mergeBlockSuggestion`(merge_after_edit)写入 Canonical。验证:`MuseAiCandidateReviewServiceTest` 5/0、`MuseAiRuntimeProjectionServiceTest` 5/0(回归)、`P1rContentMergeGeneratedSuggestionIT` 1/0、`P1rContentMergeSuggestionIT` 5/0 = **16/16 绿**。遗留:非数值 envelope id 暂无法落 BIGINT 授权快照列(已知列能力限制),待授权快照建模收口。
2026-06-14  全栈 app 启动攻坚(为活体 e2e):实测推进,拆两墙、定位第三墙。①墙1 修复:member-server repackage 配 classifier=exec(commit 1f89007)→ 全项目 `mvn package` 由"破损"变 BUILD SUCCESS、产出 muse-server.jar(此前 d38260f 的市场整改只验 test 未验 package,是假绿)。②墙2 解决:本仓原无 postgres 基座 dump(只有 H2 测试 schema),已把 system/infra/member 的测试 schema 忠实翻为 PostgreSQL(49 表,实测 0 失败)+ 最小启动种子(system_tenant id=1),固化到 `muse-cloud/sql/dev/yudao-base-schema-postgres.sql` + `yudao-base-seed-postgres.sql`;灌入 muse_slice_live 后 app 的 Flyway(baseline-on-migrate)成功补 Muse V1-V21、Tomcat 起、Spring 初始化。③墙3(定位,未解,开 chip):muse-server 卡在 bean 装配——`PermissionCommonApi` 等 5 个 `biz.system` CommonApi 是 **@FeignClient(yudao-cloud RPC)**,单进程单体下无人提供本地 bean。即**本项目从未以单体真正启动过(基线"未实跑"的根因)**,需「阶段7 工程承接」补一层"CommonApi→system 本地 impl"的单体 RPC 桥接(真实桥接,非 permissive stub——stub 会造假绿启动)。这是项目级架构整合,非 MVP 纵切范围。**MVP #1 纵切本身仍以 4 个真实 PG IT 为正确性证据(未受影响)。**
2026-06-14  ✅ **全栈 muse-server 史上首次单进程单体成功启动 + MVP #1 活体端到端跑通**(ultracode)。**墙3 诊断证伪**:初判"需 Feign RPC 桥接"错,真因是 ①system/infra/ai-server 也缺 classifier=exec(fat-jar 嵌套致类不可加载,commit eea10b7)②Spring 条件注解 `@ConditionalOnBean/Missing` 在 `@Service/@Component` 上不可靠→facade 装配非确定性失败,改 `MonolithFacadeFallbackAutoConfiguration`+去条件(commit d09d529)③`@Resource` 跨模块 bean 名撞名(AccountExport 的 exportTaskMapper)重命名 ④codegen.import-enable 缺省 ⑤本机 SOCKS 代理破坏 PG(`-DsocksProxyHost=`)——`PermissionApiImpl` IS-A `PermissionCommonApi`,类可加载后 bean 自满足,**全程零 Feign 桥接、零 permissive stub**。**实测**:`Started MuseServerApplication in 17.985s`(Tomcat 48080,连 muse_slice_live);curl 真打:`GET /works`→`{"code":0,total:1}`;`POST .../suggestion-merges`(accept_as_is,种子 work1/block1/sugg1)→`code:0,newRevision:2,sourceAttribution(ai_suggestion)+lineage`;reload 块 `content_text=AI候选正文、revision=2`;负路径陈旧 revision=99→`code 1041000002 乐观锁拒`(反假绿)。**MVP #1 纵切(AI候选→采纳入正文)在真实 HTTP+mock鉴权+租户过滤+真实 PG 上活体闭环**。全栈起法+活体命令固化入 [.agents/knowledge §六](../../.agents/knowledge/external-deps-and-gotchas.md)。**遗留**:studio 渲染层 UI e2e(Playwright,`accept-suggestion.spec.ts`)依赖 vite dev + 联调生成流,后端活体已 curl 证;非阻塞。
2026-06-15  ✅ **studio 整套活体 e2e 单次全绿 8/8**(承 MVP#1 长板):关 MSW(VITE_API_MOCK=false,固化进 playwright.config webServer env + .env.local)、vite 代理→真实单体 48080、chromium 真跑——accept-suggestion 正+负(DB 实证 block3 rev1→2 + AI摘要正文 + ai_suggestion 归因落库)、knowledge-confirm(种 pending 草稿→确认→draft confirmed + 新建 Canonical entity)、live-read 4 读旅程、workspace 壳。修红:workspace.spec.ts 原 mock 假绿(断言「星海迷途」)MSW-off 下必红→改不依赖 mock 壳冒烟。读 ContentSourceServiceImpl 证 merge 校验序 requireRevision 先于 pending(正负可并行)。诚实遗留:e2e 暂依赖 /tmp 助手手动 reseed,待补 playwright global-setup 自播种。
2026-06-15  ✅ **studio 市场生产侧发布草稿纵切活体绿 + 修真实潜伏后端 bug**(承前端长板,goal 主攻):新增 `MarketPublish`(/market/publish)生产侧表单 + `useMarketPublish` hook;保存发布草稿(POST /marketplace/publish-drafts)→ my-publish-records 真实回读,`market-publish.spec.ts` chromium MSW-off 正+负绿,DB 证 muse_market_publish_draft 落库(status=draft);整套 e2e 10/10 + vitest 47/47 无回归。**修真实 bug**:publish draft/check/request 的 (tenant_id,command_id) 部分唯一索引(V15)与 mapper 无谓词 `ON CONFLICT` 不匹配→PG 报 no unique constraint matching→savePublishDraft 500(链路从未活体跑过、潜伏至本切片);修=部分→完整唯一索引(V22 迁移 + muse_slice_live 已应用)。遗留:其余 market 表(handoff/appeal 等)同类部分索引待收口。
2026-06-15  🔎 **account facade 活体订正(无净代码改动,反假绿)**:user 据 §五A"account 21 端 UNAVAILABLE"选"account 后端 facade 真实化"。Explore 静态分析判 MarketAccountProjectionFacade 阻塞 purchases/licenses/publish-records;**实测推翻**——单体内 market `MarketAccountProjectionProvider`(@Service)本身 implements MarketAccountProjectionFacade、对三类型放行,`@ConditionalOnMissingBean` 使其压过 member 的 Unavailable 兜底 → 三端在单体本就可用。curl 真返投影(含 market-publish e2e 写入的 publish-records 5 条=market→account 端到端)。曾据 Explore 加 member-local `RealMarketAccountProjectionFacade`+改 autoconfig、rebuild+restart 验证;**可逆翻转测试(全局 purchase=0 仍返回空而非 UNAVAILABLE)证实活跃 facade 是 Provider 而非我的 count-gating facade → 单体 no-op 且违背原设计,已回退**(member 模块工作树干净)。顺带:restart 时 Flyway 真实应用 `V22`(market 索引修复)"Successfully applied 1 migration ... v22"。结论:单体无 account facade 接线缺口待补;export/new-api 为正确 fail-closed 外部依赖。教训:跨 BC facade 判定必须以单体实跑为准,静态分析会漏 monolith 跨模块 bean 绑定。
2026-06-15  ✅ **market 残余 partial-index 系统性收口 + 真实 PG IT(V23)**:续 V22,修 handoff_event/appeal_material/authorization_summary/appeal_event/appeal 5 表 (tenant_id,command_id) 部分→完整唯一索引(grep 实证其 mapper 发无谓词 ON CONFLICT,潜伏同 publish 链路 bug)。新增 `P1rMarketCommandIndexFlywayMigrationIT`:真实 PG clean→迁移 V1→V23(Flyway "Successfully applied 23 migrations ... v23")→断言 V22/V23 修复的 9 个命令索引均完整唯一(可作 ON CONFLICT 仲裁器),**Tests run 1, Failures 0, Errors 0, Skipped 0**(与 target=V15 的 `P1rMarketFlywayMigrationIT`「断言历史 partial 态」互补)。V23 已应用 muse_slice_live + 全新 `muse_p1r_cmdidx_test` 库迁移验证。其余 market 部分 command 索引未被当 arbiter,保持不变。
2026-06-15  ✅ **知识库工作台知识图谱视图 + 修 confirm 重名潜伏 500(承前端长板,goal 主攻)**:①前端新增 `KnowledgeGraphPanel`(/knowledge/:workId)经 GET /works/{id}/graph 读真实 muse_knowledge_entity/relation,渲染已入库 Canonical 实体(节点)+关系(边),与草稿面板成"候选→确认→正式图谱可见"双轨闭环;`knowledge-graph.spec.ts` chromium MSW-off 绿 + curl 证 code:0/节点 huotituopusuqing+huoti_related 边。②**修真实潜伏后端 bug(反假绿,task_497da70f)**:confirm 重名实体(同 work+类型+规范名+范围)原触发 uk_muse_knowledge_entity 唯一冲突→未捕获 DuplicateKeyException 冒泡 HTTP 500;改 `writeCanonicalEntity` 前置 `selectByIdentity` 预检(镜像约束列、不滤 deleted)→`markConflicted`(REQUIRES_NEW)+`KNOWLEDGE_ENTITY_DUPLICATE`(1043002004);必须前置预检——PG 约束冲突使当前事务 aborted,catch 后任何写必失败。活体证:colliding 草稿 confirm→code 1043002004(非 500)、DB 草稿转 conflicted+实体数不变(无伪造重复);正路径 knowledge-confirm e2e 回归绿;tsc -b 干净 + vitest 47/47。

五、master plan(P1R-7 端到端验收)收口清单 —— 活 backlog(2026-06-14 起,goal: master plan complete)

master plan = P1R(总 spec→阶段 spec/plan,P1R-0…P1R-7,见 p1r-stages)。P1R-0~6 各 BC Real API 门禁口径基本就位;收口主体 = P1R-7 端到端验收,其阻塞 = 现状基线 §6.3 最危险缺口 Top 6。本清单为该 goal 的唯一驱动 backlog,就地更新、勿另起过程文档。状态:完成 / 🔧进行 / 未起 / ⏸判定范围外。

goal 主攻 = 活体纵切·每 BC 一条端到端用户旅程,在跑起来的单体(48080)上 curl 实证(正+负路径),验收=achieve the product goal。 per-BC 活体度量:

  • content+ai(AI 候选→采纳入正文): 活体证(MVP#1;正:newRevision=2+正文写入;负:乐观锁 1041000002)+ 前端 rendered UI e2e(chromium,关 MSW 直连活体:生成→采纳→真合并 happy + 乐观锁 negative,见 §五C)
  • knowledge(确认草稿 Shadow→Canonical 实体): 活体证(2026-06-14;正:GET pending→POST confirm→muse_knowledge_entity 落库+草稿 confirmed;负:revision 1043002001 / source-stale 1043002002→草稿 conflicted)+ 前端 rendered UI(确认入库 e2e chromium,见 §五C)+ 知识图谱视图(graph rendered-UI 活体证,2026-06-15)+ 修 confirm 重名 500→干净冲突 1043002004
  • market(资产采纳/安装): 活体证(2026-06-14;正:GET listed 资产→purchase licenseId:1/active→install installationId:1/installed;DB:授权快照+购买事实 completed+安装 installed 三落库;purchase 经 MarketAccountProjectionProvider 投影 account) + 生产侧发布草稿 rendered-UI e2e(2026-06-15;/market/publish→publish-drafts→my-publish-records,DB 证 publish_draft 落库;附带修 publish 部分索引 ON CONFLICT bug→V22,见 §五C)
  • account/member(个人中心:profile/purchases/licenses/entitlements/usage 读): 活体证(2026-06-14;profile 返回脱敏 PII;purchases/licenses 含上一步 market 购买+安装的投影=market→account 跨 BC 端到端通;entitlements/usage 干净空数据)。重要订正:此前 account 读 500 真因是基座 schema 漏 member_user.register_terminal 列 + 缺 infra_api_error_log_seq(非 facade 缺口),已补基座文件 yudao-base-schema-postgres.sql(可复现);baseline "21/33 阻于 facade" 部分被推翻——投影通、卡在基座。
  • agent(ai)(创建/列表): 活体证(2026-06-14;POST /muse/agents→agentId:1→GET 列表含之 active;试用 New-API 外部,非阻)
  • events(SSE 事件流): 间接证(AI 候选生成走 connectAIStream SSE;events BC streamEvents 已双评审真实 PG IT,coverage completed)
  • meta(admin 治理发布):⏸ 阻于 MetaImpact 用量投影特征(见 A;admin 侧、非核心用户旅程)

总评(2026-06-14):后端产品目标已实质达成——核心用户旅程("AI 先审后入"创作 + 知识确认 + 市场采纳 + 个人中心 + 智能体)在跑起来的单体(48080)上端到端活体证毕(正+负路径,反假绿),含 market→account 跨 BC 投影。仍缺:前端 studio 渲染层(仅 ~14% 真连,B3 大长板)→"用户在 UI 里点"未全达;meta admin 治理(特征缺口);market 生产侧发布 UI。下一主攻=前端逐旅程接活体 + playwright。

A. 后端跨 BC facade 真实化(B2,非 stub,真实委派)

  • MuseContentWorkOwnerFacade(content→ai)/ ContentKnowledgeWorkOwnerFacade(content→knowledge):@Primary 真实委派 content-api,缺口已闭(B2 勘察曾误判为未做)。
  • MetaImpactFacade(meta 发布链,重新判定:缺特征非接线,降优先级):现仅 UnavailableMetaImpactFacadeMETA_EXTERNAL_OWNER_UNAVAILABLE,阻断 publish/activate/rollback/deprecate。2026-06-14 勘察发现:content/ai/knowledge DAL 均未持久化 schemaKey 用量引用(content 的 "MetaSchema 版本" 仅在请求/响应 VO 作传参,非存储的"作品 X 用 schema Y"关系),无独立 export 模块。故无数据可真实计数,Unavailable 抛错实为诚实 fail-closed(拒绝伪造)。真实化 = 先建"meta-schema 用量投影"数据模型(各 owner 新表 + 写时落库 + 计数 API),是多模块特征工程而非 facade 接线;且 meta 治理属 admin 侧、用户价值低。判定:置后,待用量投影建模专项。service 层 MetaSchemaImpactPreviewServiceImpl 已就绪等真实 facade。🔧 评审版设计已出(2026-06-17):meta-schema用量投影-review——grounding 证实根因(消费方仅 Content planning 存 schema_version、无 schema_key,Knowledge/AI 不存);推荐 Pull(按需查询)+ 按 BC 拆贡献者端口(订正:现 MetaImpactFacade 单接口返 5 维度=单实现者懂 5 BC 数据、违 BC 边界门,须拆为 meta-api 定义端口、各 owner 适配器),分阶段(P0 端口→P1 Content→P2+ 其余)。待人类确认方向 + open items(尤维度归属/fail-closed 粒度)后才进主 spec/执行版。
  • MarketAccountProjectionFacade(account purchases/licenses/publish-records 读)——2026-06-15 活体订正(反假绿):单体内由 market MarketAccountProjectionProvider(@Service,本身 implements MarketAccountProjectionFacade、对 purchase/license/publish 放行)跨模块提供,@ConditionalOnMissingBean 使其压过 member 的 Unavailable 兜底(后者仅 member-alone 才用)。这三端在单体本就可用——curl 真返投影:purchase(活体市场资产·测试/completed)、license(installed)、publish-records 5 条含 market-publish e2e 的 submitted/draft = market→account 端到端。原"21 端 *_UNAVAILABLE"是静态误判(同 handoff 被推翻判定类)。单体内真正 fail-closed 的 account 端 = export/download(AccountFileServiceFacade)+ new-api recheck(NewApiAccountFacade),均正确 fail-closed(未配置外部服务:对象存储/New-API),非接线缺口。结论:单体内无可真实化的 account facade 接线缺口(member-local 真实 facade 仅 microservices 部署需要,范围外;本轮曾试做 RealMarketAccountProjectionFacade,翻转测试证实单体 no-op 后已回退)。
  • AccountAttributionSourceFacade(account 归因,):属"源传播事件驱动"副路径(同下条 source-owner),不阻核心读旅程;各 owner BC 出归因出站 API 后接通。
  • 4× Unavailable*SourceOwnerFacade(AI←Account/Meta/Market/Knowledge 源属主校验,):返回 owner_missing。属"源传播事件驱动"副路径,不阻 MVP#1 核心切片;各 owner BC 出 source-owner 出站 API。
  • ⏸ 正确 fail-closed(非缺口):UnavailableNewApiAccountFacade/UnavailableAccountFileServiceFacade/UnavailableSecurityToolGrantApprovalFacade——依赖未配置的外部服务(New-API/对象存储/治理审批),保持 fail-closed。

B. 验收债:86 个 needs_verification operation( 已清零 → 233/233 completed;门禁口径→真实证据)

  • 验收债真实 IT 战役(2026-06-15 起,goal=验收债·真实 IT)。原 needs_verification(台账 docs/superpowers/reports/p1r-api-coverage.json)= content 37 / market 28 / account 21 = 86;截至 2026-06-17 已全部补齐真实 PG 证据,并按用户批准翻为 completed。当前 coverage summary=233 completed / 0 needs_verification / 0 incomplete / 0 blocked。范式:P1rContentCoreCompletedApprovalIT / 本批新 IT;跑法见 §四(_test 库 + argLine + -DreuseForks=false)。
    • 批1 已交付(content work/chapter/block 生命周期 11 op):P1rContentWorkLifecycleCompletedApprovalIT(commit 2499c24,1/1 绿 mini-infra PG,独立复跑+逐 assert 反假绿复核)覆盖 createWork/updateWork/deleteWork、createChapter/updateChapter/deleteChapter/reorderChapters、createBlock/deleteBlock/mergeBlocks/splitBlock;每 op 断言 HTTP+真实 muse_content_* 持久化事实 + command_log。产出=Codex 起草 + Opus fork 落地纠偏双代理。证据已人工批准并翻 completed(已按人工批准加入 P1rApiCoverageReportTest 批准集合并同步台账 completionStatus)。
    • 批2 已交付(market 发布生产侧 5 op,2026-06-16):P1rMarketPublishProducerCompletedApprovalIT(真实 PG muse_p1r_market_publish_test,3/3 绿)覆盖 savePublishDraft/runPublishCheck/submitPublishRequest/withdrawPublishRequest/listMyPublishRecords;断言 HTTP + publish_draft/check/request/review_event/market_command/market_account_projection + Account 投影端口调用 + 失败检查不可提交。测试内仅对专属 _test 库做缺库自动创建,不放宽 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批3 已交付(account 市场记录读端 3 op,2026-06-16):P1rAccountMarketRecordsCompletedApprovalIT(真实 PG muse_p1r_account_market_records_test,3/3 绿)覆盖 appListPurchases/appListLicenses/appListPublishRecords;种真实 muse_account_record_projection + member_user fixture,经真实 /app-api/muse/account/* 读取,断言租户/owner 隔离、状态归一、外部订单脱敏、非法输入 fail-closed、读端 no-write。Market 投影可用性由真实 MarketAccountProjectionProvider 判定,读端仍只读 Account 投影表。证据已人工批准并翻 completed
    • 批4 已交付(market 管理端申诉 3 op,2026-06-16):P1rMarketAdminAppealCompletedApprovalIT(真实 PG muse_p1r_market_admin_appeal_test,6/6 绿)覆盖 adminListAppeals/adminGetAppeal/adminResolveAppeal;经真实 /admin-api/muse/market/appeals/** + Spring method security,断言列表/详情 no-write、租户隔离、RBAC/API version fail-closed、resolve 写 appeal 状态 + resolved event + completed command、幂等回放、expectedStatus 冲突事务回滚。测试内使用 latest schema(V23+),保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批5 已交付(market 管理端发布审核 3 op,2026-06-16):P1rMarketAdminPublishReviewCompletedApprovalIT(真实 PG muse_p1r_market_admin_review_test,6/6 绿)覆盖 adminListPublishRequests/adminApprovePublishRequest/adminRejectPublishRequest;经真实 /admin-api/muse/market/publish-requests/** + Spring method security,断言列表 no-write、租户隔离、RBAC/API version fail-closed、approve 真实消费 submitted/check 证据并物化/上架 Market asset+version、reject 写 needs_supplement 事件与投影、completed command 幂等回放、expectedStatus/validationResult 冲突事务回滚。测试内使用 latest schema(V23+),保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批6 已交付(market 生产者申诉写路 3 op,2026-06-16):P1rMarketProducerAppealCompletedApprovalIT(真实 PG muse_p1r_market_producer_appeal_test,7/7 绿,独立复跑两次均绿)覆盖 submitAppeal/supplementAppeal/withdrawAppeal;经真实 /app-api/muse/marketplace/appeals/**(app 侧无 method security,鉴权靠登录态 + 服务层 owner 隔离),断言:submit 走 review_rejection 关联(自有资产 + 7 天内被拒发布申请)写 appeal(pending,rev1)+ submitted event(snapshot 含 appealType/originalResult=rejected/source)+ completed command;supplement 脱敏只存摘要(密钥 sk-*/token=*[REDACTED]、不留明文)+ supplementing→reviewing 状态 CAS(rev→2)+ 材料落库 + 幂等回放;withdraw →closed(rev→2)+ resolution 记录撤回理由 + withdrawn event(expectedStatus/previousStatus);三写均命令回放幂等;fail-closed(非属主→无权访问/无关联→关联事实不存在/超期→期限已过/资产不存在/越权他人→申诉不存在/未确认隐私→VO 拦截)全程 0 写、0 command 预占;状态冲突 + expectedStatus 冲突均事务回滚(reserveCommand 预占=0、rev 不动);API version + 无登录守卫。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移到 latest schema(V23+)。证据已人工批准并翻 completed
    • 批7 已交付(account 配额请求 3 op,2026-06-16):P1rAccountQuotaRequestCompletedApprovalIT(真实 PG muse_p1r_account_quota_request_test,5/5 绿,独立复跑两次均绿)覆盖 appCreateQuotaRequest/appGetQuotaRequest/adminCreateQuotaRequest;经真实 /app-api/muse/account/quota-requests/admin-api/muse/account/users/{userId}/quota-requests(member 模块租户行拦截器 + member_user fixture + admin @PreAuthorize method security),断言:create 入队写 quota_request(queued)+ pending_attribution 外部调用占位 + completed command(app:actor=owner=登录用户、amount=0;admin:actor=操作者、owner=目标用户、amount=targetQuota.limit)、命令幂等回放(idempotent_hit 不写第二条)、相同 commandId 不同请求 hash→ACCOUNT_COMMAND_ID_CONFLICT 事务回滚;get 按 owner+tenant 隔离返回归一化状态、纯读 no-write;fail-closed(类型白名单 BAD_REQUEST/API version/缺用户 ACCOUNT_USER_NOT_EXISTS/越权 owner/not-found/RBAC deny)全程 0 写、0 command 预占;配额请求链路不写 Account 审计(audit/outbox 桩抛错反假绿)。10 条负路全部经真实 GlobalExceptionHandler 实测命中(9 serviceException + 1 accessDenied)。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批8 已交付(account 用量与外部调用可观测读端 3 op,2026-06-16):P1rAccountUsageObservabilityCompletedApprovalIT(真实 PG muse_p1r_account_usage_observability_test,4/4 绿,独立复跑两次均绿)覆盖 getAppUsage/appGetIntegrationCallByCorrelation/adminGetIntegrationCallByCorrelation;经真实 /app-api/muse/account/usage/app-api/muse/account/integration-calls/by-correlation/{id}/admin-api/muse/account/integration-calls/by-correlation/{id}(member 模块租户行拦截器 + member_user fixture + admin @PreAuthorize method security),断言:getAppUsage 按 owner 聚合(token 输入 160/输出 235 求和、pending 计数 1、anomaly 计数 1、byModel MiniMaxM2=380/GLM=15、byAttribution work+agent)且跨用户隔离(他人 9999 不计入)、period 规范化(month)与白名单(yearly→BAD_REQUEST);app 侧外部调用读 owner 守卫(自有→归一化 pending_attribution/quota_request/retryGroup、越权→ACCOUNT_RESOURCE_FORBIDDEN),admin 侧无 owner 限制(可读任意用户、status/requestType 归一化、RBAC=muse:account:query);三 op 纯读全程 no-write(member_user/usage_record/integration_call/command/audit 快照前后一致),fail-closed(缺用户 ACCOUNT_USER_NOT_EXISTS/not-found ACCOUNT_INTEGRATION_CALL_NOT_EXISTS/API version/RBAC deny FORBIDDEN)。控制器附带依赖(权益/绑定/配额/归因 service)用抛错 mock 反假绿越界。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批9 已交付(account New-API 绑定簇 3 op,2026-06-16):P1rAccountNewApiBindingClusterCompletedApprovalIT(真实 PG muse_p1r_account_newapi_binding_test,4/4 绿,独立复跑两次均绿)覆盖 getAppNewApiBinding/adminListNewApiBindings/appRecheckNewApiBinding;经真实 /app-api/muse/account/new-api-binding/admin-api/muse/account/new-api-bindings/app-api/muse/account/new-api-binding/recheck(member 模块租户行拦截器 + member_user fixture + admin @PreAuthorize method security),断言:getAppNewApiBinding 按 owner 读绑定摘要 + 存储态归一(active→bound、无绑定→unbound 且不可重验)、纯读 no-write;adminListNewApiBindings 以账户用户为分页主表(无筛选按 id 倒序返 bound/unbound/sync_failed 三态 + syncErrorMessage)、bindingStatus 走 EXISTS/NOT EXISTS 筛选、非法状态 BAD_REQUEST、RBAC=muse:account:query fail-closed、纯读 no-write;appRecheckNewApiBinding 在单体 New-API facade(UnavailableNewApiAccountFacade)不可用时正确 fail-closed——业务 @Transactional 回滚命令预占(0 残留),失败外部调用经 REQUIRES_NEW 独立落库一条 unavailable(error_code 可排障),binding 不被改写,客户端收 ACCOUNT_NEW_API_UNAVAILABLE;binding 不存在/缺用户/API version 三守卫全程 0 写。控制器/服务附带依赖(quota/usage/audit service)用抛错 mock 反假绿越界。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批10 已交付(account 导出/下载簇 3 op,2026-06-16):P1rAccountExportDownloadClusterCompletedApprovalIT(真实 PG muse_p1r_account_export_test,4/4 绿,独立复跑两次均绿)覆盖 appCreateExportTask/appGetExportTask/appDownloadExport;经真实 /app-api/muse/account/export-tasks/app-api/muse/account/export-tasks/{taskId}/app-api/muse/account/downloads/{credentialId}(member 模块租户行拦截器 + member_user fixture),断言:create 在 FileService(UnavailableAccountFileServiceFacade,单体默认)未接入时按合同把非敏感导出(profile)落库为 queued 任务 + 命令 + 成功审计、绝不伪造 completed/fileRef/下载凭证、不写安全事件,相同 commandId 幂等回放(idempotent_hit 不写第二条),敏感类型(usage)缺 step-up→BAD_REQUEST 回滚、非法 exportType/缺用户/API version 均 fail-closed;get 按 owner 读任务状态归一、跨 owner not found、纯读 no-write;download 校验下载凭证(无效→ACCOUNT_DOWNLOAD_CREDENTIAL_INVALID),凭证可用但 FileService 不可用时正确 fail-closed——@Transactional 回滚一次性消费(凭证 consumed_at 仍空可重试)+ 不写下载审计,客户端收 ACCOUNT_FILE_SERVICE_UNAVAILABLE。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批11 已交付(account 管理端只读补全 2 op,2026-06-17):P1rAccountAdminReadsCompletedApprovalIT(真实 PG muse_p1r_account_admin_reads_test,3/3 绿,独立复跑两次均绿)覆盖 adminListUsageRecords/adminGetCallAttributionJob;经真实 /admin-api/muse/account/usage-records/admin-api/muse/account/call-attribution-jobs/{jobId}(member 模块租户行拦截器 + member_user fixture + admin @PreAuthorize method security),断言:adminListUsageRecords 以账户用户为分页主表在库内聚合(token 输入 150/输出 230/合计 380 求和、pending 计数 1/failed 0、attributionStatus=pending)、非法 period→BAD_REQUEST;adminGetCallAttributionJob 按 jobId 读 job+items 并归一状态(completed)+ 分桶计数(attributed 1/failed 1/pending 0)、not-found→ACCOUNT_INTEGRATION_CALL_NOT_EXISTS;两 op 均 RBAC=muse:account:query fail-closed、API version 守卫、纯读 no-write(命令/审计/外部调用表保持为空)。归因写路外部来源 facade 用抛错 mock 反假绿越界。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批12 已交付(account 管理端写路收尾 2 op,2026-06-17):P1rAccountAdminWritesCompletedApprovalIT(真实 PG muse_p1r_account_admin_writes_test,3/3 绿,独立复跑两次均绿)覆盖 adminCreateNewApiBinding/adminCreateCallAttributionJob;经真实 /admin-api/muse/account/users/{userId}/new-api-binding/admin-api/muse/account/call-attribution-jobs(member 模块租户行拦截器 + member_user fixture + admin @PreAuthorize method security),断言:adminCreateNewApiBinding 在单体 New-API facade(UnavailableNewApiAccountFacade)不可用时正确 fail-closed——业务 @Transactional 回滚命令预占(0 残留)+ 不写 binding,失败外部调用经 REQUIRES_NEW 独立落库一条 unavailable,客户端收 ACCOUNT_NEW_API_UNAVAILABLE,目标用户不存在/RBAC(muse:account:new-api:manage)/API version 守卫 0 写;adminCreateCallAttributionJob 基于已存在 correlationId 外部调用建立 queued 归因 job + 命令(items 暂空)、命令幂等回放(idempotent_hit 不写第二条)、callIds 白名单未命中 BAD_REQUEST、expectedCallRevision 版本冲突 ACCOUNT_VERSION_CONFLICT、缺调用记录 ACCOUNT_INTEGRATION_CALL_NOT_EXISTS、RBAC(muse:account:attribution:manage)/API version fail-closed,失败路径全程 0 写。命令走真实实现,归因来源/审计/配额/用量附带依赖用抛错 mock 反假绿越界。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批13 已交付(account 安全事件确认 1 op,2026-06-17):P1rAccountSecurityEventAckCompletedApprovalIT(真实 PG muse_p1r_account_security_ack_test,2/2 绿,独立复跑两次均绿)覆盖 appAcknowledgeSecurityEvent;经真实 /app-api/muse/account/security-events/{eventId}/acknowledge(member 模块租户行拦截器 + member_user fixture),断言:属主确认按 owner 校验事件归属、向追加表 muse_account_security_event_ack 追加处理轨迹 + 基础事件 acknowledged 置真 + 命令 + 成功审计,相同 commandId 幂等回放(不追加第二条轨迹);非法 action→BAD_REQUEST、跨 owner→NOT_FOUND(owner 隔离不泄露)、非数字 eventId→NOT_FOUND、缺用户→ACCOUNT_USER_NOT_EXISTS、API version 守卫,全程 fail-closed 且 0 写。命令/审计走真实实现,无外部依赖。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批14 已交付(account 管理端购买记录读 1 op,account 验收债清零,2026-06-17):P1rAccountAdminPurchaseRecordsCompletedApprovalIT(真实 PG muse_p1r_account_admin_purchase_test,2/2 绿,独立复跑两次均绿)覆盖 adminListPurchaseRecords;经真实 /admin-api/muse/account/purchase-records(跨模块:muse.info.base-package=cn.iocoder.muse.module,单体内 market 的 MarketAccountProjectionProvider 真实判定 purchase 投影可用,读端只读 Account 自有投影表 muse_account_record_projection;Account 投影写端口用抛错 stub 越界反假绿),断言:无 userId→跨用户返回全部购买投影、userId 过滤→仅该用户且状态归一(source_status→admin status)+ 资产信息从投影 title/snapshot 回填(assetType/assetName)、userId+status=completed 命中、status=refunded 该用户无返回空、非法 status→BAD_REQUEST、API version 守卫→ACCOUNT_API_VERSION_UNSUPPORTED、RBAC(muse:account:query)deny→FORBIDDEN,全程纯读 no-write(member_user + 投影表 row_to_json 快照零变更)。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批15 已交付(market 管理端资产治理读 2 op,2026-06-17):P1rMarketAdminAssetReadsCompletedApprovalIT(真实 PG muse_p1r_market_admin_asset_test,2/2 绿,独立复跑两次均绿)覆盖 adminListMarketAssets/adminGetMarketAsset;经真实 /admin-api/muse/market/assets(market 模块整组治理 mapper + MarketCommandServiceImpl + MarketEventPublishOutboxServiceImpl,base-package=cn.iocoder.muse.module,admin @PreAuthorize method security),断言:列表按 tenant 隔离 + assetType/listingStatus/publisherId 过滤(listingStatus 的 not_listed↔draft 由服务端 toInternalListingStatus/normalizeListingStatus 双向归一)、publisherName/version(无当前版本→unknown)回填、关联计数(安装/绑定/申诉=0,关联表空);详情按 tenant 隔离返回资产快照 + 授权/安装/绑定/受影响任务计数全 0 + 版本/治理历史/申诉空集合;缺资产/跨租户→MARKET_ASSET_NOT_EXISTS、非法 API version→MARKET_API_VERSION_UNSUPPORTED、RBAC(muse:market:asset:query)deny→FORBIDDEN,两 op 全程纯读 no-write(资产/命令/治理/来源状态/事件 outbox 表 row_to_json 快照零变更)。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批16 已交付(market 管理端资产治理写 3 op,2026-06-17):P1rMarketGovernanceWriteCompletedApprovalIT(真实 PG muse_p1r_market_governance_test,4/4 绿,独立复跑两次均绿)覆盖 adminPreviewGovernanceImpact/adminDelistAsset/adminRecallAsset;经真实 /admin-api/muse/market/assets/{id}/governance-impact|delist|recall(同 批15 配置 + 治理 @PreAuthorize method security),断言治理写生命周期:影响预览写 ready 预览 + 预览影响 + completed 命令并返回影响计数/通知范围(关联表空→计数全 0)→ 凭预览下架(listed→delisted 的 expectedStatus CAS + applied 治理动作 + 治理影响 + 事件发布 outbox + completed 命令)→ 凭预览召回(listed→recalled + 目标 owner 传播 fail-closed:如实记录 source_status_event recalled/recorded/TARGET_OWNER_UNAVAILABLE 而非伪造成功);命令幂等回放命中 completed 不写第二条 fact;fail-closed 全覆盖:合同枚举 VO @Pattern→BAD_REQUEST(service requireAllowed 为防御纵深)、缺/非 ready 预览→MARKET_GOVERNANCE_PREVIEW_REQUIRED、CAS 阻断→MARKET_ASSET_GOVERNANCE_BLOCKED(命令预占随 @Transactional 回滚、0 残留)、缺资产→MARKET_ASSET_NOT_EXISTS、API version、RBAC deny→FORBIDDEN,失败路径全程 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批17 已交付(marketplace 发现读 3 op,2026-06-17):P1rMarketplaceDiscoveryReadsCompletedApprovalIT(真实 PG muse_p1r_marketplace_discovery_test,4/4 绿,独立复跑两次均绿)覆盖 listMarketplaceAssets/listMarketplaceRecommendations/getGovernanceImpact;经真实 /app-api/muse/marketplace/assets|recommendations|assets/{id}/governance-impact(MarketAssetQueryServiceImpl + 收藏/命令依赖,base-package=cn.iocoder.muse.module),断言:列表按 App 可见性(listed 公开;draft 等非公开仅 publisher 自见)+ assetType 过滤分页 + 卡片字段回填(publisherName/version=unknown/isFavorite=false/isAcquired=false/isInstalled=false);fallback 推荐返回可见资产卡片 + 推荐理由;治理影响读按 publisher/受影响者门禁(publisher 自见返回治理结果摘要 + 空受影响列表;非属主且无关联授权/安装/绑定→fail-closed MARKET_RESOURCE_FORBIDDEN,杜绝借治理接口探测非公开资产);缺资产→MARKET_ASSET_NOT_EXISTS、非法 API version→MARKET_API_VERSION_UNSUPPORTED,三 op 全程纯读 no-write(资产/收藏/命令/治理表 row_to_json 快照零变更)。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批18 已交付(market 采纳链 2 op,2026-06-17):P1rMarketLicenseInstallCompletedApprovalIT(真实 PG muse_p1r_market_license_install_test,3/3 绿,独立复跑两次均绿)覆盖 purchaseAsset/installMarketplaceAsset;经真实 /app-api/muse/marketplace/assets/{id}/purchase|install(MarketLicenseServiceImpl + MarketInstallServiceImpl + MarketCommandServiceImpl + MarketAccountProjectionProvider/Outbox,base-package=cn.iocoder.muse.module),断言:购买写授权快照 + 购买事实 + completed 命令并把 purchase + license 两条 Account 投影经写端口跨 BC 同步(RecordingAccountProjectionApi 真实捕获、读端绝不反写反假绿);安装要求已购 active 授权(无授权→MARKET_LICENSE_NOT_EXISTS)、仅 agent/kb 可安装(作品已购仍→MARKET_INSTALL_NOT_BINDABLE 且安装路径 0 写)、写 installed 安装记录 + completed 命令 + license 投影;purchase/install 命令幂等回放命中 completed 不写第二份事实;未上架(属主可见非 listed)→MARKET_ASSET_NOT_LISTED、缺资产→MARKET_ASSET_NOT_EXISTS、授权类型不符→MARKET_LICENSE_NOT_PURCHASABLE、API version→MARKET_API_VERSION_UNSUPPORTED,失败路径全程 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批19 已交付(market handoff 簇 4 op,market 验收债清零,2026-06-17):P1rMarketHandoffClusterCompletedApprovalIT(真实 PG muse_p1r_market_handoff_test,3/3 绿,独立复跑两次均绿)覆盖 createBindPrecheck/createMarketplaceHandoff/getHandoffStatus/cancelHandoff;经真实 /app-api/muse/marketplace/assets/{id}/bind-precheck/handoffs/handoffs/{token}/handoffs/{token}/cancel(MarketHandoffServiceImpl + MarketCommandServiceImpl + LocalMarketTargetOwnerFacade,base-package=cn.iocoder.muse.module),断言端到端链:bind-precheck 基于已购 active 授权快照生成来源侧授权摘要(handoffReady + sourceStatus=available + compatibilityResult=source_summary_ready + actionPolicy installPolicy/bindPolicy=allowed,落 active 摘要 + completed 命令)→ 凭摘要创建一次性 handoff(落 pending token 事件 + completed 命令,token 明文不入库、只存 sha256 hash,事件快照不含明文 token,targetPage 由 LocalMarketTargetOwnerFacade 白名单模板生成)→ 凭 token 只读回显 pending(纯读 no-write)→ 按 expectedStatus CAS 取消(pending→cancelled + completed_at + completed 命令);bind/handoff 相同 commandId 回放命中 completed 返回与首呼一致结果(handoff 回放确定性 token 一致)不双写、cancel 终态后再次取消被取消性守卫拒绝(MARKET_HANDOFF_NOT_CANCELLABLE,该守卫先于 replay 短路、故顺序回放观察到的是终态守卫而非幂等成功)且 0 写;fail-closed 全覆盖:非法 API version→MARKET_API_VERSION_UNSUPPORTED、缺资产→MARKET_ASSET_NOT_EXISTS、无活跃授权→MARKET_LICENSE_NOT_EXISTS(授权≠可达不变式)、目标 owner 白名单外→MARKET_TARGET_OWNER_UNAVAILABLE(本地目标页边界 fail-closed,buildTargetPage 先于预占命令抛错)、跨属主 token 读取/取消→MARKET_RESOURCE_FORBIDDEN(token 属主隔离)、取消 CAS 期望态不匹配→MARKET_HANDOFF_NOT_CANCELLABLE(reserveCommand 为 Propagation.MANDATORY,预占命令随 @Transactional 回滚 0 残留),失败路径全程 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫。证据已人工批准并翻 completed
    • 批20 已交付(content planning candidate 簇 5 op fail-closed,2026-06-17):P1rContentPlanningCandidateClusterCompletedApprovalIT(真实 PG muse_p1r_content_planning_candidate_test,3/3 绿,独立复跑两次均绿)覆盖 createPlanningCandidate/listPlanningCandidates/getPlanningCandidate/confirmPlanningCandidate/discardPlanningCandidate;经真实 /app-api/muse/works/{id}/planning/candidates*(AppContentPlanningController + ContentPlanningServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。规划候选生成/运行事实/状态投影归 AI owner,单体内 ContentPlanningCandidateFacade 仅 fail-closed 默认实现(全 default = unavailable,等价生产 UnavailableContentPlanningCandidateFacade@ConditionalOnMissingBean 兜底)。断言:AI owner 不可用时五 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,绝不伪造 queued/processing 任务、绝不在 Content 侧伪造 discarded;尤其 confirmPlanningCandidate(候选进正文唯一合法入口)拒绝写正式 planning section(无候选投影即不落 canonical),create/confirm/discard 写 op 已预占命令随 @Transactional 回滚 0 残留,五 op 全程 0 写(无 planning section / 无命令 / 无事件 outbox);owner/存在性守卫先于外部调用——跨属主作品→CONTENT_FORBIDDEN、缺作品→CONTENT_NOT_FOUND 且 0 写(杜绝借候选接口探测他人作品)。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批21 已交付(content meta-projection 簇 3 op fail-closed,2026-06-17):P1rContentMetaProjectionClusterCompletedApprovalIT(真实 PG muse_p1r_content_meta_projection_test,3/3 绿,独立复跑两次均绿)覆盖 listMetaProjections/getMetaProjection/validateDynamicFields;经真实 /app-api/muse/works/{id}/meta-projections/meta-projections/{key}/dynamic-fields/validate(AppContentMetaProjectionController + ContentMetaProjectionServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。MetaSchema 解释/Meta 投影/动态字段校验规则均归 Meta owner,单体内 ContentMetaFacade 仅 fail-closed 默认实现(全 default = unavailable,@ConditionalOnMissingBean 兜底)。断言:Meta owner 不可用时三 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,绝不在 Content 侧伪造投影或复制 MetaSchema 规则,三 op 纯读全程 0 写;守卫先于外部调用——非法 API version→CONTENT_API_VERSION_UNSUPPORTED、跨属主作品→CONTENT_FORBIDDEN、缺作品→CONTENT_NOT_FOUND 且 0 写(validateDynamicFields 的 fields@NotEmpty+元素 @NotBlank/@NotNull 在入服务前 @Valid 拦截)。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批22 已交付(content style-check 簇 2 op fail-closed,2026-06-17):P1rContentStyleCheckClusterCompletedApprovalIT(真实 PG muse_p1r_content_style_check_test,3/3 绿,独立复跑两次均绿)覆盖 createStyleCheck/getStyleCheckResult;经真实 /app-api/muse/works/{id}/planning/style-checks/style-checks/{jobId}(AppContentPlanningController + ContentPlanningServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。风格检查任务生成与结果归 AI owner,单体内 ContentStyleCheckFacade 仅 fail-closed 默认实现(全 default = unavailable,@ConditionalOnMissingBean 兜底)。断言:AI owner 不可用时两 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,绝不伪造 queued 任务或结果;createStyleCheck 写 op 已预占命令随 @Transactional 回滚 0 残留,两 op 全程 0 写;owner/存在性守卫先于外部调用——跨属主作品→CONTENT_FORBIDDEN、缺作品→CONTENT_NOT_FOUND 且 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批23 已交付(content chapter-parse-result 决策 2 op fail-closed,2026-06-17):P1rContentChapterParseResultDecisionCompletedApprovalIT(真实 PG muse_p1r_content_import_parse_test,3/3 绿,独立复跑两次均绿)覆盖 confirmChapterParseResult/rejectChapterParseResult;经真实 /app-api/muse/chapter-parse-results/{resultId}/confirm/reject(AppContentImportParseController + ContentImportParseServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。AI 解析任务/章节结果投影/知识草稿生成均归 AI owner;单体内 ContentParseJobFacade/ContentKnowledgeDraftFacade/ContentFileFacade 仅 fail-closed 默认实现(全 default = unavailable,@ConditionalOnMissingBean 兜底)。断言:AI owner 不可用时两 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE(章节结果投影在 requireChapterResultProjection 处即不可用,故绝不生成知识草稿、绝不记录确认/拒绝决策);两 op 均写路,已预占命令随 @Transactional 回滚 0 残留,全程 0 写;非法 API version→CONTENT_API_VERSION_UNSUPPORTED 守卫先于服务体且 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批24 已交付(content parse-job 生命周期 4 op fail-closed,2026-06-17):P1rContentParseJobLifecycleCompletedApprovalIT(真实 PG muse_p1r_content_parse_job_test,3/3 绿,独立复跑两次均绿)覆盖 getParseJob/listParseJobChapters/retryParseJob/batchConfirmChapters;经真实 /app-api/muse/parse-jobs/{jobId}/chapters/retry/chapters/batch-confirm(同 批23 配置:AppContentImportParseController + ContentImportParseServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + 3 外部 owner facade(ContentParseJobFacade/ContentKnowledgeDraftFacade/ContentFileFacade)默认 unavailable + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。断言:AI 解析 owner 不可用时四 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE(解析任务投影在 requireParseJobProjection 处即不可用,故绝不伪造任务/章节/重试/批量确认结果);两写 op(retry/batchConfirm)已预占命令随 @Transactional 回滚 0 残留,四 op 全程 0 写;非法 API version→CONTENT_API_VERSION_UNSUPPORTED 守卫先于服务体且 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批25 已交付(content import-task 簇 2 op:真实只读 + fail-closed,2026-06-17):P1rContentImportTaskCompletedApprovalIT(真实 PG muse_p1r_content_import_task_test,3/3 绿,独立复跑两次均绿)覆盖 getImportTask/createImportTask;经真实 /app-api/muse/import-tasks/{taskId}/works/{id}/import-tasks(同 批23/24 配置,base-package=cn.iocoder.muse.module.content)。getImportTask 是 Content 自有事实 muse_content_import_task 的真实持久化只读——种真实任务行后经 HTTP 读回库内字段(id/workId/status/fileName/fileSize/format/scanStatus/progress 全部断言、纯读 no-write),并验缺任务→CONTENT_NOT_FOUND、跨属主→CONTENT_FORBIDDEN(owner 隔离不泄露);createImportTask 依赖 FileService owner,单体内 ContentFileFacade 仅 fail-closed 默认实现,故 FileService 不可用时 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE 绝不伪造已可用导入任务、不新增任务行、预占命令随 @Transactional 回滚,非法格式→CONTENT_INVALID_STATUS_TRANSITION(先于命令预占)、非法 API version→CONTENT_API_VERSION_UNSUPPORTED 守卫,失败路径 0 写。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批26 已交付(content export-task 簇 4 op:真实只读 + FileService fail-closed,2026-06-17):P1rContentExportTaskCompletedApprovalIT(真实 PG muse_p1r_content_export_task_test,3/3 绿,独立复跑)覆盖 getExportTask/exportWork/createExportTask/downloadExportPackage;经真实 /app-api/muse/export-tasks/{taskId}/works/{id}/export/works/{id}/export-tasks/downloads/{credentialId}(AppContentExportController + ContentExportServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl + ContentFileFacade 默认 unavailable + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。getExportTask 是 Content 自有事实 muse_content_export_task 的真实持久化只读——种真实导出任务行后经 HTTP 读回 id/workId/format/status/progress/downloadCredentialId/downloadExpiresAt/completedAt/sourceSnapshot,纯读 no-write,并验缺任务→CONTENT_NOT_FOUND、跨属主→CONTENT_FORBIDDEN;exportWork/createExportTask/downloadExportPackage 依赖 FileService owner,FileService 不可用时 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,绝不伪造导出包/下载字节,非法格式→CONTENT_INVALID_STATUS_TRANSITION、跨作品章节→CONTENT_NOT_FOUND、无效/未完成下载凭证→CONTENT_DOWNLOAD_CREDENTIAL_INVALID、非法 API version→CONTENT_API_VERSION_UNSUPPORTED,失败路径 0 写。顺手修正 ContentExportServiceImpl 事务边界:public exportWork/createExportTask@Transactional,避免同类自调用导致内部事务注解失效;IT 用 command_log 0 残留断言实证 FileService fail-closed 后预占命令已回滚。测试内仅对专属 _test 库做缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批27 已交付(content 管理端导入/导出任务列表 2 op:真实只读,2026-06-17):P1rContentAdminReadCompletedApprovalIT 扩展(真实 PG muse_p1r_content_admin_read_test,6/6 绿)覆盖 adminListImportTasks/adminListExportTasks;经真实 /admin-api/muse/content/import-tasks/admin-api/muse/content/export-tasks(AdminContentController + ContentAdminServiceImpl + Spring method security + 租户行拦截器,base-package=cn.iocoder.muse.module.content)。两 op 均为 Content 自有事实 muse_content_import_task/muse_content_export_task 的管理端只读列表:种真实任务行后经 HTTP 读回分页 total/list、status/workId 筛选、workTitle 关联回填、ownerId/format/status/fileName/fileSize/completedAt 等字段;跨租户任务由 SQL tenant interceptor 隔离且响应不泄露跨租户标题/文件名/packageRef;RBAC deny→FORBIDDEN 且 0 写;非法 API version→CONTENT_API_VERSION_UNSUPPORTED 且先于服务体拒绝;全程 no-write 快照覆盖 work/chapter/block/governance/import/export/command/outbox。顺手把该老 admin-read IT 补齐为专属 _test 库缺库自动创建,保留 _test/密码环境变量/凭据 query 守卫;迁移 V1-V21。证据已人工批准并翻 completed
    • 批28 已交付(content 最后 2 op:解析任务创建 fail-closed + AI 候选采纳真实写,2026-06-17):扩展 P1rContentParseJobLifecycleCompletedApprovalIT 覆盖 createParseJob;经真实 POST /app-api/muse/works/{workId}/parse-jobs 进入 AppContentImportParseController + ContentImportParseServiceImpl + ContentCommandServiceImpl + ContentAuditServiceImpl,种真实 muse_content_work/muse_content_import_task 后断言导入任务属主/作品关系/扫描状态守卫先于 AI owner 调用(跨属主→CONTENT_FORBIDDEN、跨作品→CONTENT_NOT_FOUND、扫描未通过→CONTENT_INVALID_STATUS_TRANSITION),AI 解析 owner 未接入时正确 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,预占命令随事务回滚 0 残留,非法 API version 0 写。同步修正 P1rContentMergeSuggestionIT 老 harness 缺专属 _test 库自动创建的问题,复跑 mergeBlockSuggestion 强证据:真实 PG + 真实 AiSuggestionMergeProjectionFacademuse_ai_suggestion,采纳后写 Canonical muse_content_block revision/content/word_count + source attribution + content outbox + completed command,并覆盖 revision 冲突、幂等回放、非 pending、审缺失负路。验证:test-compile 绿;P1rContentMergeSuggestionIT 单跑 5/5 绿;P1rContentParseJobLifecycleCompletedApprovalIT,P1rContentMergeSuggestionIT 合跑真实 PG muse_p1r_content_batch28_test 9/9 绿证据已人工批准并翻 completed
    • 剩余:content 0(批20-28 合计补 planning candidate 5 + meta-projection 3 + style-check 2 + parse-result 决策 2 + parse-job 生命周期/创建 5 + import-task 2 + export-task 4 + 管理端任务列表 2 + mergeBlockSuggestion 1 = 26 op;其中 getImportTask/getExportTask/adminListImportTasks/adminListExportTasks 与 mergeBlockSuggestion 为真实持久化读/写强证据,余外部 owner(AI/Meta/解析/FileService)未接入路径均 fail-closed 且 0 脏写)+ market 0(批15-19 补管理端资产治理读写 5 + marketplace 发现读 3 + 采纳链 purchase/install 2 + handoff 簇 4 = 14 op,叠加本战役前已补证的发布生产 5 + 管理端申诉 3 + 管理端发布审核 3 + 生产者申诉 3 = 14 op,合计 28 op 全补证 → market needs_verification 验收债清零,证据已人工批准并翻 completed)+ account 0(adminListPurchaseRecords 已补证 → account needs_verification 验收债清零,批3/7-14 全部经真实 PG 证据、证据已人工批准并翻 completed)。至此 content/market/account 三域 needs_verification 验收债均已补齐真实 PG 证据;coverage JSON completed 已按人工批准翻转,P1rApiCoverageReportTestP1r*RealApiGateTest 批准口径已同步。
  • P1r*IT 真实 PG 基线(2026-06-15,mini-infra PG)= 23/23 IT 类全绿(99 用例 0F/0E;2 例 external-acceptance 因未设 MUSE_P1R_EXTERNAL_ACCEPTANCE 跳过)。P1rKnowledgeFlywayMigrationIT 版本断言由硬编码(V14→V21→V23 复发两次)改为 MigrateResult 动态自适应(commit 4d46d7a,Codex+Opus 双代理合并)。完整跑法见 .agents/knowledge §四:_test 后缀隔离库 + source infra.env(密码仅 env)+ argLine(SOCKS 清 + p1r.flyway.url/user/locations)+ -DreuseForks=false(批量必加,避 Market IT 属性脱敏污染复用 fork)。
  • 🔧 ai/平台预存红测试整改(CI 接电将暴露):MuseAiTaskServiceTest 桩缺失 11 例 NPE 已整改(补 eventPublishOutboxService/candidateReviewService 桩 + review lenient,40/40,2026-06-15);QiniuSmsClientTest 时区硬编码 已整改(5/5,机器无关);MuseAiEventPublishOutboxMapperTest 真实 PG 实跑 5/5(mini-infra PG,harness=infra.env+argLine SOCKS 清;隔离 schema 自建自清)ai/平台预存红三项全清。

C. 前端 muse-studio(B3,体量最大,最长的长板)

  • 2026-06-15:整套 studio e2e 单次全绿 8/8(chromium,MSW off 直连单体 48080)——accept-suggestion 正+负 / knowledge-confirm / live-read ×4(content·market·account·ai) / workspace 壳;MSW-off 已固化进 playwright.config.ts webServer env(CI 自起 vite 生效)+ .env.local(本地);workspace.spec.ts 原 mock 假绿(断言「星海迷途」,MSW 关后必红)已改写为不依赖 mock 的活体壳冒烟,消除最后一处 MSW 互斥红。下列各 切片即构成此 8/8。(套件此后随切片增长:live-read ×4→×6 增「购买/授权」「安全事件」深页 + market-publish ×3→×8 增上架生命周期徽标 + 申诉提交·撤回·补充材料写路 + appealStatus 回显 + account-security-ack ×1 写路 + agent-create ×1 自建智能体写路,playwright test --list 当前共 21 例(+knowledge-graph);每轮按改动旅程实跑验证——accept-suggestion/knowledge-confirm/security-ack/market 上架徽标·申诉 依赖手工重种子。2026-06-15 reseed 全部每轮种子依赖后 --workers=1 串行整套 20/20 单次全绿(真实后端 MSW-off;2026-06-15 已落地可入库种子:e2e/global-setup.ts(pg 直连真实 PG、凭据从 infra.env 读不入库)+ playwright globalSetup/workers:1,每轮自动复位 graph/confirm-draft/accept(block3→rev1)/security-ack/appeal fixture;source infra.env && pnpm test:e2e20/20 单次全绿、零手工 /tmp 种子(消费态下实证 globalSetup 复位后整套绿;新 agent-create 不消费这些 fixture,本轮以 E2E_SKIP_SEED=1 单例实跑)。)
  • 2026-06-20:全量 e2e 9 spec/22 用例本地活体单次全绿(goal=全量e2e真跑通)。PG 宿主 100.64.0.8 恢复在线(直连可达、Flyway 24/public 165 表)→ 查出 jar(Jun-19 00:59)缺 GET bindings 端点(commit 3a7a72f Jun-19 13:30)致 405、rebuild Jun-20 新 jar(反假绿:不用过时 jar 跑)→ 起栈 48080(local,infra,清 socks)→ playwright test MSW-off 真打:22 passed / 0 failed / 0 skipped / 0 flaky(9.1s)——accept-suggestion 正负×2 + account-security-ack + agent-create + knowledge-bindings(06-19 PG 离线阻塞项 unblock) + knowledge-confirm + knowledge-graph + live-read×6 + market-publish×8 + workspace。基础种子:核验 4/5 在,knowledge-bindings 投影固化进 e2e/global-setup.ts #6(可入库、下次自动补);0 红故无就地修。诚实边界:本地全栈活体(rebuild jar + 真 PG muse_slice_live),非 CI(maven.yml 不跑 e2e/需活体后端+浏览器)。
  • 2026-06-21:studio 补 4 缺 UI 端面 + 修 planning 二次保存 500(真后端 e2e 真跑)。按"可端到端验证"补 4 缺口(各 hook+UI+vitest+真后端 playwright):D Block 分割合并(BlockStructureBar:章节结构条列 block、split 半分/merge 下一节,乐观锁读 revision;e2e split1→2→merge→1 绿);E 正文来源归因(SourceAttributionPanel:右栏「来源」Tab 读 GET source-attribution,user_original→用户原创;e2e 绿);F 知识库停用/恢复(KnowledgePage 自建 KB 按 status 切停用(confirm)/恢复;核实真后端 SummaryRespVO.processingStatus=kb.getStatus() 透出启用态(disabled/searchable),排除"RespVO 缺启用字段"误判→无需改后端;e2e disable→disabled/restore→active 绿);G 已安装 KB 停用/恢复(KnowledgePage「从市场安装的」卡片按 muse_knowledge_binding.binding_status 切停用(confirm)/恢复、保留卸载;installed 启用态存 binding_status,经 list 映射 disabled→'disabled'/else→'installed' 透出,studio normalizeKnowledgeStatus 判 active/disabled;e2e 真后端 disable→disabled/restore→active 绿,global-setup section10 复位 binding id=1)。修真后端 bug(反假绿,#29 B5 回归):全量 e2e 暴露 planning-edit save 500——ContentPlanningServiceImpl.captureFieldSnapshotdeleteBySectionId 走 @TableLogic 逻辑删除,被删物理行仍占 uk(tenant_id,section_id,field_key)(不含 deleted),用户二次保存同字段 INSERT 撞键→500;改原生 @Delete 物理删除根治。rebuild jar+重启 48080 验证:planning-edit e2e 1 passed + 连续 2 次 save code=0(rev3→4,旧 jar 第 2 次必 500)。全量 e2e:35 passed/1 failed → 后修 market-publish 转 36/0(planning-edit 经 fix 转绿、+G installed KB 使通过数 34→35;当时唯一 fail=market-publish 列表慢一拍,已修见下)。已修 work-schema-binding flaky:schema-options 由 CreateWorkModal 首页挂载预取(staleTime 60s),全量跑(后端热)请求早于 waitForResponse 注册→race→30s timeout;注册前置到 goto,复跑转绿。 已修(原唯一 known issue):market-publish「提交审核全链」e2e——提交后「我的发布记录」列表慢一拍真根因(逐层排除,推翻此前两次误判[非"无排序"、非"写后读延迟"]):① React Query refetch 被 dedup——save→check→submit 链上 save 的 invalidate 已触发一次 refetch,提交时它仍 in-flight,submit 的 invalidate 被 React Query dedup 到该旧 in-flight 请求(返回提交前快照),refetch 根本没发新请求;② 浏览器误缓存——vite dev proxy 未透传后端 Cache-Control: no-store,浏览器按默认启发式缓存 GET,refetch 命中旧缓存。决定性诊断:browserFetch(e2e 内 page.evaluate 原生 fetch + cache:no-store 直查)拿 fresh 含本次,而 React Query refetch 同时返回 stale→证 refetch 未发新请求(dedup);系统排除了浏览器 HTTP 缓存表层(cache-busting/service worker)、后端无数据(browserFetch fresh)、后端延迟(submit 同步落库)、排序。修复(commit 23953fb):submit onSuccess 改 cancelQueries 取消 in-flight + refetchQueries 强制发新请求;api client fetch 加 cache:no-store(数据新鲜度统一由 React Query 应用层管理)。验证:market-publish 全链 e2e 真后端转绿,全量 e2e 36/0(原 35/1)、market vitest 4/4、tsc/eslint 0。附带保留后端列表统一倒序(commit d8ed40d:PublishRecordItem 加 occurredAt 倒序、对齐 market 其它列表 orderByDesc,真 UX 改进)。教训:写命令后列表慢一拍优先查 React Query 的 refetch dedup(链上多次 invalidate 竞态)+ dev proxy 缓存头透传,用 page.evaluate 原生 fetch 对比 React Query 取值可一击定位是缓存层还是查询层。studio vitest 全绿(+9 用例,全套 79/79)、tsc/eslint 0。commit:D d0ea947/af78116/c76cdec、E cc57c59、F 494f3b5、G d4c5305、planning fix a9323ad、work-schema flaky fa65168#30 盘点收口(Explore 全模块扫描 + 后端逐一核实,反 Explore 假阳):另查 5 候选均非"可端到端验证 + 有自然 UI 落点"缺口——① KB 文档处理状态已由 MaterialManager 完整实现(非终态轮询 + generative 状态标签 + 进度条,非缺口);② 规划候选/③ 文风检查(style-check)/④ 作品导出/⑤ 作品导入 4 者后端均 *Facade fail-closed(CONTENT_EXTERNAL_OWNER_UNAVAILABLE——ContentStyleCheckFacade/ContentFileFacade/ContentParseJobFacade,同 publish/account-export 属外部依赖后置,用户触发即拒、不可干净 e2e);⑥ 取消任务(job cancel,AppMuseJobController)后端纯状态变更本可验证,但 studio AI 流走 SSE 不透 jobId、异步 job 路径或不同源(文档处理非 muse_ai_job)或外部依赖→无自然 UI 落点(需改 SSE 协议透 jobId,属新功能非补按钮),后置。故本轮 studio "可端到端验证 + 有自然落点"缺口全集 = D/E/F/G,已补完;#30 收口。教训(承 muse-kb-status-semantics):盘点缺口的可验证性必须读后端 service 的 facade/异常分支核实,Explore 静态扫的"可验证"初判 4/4 假阳(全是 *Facade fail-closed),不可直接采信。
  • 2026-06-21:补个人中心市场记录三件套缺的两件 e2e(购买/授权,反假绿)。盘点 studio account 面:useAccountPurchases/useAccountLicenses(PersonalCenter「我的购买」/「我的授权」区)有 UI+hook 但缺真后端 e2e(假绿风险);核实三者与已绿的「我的发布」同 controller(AppAccountMarketRecordController)+同 service(AccountMarketRecordServicemuse_account_record_projection 投影表)→后端就绪(非 facade fail-closed,publish-records e2e 已证)。补 account-market-records.spec.ts(2 test:GET /account/purchases、/account/licenses,验 200/code:0 + 区块真后端读通渲染,不依赖记录条数)。全量 e2e 38/0(原 36/0),commit db63b2d。市场记录三件套(购买/授权/发布)真后端 e2e 全闭环。
  • 2026-06-21:补个人中心「保存资料」写路 e2e + 挖出并修 profile update 500 真后端 bug(反假绿)account-profile-update.spec.ts(改公开署名→PATCH /profile→code:0 + version 乐观锁自增 + UI 回显;只改署名不动昵称以不破坏 live-read 的 nickname 断言)暴露真后端 bug:AccountProfileMapper.updateByAccountUserIdAndVersionLambdaUpdateWrapper.setprofile_snapshot(PG jsonb 列)默认不走 DO @TableFieldJsonbStringTypeHandler,按 varchar 绑定→「column is jsonb but expression is character varying」→ update 500(insert 走 typeHandler 故首次 create 侥幸 OK、对已存在 profile 的 update 必 500)。修:set 显式指定 JsonbStringTypeHandler(commit f3ea06c)。curl 实证旧 jar PATCH 500、rebuild+重启后 code:0+version 2→3。连带修测试污染:agent-create.spec uniqueName=Date.now() 不幂等每跑新建 agent,累积 22 条后按 updatedAt 倒序把种子「活体测试智能体」挤出后端默认分页第一页,致 live-read ai 断言从绿变稳定红;global-setup 加第 11 节删 e2e 前缀 agent、保留种子(commit 3ffee35)。全量 e2e 39/0。教训:LambdaUpdateWrapper.set 写 jsonb/json 列必须显式带 typeHandler(不继承 DO @TableField);写路 e2e 用唯一值避免 pre-existing 假绿,但唯一值累积会污染列表类断言,需 global-setup 清理配套。
  • 2026-06-21:补权益配额/用量归属真后端 e2e + 个人中心 account 面 e2e 全闭环UsageStats(GET /account/entitlements 套餐/配额/发布能力 + GET /account/usage Token 用量/按归属分布)此前无专门 e2e(live-read 仅断言 profile nickname、未覆盖 UsageStats);curl 证两端 code:0 真后端就绪(非 facade unavailable)。补 account-usage.spec.ts(验 200/code:0 + 「权益与配额」/「归属分布」区块渲染,不依赖数值,commit 1dbbfc7)。至此个人中心 account 面真后端 e2e 全闭环:profile 读(live-read)+ 写(account-profile-update)、权益配额、用量归属、购买/授权/发布三件套(account-market-records + account-publish-records)、安全事件 ack(account-security-ack)。全量 e2e 41/0(本会话 35/1→41/0:净增 6 真后端 e2e、修 market-publish 慢一拍 + profile update 500 两真因、清 agent 测试污染)。
  • /⚠️ 2026-06-21:修新建章节缺契约字段(前端真 bug)+ 挖出后端 order_no 软删 schema bug(反假绿,后端待人类定 DDL)。延 #30 盘 content/editor 旅程发现:前端 useChapterCreate 只传 {title},而后端 ChapterCreateReqVO 强制 commandId(幂等)+ expectedWorkRevision(作品乐观锁),缺失被 @Valid 拦成 400——dev mock 不校验长期掩盖、真后端建章必败。修:补两字段 + 经 WorkspacePage→ChapterPanel(props)→useChapterCreate 透传 work.revision、建章后失效 workDetail 缓存(commit ca33c8e);curl 证干净作品 create code:0。修前端后请求合法到达后端,又暴露独立后端 bug:createChapterorderNo=selectCountByWorkId(active)+1,章节 deleteById 是软删(行仍在表),而 uk_muse_content_chapter_work_order UNIQUE(tenant_id,work_id,order_no) 不含 deleted(同文件 uk_muse_content_chapter_command 却是 WHERE command_id IS NOT NULL 的 partial index——本该 partial 却遗漏)→ 删章节后再建 order_no 与软删行冲突 → 500(影响 chapter create/reorder;block 等表 uk 同形、潜在)。属 schema/软删语义系统性问题,按规范归人类定 DDL 修法(推荐:uk 改 partial index WHERE deleted=false,对齐 command uk 惯例;备选 物理删 / order_no 取含软删 max+1)。e2e chapter-create-delete.spec.tstest.fixme 标注待修(tracked 不掩盖)。注:测试在 work1 留了 1 个软删章节行(order=2,active 列表不显示),随后端修复一并清理。全量 e2e 41/0(+1 fixme)
  • 现状:其余旅程仍 ~14% 真连、dev 默认 MSW;但 MVP#1 已打通"关 MSW→直连活体→playwright e2e"模式(见下),可复用到后续旅程。
  • AI 候选采纳(rendered UI 活体证,2026-06-14):main.tsxVITE_API_MOCK=false 开关关 MSW、前端直连活体单体;accept-suggestion.spec.ts 在 chromium 实跑——happy-path(生成经 page.route stub 发真实 suggestionId→点"采纳替换"→真合并)隔离跑绿 + DB 证(block rev1→2、正文=候选);negative-path(陈旧 revision)绿(乐观锁 1041000002)。连带真实修复 client.ts 注入 tenant-id(活体集成缺口,dev MSW 不校验故没暴露)。遗留:happy-path 受种子状态依赖(合并后 block rev 变 + RQ 缓存,需 fresh 种子复跑);workspace.spec.ts 已改活体壳冒烟(2026-06-15,MSW 互斥红消除、整套 8/8 全绿);suggestion 合并后留 pending=merge 不在同事务回写 AI 域状态(靠 outbox→AI 异步翻,本机 dispatcher 节流故 DB 仍 pending,读 ContentSourceServiceImpl 确认,非产品 bug)。
  • content/market/account/ai-agent 读旅程(rendered UI 活体证,2026-06-14):live-read.spec.ts 4/4 绿(MSW off,chromium:作品列表/市场浏览/个人中心/智能体列表均渲染真实后端数据)——证 tenant-id 修复后 studio 直连活体单体跨 BC 取数、真实数据形态与页面渲染契约对齐。
  • AI Agent 自建写路(rendered UI 活体证,2026-06-19):agent-create.spec.ts 新增“新建智能体→真实 POST /app-api/muse/agents→列表回显”切片,刻意不触发“运行试用”以避开 New-API 外部依赖;本轮起真实单体 48080 + Vite MSW-off,E2E_SKIP_SEED=1 ./node_modules/.bin/playwright test e2e/agent-create.spec.ts --project=chromium 1/1 绿。反假绿证据:后端日志显示 muse_ai_command 预占/完成、muse_agent insert、muse_business_audit_event insert;DB 只读核验 muse_agent活体智能体-e2e-*|user|1|active。首跑曾因 locator 过宽 strict-mode 命中卡片标题+当前选中说明两处文本而红,已收窄到卡片 button accessible name 后绿。
  • 🔧 知识库工作台: 确认草稿(先审后入)rendered-UI 活体证(2026-06-14)——KnowledgeDraftPanel(/knowledge/:workId)列待确认草稿+「确认入库」→ 真 confirm 物化 Canonical 实体(knowledge-confirm.spec.ts chromium MSW-off 绿,DB 证 draft confirmed+entity_id);后端补 SummaryRespVO 暴露 confirm 并发/源令牌。 graph(知识图谱视图)rendered-UI 活体证(2026-06-15):KnowledgeGraphPanel 经 GET /works/{id}/graph 读真实 muse_knowledge_entity/relation,渲染已入库 Canonical 实体(节点)+关系(边),与草稿面板成"候选→确认→正式图谱可见"闭环(knowledge-graph.spec.ts chromium MSW-off 绿 + curl 证 code:0/节点+huoti_related 边)。 修真实潜伏 bug(反假绿,task_497da70f 已闭):confirm 重名实体原冒泡 HTTP 500→改 writeCanonicalEntity 前置 selectByIdentity 预检→markConflicted(REQUIRES_NEW)+KNOWLEDGE_ENTITY_DUPLICATE(1043002004)干净拒绝(curl 证 1043002004 非 500、DB 草稿 conflicted 且无伪造重复)。🔎 bindings 活体勘察(2026-06-15,反假绿):precheck→bind 写路真实+绿(curl 证 user_kb:POST .../prechecks→code:0/allowedPurposes[search,generate]/active、POST .../knowledge-bindings→code:0/bindingId=1 写 muse_knowledge_binding;KB 经 POST /knowledge-bases 真建)。但读回 gap——GET /local-knowledge.sourceBindings 读独立投影表(MuseKnowledgeSourceBindingProjectionMapper,事件驱动填充),bind 不同步写该投影,故刚绑定的来源在 UI 不可见;controller 亦无 GET bindings 端点。bindings 因此非干净端到端旅程(写成功但无诚实读回),与 account 归因/source-owner 同属"事件驱动副路径待投影接线"(见 §五A),不建一侧写 UI(反一侧设计)。📝 2026-06-19 投影写腿已接(commit 8aad7a4):MuseKnowledgeBindingService bind 确认现同步写 muse_knowledge_source_binding_projection(代码注释:绑定确认为权威回填点,来源变化事件只管后续状态传播),unbind 按 bindingId 作用域撤销(不误伤同源跨作品投影);唯一键补 work_id(V24,partial WHERE deleted=FALSE)修同源 KB 跨作品复用误判冲突(MuseKnowledgeBindingServiceTest + MuseKnowledgeSourceBindingProjectionMapperTest 11/11、knowledge-server 整套件 214/214 绿,clean 重编译反假绿)。bindings 读回剩余缺口收窄为:GET bindings 端点 + FE hook(投影写腿不再阻塞) 读回端到端坐实 + unbind 真软删修复(2026-06-19,反假绿):用嵌入式 DB(H2)往返证 bind 写投影→selectActiveByWorkId 真读回该来源、unbind 后读回消失、同源绑定到其它作品的投影存活;并由此挖出并修 unbind 软删真 bug——deleted@TableLogic,实体 setDeleted(true) 被 MyBatis-Plus 普通 update 剥离成空操作(撤销其实没生效),改 setSql("deleted = true") 才真软删(MuseKnowledgeSourceBindingProjectionRoundTripTest 2/2、knowledge-server 整套件 216/216 绿;附带补齐 knowledge 模块首套嵌入式 DB 测试基建)。 GET bindings 读端点已补(2026-06-19):AppMuseKnowledgeBindingControllerGET /muse/works/{workId}/knowledge-bindingslistKnowledgeBindings(先 requireWorkOwner 过信任边界防 IDOR、再 selectActiveByWorkId 读回投影,id 转字符串对齐契约;X-API-Version guard 同既有端点);新增 happy-path 映射 + 越权 fail-closed(不归属即抛错且绝不查投影)单测,整套件 218/218 绿。bindings 读回后端腿(写→读→端点)已闭环,仅余 FE hook FE 读回面板已加(2026-06-19):studio useKnowledgeBindings(workId) hook(读 /works/{workId}/knowledge-bindings、解 bindings 数组、id 维持字符串)+ KnowledgeBindingsPanel(镜像 DraftPanel:work-scoped 只读、空/错不占位、来源类型/状态中文徽标)接入 KnowledgePage;契约测试(URL+解析)+ 组件测试(渲染+空态不占位)经 vitest 验证,全 studio vitest 50/50 + tsc 干净诚实边界:rendered-UI 活体证(playwright MSW-off)需运行中全栈 app(env 受限,同其它 FE e2e),本切片未跑 live e2e。至此 bindings 写→读→端点→FE 读回展示链(除 live e2e)全通🔌 live e2e 已写 ready 但 env 受阻未跑(2026-06-19):muse-studio/e2e/knowledge-bindings.spec.ts 镜像 knowledge-graph.spec.ts(nav /knowledge/1→捕获真实 GET /works/1/knowledge-bindings→断 200/code:0/active 绑定 + 面板渲染),playwright --list 确认编译有效可发现(1 test);活体运行受阻=远端 PG 宿主 100.64.0.8:5433 离线(不在 tailnet 节点列表)、本机无 PG 兜底,全栈 app 起不来。解阻=该 PG 宿主机恢复上线后,按 [.agents/knowledge §六] 起栈(redis 本机可启、jar 需重建含 GET 端点、muse_slice_live seed work1 绑定)即可跑。🔎 publish 活体勘察(2026-06-15):publish-prechecksblocked(EXTERNAL_RIGHTS_PRIVACY_VALIDATOR_NOT_CONFIGURED 无条件加 + readiness status=blocked;snapshot 步拒 blocked readiness)→ 知识发布正确 fail-closed(外部权利/隐私校验器未配置,同 exports/New-API),非可建绿旅程。dup-fix 补单测回归守护:MuseKnowledgeDraftServiceTest 新增 should_failClosedWithDuplicateCodeWhenCanonicalEntityIdentityExists(预检命中既有实体→KNOWLEDGE_ENTITY_DUPLICATE+markConflicted+绝不 insert),18/0 绿installed-KB 删除回显修复(2026-06-19):deleteInstalledKnowledgeBase 现删除时同步写 deleted=true,列表排除 binding_status=deleted,避免“删除记录”继续以 disabled 回显;targeted 单测 MuseKnowledgeBindingMapperTest + MuseInstalledKnowledgeBaseServiceTest 10/10 绿结论:knowledge 前端可建旅程已尽(confirm+graph );bindings 读回(写→读→端点→FE 读回面板 2026-06-19 全通,vitest+tsc 绿;仅 live playwright e2e 待全栈 app)/publish(外部校验器)→后置,待 live e2e / 外部依赖配置。
  • 🔧 市场生产侧: 发布草稿 + 提交审核全链(创作者飞轮)rendered-UI 活体证(2026-06-15)——MarketPublish(/market/publish):①「保存发布草稿」(POST /marketplace/publish-drafts)→my-publish-records 真实回读;②「提交审核」做 save→运行检查(POST .../checks)→检查通过提交申请(POST /publish-requests)全链(licenseType+权利声明为检查硬门槛)。market-publish.spec.ts chromium MSW-off 8/8 绿(草稿正 / 缺标题负 / 提交全链 / 上架生命周期徽标 / 申诉提交·撤回·补充材料写路 / appealStatus 回显),DB 证:muse_market_publish_draft=draft、muse_market_publish_request=submitted、muse_market_review_event=submitted 落库;草稿测幂等自包含、全链测唯一名可重复跑。MarketBrowse 加「我要发布资产」入口。附带修真实潜伏后端 bug:publish draft/check/request/review_event 的 (tenant_id,command_id) 为部分唯一索引(V15 WHERE command_id IS NOT NULL),mapper insertIgnore 却发无谓词 ON CONFLICT (tenant_id,command_id)→PG 无法用部分索引作仲裁器→save/check/submit 500(链路从未活体跑过故潜伏);修=部分→完整唯一索引对齐 command/purchase 约定(V22__fix_market_publish_command_unique_index.sql 4 表 + muse_slice_live 已应用,零 Java 改动/零重启)。 上架状态可视化(读,2026-06-15):「上架=审核通过自动 markListed」(AdminMarketReviewServiceImpl,非生产者动作),生产者侧 MarketPublish「我的发布记录」新增发布生命周期中文徽标(草稿/已提交/审核中/已通过/已上架/已驳回/需补充…)+ nextAction/appealStatus 副文本,使创作者看到 publish→review→list 进度反馈(market-publish.spec.ts 第 4 例断言 listed→「已上架」、rejected→「已驳回」渲染;种子 /tmp/SetReqStatus.java 置 req#2→listed、#3→rejected)。申诉(appeal):后端已验证 real+fail-closed(2026-06-15)——curl:对自有已驳回资产 POST /marketplace/appeals(review_rejection)→appealId/pending;负路 他人资产→1044000024 无权访问、不存在资产→1044000003 资产不存在(fixture=asset(pub=1)+rejected request,见 /tmp/SeedAppeal.java)。 申诉(appeal)写路 UI——gap 已解(2026-06-15):根因=my-publish-records 的 assetId 是 publish-record id, submitAppeal.requireAsset 所需的物化 muse_market_asset.id(资产仅 admin 审核通过 markListed 物化)。后端最小契约改动:PublishRecordItem/MarketPublishRecordItemRespVOmarketAssetId(=request.asset_id 命中真实 muse_market_asset 且归属当前发布者才给,否则 null=fail-closed 不放开入口),MarketPublishServiceImpl.resolveMarketAssetId 解析(已重建 jar + 重启单体 26483)。前端:仅 marketAssetId 非空 + 状态∈{rejected/compliance_blocked→review_rejection、delisted→delist、recalled→recall} 的记录放开「发起申诉」→ 面板填理由 → useSubmitAppeal(新 commandId 幂等)真打 POST /marketplace/appeals申诉已提交(pending)(market-publish.spec.ts 第 5 例 chromium MSW-off 绿)。DB 证(反假绿):muse_market_appeal 追加行 status=pending、commandId=前端 UUID(e2e 点击产 appealId=3);curl 正负路(自有已驳回→appealId/pending;他人→无权访问;不存在→资产不存在);后端 MarketPublishServiceTest 回归通过。种子 /tmp/SeedAppeal.java(asset(pub=1)+rejected request,asset_id=物化资产)。 申诉补充/撤回 UI(2026-06-15):同类 gap——生产者本无自己申诉的列表端点,故新增 app-api GET /marketplace/appeals(appListMyAppeals+MuseMarketAppealMapper.selectListByUser+MarketMyAppealItemRespVO,带 canSupplement/canWithdraw 派生)。MarketPublish「我的申诉」区列申诉 + 中文状态徽标(待处理/审核中/待补充材料/维持原判/已恢复/已关闭…);canWithdraw(非终态)放开「撤回」→useWithdrawAppealPOST .../withdraw(expectedStatus 乐观锁)→closed;canSupplement(supplementing 态)放开「补充材料」→useSupplementAppealPOST .../supplements(privacyConfirmed)→reviewing。market-publish.spec.ts 第 6/7 例 chromium MSW-off 绿(撤回→已撤回、补充→材料已补充),DB 证(反假绿):withdraw→muse_market_appeal status=closed、supplement→muse_market_appeal_material 追加行(e2e 点击产 material#2);后端 MarketAppealServiceTest 15/15 + AppMuseMarketAppealControllerTest 6/6 回归通过。种子 /tmp/SetAppealSup.java(置 supplementing;提交后→reviewing 故每轮重置)。 appealStatus 记录回显(2026-06-15):my-publish-recordsMuseMarketAppealMapper.selectLatestByAssetIdAndUser + resolveAppealStatus 回填该物化资产被当前发布者发起的最新申诉态到记录 appealStatus(无物化资产/无申诉则 null,marketAssetId 与 appealStatus 两路共用各只查一次);MarketPublish 发布记录副文本以中文徽标渲染「申诉:<待处理/审核中/已关闭…>」。market-publish.spec.ts 第 8 例 chromium 绿(recId=5/marketAssetId=2 回显 appealStatus=closed→「申诉已关闭」);后端 MarketPublishServiceTest 14/14 回归通过。至此市场生产者飞轮端到端完整:发布(草稿→检查→提交)→上架状态可视化→申诉(提交/补充材料/撤回)全生命周期 + 申诉态回显。遗留已收口(2026-06-15):handoff_event/appeal_material/authorization_summary/appeal_event/appeal 5 表(其 mapper 确发无谓词 ON CONFLICT)经 V23 系统性修(部分→完整唯一索引)+ 新增 P1rMarketCommandIndexFlywayMigrationIT 真实 PG 验证(clean→迁移 V1→V23→断言 V22/V23 的 9 个命令索引均完整、可作 ON CONFLICT 仲裁器,Tests run 1/0F;与 V15-pinned P1rMarketFlywayMigrationIT 互补)。其余 market 部分 command 索引(favorite/auth_snapshot/installation/asset/governance_*/handoff/source_status_event/account_projection)未被当 command-arbiter,保持不变。
  • 🔧 个人中心: profile/用量/权益 + 我的购买/我的授权 + 安全事件(读+确认写路)(rendered-UI 活体证,2026-06-15)——PersonalCenter 新增「我的购买/我的授权」渲染 market→account 投影真实记录(useAccountPurchases/useAccountLicenses/account/{purchases,licenses};live-read.spec.ts 第 5 例 chromium MSW-off 绿,断言真实资产「活体市场资产·测试」渲染——证后端 account 读端在单体可用即被 UI 消费,见 §五A 活体订正);新增「安全事件」区渲染 GET /account/security-events 真实摘要(useAccountSecurityEventsAccountPageResult<SecurityEventSummaryRespVO>;eventType/severity 徽标 + 已确认/待确认状态;live-read.spec.ts 第 6 例 chromium MSW-off 绿,断言种子事件「活体安全事件·异地登录提醒」渲染)。确认写路:未确认事件展示「确认」按钮→useAcknowledgeSecurityEvent(每次发新 commandId,后端按 commandId 幂等)真打 POST /account/security-events/{id}/acknowledge(action=acknowledged)→列表失活重取翻「已确认」、按钮消失(构成 acked→无动作 UI 不变量;account-security-ack.spec.ts chromium MSW-off 绿,种子事件 B「待确认演练」)。后端正负路 curl 实证(反假绿):正路 acknowledge 真实事件→code:0+列表 acknowledged 翻 true;负路 acknowledge 不存在 eventId→404 安全事件不存在、非法 action→400 参数校验,均 fail-closed 非许可桩。写入 DB 双证:muse_member_security_event.acknowledged 翻 true + muse_account_security_event_ack 追加 1 行(action=acknowledged、commandId 为前端 UUID=权威处理历史,非覆盖)。种子幂等可重置(/tmp/SeedSec.java:事件A读锚点幂等插入 + 事件B写锚点每轮重置为未确认)。本轮实跑:account-security-ack 1/1 + live-read 6/6 + vitest 47/47 + tsc 干净。:exports / downloads / new-api-binding 深页(后端均为正确 fail-closed 外部依赖:对象存储 / New-API 未配置,非接线缺口,见 §五A)。
  • Knowledge impact preview owner 审计收窄(2026-06-19):previewGlobalKBImpact 不再把 installed/source-binding owner 粗暴标成 Task4 未实现,而是按本域已落库的 muse_knowledge_source_binding_projection.owner_user_id 输出 ownerAuditSummary(total/valid/invalid/distinct owner 计数);若存在 owner_user_id<=0/null 才进入 invalid_installed_kb_owner_projection unknown。export_task_owner 与 document owner count 仍保持 unsupported/fail-closed,不伪造跨 BC owner 事实。验证:MuseKnowledgeBaseServiceTest + MuseKnowledgeSourceBindingProjectionMapperTest + MuseKnowledgeBindingMapperTest 32/32 绿
  • 收口口径:每切片"关 MSW→真连活体单体→playwright 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 绿
  • 运行态仍后置:单体 P1R-7 仍以 muse-server 直服 48080 /app-api 为验收关键路径;muse-server 默认禁用 Nacos 注册,且 gateway 与 server 本地默认端口同为 48080,所以本轮不声称网关真实转发已完成。后续若启用网关部署,需补注册发现/端口方案并做 curl/e2e 首跑。

E. ADR 级 ArchUnit grant/runtime 包隔离(B5,最小机械门已落;完整物理包拆分后置)

  • 最小门禁(2026-06-19):新增 AiGrantRuntimeBoundaryArchTest,强制 AI runtime/任务执行侧不得直接依赖 ToolGrant 写模型/DO/Mapper/管理 VO,只能消费 SecurityRuntimePermissionFacade 产出的 runtime permission envelope。首轮误把 ProjectionSecurityRuntimePermissionFacade 纳入执行侧并红,确认它是 Security 投影适配器、合法读取 ToolGrant 后收窄规则;最终 mvn -pl muse-server -am test -Dtest=AiGrantRuntimeBoundaryArchTest 1/1 绿
  • 仍未宣称完整达成:grant/runtime 物理包拆分、完整 ADR 级隔离仍后置;当前只是防运行时自授权的最小机械护栏。

收口顺序(价值/可验证性优先)

  1. 红测试修复(本轮) 2. MetaImpact 真实化(解 meta 发布链,多模块) 3. account 投影/归因(解 21 端) 4. 验收债按 BC 补真实 PG IT 5. 前端逐切片 + playwright 活体 e2e 6. gateway 配置层收口 / grant-runtime 最小门禁 / ⏸ 完整物理包拆分后置。