oh-my-muse/docs/mvp/进度总账.md
lili 329db944ff docs: 进度口径收敛到机械唯一源——修正三套矛盾数字(147/100→233/233) + 现状基线降级
排查发现进度数字三套互相矛盾:总览/现状基线/主台账历史段=147/86、agent-specs=100/127、module-reality=233/0。核机械真值:覆盖 JSON summary=233/233 completed/0 needs(每 op 带 testFiles 证据 + P1rApiCoverageReportTest 校验 summary 自算防手工拨)。⚠️ JSON generatedAt=2026-05-25 未随内容刷新(手工维护痕迹),已在文档标注以 summary+testFiles 为准。

修正:① 总览(我上轮新建,误抄过时台账)147/233→233/233、各域 full、接口门≠端到端两口径分清、定位为人读封面(权威以台账/JSON为准);② 主台账 头部加机械源口径声明(233/0)+门禁中→满+验收债标已清零;③ 现状基线降级为 2026-06-13 历史快照(顶部时效横幅+性质去SSOT);④ AGENTS序2/module-reality 改引用;⑤ agent-specs/.agent 注记历史数字;⑥ meta-schema review 回指 execution v0.2 已证伪地基(待决策提案);⑦ design-docs/00 加'设计≠进度';⑧ dev-baseline 申明旧 SSOT 自称失效。

确立单一真实源:设计=design-docs;进度=进度总账(叙述)+覆盖JSON(机械);人读=项目功能与进度总览(封面)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 05:32:32 -07:00

178 lines
88 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Muse 进度总账(单一进度源)
> **本文件是项目进度的唯一 SSOT**。进度更新只进**本文件 + 各模块 `.agent`**;**不再新增“状态推进 / 收口 / completedApproval”过程文档**(过程文档 churn 是失控根因之一,见 [对抗复盘](../agent-specs/2026-06-13-目标达成对抗复盘.md))。
> **接口覆盖门机械唯一源** = [覆盖 JSON `p1r-api-coverage.json`](../superpowers/reports/p1r-api-coverage.json)(经 `P1rApiCoverageReportTest` 校验 summary 自算 + testFiles 证据),当前 **233/233 completed / 0 needs_verification**;⚠️ 该口径 = 接口门,**≠ 端到端可用**(整体 ~76%,见 §二)。
> 模块现状细节见 [现状基线 spec](../agent-specs/2026-06-13-项目目标与模块现状基线.md)(**2026-06-13 历史快照**,文内 147/86 为当时值,以本文件 + 覆盖 JSON 为准);人读全局见 [项目功能与进度总览](../项目功能与进度总览.md)。
---
## 一、Agent 开发基建(本轮交付,机械门禁优先)
| 砖 | 内容 | 状态 | 机械证据 / 落点 |
|---|---|---|---|
| P0 | CI 真跑测试(JDK21、去 `-Dmaven.test.skip`)+ 覆盖台账去硬编码 + P0 冻结令 | ✅ | `muse-cloud/.github/workflows/maven.yml``P1rApiCoverageReportTest`、[脊柱规则](../../.agents/rules/verification-and-anti-false-green.md) |
| ① | BC 边界 ArchUnit 门——**通用覆盖全业务 BC 间方向** | ✅ **全绿**(AI/knowledge/market 三处直连他域 DAL 违例均已整改,豁免清单清空) | `BcBoundaryArchTest`(1/0F,0 Architecture Violation,`KNOWN_VIOLATION_EXEMPTIONS`=空);[bc-boundaries](../../.agents/rules/bc-boundaries.md) §三 |
| ①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](../../.github/workflows/openapi-diff.yml)+[verify 脚本](../../muse-cloud/scripts/verify-openapi-diff.sh);[contract-first](../../.agents/rules/contract-first.md) §四 |
| ⑦ | loop 机械牙 + CI 接电(round-2) | ✅ 绿 | `AgentsInfraIntegrityTest`(3/0F);`maven.yml` 触发分支修为 `main` |
| ③ | knowledge 蒸馏(定位架构 / 现状基线指针 / 决策) | ✅ | [`.agents/knowledge/`](../../.agents/knowledge/) |
| ④ | skills(黄金旅程“完成”定义 / 新增 BC 模块) | ✅ | [`.agents/skills/`](../../.agents/skills/) |
| ⑤ | workflow(AI 开发协议元流程) | ✅ | [`.agents/workflows/ai-development-protocol.md`](../../.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 §四/§五](../agent-specs/2026-06-13-项目目标与模块现状基线.md)。
- 接口完成台账(门禁批准口径,≠端到端可用)→ `P1rApiCoverageReportTest` + `docs/superpowers/reports/p1r-api-coverage.json`;completed operation 现在必须带 `testFiles` 证据锚点。
| BC 模块 | 只读评估 | `.agent` |
|---|---|---|
| AI 编排 (ai) | 72% | [.agent](../../muse-cloud/muse-module-ai/.agent) |
| 作品/编辑器 (content) | 82% | [.agent](../../muse-cloud/muse-module-content/.agent) |
| 知识库 (knowledge) | 72% | [.agent](../../muse-cloud/muse-module-knowledge/.agent) |
| 市场 (market) | 82% | [.agent](../../muse-cloud/muse-module-market/.agent) |
| 元治理/MetaSchema (meta) | 82% | [.agent](../../muse-cloud/muse-module-meta/.agent) |
| 事件/SSE (events) | 88% | [.agent](../../muse-cloud/muse-module-events/.agent) |
| 账户/个人中心 (account→member) | 68% | [.agent](../../muse-cloud/muse-module-member/.agent) |
> 整体只读评估 ≈ 76%:后端实现高、**接口覆盖门已满(233/233)但 ≠ 端到端可用**、前端用户端低、跨 BC 集成低(机械门禁本轮已补 BC + 契约门)。
> **2026-06-14 更新 —— P1 后端"环境阻塞"已解除**:此前"86 个 needs_verification 须真实 PG、本地不可验"的判断**已被实测推翻**。接通共享远端 PG(详见 §四 时间线 + [.agents/knowledge §四](../../.agents/knowledge/external-deps-and-gotchas.md))真跑 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 §五](../../.agents/knowledge/external-deps-and-gotchas.md))。
---
## 三、最大共性风险(跨模块,来自基线)
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`](../../.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](../explainers/muse-cloud/content/p1r-stages.md))。P1R-0~6 各 BC Real API 门禁口径基本就位;**收口主体 = P1R-7 端到端验收**,其阻塞 = [现状基线 §6.3](../agent-specs/2026-06-13-项目目标与模块现状基线.md) 最危险缺口 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 发布链,**重新判定:缺特征非接线,降优先级**):现仅 `UnavailableMetaImpactFacade``META_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](../agent-specs/2026-06-17-meta-schema用量投影-review.md)——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 + 真实 `AiSuggestionMergeProjectionFacade``muse_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 已按人工批准翻转,`P1rApiCoverageReportTest``P1r*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 §四](../../.agents/knowledge/external-deps-and-gotchas.md)**:`_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:e2e`**20/20 单次全绿、零手工 `/tmp` 种子**(消费态下实证 globalSetup 复位后整套绿;新 agent-create 不消费这些 fixture,本轮以 `E2E_SKIP_SEED=1` 单例实跑)。)**
- 现状:其余旅程仍 ~14% 真连、dev 默认 MSW;但 MVP#1 已打通"关 MSW→直连活体→playwright e2e"模式(见下),可复用到后续旅程。
-**AI 候选采纳(rendered UI 活体证,2026-06-14)**:`main.tsx``VITE_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)**:`AppMuseKnowledgeBindingController``GET /muse/works/{workId}/knowledge-bindings``listKnowledgeBindings`(先 `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-prechecks``blocked`(`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`/`MarketPublishRecordItemRespVO``marketAssetId`(=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`(非终态)放开「撤回」→`useWithdrawAppeal``POST .../withdraw`(expectedStatus 乐观锁)→closed;`canSupplement`(supplementing 态)放开「补充材料」→`useSupplementAppeal``POST .../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-records``MuseMarketAppealMapper.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` 真实摘要(`useAccountSecurityEvents``AccountPageResult<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 最小门禁 / ⏸ 完整物理包拆分后置。