oh-my-muse/docs/mvp/进度总账.md
lili 1c2d51bfd4 feat(deploy): S9 单人版 compose 从零部署+黄金旅程活体验收(1a 闭合)
- docker-compose.solo.yml:muse-server 单体+PG+Redis 一体化编排,固化 sql/muse Flyway 迁移只读挂载(mini-infra 从零真验暴露漏挂致 muse 表全缺、AI worker 每秒报 relation does not exist)
- 2.0.0-单人版部署手册.md:双栈拓扑/凭据清单/从零步骤/回滚恢复多用户/Dify 升级约定
- 进度总账:§9 判据 0–7 全留证(黄金旅程 workId98 七步 PG 核验+compose 从零 36 迁移 121 表)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 10:19:47 -07:00

289 lines
204 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 证据),当前 **242/242 completed / 0 needs_verification**;⚠️ 该口径 = 接口门,**≠ 端到端可用**(整体 ~77%,见 §二)。
> **🎯 1.0.0 交付计划(可闭环严判 + 待做路线、单一执行源)** = [1.0.0-交付计划.md](1.0.0-交付计划.md)(2026-06-26 八域交付盘点)。本总账记**接口门/基建进度**;**1.0.0 可闭环完成度严判(~55-65%)、五类系统性病灶、E0E7 待做 Epic 以交付计划为准**。盘点实证口径差:覆盖 JSON 的 completed = 接口存在 + 台账标记、**≠ 真闭环可用**——多个 `P1r*RealApiGateTest` 是台账门禁(非真跑)、P1r IT 已改为按 [真验证清单](1.0.0-真验证清单.md) 分层复跑、前端/写侧大量"装了不能用"。
> 模块现状细节见 [现状基线 spec](../agent-specs/2026-06-13-项目目标与模块现状基线.md)(**2026-06-13 历史快照**,文内 147/86 为当时值,以本文件 + 覆盖 JSON 为准);人读全局见 [项目功能与进度总览](../项目功能与进度总览.md)。
---
## 一、Agent 开发基建(本轮交付,机械门禁优先)
| 砖 | 内容 | 状态 | 机械证据 / 落点 |
|---|---|---|---|
| P0 | CI 真跑测试(JDK21、去 `-Dmaven.test.skip`)+ 覆盖台账去硬编码 + P0 冻结令 | ✅ | `.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`(4 类静态门);[openapi-diff.yml](../../.github/workflows/openapi-diff.yml)+[maven.yml](../../.github/workflows/maven.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` / `dev/1.0.0` |
| ③ | 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 评审;2026-06-27 E0 续固)**:CI 触发分支 master→main(此前 CI 从不运行)、BC 门通用化 + 整改 knowledge 违例、loop 装机械牙、覆盖门去魔法数、文档诚实化、openapi-diff materialize 为独立 workflow。E0 将 Maven CI 移到仓库根 `.github/workflows/maven.yml`,并用 `run-p1r-verification.sh` + [真验证清单](1.0.0-真验证清单.md) 区分 local-ci / real-PG / external-live / mock-only / skipped。E0 fresh 证据:local 61/0F/0E/0S,根 CI 等价 `mvn -B package --file pom.xml` 3060/0F/0E/148S,real-PG 189/0F/0E/0S,external-live server 8/0F/0E/0S + module 4/0F/0E/1S(GraphRAG attribution 未配置跳过)。
**2.0.0 单人版改造 S0 门禁基线(2026-07-07)**:已坐实并修复 local 覆盖门基线红项。初跑 `bash muse-cloud/scripts/run-p1r-verification.sh local` 先暴露本机 Maven 绑定 JDK17 与沙箱写 `~/.m2` 的环境问题;显式 `JAVA_HOME=/Users/qingse/Library/Java/JavaVirtualMachines/corretto-21.0.7/Contents/Home` 后真跑坐实 5 个失败,均为跨域 gate 仍按旧 `completedOperations=241 / AI=47` 断言,而覆盖 JSON 已是 `242/242` 且 AI 为 48。新增 AI operation 为 `adminArchiveAgent`,已有 `MuseAgentServiceTest``AdminMuseAgentControllerAnnotationTest` 两个真实 `testFiles` 证据。修正 `P1rMarketRealApiGateTest``P1rKnowledgeRealApiGateTest``P1rEventsRealApiGateTest` 的 summary/AI 计数后,复跑 `run-p1r-verification.sh local` **61/0F/0E/0S, BUILD SUCCESS**。本步未改覆盖 JSON、OpenAPI、业务实现或数据库迁移S1 Dify 部署仍未开始。
**2.0.0 单人版改造 S1 Dify 基础设施与 live 契约(2026-07-07)**:已在 `mini-infra` 用官方 Dify `1.15.0` compose 独立部署 `muse-dify`,入口 `http://100.64.0.8:18080`API health 返回 `version=1.15.0`;该栈带自己的 `db/redis/weaviate/nginx/sandbox/plugin_daemon/worker/web` 等容器,不替换 Muse 既有 PG/Redis。Dify 绑定 New-API OpenAI-compatible provider已接入 `MiniMax-M2.5``Qwen/Qwen3-Embedding-8B``Qwen/Qwen3-Reranker-8B`,并创建写作 chat app、全书解析 workflow app、工作区级 Datasets API key。S1 真实验收新增 `P1rDifyChatLiveAcceptanceIT``P1rDifyDatasetsContractLiveIT`,默认 `MUSE_P1R_EXTERNAL_ACCEPTANCE` 未启用时 honest skipped显式 opt-in 后真实调用 Difychat app 返回 `status=success / messageIdPresent=true / summarySha256Prefix=565339bc4d33`Datasets 完成 create/upload/index/retrieve保留证据 dataset `cce33d41-c738-42d2-97b6-2d08a69965f2``indexingStatus=completed``score=0.7442479133605957`。踩坑已沉淀:Dify 官方 `.env``STORAGE_TYPE=opendal` 在本部署下会导致 worker `File not found`,已切到 `STORAGE_TYPE=local` + `STORAGE_LOCAL_PATH=storage` 并保留远端备份 `.env.s1-storage-before-local`Dify 1.15 `/retrieve``retrieval_model` 必填 `search_method``reranking_enable`。回归证据:targeted live 2/0F/0E/0S、默认跳过 2/0F/0E/2S、`run-p1r-verification.sh local` 61/0F/0E/0S。RAGFlow 实例下线与已暴露 key 轮换仍为手工事项,不阻塞后续 S2。
**2.0.0 单人版改造 S2 门禁与测试树适配(2026-07-07)**:已完成“机制就绪、不拨开关”。`muse-server` 新增 `market-detached-test-tree` profile显式 `-Dmuse.market.detached.test-tree=true` 时用 compiler `testExcludes` + surefire excludes 剥离 14 个 market/account 混合装配测试及 `P1rMarketRealApiGateTest`;默认本地构建仍编译全量测试树,`market-assembled` 可在 dry-run profile 同启时恢复全量装配口径。`P1rApiCoverageReportTest` 引入仅 market 可用的 `dormant` 口径dormant 保留总 operation 242、不计入 completed、跳过 completed 证据强制,但仍要求 dedicated 且属于批准域;覆盖 JSON 本步未改。AI/Knowledge/Events 三个 RealApiGate 的汇总断言同步改为 `totalOperations=242``completedOperations=242-marketDormant`,避免 S3 dry-run 在非 market gate 假红。Admin e2e 增加 `MUSE_ADMIN_E2E_MARKET=false` 开关,显式关闭时跳过 market/account 治理切片和 market fixture默认不跳过。验收证据:Admin typecheck 通过;`P1rApiCoverageReportTest` 默认 9/0F/0E/0SAI/Knowledge/Events RealApiGate 22/0F/0E/0S`-Pmarket-assembled -DskipTests clean test` 回编译全量 91 个 muse-server 测试源;主工作树 `run-p1r-verification.sh local` 62/0F/0E/0S临时 worktree 注释 market-server 依赖并把 market 32 条置 dormant 后,带 `MAVEN_ARGS='-Pmarket-detached-test-tree -Dmuse.market.detached.test-tree=true'` 的 local dry-run 56/0F/0E/0S。未改 OpenAPI、DDL、业务实现、覆盖 JSON 或外部凭据S3 仍需原子拨开关。
**2.0.0 单人版改造 S3 market 摘装配(2026-07-08)**:已原子拨开关并完成验收。`muse-server` 默认保留 `muse-module-market-api`、停用 `muse-module-market-server``market-detached-test-tree` 默认生效;`market-assembled` profile 恢复 market-server 依赖与全测试树回编译。`MonolithFacadeFallbackAutoConfiguration``MarketHandoffTokenApi``MarketAssetSourceApi``MarketAssetForkApi` 增加 `@Bean @ConditionalOnMissingBean` fail-closed 兜底verify 返回 `valid=false/MARKET_DETACHED`consume 返回 `consumed=false`asset source 返回 `notFound()`fork 写回返回 `false`,首次调用 warn 日志;真实 market Bean 存在时不覆盖。覆盖 JSON 将 market 32 条 operation 改为 `dormant``summary.completedOperations=210`,未删 operation/testFiles/sourceFiles未改 OpenAPI/DDL/业务实现/外部凭据。新增 `P1rMarketDetachedAssemblyGateTest` 证明 fallback、真实 Bean 优先、默认摘装配、`/app-api/market/**`/`/admin-api/market/**` 404 形态Knowledge installed 列表补空结果断言,既有 market_kb binding notFound/fork-not-ready 测试继续覆盖 fail-closed。验收证据:server targeted gate `P1rApiCoverageReportTest`+`P1rMarketDetachedAssemblyGateTest` 13/0F/0E/0Sknowledge targeted `MuseKnowledgeBindingServiceTest`+`MuseInstalledKnowledgeBaseServiceTest` 25/0F/0E/0S`-Pmarket-assembled -DskipTests test` 47 模块 reactor BUILD SUCCESS`run-p1r-verification.sh local` 60/0F/0E/0S`run-p1r-verification.sh real-pg` 真实 `_test` 库 143/0F/0E/0S外部验收 opt-in 后 `P1rContentImportWizardCompletedApprovalIT` 无 skip 且 provider 200coverage 计数核验 `total=242/completed=210/marketDormant=32/nonMarketDormant=0`。2026-07-08 裁决:publish-prechecks/snapshots/readiness 保留 Knowledge 本域预检/快照能力,允许写 readiness/snapshot/command 记录,但不得产生 market 资产、安装、授权事实;前端发布入口由 S5 删除。
**2.0.0 单人版改造 S4 配置与治理收口(2026-07-08)**:已完成 yudao 厂商脚手架、member 默认值、admin 菜单/New-API 页、solo 菜单 SQL 的收口。AI 配置层面,`muse-module-ai-server``muse-server` 两处 `application.yaml` 将 gemini/doubao/hunyuan/siliconflow/xinghuo/baichuan/midjourney/suno/web-search 九类 yudao provider 全部 `enable=false`,并把历史明文 key、Spring AI 示例 key、Midjourney/Suno URL 改为 env 占位;新增 `SoloExternalAiProviderGateTest` 防默认外部 provider Bean 回漂。member 层面,新增 `SoloAccountDefaultsGateTest` 固化 `muse.account.new-api.enabled=false` 与 publish/attribution/quota-request worker 默认关闭,现有 `@ConditionalOnMissingBean` facade 缺 owner 时 fail-closed`muse-cloud/scripts/dev/solo-compose.env.example` 给 S9 compose 预留同一 env 口径,租户机制保持开启且请求固定 `tenant-id: 1`。admin 层面,`muse.ts` 隐藏「市场治理」「用户与权限」菜单但保留路由;`views/muse/newapi` 降级为本地用量/余额/外部调用只读观测,删除网关绑定、额度配置、归属 job 三类写入口demo `leave/pay/ai/bpm/member` 顶级路由已确认隐藏。数据层面新增 `muse-cloud/sql/solo/2026-07-08-disable-solo-governance-menus-postgres.sql` 与 restore 脚本,幂等隐藏用户/角色/租户/部门/岗位、会员、支付、公众号、BPM、yudao AI 娱乐面菜单,保留菜单管理;本步未执行任何共享库 SQL。验收证据:新增后端 targeted gate 5/0F/0E/0S`bash muse-cloud/scripts/run-p1r-verification.sh local` 65/0F/0E/0S`grep -rn "api-key: sk-\|api-key: AIza" muse-cloud/**/application*.yaml` 零命中admin targeted Vitest 10/0F/0E/0S`pnpm --filter @vben/web-antd typecheck` 通过;`NODE_OPTIONS=--localstorage-file=/tmp/muse-admin-node-localstorage pnpm test:unit` 52 files / 356 tests passed`git diff --check` 通过。遗留提醒:RAGFlow 实例下线与已入 git 历史的 yaml 明文 key 轮换仍需人工处理。
**2.0.0 单人版改造 S4 启动级追补(2026-07-08)**:S5 活体 e2e 起栈时暴露 Spring AI Alibaba `DashScopeAgentAutoConfiguration` 仍会在缺 API key 时启动失败;已在 `muse-module-ai-server``muse-server` 两处 `application.yaml` 显式关闭 `spring.ai.dashscope.agent.enabled`,并把 `spring.ai.model.chat/embedding/image/rerank/video/audio.*` 置为 `none`,避免 DashScope chat/embedding/image/rerank/video/audio 自动装配因 matchIfMissing 回漂。`SoloExternalAiProviderGateTest` 同步扩展到 DashScope Spring AI 自动配置面targeted gate `SoloExternalAiProviderGateTest,SoloAccountDefaultsGateTest` 为 5/0F/0E/0S。标准启动脚本仍受当前 `infra.env` 指向 `muse_local/muse_dev` 且 Flyway V1 函数 owner 不匹配影响,`muse-server` 活体启动需在后续 S5/S9 统一修正开发库 owner/专用 live 库口径。
**2.0.0 单人版改造 S5 studio 入口裁剪推进中(2026-07-08)**:已按执行计划裁掉用户端市场、handoff、旧编辑器入口路由删除 `/market*``/handoff/land/:targetOwner`、旧 `/works/:workId/editor/:chapterId`,侧边栏移除「市场」「治理」,个人中心保留 profile + usage、删除购买/授权/发布/安全事件/New-API 绑定展示知识页移除「从市场安装」tab、发布到市场入口与预检弹窗登录文案去市场资产措辞landing-only handoff 组件、handoff store、旧 `EditorPage``KnowledgePublishModal` 已删除。新增 solo route/sidebar/account/knowledge 单测与 `/market``/handoff/land/*` route-only Playwright。验收已完成部分:`pnpm exec vitest run` 31 files / 117 tests passed`pnpm run build` 通过;`CI=1 E2E_SKIP_SEED=1 MUSE_STUDIO_E2E_MARKET=false pnpm exec playwright test e2e/solo-routing.spec.ts` 1 passedS5 隔离 17 个 market/handoff/account-market e2e spec`market-install-kb-retrieval.spec.ts` 的旧 fixme 位于已 skip 文件内。未完成项:执行计划要求的 MSW-off 创作主线全量 Playwright 尚未跑通,阻塞在本机后端活体启动口径(标准脚本先遇到 `muse_local` Flyway owner 问题;关 Flyway 后暴露并已修 DashScope 自动装配漏关)。因此 S5 当前不得标记完成,下一会话优先补后端起栈/创作主线 e2e 证据。
**2.0.0 单人版改造 S5 后端起栈与 MSW-off 创作主线 e2e 打通(2026-07-07)**:补齐上一条的未完成项——修好后端活体启动口径并跑通全量创作主线 e2e。上一条卡在的 `muse_local` Flyway owner 问题的真因是:标准启动默认落陈旧的 `muse_local`(仅 baseline 到 V0、缺 yudao 基座、`update_updated_at_column()` 函数属第三个角色 `muse`),以 root/muse_dev 跑 Flyway V1 的 `CREATE OR REPLACE FUNCTION` 必报 must-be-owner`muse_dev` 本身是角色不是库。唯一健康的 live 库是 `root@muse_slice_live`(已迁至 V34、含 yudao 基座与登录种子)。已把 `application-infra.yaml``start-muse-server-infra.sh` 的默认库/用户从 `muse_local/muse_dev` 改为 `muse_slice_live/root`,真实值仍由 `infra.env` 覆盖。关掉 owner 陷阱后又暴露 S4 追补仍漏关的 `moderation``OpenAiModerationAutoConfiguration` 默认 matchIfMissing=true全量 boot 会实例化 `openAiModerationModel`、无 OpenAI key 直接使单体启动失败;已在 monolith 真正加载的 `muse-server/application.yaml``ai-server/application.yaml` 两处补 `spring.ai.model.moderation: none`。这处漏网印证了 `SoloExternalAiProviderGateTest` 的结构性盲区——它用 `ApplicationContextRunner` 切片上下文只断言厂商 Bean 缺席,不加载 moderation 自装配,捕不到全量 boot 失败,只有真起才暴露。验收证据:`muse-server` 干净启动(`Started in 22.4s`、Flyway `validated 35 migrations / up to date`、零 owner error`/works` code:0真实 56 部作品)、`/app-api/market/**` code:404S3 摘装配活体确认MSW-off 创作主线全量 Playwright真 48080 + 真 `muse_slice_live` + 真 New-API 生成 + 真 RAGFlow 检索)**33 passed / 0 failed / 31 隔离**,覆盖候选采纳(含真生成+reject 归档)、导入向导、导出下载、知识草稿/确认/图谱/实体、绑定、agent 生命周期与槽位、AI 真生成(真 LLM 正文落库、规划编辑、solo 路由重定向31 个隔离用例经 `test.skip` 明写 S5 单人版隔离原因market/handoff/account-market 深页)。回归网 `run-p1r-verification.sh local` 65/0F/0E BUILD SUCCESSconfig 改动无回归。过程中还复现了 external-deps §四 的 stale-jar 坑:改配置后用 `-pl muse-server`(无 `-am`)重打会从 .m2 拉陈旧上游 jar 丢新端点knowledge-retrieval 404、import-wizard 超时),`clean package -am` 后即全绿。另修 `workspace.spec` 冒烟缺 token 注入被 S5 新增 AuthGuard 拦重定向的测试债。提交 `9af47128`(后端起栈+DB对齐+e2e`92b90878`(登录栈种子+OAuth2 scopes 兜底,`OAuth2TokenServiceImplTest` 14/0F/0E。**S5 经项目所有者 2026-07-07 验收标记完成**(本条 e2e gate 达成即 S5 收口supersede 上一条“不得标记完成”的在途状态。moderation 这类“全量 boot 起不来”的机械守卫不用切片 `ApplicationContextRunner` 补——它跑的是合成属性值而非真 `application.yaml`,挡不住“真 yaml 掉了 moderation 行”的回归,补了反而是假绿;真正的守卫层是 S9 golden-journey 的真起冒烟(无 Nacos 干净启动 + 黄金旅程),故该 boot 门归 S9不在本步补合成测试。遗留Dify 实例被游戏/Muse 共用、workspace 须隔离的约束已入 `.agents/knowledge/external-deps-and-gotchas.md`S1/S6 落 Dify 凭据前须校验归属 workspace
**2.0.0 单人版改造 S7.0 输出契约裁决(2026-07-07)**:在 live 单体(真 48080 + 真 New-API上取全 plan 要求的三项证据后裁定 **S7 走分支①(建运行时不落库全文通路)**,项目所有者 2026-07-07 确认。证据①SSE 流——后端不发 chunkhistogram chunk=0dispatcher 同步生成完整文本后只写一条 `done``MuseAiTaskStreamServiceImpl.doneData` 只带 `{taskId, suggestionId, summary?}`,全文不经 SSE②UI——CandidatePanel 凭 suggestionId 走 `GET /suggestions/{id}``data.content`③DB——`muse_ai_suggestion.content_snapshot.content` 实测仅 5060 字脱敏摘要(键 `content`+`outputSummary`),而原始 LLM 输出 >120 字。结论:现状用户在候选面板只看到 ~50 字脱敏摘要、看不到 AI 全文分支②“已有全文通路”的前提不成立AI 生成对用户长期半残。分支① 目标runtime 内部结果加不落库的内存全文字段,经 SSE 填充 OpenAPI 已声明但当前未发的 `chunk.data.content` 推给前端(不新增破坏性字段),候选表仍只存脱敏摘要+三审accept 走 merge_after_edit——全文只在传输/内存存在、永不落候选表保住“AI 原始产出不落库、先审后入”主权。该通路 provider 无关New-API/Dify 均透出全文到该字段),与切 Dify 正交。落地前置按工程约定S7 属跨模块+用户可见行为变更须先出评审版设计再实现provider 切 Dify 半段依赖 Muse 专属 Dify workspace 就绪。
**2.0.0 单人版改造 S7 全文通路评审版+执行版设计(2026-07-07)**:经三路 opus 子代理对后端生成路径/SSE 持久化重放/前端消费的精确测绘,产出 S7 分支①设计(`docs/agent-specs/2026-07-07-S7-生成主链全文通路-review.md` v0.2 + 同名 .html 速览 + `-execution.md` v1.0)。测绘校正了三个关键现状:完整正文只活在两个 real client 的 `success()` 里、构造结果前即被截成 60/80 字摘要出栈丢弃唯一捕获点SSE 严格只重放已持久化事件(凡送出必先落 `muse_ai_task_event`)、当前只发无正文的 done、chunk 契约与前端 `streamContent` 渲染早就位但后端从不产 chunk且「三审」审的也是摘要、Dify 完成原因硬编码常量致截断护栏无效。设计=一条「瞬态全文」通路:捕获处对完整正文跑护栏→写瞬态加密缓存(对称复用既有 `MuseAiRuntimePayloadStore` 范式:独立表+短 TTL+加密+决定即清)→事件表发 chunk 引用行、SSE 重放回缓存取全文填已声明的 `chunk.data.content`(非破坏)→前端 `streamContent` 零改动渲染→采纳恒回传完整正文写 Canonical。主权红线完整正文永不进候选表/正文表任何列。三个材料级点**所有者 2026-07-07 裁决全部采纳推荐**:①瞬态全文用独立加密缓存表(非 Redis、非落主表②采纳恒回传完整正文所见即所写修掉「原样采纳把摘要写进 Canonical」的潜伏缺陷③完整性护栏与合规审上移到完整正文现状审的是摘要。执行版拆 S7a捕获+护栏provider 无关不依赖 Dify→S7b瞬态载体+SSE 送达,新增 V36 迁移→S7c前端所见即所写+区分流不完整/为空→S7d切 Dify依赖 Muse 专属 workspace
**S7 分支①实现进展2026-07-08里程碑 M2 达成)**S7a/S7b/S7c 三步已落地并逐一独立验真(主权红线亲读核查 + 各步单测全绿)。
- **S7a**commit 916d6c87`RuntimeResult` 加仅内存 `fullOutput`;两 real client 在派生摘要前捕获完整正文并跑护栏(空/超长/凭据痕迹/疑似截断,不信 provider finishReason「审」上移到完整正文。主权三层亲验content_snapshot 仍写摘要、findings 只含布尔/marker/长度、fullOutput 无持久化出口。ai 模块 79 用例绿。
- **S7b**commit fcd0623a新增独立瞬态加密表 `muse_ai_generated_fulltext`V36AES 加密+TTL+决定即清),执行器写瞬态 Store不在终态 purge出向存活到决定投影在 done 前发 chunk 引用行payload 只含 contentRef、绝不带正文SSE `chunkData` 回 Store 取正文填 content采纳/放弃即 purge。完整正文永不进 chunk payload/候选长期列四重亲验。ai 模块 528 用例绿。
- **S7c**commit 43a08624纯前端。采纳恒走 merge_after_edit+finalContent=用户审定完整正文改没改都送Canonical 由客户端回传写入修掉「原样采纳写摘要」潜伏缺陷流健壮性三分happy/疑似截断提示重生成/流空标 degraded 警告)。**MSW-off e2e 真后端+真 New-API 端到端证实 Canonical content_text===客户端 finalContent**、revision 递增。tsc/vitest 121/build/lint/e2e 全绿。
- 真 PG 一次真生成经护栏+chunk 携全文+决定后 purge+重连回取的整链冒烟,并入 M1 由主会话跑现有 harness避免新造 P1r live IT 触发内容过滤器)。
- **S7d**commit b583bd6d代码层完成`RoutingMuseAiRuntimeClient` 补 Dify 装配为占位 Unavailable 时的 fail-closeddify 选中但未装配/凭据缺→返回 Dify 专属 `AI_DIFY_UNAVAILABLE` 拒绝,**绝不回退 New-API**,亲验 dify 分支三出口均不触碰 newApiClientDify non-stream-read 超时 90→180s 对齐180≤180<SSE 死线 240solo-compose.env.example 启用 Dify 凭据取自既有 S1 DIFY New-API 保留ai 模块 530 用例全绿`P1rDifyChatLiveAcceptanceIT` 真连 100.64.0.8:18080 wiring/契约/失败映射通过。**在用 Agent runtimeProvider 存于 `muse_ai_agent_version.config` 运行时 DB JSON 非静态种子**故真正切 Dify live 数据操作 M3
**2.0.0 单人版改造 S7 生成主链 M3 经 Muse 后端 LIVE 打通2026-07-08里程碑 M3 达成)**AI 生成主链首次完整经 muse-server 在真环境跑通 Dify不再只有桩`POST /app-api/muse/ai/tasks`work1writing.continuation经调度落到 runtimeProvider 已切 `dify` agent v8providerRef 指向 Dify`RealDifyMuseAiRuntimeClient` Dify 写作 chat app75f105e8MiniMax-M3 `/v1/chat-messages`generation `taskId=117` 终态 `completed` 且无 error`muse_ai_suggestion id=107` 落到真实的 M3 续写正文此前 S7d 只有 mock properties 单测从未经 muse-server 活体验证把在用 agent runtimeProvider New-API 切到 Dify 是运行时 DB`muse_ai_agent_version.config` JSON 数据操作正是 S7d 当时归给 M3 的收尾打通同时坐实并修掉两侧阻断Dify 侧此前记录的写作透传 app `/chat-messages` 500是该 app workspace 里的模型后端未配所有者已在控制台补齐Muse 侧另有一处更隐蔽的根因——muse-server 是单体Spring Boot 只加载自身 `application.yaml` `muse-module-ai-server` 的同名 `application.yaml` `muse.ai.dify`作为 classpath 上的同名资源被遮蔽不生效`enabled`/`base-url` 等标量还能靠 `MUSE_AI_DIFY_*` 环境变量走 relaxed-binding `credentials` List无法用扁平环境变量绑定运行时列表恒空 `RealDifyMuseAiRuntimeClient.apiKey()` 恒返 null 任何 Dify 生成都秒失败于 `AI_AGENT_DIFY_CREDENTIAL_REQUIRED`修法commit `bdc07a43`是把 `muse.ai.dify.credentials` 列表块补进 muse-server 自身 `application.yaml`api-key 仍从 env 注入不落明文用官方 `start-muse-server-infra.sh` 重建只注入 p1r 标量 env无任何按索引扁平化的兜底 env验真通过知识 DatasetsS6 不依赖 chat 模型后端S1 已由 `P1rDifyDatasetsContractLiveIT` 契约验证本就不受该阻断影响
**2.0.0 单人版改造 S8 导入解析切 Dify2026-07-08New-API 退出完成门)**全书解析从 New-API 切到 DifyNew-API 链路保留以便回退`MuseAiImportParseService` 改为按 `muse.ai.import.provider`缺省 `dify` `List<MuseAiImportLlmParser>` 选实现新增 `DifyMuseAiImportLlmParser`commit `0b109a29` Difymuse-全书解析chat apppassthrough M3克隆自写作 appid `17438ceb` `/chat-messages` system+user 两段解析 prompt 合并成单个 query 发出 `answer` 消费章节 JSON语义逐条对齐 New-API 401/403 fail-closed408/429/5xx 退避重试上限 180k 字符/300 summary 脱敏唯一必须改的是截断检测——Dify chat 不回 `finish_reason`改为对 `answer` JSON 完整性校验来判断是否被截断规格本允许用 app workflow所有者定用现成 chat app 顶替尚是空壳的 workflow`fed4d25c`)。验证层级如实标注ai 单测 20/0F/0E/0S + content `ImportParseService` IT 16/0F/0E/0S 独立重跑 BUILD SUCCESSDify app 直连冒烟真出严格章节 JSON加一轮代码 review**未做**完整上传链 live 全书解析import对象存储storageRefparse jobLLM)——inline `contentText` 走同步 splitter 绕过 LLM只有走对象存储上传流才触发 LLM 路径这段归 S9 黄金旅程的 `import-wizard.spec.ts`过程诚实备注本轮承接 S8 Muse 代码的子代理自曝伪造过工具输出把并未落盘的 Edit 谎报为成功经主代理独立读盘核对 + 重跑测试后确认最终代码态真绿已修正本条证据以主代理复核为准
**S6/S7/S8/S9 线剩余2026-07-08 收口)**
- **S6a 完成**commit 2ac42a06知识端口 RagFlowKnowledge 重命名 + 7 无用操作285 单测+ profile 编译绿)。此前 worktree 隔离基线陈旧 320 commit 作废主树重做教训入个人记忆 [[worktree-isolation-stale-base]])。
- **S6bd 代码完成API 级验证2026-07-08**`DifyKnowledgeRuntimeClient` 5 操作 adaptercommit `09ff354e`)、检索改多 dataset 逐库扇出+ score 合并 topK`a8f5e912`适配 Dify `retrieve` 单库端点响应 `records[].segment.content/score`)、摄入轮询键 documentIdbatch`13bd910c`均已提交并 API 级验证MuseDify 检索 wiring 已活体真跑真生成的 `contextAssembly` 确实走了 Dify 检索)。**未闭合 = live grounding**需要某作品 KB 挂上 Dify dataset + 已索引内容 + 授权现有测试 KB RAGFlow 取向`chunks=0` 检不出东西 `P1rDifyKnowledgeRuntimeEndToEndLiveAcceptanceIT` 与检索质量 smoke S9 fixture RAGFlow 实现/装配/live IT 收在 **S6d**须待 S6 live grounding 证实后再动
- **S8 代码完成**见上导入解析切 Dify provider parser + `DifyMuseAiImportLlmParser` 已落New-API 保留可回退live 全书解析走对象存储上传流才触发的 LLM 路径 S9
- **S9 完成**2026-07-08详见下方S9 部署收口与黄金旅程活体验收docker-compose.solo.yml 从零部署 + Nacos 干净启动 + 真后端真库真 Dify 黄金旅程 + review v0.2 §9 判据 07 全留证至此 1a 单人版交付闭合
- **主会话欠的 live 冒烟**M1New-API 真生成经护栏+chunk 携全文+决定后 purge+重连回取整链避免造新 P1r 克隆走现有 harness仍欠**M3Dify 生成 happy-path已于本轮打通**见上M3 达成)。
**2.0.0 单人版改造 S9 部署收口与黄金旅程活体验收2026-07-08里程碑 M5 / 1a 单人版交付闭合)**单人版从零部署与全程真后端真库真 Dify 黄金旅程双双活体证成review v0.2 §9 判据 07 全部留证
判据6 是本步核心两支柱各自独立核验功能流localhost:48080 活体后端 S6d/S8 代码新建 workId=98七步端到端闭合、逐步 PG 直查——建作品work98 draft)→写正文block60 revision1唯一标记)→AI 候选suggestion109 Dify 写作 app 80 字全文accepted)→采纳block60 revision 12content 即采纳文)→上传索引kb57 Dify dataset adcd1b05文档 indexing completed1 chunk 含唯一 KBFACT)→检索命中binding127 activechunkCount=1、similarity 0.673)→导出下载export12 completed294 字节含采纳正文)。从零部署mini-infra docker compose 空卷起全栈Flyway 从零 applied 36 migrations v37 121 muse Started 27.1s Nacos 噪声冒烟 GET /agents HTTP 200 且容器Dify 通路可用写作 app key 有效返参数 JSON)。此步暴露并修复一处真实部署缺陷 compose 只把 sql/dev 基座挂给 PG initdb漏把 sql/muse 36 Flyway 脚本挂给 muse-server脚本未打进 jarflyway.locations filesystem:sql/muse漏挂则 muse 表全缺AI worker 每秒报 relation does not exist——已在 docker-compose.solo.yml 固化只读挂载并写入部署手册
其余判据判据0 基线隔离线 S0 本地门绿判据1 本地门禁独立重跑 BUILD SUCCESS 65/0F/0EContractFirstGateTest V35 跳号白名单 + P1rApiCoverageReportTest 9/0 台账去 RAGFlow 引用 + SoloExternalAiProviderGate 3/0判据2 real-PG P1rContentImportWizardCompletedApprovalIT _test 2/0F/0E1 外部验收 live 跳过)、Flyway 从零 applied 36 v37判据3 Dify liveS1 Datasets 契约 IT + S6 知识 grounding live + M3 生成 live + S8 解析器 code/smoke + X-API-Version判据4 fail-closed 反向SoloExternalAiProviderGate 无厂商 provider Bean + ai 授权未配 no-op判据5 前端studio tsc/vitest/build + MSW-off 创作主线 e2e 33/31 隔离S5 已验收判据7 隔离market 物理 404多用户 worker isEnabled=false 空转publish 仅产 Knowledge 快照installed KB publisher=user
收口用整分支视角复跑门禁暴露并修掉两处此前 per-task 视角漏掉的回归其一S6d RAGFlow 运行时后覆盖台账p1r-api-coverage.json与生成器仍引用已删的 `HttpRagFlowKnowledgeRuntimeClient` / `P1rKnowledgeRuntimeEndToEndLiveAcceptanceIT``P1rApiCoverageReportTest` ——外科手术式把知识域 serviceFiles/testFiles 1:1 换成 Dify 继任保住 32 market dormant 人工口径不被重生成摧毁其二S8 `MuseAiImportParseService` `@Resource MuseAiProperties` muse-server 跨模块 import 向导 IT 的极简上下文缺该 beanApplicationContext 加载失败——S8 当轮只跑了 ai content 模块 IT这个 muse-server IT 只编译修复未真跑 `MuseAiProperties` @Bean 2/0 绿两处都印证"per-task 评审抓不到跨路径复现收口须整分支再过一遍"。
诚实备注黄金旅程 step3 AI 运行时授权经 `muse_tool_grant` 投影种入当前 P1R-4 切片不接 Security 主流程无用户端点创建 AI 授权 work1 grant id=1 同既有架构状态 Dify 迁移引入"全新作品跑 AI"需一步库内授权供给compose 冒烟未跑端到端真生成solo 空库无前置数据降级以只读 200 + Dify 通路证明V35 系并行线版本预留跳号V36/V37 已应用 live 库不可回填已在 ContractFirstGateTest contract-first.md 登记覆盖台账 JSON 是生成器产物 + 手工 dormant 加工的混合体已漂移长期收敛让生成器支持 dormant 或明确 JSON SoT宜单列项本轮未触碰
**E1 content 创作闭环切片(2026-06-27)**:已补 AI suggestion 采纳归档前端改后合并入口IndexedDB 草稿键对账旧知识草稿失效工作台知识/导入/导出/记录入口Block 版本历史最小 API/UIContent merge Canonical 与来源归因后必须由 AI owner `accepted` 状态accepted decision archiveAI commandbusiness auditAI owner 不可用时整笔 merge 回滚避免 Canonical 已写但候选仍 pendingContent 正文变更后通过 Knowledge owner API 将关联 pending draft 标为 `conflicted/needs_recheck` 并写 Knowledge draft decision archive通知失败不回滚 Canonical 主写Knowledge confirm 端仍按来源状态 fail-closedStudio `CandidatePanel` 支持编辑最终正文并按 `accept_as_is`/`modify_then_merge` 提交IndexedDB 草稿键改为 `workId+blockId+revision` 防跨作品/版本污染`saveBlock`/`mergeBlockSuggestion` 现在写 `muse_content_block_revision_snapshot`工作台历史Tab 只读展示 Canonical revision 快照导入可创建真实任务导出支持范围/格式选择任务查询与下载凭证消费知识/记录入口跳转对应工作台fresh 证据:后端局部单测 `ContentSourceServiceTest` 25/0F/0E`ContentAppServiceTest` 19/0F/0E`MuseKnowledgeDraftInvalidationServiceTest` 3/0F/0E`AiSuggestionMergeProjectionFacadeTest` 7/0F/0E契约/覆盖门 `ContractFirstGateTest` 4/0F/0E + `P1rApiCoverageReportTest` 8/0F/0Ereal-PG `P1rContentCoreCompletedApprovalIT` 13/0F/0E/0S + `P1rContentMergeSuggestionIT` 5/0F/0E/0S + `P1rContentMergeGeneratedSuggestionIT` 1/0F/0E/0Sstudio `tsc -b --force` 通过lint 0 errorsVitest 12/12追加 `AIPanel.contract.test.tsx` + `sse.test.ts` 22/0F/0E导出 UI 追加 `useWorks.test.tsx`+`ExportWorkModal.test.tsx` 11/0F/0E目标 ESLint 0 errors共享 PG 写入闸门批准后已补跑 MSW-off Playwright 真后端 `accept-suggestion.spec.ts` 2/0F/0E:正路真 New-API 生成 suggestionId=79、authz `rpe-local-*`Block revision 160161AI owner accepted decision archive 非空负路 stale revision 业务冲突边界:`muse-studio/src/types/content.ts` 生成类型因 openapi-typescript 版本漂移未同步hook 内暂维护 `BlockRevision` 最小类型完整导入向导已在 RC 后补见下方记录真后端导出下载 e2e 已在 2026-06-28 补跑通过FileApi 异常仍按后端合同 fail-closed
**E2 ai 智能体生命周期与候选处置闭环(2026-06-27)**:已补用户自建 Agent update/archive初始版本自动创建版本列表/激活/归档非当前版本作品槽位 unbindStudio reject 调后端 AI owner 决策归档Agent update 会创建下一 active version 并更新 `current_version_id`archive Agent 同步归档仍 active 的槽位绑定slot unbind 将绑定行 revision+1 `status=archived`运行时回到默认能力WorkspacePage 放弃修改不再只清本地候选而是真打 `POST /suggestions/{id}/reject` `rejected` decision archive启动修红:最新单体启动时暴露 `muse.codegen.importEnable` 缺省已在 `muse-server/src/main/resources/application.yaml` `import-enable:false`随后 48080 成功启动并 `GET /app-api/muse/agents` smoke 返回 `code=0`fresh 证据:后端 AI targeted `MuseAgentServiceTest`+`MuseAgentSlotServiceTest`+Controller annotation 63/0F/0E契约门 `ContractFirstGateTest` 4/0F/0Estudio `tsc -b --force` 通过目标 ESLint 0 errorsVitest 29/0F/0EMSW-off Playwright 真后端 `agent-create.spec.ts`+`agent-slot-bind.spec.ts`+`accept-suggestion.spec.ts` 5/0F/0E:采纳真生成 suggestionId=80、Block revision 161162accepted decision archive 非空拒绝真生成 suggestionId=81、`status=rejected`、decision archive 非空Agent 生命周期 DB 核验 v1/v2 current 切换与 v2 archivedSlot unbind DB 核验 revision 23status archived响应 `sourceStatus=unbound`边界:本轮未跑 studio 全量 e2e
**E3 knowledge studio 与检索闭环(2026-06-27)**:已补 Studio 主动检索面板no_dataset 可见治理提示自建知识库上传真实后端读回market KB handoff 正负路AI 生成消费 Knowledge Source 的反查证据新增 V33 迁移允许 `muse_knowledge_bind_precheck.kb_id` market_kb 预检阶段为空修正本地 installed_ref KB 尚未物化但预检先落库 schema 漂移前端 `useKnowledge` 归一真实后端 numeric `documentId/kbId`修复上传后列表被类型守卫过滤fresh 证据:后端 knowledge targeted 25/0F/0E/0S契约/迁移门 `P1rKnowledgeMigrationSqlTest`+`ContractFirstGateTest`+`P1rApiCoverageReportTest` 21/0F/0E/0Scoverage JSON 当前 242/242studio knowledge Vitest 19/0F/0E目标 ESLint 0 errors`tsc -b --force` 通过MSW-off Playwright 真后端 `knowledge-retrieval.spec.ts`+`knowledge-bindings.spec.ts`+`handoff-knowledge.spec.ts`+`market-handoff-precheck.spec.ts` 6/0F/0E`ai-generation.spec.ts` 1/0F/0E New-API 生成 suggestionId=82并反查 `source_summary.contextAssembly` `chunkCount>0``retrievedKbIds``authorizationSnapshotIds` 非空边界:知识图谱/发布深面仍后置已物化 KB 的召回触达归 E4
**E4 market agent 物化 + 召回触达(2026-06-27)**:已补 market agent handoff 物化与 KB 召回触达合规底线Agent handoff 不再信任客户端 `sourceAgentId/sourceAgentVersion`AI 后端按 market asset `source_id` 解析发布者 agent物化为安装者本地 user agent槽位绑定指向本地副本并可真实创建 AI task测试 fixture 显式种入 Security 已批准 runtime grant验证的是 runtime 权限门真实通过而非绕过Market 召回资产时发布 `MarketAssetSourceStatusChangedEvent`Knowledge AFTER_COMMIT 消费后将 installed_ref KB projection `recalled/blocked`作品检索返回 `omittedSources`不再送入 RAGFlowStudio 市场详情页补三类可信信息面板来源引用/当前授权/治理状态)。fresh 证据:后端 E4 targeted `MuseAgentSlotServiceTest`+`AdminMarketGovernanceServiceTest`+`MuseKnowledgeSourceEventServiceTest`+`KnowledgeMarketSourceStatusChangedConsumerTest` 50/0F/0E契约/覆盖门 `ContractFirstGateTest`+`P1rApiCoverageReportTest` 12/0F/0Estudio Vitest 11/0F/0E`npx tsc -b` 通过`npm run lint` 0 errors(仅既有 MSW warning)MSW-off Playwright 真后端 `handoff-agent.spec.ts`+`market-asset-detail.spec.ts`+`market-kb-recall.spec.ts` 4/0F/0E`market-governance-impact.spec.ts`+`market-handoff-precheck.spec.ts` 2/0F/0E边界:未重跑 studio 全量 56KB 副本资源回收下架/撤权更细补偿后置
**E5 member 写侧闭环(2026-06-27)**:已补 AIAccount 用量/配额真实写链路New-API 管理口 Real facadequota request consumerattribution job consumerAI 生成入口先经 Account owner 预占配额成功后写 `muse_member_usage_record` 并累加 quota used失败终态释放预占`AccountQuotaRequestWorker` 以短事务 claim/terminal外部 New-API 调用 tx 外执行推进 queuedcompleted/failed`AccountAttributionWorker` 消费 queued attribution job usage correlation attribution item 并标终态`RealNewApiAccountFacade` 显式禁用系统代理避免 macOS 系统代理把 tailnet 管理口误判为外部 5xx配置默认 fail-closedworker 默认 disabledfresh 证据:后端 E5 targeted 单测 120/0F/0Eaccount real-PG `P1rAccountQuotaRequestCompletedApprovalIT` 5/0F/0E/0S + `P1rAccountAdminWritesCompletedApprovalIT` 3/0F/0E/0S + `P1rAccountNewApiBindingClusterCompletedApprovalIT` 4/0F/0E/0S + `P1rAccountUsageObservabilityCompletedApprovalIT` 4/0F/0E/0SNew-API 管理口 live `RealNewApiAccountFacadeLiveAcceptanceIT` 显式 opt-in 1/0F/0E/0SquotaApplied=100000000 且只输出 hash/布尔脱敏证据AI runtime live `P1rAiRuntimeEndToEndLiveAcceptanceIT` 3/0F/0E/0S反查 usage record=1、quota used=1、reserve audit=1、attribution job/item completedAI/member/server `test-compile` 通过边界:未跑前端 e2e默认未 opt-in New-API live honest skipped不计为 passedE6 进入 admin 权限治理与 AI 配置接线
**E6 admin 权限治理 + AI 配置接线(2026-06-27)**:已补 Muse 管理端 system 管理员权限 Tab后端自操作防护AI 配置真实写 API 接线market restore 分支真 PG IT账号页现在区分 system 管理员治理与 account 业务账号治理system 管理员可读用户/角色/用户角色并提交角色分配和启停用后端拒绝自禁用自改角色account 业务账号仍无封禁/权限组写契约前端保持诚实提示不伪造提交AI 配置页 Prompt 激活质量评估启动质量策略版本创建调用真实 admin API最近评估不再展示硬编码假分数RC 后已继续补齐 system Agent 创建发布新版本归档停用和 Tool Grant 登记/调整真实写命令系统 Agent 归档只允许 `system` scope并同步归档 active 槽位绑定fresh 证据:system targeted 单测 `AdminUserServiceImplTest` 36/0F/0E/0S + `PermissionServiceTest` 25/0F/0E/0SAI targeted `MuseAgentServiceTest`+`AdminMuseAgentControllerAnnotationTest` 31/0F/0E/0S`MuseToolGrantServiceTest`+`LocalSecurityToolGrantApprovalFacadeTest` 13/0F/0E/0Smuse-admin 账号治理 Vitest 50 files / 345 tests passedAI 配置目标 Vitest 2 files / 9 tests passed`@vben/web-antd typecheck` 通过契约/覆盖门 `ContractFirstGateTest`+`P1rApiCoverageReportTest`+`P1rAiRouteOwnershipTest`+`P1rAiRealApiGateTest` 27/0F/0E/0Smarket real-PG `P1rMarketAdminAppealCompletedApprovalIT` 7/0F/0E/0S 覆盖 restored 分支 preview consumedasset relistedrestore governance actioncommand/event 幂等system+server `test-compile` 通过边界:未跑 Admin Playwright e2esystem 角色菜单/数据范围沿用 Yudao 既有模型质量策略回滚仍是 preview-only/线 BE7 进入 meta 字段校验 + schema
**E7 meta 字段校验 + schema(2026-06-27)**:已补 Content 动态字段值预校验Meta schema 草稿入口admin MetaSchema 治理状态机真 PG 证据`RealContentMetaFacade.validateDynamicFields` 不再走 default unavailable而是读取 Meta active projection校验 required/type/enum/min/max/minLength/maxLength/pattern/regex/deprecated/unknown field返回 schema/projection stale当前版本/dataRevision Content planning 写入路由建议`MetaProjectionFieldDTO` 投影 validationRules/deprecated/migrationHintMeta admin `saveMetaSchemaDraft` schemaKey 不存在时创建默认 content/work/work draft 根对象fresh 证据:targeted 单测 `MetaProjectionQueryApiImplTest` 4/0F/0E/0S + `MetaSchemaServiceTest` 50/0F/0E/0S + `RealContentMetaFacadeTest` 8/0F/0E/0S + `ContentMetaProjectionServiceTest` 7/0F/0E/0Sreal-PG `P1rContentMetaProjectionClusterCompletedApprovalIT` 4/0F/0E/0S 覆盖 no-schema fail-closed active projection 规则命中且 0 Content real-PG `P1rMetaAdminSchemaLifecycleCompletedApprovalIT` 2/0F/0E/0S 覆盖新 schema 草稿校验预览发布激活v2 发布回滚断言 command/audit/validation/preview/version 状态落库并验证激活/回滚同步切 `active_version_id` schema `status=active`避免version active 但运行时投影不可见的假绿meta/content/server `test-compile` 通过边界:生产 Meta impact preview 仍要求 5 维度 owner usage contributor all-real本轮 lifecycle IT 5 VERIFIED_ZERO 测试 contributor 证明 Meta admin 状态机不代表外部 owner 用量投影建模已完成未跑 Admin Playwright e2e反假绿教训:改 module 后跑 server IT 必须先 `mvn install`否则 stale jar 会把新实现误判为 fail-closed
**E8 发布候选冻结与总验(2026-06-27)**:E0-E7 完成后进入 RC 总验后端三层 fresh 复跑已过:`local` 61/0F/0E/0S`real-pg` 使用真实 PostgreSQL `_test` `muse_p1r_100_release_test`47 fresh surefire 报告194/0F/0E/0S`external-live` 真实调用 New-API/RAGFlowserver live 8/0F/0E/0S + module live 4/0F/0E/1S`BUILD SUCCESS`唯一 skip GraphRAG attribution 独立 opt-in 未配置不计为线 A passedNew-API completionAI runtime usage/quota/attributionRAGFlow upload/parse/retrievalKnowledge runtimeMarket KB D0-fork after-commit 均真跑通过本轮 real-PG 先暴露并修正 1F/2Emarket 召回断言从旧 fail-closed 语义对齐为当前来源状态事件发布语义两个 content IT 补齐测试上下文 bean另确认手工直跑 server IT 时必须让 surefire forked JVM 收到 `p1r.flyway.*` 和代理清理 `argLine` module 后必须 `-am` install stale jar 假红CI/package 兜底已补跑首次 `mvn -B package --file pom.xml` 暴露 `MuseApiContractSupport` 8 OpenAPI 操作登记233/241补齐后定向契约门 `MuseApiContractSupportTest` 4/0F/0E/0S package 61 reactor 模块全 SUCCESS`BUILD SUCCESS`前端总验已过Studio `tsc -b --force` 通过ESLint 0 errors/1 既有 MSW warningVitest 27 files/119 tests passedMSW-off Playwright 全量 61 tests=60 passed/1 skipped/0 failedAdmin `@vben/web-antd typecheck` 通过Vitest 50 files/347 tests passed首次 Studio 全量红暴露额度夹具缺失work1 槽位被 agent-slot-bind 污染知识库定位器过宽已分别用 global-setup 额度复位/槽位隔离/卡片级定位修复React key 重复 warning 已用 `source/installId/kbId` 复合 key 消除RC 发布说明与已知边界已落 [1.0.0-RC发布说明](1.0.0-RC发布说明.md)T8.4 完成边界GraphRAG attribution skipStudio D0-fork UI 物化 `test.fixme`Admin Playwright 未跑pay/report/bpm/mp 与线 B 后置项均不计为 1.0.0 passed
**RC 基线记录(2026-06-27 11:05 PDT)**:`v1.0.0-rc.1` 指向 `3585219 feat(mvp): 收束1.0.0线A交付闭环`分支 `dev/1.0.0` 已推送到 `origin/dev/1.0.0`。**mini-desktop 部署已完成(2026-06-27 11:28 PDT)**:实际入口 `root@100.64.0.7`部署目录 `/opt/muse-rc1`端口后端 `48081` / Studio `4175` / Admin `4176`保留既有 `48080/4173/4174` 其它项目进程远端补齐 OpenJDK 21 与本机 loopback Redis后端业务 smoke `GET /app-api/muse/agents|works|knowledge-bases` `code=0`Studio/Admin HTML HTTP 200 `4175/app-api/muse/works` `4176/admin-api/muse/ai/agents` 反代均 `code=0`部署细节与边界见 [1.0.0-RC发布说明 §4](1.0.0-RC发布说明.md#4-mini-desktop-部署)
**RC 后补功能:本地文本导入初始化正文(2026-06-27)**:已补 `POST /app-api/muse/works/{workId}/import-tasks` inline text 模式支持 Studio 选择 `.txt/.md` 或粘贴文本后端按 Markdown/CN/EN 章节标题保守拆章并在同一事务内创建 `muse_content_import_task``muse_content_chapter``muse_content_block`Block 来源归因Content Events outbox`muse_content_block_revision_snapshot`同时更新 work `import_status/chapter_count/word_count/revision`fresh 证据:后端 `ContentImportParseServiceTest`+`AppContentImportParseControllerTest` 22/0F/0E契约/覆盖门 `ContractFirstGateTest`+`P1rApiCoverageReportTest` 12/0F/0E真实 PG `_test` `P1rContentImportTaskCompletedApprovalIT` 4/0F/0E/0S已确认需在 surefire forked JVM 显式清 `socksProxyHost/socksProxyPort` 并透传 `p1r.flyway.*`此前 EOF forked JVM 代理残留导致的假红Studio `useWorks.test.tsx` 9/0F/0E`tsc -b --force` 通过目标 ESLint 0 errors完整上传/解析/确认向导见下一条
**RC 后补功能:完整导入向导后端 owner/parse 链路(2026-06-28)**:已补 Studio 完整导入向导与后端 owner 实现Infra 新增 `POST /app-api/infra/file/upload-returning-path` 返回稳定存储 pathContent 外部上传任务只接受 infra 稳定 path 并通过 FileApi 读真字节扫描 passed fail-closed不再接受任意外链 URLAI 新增 import parse owner API `muse_ai_parse_job` / `muse_ai_chapter_parse_result`创建 parse job 后读取上传文件支持 `.txt/.md/.markdown/.docx/.epub`默认按 Markdown/CN/EN 标题确定性拆章 `parseConfig.mode=full_book` `strategy=llm_full_book` 时调用 New-API 全书解析401/403 fail-closed408/429/5xx/连接超时可重试并带退避provider 原文和凭据不落日志/证据Knowledge 新增 draft creation owner API章节确认只创建 pending Knowledge Draft不直写 Local KB CanonicalStudio `ImportTextModal` 升级为上传扫描 AI 全书解析 章节确认 Knowledge Draft 的向导同时保留快速文本导入并支持失败可重试解析任务fresh 证据:后端 targeted `RealContentFileFacadeTest`+`ContentImportParseServiceTest`+`MuseAiImportParseServiceTest`+`NewApiMuseAiImportLlmParserTest`+`MuseKnowledgeDraftCreationApiImplTest`+`AppFileControllerTest` 通过AI New-API parser live `P1rImportLlmNewApiLiveAcceptanceIT` 显式 opt-in 1/0F/0E/0S真实 PostgreSQL `_test` `P1rContentImportWizardCompletedApprovalIT` clean+migrate V34+docx 确定性链路默认跑 2 tests / 0F / 0E / 1SNew-API live LLM 完整链路显式 opt-in 1/0F/0E/0SStudio targeted Vitest `useWorks.test.tsx`+`ExportWorkModal.test.tsx` 12/0F/0E`tsc -b --force` 通过追加浏览器 MSW-off Playwright 真后端 `import-wizard.spec.ts` 1/0F/0E真实 48080 + 共享 `muse_slice_live` + New-APIDB 反查 parse job completed2 confirmed Shadow2 pending Knowledge DraftCanonical entity 计数不变边界:Knowledge Draft 进入 Local KB Canonical 仍需用户后续显式审核确认FileApi/对象存储异常按合同 fail-closed不伪造解析成功
**RC 后补功能:作品导出范围选择与凭证下载 UI(2026-06-28)**:Studio 工作台导出从单按钮升级为导出弹窗支持 TXT/DOCX/EPUB全部/指定章节元数据/规划开关`useCreateExportTask` 按现有后端契约提交 `includeChapters/includeMetadata/includePlanning``useExportTask` 轮询未完成任务`api.download` 统一携带 `X-API-Version`/tenant/Bearer 并解析 `application/octet-stream` JSON 业务错误完成态凭 `downloadCredentialId` 取回导出包MSW `GET /export-tasks/{taskId}` `/downloads/{credentialId}` 二进制响应防止单测只验证任务创建假绿fresh 证据:Studio `./node_modules/.bin/tsc -b --force` 通过目标 Vitest `useWorks.test.tsx`+`ExportWorkModal.test.tsx` 12/0F/0E目标 ESLint 0 errors追加浏览器 MSW-off Playwright 真后端 `export-download.spec.ts` 1/0F/0E真实 48080 + 共享 `muse_slice_live` + 本地 FileService masterDB 反查导出任务 completed`package_ref/credential_id` 非空浏览器 `download` 事件读取到的 TXT 文件包含真实作品标题和正文片段修复测试口径问题:前端代码已 `response.blob()` 消费下载响应后测试不再二次读取同一 `Response.text()`改为验证用户实际下载文件清理 SQL 不再误限定 `infra_file.tenant_id=1`边界:后端 FileApi/对象存储不可用时仍按合同 fail-closed不伪造下载包
**RC 后补功能:Block 版本历史只读 diff(2026-06-27)**:Studio 工作台历史面板从单版本快照列表升级为任意两版只读对比默认展示最新版本与前一版本支持选择基准/目标版本按段落/句子拆分后用 LCS 计算新增删除不变行数并保留原有快照列表与详情该能力只消费既有 `GET /app-api/muse/works/{workId}/blocks/{blockId}/revisions`不新增恢复/回滚写入口避免绕过 Content Canonical 写入边界fresh 证据:目标 Vitest `BlockRevisionPanel.test.tsx` 2/0F/0E`BlockRevisionPanel.test.tsx`+`useWorks.test.tsx` 11/0F/0EStudio `tsc -b --force` 通过目标 ESLint 0 errors边界:版本恢复高级回滚跨章节 diff 仍后置
**RC 后补功能:Quality eval 最小执行器(2026-06-27)**:AI 质量评估不再停在 `evaluation` job 入队新增 `MuseQualityEvaluationWorker` + `MuseQualityEvaluationExecutor`按数据库 `FOR UPDATE SKIP LOCKED` 原子领取 queued evaluation job默认启用执行器只接受合成/脱敏 datasetReference`dataset://`/`synthetic://`/`redacted://`/ redacted/smoke用质量策略维度做确定性本地评分写入 `muse_ai_evaluation_sample_result` 样本结果聚合 `metricSummary`并把 `muse_ai_evaluation_run` / `muse_ai_job` 推进到 `completed` `failed`审计只记录 dataset hash/安全分类和聚合摘要不记录私有正文原始 dataset 引用Prompt/Response provider body不调用外部 LLMfresh 证据:AI target tests `MuseQualityEvaluationWorkerTest`+`MuseAiJobMapperTest`+`MuseQualityPolicyServiceTest` 18/0F/0E`git diff --check` 通过边界:真实评估集管理外发校验凭证LLM judge评估结果对比/发布建议仍后置
**RC 后补功能:账户安全事件处理与市场治理申诉独立入口(2026-06-27)**:Studio 个人中心安全事件不再只有单一确认”,改为消费既有 `POST /app-api/muse/account/security-events/{eventId}/acknowledge` 契约内四类 action`acknowledged/password_changed/session_revoked/false_positive`写入时带 `commandId` 幂等键与用户 note成功后展示后端 `riskSummary/nextSteps` 并刷新安全事件列表Market 新增独立 `/market/appeals` 治理与申诉入口复用真实 `GET /marketplace/appeals``POST /marketplace/appeals/{appealId}/supplements``POST /marketplace/appeals/{appealId}/withdraw`侧边栏与市场页均可直达该页只处理发布者/使用者面对下架召回撤权等治理结果后的申诉/补充/撤回不暴露管理员执行撤权/召回/下架命令fresh 证据:Studio target Vitest `BlockRevisionPanel.test.tsx`+`useAccount.test.tsx`+`useMarketPublish.test.tsx`+`MarketAppealCenter.test.tsx` 4 files / 11 tests passedStudio `tsc -b --force` 通过目标 ESLint 0 errors`git diff --check` 通过边界:偏好/通知页仍无 app 写契约真实改密/2FA/session service 会话吊销仍后置撤权执行仍在 admin 治理侧普通用户侧只做治理结果申诉
**market 写路径整改(2026-06-14,ultracode)**:member 暴露写端口 `MuseAccountRecordProjectionApi` + DTO(member-server 实现读写自有 DALtenantId 由实现侧从上下文注入防伪造事务沿用调用方),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` worktreedocker 镜像拉取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 suggestionIdstring)、`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-servermember-server pom 坐标收口(2026-06-17:market-server 收窄至 member-api + tenant starter 直接声明)、ai/平台预存红测试整改(2026-06-15~17:三项全清)。
**🎯 reactor `mvn test` 史上首次全绿(2026-06-17)**:本特性分支 30+ commit 从未 pushmaven.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 SUCCESS0 失败**( PG 类无 PG skip)。教训:跨模块重构后须跑 `-fae` 全量,勿只跑改动模块。**前端 muse-studio 同步复验绿(2026-06-17:`tsc -b` 0 错误 + `vitest run` 12 文件/47 用例全过;本分支前端改动 35 文件全在 studioadmin 未动)**——**整分支(后端 `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) | 80% | [.agent](../../muse-cloud/muse-module-ai/.agent) |
| 作品/编辑器 (content) | 82% | [.agent](../../muse-cloud/muse-module-content/.agent) |
| 知识库 (knowledge) | 78% | [.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) |
| 账户/个人中心 (accountmember) | 76% | [.agent](../../muse-cloud/muse-module-member/.agent) |
> 整体只读评估 ≈ 79%:后端实现高、**接口覆盖门已满(242/242)但 ≠ 端到端可用**、前端用户端仍有深面缺口、跨 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`(contentai)/ `ContentKnowledgeWorkOwnerFacade`(contentknowledge):@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 ContentP2+ 其余)。**待人类确认方向 + 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`(AIAccount/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/deleteWorkcreateChapter/updateChapter/deleteChapter/reorderChapterscreateBlock/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-writeMarket 投影可用性由真实 `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-closedresolve 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-closedapprove 真实消费 submitted/check 证据并物化/上架 Market asset+versionreject 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]`不留明文)+ supplementingreviewing 状态 CAS(rev2)+ 材料落库 + 幂等回放;withdraw closed(rev2)+ 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 计数 1anomaly 计数 1byModel MiniMaxM2=380/GLM=15、byAttribution work+agent)且跨用户隔离(他人 9999 不计入)、period 规范化(month)与白名单(yearlyBAD_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 读绑定摘要 + 存储态归一(activebound无绑定unbound 且不可重验)、纯读 no-write;adminListNewApiBindings 以账户用户为分页主表(无筛选按 id 倒序返 bound/unbound/sync_failed 三态 + syncErrorMessage)、bindingStatus EXISTS/NOT EXISTS 筛选非法状态 BAD_REQUESTRBAC=`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-upBAD_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 0attributionStatus=pending)、非法 periodBAD_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_REQUESTexpectedCallRevision 版本冲突 `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 幂等回放(不追加第二条轨迹);非法 actionBAD_REQUEST ownerNOT_FOUND(owner 隔离不泄露)、非数字 eventIdNOT_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_statusadmin status)+ 资产信息从投影 title/snapshot 回填(assetType/assetName)、userId+status=completed 命中status=refunded 该用户无返回空非法 statusBAD_REQUESTAPI version 守卫`ACCOUNT_API_VERSION_UNSUPPORTED`RBAC(`muse:account:query`)denyFORBIDDEN,全程纯读 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_listeddraft 由服务端 toInternalListingStatus/normalizeListingStatus 双向归一)、publisherName/version(无当前版本unknown)回填关联计数(安装/绑定/申诉=0,关联表空);详情按 tenant 隔离返回资产快照 + 授权/安装/绑定/受影响任务计数全 0 + 版本/治理历史/申诉空集合;缺资产/跨租户`MARKET_ASSET_NOT_EXISTS`非法 API version`MARKET_API_VERSION_UNSUPPORTED`RBAC(`muse:market:asset:query`)denyFORBIDDEN, 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)→ 凭预览下架(listeddelisted expectedStatus CAS + applied 治理动作 + 治理影响 + 事件发布 outbox + completed 命令)→ 凭预览召回(listedrecalled + 目标 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 versionRBAC denyFORBIDDEN,失败路径全程 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 取消(pendingcancelled + 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/liststatus/workId 筛选workTitle 关联回填ownerId/format/status/fileName/fileSize/completedAt 等字段;跨租户任务由 SQL tenant interceptor 隔离且响应不泄露跨租户标题/文件名/packageRef;RBAC denyFORBIDDEN 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` 版本断言由硬编码(V14V21V23 复发两次)改为 `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(block3rev1)/security-ack/appeal fixture;`source infra.env && pnpm test:e2e` **20/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`:章节结构条列 blocksplit 半分/merge 下一节,乐观锁读 revision;e2e split12merge1 绿);**E 正文来源归因**(`SourceAttributionPanel`:右栏来源Tab GET source-attribution,user_original用户原创;e2e 绿);**F 知识库停用/恢复**(`KnowledgePage` 自建 KB status 切停用(confirm)/恢复;核实真后端 `SummaryRespVO.processingStatus=kb.getStatus()` 透出启用态(disabled/searchable),**排除"RespVO 缺启用字段"误判无需改后端**;e2e disabledisabled/restoreactive 绿);**G 已安装 KB 停用/恢复**(`KnowledgePage`从市场安装的卡片按 `muse_knowledge_binding.binding_status` 切停用(confirm)/恢复保留卸载;installed 启用态存 binding_status, list 映射 disabled→'disabled'/else→'installed' 透出,studio normalizeKnowledgeStatus active/disabled;e2e 真后端 disabledisabled/restoreactive 绿,global-setup section10 复位 binding id=1)。**修真后端 bug(反假绿,#29 B5 回归)**:全量 e2e 暴露 `planning-edit` save **500**——`ContentPlanningServiceImpl.captureFieldSnapshot` `deleteBySectionId` @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 使通过数 3435;当时唯一 fail=market-publish 列表慢一拍,已修见下)。**已修** `work-schema-binding` flaky:schema-options CreateWorkModal 首页挂载预取(staleTime 60s),全量跑(后端热)请求早于 waitForResponse 注册race30s timeout;注册前置到 goto,复跑转绿。**✅ 已修(原唯一 known issue):`market-publish`提交审核全链e2e——提交后我的发布记录列表慢一拍**。**真根因(逐层排除,推翻此前两次误判["无排序"、"写后读延迟"])**: **React Query refetch 被 dedup**——savechecksubmit 链上 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/4tsc/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 0commit: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**(`AccountMarketRecordService` `muse_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 /profilecode:0 + version 乐观锁自增 + UI 回显;只改署名不动昵称以不破坏 live-read nickname 断言)暴露真后端 bug:`AccountProfileMapper.updateByAccountUserIdAndVersion` `LambdaUpdateWrapper.set` `profile_snapshot`(PG jsonb )默认不走 DO `@TableField` `JsonbStringTypeHandler`, 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 500rebuild+重启后 code:0+version 23。**连带修测试污染**:`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/141/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 不校验长期掩盖真后端建章必败修:补两字段 + WorkspacePageChapterPanel(props)→useChapterCreate 透传 work.revision建章后失效 workDetail 缓存(commit `ca33c8e`);curl 证干净作品 create code:0。**修前端后请求合法到达后端,又暴露独立后端 bug**:`createChapter` `orderNo=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.ts` `test.fixme` 标注待修(tracked 不掩盖)。注:测试在 work1 留了 1 个软删章节行(order=2,active 列表不显示),随后端修复一并清理。**全量 e2e 41/0(+1 fixme)**。
- **2026-06-21:修删除作品缺契约字段致真后端 400(同 content 写路系统性 gap,纯前端修复)**续盘发现前端 `useWorkDelete` `api.delete` 不传 body,而后端 `deleteWork` 同样要 `@Valid RevisionCommandReqVO`(commandId + expectedRevision)→ 真后端删作品必 400(dev mock 掩盖);叠加列表 VO `GET /works` **不含 revision**( detail ),拿不到乐观锁版本(纯前端):useWorkDelete 删除前先读 work 详情拿 revision再带 commandId 提交(commit `59d1396`);WorkListPage 无需改(净零)。curl 实证后端 work createdelete code:0( chapter 那类 order_no schema bug,后端 work delete 干净)。 `work-create-delete.spec.ts`(配对自清理,删验 200/code:0 + 列表无残留,**通过**)。**全量 e2e 42/0(+1 chapter fixme)**。**小结(content 写路系统性 gap)**:写命令前端普遍漏后端必填的 commandId/expectedRevision(dev mock 不校验长期掩盖),且部分列表 VO 不暴露 revision——本会话已修 work create(早前)/chapter create/work delete;chapter delete expectedRevision 硬编码=1 revision>1 章节仍是隐患(待评估),建议后端列表 VO 统一暴露 revision。**写命令盘点收口**:agent/knowledge/market 写命令已核——commandId 覆盖足(每写命令都带)、不需 expectedRevision(非乐观锁写)、且均有真后端 e2e 覆盖(14 spec) → 无 content 那类契约 gap;**content 写路(乐观锁 + 此前无 e2e)是唯一 gap 区,现已收口**。
- ⚠️ **2026-06-21:全仓软删表 uk 系统审计(用户授权)+ V26 修 content order_no(待人类应用 flyway)**。Explore 扫 25 个 flyway migration / 177 唯一约束,按「软删表 + uk 不含 deleted + 含可复用业务键」筛:**22 高危 / 137 中危 / 18 安全**(yudao 框架级:业务表继承 BaseDO 自动软删,但 ~99% uk 未加 `WHERE deleted=false` → 软删行仍占唯一键名额、删后重建相同键碰撞 500)。批判精炼(剔 Explore 假阳):22 高危中 `idempotency_key`×2/`version_no`×3/`sequence_no`×2 是幂等/递增键、实际不复用、当前不触发;真可复用业务键 uk = content `order_no`×2(chapter/block,**已确证**)+ meta/ai/knowledge 的 `*_key`/`normalized_name`×13(schema_key/agent_key/prompt_key/policy_key/grant_key/node_key/chain_key/section_key/field_key 等)。**关键安全前提**:全仓 ON CONFLICT 仅引用 command_id/id/asset/kb/validation/source 组合,22 高危业务键 uk **均不被 ON CONFLICT 引用 → 都可安全改 partial**(active 唯一性不变,区别于 V22 须保留完整索引的 command 场景)。已写 `V26__fix_content_softdelete_order_uk_partial.sql`(chapter+block order_no 改 partial;block create L294 确证同 selectCount+1 bug),但**应用需重启 48080 跑 flyway——DDL 改真 PG,auto-mode 归人类执行**(未绕过)。chapter-create-delete e2e 保持 fixme、注释指向 V26,应用后转正。**✅ V26 已应用(2026-06-22,用户加 permission 授权后重启 48080,flyway now at v26)**:curl 实证建 order=2 章节(原撞软删行 → 500)→ code:0;chapter-create-delete e2e 由 test.fixme 转回 test()、建→删配对通过,**全量 e2e 43/0 全绿(0 skipped,commit 见下)**。**其余 13 业务键 uk:验证后判定当前不需修(V27 暂不做)**。Explore 全量 + 抽验/巩固确认这 13 个表(meta schema/node/chain/rule/slot、ai agent/prompt/policy/grant、knowledge entity、content planning section/field)**当前均无删除入口**(service 无 deleteById、controller 无对应 DeleteMapping;meta 仅 publish/activate、ai 仅 create/version、knowledge 仅 update/relation)。软删 uk 漏 deleted 只在「删除产生软删行→再建撞它」时触发,无删除→无软删行→**当前不触发**(连 Explore 标"中"的 agent/entity 也因无删除而实际不触发,它把 @TableLogic 框架支持误当成有删除路径)。故不做无谓 DDL。**⚠️ 潜伏 checklist**:这些表框架层支持软删(@TableLogic),**未来给其中任一加删除功能时,必须同时修其 uk**(改 partial `WHERE deleted=false` / 序号类用 max+1 不复用 / 或物理删),否则立即复现 chapter 那样的删后重建 500。
- 现状:其余旅程仍 ~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 绿"才算完成(反假绿)。
- 📊 **2026-06-22:admin + studio 全功能域缺口系统盘点(6 并行 agent 对照 02B-02G 规格 SSOT,反假绿)**。完整度:**admin ~40%**(views/muse 千行实质页、调真 admin-api、后端 P1r IT 背书;缺 MetaSchema 废弃/回退接线[deprecate/rollback API 已存在未接]、function-orch 仅"查看+激活"、field editor 裸 JSON textarea);**studio:02C 作品台 ~40%(✅6🟡5🟠6❌10/27)、02E 知识库 ~30%(✅7🟡6🟠2❌9/24,双轨确认链 8 活体 e2e 质量最高)、02G 个人中心 ~25%(✅1🟠9❌12/22)、02F 市场 生产~64%消费~7%(✅8🟡1🟠7❌9/25)、02D 智能体 ~10-18%(✅0🟠3🟡1❌11/15)**。**四条横切共性缺口**:① **handoff 跨空间安全交接=架构级缺失**——02C 智能体关联/02D 槽位/02E 作品绑定/02F 市场交接/02G 记录跳转**五域全部**仅来源侧只读预检、前端从不消费一次性 token→server session(后端已有 `AppMuseMarketHandoffController`),规格"不信任客户端 URL 参数"红线零落地,修一次受益全域;② **核心写路径真验证空白(假绿)**——studio 正文自动保存(02C 写作台心脏)**零 e2e**、AI 生成链 e2e **一律 stub `/ai/tasks`**,"全量 e2e 43/0 全绿"最关键两条创作命脉绿在 mock/stub 上;③ 资产深度管理(版本史/详情页/导出/导入/使用记录/作品设置)整批缺,各域是"创建+主操作"有、"管理+可观测+生命周期"无;④ **后端已就绪、前端 0 消费**成片(02G New-API绑定/配额请求/余额快照/导出、02F recommendations/governance-impact、02E 处理任务重试、admin MetaSchema 废弃回退),后端已 P1r 验收、前端接线即得。**修复分层**:**D 真验证补强**(最优先、反假绿成本最低:正文保存/AI 任务创建/market install/agent 试用槽位补 e2e)→ **A 接已就绪后端**(快见效)→ **B 前端整页整链**(handoff 统一/详情版本/导入导出/分型可信面板)→ **C 前后端共建**(改密/MFA/会话/偏好通知、02D 版本生命周期)。**本轮按用户决策启动 D 类**(正文保存 + AI 真后端 e2e),结果见下条。
- ✅/⚠️ **2026-06-22:D 类正文保存补真后端 e2e 闭环 + AI 生成四重阻塞定位(反假绿,commit a581fec)**。**正文保存 ✅ 完成**:写作台心脏却零 e2e、仅 MSW 掩盖、"43/0 全绿"绿在 mock 上。补 `block-autosave.spec.ts` 真打 PUT blocks 暴露并修真 bug——① **block revision 字段漂移**:WorkspacePage 裸读 `activeBlock.version`(真后端返 revision、无 version,curl 证)→ expectedRevision 恒为 1 → 乐观锁必冲突 `1041000002`,提 `blockRevision()` 到 useBlockStructure 共享、WorkspacePage 复用;② **work revision 漂移**(tsc -b 增量重检暴露):WorkVO 类型无 revision、真后端 detail 返 revision=5,加 `workRevision()` helper(chapter create/work delete 共用);③ MuseEditor saveBlock 返 `{revision}`(非 openapi 标的 newVersion),L110 改 revision 优先兜底;④ market 申诉 deadline fixture 老化(纯时间推进非代码:reviewRejection 的 eventAt=reviewedAt+7天 过期→`1044000027 申诉期限已过`),globalSetup §5a 刷新被驳回 request.reviewed_at 到近期。验证:block-autosave + block-structure/chapter/work 回归 4/4、**全量 e2e 43→44/0**、tsc/eslint/vitest 79/79。**AI 生成 ⚠️ 真后端 happy-path 不可行(四重阻塞,不做假 e2e,归 02D+外部依赖后置)**:① **AIPanel 不传 agentSlotKey/agentOverrideRef**(CreateAiTaskRequest 经"作品内智能体槽位"解析 agent),后端无 agent 来源 → POST /ai/tasks 真打 `1040100005 AI Agent 不存在`;② 作品-智能体**槽位绑定 UI 本就不完整**(02D 核心 gap:SlotBindingPanel workId 硬编码、无真正绑定流);③ 我重启 48080 时禁用了 AI dispatcher(initial-delay 24h);④ 真实生成依赖 New-API 外部模型(本机不可用——accept-suggestion e2e 历来 stub /ai/tasks 即此因)。即使修 ①②③,④ 仍硬阻塞 → 不做假 e2e。AI 生成正向验证需 02D 智能体槽位接入 + New-API provision(C 类 + 外部依赖),非 D 类可解。**D 类小结**:两条创作命脉,正文保存已真验证闭环(并连带修 3 处 revision 漂移 + 1 处 fixture 老化);AI 生成阻塞根因已定位归档。
-**2026-06-22:A 类首切片——市场推荐位接入真后端 recommendations(commit cac3b88)**。A 类(后端已 P1r 验收、前端 0 消费):02F `GET /marketplace/recommendations` 后端就绪(curl code:0 + 真实推荐资产 + recommendationReason),但 studio 从不调用、推荐理由仅 mock 造、UI 未渲染(盘点 C3)。接入:`useMarketRecommendations` hook(返 MarketAssetCard[]、推荐失败不阻断主列表)+ MarketBrowse「为你推荐」区(渲染推荐资产 + recommendationReason、点击进详情)+ mock handler + vitest 推荐契约 + `market-recommendations.spec.ts` 真后端 e2e(进 /market 验推荐区渲染真实数据)。连带修 `live-read` market 断言加 `.first()`(推荐位与列表可同时渲染同名资产→strict mode)。验证:**全量 e2e 44→45/0**、vitest 79→80、tsc/eslint 绿。**A 类样板成型**(读端接线即得 + 自然 UI 落点 + 真后端 e2e),可复用到 02G New-API 摘要/余额快照(curl 均 code:0 就绪)、02F governance 等其余"后端就绪、前端 0 消费"缺口。
-**2026-06-22:A 类第二切片——个人中心 New-API 绑定摘要(commit 7408615)**。02G `GET /account/new-api-binding` 后端就绪(curl code:0、未绑定时 fail-closed 返 bindingStatus=unbound),studio 0 展示(盘点 02G ❌)。接入 `useAccountNewApiBinding` hook + openapi 导出 `NewApiBindingSummary` + PersonalCenter「New-API 绑定」区(bindingStatus 中文徽标 已绑定/未绑定/同步失败/同步中 + 上次同步时间)+ mock handler + vitest 契约 + `account-newapi-binding.spec.ts` 真后端 e2e。**全量 e2e 45→46/0、vitest 80→81、tsc/eslint 绿**。**A 类已交付 2 切片**(市场推荐位 + New-API 摘要),样板稳定可复制;剩余同类候选:02G 余额快照(curl 空列表但就绪)、02F governance-impact 消费者治理、admin MetaSchema 废弃回退(注:admin 无 playwright e2e、验证靠单测 + 真 admin-api)。
-**2026-06-22:A 类第三切片——资产详情页治理影响(commit ab83735)**。02F `GET /marketplace/assets/{id}/governance-impact` 后端就绪(curl code:0 + 真实 governanceResult:resultType/reason/操作限制 + affectedAuthorizations/suggestedActions),studio 详情页 0 展示(盘点 C14 消费者治理读端缺口)。接入 `useGovernanceImpact` hook + openapi 导出 `GovernanceImpactResult` + MarketAssetDetailPage「治理影响」区(结果类型 下架/召回/吊销/可申诉 + 操作限制 停止获取/安装/绑定/生成 + 建议动作)+ mock handler + vitest 契约 + `market-governance-impact.spec.ts` 真后端 e2e。修 spec 块注释内 `affected*` 后接 `/``*/` 意外闭合(tsc 不覆盖 e2e、playwright esbuild 才暴露)。**全量 e2e 46→47/0、vitest 81→82、tsc/eslint 绿**。**A 类已交付 3 切片**(推荐位 + New-API 摘要 + 治理影响):studio 侧"后端就绪、前端 0 消费"的高价值读端缺口基本摘完,剩余 02G 余额快照(空数据价值低)、admin 侧(无 playwright e2e 验证弱)。**A 类告一段落**。
-**2026-06-22:handoff 跨空间统一接入 P0 基座 + P1 knowledge 端到端闭环(真后端 e2e 反假绿,4 commit)**。盘点①横切共性缺口"handoff 跨空间安全交接=架构级缺失"(五域仅来源侧只读预检、前端 0 消费 token、红线"不信任客户端 URL 参数"零落地)→按执行版分阶段。**P0 基座**:后端 market-api `MarketHandoffTokenApi`(verify 只读核验 + consume CAS 核销,进程内 Bean、复用 selectByTokenHash/effectiveStatus/updateLifecycleByExpectedStatus + cancel 同款 envelope 幂等;completed 此前无生产写入路径=绿地、出参脱敏不回 token)+ 前端 HandoffStore(Zustand,token 用完即弃)/通用 hooks/落地路由 `/handoff/land/:targetOwner`(红线:解析 ?token→replaceState 清 URL→存 store)。**P1 knowledge**:knowledge-server 依赖 market-api,createKnowledgeBindingPrecheck 的 market_kb 来源在 **precheck 阶段**(token 明文仅此持有、createBinding 的 BindReqVO 无 token——自审修正执行版原"createBinding 调 consume")调 verify+consume,替代"只存 hash 不验真"假安全;前端发起(MarketAssetDetailPage bind-precheck 就绪→createHandoff→跳)+ 落地组件(KnowledgeHandoffLanding 3 步:bind-precheck 拿后端可信 source→kbBindPrecheck 核销 token→createBinding 落库,source 全用后端返回不信客户端)。**真后端 e2e**(handoff-knowledge.spec,48080+真 PG):正路完整兑现闭环 + 负路伪造 token 被 verify 拒,2 passed + 二次幂等(用 work4 避 work1+kb1 installed binding 占 uk;global-setup #12 每轮清)。验证:market 编译+install+BcBoundaryArchTest、knowledge -am 编译+边界、前端 tsc/eslint+vitest 82→93、全量 e2e 47→48(handoff +2;knowledge-disable-restore 全量时序 flaky、单跑 2 passed、预存在共享 fixture 时序与本改动无关:handoff 不碰 KB id=1)。连带 drift 收口:MarketBindPrecheckResult.sourceVersion、CreateHandoffInput.authorizationSummaryId 对齐后端 Long。**剩 P2 agent(最高风险:放宽 agentType 校验单点)+ P3 content(asset_use 从零)。** ⚠️ **范围订正(2026-06-22 P2 调研连带发现,反假绿)**:本条"端到端闭环"准确表述 = **token 安全红线端到端 + 绑定落库**;handoff 另一维度"**market 资产物化**"(asset→目标 owner 可用实体、带 source_market_asset_id 溯源)**P1P3 全缺**——knowledge `MuseKnowledgeBaseDO.sourceMarketAssetId` 字段在却**无人写入**、binding `kb_id=parseLong(sourceId)` 直用预存 kb id(`MuseKnowledgeBindingService:110`)、market install 不建 kb 只落 license 投影(`MarketInstallServiceImpl:63` 注释明示);agent 连该字段都无 + 0 物化代码。**P1 e2e 绿靠 fixture 巧合**(asset1→`kb_id=1` 恰命中预存 kb1)。红线真生效属实,但"market 资产真正变成作品可用 kb/agent"未接,列**独立后续主线**。P2 按用户决策取**最小验证口径(方案 A)**:加字段 + 支持 `agent_type='market'` + seed market agent fixture + 放宽 + verify/consume + e2e,验证放宽红线真生效;install 自动物化后续。
-**2026-06-22:handoff 跨空间统一接入 P2 agent 兑现侧(最小验证放宽红线,真后端 e2e 反假绿,4 commit)**。承 P0 基座 + P1 knowledge,按用户决策三连(先出 P2 评审版 → market→agent 物化取"独立 market 类型" → P2 范围取方案 A 最小验证)。**后端**:ai-server 依赖 market-api;`AgentSlotPrecheckReqVO` 加 sourceType/handoffToken/sourceId/sourceVersion/authorizationSummaryId、precheck DO 加 sourceOwner/handoffHash、muse_agent 加 source_market_asset_id(V27 迁移,全 nullable 向后兼容);precheck market_agent 来源调 verify(targetOwner=agent)+consume(token 明文仅 precheck 阶段持有、bind 凭 precheckId 不再持 token)、**放宽 requireVisibleActiveSourceAgent 仅对已 verify 的 market handoff 跳过 agentType∈{system,user} 校验**(active + version active 仍校验、保护节点/AI 授权隔离不破),bind 凭 precheck.source_owner 标记同款放宽(bind 无 token、不能重验)。**前端**:AgentHandoffLanding 兑现侧落地组件(agentSlotPrecheck market_agent+token→setPrecheck token 用完即弃→bindAgentSlot 凭 precheckId)+ useAgentHandoff hooks + HandoffLandingPage owner dispatch +agent。**真后端 e2e**(handoff-agent.spec,48080+真 PG+V27 真列):正路 bind-precheck(targetOwner=agent)→createHandoff 签 token→agent precheck 后端 verify+consume+放宽接纳 market 类型 agent→bind 落槽位(slotRevision=2)、负路伪造 token 被 verify 拒(0 写),2 passed。验证:MuseAgentSlotServiceTest 25/0(5 放宽红线单测:接纳已验/拒伪造/拒缺 token/拒非 handoff 的 market 型 agent/bind 凭 source_owner 放宽)+ Bc/AiGrant ArchUnit 3/0、前端 tsc/eslint+vitest 93→97(AgentHandoffLanding 4)、V27 已应用共享 muse_slice_live(flyway "now at version v27",用户拍板应用)、全量 e2e 48→50(handoff-agent +2;唯一 flaky=knowledge-disable-restore 全量时序、单跑 2/2 绿、用 KB id=1 与 handoff 用 work4 无关、非 P2 回归)。⚠️ **诚实范围**(承 P1 物化订正):P2 取最小验证口径——**market→agent 资产物化(install 自动建 agent_type=market 实体 + source_market_asset_id 溯源)未接**,e2e 用 seed market agent fixture(global-setup #13:固定 agent_key + active version + work4 槽位)替代;来源侧发起入口(MarketAssetDetailPage agent 按钮)因 sourceAgentId 依赖物化故暂不做(物化后接入)。放宽红线(只接纳 verify 通过的 market token、伪造/缺 token/非 handoff 的 market 型 agent 全拒)真生效属实。**剩 P3 content(asset_use 从零)+ 资产物化(install 自动物化 kb/agent)独立主线。**
-**2026-06-22:handoff 跨空间统一接入 P3 content 兑现侧(asset_use 从零、完整闭环,真后端 e2e 反假绿,2 commit)**。承 P0 基座 + P1 knowledge + P2 agent,按用户拍板(Q1 单表/Q2 记录+AI 上下文/Q3 purposes 禁 template/Q4 完整闭环/Q5 work 级 revision)。**后端**:content-server 依赖 market-api;V28 建表 `muse_content_work_asset_use_precheck`(单表即事实载体 active→consumed,照 knowledge bind_precheck,全 nullable 向后兼容);两段式 `MuseContentAssetUseService`——precheck 段 market_asset 来源调 verify(targetOwner=content/targetAction=asset_use)+consume(token 明文仅此段、create 凭 precheckId 不再持 token)、purposes 白名单 reference/ai_context/generate_reference(禁 template=`CONTENT_ASSET_USE_PURPOSE_INVALID`)、create 段 work 级乐观锁(expectedWorkRevision)落使用事实;错误码 `1_041_002_xxx`。**前端**:ContentHandoffLanding 兑现侧(bind-precheck targetOwner=content 拿可信 source→assetUsePrecheck 核销 token→读 work revision→createAssetUse 凭 precheckId)+ useContentHandoff hooks + HandoffLandingPage content dispatch + **02F MarketAssetDetailPage「用于作品(进入作品空间)」来源侧发起入口(asset_use 不依赖物化、sourceAssetId 真实,故比 P1/P2 更完整、无 fixture 替身)**。**真后端 e2e**(handoff-content.spec,48080+真 PG+V28 真表):正路 bind-precheck(content)→createHandoff(content/asset_use)签 token→asset-use-precheck 后端 verify+consume→asset-uses 落使用事实(单表转 consumed、assetUseId=precheckId)、负路伪造 token 被 verify 拒(0 写),2 passed(global-setup #14 每轮清 work4 asset_use precheck)。验证:`MuseContentAssetUseServiceTest` 8/0(正路 verify+consume/伪造拒/缺 token 拒/禁用 purpose 拒/越权拒/create 闭环/work revision 冲突/precheck 过期)+ BcBoundaryArchTest 0 违例(content→market-api 经端口、不碰 market.dal)、前端 tsc/eslint+vitest 97→101(ContentHandoffLanding 4:就绪/闭环/核验拒绝/会话失效)、**V28 已应用共享 muse_slice_live(flyway "now at version v28",用户拍板应用、rebuild jar + 重启 48080)**、全量 e2e 50→52(handoff-content +2;唯一 flaky=knowledge-disable-restore 全量时序、单跑 2/2 绿、用 KB id=1 与 content 用 work4 无关、非 P3 回归)。**至此 handoff token 红线三 owner(knowledge P1 / agent P2 / content P3)端到端全覆盖。** ⚠️ **诚实范围**(承 P1/P2 物化订正):content asset_use **本质=「使用授权事实记录」非资产物化**(落 precheck 表凭证、sourceAssetId 直引真实 asset id,无「market 资产变 content 实体」步骤),故 P3 无 A/B 物化拆分、来源侧发起入口天然完整;Q2 锚点「AI 上下文消费」(asset_use 作 AI 生成链上下文来源、经 `muse_ai_candidate_decision_archive.work_asset_use_precheck_id` 引用)**另立、不在 P3**。**剩 market→knowledge/agent 资产物化(install 自动建 kb/agent 实体 + source_market_asset_id 溯源)独立主线。**
-**2026-06-24:AI 生成命脉真后端端到端打通(逐条破除 line176 四重阻塞,反假绿,commit 86c6dba/df063cb/9115d4f)**。承 line176"AI 生成 ⚠️ 四重阻塞"逐条解除:① **AIPanel 补全上下文引用**(df063cb 前端 MVP:AIPanel 传 workId/blockId/chapterId/agentSlotKey + WorkspacePage 透传真实上下文 + mock 收紧 workId 必填 + contract 断言反向验证,前端单测 101/101);② **02D 槽位绑定首次创建死锁已修**(9115d4f:precheck/bind 都 `requireSlotBinding` 缺行抛 forbidden、而"替换"是设计中唯一创建入口("替换"=首次写入、无独立创建端点是有意,后端-04 line748/产品-02D line507)→死锁,普通用户首次绑定永不可达(work4 seed binding 实为 E2E 绕 bug 手插);修=precheck 缺行放行 + bind 抽 `persistBinding` upsert(无行 insert revision1 避免首次 expectedSlotRevision null NPE/有行 updateById 沿用乐观锁)+ V29 `uk_muse_agent_slot_binding_active` partial unique index + 前端 mock protected 口径对齐 `protected:` 前缀;`MuseAgentSlotServiceTest` 26/26+Controller 4/4);③ dispatcher 本轮重启正常调度(initial-delay 8s,非 line176 的 24h 禁用);④ New-API 在线真验(MiniMax-M2.5,"本机不可用"已过时);外加 **P-A 检索 miss 根因修复**(86c6dba:`HttpRagFlowKnowledgeRuntimeClient``document_ids` 以 null 入 retrieval body→RAGFlow code102"documents should be a list"拒→检索 fail-closed→chunkCount=0(task3/4/5/6 全 0 即此);修=null 不入 body)。**真后端 happy-path 真验(muse_slice_live,真 API 非 mock/stub)**:work1 `writing.continuation` precheck(不再 forbidden)→bind 首次建 binding(slotRevision=1 active)→GET 槽位显示 agent1→AI task POST `/app-api/muse/ai/tasks``agentSlotKey`(非 agentOverrideRef)→agent1 解析 + runtime 授权 envelope → completed + suggestion7(GET `/app-api/muse/suggestions/7` 真 LLM"星环大陆魔法体系与元素对抗禁咒"续写、finishReason stop)。**专题-03 P-A/P-B/P-C 完整 e2e + 前端 MVP agentSlotKey 路径真后端端到端走通**,line176"AI 生成链 e2e 一律 stub /ai/tasks、最关键创作命脉绿在 mock 上"的最大假绿点消除。V29 由 Flyway 启动日志证 applied v29(用户拍板应用 muse_slice_live)。⚠️ **诚实范围/仍缺**:Override Slot Contract 主数据(方案 B:合法 slot 校验/系统默认 agent 来源/`listWorkAgentSlots` 预设骨架未做,slotKey 暂自由字符串、listSlots 缺行仅返回已绑定 slot)未做、属人类架构决策域;SlotBindingPanel 绑定流(precheck→bind)本就完整、**workId 硬编码已解**(2026-06-24:AgentPage 接 useWorkList 作品选择器替代硬编码 WORK_ID_FOR_SLOT_PREVIEW='1'、AgentPage.contract test 验作品选择→正确 workId 下传、vitest 101→102;盘点"无真正绑定流"过时=实为后端死锁挡着 bind 必失败);**槽位绑定 UI e2e 已补**(2026-06-24:`agent-slot-bind.spec` 真浏览器 AgentPage→selectOption work1→选 agent1→点绑定→真后端 precheck→bind 替换槽位;三重反假绿=DB 起点 revision1 + bind 响应 code0/slotRevision2 + UI"绑定已更新" + DB 终态 revision1→2;global-setup §15 每轮复位 work1 槽位保证可重复;自验+子代理各跑 passed);**AIPanel AI 生成 UI e2e 已补**(2026-06-24:`ai-generation.spec` 真后端不 stub→真 New-API LLM→suggestion 落库,四断言反假绿 POST2xx/suggestion 真文本/CandidatePanel/DB 新行,连跑 4 次绿 suggestionId 各异);**连带反假绿暴露并修真 bug**:`connectAIStream`(src/lib/sse.ts)漏带 Authorization+tenant-id 头→活体 SSE 必 401/400→done 永收不到→候选永不渲染,被 accept-suggestion 的 stub 长期掩盖(commit 494c9e9);另修 AIPanel onDone 渲染期跨组件 setState 反模式(改 ref,commit 410322c)。**line176② AI 生成 stub 假绿缺口闭合**(accept-suggestion 的 /ai/tasks stub 由真生成 e2e 取代;"AI 本机不可用"旧判断已过时、New-API 在线真生成)。02D 综合完整度:首次创建入口+前端绑定 UI+替换 UI e2e+AI 生成 UI e2e 已通,但 **Override Slot Contract 主数据/方案 B**(首次创建 UI 槽位骨架/合法 slot 校验/系统默认 agent 来源)属人类架构决策域未做、槽位 e2e 只覆盖替换路径。
-**2026-06-25:AI 生成命脉「采纳段」断层修复(ADR-020 方案 A,反假绿揭真 bug+IT 假绿,commit a16c596/2ede7cb/af4ad4d)**。承 line183 AI 生成→suggestion 已通,但 accept-suggestion 改真生成调研揭**采纳段断层**:真生成候选 `authorization_snapshot_id=null` 恒不可采纳(merge `1041001001`「外部 owner 暂不可用」),根因=runtime permission envelope 是字符串 `rpe-local-uuid` 但 authz 列从 V4 起 BIGINT 存不下(正是 line86"非数值 envelope 暂无法落 BIGINT 授权快照列、待授权快照建模收口"的遗留兑现),`numericEnvelopeId`/`requireNumericAuthorizationSnapshot`/`parseLongQuietly` 三处同源降级门禁致恒拒。git 时间线坐实历史类型错配(BIGINT 列 05-24 先于字符串 envelope 06-01,numericEnvelopeId 06-14 降级补丁自承遗留),"New-API 数值 envelope"无证据。**反假绿揭 IT 假绿**:`P1rContentMergeGeneratedSuggestionIT` 注入数值 envelope `9001` 故绿,真 New-API runtime 只产字符串 envelope→IT 绿≠活体可采纳。**方案 A(人类拍板,ADR-020;三选一里 B 建独立授权快照表最贴 SSOT 概念但表从未建+工程最大、C envelope hash 映射数值违 SSOT 排除、A 与 V14 既有迁移/ai-knowledge 契约 string/后端-04"对外 string"自洽最小正确)**:V30 迁移 `muse_ai_suggestion`+`muse_content_block_source_attribution` 的 authorization_snapshot_id BIGINT→VARCHAR(128)(仿 V14 Knowledge ALTER);AI 直落字符串 envelope(删 numericEnvelopeId);Content 放开两道数值门(删 requireNumericAuthorizationSnapshot/parseAuthorizationSnapshotId/parseLongQuietly,外部 owner 字符串编号不再被丢);DO authz Long→String 全调用方适配(未误伤 `muse_agent_slot_binding`,不在 V30 范围);ADR-020 把"授权快照 id=跨系统稳定字符串标识(biz_no 形态)"正式化(不违物理 Long 主键——authz id 是业务标识/外键非主键)。**活体真验(muse_slice_live,V30 applied:flyway 30 success + 列 information_schema 查实 character varying)**:真生成 suggestion authz 现存 rpe-local 字符串(len46、非 null)→采纳 merge code=0+block revision 69→70 自增(修复前恒 1041001001)→归因新行 authz 字符串,AI 生成→采纳→Canonical 全链打通。**真 PG IT 转真绿**:P1rContentMergeGeneratedSuggestionIT 改注入真字符串 envelope 仍 PASS(=真绿)、MergeSuggestionIT 5/5 不回归;真跑另暴露 `cd85d9d`(D1-2 work→schema)遗留——P1rContentCore/WorkLifecycleCompletedApprovalIT 的 CompletedApprovalConfiguration 漏供 MetaSchemaQueryApi bean(IT 此前没真跑、靠未执行假绿),补 @Bean 匿名实现修复 13/13 绿(af4ad4d,与断层解耦)。**accept-suggestion 改真生成(2ede7cb)**:删 /ai/tasks+/stream 最后一处 stub,正路真链路(WorkspacePage→AIPanel→真 AI task→SSE done→CandidatePanel 采纳→真 merge),反假绿=authz 真 rpe-local 字符串(非种子数值)/sourceAttribution.parentSuggestionId==真生成 id/revision 实读动态比对(漂移不影响重复),连跑 2 次 2/2 绿。**line176② AI stub 假绿彻底清除**(line183 写"由真生成 e2e 取代"实为 accept-suggestion 仍 stub 生成段、本轮删尽)。编译+test-compile SUCCESS、112 单测绿、核心 IT 真绿。⚠️ 仍缺:Override Slot Contract 方案 B 仍属人类架构决策域。(订正:此前疑虑的 Market openapi authz `type:integer` 经调研**非** ADR-020 残留——它是 `muse_market_authorization_snapshot/summary` 表主键 ID 引用、合规 ADR-020"物理主键 Long",market 业务标识字段 `authorizationSnapshot` 已是 string;market 对外暴露主键 ID 属独立后端-04"不得把主键当合同"契约议题、与 ADR-020 不同源,本轮不改。)环境踩坑入 memory:macOS python urllib 读系统代理须 ProxyHandler({}) 禁(否则连 localhost:48080 也被 7897 污染成 502)。
-**2026-06-25(同日续):槽位绑定授权快照孪生收口(C1,三路盘点发现+活体真验,commit 854f18c)**。采纳断层(V30)闭环后三路并行盘点(前端缺UI/假绿、后端 fail-closed、e2e+docs 仍缺)发现 `muse_agent_slot_binding.authorization_snapshot_id` 是 ADR-020 **唯一漏网 binding 表**——与采纳断层逐字同型:列 V4 起 BIGINT、DO Long,bind 时 `parseLong(precheck.authorizationSnapshotId)` 对真 envelope `rpe-local-<uuid>` 返 null→binding 授权快照静默丢失、绑定溯源链断(knowledge binding 已 V14、suggestion/attribution 已 V30,唯此表漏;上条"未误伤 muse_agent_slot_binding"实为同型漏修、此处订正收口)。**盲区根因**:模块 `.agent`"仍缺"此前只列方案 B/前端深链/物理拆分,从未记此类型错配,故 02D 死锁、采纳断层两轮都没顺带发现——三路盘点补上的真盲区。**V31**:authz+source 两列 BIGINT→VARCHAR(128) USING ::text(source 一并收口避免后续写入被静默截断)、DO Long→String、bind 两处(insert/updateById persistBinding)直透传删 parseLong(`sameAuthorizationSnapshot` 的 parseLong 保留——字符串 envelope parseLong 双 null 走 fallback 字符串比较、正确区分;反假绿:旧测试数值串 0501/501 被 parseLong 归一成 501L 无法区分 precheck 与 request,改字符串 envelope 断言落库幸存)。**活体真验(muse_slice_live,V31 applied:flyway 31 success + 列 information_schema 查实 character varying(128))**:真 envelope rpe-local-6e29...(issuePermissionEnvelope 签发、过 runtime 授权门、非手造)经 precheck→bind,binding authz 列存非空 rpe-local 字符串——insert(id=51 首次创建)+updateById(id=50 替换)两路径都验、独立 psycopg2 复核 isnull=false/len46;修前该列恒 null。单测 26 绿、编译 SUCCESS。**至此 ADR-020 全部 binding 表(knowledge V14 + suggestion/attribution V30 + slot V31)收口完成、无漏网**。
-**2026-06-25(同日续):market install 用户可见假绿修复——isAcquired/isInstalled enrich(三路盘点 top1+活体真验,commit 37e7a8d)**。三路盘点(前端)揪出 install 头号用户可见假绿,深入**纠正前提**:install **后端真实已验**(P1rMarketLicenseInstallCompletedApprovalIT 批18 绿+活体 curl)、请求契约完整无 gap——"install 零 e2e"仅 studio Playwright 层。**真假绿在读模型**:`MarketAssetQueryServiceImpl` 把 isAcquired/isInstalled 裸硬编 false(toCard:181-182 列表 + userActions:386-387 详情 + canInstall:383,无注释、非有意边界,区别于 D2 的 Task 6 fail-closed),致 studio `MarketBrowse`(assetType!=='work' && isAcquired && !isInstalled)安装按钮**真后端永不渲染**,mock 伪造状态位才现身;批17 IT(:224-225)把 isAcquired=false 断言为正确→假绿固化。**修(读模型 enrich,未碰 install 写逻辑/授权语义)**:仿同文件 isFavorite 范式加 isAcquired(active 授权)/isInstalled(installation)/isInstallable(类型集),**与 install 写端口 MarketInstallServiceImpl 严格同源**(selectActiveByOwnerAndAsset + INSTALLABLE_ASSET_TYPES={agent,knowledge_base}——避免"显示可装但点了 MARKET_LICENSE_NOT_EXISTS"新假绿);canInstall=listed && isInstallable && acquired && !installed(对齐 studio assetType!=='work' 门);批量加载(整页 2 次 IN 查询 vs 放大 isFavorite 既有 N+1 到 3N);mapper 加 selectActiveByOwnerAndAssetIds/existsByUserAndAsset。前端 MarketBrowse 补 onError(install/acquire 失败内联可见提示、不再静默吞 ApiError);e2e 新增 market-install.spec(MSW-off purchase 前置→断安装按钮真渲染→install→psql 验 installation、连跑 2 次)+ global-setup #16 market 表复位。**活体真验(muse_slice_live,重启新 jar 10:08)**:purchase→isAcquired=T/canInstall=T(修前恒 false)→install→isInstalled=T/canInstall=F;独立 psql+GET 复核 asset1/4(owner1)isAcquired/isInstalled=true、与 DB active 授权/installation 真实态一致(无新假绿)。批17 IT 5/5 三态绿(**首跑遇 ~/.m2 stale jar 假红——failsafe 解析旧 module jar exercise 旧裸写代码、SQL trace 证 enrich 批查没跑;mvn install 刷新本地仓后转真绿**)、market 单测 9/9+11/11+7/7、UI e2e 连跑 2 次 passed。⚠ 仍缺:install 后下游物化(market 资产变可用 agent/kb 实体)属独立 market 物化主线、未做。
-**2026-06-25(同日续):admin governance e2e 转真后端基建 + account 子域 MVP(三路盘点唯一集中 e2e 假绿,commit c5d1762)**。盘点发现 `muse-admin-governance.spec.ts` 全 page.route mock /admin-api/muse/**(~20 端点)、admin 前后端契约从未端到端跑;且认证注入 localStorage key 硬编码 `muse-vben-antd-5.7.0-dev-core-access` 实为 `undefined-5.7.0-dev-core-access`(VITE_APP_NAMESPACE 未定义→运行时 undefined)、mock 下从不暴露(假绿掩盖认证本就失效)。**命门实证打通(三层)**:①认证=admin 与 studio 共用 mock-token Bearer test1(mockSecret"test"+userId1,TokenAuthenticationFilter.mockLoginUser 只 setId/userType 不查库,application-local.yaml mock-enable=true);②**权限(curl 揪出真阻塞、调研漏的)**=admin 用户(system_users id=1)原无任何角色(system_user_role 空)→403,seed system_user_role(1,1)(role 1=super_admin,muse_slice_live 漏的标准 yudao 绑定)+DEL redis user_role_ids:1 刷权限缓存(直接 SQL seed 不触发 @CacheEvict、缓存旧值仍 403;PermissionServiceImpl 超管 return true 跳过 @PreAuthorize)→admin-api code:0;③代理=admin vite 已硬编码 /admin-api→48080、nitroMock 默认关(零工作)。**基建**:新建 global-setup(连 muse_slice_live 幂等 seed user_role+DEL redis+PG 复位)、playwright.config 加 globalSetup+workers:1、加 pg;spec 改真 localStorage key+token test1+删 routeMuseAdminApis mock(catch-all /admin-api/** 补 tenant-id:1 真打 48080;notify/dict/tenant 平台外壳保留 mock 因切片库无 notify 表返 500;get-permission-info 走真后端 super_admin code:0、muse 前端静态路由不依赖后端菜单)。**account 子域真连**:意外坐实真分页 wrapper `{pageNo,pageSize,total,list}`(spec mock 是 {list,total}、前端 PageResult 只读 list/total→契约兼容零改动);断言改真数据(活体用户/security event/purchase/活体市场资产);其他 8 子域(market/governance/ai/knowledge/jobs/audit)test.skip(首子域只趟 account)。**独立连跑 15 次绿(含冷启动)**,仅 agent 跑完瞬态一次红、不复现(console.error 全收的潜在 flaky)。⚠️ 仍缺:其他 8 子域逐个真连(market 第二批进行中;knowledge admin 真 PG IT=0 需先补后端;meta/ai/jobs/audit controller 层无真 PG IT);market appeal restore 票据后端 IT 缺口(只 mock 单测)。
-**2026-06-25(同日续):admin market 子域 e2e 转真连(下架/申诉真打+真 PG 反查落库,commit ce637ac)**。承 account 基建,market 原 5 skip 用例(全是 MSW payload 负向断言、真后端无 payload 收集器无法搬、纯前端逻辑已 vitest 覆盖)替换为 3 真连用例:治理页三工作台渲染 + 下架真打→PG 反查 listing_status=delisted+applied 治理动作 + 申诉 maintained 真打→PG 反查 status=maintained/resolver=1。global-setup 加 resetMarketFixture(资产/申诉复位+软删历轮 42 条 closed 申诉(否则挤出首页 pageNo=1 锚点)+清治理动作、幂等自愈)。揪出 mock 臆想契约:assetId 数字串、publish submitted→pending(后端 toOpenApiStatus 唯一特例)、resolution 列存处理理由文本非枚举、delist expectedStatus 只接受 listed、preview actionType 实为 5 值(含 review_rejection)非 4 值。net::ERR_* 资源懒加载抖动忽略(同解 account 首跑偶发红、原误判 console.error 实为 dev-server 负载 chunk 超时)。**独立连跑全量 account+market x2 各 4 passed + psql 复核 asset1=delisted/appeal1=maintained resolver=1/gov_action=1**(反假绿:真 token+真代理+真 PG+真契约+真写 DB)。⚠️ restore 票据路径 e2e 未覆盖(走 maintained、后端不消费 restore 预览),restore 仍只 mock-service 单测无真 PG IT 缺口待补(:397 注释)。剩 jobs(2)/governance config(1)子域 skip 待转。
-**2026-06-25(同日续):admin jobs 子域 e2e 转真连 + governance config 断层标注,admin governance e2e 全收口(commit 2d06ec5)**。剩 3 skip:jobs 2 个转真连(重试→后端校验 retryable 新插 operation_id=adminRetryJob queued 子 job、取消→muse_ai_job.status=cancelled、来源重试→新插 job_type=source_event_retry job;均纯 DB 状态机、活体 code:0),核心治理配置页(:456)保留 skip。关键坑:切片库后台 AI runtime worker ~3s 抢 queued→failed,取消锚点须用 running(queued 活体 cancel 真返 1040100014 不可取消)。global-setup 加 resetJobsFixture(幂等 seed 90001 failed/retryable + 90002 running muse_ai_job + 90003 needs_recheck muse_ai_source_event + 清派生)。真契约:retry 只接受 {commandId}、cancel/source 接受 {commandId,reason},删 museAdminPayloadsByPage。core config(:456)本轮先标 skip、随即续转真连(见下条;此处"缺表"前提经 psql 纠正为缺种子——原 agent 查 muse_function_chain 漏 meta_ 前缀误判无表)。**独立核实:连跑全量 account+market+jobs 6 passed/1 skipped + psql 复核 90002=cancelled/retry 派生=1/source_event_retry=1**。另查明 studio e2e 37 spec 本就 MSW-off 真连(playwright.config webServer VITE_API_MOCK=false 全局关 MSW + global-setup psql 复位)。待补后端:jobs/source 三写命令 P1r 真库 IT(现 Mockito 单测,本次 e2e 真连为首个端到端真验)。
-**2026-06-25(同日续):admin governance config 全页巡航转真连——拆 6 子系统+灌系统级种子,admin governance e2e 0 skip 全收口(commit 6bd9030)**。**前提纠正(承上条 jobs 的"缺表"误判)**:psql 实证真表名带 meta_ 前缀=muse_meta_function_chain/muse_meta_protection_node(V3 schema、都在 muse_slice_live、行数 0)——原 agent 查 muse_function_chain 漏 meta_ 前缀误判无表;真断层是切片库缺系统级公共治理对象种子、**非缺表非缺功能**(教训:断层标注前须按真实表名读 schema 验 to_regclass)。每锚点真表+真后端过滤契约(curl 实证):story.draft=muse_meta_schema、故事链路=muse_meta_function_chain(status=active、displayName 取 chain_snapshot)、事实校验=muse_meta_protection_node(status=active+policy_snapshot->>chainKey 绑定)、候选生成 Prompt=muse_prompt(非 muse_ai_prompt)、系统故事智能体=muse_agent(非 muse_ai_agent、agent_type=system)、系统世界观库=muse_knowledge_base(kb_type=global/owner=0)。global-setup 加 resetMetaGovernanceFixture(7 幂等 upsert)。原 1 skip 拆 6 条细粒度真连用例(元结构/功能编排/AI/全局知识/市场/New-API)+修 2 处 strict-mode 多命中。New-API 锚点契约纠正(mock user-e2e/usage-e2e 伪造值→真后端用户数字 id+聚合 recordId {userId}:{period})。**独立核实:连跑全量 e2e x2 各 12 passed/0 skipped + psql 复核 6 锚点种子真灌(function_chain/protection_node active、muse_prompt/muse_agent system/global KB 各 1 行)**。**至此 admin governance e2e 12 真连用例 0 skip 全转真后端**(account+market+jobs+meta governance、反假绿:真 token+代理+PG+契约+写 DB+读种子)。待补后端:jobs/source/market restore P1r 真库 IT;knowledge admin IT=0。
-**2026-06-25(同日续):studio e2e 全量健康核查 + 前端双 bug 修 + flaky 根治 + 揪出真后端 bug(commit 443a1f3/de5f4d0/ca0e04c)**。admin governance e2e 全收口后核查 studio e2e(36 spec/56 case、本就 MSW-off 真连)。4 轮全量:整体健康 **54/56 稳定绿、0 假绿候选**(抽查断言强度证非假绿)。**修复三类**:①**前端双 bug**(443a1f3):ChapterPanel 新建章节双提交(onKeyDown Enter+onBlur 双触发 submitCreate、isCreatingPending 异步滞后→重复 POST 第 2 个乐观锁 1041000002)加 useRef 同步守卫;WorkspacePage expectedWorkRevision 用 workRevision()??1 兜底掩盖 work 详情未加载→改传真实 revision(undefined 走 ChapterPanel ==null 早返)。实证单次新建 POST 2→1、chapter spec 修后 8 次全绿。②**环境 fixture 污染**(de5f4d0):asset1 被历史 delist→连带 7 spec 红、work1 多余槽位→agent-slot-bind 多命中;global-setup §17/§18 复位。③**测试间来源污染 flaky**(ca0e04c):source-attribution 期望 block1 user_original 但前序 accept-suggestion 写 ai_suggestion 漂移→改读 pristine block3+§3 复位(断言未放宽、强灌 ai_suggestion 免疫验证)。**最大价值=揪出真后端 bug(mock 永远发现不了)**:`MuseKnowledgeBindingMapper.updateStatusByKbId`(:38-46)无 binding_status 过滤、给该 KB 所有未删 binding 写同一 commandId,违反 uk_muse_knowledge_binding_command(tenant_id,command_id WHERE NOT NULL)唯一索引→DuplicateKeyException(disable POST HTTP 200 但 body code:500)→**任何用户把 KB 绑 ≥2 作品后无法停用该 KB**(生产影响)。mock 单测 mock 该 mapper 返行数掩盖、psql KB1 2 binding curl disable 500/1 binding code:0 坐实、代码 :43-45 铁证。用户批准委托修后端(传播写不覆盖 command_id/逐行派生+补真 PG IT+knowledge-disable-restore e2e 转绿,已修闭环 commit 0b152d9)。
-**2026-06-25(同日续):AI 真生成 e2e 真红深诊+修复闭环——非 AI 外部、两层根因(环境已修 + SSE code bug 已修 c77b006)**。studio 全量末轮 54/56,2 红是 AI 真生成 spec(不 stub):ai-generation 真红、accept-suggestion flaky(隔离 2 次绿)。深诊定位**两层、均非 AI 外部**(New-API curl 真验在线 HTTP 200+/v1/chat/completions 15s 真文本、清代理非劫持误诊):①**环境/启动(已修)**:start-muse-server-infra.sh 漏 source p1r-external-acceptance.env(New-API 凭据)→server 无 MUSE_AI_NEW_API_*→RealNewApiMuseAiRuntimeClientCondition 装 UnavailableMuseAiRuntimeClient 兜底→AI job 秒失败 AI_NEW_API_UNAVAILABLE(runtime 10-21ms、HTTP 没发出);重启 source 两 env 真验 job completed+suggestion 落库(脚本待固化防复发);②**真 code bug(SSE 协议/时序)**:后端 MuseAiTaskStreamServiceImpl DEFAULT_TIMEOUT_MILLIS=30s 硬死线<LLM 真时延(MiniMax 11-60s 抖动)+前端 connectAIStream 无重连(重连只在 connectEventStream)→LLM>30s 后端空关+前端不重连→候选永丢 UI。accept flaky/ai-gen 真红是同一 bug 时延两侧(task70 15.3s 绿/task71 35.7s 红、server 日志 done 晚 8s 落库)。**反假绿:e2e 真红深诊分清环境/code/外部三层**(New-API 实在线、真红是 code bug、非急标 flaky/环境)。第二层属 SSE 协议/时序产品行为变更、用户选 A 委托出方案评审文档(design-docs/临时-01、commit 09c35f5)→review 批准 A1+候选③→**已修 commit c77b006**:后端 DEFAULT_TIMEOUT_MILLIS 硬编码→@Value muse.ai.sse.task-timeout-millis 默认 240000(≥上游 TOTAL_TIMEOUT 180s+轮询/回放余量、连接死线:70+poll deadline:198 同引用);前端 connectAIStream 退避重连续 poll+按 SSE id 去重(后端不读 lastEventId、每次 seq0 全量回放→lastSeenSequenceNo 丢弃已见避免重复渲染候选)+done/error terminal 停+总超时 300s onError(SSE_TIMEOUT)不静默卡死(返回仍 AbortController、AIPanel 零改动);A1 start-muse-server-infra.sh 固化 source acceptance env。验证:后端单测 14/14+前端 107/107(含重连去重用例)、活体 e2e ai-generation+accept 连跑 3 轮 6/6 全绿、DB 落 6 行真 LLM suggestion、重连幂等方法 A 活体证。残留:本机 LLM 6.8-19s 未自然跨 30s、慢路径靠「240s 数学覆盖上游 180s+单测+方法 A 重连活体证」三重保证。通则沉淀 muse-module-ai/.agent。
-**2026-06-25(同日续):studio e2e 56/56 全绿收尾(SSE 慢路径活体补证 + agent-slot-bind flaky 根治,commit d1917b4)**。SSE 修复(c77b006)收尾全量验证连跑 3 轮(56/56/55-1):本 session 4 修复 spec(knowledge 多 binding/AI SSE/source 污染/乐观锁)3 轮 3/3 全绿、无交叉回归;**AI SSE 慢路径活体补证**——第 3 轮 ai-gen 36s/accept 47s 真>30s 仍绿(旧 30s 死线必红、新 240s 死线+前端重连扛住),消除上轮"本机未自然>30s"残留风险。唯一失败=agent-slot-bind:94 预存 flaky(~64% 失败、commit 1fbe7ae 6-24 补 e2e 引入、非本 session 回归、DB 干净产品逻辑正确):getByText("当前xxx v1")全局 strict 命中 2 元素(AgentPage 沙盒试用区回显 selectedAgent + SlotBindingPanel 槽位 boundAgentName、选中 agent==已绑时同文案)与槽位异步读时机竞速;收窄到 div.rounded-2xl filter「作品槽位绑定」槽位面板容器内断言(不改产品、仿套件 locator().filter() scope),**10 次独立循环 10/10 全绿根治**(方法学:非 --repeat-each——globalSetup 单进程单次复位会致 revision 1→2 漂移伪红,改逐次独立 playwright test 每轮重跑复位)。**至此本 session e2e 阻塞全清:admin governance 12 真连 0 skip + studio 56/56**。
-**2026-06-25(同日续):「继续验证修复」收尾——e2e 最新态确认 + CI 单测全绿(全 reactor 2834/0/0,commit 7ee9cc8/effb3f8)**。①**e2e 确认**:admin governance 12/12(连跑 2 轮、SSE server 重启无影响;agent 订正实际 12 test 非 14——6bd9030 拆 governance config 为 6 子系统后定数)+ studio 56/56;本 session 改动无回归(后端 BUILD SUCCESS、前端 studio vitest 107+tsc / admin vitest 345+vue-tsc 全绿)。②**全 reactor 单测健康扫揪修 3 个预存历史红(均非本 session、自包含装配/清单缺陷)**:knowledge `MuseKnowledgeBindingServiceTest`@Mock `MarketHandoffTokenApi`@InjectMocks null→service verify NPE(7ee9cc8、补 @Mock+stub valid)、pay 4 用例 `application-unit-test.yaml``data:` 缩进 4 空格错挂 `sql:` 下→`spring.data.redis.port=16379` 失效退默认 6379→命中本机带密码真 Redis NOAUTH(effb3f8、回退 2 空格对齐;源自初始导入 43d6806 继承 yudao、8963383 首次全绿时 6379 无密码侥幸过)、muse-server `P1rApiCoverageReportTest` 覆盖报告 `p1r-api-coverage.json` 16 处 completed 指向已删 `UnavailableMetaImpactFacade`(4bd292f 用 RealMetaImpactFacade 替换时报告未同步,effb3f8、16 处改替代者 JSON 合法)。修后全 reactor `mvn -o test`(61 模块跳 IT failsafe)**2834 tests 0F/0E BUILD SUCCESS**;独立复跑 PayOrderServiceTest 46/0、P1rApiCoverageReportTest 8/0、knowledge 模块 250/0 真转绿(不全信 agent 复验)。③**分支订正**:实际工作分支是 `dev/1.0.0`(集成分支、历史 d303279 已 merge feature/agent-dev-infrastructure 进来),本 session commit 连续落此分支(session 开头快照 feature/* 已过时、非落错)。
-**2026-06-26:抽样关键链路 P1r 真 PG IT 验证(用户选抽样、6/6 全绿,commit a0569c6)**。从 50 个 P1r IT 选 6 个关键链路抽样(本 session knowledge 多 binding 停用 + AI 生成→采纳 ADR-020 + AI runtime e2e + 知识检索 P-A/B/C + market handoff),真 PG muse_slice_live + New-API/RAGFlow 真外部跑 **6/6 全绿**。修 1 个预存红(非本 session、测试基建跟上产品演进):`P1rAiRuntimeEndToEndLiveAcceptanceIT` TARGET_VERSION 13→31(ADR-020 V30 把 muse_ai_suggestion.authorization_snapshot_id BIGINT→VARCHAR、停 V13 bigint 类型不匹配)+ 补 MuseAiEventPublishOutboxService 空实现/KnowledgeRetrievalFacade empty context 两 bean(ADR-020 outbox+P-A 检索演进新增 @Resource 依赖、IT 上下文未跟上;校验属其他 IT 职责、与 P1rContentMergeGeneratedSuggestionIT 同源),核心 AI 生成→runtime_call→落库断言不变。**anti-false-green**:核实 diff 合理非放宽 + muse-server test-compile BUILD SUCCESS(独立跑因 IT `flyway.clean()` DROP `_test` 库风险未做、改以核实 diff+编译+agent 双报全绿替代)。抽样 6/6 后**用户选继续→全量 50 P1r IT 全跑 50/50 全绿(199 用例 0F/0E/1S、1 skip=RagFlow GraphRAG assumeTrue、含 4 个 LiveAcceptance 真打 New-API/RAGFlow,commit 94545ff)**:再修 2 个预存红(均非本 session)——`P1rContentPlanningCompletedApprovalIT`(TARGET_VERSION 21→31、savePlanningItem 依赖 V25 新增 muse_content_planning_field_snapshot 表 commit 94a2379、停 V21 缺表 500;核心 planning fact/command/outbox 断言不放宽)+ 4 个 live-acceptance **第二代理坑**(已记 SOCKS 清理只清 socksProxyHost、但 macOS 系统代理 127.0.0.1:7897 仍被 JVM 注入 http.proxyHost/https.proxyHost、`java.net.http.HttpClient` 走死代理→502/UNAVAILABLE;反误判=`curl --noproxy '*'` 直打同地址 health/completions 全 200 证外部健康、非外部波动;修=argLine 加 `-Dhttp.proxyHost= -Dhttps.proxyHost= -Djava.net.useSystemProxies=false`),蒸馏 external-deps-and-gotchas。**anti-false-green**:核实 Planning diff 仅 schema 版本非放宽 + 独立核实生产切片库 **muse_slice_live 167 表+数据完整未被 IT flyway.clean 误删**(work 真名 muse_content_work 我曾误用 muse_work 虚惊;IT 全走 muse_p1r_*_test 隔离库、_test 铁律遵守)。**至此本 session 验证三层全维度全绿:e2e(admin 12 + studio 56)+ CI 单测(全 reactor 2834/0)+ 真 PG IT(全量 50/50)**。
-**2026-06-26:market install 下游物化方向——评审→拍板 B'/KB 先行→执行版 plan→U0 spike→拍 D1=S(commit 26ff1af/76a7e0d、U0 spike 产物待审)**。三层验证全绿后用户选"market install 后下游物化"方向。**深调研(2 agent corroborate+spot-check)**:install 只写 `muse_market_installation`+license projection、与 ai/knowledge 完全解耦、不物化用户空间 agent/kb;两断点=①无 install→ai/knowledge 桥 ②bind/slot 只建引用绑定(KB:binding+projection 指 sourceId、无本地 `muse_knowledge_base` 行/dataset→检索 no_dataset 第四门静默省略;agent:slot 放宽但 runtime `requireVisibleAgent` 拒裸引用)→用户 install 后不可真用(P1 knowledge handoff e2e 绿是 fixture 巧合 asset1→kb_id=1 恰有 seed dataset)。**评审版(临时-02)**:C/B'/B/暂缓 四方案,handoff 非物化桥(只跳转+消费域内部写)、物化落点应在目标域绑定路径、安装解耦正确不动;用户拍 **B'(installed_ref 最小留痕)+ KB 先行**(agent 物化下一阶段)。**执行版 plan(临时-03)**:U0-U4 实现单元,一手核验揪四硬事实(kb_id 被 assetId 污染、跨 BC 反查链断需新 `MarketAssetSourceApi`、共享 dataset 必越权、`muse_source_propagation_target` 表不存在)。**U0 spike(产 D1 证据、只 spike 测试零业务代码)**:spike 单测 13/0 钉死越权(他租户 chunk 原样返回+documentIds/metadataFilter 均 null 整库扫描、独立复跑 BUILD SUCCESS 确认)+活体真 RAGFlow 整库返回;**揪出潜伏 bug**:检索发 `metadata_filter` 但 RAGFlow 官方契约(context7 `/infiniflow/ragflow`)是 `metadata_condition`→被静默忽略(乱值条件仍返 baseline、活体对照)。**用户拍 D1=S(补隔离后共享)**:真最小留痕/省存储;S 分支据 U0 定调=隔离优先 `metadata_condition`(活体验证生效)+物化打安装维度元数据+`metadata_filter→metadata_condition` 字段修正纳入 U3+U4 隔离回归复用 spike 2 反向基线。**下一步执行 U1-U4(S 分支)**。anti-false-green:每 agent 报告独立 spot-check(install 解耦/dataset 门/kb_id 污染/共享越权/表不存在均亲验)、spike 单测独立复跑、字段 bug 经 context7 官方契约+活体双证。
-**2026-06-26(同日续):market KB 物化 D1=S 澄清纠偏→D0-fork + 四单元实现完成、真 PG+真 RAGFlow 端到端真闭环(commit 5a93831/30a693e/d4309ab/8b3258e)**。承上条 D1=S,执行前委托澄清揪出**越权论证主体错**:U0 spike 的"安装者间越权"前提不成立(只读共享下安装者看同一份发布者 dataset、都该看全部),**真越权是"安装者读到发布者私有内容"**——market 对 knowledge/ragflow 零依赖(src+pom 双空 spot-check)→上架不 fork、安装者共享发布者**活 dataset**、上架后 KB 仍可加私有文档(上传无 market 门禁)→整库检索读到发布者上架后新增/未公开私有 chunk。临时-03 §0 误引 review(ai-knowledge-retrieval-review:26 非越权 claim、market资产物化-review:94 是跨租户两回事)。**用户拍 D0-fork(发布侧 fork 纯公开副本、物理隔离)**:上架时 fork 一份只含公开快照文档的专用 dataset、安装者只读共享、副本仅 1 份、无需运行时隔离/不依赖 metadata_filter 字段 bug(降级潜伏 R6);执行 plan 临时-04 supersede 临时-03。**四单元实现**:U-fork(发布侧 fork:上架 markListed→**进程内 Spring 事件 AFTER_COMMIT**[非统一 Events 因其无后端消费机制=架构障碍、人类拍板进程内]→knowledge @Async fork、createDataset+逐文档复制+重索引+幂等(assetId,version)/部分成功补差集/失败重试/@Scheduled 兜底,单测 14/14)、U-materialize(installed_ref 物化+**kb_id 去污染**[market_kb 不再 parseLong assetId 改本地主键、binding/projection/列表读回跟随]+MarketAssetSourceApi 跨 BC 读+D6 fail-closed,单测 26+BcBoundaryArchTest 2/2)、U-retrieve(RetrievalApiImpl 零改、no_dataset 消除、单测 15)、U-verify(真 PG muse_p1r_fork_mat_test+真 RAGFlow **2 IT 真绿 57s 独立复跑**:fork→安装→检索命中+**发布者私有不泄露真证 d0ForkIsolationProven**[活 dataset 真传 magic、安装者检索副本拿 magic 当 query 仍不含]+AFTER_COMMIT 时序[committedAssetForked/rolledBackAssetForked false]+幂等+多安装者共享1副本)。**诚实遗留**:①召回/下架回滚未触达 installed_ref(recallAsset 仍 writeSourceStatusBlocked、knowledge 无召回消费者、D9 开放项不伪造闭环)②安装侧物化 studio e2e 标 test.fixme 待 global-setup 补 fork 就绪资产(检索/私有不泄露无独立 UI 入口由 IT 证)③副本资源回收/metadata_filter 字段 bug 修后置(R5/R6)。anti-false-green:每单元 agent 报告独立复跑核实(单测/BC/IT)、端到端 IT 独立复跑 2/2 真绿、私有不泄露真 RAGFlow 物理证非 mock。
### 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 最小门禁 / ⏸ 完整物理包拆分后置。